Really remove tic30-aout support
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
b3adc24a 2 Copyright (C) 1999-2020 Free Software Foundation, Inc.
5bd4f169
AM
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
32ca9640 5 Largely rewritten by Alan Modra.
5bd4f169 6
ae9a127f 7 This file is part of BFD, the Binary File Descriptor library.
5bd4f169 8
ae9a127f
NC
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
cd123cb7 11 the Free Software Foundation; either version 3 of the License, or
ae9a127f 12 (at your option) any later version.
5bd4f169 13
ae9a127f
NC
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
5bd4f169 18
4ce794b7
AM
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
3e110533 21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
5bd4f169 22
cd123cb7 23
4ce794b7
AM
24/* The 64-bit PowerPC ELF ABI may be found at
25 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
5bd4f169 27
3db64b00 28#include "sysdep.h"
183e98be 29#include <stdarg.h>
5bd4f169 30#include "bfd.h"
5bd4f169
AM
31#include "bfdlink.h"
32#include "libbfd.h"
33#include "elf-bfd.h"
04c9666a 34#include "elf/ppc64.h"
5d1634d7 35#include "elf64-ppc.h"
58d180e8 36#include "dwarf2.h"
5bd4f169 37
bb294208
AM
38/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */
39#define OCTETS_PER_BYTE(ABFD, SEC) 1
40
805fc799 41static bfd_reloc_status_type ppc64_elf_ha_reloc
4ce794b7 42 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
43static bfd_reloc_status_type ppc64_elf_branch_reloc
44 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 45static bfd_reloc_status_type ppc64_elf_brtaken_reloc
4ce794b7 46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 47static bfd_reloc_status_type ppc64_elf_sectoff_reloc
4ce794b7 48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 49static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
4ce794b7 50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 51static bfd_reloc_status_type ppc64_elf_toc_reloc
4ce794b7 52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 53static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
4ce794b7 54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 55static bfd_reloc_status_type ppc64_elf_toc64_reloc
4ce794b7 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
5663e321
AM
57static bfd_reloc_status_type ppc64_elf_prefix_reloc
58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 59static bfd_reloc_status_type ppc64_elf_unhandled_reloc
4ce794b7 60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016 61static bfd_vma opd_entry_value
aef36ac1 62 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
5bd4f169 63
6d00b590 64#define TARGET_LITTLE_SYM powerpc_elf64_le_vec
ad8e1ba5 65#define TARGET_LITTLE_NAME "elf64-powerpcle"
6d00b590 66#define TARGET_BIG_SYM powerpc_elf64_vec
ad8e1ba5
AM
67#define TARGET_BIG_NAME "elf64-powerpc"
68#define ELF_ARCH bfd_arch_powerpc
ae95ffa6 69#define ELF_TARGET_ID PPC64_ELF_DATA
ad8e1ba5
AM
70#define ELF_MACHINE_CODE EM_PPC64
71#define ELF_MAXPAGESIZE 0x10000
702d1671
AM
72#define ELF_COMMONPAGESIZE 0x1000
73#define ELF_RELROPAGESIZE ELF_MAXPAGESIZE
ad8e1ba5
AM
74#define elf_info_to_howto ppc64_elf_info_to_howto
75
76#define elf_backend_want_got_sym 0
77#define elf_backend_want_plt_sym 0
78#define elf_backend_plt_alignment 3
79#define elf_backend_plt_not_loaded 1
ad8e1ba5 80#define elf_backend_got_header_size 8
5474d94f 81#define elf_backend_want_dynrelro 1
ad8e1ba5
AM
82#define elf_backend_can_gc_sections 1
83#define elf_backend_can_refcount 1
84#define elf_backend_rela_normal 1
64f52338 85#define elf_backend_dtrel_excludes_plt 1
6bfdb61b 86#define elf_backend_default_execstack 0
ad8e1ba5 87
e717da7e 88#define bfd_elf64_mkobject ppc64_elf_mkobject
ad8e1ba5 89#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
aa374f67 90#define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
ee67d69a
AM
91#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
92#define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
ad8e1ba5
AM
93#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
94#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
90e3cdf2 95#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
aa374f67 96#define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
8c5b4e52 97#define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
ad8e1ba5
AM
98
99#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
100#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
101#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
183e98be 102#define elf_backend_write_core_note ppc64_elf_write_core_note
9d19e4fd 103#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
ad8e1ba5 104#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 105#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
f6c7c3e8 106#define elf_backend_check_directives ppc64_elf_before_check_relocs
e5034e59 107#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
8387904d 108#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5 109#define elf_backend_check_relocs ppc64_elf_check_relocs
c0e331c7 110#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
74f0fb50 111#define elf_backend_gc_keep ppc64_elf_gc_keep
64d03ab5 112#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
ad8e1ba5 113#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
ad8e1ba5
AM
114#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
115#define elf_backend_hide_symbol ppc64_elf_hide_symbol
9f296da3 116#define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
ad8e1ba5
AM
117#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
118#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
a345bc8d 119#define elf_backend_hash_symbol ppc64_elf_hash_symbol
74541ad4 120#define elf_backend_init_index_section _bfd_elf_init_2_index_sections
60124e18 121#define elf_backend_action_discarded ppc64_elf_action_discarded
ad8e1ba5
AM
122#define elf_backend_relocate_section ppc64_elf_relocate_section
123#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
124#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
125#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 126#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
29ef7005 127#define elf_backend_special_sections ppc64_elf_special_sections
bf577467 128#define elf_backend_section_flags ppc64_elf_section_flags
6911b7dc 129#define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
8c5b4e52 130#define elf_backend_merge_symbol ppc64_elf_merge_symbol
bce964aa 131#define elf_backend_get_reloc_section bfd_get_section_by_name
ad8e1ba5 132
5bd4f169
AM
133/* The name of the dynamic interpreter. This is put in the .interp
134 section. */
135#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
136
137/* The size in bytes of an entry in the procedure linkage table. */
b9e5796b 138#define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
2d7ad24e 139#define LOCAL_PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 16 : 8)
5bd4f169
AM
140
141/* The initial size of the plt reserved for the dynamic linker. */
b9e5796b 142#define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
5bd4f169 143
a078d95a
AM
144/* Offsets to some stack save slots. */
145#define STK_LR 16
146#define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
eb8d7fda 147/* This one is dodgy. ELFv2 does not have a linker word, so use the
a078d95a
AM
148 CR save slot. Used only by optimised __tls_get_addr call stub,
149 relying on __tls_get_addr_opt not saving CR.. */
150#define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
151
5bd4f169 152/* TOC base pointers offset from start of TOC. */
411e1bfb 153#define TOC_BASE_OFF 0x8000
a27e685f
AM
154/* TOC base alignment. */
155#define TOC_BASE_ALIGN 256
411e1bfb
AM
156
157/* Offset of tp and dtp pointers from start of TLS block. */
158#define TP_OFFSET 0x7000
159#define DTP_OFFSET 0x8000
5bd4f169 160
ad8e1ba5
AM
161/* .plt call stub instructions. The normal stub is like this, but
162 sometimes the .plt entry crosses a 64k boundary and we need to
71a39c98 163 insert an addi to adjust r11. */
a078d95a 164#define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
71a39c98
AM
165#define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
166#define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
167#define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
168#define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
169#define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
5d1634d7
AM
170#define BCTR 0x4e800420 /* bctr */
171
07d6d2b8 172#define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
05d0e962
AM
173#define ADDI_R12_R11 0x398b0000 /* addi %r12,%r11,off@l */
174#define ADDI_R12_R12 0x398c0000 /* addi %r12,%r12,off@l */
07d6d2b8
AM
175#define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
176#define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
177
178#define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
179#define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
180#define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
181#define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
182#define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
183#define BNECTR 0x4ca20420 /* bnectr+ */
184#define BNECTR_P4 0x4ce20420 /* bnectr+ */
794e51c0 185
71a39c98 186#define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
ac2df442 187#define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
07d6d2b8 188#define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
ac2df442 189
07d6d2b8
AM
190#define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
191#define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */
192#define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */
ad8e1ba5 193
04bdff6a 194#define LI_R11_0 0x39600000 /* li %r11,0 */
07d6d2b8 195#define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */
04bdff6a 196#define LIS_R11 0x3d600000 /* lis %r11,xxx@ha */
05d0e962 197#define LIS_R12 0x3d800000 /* lis %r12,xxx@ha */
006589cf
AM
198#define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */
199#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
05d0e962 200#define ADDIS_R12_R11 0x3d8b0000 /* addis %r12,%r11,xxx@ha */
a345bc8d 201#define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
05d0e962 202#define ORIS_R12_R12_0 0x658c0000 /* oris %r12,%r12,xxx@hi */
04bdff6a 203#define ORI_R11_R11_0 0x616b0000 /* ori %r11,%r11,xxx@l */
05d0e962 204#define ORI_R12_R12_0 0x618c0000 /* ori %r12,%r12,xxx@l */
07d6d2b8 205#define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
04bdff6a 206#define SLDI_R11_R11_34 0x796b1746 /* sldi %r11,%r11,34 */
05d0e962
AM
207#define SLDI_R12_R12_32 0x799c07c6 /* sldi %r12,%r12,32 */
208#define LDX_R12_R11_R12 0x7d8b602a /* ldx %r12,%r11,%r12 */
209#define ADD_R12_R11_R12 0x7d8b6214 /* add %r12,%r11,%r12 */
04bdff6a
AM
210#define PADDI_R12_PC 0x0610000039800000ULL
211#define PLD_R12_PC 0x04100000e5800000ULL
5663e321 212#define PNOP 0x0700000000000000ULL
a345bc8d 213
9e390558
AM
214/* __glink_PLTresolve stub instructions. We enter with the index in R0. */
215#define GLINK_PLTRESOLVE_SIZE(htab) \
407aa07c 216 (8u + (htab->opd_abi ? 11 * 4 : 14 * 4))
ee4bf8d2
AM
217 /* 0: */
218 /* .quad plt0-1f */
219 /* __glink: */
220#define MFLR_R12 0x7d8802a6 /* mflr %12 */
221#define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
222 /* 1: */
223#define MFLR_R11 0x7d6802a6 /* mflr %11 */
71a39c98 224 /* ld %2,(0b-1b)(%11) */
ee4bf8d2 225#define MTLR_R12 0x7d8803a6 /* mtlr %12 */
71a39c98
AM
226#define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
227 /* ld %12,0(%11) */
228 /* ld %2,8(%11) */
229 /* mtctr %12 */
230 /* ld %11,16(%11) */
ee4bf8d2 231 /* bctr */
b9e5796b
AM
232#define MFLR_R0 0x7c0802a6 /* mflr %r0 */
233#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
234#define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
235#define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
236#define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
5d1634d7
AM
237
238/* Pad with this. */
239#define NOP 0x60000000
240
721956f4
AM
241/* Some other nops. */
242#define CROR_151515 0x4def7b82
243#define CROR_313131 0x4ffffb82
244
cedb70c5 245/* .glink entries for the first 32k functions are two instructions. */
5d1634d7
AM
246#define LI_R0_0 0x38000000 /* li %r0,0 */
247#define B_DOT 0x48000000 /* b . */
248
249/* After that, we need two instructions to load the index, followed by
250 a branch. */
251#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 252#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 253
deb0e272
AM
254/* Instructions used by the save and restore reg functions. */
255#define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
256#define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
257#define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
258#define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
82bd7b59
AM
259#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
260#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
deb0e272
AM
261#define LI_R12_0 0x39800000 /* li %r12,0 */
262#define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
263#define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
264#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
82bd7b59
AM
265#define BLR 0x4e800020 /* blr */
266
41bd81ab
AM
267/* Since .opd is an array of descriptors and each entry will end up
268 with identical R_PPC64_RELATIVE relocs, there is really no need to
269 propagate .opd relocs; The dynamic linker should be taught to
1e2f5b6e 270 relocate .opd without reloc entries. */
41bd81ab
AM
271#ifndef NO_OPD_RELOCS
272#define NO_OPD_RELOCS 0
273#endif
810d4e75 274
a4b6fadd
AM
275#ifndef ARRAY_SIZE
276#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
277#endif
278
810d4e75
AM
279static inline int
280abiversion (bfd *abfd)
281{
282 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
283}
284
285static inline void
286set_abiversion (bfd *abfd, int ver)
287{
288 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
289 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
290}
5bd4f169
AM
291\f
292/* Relocation HOWTO's. */
46807bf4
AM
293/* Like other ELF RELA targets that don't apply multiple
294 field-altering relocations to the same localation, src_mask is
295 always zero and pcrel_offset is the same as pc_relative.
296 PowerPC can always use a zero bitpos, even when the field is not at
297 the LSB. For example, a REL24 could use rightshift=2, bisize=24
298 and bitpos=2 which matches the ABI description, or as we do here,
299 rightshift=0, bitsize=26 and bitpos=0. */
300#define HOW(type, size, bitsize, mask, rightshift, pc_relative, \
301 complain, special_func) \
302 HOWTO (type, rightshift, size, bitsize, pc_relative, 0, \
303 complain_overflow_ ## complain, special_func, \
304 #type, FALSE, 0, mask, pc_relative)
305
04c9666a 306static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
5bd4f169 307
f3185997
NC
308static reloc_howto_type ppc64_elf_howto_raw[] =
309{
5bd4f169 310 /* This reloc does nothing. */
46807bf4
AM
311 HOW (R_PPC64_NONE, 3, 0, 0, 0, FALSE, dont,
312 bfd_elf_generic_reloc),
5bd4f169
AM
313
314 /* A standard 32 bit relocation. */
46807bf4
AM
315 HOW (R_PPC64_ADDR32, 2, 32, 0xffffffff, 0, FALSE, bitfield,
316 bfd_elf_generic_reloc),
5bd4f169
AM
317
318 /* An absolute 26 bit branch; the lower two bits must be zero.
319 FIXME: we don't check that, we just clear them. */
46807bf4
AM
320 HOW (R_PPC64_ADDR24, 2, 26, 0x03fffffc, 0, FALSE, bitfield,
321 bfd_elf_generic_reloc),
5bd4f169
AM
322
323 /* A standard 16 bit relocation. */
46807bf4
AM
324 HOW (R_PPC64_ADDR16, 1, 16, 0xffff, 0, FALSE, bitfield,
325 bfd_elf_generic_reloc),
5bd4f169
AM
326
327 /* A 16 bit relocation without overflow. */
46807bf4
AM
328 HOW (R_PPC64_ADDR16_LO, 1, 16, 0xffff, 0, FALSE, dont,
329 bfd_elf_generic_reloc),
5bd4f169
AM
330
331 /* Bits 16-31 of an address. */
46807bf4
AM
332 HOW (R_PPC64_ADDR16_HI, 1, 16, 0xffff, 16, FALSE, signed,
333 bfd_elf_generic_reloc),
5bd4f169
AM
334
335 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
336 bits, treated as a signed number, is negative. */
46807bf4
AM
337 HOW (R_PPC64_ADDR16_HA, 1, 16, 0xffff, 16, FALSE, signed,
338 ppc64_elf_ha_reloc),
5bd4f169
AM
339
340 /* An absolute 16 bit branch; the lower two bits must be zero.
341 FIXME: we don't check that, we just clear them. */
46807bf4
AM
342 HOW (R_PPC64_ADDR14, 2, 16, 0x0000fffc, 0, FALSE, signed,
343 ppc64_elf_branch_reloc),
5bd4f169
AM
344
345 /* An absolute 16 bit branch, for which bit 10 should be set to
346 indicate that the branch is expected to be taken. The lower two
347 bits must be zero. */
46807bf4
AM
348 HOW (R_PPC64_ADDR14_BRTAKEN, 2, 16, 0x0000fffc, 0, FALSE, signed,
349 ppc64_elf_brtaken_reloc),
5bd4f169
AM
350
351 /* An absolute 16 bit branch, for which bit 10 should be set to
352 indicate that the branch is not expected to be taken. The lower
353 two bits must be zero. */
46807bf4
AM
354 HOW (R_PPC64_ADDR14_BRNTAKEN, 2, 16, 0x0000fffc, 0, FALSE, signed,
355 ppc64_elf_brtaken_reloc),
5bd4f169
AM
356
357 /* A relative 26 bit branch; the lower two bits must be zero. */
46807bf4
AM
358 HOW (R_PPC64_REL24, 2, 26, 0x03fffffc, 0, TRUE, signed,
359 ppc64_elf_branch_reloc),
5bd4f169 360
05d0e962 361 /* A variant of R_PPC64_REL24, used when r2 is not the toc pointer. */
46807bf4
AM
362 HOW (R_PPC64_REL24_NOTOC, 2, 26, 0x03fffffc, 0, TRUE, signed,
363 ppc64_elf_branch_reloc),
05d0e962 364
5bd4f169 365 /* A relative 16 bit branch; the lower two bits must be zero. */
46807bf4
AM
366 HOW (R_PPC64_REL14, 2, 16, 0x0000fffc, 0, TRUE, signed,
367 ppc64_elf_branch_reloc),
5bd4f169
AM
368
369 /* A relative 16 bit branch. Bit 10 should be set to indicate that
370 the branch is expected to be taken. The lower two bits must be
371 zero. */
46807bf4
AM
372 HOW (R_PPC64_REL14_BRTAKEN, 2, 16, 0x0000fffc, 0, TRUE, signed,
373 ppc64_elf_brtaken_reloc),
5bd4f169
AM
374
375 /* A relative 16 bit branch. Bit 10 should be set to indicate that
376 the branch is not expected to be taken. The lower two bits must
377 be zero. */
46807bf4
AM
378 HOW (R_PPC64_REL14_BRNTAKEN, 2, 16, 0x0000fffc, 0, TRUE, signed,
379 ppc64_elf_brtaken_reloc),
5bd4f169
AM
380
381 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
382 symbol. */
46807bf4
AM
383 HOW (R_PPC64_GOT16, 1, 16, 0xffff, 0, FALSE, signed,
384 ppc64_elf_unhandled_reloc),
5bd4f169
AM
385
386 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
387 the symbol. */
46807bf4
AM
388 HOW (R_PPC64_GOT16_LO, 1, 16, 0xffff, 0, FALSE, dont,
389 ppc64_elf_unhandled_reloc),
5bd4f169
AM
390
391 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
392 the symbol. */
46807bf4
AM
393 HOW (R_PPC64_GOT16_HI, 1, 16, 0xffff, 16, FALSE, signed,
394 ppc64_elf_unhandled_reloc),
5bd4f169
AM
395
396 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
397 the symbol. */
46807bf4
AM
398 HOW (R_PPC64_GOT16_HA, 1, 16, 0xffff, 16, FALSE, signed,
399 ppc64_elf_unhandled_reloc),
5bd4f169
AM
400
401 /* This is used only by the dynamic linker. The symbol should exist
402 both in the object being run and in some shared library. The
403 dynamic linker copies the data addressed by the symbol from the
404 shared library into the object, because the object being
405 run has to have the data at some particular address. */
46807bf4
AM
406 HOW (R_PPC64_COPY, 0, 0, 0, 0, FALSE, dont,
407 ppc64_elf_unhandled_reloc),
5bd4f169
AM
408
409 /* Like R_PPC64_ADDR64, but used when setting global offset table
410 entries. */
46807bf4
AM
411 HOW (R_PPC64_GLOB_DAT, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
412 ppc64_elf_unhandled_reloc),
5bd4f169
AM
413
414 /* Created by the link editor. Marks a procedure linkage table
415 entry for a symbol. */
46807bf4
AM
416 HOW (R_PPC64_JMP_SLOT, 0, 0, 0, 0, FALSE, dont,
417 ppc64_elf_unhandled_reloc),
5bd4f169
AM
418
419 /* Used only by the dynamic linker. When the object is run, this
420 doubleword64 is set to the load address of the object, plus the
421 addend. */
46807bf4
AM
422 HOW (R_PPC64_RELATIVE, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
423 bfd_elf_generic_reloc),
5bd4f169
AM
424
425 /* Like R_PPC64_ADDR32, but may be unaligned. */
46807bf4
AM
426 HOW (R_PPC64_UADDR32, 2, 32, 0xffffffff, 0, FALSE, bitfield,
427 bfd_elf_generic_reloc),
5bd4f169
AM
428
429 /* Like R_PPC64_ADDR16, but may be unaligned. */
46807bf4
AM
430 HOW (R_PPC64_UADDR16, 1, 16, 0xffff, 0, FALSE, bitfield,
431 bfd_elf_generic_reloc),
5bd4f169
AM
432
433 /* 32-bit PC relative. */
46807bf4
AM
434 HOW (R_PPC64_REL32, 2, 32, 0xffffffff, 0, TRUE, signed,
435 bfd_elf_generic_reloc),
5bd4f169 436
10ed1bba 437 /* 32-bit relocation to the symbol's procedure linkage table. */
46807bf4
AM
438 HOW (R_PPC64_PLT32, 2, 32, 0xffffffff, 0, FALSE, bitfield,
439 ppc64_elf_unhandled_reloc),
5bd4f169
AM
440
441 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
442 FIXME: R_PPC64_PLTREL32 not supported. */
46807bf4
AM
443 HOW (R_PPC64_PLTREL32, 2, 32, 0xffffffff, 0, TRUE, signed,
444 ppc64_elf_unhandled_reloc),
5bd4f169
AM
445
446 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
447 the symbol. */
46807bf4
AM
448 HOW (R_PPC64_PLT16_LO, 1, 16, 0xffff, 0, FALSE, dont,
449 ppc64_elf_unhandled_reloc),
5bd4f169
AM
450
451 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
452 the symbol. */
46807bf4
AM
453 HOW (R_PPC64_PLT16_HI, 1, 16, 0xffff, 16, FALSE, signed,
454 ppc64_elf_unhandled_reloc),
5bd4f169
AM
455
456 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
457 the symbol. */
46807bf4
AM
458 HOW (R_PPC64_PLT16_HA, 1, 16, 0xffff, 16, FALSE, signed,
459 ppc64_elf_unhandled_reloc),
5bd4f169 460
c061c2d8 461 /* 16-bit section relative relocation. */
46807bf4
AM
462 HOW (R_PPC64_SECTOFF, 1, 16, 0xffff, 0, FALSE, signed,
463 ppc64_elf_sectoff_reloc),
5bd4f169 464
c061c2d8 465 /* Like R_PPC64_SECTOFF, but no overflow warning. */
46807bf4
AM
466 HOW (R_PPC64_SECTOFF_LO, 1, 16, 0xffff, 0, FALSE, dont,
467 ppc64_elf_sectoff_reloc),
5bd4f169
AM
468
469 /* 16-bit upper half section relative relocation. */
46807bf4
AM
470 HOW (R_PPC64_SECTOFF_HI, 1, 16, 0xffff, 16, FALSE, signed,
471 ppc64_elf_sectoff_reloc),
5bd4f169
AM
472
473 /* 16-bit upper half adjusted section relative relocation. */
46807bf4
AM
474 HOW (R_PPC64_SECTOFF_HA, 1, 16, 0xffff, 16, FALSE, signed,
475 ppc64_elf_sectoff_ha_reloc),
5bd4f169 476
04c9666a 477 /* Like R_PPC64_REL24 without touching the two least significant bits. */
46807bf4
AM
478 HOW (R_PPC64_REL30, 2, 30, 0xfffffffc, 2, TRUE, dont,
479 bfd_elf_generic_reloc),
5bd4f169
AM
480
481 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
482
483 /* A standard 64-bit relocation. */
46807bf4
AM
484 HOW (R_PPC64_ADDR64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
485 bfd_elf_generic_reloc),
5bd4f169
AM
486
487 /* The bits 32-47 of an address. */
46807bf4
AM
488 HOW (R_PPC64_ADDR16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont,
489 bfd_elf_generic_reloc),
5bd4f169
AM
490
491 /* The bits 32-47 of an address, plus 1 if the contents of the low
492 16 bits, treated as a signed number, is negative. */
46807bf4
AM
493 HOW (R_PPC64_ADDR16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont,
494 ppc64_elf_ha_reloc),
5bd4f169
AM
495
496 /* The bits 48-63 of an address. */
46807bf4
AM
497 HOW (R_PPC64_ADDR16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont,
498 bfd_elf_generic_reloc),
5bd4f169
AM
499
500 /* The bits 48-63 of an address, plus 1 if the contents of the low
501 16 bits, treated as a signed number, is negative. */
46807bf4
AM
502 HOW (R_PPC64_ADDR16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont,
503 ppc64_elf_ha_reloc),
5bd4f169
AM
504
505 /* Like ADDR64, but may be unaligned. */
46807bf4
AM
506 HOW (R_PPC64_UADDR64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
507 bfd_elf_generic_reloc),
5bd4f169
AM
508
509 /* 64-bit relative relocation. */
46807bf4
AM
510 HOW (R_PPC64_REL64, 4, 64, 0xffffffffffffffffULL, 0, TRUE, dont,
511 bfd_elf_generic_reloc),
5bd4f169 512
cedb70c5 513 /* 64-bit relocation to the symbol's procedure linkage table. */
46807bf4
AM
514 HOW (R_PPC64_PLT64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
515 ppc64_elf_unhandled_reloc),
5bd4f169
AM
516
517 /* 64-bit PC relative relocation to the symbol's procedure linkage
518 table. */
519 /* FIXME: R_PPC64_PLTREL64 not supported. */
46807bf4
AM
520 HOW (R_PPC64_PLTREL64, 4, 64, 0xffffffffffffffffULL, 0, TRUE, dont,
521 ppc64_elf_unhandled_reloc),
5bd4f169
AM
522
523 /* 16 bit TOC-relative relocation. */
5bd4f169 524 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
46807bf4
AM
525 HOW (R_PPC64_TOC16, 1, 16, 0xffff, 0, FALSE, signed,
526 ppc64_elf_toc_reloc),
5bd4f169
AM
527
528 /* 16 bit TOC-relative relocation without overflow. */
5bd4f169 529 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
46807bf4
AM
530 HOW (R_PPC64_TOC16_LO, 1, 16, 0xffff, 0, FALSE, dont,
531 ppc64_elf_toc_reloc),
5bd4f169
AM
532
533 /* 16 bit TOC-relative relocation, high 16 bits. */
5bd4f169 534 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
46807bf4
AM
535 HOW (R_PPC64_TOC16_HI, 1, 16, 0xffff, 16, FALSE, signed,
536 ppc64_elf_toc_reloc),
5bd4f169
AM
537
538 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
539 contents of the low 16 bits, treated as a signed number, is
540 negative. */
5bd4f169 541 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
46807bf4
AM
542 HOW (R_PPC64_TOC16_HA, 1, 16, 0xffff, 16, FALSE, signed,
543 ppc64_elf_toc_ha_reloc),
5bd4f169
AM
544
545 /* 64-bit relocation; insert value of TOC base (.TOC.). */
5bd4f169 546 /* R_PPC64_TOC 51 doubleword64 .TOC. */
46807bf4
AM
547 HOW (R_PPC64_TOC, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
548 ppc64_elf_toc64_reloc),
5bd4f169
AM
549
550 /* Like R_PPC64_GOT16, but also informs the link editor that the
551 value to relocate may (!) refer to a PLT entry which the link
552 editor (a) may replace with the symbol value. If the link editor
553 is unable to fully resolve the symbol, it may (b) create a PLT
554 entry and store the address to the new PLT entry in the GOT.
555 This permits lazy resolution of function symbols at run time.
556 The link editor may also skip all of this and just (c) emit a
557 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
558 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
46807bf4
AM
559 HOW (R_PPC64_PLTGOT16, 1, 16, 0xffff, 0, FALSE,signed,
560 ppc64_elf_unhandled_reloc),
411e1bfb
AM
561
562 /* Like R_PPC64_PLTGOT16, but without overflow. */
563 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
46807bf4
AM
564 HOW (R_PPC64_PLTGOT16_LO, 1, 16, 0xffff, 0, FALSE, dont,
565 ppc64_elf_unhandled_reloc),
411e1bfb
AM
566
567 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
568 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
46807bf4
AM
569 HOW (R_PPC64_PLTGOT16_HI, 1, 16, 0xffff, 16, FALSE, signed,
570 ppc64_elf_unhandled_reloc),
411e1bfb
AM
571
572 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
573 1 if the contents of the low 16 bits, treated as a signed number,
574 is negative. */
575 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
46807bf4
AM
576 HOW (R_PPC64_PLTGOT16_HA, 1, 16, 0xffff, 16, FALSE, signed,
577 ppc64_elf_unhandled_reloc),
411e1bfb
AM
578
579 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
46807bf4
AM
580 HOW (R_PPC64_ADDR16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
581 bfd_elf_generic_reloc),
411e1bfb
AM
582
583 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
46807bf4
AM
584 HOW (R_PPC64_ADDR16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
585 bfd_elf_generic_reloc),
411e1bfb
AM
586
587 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
46807bf4
AM
588 HOW (R_PPC64_GOT16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
589 ppc64_elf_unhandled_reloc),
411e1bfb
AM
590
591 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
46807bf4
AM
592 HOW (R_PPC64_GOT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
593 ppc64_elf_unhandled_reloc),
411e1bfb
AM
594
595 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
46807bf4
AM
596 HOW (R_PPC64_PLT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
597 ppc64_elf_unhandled_reloc),
411e1bfb
AM
598
599 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
46807bf4
AM
600 HOW (R_PPC64_SECTOFF_DS, 1, 16, 0xfffc, 0, FALSE, signed,
601 ppc64_elf_sectoff_reloc),
411e1bfb
AM
602
603 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
46807bf4
AM
604 HOW (R_PPC64_SECTOFF_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
605 ppc64_elf_sectoff_reloc),
411e1bfb
AM
606
607 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
46807bf4
AM
608 HOW (R_PPC64_TOC16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
609 ppc64_elf_toc_reloc),
411e1bfb
AM
610
611 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
46807bf4
AM
612 HOW (R_PPC64_TOC16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
613 ppc64_elf_toc_reloc),
411e1bfb
AM
614
615 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
616 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
46807bf4
AM
617 HOW (R_PPC64_PLTGOT16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
618 ppc64_elf_unhandled_reloc),
411e1bfb
AM
619
620 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
621 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
46807bf4
AM
622 HOW (R_PPC64_PLTGOT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
623 ppc64_elf_unhandled_reloc),
411e1bfb 624
727fc41e 625 /* Marker relocs for TLS. */
46807bf4
AM
626 HOW (R_PPC64_TLS, 2, 32, 0, 0, FALSE, dont,
627 bfd_elf_generic_reloc),
628
629 HOW (R_PPC64_TLSGD, 2, 32, 0, 0, FALSE, dont,
630 bfd_elf_generic_reloc),
631
632 HOW (R_PPC64_TLSLD, 2, 32, 0, 0, FALSE, dont,
633 bfd_elf_generic_reloc),
727fc41e 634
23cedd1d
AM
635 /* Marker reloc for optimizing r2 save in prologue rather than on
636 each plt call stub. */
46807bf4
AM
637 HOW (R_PPC64_TOCSAVE, 2, 32, 0, 0, FALSE, dont,
638 bfd_elf_generic_reloc),
3b421ab3 639
23cedd1d 640 /* Marker relocs on inline plt call instructions. */
46807bf4
AM
641 HOW (R_PPC64_PLTSEQ, 2, 32, 0, 0, FALSE, dont,
642 bfd_elf_generic_reloc),
643
644 HOW (R_PPC64_PLTCALL, 2, 32, 0, 0, FALSE, dont,
645 bfd_elf_generic_reloc),
23cedd1d 646
411e1bfb
AM
647 /* Computes the load module index of the load module that contains the
648 definition of its TLS sym. */
46807bf4
AM
649 HOW (R_PPC64_DTPMOD64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
650 ppc64_elf_unhandled_reloc),
411e1bfb
AM
651
652 /* Computes a dtv-relative displacement, the difference between the value
653 of sym+add and the base address of the thread-local storage block that
654 contains the definition of sym, minus 0x8000. */
46807bf4
AM
655 HOW (R_PPC64_DTPREL64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
656 ppc64_elf_unhandled_reloc),
411e1bfb
AM
657
658 /* A 16 bit dtprel reloc. */
46807bf4
AM
659 HOW (R_PPC64_DTPREL16, 1, 16, 0xffff, 0, FALSE, signed,
660 ppc64_elf_unhandled_reloc),
411e1bfb
AM
661
662 /* Like DTPREL16, but no overflow. */
46807bf4
AM
663 HOW (R_PPC64_DTPREL16_LO, 1, 16, 0xffff, 0, FALSE, dont,
664 ppc64_elf_unhandled_reloc),
411e1bfb
AM
665
666 /* Like DTPREL16_LO, but next higher group of 16 bits. */
46807bf4
AM
667 HOW (R_PPC64_DTPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
668 ppc64_elf_unhandled_reloc),
411e1bfb
AM
669
670 /* Like DTPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
671 HOW (R_PPC64_DTPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
672 ppc64_elf_unhandled_reloc),
411e1bfb
AM
673
674 /* Like DTPREL16_HI, but next higher group of 16 bits. */
46807bf4
AM
675 HOW (R_PPC64_DTPREL16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont,
676 ppc64_elf_unhandled_reloc),
411e1bfb
AM
677
678 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
46807bf4
AM
679 HOW (R_PPC64_DTPREL16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont,
680 ppc64_elf_unhandled_reloc),
411e1bfb
AM
681
682 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
46807bf4
AM
683 HOW (R_PPC64_DTPREL16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont,
684 ppc64_elf_unhandled_reloc),
411e1bfb
AM
685
686 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
46807bf4
AM
687 HOW (R_PPC64_DTPREL16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont,
688 ppc64_elf_unhandled_reloc),
411e1bfb
AM
689
690 /* Like DTPREL16, but for insns with a DS field. */
46807bf4
AM
691 HOW (R_PPC64_DTPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
692 ppc64_elf_unhandled_reloc),
411e1bfb
AM
693
694 /* Like DTPREL16_DS, but no overflow. */
46807bf4
AM
695 HOW (R_PPC64_DTPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
696 ppc64_elf_unhandled_reloc),
411e1bfb
AM
697
698 /* Computes a tp-relative displacement, the difference between the value of
699 sym+add and the value of the thread pointer (r13). */
46807bf4
AM
700 HOW (R_PPC64_TPREL64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
701 ppc64_elf_unhandled_reloc),
411e1bfb
AM
702
703 /* A 16 bit tprel reloc. */
46807bf4
AM
704 HOW (R_PPC64_TPREL16, 1, 16, 0xffff, 0, FALSE, signed,
705 ppc64_elf_unhandled_reloc),
411e1bfb
AM
706
707 /* Like TPREL16, but no overflow. */
46807bf4
AM
708 HOW (R_PPC64_TPREL16_LO, 1, 16, 0xffff, 0, FALSE, dont,
709 ppc64_elf_unhandled_reloc),
411e1bfb
AM
710
711 /* Like TPREL16_LO, but next higher group of 16 bits. */
46807bf4
AM
712 HOW (R_PPC64_TPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
713 ppc64_elf_unhandled_reloc),
411e1bfb
AM
714
715 /* Like TPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
716 HOW (R_PPC64_TPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
717 ppc64_elf_unhandled_reloc),
411e1bfb
AM
718
719 /* Like TPREL16_HI, but next higher group of 16 bits. */
46807bf4
AM
720 HOW (R_PPC64_TPREL16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont,
721 ppc64_elf_unhandled_reloc),
411e1bfb
AM
722
723 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
46807bf4
AM
724 HOW (R_PPC64_TPREL16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont,
725 ppc64_elf_unhandled_reloc),
411e1bfb
AM
726
727 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
46807bf4
AM
728 HOW (R_PPC64_TPREL16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont,
729 ppc64_elf_unhandled_reloc),
411e1bfb
AM
730
731 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
46807bf4
AM
732 HOW (R_PPC64_TPREL16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont,
733 ppc64_elf_unhandled_reloc),
411e1bfb
AM
734
735 /* Like TPREL16, but for insns with a DS field. */
46807bf4
AM
736 HOW (R_PPC64_TPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
737 ppc64_elf_unhandled_reloc),
411e1bfb
AM
738
739 /* Like TPREL16_DS, but no overflow. */
46807bf4
AM
740 HOW (R_PPC64_TPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
741 ppc64_elf_unhandled_reloc),
411e1bfb
AM
742
743 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
744 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
745 to the first entry relative to the TOC base (r2). */
46807bf4
AM
746 HOW (R_PPC64_GOT_TLSGD16, 1, 16, 0xffff, 0, FALSE, signed,
747 ppc64_elf_unhandled_reloc),
5bd4f169 748
411e1bfb 749 /* Like GOT_TLSGD16, but no overflow. */
46807bf4
AM
750 HOW (R_PPC64_GOT_TLSGD16_LO, 1, 16, 0xffff, 0, FALSE, dont,
751 ppc64_elf_unhandled_reloc),
5bd4f169 752
411e1bfb 753 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
46807bf4
AM
754 HOW (R_PPC64_GOT_TLSGD16_HI, 1, 16, 0xffff, 16, FALSE, signed,
755 ppc64_elf_unhandled_reloc),
5bd4f169 756
411e1bfb 757 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
46807bf4
AM
758 HOW (R_PPC64_GOT_TLSGD16_HA, 1, 16, 0xffff, 16, FALSE, signed,
759 ppc64_elf_unhandled_reloc),
5bd4f169 760
411e1bfb
AM
761 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
762 with values (sym+add)@dtpmod and zero, and computes the offset to the
763 first entry relative to the TOC base (r2). */
46807bf4
AM
764 HOW (R_PPC64_GOT_TLSLD16, 1, 16, 0xffff, 0, FALSE, signed,
765 ppc64_elf_unhandled_reloc),
5bd4f169 766
411e1bfb 767 /* Like GOT_TLSLD16, but no overflow. */
46807bf4
AM
768 HOW (R_PPC64_GOT_TLSLD16_LO, 1, 16, 0xffff, 0, FALSE, dont,
769 ppc64_elf_unhandled_reloc),
5bd4f169 770
411e1bfb 771 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
46807bf4
AM
772 HOW (R_PPC64_GOT_TLSLD16_HI, 1, 16, 0xffff, 16, FALSE, signed,
773 ppc64_elf_unhandled_reloc),
5bd4f169 774
411e1bfb 775 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
46807bf4
AM
776 HOW (R_PPC64_GOT_TLSLD16_HA, 1, 16, 0xffff, 16, FALSE, signed,
777 ppc64_elf_unhandled_reloc),
5bd4f169 778
411e1bfb
AM
779 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
780 the offset to the entry relative to the TOC base (r2). */
46807bf4
AM
781 HOW (R_PPC64_GOT_DTPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
782 ppc64_elf_unhandled_reloc),
5bd4f169 783
411e1bfb 784 /* Like GOT_DTPREL16_DS, but no overflow. */
46807bf4
AM
785 HOW (R_PPC64_GOT_DTPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
786 ppc64_elf_unhandled_reloc),
5bd4f169 787
411e1bfb 788 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
46807bf4
AM
789 HOW (R_PPC64_GOT_DTPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
790 ppc64_elf_unhandled_reloc),
5bd4f169 791
411e1bfb 792 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
793 HOW (R_PPC64_GOT_DTPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
794 ppc64_elf_unhandled_reloc),
411e1bfb
AM
795
796 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
797 offset to the entry relative to the TOC base (r2). */
46807bf4
AM
798 HOW (R_PPC64_GOT_TPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
799 ppc64_elf_unhandled_reloc),
5bd4f169 800
411e1bfb 801 /* Like GOT_TPREL16_DS, but no overflow. */
46807bf4
AM
802 HOW (R_PPC64_GOT_TPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
803 ppc64_elf_unhandled_reloc),
5bd4f169 804
411e1bfb 805 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
46807bf4
AM
806 HOW (R_PPC64_GOT_TPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
807 ppc64_elf_unhandled_reloc),
5bd4f169 808
411e1bfb 809 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
810 HOW (R_PPC64_GOT_TPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
811 ppc64_elf_unhandled_reloc),
812
813 HOW (R_PPC64_JMP_IREL, 0, 0, 0, 0, FALSE, dont,
814 ppc64_elf_unhandled_reloc),
815
816 HOW (R_PPC64_IRELATIVE, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
817 bfd_elf_generic_reloc),
e054468f 818
25f23106 819 /* A 16 bit relative relocation. */
46807bf4
AM
820 HOW (R_PPC64_REL16, 1, 16, 0xffff, 0, TRUE, signed,
821 bfd_elf_generic_reloc),
25f23106
AM
822
823 /* A 16 bit relative relocation without overflow. */
46807bf4
AM
824 HOW (R_PPC64_REL16_LO, 1, 16, 0xffff, 0, TRUE, dont,
825 bfd_elf_generic_reloc),
25f23106
AM
826
827 /* The high order 16 bits of a relative address. */
46807bf4
AM
828 HOW (R_PPC64_REL16_HI, 1, 16, 0xffff, 16, TRUE, signed,
829 bfd_elf_generic_reloc),
25f23106
AM
830
831 /* The high order 16 bits of a relative address, plus 1 if the contents of
832 the low 16 bits, treated as a signed number, is negative. */
46807bf4
AM
833 HOW (R_PPC64_REL16_HA, 1, 16, 0xffff, 16, TRUE, signed,
834 ppc64_elf_ha_reloc),
25f23106 835
4a969973
AM
836 HOW (R_PPC64_REL16_HIGH, 1, 16, 0xffff, 16, TRUE, dont,
837 bfd_elf_generic_reloc),
838
839 HOW (R_PPC64_REL16_HIGHA, 1, 16, 0xffff, 16, TRUE, dont,
840 ppc64_elf_ha_reloc),
841
842 HOW (R_PPC64_REL16_HIGHER, 1, 16, 0xffff, 32, TRUE, dont,
843 bfd_elf_generic_reloc),
844
845 HOW (R_PPC64_REL16_HIGHERA, 1, 16, 0xffff, 32, TRUE, dont,
846 ppc64_elf_ha_reloc),
847
848 HOW (R_PPC64_REL16_HIGHEST, 1, 16, 0xffff, 48, TRUE, dont,
849 bfd_elf_generic_reloc),
850
851 HOW (R_PPC64_REL16_HIGHESTA, 1, 16, 0xffff, 48, TRUE, dont,
852 ppc64_elf_ha_reloc),
853
a680de9a 854 /* Like R_PPC64_REL16_HA but for split field in addpcis. */
46807bf4
AM
855 HOW (R_PPC64_REL16DX_HA, 2, 16, 0x1fffc1, 16, TRUE, signed,
856 ppc64_elf_ha_reloc),
a680de9a 857
7ba71655 858 /* A split-field reloc for addpcis, non-relative (gas internal use only). */
46807bf4
AM
859 HOW (R_PPC64_16DX_HA, 2, 16, 0x1fffc1, 16, FALSE, signed,
860 ppc64_elf_ha_reloc),
7ba71655 861
f9c6b907 862 /* Like R_PPC64_ADDR16_HI, but no overflow. */
46807bf4
AM
863 HOW (R_PPC64_ADDR16_HIGH, 1, 16, 0xffff, 16, FALSE, dont,
864 bfd_elf_generic_reloc),
f9c6b907
AM
865
866 /* Like R_PPC64_ADDR16_HA, but no overflow. */
46807bf4
AM
867 HOW (R_PPC64_ADDR16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont,
868 ppc64_elf_ha_reloc),
f9c6b907
AM
869
870 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
46807bf4
AM
871 HOW (R_PPC64_DTPREL16_HIGH, 1, 16, 0xffff, 16, FALSE, dont,
872 ppc64_elf_unhandled_reloc),
f9c6b907
AM
873
874 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
46807bf4
AM
875 HOW (R_PPC64_DTPREL16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont,
876 ppc64_elf_unhandled_reloc),
f9c6b907
AM
877
878 /* Like R_PPC64_TPREL16_HI, but no overflow. */
46807bf4
AM
879 HOW (R_PPC64_TPREL16_HIGH, 1, 16, 0xffff, 16, FALSE, dont,
880 ppc64_elf_unhandled_reloc),
f9c6b907
AM
881
882 /* Like R_PPC64_TPREL16_HA, but no overflow. */
46807bf4
AM
883 HOW (R_PPC64_TPREL16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont,
884 ppc64_elf_unhandled_reloc),
f9c6b907 885
006589cf 886 /* Marker reloc on ELFv2 large-model function entry. */
46807bf4
AM
887 HOW (R_PPC64_ENTRY, 2, 32, 0, 0, FALSE, dont,
888 bfd_elf_generic_reloc),
006589cf 889
45965137 890 /* Like ADDR64, but use local entry point of function. */
46807bf4
AM
891 HOW (R_PPC64_ADDR64_LOCAL, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
892 bfd_elf_generic_reloc),
45965137 893
5663e321
AM
894 HOW (R_PPC64_PLTSEQ_NOTOC, 2, 32, 0, 0, FALSE, dont,
895 bfd_elf_generic_reloc),
896
897 HOW (R_PPC64_PLTCALL_NOTOC, 2, 32, 0, 0, FALSE, dont,
898 bfd_elf_generic_reloc),
899
900 HOW (R_PPC64_PCREL_OPT, 2, 32, 0, 0, FALSE, dont,
901 bfd_elf_generic_reloc),
902
903 HOW (R_PPC64_D34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed,
904 ppc64_elf_prefix_reloc),
905
906 HOW (R_PPC64_D34_LO, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, dont,
907 ppc64_elf_prefix_reloc),
908
909 HOW (R_PPC64_D34_HI30, 4, 34, 0x3ffff0000ffffULL, 34, FALSE, dont,
910 ppc64_elf_prefix_reloc),
911
912 HOW (R_PPC64_D34_HA30, 4, 34, 0x3ffff0000ffffULL, 34, FALSE, dont,
913 ppc64_elf_prefix_reloc),
914
915 HOW (R_PPC64_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
916 ppc64_elf_prefix_reloc),
917
918 HOW (R_PPC64_GOT_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
919 ppc64_elf_unhandled_reloc),
920
921 HOW (R_PPC64_PLT_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
922 ppc64_elf_unhandled_reloc),
923
924 HOW (R_PPC64_PLT_PCREL34_NOTOC, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
925 ppc64_elf_unhandled_reloc),
926
c213164a
AM
927 HOW (R_PPC64_TPREL34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed,
928 ppc64_elf_unhandled_reloc),
929
930 HOW (R_PPC64_DTPREL34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed,
931 ppc64_elf_unhandled_reloc),
932
87c69f97 933 HOW (R_PPC64_GOT_TLSGD_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
c213164a
AM
934 ppc64_elf_unhandled_reloc),
935
87c69f97 936 HOW (R_PPC64_GOT_TLSLD_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
c213164a
AM
937 ppc64_elf_unhandled_reloc),
938
87c69f97 939 HOW (R_PPC64_GOT_TPREL_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
c213164a
AM
940 ppc64_elf_unhandled_reloc),
941
87c69f97 942 HOW (R_PPC64_GOT_DTPREL_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
c213164a
AM
943 ppc64_elf_unhandled_reloc),
944
5663e321
AM
945 HOW (R_PPC64_ADDR16_HIGHER34, 1, 16, 0xffff, 34, FALSE, dont,
946 bfd_elf_generic_reloc),
947
948 HOW (R_PPC64_ADDR16_HIGHERA34, 1, 16, 0xffff, 34, FALSE, dont,
949 ppc64_elf_ha_reloc),
950
951 HOW (R_PPC64_ADDR16_HIGHEST34, 1, 16, 0xffff, 50, FALSE, dont,
952 bfd_elf_generic_reloc),
953
954 HOW (R_PPC64_ADDR16_HIGHESTA34, 1, 16, 0xffff, 50, FALSE, dont,
955 ppc64_elf_ha_reloc),
956
957 HOW (R_PPC64_REL16_HIGHER34, 1, 16, 0xffff, 34, TRUE, dont,
958 bfd_elf_generic_reloc),
959
960 HOW (R_PPC64_REL16_HIGHERA34, 1, 16, 0xffff, 34, TRUE, dont,
961 ppc64_elf_ha_reloc),
962
963 HOW (R_PPC64_REL16_HIGHEST34, 1, 16, 0xffff, 50, TRUE, dont,
964 bfd_elf_generic_reloc),
965
966 HOW (R_PPC64_REL16_HIGHESTA34, 1, 16, 0xffff, 50, TRUE, dont,
967 ppc64_elf_ha_reloc),
968
969 HOW (R_PPC64_D28, 4, 28, 0xfff0000ffffULL, 0, FALSE, signed,
970 ppc64_elf_prefix_reloc),
971
972 HOW (R_PPC64_PCREL28, 4, 28, 0xfff0000ffffULL, 0, TRUE, signed,
973 ppc64_elf_prefix_reloc),
974
5bd4f169 975 /* GNU extension to record C++ vtable hierarchy. */
46807bf4
AM
976 HOW (R_PPC64_GNU_VTINHERIT, 0, 0, 0, 0, FALSE, dont,
977 NULL),
5bd4f169
AM
978
979 /* GNU extension to record C++ vtable member usage. */
46807bf4
AM
980 HOW (R_PPC64_GNU_VTENTRY, 0, 0, 0, 0, FALSE, dont,
981 NULL),
5bd4f169
AM
982};
983
984\f
985/* Initialize the ppc64_elf_howto_table, so that linear accesses can
986 be done. */
987
988static void
4ce794b7 989ppc_howto_init (void)
5bd4f169
AM
990{
991 unsigned int i, type;
992
a4b6fadd 993 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
5bd4f169
AM
994 {
995 type = ppc64_elf_howto_raw[i].type;
a4b6fadd 996 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table));
5bd4f169
AM
997 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
998 }
999}
1000
1001static reloc_howto_type *
87c69f97 1002ppc64_elf_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
5bd4f169 1003{
411e1bfb 1004 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
5bd4f169
AM
1005
1006 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1007 /* Initialize howto table if needed. */
1008 ppc_howto_init ();
1009
4ce794b7 1010 switch (code)
5bd4f169
AM
1011 {
1012 default:
f3185997 1013 /* xgettext:c-format */
2cdcc330
AM
1014 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd,
1015 (int) code);
f3185997 1016 bfd_set_error (bfd_error_bad_value);
4ce794b7 1017 return NULL;
5bd4f169 1018
411e1bfb
AM
1019 case BFD_RELOC_NONE: r = R_PPC64_NONE;
1020 break;
1021 case BFD_RELOC_32: r = R_PPC64_ADDR32;
1022 break;
1023 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
1024 break;
1025 case BFD_RELOC_16: r = R_PPC64_ADDR16;
1026 break;
1027 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
1028 break;
1029 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
1030 break;
f9c6b907
AM
1031 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
1032 break;
411e1bfb 1033 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
5bd4f169 1034 break;
f9c6b907
AM
1035 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
1036 break;
411e1bfb 1037 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
5bd4f169 1038 break;
411e1bfb 1039 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
5bd4f169 1040 break;
411e1bfb 1041 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
5bd4f169 1042 break;
411e1bfb 1043 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
5bd4f169 1044 break;
05d0e962
AM
1045 case BFD_RELOC_PPC64_REL24_NOTOC: r = R_PPC64_REL24_NOTOC;
1046 break;
411e1bfb 1047 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
5bd4f169 1048 break;
411e1bfb 1049 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
5bd4f169 1050 break;
411e1bfb 1051 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
5bd4f169 1052 break;
411e1bfb 1053 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
5bd4f169 1054 break;
411e1bfb 1055 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
5bd4f169 1056 break;
411e1bfb 1057 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
5bd4f169 1058 break;
411e1bfb 1059 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
5bd4f169 1060 break;
411e1bfb 1061 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
5bd4f169 1062 break;
411e1bfb 1063 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
5bd4f169 1064 break;
411e1bfb 1065 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
5bd4f169 1066 break;
411e1bfb 1067 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
5bd4f169 1068 break;
411e1bfb 1069 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
5bd4f169 1070 break;
411e1bfb 1071 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
5bd4f169 1072 break;
411e1bfb 1073 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
5bd4f169 1074 break;
411e1bfb 1075 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
5bd4f169 1076 break;
411e1bfb 1077 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
5bd4f169 1078 break;
411e1bfb 1079 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
5bd4f169 1080 break;
411e1bfb 1081 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
5bd4f169 1082 break;
411e1bfb 1083 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
5bd4f169 1084 break;
411e1bfb 1085 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
5bd4f169 1086 break;
411e1bfb 1087 case BFD_RELOC_64: r = R_PPC64_ADDR64;
5bd4f169 1088 break;
411e1bfb 1089 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
5bd4f169 1090 break;
411e1bfb 1091 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
5bd4f169 1092 break;
411e1bfb 1093 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
5bd4f169 1094 break;
411e1bfb 1095 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
5bd4f169 1096 break;
411e1bfb 1097 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
5bd4f169 1098 break;
411e1bfb 1099 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
5bd4f169 1100 break;
411e1bfb 1101 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
5bd4f169 1102 break;
411e1bfb 1103 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
5bd4f169 1104 break;
411e1bfb 1105 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
5bd4f169 1106 break;
411e1bfb 1107 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
5bd4f169 1108 break;
411e1bfb 1109 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
5bd4f169 1110 break;
411e1bfb 1111 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
5bd4f169 1112 break;
411e1bfb 1113 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
5bd4f169 1114 break;
411e1bfb 1115 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
5bd4f169 1116 break;
411e1bfb 1117 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
5bd4f169 1118 break;
411e1bfb 1119 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
5bd4f169 1120 break;
411e1bfb 1121 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
5bd4f169 1122 break;
411e1bfb 1123 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
5bd4f169 1124 break;
411e1bfb 1125 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
5bd4f169 1126 break;
411e1bfb 1127 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
5bd4f169 1128 break;
411e1bfb 1129 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
5bd4f169 1130 break;
411e1bfb 1131 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
5bd4f169 1132 break;
411e1bfb 1133 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
5bd4f169 1134 break;
411e1bfb 1135 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
5bd4f169 1136 break;
411e1bfb 1137 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
5bd4f169 1138 break;
411e1bfb 1139 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
5bd4f169 1140 break;
411e1bfb 1141 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
5bd4f169 1142 break;
c213164a 1143 case BFD_RELOC_PPC64_TLS_PCREL:
411e1bfb 1144 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
5bd4f169 1145 break;
727fc41e
AM
1146 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
1147 break;
1148 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
1149 break;
411e1bfb 1150 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
5bd4f169 1151 break;
411e1bfb 1152 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
5bd4f169 1153 break;
411e1bfb 1154 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
5bd4f169 1155 break;
411e1bfb 1156 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
5bd4f169 1157 break;
f9c6b907
AM
1158 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
1159 break;
411e1bfb 1160 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
5bd4f169 1161 break;
f9c6b907
AM
1162 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
1163 break;
411e1bfb 1164 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
5bd4f169 1165 break;
411e1bfb
AM
1166 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
1167 break;
1168 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
1169 break;
1170 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
1171 break;
f9c6b907
AM
1172 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
1173 break;
411e1bfb
AM
1174 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
1175 break;
f9c6b907
AM
1176 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
1177 break;
411e1bfb
AM
1178 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
1179 break;
1180 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
1181 break;
1182 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
1183 break;
1184 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
1185 break;
1186 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
1187 break;
1188 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
1189 break;
1190 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
1191 break;
1192 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
1193 break;
1194 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
1195 break;
1196 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
1197 break;
1198 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
1199 break;
1200 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
1201 break;
1202 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
1203 break;
1204 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
1205 break;
1206 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
1207 break;
1208 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
1209 break;
1210 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
1211 break;
1212 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
1213 break;
1214 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
1215 break;
1216 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
1217 break;
1218 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
1219 break;
1220 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
1221 break;
1222 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
1223 break;
1224 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
1225 break;
1226 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
1227 break;
1228 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
1229 break;
1230 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
1231 break;
1232 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
1233 break;
1234 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
1235 break;
25f23106
AM
1236 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
1237 break;
1238 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
1239 break;
1240 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
1241 break;
1242 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
1243 break;
4a969973
AM
1244 case BFD_RELOC_PPC64_REL16_HIGH: r = R_PPC64_REL16_HIGH;
1245 break;
1246 case BFD_RELOC_PPC64_REL16_HIGHA: r = R_PPC64_REL16_HIGHA;
1247 break;
1248 case BFD_RELOC_PPC64_REL16_HIGHER: r = R_PPC64_REL16_HIGHER;
1249 break;
1250 case BFD_RELOC_PPC64_REL16_HIGHERA: r = R_PPC64_REL16_HIGHERA;
1251 break;
1252 case BFD_RELOC_PPC64_REL16_HIGHEST: r = R_PPC64_REL16_HIGHEST;
1253 break;
1254 case BFD_RELOC_PPC64_REL16_HIGHESTA: r = R_PPC64_REL16_HIGHESTA;
1255 break;
7ba71655
AM
1256 case BFD_RELOC_PPC_16DX_HA: r = R_PPC64_16DX_HA;
1257 break;
a680de9a
PB
1258 case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA;
1259 break;
006589cf
AM
1260 case BFD_RELOC_PPC64_ENTRY: r = R_PPC64_ENTRY;
1261 break;
45965137
AM
1262 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
1263 break;
5663e321
AM
1264 case BFD_RELOC_PPC64_D34: r = R_PPC64_D34;
1265 break;
1266 case BFD_RELOC_PPC64_D34_LO: r = R_PPC64_D34_LO;
1267 break;
1268 case BFD_RELOC_PPC64_D34_HI30: r = R_PPC64_D34_HI30;
1269 break;
1270 case BFD_RELOC_PPC64_D34_HA30: r = R_PPC64_D34_HA30;
1271 break;
1272 case BFD_RELOC_PPC64_PCREL34: r = R_PPC64_PCREL34;
1273 break;
1274 case BFD_RELOC_PPC64_GOT_PCREL34: r = R_PPC64_GOT_PCREL34;
1275 break;
1276 case BFD_RELOC_PPC64_PLT_PCREL34: r = R_PPC64_PLT_PCREL34;
1277 break;
c213164a
AM
1278 case BFD_RELOC_PPC64_TPREL34: r = R_PPC64_TPREL34;
1279 break;
1280 case BFD_RELOC_PPC64_DTPREL34: r = R_PPC64_DTPREL34;
1281 break;
87c69f97 1282 case BFD_RELOC_PPC64_GOT_TLSGD_PCREL34: r = R_PPC64_GOT_TLSGD_PCREL34;
c213164a 1283 break;
87c69f97 1284 case BFD_RELOC_PPC64_GOT_TLSLD_PCREL34: r = R_PPC64_GOT_TLSLD_PCREL34;
c213164a 1285 break;
87c69f97 1286 case BFD_RELOC_PPC64_GOT_TPREL_PCREL34: r = R_PPC64_GOT_TPREL_PCREL34;
c213164a 1287 break;
87c69f97 1288 case BFD_RELOC_PPC64_GOT_DTPREL_PCREL34: r = R_PPC64_GOT_DTPREL_PCREL34;
c213164a 1289 break;
5663e321
AM
1290 case BFD_RELOC_PPC64_ADDR16_HIGHER34: r = R_PPC64_ADDR16_HIGHER34;
1291 break;
1292 case BFD_RELOC_PPC64_ADDR16_HIGHERA34: r = R_PPC64_ADDR16_HIGHERA34;
1293 break;
1294 case BFD_RELOC_PPC64_ADDR16_HIGHEST34: r = R_PPC64_ADDR16_HIGHEST34;
1295 break;
1296 case BFD_RELOC_PPC64_ADDR16_HIGHESTA34: r = R_PPC64_ADDR16_HIGHESTA34;
1297 break;
1298 case BFD_RELOC_PPC64_REL16_HIGHER34: r = R_PPC64_REL16_HIGHER34;
1299 break;
1300 case BFD_RELOC_PPC64_REL16_HIGHERA34: r = R_PPC64_REL16_HIGHERA34;
1301 break;
1302 case BFD_RELOC_PPC64_REL16_HIGHEST34: r = R_PPC64_REL16_HIGHEST34;
1303 break;
1304 case BFD_RELOC_PPC64_REL16_HIGHESTA34: r = R_PPC64_REL16_HIGHESTA34;
1305 break;
1306 case BFD_RELOC_PPC64_D28: r = R_PPC64_D28;
1307 break;
1308 case BFD_RELOC_PPC64_PCREL28: r = R_PPC64_PCREL28;
1309 break;
411e1bfb
AM
1310 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
1311 break;
1312 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
5bd4f169
AM
1313 break;
1314 }
1315
4ce794b7 1316 return ppc64_elf_howto_table[r];
5bd4f169
AM
1317};
1318
157090f7 1319static reloc_howto_type *
87c69f97 1320ppc64_elf_reloc_name_lookup (bfd *abfd, const char *r_name)
157090f7
AM
1321{
1322 unsigned int i;
87c69f97
AM
1323 static char *compat_map[][2] = {
1324 { "R_PPC64_GOT_TLSGD34", "R_PPC64_GOT_TLSGD_PCREL34" },
1325 { "R_PPC64_GOT_TLSLD34", "R_PPC64_GOT_TLSLD_PCREL34" },
1326 { "R_PPC64_GOT_TPREL34", "R_PPC64_GOT_TPREL_PCREL34" },
1327 { "R_PPC64_GOT_DTPREL34", "R_PPC64_GOT_DTPREL_PCREL34" }
1328 };
157090f7 1329
a4b6fadd 1330 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
157090f7
AM
1331 if (ppc64_elf_howto_raw[i].name != NULL
1332 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
1333 return &ppc64_elf_howto_raw[i];
1334
87c69f97
AM
1335 /* Handle old names of relocations in case they were used by
1336 .reloc directives.
1337 FIXME: Remove this soon. Mapping the reloc names is very likely
1338 completely unnecessary. */
1339 for (i = 0; i < ARRAY_SIZE (compat_map); i++)
1340 if (strcasecmp (compat_map[i][0], r_name) == 0)
1341 {
1342 _bfd_error_handler (_("warning: %s should be used rather than %s"),
1343 compat_map[i][1], compat_map[i][0]);
1344 return ppc64_elf_reloc_name_lookup (abfd, compat_map[i][1]);
1345 }
1346
157090f7
AM
1347 return NULL;
1348}
1349
5bd4f169
AM
1350/* Set the howto pointer for a PowerPC ELF reloc. */
1351
f3185997 1352static bfd_boolean
4aef7643 1353ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
4ce794b7 1354 Elf_Internal_Rela *dst)
5bd4f169 1355{
65f38f15
AM
1356 unsigned int type;
1357
ef60b7ff 1358 /* Initialize howto table if needed. */
5bd4f169 1359 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
1360 ppc_howto_init ();
1361
65f38f15 1362 type = ELF64_R_TYPE (dst->r_info);
a4b6fadd 1363 if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
d0fb9a8d 1364 {
695344c0 1365 /* xgettext:c-format */
0aa13fee 1366 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
cf97bcb0 1367 abfd, type);
f3185997
NC
1368 bfd_set_error (bfd_error_bad_value);
1369 return FALSE;
d0fb9a8d 1370 }
65f38f15 1371 cache_ptr->howto = ppc64_elf_howto_table[type];
f3185997
NC
1372 if (cache_ptr->howto == NULL || cache_ptr->howto->name == NULL)
1373 {
1374 /* xgettext:c-format */
1375 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1376 abfd, type);
1377 bfd_set_error (bfd_error_bad_value);
1378 return FALSE;
1379 }
2cdcc330 1380
f3185997 1381 return TRUE;
5bd4f169
AM
1382}
1383
04c9666a 1384/* Handle the R_PPC64_ADDR16_HA and similar relocs. */
5bd4f169
AM
1385
1386static bfd_reloc_status_type
4ce794b7
AM
1387ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1388 void *data, asection *input_section,
1389 bfd *output_bfd, char **error_message)
5bd4f169 1390{
a680de9a
PB
1391 enum elf_ppc64_reloc_type r_type;
1392 long insn;
1393 bfd_size_type octets;
3de43e7b 1394 bfd_vma value;
a680de9a 1395
805fc799
AM
1396 /* If this is a relocatable link (output_bfd test tells us), just
1397 call the generic function. Any adjustment will be done at final
1398 link time. */
1399 if (output_bfd != NULL)
cedb70c5 1400 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1401 input_section, output_bfd, error_message);
1402
5663e321
AM
1403 /* Adjust the addend for sign extension of the low 16 (or 34) bits.
1404 We won't actually be using the low bits, so trashing them
805fc799 1405 doesn't matter. */
a680de9a 1406 r_type = reloc_entry->howto->type;
5663e321
AM
1407 if (r_type == R_PPC64_ADDR16_HIGHERA34
1408 || r_type == R_PPC64_ADDR16_HIGHESTA34
1409 || r_type == R_PPC64_REL16_HIGHERA34
1410 || r_type == R_PPC64_REL16_HIGHESTA34)
1411 reloc_entry->addend += 1ULL << 33;
1412 else
1413 reloc_entry->addend += 1U << 15;
a680de9a
PB
1414 if (r_type != R_PPC64_REL16DX_HA)
1415 return bfd_reloc_continue;
1416
1417 value = 0;
1418 if (!bfd_is_com_section (symbol->section))
1419 value = symbol->value;
1420 value += (reloc_entry->addend
1421 + symbol->section->output_offset
1422 + symbol->section->output_section->vma);
1423 value -= (reloc_entry->address
1424 + input_section->output_offset
1425 + input_section->output_section->vma);
3de43e7b 1426 value = (bfd_signed_vma) value >> 16;
a680de9a 1427
bb294208 1428 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
a680de9a
PB
1429 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
1430 insn &= ~0x1fffc1;
3de43e7b 1431 insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
a680de9a 1432 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
3de43e7b 1433 if (value + 0x8000 > 0xffff)
a680de9a
PB
1434 return bfd_reloc_overflow;
1435 return bfd_reloc_ok;
805fc799 1436}
5bd4f169 1437
2441e016
AM
1438static bfd_reloc_status_type
1439ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1440 void *data, asection *input_section,
1441 bfd *output_bfd, char **error_message)
1442{
1443 if (output_bfd != NULL)
1444 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1445 input_section, output_bfd, error_message);
1446
699733f6
AM
1447 if (strcmp (symbol->section->name, ".opd") == 0
1448 && (symbol->section->owner->flags & DYNAMIC) == 0)
2441e016
AM
1449 {
1450 bfd_vma dest = opd_entry_value (symbol->section,
1451 symbol->value + reloc_entry->addend,
aef36ac1 1452 NULL, NULL, FALSE);
2441e016
AM
1453 if (dest != (bfd_vma) -1)
1454 reloc_entry->addend = dest - (symbol->value
1455 + symbol->section->output_section->vma
1456 + symbol->section->output_offset);
1457 }
810d4e75
AM
1458 else
1459 {
1460 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
1461
1462 if (symbol->section->owner != abfd
9f284bf9 1463 && symbol->section->owner != NULL
810d4e75
AM
1464 && abiversion (symbol->section->owner) >= 2)
1465 {
1466 unsigned int i;
1467
1468 for (i = 0; i < symbol->section->owner->symcount; ++i)
1469 {
1470 asymbol *symdef = symbol->section->owner->outsymbols[i];
1471
1472 if (strcmp (symdef->name, symbol->name) == 0)
1473 {
1474 elfsym = (elf_symbol_type *) symdef;
1475 break;
1476 }
1477 }
1478 }
1479 reloc_entry->addend
1480 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
1481 }
2441e016
AM
1482 return bfd_reloc_continue;
1483}
1484
805fc799 1485static bfd_reloc_status_type
4ce794b7
AM
1486ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1487 void *data, asection *input_section,
1488 bfd *output_bfd, char **error_message)
805fc799
AM
1489{
1490 long insn;
04c9666a 1491 enum elf_ppc64_reloc_type r_type;
805fc799 1492 bfd_size_type octets;
794e51c0
AM
1493 /* Assume 'at' branch hints. */
1494 bfd_boolean is_isa_v2 = TRUE;
805fc799
AM
1495
1496 /* If this is a relocatable link (output_bfd test tells us), just
1497 call the generic function. Any adjustment will be done at final
1498 link time. */
5bd4f169 1499 if (output_bfd != NULL)
cedb70c5 1500 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1501 input_section, output_bfd, error_message);
1502
bb294208 1503 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
805fc799
AM
1504 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
1505 insn &= ~(0x01 << 21);
4ce794b7 1506 r_type = reloc_entry->howto->type;
805fc799
AM
1507 if (r_type == R_PPC64_ADDR14_BRTAKEN
1508 || r_type == R_PPC64_REL14_BRTAKEN)
cedb70c5 1509 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
805fc799 1510
794e51c0 1511 if (is_isa_v2)
5bd4f169 1512 {
805fc799
AM
1513 /* Set 'a' bit. This is 0b00010 in BO field for branch
1514 on CR(BI) insns (BO == 001at or 011at), and 0b01000
1515 for branch on CTR insns (BO == 1a00t or 1a01t). */
1516 if ((insn & (0x14 << 21)) == (0x04 << 21))
1517 insn |= 0x02 << 21;
1518 else if ((insn & (0x14 << 21)) == (0x10 << 21))
1519 insn |= 0x08 << 21;
1520 else
2441e016 1521 goto out;
5bd4f169 1522 }
805fc799
AM
1523 else
1524 {
1525 bfd_vma target = 0;
1526 bfd_vma from;
5bd4f169 1527
805fc799
AM
1528 if (!bfd_is_com_section (symbol->section))
1529 target = symbol->value;
1530 target += symbol->section->output_section->vma;
1531 target += symbol->section->output_offset;
1532 target += reloc_entry->addend;
5bd4f169 1533
805fc799
AM
1534 from = (reloc_entry->address
1535 + input_section->output_offset
1536 + input_section->output_section->vma);
5bd4f169 1537
805fc799
AM
1538 /* Invert 'y' bit if not the default. */
1539 if ((bfd_signed_vma) (target - from) < 0)
1540 insn ^= 0x01 << 21;
1541 }
4ce794b7 1542 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2441e016
AM
1543 out:
1544 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
1545 input_section, output_bfd, error_message);
805fc799 1546}
5bd4f169 1547
805fc799 1548static bfd_reloc_status_type
4ce794b7
AM
1549ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1550 void *data, asection *input_section,
1551 bfd *output_bfd, char **error_message)
805fc799
AM
1552{
1553 /* If this is a relocatable link (output_bfd test tells us), just
1554 call the generic function. Any adjustment will be done at final
1555 link time. */
1556 if (output_bfd != NULL)
cedb70c5 1557 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799 1558 input_section, output_bfd, error_message);
5bd4f169 1559
805fc799
AM
1560 /* Subtract the symbol section base address. */
1561 reloc_entry->addend -= symbol->section->output_section->vma;
5bd4f169
AM
1562 return bfd_reloc_continue;
1563}
1564
805fc799 1565static bfd_reloc_status_type
4ce794b7
AM
1566ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1567 void *data, asection *input_section,
1568 bfd *output_bfd, char **error_message)
805fc799
AM
1569{
1570 /* If this is a relocatable link (output_bfd test tells us), just
1571 call the generic function. Any adjustment will be done at final
1572 link time. */
1573 if (output_bfd != NULL)
cedb70c5 1574 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1575 input_section, output_bfd, error_message);
1576
1577 /* Subtract the symbol section base address. */
1578 reloc_entry->addend -= symbol->section->output_section->vma;
1579
1580 /* Adjust the addend for sign extension of the low 16 bits. */
1581 reloc_entry->addend += 0x8000;
1582 return bfd_reloc_continue;
1583}
1584
1585static bfd_reloc_status_type
4ce794b7
AM
1586ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1587 void *data, asection *input_section,
1588 bfd *output_bfd, char **error_message)
805fc799
AM
1589{
1590 bfd_vma TOCstart;
1591
1592 /* If this is a relocatable link (output_bfd test tells us), just
1593 call the generic function. Any adjustment will be done at final
1594 link time. */
1595 if (output_bfd != NULL)
cedb70c5 1596 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1597 input_section, output_bfd, error_message);
1598
1599 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1600 if (TOCstart == 0)
1c865ab2 1601 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
1602
1603 /* Subtract the TOC base address. */
1604 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
1605 return bfd_reloc_continue;
1606}
1607
1608static bfd_reloc_status_type
4ce794b7
AM
1609ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1610 void *data, asection *input_section,
1611 bfd *output_bfd, char **error_message)
805fc799
AM
1612{
1613 bfd_vma TOCstart;
1614
1615 /* If this is a relocatable link (output_bfd test tells us), just
1616 call the generic function. Any adjustment will be done at final
1617 link time. */
1618 if (output_bfd != NULL)
cedb70c5 1619 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1620 input_section, output_bfd, error_message);
1621
1622 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1623 if (TOCstart == 0)
1c865ab2 1624 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
1625
1626 /* Subtract the TOC base address. */
1627 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
1628
1629 /* Adjust the addend for sign extension of the low 16 bits. */
1630 reloc_entry->addend += 0x8000;
1631 return bfd_reloc_continue;
1632}
1633
1634static bfd_reloc_status_type
4ce794b7
AM
1635ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1636 void *data, asection *input_section,
1637 bfd *output_bfd, char **error_message)
805fc799
AM
1638{
1639 bfd_vma TOCstart;
1640 bfd_size_type octets;
1641
1642 /* If this is a relocatable link (output_bfd test tells us), just
1643 call the generic function. Any adjustment will be done at final
1644 link time. */
1645 if (output_bfd != NULL)
cedb70c5 1646 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1647 input_section, output_bfd, error_message);
1648
1649 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1650 if (TOCstart == 0)
1c865ab2 1651 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799 1652
bb294208 1653 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
805fc799
AM
1654 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
1655 return bfd_reloc_ok;
1656}
1657
5663e321
AM
1658static bfd_reloc_status_type
1659ppc64_elf_prefix_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1660 void *data, asection *input_section,
1661 bfd *output_bfd, char **error_message)
1662{
1663 uint64_t insn;
1664 bfd_vma targ;
1665
1666 if (output_bfd != NULL)
1667 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1668 input_section, output_bfd, error_message);
1669
1670 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1671 insn <<= 32;
1672 insn |= bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address + 4);
1673
1674 targ = (symbol->section->output_section->vma
1675 + symbol->section->output_offset
1676 + reloc_entry->addend);
1677 if (!bfd_is_com_section (symbol->section))
1678 targ += symbol->value;
1679 if (reloc_entry->howto->type == R_PPC64_D34_HA30)
1680 targ += 1ULL << 33;
1681 if (reloc_entry->howto->pc_relative)
1682 {
1683 bfd_vma from = (reloc_entry->address
1684 + input_section->output_offset
1685 + input_section->output_section->vma);
1686 targ -=from;
1687 }
1688 targ >>= reloc_entry->howto->rightshift;
1689 insn &= ~reloc_entry->howto->dst_mask;
1690 insn |= ((targ << 16) | (targ & 0xffff)) & reloc_entry->howto->dst_mask;
1691 bfd_put_32 (abfd, insn >> 32, (bfd_byte *) data + reloc_entry->address);
1692 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address + 4);
1693 if (reloc_entry->howto->complain_on_overflow == complain_overflow_signed
1694 && (targ + (1ULL << (reloc_entry->howto->bitsize - 1))
1695 >= 1ULL << reloc_entry->howto->bitsize))
1696 return bfd_reloc_overflow;
1697 return bfd_reloc_ok;
1698}
1699
805fc799 1700static bfd_reloc_status_type
4ce794b7
AM
1701ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1702 void *data, asection *input_section,
1703 bfd *output_bfd, char **error_message)
805fc799
AM
1704{
1705 /* If this is a relocatable link (output_bfd test tells us), just
1706 call the generic function. Any adjustment will be done at final
1707 link time. */
1708 if (output_bfd != NULL)
cedb70c5 1709 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1710 input_section, output_bfd, error_message);
1711
1712 if (error_message != NULL)
1713 {
1714 static char buf[60];
1715 sprintf (buf, "generic linker can't handle %s",
1716 reloc_entry->howto->name);
1717 *error_message = buf;
1718 }
1719 return bfd_reloc_dangerous;
1720}
1721
927be08e
AM
1722/* Track GOT entries needed for a given symbol. We might need more
1723 than one got entry per symbol. */
1724struct got_entry
1725{
1726 struct got_entry *next;
1727
1728 /* The symbol addend that we'll be placing in the GOT. */
1729 bfd_vma addend;
1730
1731 /* Unlike other ELF targets, we use separate GOT entries for the same
1732 symbol referenced from different input files. This is to support
1733 automatic multiple TOC/GOT sections, where the TOC base can vary
1734 from one input file to another. After partitioning into TOC groups
1735 we merge entries within the group.
1736
1737 Point to the BFD owning this GOT entry. */
1738 bfd *owner;
1739
1740 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
1741 TLS_TPREL or TLS_DTPREL for tls entries. */
f961d9dd 1742 unsigned char tls_type;
927be08e
AM
1743
1744 /* Non-zero if got.ent points to real entry. */
f961d9dd 1745 unsigned char is_indirect;
927be08e
AM
1746
1747 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
1748 union
2cdcc330
AM
1749 {
1750 bfd_signed_vma refcount;
1751 bfd_vma offset;
1752 struct got_entry *ent;
1753 } got;
927be08e
AM
1754};
1755
1756/* The same for PLT. */
1757struct plt_entry
1758{
1759 struct plt_entry *next;
1760
1761 bfd_vma addend;
1762
1763 union
2cdcc330
AM
1764 {
1765 bfd_signed_vma refcount;
1766 bfd_vma offset;
1767 } plt;
927be08e
AM
1768};
1769
e717da7e
AM
1770struct ppc64_elf_obj_tdata
1771{
1772 struct elf_obj_tdata elf;
1773
1774 /* Shortcuts to dynamic linker sections. */
1775 asection *got;
1776 asection *relgot;
1777
b3fac117
AM
1778 /* Used during garbage collection. We attach global symbols defined
1779 on removed .opd entries to this section so that the sym is removed. */
1780 asection *deleted_section;
81688140 1781
927be08e 1782 /* TLS local dynamic got entry handling. Support for multiple GOT
e717da7e 1783 sections means we potentially need one of these for each input bfd. */
927be08e 1784 struct got_entry tlsld_got;
8860955f 1785
2cdcc330
AM
1786 union
1787 {
729eabd5
AM
1788 /* A copy of relocs before they are modified for --emit-relocs. */
1789 Elf_Internal_Rela *relocs;
1790
1791 /* Section contents. */
1792 bfd_byte *contents;
1793 } opd;
d77c8a4b
AM
1794
1795 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
1796 the reloc to be in the range -32768 to 32767. */
98528052
AM
1797 unsigned int has_small_toc_reloc : 1;
1798
560c8763
AM
1799 /* Set if toc/got ha relocs detected not using r2, or lo reloc
1800 instruction not one we handle. */
1801 unsigned int unexpected_toc_insn : 1;
066f4018 1802
903b777d
AM
1803 /* Set if PLT/GOT/TOC relocs that can be optimised are present in
1804 this file. */
1805 unsigned int has_optrel : 1;
e717da7e
AM
1806};
1807
1808#define ppc64_elf_tdata(bfd) \
1809 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
1810
1811#define ppc64_tlsld_got(bfd) \
1812 (&ppc64_elf_tdata (bfd)->tlsld_got)
1813
0c8d6e5c
AM
1814#define is_ppc64_elf(bfd) \
1815 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
4dfe6ac6 1816 && elf_object_id (bfd) == PPC64_ELF_DATA)
0c8d6e5c 1817
e717da7e
AM
1818/* Override the generic function because we store some extras. */
1819
1820static bfd_boolean
1821ppc64_elf_mkobject (bfd *abfd)
1822{
0ffa91dd 1823 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
4dfe6ac6 1824 PPC64_ELF_DATA);
e717da7e
AM
1825}
1826
feee612b 1827/* Fix bad default arch selected for a 64 bit input bfd when the
14b57c7c 1828 default is 32 bit. Also select arch based on apuinfo. */
feee612b 1829
b34976b6 1830static bfd_boolean
4ce794b7 1831ppc64_elf_object_p (bfd *abfd)
feee612b 1832{
14b57c7c
AM
1833 if (!abfd->arch_info->the_default)
1834 return TRUE;
1835
1836 if (abfd->arch_info->bits_per_word == 32)
feee612b
AM
1837 {
1838 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
1839
1840 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
1841 {
1842 /* Relies on arch after 32 bit default being 64 bit default. */
1843 abfd->arch_info = abfd->arch_info->next;
1844 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
1845 }
1846 }
14b57c7c 1847 return _bfd_elf_ppc_set_arch (abfd);
feee612b
AM
1848}
1849
d37c89e5
AM
1850/* Support for core dump NOTE sections. */
1851
1852static bfd_boolean
1853ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1854{
eea6121a 1855 size_t offset, size;
d37c89e5
AM
1856
1857 if (note->descsz != 504)
1858 return FALSE;
1859
1860 /* pr_cursig */
228e534f 1861 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
d37c89e5
AM
1862
1863 /* pr_pid */
228e534f 1864 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
d37c89e5
AM
1865
1866 /* pr_reg */
1867 offset = 112;
eea6121a 1868 size = 384;
d37c89e5
AM
1869
1870 /* Make a ".reg/999" section. */
1871 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 1872 size, note->descpos + offset);
d37c89e5
AM
1873}
1874
1875static bfd_boolean
1876ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1877{
1878 if (note->descsz != 136)
1879 return FALSE;
1880
228e534f 1881 elf_tdata (abfd)->core->pid
bc989cdc 1882 = bfd_get_32 (abfd, note->descdata + 24);
228e534f 1883 elf_tdata (abfd)->core->program
d37c89e5 1884 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
228e534f 1885 elf_tdata (abfd)->core->command
d37c89e5
AM
1886 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
1887
1888 return TRUE;
1889}
1890
183e98be
AM
1891static char *
1892ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
1893 ...)
1894{
1895 switch (note_type)
1896 {
1897 default:
1898 return NULL;
1899
1900 case NT_PRPSINFO:
1901 {
9ef6d1e3 1902 char data[136] ATTRIBUTE_NONSTRING;
183e98be
AM
1903 va_list ap;
1904
1905 va_start (ap, note_type);
75cd47ed 1906 memset (data, 0, sizeof (data));
183e98be 1907 strncpy (data + 40, va_arg (ap, const char *), 16);
be3e27bb 1908#if GCC_VERSION == 8000 || GCC_VERSION == 8001
95da9854 1909 DIAGNOSTIC_PUSH;
be3e27bb 1910 /* GCC 8.0 and 8.1 warn about 80 equals destination size with
95da9854
L
1911 -Wstringop-truncation:
1912 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
1913 */
95da9854
L
1914 DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
1915#endif
183e98be 1916 strncpy (data + 56, va_arg (ap, const char *), 80);
be3e27bb 1917#if GCC_VERSION == 8000 || GCC_VERSION == 8001
95da9854 1918 DIAGNOSTIC_POP;
fe75810f 1919#endif
183e98be
AM
1920 va_end (ap);
1921 return elfcore_write_note (abfd, buf, bufsiz,
1922 "CORE", note_type, data, sizeof (data));
1923 }
1924
1925 case NT_PRSTATUS:
1926 {
1927 char data[504];
1928 va_list ap;
1929 long pid;
1930 int cursig;
1931 const void *greg;
1932
1933 va_start (ap, note_type);
1934 memset (data, 0, 112);
1935 pid = va_arg (ap, long);
1936 bfd_put_32 (abfd, pid, data + 32);
1937 cursig = va_arg (ap, int);
1938 bfd_put_16 (abfd, cursig, data + 12);
1939 greg = va_arg (ap, const void *);
1940 memcpy (data + 112, greg, 384);
1941 memset (data + 496, 0, 8);
1942 va_end (ap);
1943 return elfcore_write_note (abfd, buf, bufsiz,
1944 "CORE", note_type, data, sizeof (data));
1945 }
1946 }
1947}
1948
5d35169e
AM
1949/* Add extra PPC sections. */
1950
2cdcc330 1951static const struct bfd_elf_special_section ppc64_elf_special_sections[] =
7f4d3958 1952{
07d6d2b8
AM
1953 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
1954 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 1955 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
1956 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
1957 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 1958 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8 1959 { NULL, 0, 0, 0, 0 }
5d35169e
AM
1960};
1961
7c8fe5c4
AM
1962enum _ppc64_sec_type {
1963 sec_normal = 0,
1964 sec_opd = 1,
1965 sec_toc = 2
1966};
1967
f0abc2a1
AM
1968struct _ppc64_elf_section_data
1969{
1970 struct bfd_elf_section_data elf;
411e1bfb 1971
f0abc2a1
AM
1972 union
1973 {
51aecdc5
AM
1974 /* An array with one entry for each opd function descriptor,
1975 and some spares since opd entries may be either 16 or 24 bytes. */
1976#define OPD_NDX(OFF) ((OFF) >> 4)
74f0fb50
AM
1977 struct _opd_sec_data
1978 {
1979 /* Points to the function code section for local opd entries. */
1980 asection **func_sec;
1981
1982 /* After editing .opd, adjust references to opd local syms. */
1983 long *adjust;
1984 } opd;
7c8fe5c4 1985
3a71aa26
AM
1986 /* An array for toc sections, indexed by offset/8. */
1987 struct _toc_sec_data
1988 {
1989 /* Specifies the relocation symbol index used at a given toc offset. */
1990 unsigned *symndx;
1991
1992 /* And the relocation addend. */
1993 bfd_vma *add;
1994 } toc;
7c8fe5c4
AM
1995 } u;
1996
1997 enum _ppc64_sec_type sec_type:2;
411e1bfb 1998
7c8fe5c4
AM
1999 /* Flag set when small branches are detected. Used to
2000 select suitable defaults for the stub group size. */
2001 unsigned int has_14bit_branch:1;
3e04d765
AM
2002
2003 /* Flag set when PLTCALL relocs are detected. */
2004 unsigned int has_pltcall:1;
066f4018 2005
903b777d
AM
2006 /* Flag set when section has PLT/GOT/TOC relocations that can be
2007 optimised. */
2008 unsigned int has_optrel:1;
f0abc2a1
AM
2009};
2010
2011#define ppc64_elf_section_data(sec) \
411e1bfb 2012 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
f0abc2a1
AM
2013
2014static bfd_boolean
4ce794b7 2015ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 2016{
f592407e
AM
2017 if (!sec->used_by_bfd)
2018 {
2019 struct _ppc64_elf_section_data *sdata;
986f0783 2020 size_t amt = sizeof (*sdata);
f0abc2a1 2021
f592407e
AM
2022 sdata = bfd_zalloc (abfd, amt);
2023 if (sdata == NULL)
2024 return FALSE;
2025 sec->used_by_bfd = sdata;
2026 }
f0abc2a1
AM
2027
2028 return _bfd_elf_new_section_hook (abfd, sec);
2029}
4025353c 2030
bf577467
AM
2031static bfd_boolean
2032ppc64_elf_section_flags (const Elf_Internal_Shdr *hdr)
2033{
2034 const char *name = hdr->bfd_section->name;
2035
2036 if (strncmp (name, ".sbss", 5) == 0
2037 || strncmp (name, ".sdata", 6) == 0)
2038 hdr->bfd_section->flags |= SEC_SMALL_DATA;
2039
2040 return TRUE;
2041}
2042
74f0fb50 2043static struct _opd_sec_data *
4025353c
AM
2044get_opd_info (asection * sec)
2045{
2046 if (sec != NULL
2047 && ppc64_elf_section_data (sec) != NULL
7c8fe5c4 2048 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
74f0fb50 2049 return &ppc64_elf_section_data (sec)->u.opd;
4025353c
AM
2050 return NULL;
2051}
90e3cdf2
JJ
2052\f
2053/* Parameters for the qsort hook. */
90e3cdf2 2054static bfd_boolean synthetic_relocatable;
cd285db5 2055static asection *synthetic_opd;
90e3cdf2 2056
699733f6 2057/* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
90e3cdf2
JJ
2058
2059static int
2060compare_symbols (const void *ap, const void *bp)
2061{
2cdcc330
AM
2062 const asymbol *a = *(const asymbol **) ap;
2063 const asymbol *b = *(const asymbol **) bp;
90e3cdf2 2064
699733f6
AM
2065 /* Section symbols first. */
2066 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
90e3cdf2 2067 return -1;
699733f6 2068 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
90e3cdf2
JJ
2069 return 1;
2070
699733f6 2071 /* then .opd symbols. */
cd285db5
AM
2072 if (synthetic_opd != NULL)
2073 {
2074 if (strcmp (a->section->name, ".opd") == 0
2075 && strcmp (b->section->name, ".opd") != 0)
2076 return -1;
2077 if (strcmp (a->section->name, ".opd") != 0
2078 && strcmp (b->section->name, ".opd") == 0)
2079 return 1;
2080 }
90e3cdf2 2081
699733f6 2082 /* then other code symbols. */
2cdcc330
AM
2083 if (((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2084 == (SEC_CODE | SEC_ALLOC))
2085 && ((b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2086 != (SEC_CODE | SEC_ALLOC)))
90e3cdf2
JJ
2087 return -1;
2088
2cdcc330
AM
2089 if (((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2090 != (SEC_CODE | SEC_ALLOC))
2091 && ((b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2092 == (SEC_CODE | SEC_ALLOC)))
90e3cdf2
JJ
2093 return 1;
2094
2095 if (synthetic_relocatable)
2096 {
2097 if (a->section->id < b->section->id)
2098 return -1;
2099
2100 if (a->section->id > b->section->id)
2101 return 1;
2102 }
2103
2104 if (a->value + a->section->vma < b->value + b->section->vma)
2105 return -1;
2106
2107 if (a->value + a->section->vma > b->value + b->section->vma)
2108 return 1;
2109
4d35a0aa
AM
2110 /* For syms with the same value, prefer strong dynamic global function
2111 syms over other syms. */
2112 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
2113 return -1;
2114
2115 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
2116 return 1;
2117
2118 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
2119 return -1;
2120
2121 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
2122 return 1;
2123
2124 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
2125 return -1;
2126
2127 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
2128 return 1;
2129
2130 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
2131 return -1;
2132
2133 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
2134 return 1;
2135
dcea6a95
AM
2136 /* Finally, sort on where the symbol is in memory. The symbols will
2137 be in at most two malloc'd blocks, one for static syms, one for
2138 dynamic syms, and we distinguish the two blocks above by testing
2139 BSF_DYNAMIC. Since we are sorting the symbol pointers which were
2140 originally in the same order as the symbols (and we're not
2141 sorting the symbols themselves), this ensures a stable sort. */
2142 if (a < b)
2143 return -1;
2144 if (a > b)
2145 return 1;
2146 return 0;
90e3cdf2
JJ
2147}
2148
699733f6 2149/* Search SYMS for a symbol of the given VALUE. */
90e3cdf2 2150
699733f6 2151static asymbol *
9ad9b810
AM
2152sym_exists_at (asymbol **syms, size_t lo, size_t hi, unsigned int id,
2153 bfd_vma value)
90e3cdf2 2154{
9ad9b810 2155 size_t mid;
90e3cdf2 2156
7292b3ac 2157 if (id == (unsigned) -1)
699733f6
AM
2158 {
2159 while (lo < hi)
2160 {
2161 mid = (lo + hi) >> 1;
2162 if (syms[mid]->value + syms[mid]->section->vma < value)
2163 lo = mid + 1;
2164 else if (syms[mid]->value + syms[mid]->section->vma > value)
2165 hi = mid;
2166 else
2167 return syms[mid];
2168 }
2169 }
2170 else
2171 {
2172 while (lo < hi)
2173 {
2174 mid = (lo + hi) >> 1;
2175 if (syms[mid]->section->id < id)
2176 lo = mid + 1;
2177 else if (syms[mid]->section->id > id)
2178 hi = mid;
2179 else if (syms[mid]->value < value)
2180 lo = mid + 1;
2181 else if (syms[mid]->value > value)
2182 hi = mid;
2183 else
2184 return syms[mid];
2185 }
2186 }
2187 return NULL;
90e3cdf2
JJ
2188}
2189
468392fb
AM
2190static bfd_boolean
2191section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
2192{
2193 bfd_vma vma = *(bfd_vma *) ptr;
2194 return ((section->flags & SEC_ALLOC) != 0
2195 && section->vma <= vma
2196 && vma < section->vma + section->size);
2197}
2198
699733f6 2199/* Create synthetic symbols, effectively restoring "dot-symbol" function
c4b0b099
AM
2200 entry syms. Also generate @plt symbols for the glink branch table.
2201 Returns count of synthetic symbols in RET or -1 on error. */
90e3cdf2
JJ
2202
2203static long
a7535cf3
AM
2204ppc64_elf_get_synthetic_symtab (bfd *abfd,
2205 long static_count, asymbol **static_syms,
2206 long dyn_count, asymbol **dyn_syms,
c9727e01 2207 asymbol **ret)
90e3cdf2
JJ
2208{
2209 asymbol *s;
0ccf57bd 2210 size_t i, j, count;
90e3cdf2 2211 char *names;
0ccf57bd 2212 size_t symcount, codesecsym, codesecsymend, secsymend, opdsymend;
ee67d69a 2213 asection *opd = NULL;
90e3cdf2 2214 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 2215 asymbol **syms;
ee67d69a 2216 int abi = abiversion (abfd);
90e3cdf2
JJ
2217
2218 *ret = NULL;
2219
ee67d69a
AM
2220 if (abi < 2)
2221 {
2222 opd = bfd_get_section_by_name (abfd, ".opd");
2223 if (opd == NULL && abi == 1)
2224 return 0;
2225 }
90e3cdf2 2226
a5259595
AM
2227 syms = NULL;
2228 codesecsym = 0;
2229 codesecsymend = 0;
2230 secsymend = 0;
2231 opdsymend = 0;
2232 symcount = 0;
2233 if (opd != NULL)
c9727e01 2234 {
a5259595
AM
2235 symcount = static_count;
2236 if (!relocatable)
2237 symcount += dyn_count;
2238 if (symcount == 0)
2239 return 0;
c9727e01 2240
a5259595
AM
2241 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2242 if (syms == NULL)
2243 return -1;
90e3cdf2 2244
a5259595
AM
2245 if (!relocatable && static_count != 0 && dyn_count != 0)
2246 {
2247 /* Use both symbol tables. */
2248 memcpy (syms, static_syms, static_count * sizeof (*syms));
2249 memcpy (syms + static_count, dyn_syms,
2250 (dyn_count + 1) * sizeof (*syms));
2251 }
2252 else if (!relocatable && static_count == 0)
2253 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
2254 else
2255 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
90e3cdf2 2256
0ccf57bd
AM
2257 /* Trim uninteresting symbols. Interesting symbols are section,
2258 function, and notype symbols. */
2259 for (i = 0, j = 0; i < symcount; ++i)
2260 if ((syms[i]->flags & (BSF_FILE | BSF_OBJECT | BSF_THREAD_LOCAL
2261 | BSF_RELC | BSF_SRELC)) == 0)
2262 syms[j++] = syms[i];
2263 symcount = j;
2264
a5259595
AM
2265 synthetic_relocatable = relocatable;
2266 synthetic_opd = opd;
2267 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 2268
a5259595
AM
2269 if (!relocatable && symcount > 1)
2270 {
bfa5bd2a
PA
2271 /* Trim duplicate syms, since we may have merged the normal
2272 and dynamic symbols. Actually, we only care about syms
2273 that have different values, so trim any with the same
2274 value. Don't consider ifunc and ifunc resolver symbols
2275 duplicates however, because GDB wants to know whether a
2276 text symbol is an ifunc resolver. */
a5259595 2277 for (i = 1, j = 1; i < symcount; ++i)
bfa5bd2a
PA
2278 {
2279 const asymbol *s0 = syms[i - 1];
2280 const asymbol *s1 = syms[i];
2281
2282 if ((s0->value + s0->section->vma
2283 != s1->value + s1->section->vma)
2284 || ((s0->flags & BSF_GNU_INDIRECT_FUNCTION)
2285 != (s1->flags & BSF_GNU_INDIRECT_FUNCTION)))
2286 syms[j++] = syms[i];
2287 }
a5259595
AM
2288 symcount = j;
2289 }
699733f6 2290
a5259595
AM
2291 i = 0;
2292 /* Note that here and in compare_symbols we can't compare opd and
2293 sym->section directly. With separate debug info files, the
2294 symbols will be extracted from the debug file while abfd passed
2295 to this function is the real binary. */
0ccf57bd 2296 if (strcmp (syms[i]->section->name, ".opd") == 0)
a5259595
AM
2297 ++i;
2298 codesecsym = i;
2299
2300 for (; i < symcount; ++i)
2301 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC
2302 | SEC_THREAD_LOCAL))
2303 != (SEC_CODE | SEC_ALLOC))
2304 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
2305 break;
2306 codesecsymend = i;
2307
2308 for (; i < symcount; ++i)
2309 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2310 break;
2311 secsymend = i;
2312
2313 for (; i < symcount; ++i)
2314 if (strcmp (syms[i]->section->name, ".opd") != 0)
2315 break;
2316 opdsymend = i;
2317
2318 for (; i < symcount; ++i)
2cdcc330
AM
2319 if (((syms[i]->section->flags
2320 & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL)))
a5259595
AM
2321 != (SEC_CODE | SEC_ALLOC))
2322 break;
2323 symcount = i;
2324 }
c9727e01 2325 count = 0;
90e3cdf2 2326
699733f6 2327 if (relocatable)
90e3cdf2 2328 {
699733f6
AM
2329 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2330 arelent *r;
2331 size_t size;
0ccf57bd 2332 size_t relcount;
90e3cdf2 2333
468392fb
AM
2334 if (opdsymend == secsymend)
2335 goto done;
2336
699733f6 2337 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2 2338 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
7356fed5 2339 if (relcount == 0)
c9727e01 2340 goto done;
90e3cdf2 2341
7356fed5
AM
2342 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
2343 {
2344 count = -1;
2345 goto done;
2346 }
2347
699733f6 2348 size = 0;
595da8c5 2349 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
2350 {
2351 asymbol *sym;
90e3cdf2 2352
595da8c5 2353 while (r < opd->relocation + relcount
699733f6
AM
2354 && r->address < syms[i]->value + opd->vma)
2355 ++r;
90e3cdf2 2356
595da8c5 2357 if (r == opd->relocation + relcount)
699733f6 2358 break;
90e3cdf2 2359
699733f6
AM
2360 if (r->address != syms[i]->value + opd->vma)
2361 continue;
90e3cdf2 2362
699733f6
AM
2363 if (r->howto->type != R_PPC64_ADDR64)
2364 continue;
90e3cdf2 2365
699733f6
AM
2366 sym = *r->sym_ptr_ptr;
2367 if (!sym_exists_at (syms, opdsymend, symcount,
2368 sym->section->id, sym->value + r->addend))
2369 {
2370 ++count;
2371 size += sizeof (asymbol);
2372 size += strlen (syms[i]->name) + 2;
2373 }
2374 }
90e3cdf2 2375
c4b0b099
AM
2376 if (size == 0)
2377 goto done;
699733f6
AM
2378 s = *ret = bfd_malloc (size);
2379 if (s == NULL)
2380 {
7356fed5 2381 count = -1;
c9727e01 2382 goto done;
699733f6 2383 }
90e3cdf2 2384
699733f6 2385 names = (char *) (s + count);
90e3cdf2 2386
595da8c5 2387 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 2388 {
699733f6 2389 asymbol *sym;
90e3cdf2 2390
595da8c5 2391 while (r < opd->relocation + relcount
699733f6
AM
2392 && r->address < syms[i]->value + opd->vma)
2393 ++r;
90e3cdf2 2394
595da8c5 2395 if (r == opd->relocation + relcount)
699733f6
AM
2396 break;
2397
2398 if (r->address != syms[i]->value + opd->vma)
2399 continue;
2400
2401 if (r->howto->type != R_PPC64_ADDR64)
2402 continue;
90e3cdf2 2403
699733f6
AM
2404 sym = *r->sym_ptr_ptr;
2405 if (!sym_exists_at (syms, opdsymend, symcount,
2406 sym->section->id, sym->value + r->addend))
2407 {
2408 size_t len;
2409
2410 *s = *syms[i];
6ba2a415 2411 s->flags |= BSF_SYNTHETIC;
699733f6
AM
2412 s->section = sym->section;
2413 s->value = sym->value + r->addend;
2414 s->name = names;
2415 *names++ = '.';
2416 len = strlen (syms[i]->name);
2417 memcpy (names, syms[i]->name, len + 1);
2418 names += len + 1;
6f610d07
UW
2419 /* Have udata.p point back to the original symbol this
2420 synthetic symbol was derived from. */
2421 s->udata.p = syms[i];
699733f6
AM
2422 s++;
2423 }
2424 }
2425 }
2426 else
90e3cdf2 2427 {
468392fb 2428 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
ee67d69a 2429 bfd_byte *contents = NULL;
699733f6 2430 size_t size;
0ccf57bd 2431 size_t plt_count = 0;
468392fb
AM
2432 bfd_vma glink_vma = 0, resolv_vma = 0;
2433 asection *dynamic, *glink = NULL, *relplt = NULL;
2434 arelent *p;
90e3cdf2 2435
ee67d69a 2436 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
699733f6 2437 {
c4b0b099
AM
2438 free_contents_and_exit_err:
2439 count = -1;
ee67d69a 2440 free_contents_and_exit:
c9594989 2441 free (contents);
c9727e01 2442 goto done;
699733f6 2443 }
90e3cdf2 2444
699733f6
AM
2445 size = 0;
2446 for (i = secsymend; i < opdsymend; ++i)
2447 {
2448 bfd_vma ent;
90e3cdf2 2449
5ef11c02
AM
2450 /* Ignore bogus symbols. */
2451 if (syms[i]->value > opd->size - 8)
2452 continue;
2453
699733f6
AM
2454 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2455 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2456 {
2457 ++count;
2458 size += sizeof (asymbol);
2459 size += strlen (syms[i]->name) + 2;
2460 }
2461 }
90e3cdf2 2462
468392fb 2463 /* Get start of .glink stubs from DT_PPC64_GLINK. */
066ee829
AM
2464 if (dyn_count != 0
2465 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
468392fb
AM
2466 {
2467 bfd_byte *dynbuf, *extdyn, *extdynend;
2468 size_t extdynsize;
2469 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
2470
2471 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
c4b0b099 2472 goto free_contents_and_exit_err;
468392fb
AM
2473
2474 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
2475 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
2476
2477 extdyn = dynbuf;
2478 extdynend = extdyn + dynamic->size;
2479 for (; extdyn < extdynend; extdyn += extdynsize)
2480 {
2481 Elf_Internal_Dyn dyn;
2482 (*swap_dyn_in) (abfd, extdyn, &dyn);
2483
2484 if (dyn.d_tag == DT_NULL)
2485 break;
2486
2487 if (dyn.d_tag == DT_PPC64_GLINK)
2488 {
9e390558
AM
2489 /* The first glink stub starts at DT_PPC64_GLINK plus 32.
2490 See comment in ppc64_elf_finish_dynamic_sections. */
2491 glink_vma = dyn.d_un.d_val + 8 * 4;
468392fb
AM
2492 /* The .glink section usually does not survive the final
2493 link; search for the section (usually .text) where the
2494 glink stubs now reside. */
2495 glink = bfd_sections_find_if (abfd, section_covers_vma,
2496 &glink_vma);
2497 break;
2498 }
2499 }
2500
2501 free (dynbuf);
2502 }
2503
2504 if (glink != NULL)
2505 {
2506 /* Determine __glink trampoline by reading the relative branch
2507 from the first glink stub. */
2508 bfd_byte buf[4];
b9e5796b
AM
2509 unsigned int off = 0;
2510
2511 while (bfd_get_section_contents (abfd, glink, buf,
2512 glink_vma + off - glink->vma, 4))
468392fb
AM
2513 {
2514 unsigned int insn = bfd_get_32 (abfd, buf);
2515 insn ^= B_DOT;
2516 if ((insn & ~0x3fffffc) == 0)
b9e5796b 2517 {
2cdcc330
AM
2518 resolv_vma
2519 = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
b9e5796b
AM
2520 break;
2521 }
2522 off += 4;
2523 if (off > 4)
2524 break;
468392fb
AM
2525 }
2526
2527 if (resolv_vma)
2528 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
468392fb 2529
066ee829
AM
2530 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2531 if (relplt != NULL)
2532 {
2533 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2cdcc330 2534 if (!(*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
c4b0b099 2535 goto free_contents_and_exit_err;
68ffbac6 2536
066ee829
AM
2537 plt_count = relplt->size / sizeof (Elf64_External_Rela);
2538 size += plt_count * sizeof (asymbol);
468392fb 2539
066ee829
AM
2540 p = relplt->relocation;
2541 for (i = 0; i < plt_count; i++, p++)
e054468f
AM
2542 {
2543 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
2544 if (p->addend != 0)
2545 size += sizeof ("+0x") - 1 + 16;
2546 }
066ee829 2547 }
468392fb
AM
2548 }
2549
c4b0b099
AM
2550 if (size == 0)
2551 goto free_contents_and_exit;
699733f6
AM
2552 s = *ret = bfd_malloc (size);
2553 if (s == NULL)
c4b0b099 2554 goto free_contents_and_exit_err;
90e3cdf2 2555
468392fb 2556 names = (char *) (s + count + plt_count + (resolv_vma != 0));
90e3cdf2 2557
699733f6 2558 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 2559 {
699733f6 2560 bfd_vma ent;
90e3cdf2 2561
5ef11c02
AM
2562 if (syms[i]->value > opd->size - 8)
2563 continue;
2564
699733f6
AM
2565 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2566 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 2567 {
0ccf57bd 2568 size_t lo, hi;
699733f6 2569 size_t len;
c9727e01 2570 asection *sec = abfd->sections;
90e3cdf2 2571
699733f6
AM
2572 *s = *syms[i];
2573 lo = codesecsym;
2574 hi = codesecsymend;
2575 while (lo < hi)
2576 {
0ccf57bd 2577 size_t mid = (lo + hi) >> 1;
699733f6
AM
2578 if (syms[mid]->section->vma < ent)
2579 lo = mid + 1;
2580 else if (syms[mid]->section->vma > ent)
2581 hi = mid;
2582 else
c9727e01
AM
2583 {
2584 sec = syms[mid]->section;
2585 break;
2586 }
699733f6
AM
2587 }
2588
c9727e01 2589 if (lo >= hi && lo > codesecsym)
699733f6 2590 sec = syms[lo - 1]->section;
699733f6
AM
2591
2592 for (; sec != NULL; sec = sec->next)
2593 {
2594 if (sec->vma > ent)
2595 break;
63524580
JK
2596 /* SEC_LOAD may not be set if SEC is from a separate debug
2597 info file. */
2598 if ((sec->flags & SEC_ALLOC) == 0)
699733f6
AM
2599 break;
2600 if ((sec->flags & SEC_CODE) != 0)
2601 s->section = sec;
2602 }
6ba2a415 2603 s->flags |= BSF_SYNTHETIC;
699733f6
AM
2604 s->value = ent - s->section->vma;
2605 s->name = names;
2606 *names++ = '.';
2607 len = strlen (syms[i]->name);
2608 memcpy (names, syms[i]->name, len + 1);
2609 names += len + 1;
6f610d07
UW
2610 /* Have udata.p point back to the original symbol this
2611 synthetic symbol was derived from. */
2612 s->udata.p = syms[i];
699733f6 2613 s++;
90e3cdf2 2614 }
90e3cdf2 2615 }
699733f6 2616 free (contents);
468392fb
AM
2617
2618 if (glink != NULL && relplt != NULL)
2619 {
2620 if (resolv_vma)
2621 {
2622 /* Add a symbol for the main glink trampoline. */
86a4952b 2623 memset (s, 0, sizeof *s);
468392fb 2624 s->the_bfd = abfd;
6ba2a415 2625 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
468392fb
AM
2626 s->section = glink;
2627 s->value = resolv_vma - glink->vma;
2628 s->name = names;
2cdcc330
AM
2629 memcpy (names, "__glink_PLTresolve",
2630 sizeof ("__glink_PLTresolve"));
468392fb
AM
2631 names += sizeof ("__glink_PLTresolve");
2632 s++;
2633 count++;
2634 }
2635
2636 /* FIXME: It would be very much nicer to put sym@plt on the
2637 stub rather than on the glink branch table entry. The
2638 objdump disassembler would then use a sensible symbol
2639 name on plt calls. The difficulty in doing so is
2640 a) finding the stubs, and,
2641 b) matching stubs against plt entries, and,
2642 c) there can be multiple stubs for a given plt entry.
2643
2644 Solving (a) could be done by code scanning, but older
2645 ppc64 binaries used different stubs to current code.
2646 (b) is the tricky one since you need to known the toc
2647 pointer for at least one function that uses a pic stub to
2648 be able to calculate the plt address referenced.
2649 (c) means gdb would need to set multiple breakpoints (or
2650 find the glink branch itself) when setting breakpoints
2651 for pending shared library loads. */
2652 p = relplt->relocation;
2653 for (i = 0; i < plt_count; i++, p++)
2654 {
2655 size_t len;
2656
2657 *s = **p->sym_ptr_ptr;
2658 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
2659 we are defining a symbol, ensure one of them is set. */
2660 if ((s->flags & BSF_LOCAL) == 0)
2661 s->flags |= BSF_GLOBAL;
6ba2a415 2662 s->flags |= BSF_SYNTHETIC;
468392fb
AM
2663 s->section = glink;
2664 s->value = glink_vma - glink->vma;
2665 s->name = names;
2666 s->udata.p = NULL;
2667 len = strlen ((*p->sym_ptr_ptr)->name);
2668 memcpy (names, (*p->sym_ptr_ptr)->name, len);
2669 names += len;
e054468f
AM
2670 if (p->addend != 0)
2671 {
2672 memcpy (names, "+0x", sizeof ("+0x") - 1);
2673 names += sizeof ("+0x") - 1;
2674 bfd_sprintf_vma (abfd, names, p->addend);
2675 names += strlen (names);
2676 }
468392fb
AM
2677 memcpy (names, "@plt", sizeof ("@plt"));
2678 names += sizeof ("@plt");
2679 s++;
b9e5796b
AM
2680 if (abi < 2)
2681 {
2682 glink_vma += 8;
2683 if (i >= 0x8000)
2684 glink_vma += 4;
2685 }
2686 else
468392fb
AM
2687 glink_vma += 4;
2688 }
2689 count += plt_count;
2690 }
90e3cdf2
JJ
2691 }
2692
c9727e01 2693 done:
a7535cf3 2694 free (syms);
90e3cdf2
JJ
2695 return count;
2696}
5bd4f169 2697\f
65f38f15
AM
2698/* The following functions are specific to the ELF linker, while
2699 functions above are used generally. Those named ppc64_elf_* are
2700 called by the main ELF linker code. They appear in this file more
2701 or less in the order in which they are called. eg.
2702 ppc64_elf_check_relocs is called early in the link process,
2703 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
2704 called.
2705
2706 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2707 functions have both a function code symbol and a function descriptor
2708 symbol. A call to foo in a relocatable object file looks like:
2709
2710 . .text
2711 . x:
2712 . bl .foo
2713 . nop
2714
2715 The function definition in another object file might be:
2716
2717 . .section .opd
2718 . foo: .quad .foo
2719 . .quad .TOC.@tocbase
2720 . .quad 0
2721 .
2722 . .text
2723 . .foo: blr
2724
2725 When the linker resolves the call during a static link, the branch
2726 unsurprisingly just goes to .foo and the .opd information is unused.
2727 If the function definition is in a shared library, things are a little
2728 different: The call goes via a plt call stub, the opd information gets
2729 copied to the plt, and the linker patches the nop.
2730
2731 . x:
2732 . bl .foo_stub
2733 . ld 2,40(1)
2734 .
2735 .
2736 . .foo_stub:
71a39c98
AM
2737 . std 2,40(1) # in practice, the call stub
2738 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
2739 . addi 11,11,Lfoo@toc@l # this is the general idea
2740 . ld 12,0(11)
2741 . ld 2,8(11)
2742 . mtctr 12
2743 . ld 11,16(11)
e86ce104
AM
2744 . bctr
2745 .
2746 . .section .plt
2747 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
2748
2749 The "reloc ()" notation is supposed to indicate that the linker emits
2750 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
2751 copying.
2752
2753 What are the difficulties here? Well, firstly, the relocations
2754 examined by the linker in check_relocs are against the function code
2755 sym .foo, while the dynamic relocation in the plt is emitted against
2756 the function descriptor symbol, foo. Somewhere along the line, we need
2757 to carefully copy dynamic link information from one symbol to the other.
2758 Secondly, the generic part of the elf linker will make .foo a dynamic
2759 symbol as is normal for most other backends. We need foo dynamic
2760 instead, at least for an application final link. However, when
2761 creating a shared library containing foo, we need to have both symbols
2762 dynamic so that references to .foo are satisfied during the early
2763 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
2764 definition from some other object, eg. a static library.
2765
2766 Update: As of August 2004, we support a new convention. Function
2767 calls may use the function descriptor symbol, ie. "bl foo". This
2768 behaves exactly as "bl .foo". */
65f38f15 2769
7c8bbca5
AM
2770/* Of those relocs that might be copied as dynamic relocs, this
2771 function selects those that must be copied when linking a shared
2772 library or PIE, even when the symbol is local. */
65f38f15 2773
1d483afe
AM
2774static int
2775must_be_dyn_reloc (struct bfd_link_info *info,
2776 enum elf_ppc64_reloc_type r_type)
2777{
2778 switch (r_type)
2779 {
2780 default:
7c8bbca5
AM
2781 /* Only relative relocs can be resolved when the object load
2782 address isn't fixed. DTPREL64 is excluded because the
2783 dynamic linker needs to differentiate global dynamic from
2784 local dynamic __tls_index pairs when PPC64_OPT_TLS is set. */
1d483afe
AM
2785 return 1;
2786
2787 case R_PPC64_REL32:
2788 case R_PPC64_REL64:
2789 case R_PPC64_REL30:
1bdd8fac
AM
2790 case R_PPC64_TOC16:
2791 case R_PPC64_TOC16_DS:
2792 case R_PPC64_TOC16_LO:
2793 case R_PPC64_TOC16_HI:
2794 case R_PPC64_TOC16_HA:
2795 case R_PPC64_TOC16_LO_DS:
1d483afe
AM
2796 return 0;
2797
2798 case R_PPC64_TPREL16:
2799 case R_PPC64_TPREL16_LO:
2800 case R_PPC64_TPREL16_HI:
2801 case R_PPC64_TPREL16_HA:
2802 case R_PPC64_TPREL16_DS:
2803 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
2804 case R_PPC64_TPREL16_HIGH:
2805 case R_PPC64_TPREL16_HIGHA:
1d483afe
AM
2806 case R_PPC64_TPREL16_HIGHER:
2807 case R_PPC64_TPREL16_HIGHERA:
2808 case R_PPC64_TPREL16_HIGHEST:
2809 case R_PPC64_TPREL16_HIGHESTA:
2810 case R_PPC64_TPREL64:
c213164a 2811 case R_PPC64_TPREL34:
7c8bbca5
AM
2812 /* These relocations are relative but in a shared library the
2813 linker doesn't know the thread pointer base. */
2814 return bfd_link_dll (info);
1d483afe
AM
2815 }
2816}
65f38f15 2817
f4656909 2818/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
e1c6cf61 2819 copying dynamic variables from a shared lib into an app's .dynbss
f4656909 2820 section, and instead use a dynamic relocation to point into the
e1c6cf61
AM
2821 shared lib. With code that gcc generates it is vital that this be
2822 enabled; In the PowerPC64 ELFv1 ABI the address of a function is
2823 actually the address of a function descriptor which resides in the
2824 .opd section. gcc uses the descriptor directly rather than going
2825 via the GOT as some other ABIs do, which means that initialized
2826 function pointers reference the descriptor. Thus, a function
2827 pointer initialized to the address of a function in a shared
2828 library will either require a .dynbss copy and a copy reloc, or a
2829 dynamic reloc. Using a .dynbss copy redefines the function
2830 descriptor symbol to point to the copy. This presents a problem as
2831 a PLT entry for that function is also initialized from the function
2832 descriptor symbol and the copy may not be initialized first. */
a23b6845 2833#define ELIMINATE_COPY_RELOCS 1
f4656909 2834
721956f4 2835/* Section name for stubs is the associated section name plus this
29942be8
NC
2836 string. */
2837#define STUB_SUFFIX ".stub"
721956f4
AM
2838
2839/* Linker stubs.
2840 ppc_stub_long_branch:
2841 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
2842 destination, but a 24 bit branch in a stub section will reach.
2843 . b dest
2844
2845 ppc_stub_plt_branch:
2846 Similar to the above, but a 24 bit branch in the stub section won't
2847 reach its destination.
6df4c9c2
AM
2848 . addis %r12,%r2,xxx@toc@ha
2849 . ld %r12,xxx@toc@l(%r12)
71a39c98 2850 . mtctr %r12
721956f4
AM
2851 . bctr
2852
2853 ppc_stub_plt_call:
2c66dc6c
AM
2854 Used to call a function in a shared library. If it so happens that
2855 the plt entry referenced crosses a 64k boundary, then an extra
71a39c98 2856 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
05d0e962 2857 ppc_stub_plt_call_r2save starts with "std %r2,40(%r1)".
71a39c98
AM
2858 . addis %r11,%r2,xxx@toc@ha
2859 . ld %r12,xxx+0@toc@l(%r11)
2860 . mtctr %r12
2861 . ld %r2,xxx+8@toc@l(%r11)
2862 . ld %r11,xxx+16@toc@l(%r11)
721956f4 2863 . bctr
ad8e1ba5
AM
2864
2865 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
2866 code to adjust the value and save r2 to support multiple toc sections.
2867 A ppc_stub_long_branch with an r2 offset looks like:
2868 . std %r2,40(%r1)
2869 . addis %r2,%r2,off@ha
2870 . addi %r2,%r2,off@l
2871 . b dest
2872
2873 A ppc_stub_plt_branch with an r2 offset looks like:
2874 . std %r2,40(%r1)
6df4c9c2
AM
2875 . addis %r12,%r2,xxx@toc@ha
2876 . ld %r12,xxx@toc@l(%r12)
ad8e1ba5
AM
2877 . addis %r2,%r2,off@ha
2878 . addi %r2,%r2,off@l
71a39c98 2879 . mtctr %r12
ad8e1ba5 2880 . bctr
ac2df442 2881
05d0e962
AM
2882 All of the above stubs are shown as their ELFv1 variants. ELFv2
2883 variants exist too, simpler for plt calls since a new toc pointer
2884 and static chain are not loaded by the stub. In addition, ELFv2
2885 has some more complex stubs to handle calls marked with NOTOC
2886 relocs from functions where r2 is not a valid toc pointer. These
2887 come in two flavours, the ones shown below, and _both variants that
2888 start with "std %r2,24(%r1)" to save r2 in the unlikely event that
2889 one call is from a function where r2 is used as the toc pointer but
2890 needs a toc adjusting stub for small-model multi-toc, and another
2891 call is from a function where r2 is not valid.
2892 ppc_stub_long_branch_notoc:
2893 . mflr %r12
2894 . bcl 20,31,1f
2895 . 1:
2896 . mflr %r11
2897 . mtlr %r12
2cdcc330
AM
2898 . addis %r12,%r11,dest-1b@ha
2899 . addi %r12,%r12,dest-1b@l
05d0e962
AM
2900 . b dest
2901
2902 ppc_stub_plt_branch_notoc:
2903 . mflr %r12
2904 . bcl 20,31,1f
2905 . 1:
2906 . mflr %r11
2907 . mtlr %r12
2908 . lis %r12,xxx-1b@highest
f891966f 2909 . ori %r12,%r12,xxx-1b@higher
05d0e962 2910 . sldi %r12,%r12,32
f891966f 2911 . oris %r12,%r12,xxx-1b@high
05d0e962
AM
2912 . ori %r12,%r12,xxx-1b@l
2913 . add %r12,%r11,%r12
2914 . mtctr %r12
2915 . bctr
2916
2917 ppc_stub_plt_call_notoc:
2918 . mflr %r12
2919 . bcl 20,31,1f
2920 . 1:
2921 . mflr %r11
2922 . mtlr %r12
2923 . lis %r12,xxx-1b@highest
f891966f 2924 . ori %r12,%r12,xxx-1b@higher
05d0e962 2925 . sldi %r12,%r12,32
f891966f 2926 . oris %r12,%r12,xxx-1b@high
05d0e962
AM
2927 . ori %r12,%r12,xxx-1b@l
2928 . ldx %r12,%r11,%r12
2929 . mtctr %r12
2930 . bctr
2931
7c1f4227 2932 There are also ELFv1 power10 variants of these stubs.
04bdff6a 2933 ppc_stub_long_branch_notoc:
d4b87b1e 2934 . pla %r12,dest@pcrel
04bdff6a
AM
2935 . b dest
2936 ppc_stub_plt_branch_notoc:
2937 . lis %r11,(dest-1f)@highesta34
2938 . ori %r11,%r11,(dest-1f)@highera34
2939 . sldi %r11,%r11,34
d4b87b1e 2940 . 1: pla %r12,dest@pcrel
04bdff6a
AM
2941 . add %r12,%r11,%r12
2942 . mtctr %r12
2943 . bctr
2944 ppc_stub_plt_call_notoc:
2945 . lis %r11,(xxx-1f)@highesta34
2946 . ori %r11,%r11,(xxx-1f)@highera34
2947 . sldi %r11,%r11,34
d4b87b1e 2948 . 1: pla %r12,xxx@pcrel
04bdff6a
AM
2949 . ldx %r12,%r11,%r12
2950 . mtctr %r12
2951 . bctr
2952
05d0e962
AM
2953 In cases where the high instructions would add zero, they are
2954 omitted and following instructions modified in some cases.
7c1f4227 2955 For example, a power10 ppc_stub_plt_call_notoc might simplify down
04bdff6a
AM
2956 to
2957 . pld %r12,xxx@pcrel
2958 . mtctr %r12
2959 . bctr
05d0e962
AM
2960
2961 For a given stub group (a set of sections all using the same toc
2962 pointer value) there will be just one stub type used for any
2963 particular function symbol. For example, if printf is called from
2964 code with the tocsave optimization (ie. r2 saved in function
2965 prologue) and therefore calls use a ppc_stub_plt_call linkage stub,
2966 and from other code without the tocsave optimization requiring a
2967 ppc_stub_plt_call_r2save linkage stub, a single stub of the latter
2968 type will be created. Calls with the tocsave optimization will
2969 enter this stub after the instruction saving r2. A similar
2970 situation exists when calls are marked with R_PPC64_REL24_NOTOC
2971 relocations. These require a ppc_stub_plt_call_notoc linkage stub
2972 to call an external function like printf. If other calls to printf
2973 require a ppc_stub_plt_call linkage stub then a single
2974 ppc_stub_plt_call_notoc linkage stub will be used for both types of
2975 call. If other calls to printf require a ppc_stub_plt_call_r2save
2976 linkage stub then a single ppc_stub_plt_call_both linkage stub will
2977 be created and calls not requiring r2 to be saved will enter the
2978 stub after the r2 save instruction. There is an analogous
2979 hierarchy of long branch and plt branch stubs for local call
2980 linkage. */
721956f4 2981
2cdcc330
AM
2982enum ppc_stub_type
2983{
721956f4
AM
2984 ppc_stub_none,
2985 ppc_stub_long_branch,
ad8e1ba5 2986 ppc_stub_long_branch_r2off,
05d0e962
AM
2987 ppc_stub_long_branch_notoc,
2988 ppc_stub_long_branch_both, /* r2off and notoc variants both needed. */
721956f4 2989 ppc_stub_plt_branch,
ad8e1ba5 2990 ppc_stub_plt_branch_r2off,
05d0e962
AM
2991 ppc_stub_plt_branch_notoc,
2992 ppc_stub_plt_branch_both,
794e51c0 2993 ppc_stub_plt_call,
7341d5e2 2994 ppc_stub_plt_call_r2save,
05d0e962
AM
2995 ppc_stub_plt_call_notoc,
2996 ppc_stub_plt_call_both,
a4b6fadd
AM
2997 ppc_stub_global_entry,
2998 ppc_stub_save_res
721956f4
AM
2999};
3000
6f20ed8a
AM
3001/* Information on stub grouping. */
3002struct map_stub
3003{
3004 /* The stub section. */
3005 asection *stub_sec;
3006 /* This is the section to which stubs in the group will be attached. */
3007 asection *link_sec;
a4b6fadd
AM
3008 /* Next group. */
3009 struct map_stub *next;
3010 /* Whether to emit a copy of register save/restore functions in this
3011 group. */
3012 int needs_save_res;
df136d64
AM
3013 /* Current offset within stubs after the insn restoring lr in a
3014 _notoc or _both stub using bcl for pc-relative addressing, or
3015 after the insn restoring lr in a __tls_get_addr_opt plt stub. */
3016 unsigned int lr_restore;
3017 /* Accumulated size of EH info emitted to describe return address
3018 if stubs modify lr. Does not include 17 byte FDE header. */
3019 unsigned int eh_size;
3020 /* Offset in glink_eh_frame to the start of EH info for this group. */
3021 unsigned int eh_base;
6f20ed8a
AM
3022};
3023
2cdcc330
AM
3024struct ppc_stub_hash_entry
3025{
721956f4
AM
3026 /* Base hash table entry structure. */
3027 struct bfd_hash_entry root;
3028
ad8e1ba5
AM
3029 enum ppc_stub_type stub_type;
3030
6f20ed8a
AM
3031 /* Group information. */
3032 struct map_stub *group;
721956f4
AM
3033
3034 /* Offset within stub_sec of the beginning of this stub. */
3035 bfd_vma stub_offset;
3036
3037 /* Given the symbol's value and its section we can determine its final
3038 value when building the stubs (so the stub knows where to jump. */
3039 bfd_vma target_value;
3040 asection *target_section;
3041
721956f4
AM
3042 /* The symbol table entry, if any, that this was derived from. */
3043 struct ppc_link_hash_entry *h;
e054468f 3044 struct plt_entry *plt_ent;
721956f4 3045
2d7ad24e
AM
3046 /* Symbol type. */
3047 unsigned char symtype;
3048
6911b7dc
AM
3049 /* Symbol st_other. */
3050 unsigned char other;
721956f4
AM
3051};
3052
2cdcc330
AM
3053struct ppc_branch_hash_entry
3054{
721956f4
AM
3055 /* Base hash table entry structure. */
3056 struct bfd_hash_entry root;
3057
c456f082 3058 /* Offset within branch lookup table. */
721956f4
AM
3059 unsigned int offset;
3060
3061 /* Generation marker. */
3062 unsigned int iter;
3063};
65f38f15 3064
19e08130
AM
3065/* Used to track dynamic relocations for local symbols. */
3066struct ppc_dyn_relocs
3067{
3068 struct ppc_dyn_relocs *next;
3069
3070 /* The input section of the reloc. */
3071 asection *sec;
3072
3073 /* Total number of relocs copied for the input section. */
3074 unsigned int count : 31;
3075
3076 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3077 unsigned int ifunc : 1;
3078};
3079
65f38f15
AM
3080struct ppc_link_hash_entry
3081{
3082 struct elf_link_hash_entry elf;
3083
2cdcc330
AM
3084 union
3085 {
b3fac117
AM
3086 /* A pointer to the most recently used stub hash entry against this
3087 symbol. */
3088 struct ppc_stub_hash_entry *stub_cache;
3089
3090 /* A pointer to the next symbol starting with a '.' */
3091 struct ppc_link_hash_entry *next_dot_sym;
3092 } u;
721956f4 3093
721956f4 3094 /* Link between function code and descriptor symbols. */
34814b9f 3095 struct ppc_link_hash_entry *oh;
721956f4 3096
e86ce104
AM
3097 /* Flag function code and descriptor symbols. */
3098 unsigned int is_func:1;
3099 unsigned int is_func_descriptor:1;
908b32fc 3100 unsigned int fake:1;
411e1bfb 3101
c5614fa4
AM
3102 /* Whether global opd/toc sym has been adjusted or not.
3103 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3104 should be set for all globals defined in any opd/toc section. */
754021d0
AM
3105 unsigned int adjust_done:1;
3106
a4b6fadd
AM
3107 /* Set if this is an out-of-line register save/restore function,
3108 with non-standard calling convention. */
3109 unsigned int save_res:1;
3110
8b5f1ed8
AM
3111 /* Set if a duplicate symbol with non-zero localentry is detected,
3112 even when the duplicate symbol does not provide a definition. */
3113 unsigned int non_zero_localentry:1;
3114
411e1bfb 3115 /* Contexts in which symbol is used in the GOT (or TOC).
37da22e5
AM
3116 Bits are or'd into the mask as the corresponding relocs are
3117 encountered during check_relocs, with TLS_TLS being set when any
3118 of the other TLS bits are set. tls_optimize clears bits when
3119 optimizing to indicate the corresponding GOT entry type is not
3120 needed. If set, TLS_TLS is never cleared. tls_optimize may also
b00a0a86 3121 set TLS_GDIE when a GD reloc turns into an IE one.
37da22e5
AM
3122 These flags are also kept for local symbols. */
3123#define TLS_TLS 1 /* Any TLS reloc. */
3124#define TLS_GD 2 /* GD reloc. */
3125#define TLS_LD 4 /* LD reloc. */
3126#define TLS_TPREL 8 /* TPREL reloc, => IE. */
3127#define TLS_DTPREL 16 /* DTPREL reloc, => LD. */
3128#define TLS_MARK 32 /* __tls_get_addr call marked. */
b00a0a86 3129#define TLS_GDIE 64 /* GOT TPREL reloc resulting from GD->IE. */
46e9995a 3130#define TLS_EXPLICIT 256 /* TOC section TLS reloc, not stored. */
f961d9dd 3131 unsigned char tls_mask;
37da22e5
AM
3132
3133 /* The above field is also used to mark function symbols. In which
3134 case TLS_TLS will be 0. */
3135#define PLT_IFUNC 2 /* STT_GNU_IFUNC. */
2d7ad24e 3136#define PLT_KEEP 4 /* inline plt call requires plt entry. */
37da22e5 3137#define NON_GOT 256 /* local symbol plt, not stored. */
65f38f15
AM
3138};
3139
ed7007c1
AM
3140static inline struct ppc_link_hash_entry *
3141ppc_elf_hash_entry (struct elf_link_hash_entry *ent)
3142{
3143 return (struct ppc_link_hash_entry *) ent;
3144}
3145
65f38f15
AM
3146/* ppc64 ELF linker hash table. */
3147
3148struct ppc_link_hash_table
3149{
3150 struct elf_link_hash_table elf;
3151
721956f4
AM
3152 /* The stub hash table. */
3153 struct bfd_hash_table stub_hash_table;
3154
3155 /* Another hash table for plt_branch stubs. */
3156 struct bfd_hash_table branch_hash_table;
3157
3b421ab3
AM
3158 /* Hash table for function prologue tocsave. */
3159 htab_t tocsave_htab;
3160
e7d1c40c
AM
3161 /* Various options and other info passed from the linker. */
3162 struct ppc64_elf_params *params;
721956f4 3163
6f20ed8a
AM
3164 /* The size of sec_info below. */
3165 unsigned int sec_info_arr_size;
3166
3167 /* Per-section array of extra section info. Done this way rather
3168 than as part of ppc64_elf_section_data so we have the info for
3169 non-ppc64 sections. */
3170 struct
3171 {
3172 /* Along with elf_gp, specifies the TOC pointer used by this section. */
ad8e1ba5 3173 bfd_vma toc_off;
6f20ed8a
AM
3174
3175 union
3176 {
3177 /* The section group that this section belongs to. */
3178 struct map_stub *group;
3179 /* A temp section list pointer. */
3180 asection *list;
3181 } u;
3182 } *sec_info;
721956f4 3183
a4b6fadd
AM
3184 /* Linked list of groups. */
3185 struct map_stub *group;
3186
ad8e1ba5
AM
3187 /* Temp used when calculating TOC pointers. */
3188 bfd_vma toc_curr;
bf102f86
AM
3189 bfd *toc_bfd;
3190 asection *toc_first_sec;
ad8e1ba5 3191
b3fac117
AM
3192 /* Used when adding symbols. */
3193 struct ppc_link_hash_entry *dot_syms;
3194
33e44f2e 3195 /* Shortcuts to get to dynamic linker sections. */
4ce794b7 3196 asection *glink;
9e390558 3197 asection *global_entry;
82bd7b59 3198 asection *sfpr;
2d7ad24e
AM
3199 asection *pltlocal;
3200 asection *relpltlocal;
4ce794b7
AM
3201 asection *brlt;
3202 asection *relbrlt;
58d180e8 3203 asection *glink_eh_frame;
ec338859 3204
8387904d
AM
3205 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3206 struct ppc_link_hash_entry *tls_get_addr;
3207 struct ppc_link_hash_entry *tls_get_addr_fd;
9e7028aa
AM
3208 struct ppc_link_hash_entry *tga_desc;
3209 struct ppc_link_hash_entry *tga_desc_fd;
a804e476 3210 struct map_stub *tga_group;
411e1bfb 3211
927be08e
AM
3212 /* The size of reliplt used by got entry relocs. */
3213 bfd_size_type got_reli_size;
3214
9b5ecbd0 3215 /* Statistics. */
7341d5e2 3216 unsigned long stub_count[ppc_stub_global_entry];
9b5ecbd0 3217
ee75fd95
AM
3218 /* Number of stubs against global syms. */
3219 unsigned long stub_globals;
3220
ee67d69a
AM
3221 /* Set if we're linking code with function descriptors. */
3222 unsigned int opd_abi:1;
3223
4c52953f 3224 /* Support for multiple toc sections. */
33c0ec9d 3225 unsigned int do_multi_toc:1;
4c52953f 3226 unsigned int multi_toc_needed:1;
927be08e 3227 unsigned int second_toc_pass:1;
67f0cbdb 3228 unsigned int do_toc_opt:1;
4c52953f 3229
9a23f96e
AM
3230 /* Set if tls optimization is enabled. */
3231 unsigned int do_tls_opt:1;
3232
3e04d765
AM
3233 /* Set if inline plt calls should be converted to direct calls. */
3234 unsigned int can_convert_all_inline_plt:1;
3235
5d1634d7 3236 /* Set on error. */
99877b66 3237 unsigned int stub_error:1;
721956f4 3238
8c5b4e52
AM
3239 /* Whether func_desc_adjust needs to be run over symbols. */
3240 unsigned int need_func_desc_adj:1;
721956f4 3241
f378ab09
AM
3242 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
3243 unsigned int has_plt_localentry0:1;
3244
5663e321
AM
3245 /* Whether calls are made via the PLT from NOTOC functions. */
3246 unsigned int notoc_plt:1;
3247
7c1f4227
AM
3248 /* Whether to use power10 instructions in linkage stubs. */
3249 unsigned int power10_stubs:1;
04bdff6a 3250
721956f4
AM
3251 /* Incremented every time we size stubs. */
3252 unsigned int stub_iteration;
5d1634d7 3253
87d72d41
AM
3254 /* Small local sym cache. */
3255 struct sym_cache sym_cache;
65f38f15
AM
3256};
3257
4c52953f
AM
3258/* Rename some of the generic section flags to better document how they
3259 are used here. */
b0dddeec
AM
3260
3261/* Nonzero if this section has TLS related relocations. */
3262#define has_tls_reloc sec_flg0
3263
9737e8af
AM
3264/* Nonzero if this section has a call to __tls_get_addr lacking marker
3265 relocations. */
3266#define nomark_tls_get_addr sec_flg1
b0dddeec
AM
3267
3268/* Nonzero if this section has any toc or got relocs. */
3269#define has_toc_reloc sec_flg2
3270
3271/* Nonzero if this section has a call to another section that uses
3272 the toc or got. */
d77c8a4b 3273#define makes_toc_func_call sec_flg3
b0dddeec
AM
3274
3275/* Recursion protection when determining above flag. */
d77c8a4b 3276#define call_check_in_progress sec_flg4
70cc837d 3277#define call_check_done sec_flg5
4c52953f 3278
65f38f15
AM
3279/* Get the ppc64 ELF linker hash table from a link_info structure. */
3280
3281#define ppc_hash_table(p) \
4dfe6ac6
NC
3282 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3283 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
65f38f15 3284
721956f4
AM
3285#define ppc_stub_hash_lookup(table, string, create, copy) \
3286 ((struct ppc_stub_hash_entry *) \
3287 bfd_hash_lookup ((table), (string), (create), (copy)))
3288
3289#define ppc_branch_hash_lookup(table, string, create, copy) \
3290 ((struct ppc_branch_hash_entry *) \
3291 bfd_hash_lookup ((table), (string), (create), (copy)))
3292
3293/* Create an entry in the stub hash table. */
3294
3295static struct bfd_hash_entry *
4ce794b7
AM
3296stub_hash_newfunc (struct bfd_hash_entry *entry,
3297 struct bfd_hash_table *table,
3298 const char *string)
721956f4
AM
3299{
3300 /* Allocate the structure if it has not already been allocated by a
3301 subclass. */
3302 if (entry == NULL)
3303 {
3304 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3305 if (entry == NULL)
3306 return entry;
3307 }
3308
3309 /* Call the allocation method of the superclass. */
3310 entry = bfd_hash_newfunc (entry, table, string);
3311 if (entry != NULL)
3312 {
3313 struct ppc_stub_hash_entry *eh;
3314
3315 /* Initialize the local fields. */
3316 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 3317 eh->stub_type = ppc_stub_none;
6f20ed8a 3318 eh->group = NULL;
721956f4
AM
3319 eh->stub_offset = 0;
3320 eh->target_value = 0;
3321 eh->target_section = NULL;
721956f4 3322 eh->h = NULL;
6911b7dc 3323 eh->plt_ent = NULL;
6911b7dc 3324 eh->other = 0;
721956f4
AM
3325 }
3326
3327 return entry;
3328}
3329
3330/* Create an entry in the branch hash table. */
3331
3332static struct bfd_hash_entry *
4ce794b7
AM
3333branch_hash_newfunc (struct bfd_hash_entry *entry,
3334 struct bfd_hash_table *table,
3335 const char *string)
721956f4
AM
3336{
3337 /* Allocate the structure if it has not already been allocated by a
3338 subclass. */
3339 if (entry == NULL)
3340 {
3341 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3342 if (entry == NULL)
3343 return entry;
3344 }
3345
3346 /* Call the allocation method of the superclass. */
3347 entry = bfd_hash_newfunc (entry, table, string);
3348 if (entry != NULL)
3349 {
3350 struct ppc_branch_hash_entry *eh;
3351
3352 /* Initialize the local fields. */
3353 eh = (struct ppc_branch_hash_entry *) entry;
3354 eh->offset = 0;
3355 eh->iter = 0;
3356 }
3357
3358 return entry;
3359}
3360
65f38f15
AM
3361/* Create an entry in a ppc64 ELF linker hash table. */
3362
3363static struct bfd_hash_entry *
4ce794b7
AM
3364link_hash_newfunc (struct bfd_hash_entry *entry,
3365 struct bfd_hash_table *table,
3366 const char *string)
65f38f15
AM
3367{
3368 /* Allocate the structure if it has not already been allocated by a
3369 subclass. */
3370 if (entry == NULL)
3371 {
3372 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3373 if (entry == NULL)
3374 return entry;
3375 }
3376
3377 /* Call the allocation method of the superclass. */
3378 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3379 if (entry != NULL)
3380 {
3381 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3382
b3fac117 3383 memset (&eh->u.stub_cache, 0,
908b32fc 3384 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
3385 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3386
3387 /* When making function calls, old ABI code references function entry
3388 points (dot symbols), while new ABI code references the function
3389 descriptor symbol. We need to make any combination of reference and
3390 definition work together, without breaking archive linking.
3391
3392 For a defined function "foo" and an undefined call to "bar":
3393 An old object defines "foo" and ".foo", references ".bar" (possibly
3394 "bar" too).
3395 A new object defines "foo" and references "bar".
3396
3397 A new object thus has no problem with its undefined symbols being
3398 satisfied by definitions in an old object. On the other hand, the
3399 old object won't have ".bar" satisfied by a new object.
3400
3401 Keep a list of newly added dot-symbols. */
3402
3403 if (string[0] == '.')
3404 {
3405 struct ppc_link_hash_table *htab;
3406
3407 htab = (struct ppc_link_hash_table *) table;
3408 eh->u.next_dot_sym = htab->dot_syms;
3409 htab->dot_syms = eh;
3410 }
65f38f15
AM
3411 }
3412
3413 return entry;
3414}
3415
2cdcc330
AM
3416struct tocsave_entry
3417{
3b421ab3
AM
3418 asection *sec;
3419 bfd_vma offset;
3420};
3421
3422static hashval_t
3423tocsave_htab_hash (const void *p)
3424{
3425 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4aef7643 3426 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
3b421ab3
AM
3427}
3428
3429static int
3430tocsave_htab_eq (const void *p1, const void *p2)
3431{
3432 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
3433 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
3434 return e1->sec == e2->sec && e1->offset == e2->offset;
3435}
3436
68faa637
AM
3437/* Destroy a ppc64 ELF linker hash table. */
3438
3439static void
d495ab0d 3440ppc64_elf_link_hash_table_free (bfd *obfd)
68faa637 3441{
d495ab0d 3442 struct ppc_link_hash_table *htab;
68faa637 3443
d495ab0d 3444 htab = (struct ppc_link_hash_table *) obfd->link.hash;
68faa637
AM
3445 if (htab->tocsave_htab)
3446 htab_delete (htab->tocsave_htab);
d495ab0d
AM
3447 bfd_hash_table_free (&htab->branch_hash_table);
3448 bfd_hash_table_free (&htab->stub_hash_table);
3449 _bfd_elf_link_hash_table_free (obfd);
68faa637
AM
3450}
3451
65f38f15
AM
3452/* Create a ppc64 ELF linker hash table. */
3453
3454static struct bfd_link_hash_table *
4ce794b7 3455ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
3456{
3457 struct ppc_link_hash_table *htab;
986f0783 3458 size_t amt = sizeof (struct ppc_link_hash_table);
65f38f15 3459
4ce794b7 3460 htab = bfd_zmalloc (amt);
65f38f15
AM
3461 if (htab == NULL)
3462 return NULL;
3463
66eb6687 3464 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
3465 sizeof (struct ppc_link_hash_entry),
3466 PPC64_ELF_DATA))
65f38f15 3467 {
e2d34d7d 3468 free (htab);
65f38f15
AM
3469 return NULL;
3470 }
3471
721956f4 3472 /* Init the stub hash table too. */
66eb6687
AM
3473 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
3474 sizeof (struct ppc_stub_hash_entry)))
2915c55b 3475 {
d495ab0d 3476 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3477 return NULL;
3478 }
721956f4
AM
3479
3480 /* And the branch hash table. */
66eb6687
AM
3481 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
3482 sizeof (struct ppc_branch_hash_entry)))
2915c55b
JK
3483 {
3484 bfd_hash_table_free (&htab->stub_hash_table);
d495ab0d 3485 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3486 return NULL;
3487 }
721956f4 3488
3b421ab3
AM
3489 htab->tocsave_htab = htab_try_create (1024,
3490 tocsave_htab_hash,
3491 tocsave_htab_eq,
3492 NULL);
3493 if (htab->tocsave_htab == NULL)
2915c55b 3494 {
d495ab0d 3495 ppc64_elf_link_hash_table_free (abfd);
2915c55b
JK
3496 return NULL;
3497 }
d495ab0d 3498 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
3b421ab3 3499
3254fd24
AM
3500 /* Initializing two fields of the union is just cosmetic. We really
3501 only care about glist, but when compiled on a 32-bit host the
3502 bfd_vma fields are larger. Setting the bfd_vma to zero makes
3503 debugger inspection of these fields look nicer. */
a6aa5195
AM
3504 htab->elf.init_got_refcount.refcount = 0;
3505 htab->elf.init_got_refcount.glist = NULL;
3506 htab->elf.init_plt_refcount.refcount = 0;
3507 htab->elf.init_plt_refcount.glist = NULL;
3508 htab->elf.init_got_offset.offset = 0;
3509 htab->elf.init_got_offset.glist = NULL;
3510 htab->elf.init_plt_offset.offset = 0;
3511 htab->elf.init_plt_offset.glist = NULL;
3254fd24 3512
65f38f15
AM
3513 return &htab->elf.root;
3514}
3515
bfeb4a28
AM
3516/* Create sections for linker generated code. */
3517
3518static bfd_boolean
3519create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3520{
3521 struct ppc_link_hash_table *htab;
3522 flagword flags;
3523
3524 htab = ppc_hash_table (info);
3525
bfeb4a28
AM
3526 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3527 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
b32547cd
AM
3528 if (htab->params->save_restore_funcs)
3529 {
3530 /* Create .sfpr for code to save and restore fp regs. */
3531 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
3532 flags);
3533 if (htab->sfpr == NULL
fd361982 3534 || !bfd_set_section_alignment (htab->sfpr, 2))
b32547cd
AM
3535 return FALSE;
3536 }
3537
3538 if (bfd_link_relocatable (info))
3539 return TRUE;
bfeb4a28
AM
3540
3541 /* Create .glink for lazy dynamic linking support. */
3542 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3543 flags);
3544 if (htab->glink == NULL
fd361982 3545 || !bfd_set_section_alignment (htab->glink, 3))
bfeb4a28
AM
3546 return FALSE;
3547
9e390558
AM
3548 /* The part of .glink used by global entry stubs, separate so that
3549 it can be aligned appropriately without affecting htab->glink. */
3550 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3551 flags);
3552 if (htab->global_entry == NULL
fd361982 3553 || !bfd_set_section_alignment (htab->global_entry, 2))
9e390558
AM
3554 return FALSE;
3555
bfeb4a28
AM
3556 if (!info->no_ld_generated_unwind_info)
3557 {
3558 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
3559 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3560 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
3561 ".eh_frame",
3562 flags);
3563 if (htab->glink_eh_frame == NULL
fd361982 3564 || !bfd_set_section_alignment (htab->glink_eh_frame, 2))
bfeb4a28
AM
3565 return FALSE;
3566 }
3567
3568 flags = SEC_ALLOC | SEC_LINKER_CREATED;
33e44f2e
AM
3569 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
3570 if (htab->elf.iplt == NULL
fd361982 3571 || !bfd_set_section_alignment (htab->elf.iplt, 3))
bfeb4a28
AM
3572 return FALSE;
3573
3574 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3575 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
33e44f2e
AM
3576 htab->elf.irelplt
3577 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
3578 if (htab->elf.irelplt == NULL
fd361982 3579 || !bfd_set_section_alignment (htab->elf.irelplt, 3))
bfeb4a28
AM
3580 return FALSE;
3581
3582 /* Create branch lookup table for plt_branch stubs. */
3583 flags = (SEC_ALLOC | SEC_LOAD
3584 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3585 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3586 flags);
3587 if (htab->brlt == NULL
fd361982 3588 || !bfd_set_section_alignment (htab->brlt, 3))
bfeb4a28
AM
3589 return FALSE;
3590
2d7ad24e
AM
3591 /* Local plt entries, put in .branch_lt but a separate section for
3592 convenience. */
3593 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3594 flags);
3595 if (htab->pltlocal == NULL
fd361982 3596 || !bfd_set_section_alignment (htab->pltlocal, 3))
2d7ad24e
AM
3597 return FALSE;
3598
0e1862bb 3599 if (!bfd_link_pic (info))
bfeb4a28
AM
3600 return TRUE;
3601
3602 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3603 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2d7ad24e
AM
3604 htab->relbrlt
3605 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
bfeb4a28 3606 if (htab->relbrlt == NULL
fd361982 3607 || !bfd_set_section_alignment (htab->relbrlt, 3))
bfeb4a28
AM
3608 return FALSE;
3609
2d7ad24e
AM
3610 htab->relpltlocal
3611 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
3612 if (htab->relpltlocal == NULL
fd361982 3613 || !bfd_set_section_alignment (htab->relpltlocal, 3))
2d7ad24e
AM
3614 return FALSE;
3615
bfeb4a28
AM
3616 return TRUE;
3617}
3618
e717da7e
AM
3619/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
3620
bfeb4a28 3621bfd_boolean
e7d1c40c
AM
3622ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
3623 struct ppc64_elf_params *params)
e717da7e
AM
3624{
3625 struct ppc_link_hash_table *htab;
3626
e7d1c40c 3627 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
e717da7e
AM
3628
3629/* Always hook our dynamic sections into the first bfd, which is the
3630 linker created stub bfd. This ensures that the GOT header is at
3631 the start of the output TOC section. */
3632 htab = ppc_hash_table (info);
e7d1c40c
AM
3633 htab->elf.dynobj = params->stub_bfd;
3634 htab->params = params;
bfeb4a28 3635
bfeb4a28 3636 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
3637}
3638
721956f4
AM
3639/* Build a name for an entry in the stub hash table. */
3640
3641static char *
4ce794b7
AM
3642ppc_stub_name (const asection *input_section,
3643 const asection *sym_sec,
3644 const struct ppc_link_hash_entry *h,
3645 const Elf_Internal_Rela *rel)
721956f4
AM
3646{
3647 char *stub_name;
bcaa2f82 3648 ssize_t len;
721956f4
AM
3649
3650 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3651 offsets from a sym as a branch target? In fact, we could
3652 probably assume the addend is always zero. */
3653 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3654
3655 if (h)
3656 {
3657 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3658 stub_name = bfd_malloc (len);
46de2a7c
AM
3659 if (stub_name == NULL)
3660 return stub_name;
3661
bcaa2f82
AM
3662 len = sprintf (stub_name, "%08x.%s+%x",
3663 input_section->id & 0xffffffff,
3664 h->elf.root.root.string,
3665 (int) rel->r_addend & 0xffffffff);
721956f4
AM
3666 }
3667 else
3668 {
ad8e1ba5 3669 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 3670 stub_name = bfd_malloc (len);
46de2a7c
AM
3671 if (stub_name == NULL)
3672 return stub_name;
3673
bcaa2f82
AM
3674 len = sprintf (stub_name, "%08x.%x:%x+%x",
3675 input_section->id & 0xffffffff,
3676 sym_sec->id & 0xffffffff,
3677 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3678 (int) rel->r_addend & 0xffffffff);
721956f4 3679 }
bcaa2f82 3680 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 3681 stub_name[len - 2] = 0;
721956f4
AM
3682 return stub_name;
3683}
3684
3685/* Look up an entry in the stub hash. Stub entries are cached because
3686 creating the stub name takes a bit of time. */
3687
3688static struct ppc_stub_hash_entry *
4ce794b7
AM
3689ppc_get_stub_entry (const asection *input_section,
3690 const asection *sym_sec,
039b3fef 3691 struct ppc_link_hash_entry *h,
4ce794b7
AM
3692 const Elf_Internal_Rela *rel,
3693 struct ppc_link_hash_table *htab)
721956f4
AM
3694{
3695 struct ppc_stub_hash_entry *stub_entry;
6f20ed8a 3696 struct map_stub *group;
721956f4
AM
3697
3698 /* If this input section is part of a group of sections sharing one
3699 stub section, then use the id of the first section in the group.
3700 Stub names need to include a section id, as there may well be
3701 more than one stub used to reach say, printf, and we need to
3702 distinguish between them. */
6f20ed8a 3703 group = htab->sec_info[input_section->id].u.group;
89d77b8a
AM
3704 if (group == NULL)
3705 return NULL;
721956f4 3706
b3fac117
AM
3707 if (h != NULL && h->u.stub_cache != NULL
3708 && h->u.stub_cache->h == h
6f20ed8a 3709 && h->u.stub_cache->group == group)
721956f4 3710 {
b3fac117 3711 stub_entry = h->u.stub_cache;
721956f4
AM
3712 }
3713 else
3714 {
3715 char *stub_name;
3716
6f20ed8a 3717 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
721956f4
AM
3718 if (stub_name == NULL)
3719 return NULL;
3720
3721 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 3722 stub_name, FALSE, FALSE);
721956f4 3723 if (h != NULL)
b3fac117 3724 h->u.stub_cache = stub_entry;
721956f4
AM
3725
3726 free (stub_name);
3727 }
3728
3729 return stub_entry;
3730}
3731
3732/* Add a new stub entry to the stub hash. Not all fields of the new
3733 stub entry are initialised. */
3734
3735static struct ppc_stub_hash_entry *
4ce794b7
AM
3736ppc_add_stub (const char *stub_name,
3737 asection *section,
25f53a85 3738 struct bfd_link_info *info)
721956f4 3739{
25f53a85 3740 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 3741 struct map_stub *group;
721956f4
AM
3742 asection *link_sec;
3743 asection *stub_sec;
3744 struct ppc_stub_hash_entry *stub_entry;
3745
6f20ed8a
AM
3746 group = htab->sec_info[section->id].u.group;
3747 link_sec = group->link_sec;
3748 stub_sec = group->stub_sec;
721956f4
AM
3749 if (stub_sec == NULL)
3750 {
6f20ed8a
AM
3751 size_t namelen;
3752 bfd_size_type len;
3753 char *s_name;
721956f4 3754
6f20ed8a
AM
3755 namelen = strlen (link_sec->name);
3756 len = namelen + sizeof (STUB_SUFFIX);
3757 s_name = bfd_alloc (htab->params->stub_bfd, len);
3758 if (s_name == NULL)
3759 return NULL;
721956f4 3760
6f20ed8a
AM
3761 memcpy (s_name, link_sec->name, namelen);
3762 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3763 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
3764 if (stub_sec == NULL)
3765 return NULL;
3766 group->stub_sec = stub_sec;
721956f4
AM
3767 }
3768
3769 /* Enter this entry into the linker stub hash table. */
3770 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 3771 TRUE, FALSE);
721956f4
AM
3772 if (stub_entry == NULL)
3773 {
695344c0 3774 /* xgettext:c-format */
cf97bcb0
AM
3775 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
3776 section->owner, stub_name);
721956f4
AM
3777 return NULL;
3778 }
3779
6f20ed8a 3780 stub_entry->group = group;
721956f4 3781 stub_entry->stub_offset = 0;
721956f4
AM
3782 return stub_entry;
3783}
3784
e717da7e
AM
3785/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3786 not already done. */
65f38f15 3787
b34976b6 3788static bfd_boolean
e717da7e 3789create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 3790{
e717da7e
AM
3791 asection *got, *relgot;
3792 flagword flags;
3793 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 3794
0c8d6e5c 3795 if (!is_ppc64_elf (abfd))
0ffa91dd 3796 return FALSE;
4dfe6ac6
NC
3797 if (htab == NULL)
3798 return FALSE;
0ffa91dd 3799
33e44f2e
AM
3800 if (!htab->elf.sgot
3801 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
3802 return FALSE;
e717da7e
AM
3803
3804 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3805 | SEC_LINKER_CREATED);
3806
c456f082 3807 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 3808 if (!got
fd361982 3809 || !bfd_set_section_alignment (got, 3))
e717da7e 3810 return FALSE;
65f38f15 3811
c456f082
AM
3812 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
3813 flags | SEC_READONLY);
e717da7e 3814 if (!relgot
fd361982 3815 || !bfd_set_section_alignment (relgot, 3))
b34976b6 3816 return FALSE;
e717da7e
AM
3817
3818 ppc64_elf_tdata (abfd)->got = got;
3819 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 3820 return TRUE;
65f38f15 3821}
5bd4f169 3822
b31867b6
AM
3823/* Follow indirect and warning symbol links. */
3824
3825static inline struct bfd_link_hash_entry *
3826follow_link (struct bfd_link_hash_entry *h)
3827{
3828 while (h->type == bfd_link_hash_indirect
3829 || h->type == bfd_link_hash_warning)
3830 h = h->u.i.link;
3831 return h;
3832}
3833
3834static inline struct elf_link_hash_entry *
3835elf_follow_link (struct elf_link_hash_entry *h)
3836{
3837 return (struct elf_link_hash_entry *) follow_link (&h->root);
3838}
3839
3840static inline struct ppc_link_hash_entry *
3841ppc_follow_link (struct ppc_link_hash_entry *h)
3842{
ed7007c1 3843 return ppc_elf_hash_entry (elf_follow_link (&h->elf));
b31867b6
AM
3844}
3845
40d16e0b
AM
3846/* Merge PLT info on FROM with that on TO. */
3847
3848static void
3849move_plt_plist (struct ppc_link_hash_entry *from,
3850 struct ppc_link_hash_entry *to)
3851{
3852 if (from->elf.plt.plist != NULL)
3853 {
3854 if (to->elf.plt.plist != NULL)
3855 {
3856 struct plt_entry **entp;
3857 struct plt_entry *ent;
3858
3859 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
3860 {
3861 struct plt_entry *dent;
3862
3863 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
3864 if (dent->addend == ent->addend)
3865 {
3866 dent->plt.refcount += ent->plt.refcount;
3867 *entp = ent->next;
3868 break;
3869 }
3870 if (dent == NULL)
3871 entp = &ent->next;
3872 }
3873 *entp = to->elf.plt.plist;
3874 }
3875
3876 to->elf.plt.plist = from->elf.plt.plist;
3877 from->elf.plt.plist = NULL;
3878 }
3879}
3880
65f38f15
AM
3881/* Copy the extra info we tack onto an elf_link_hash_entry. */
3882
3883static void
fcfa13d2
AM
3884ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
3885 struct elf_link_hash_entry *dir,
3886 struct elf_link_hash_entry *ind)
65f38f15
AM
3887{
3888 struct ppc_link_hash_entry *edir, *eind;
3889
ed7007c1
AM
3890 edir = ppc_elf_hash_entry (dir);
3891 eind = ppc_elf_hash_entry (ind);
65f38f15 3892
c79d6685
AM
3893 edir->is_func |= eind->is_func;
3894 edir->is_func_descriptor |= eind->is_func_descriptor;
3895 edir->tls_mask |= eind->tls_mask;
3896 if (eind->oh != NULL)
3897 edir->oh = ppc_follow_link (eind->oh);
3898
474436e6 3899 if (edir->elf.versioned != versioned_hidden)
e81830c5
AM
3900 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
3901 edir->elf.ref_regular |= eind->elf.ref_regular;
3902 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4a7e5234 3903 edir->elf.non_got_ref |= eind->elf.non_got_ref;
e81830c5
AM
3904 edir->elf.needs_plt |= eind->elf.needs_plt;
3905 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
c79d6685 3906
d311bc8b
AM
3907 /* If we were called to copy over info for a weak sym, don't copy
3908 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
3909 in order to simplify readonly_dynrelocs and save a field in the
3910 symbol hash entry, but that means dyn_relocs can't be used in any
3911 tests about a specific symbol, or affect other symbol flags which
ab2477e1 3912 are then tested. */
d311bc8b 3913 if (eind->elf.root.type != bfd_link_hash_indirect)
ab2477e1 3914 return;
d311bc8b 3915
411e1bfb 3916 /* Copy over any dynamic relocs we may have on the indirect sym. */
190eb1dd 3917 if (ind->dyn_relocs != NULL)
65f38f15 3918 {
190eb1dd 3919 if (dir->dyn_relocs != NULL)
bbd7ec4a 3920 {
6061a67d
AM
3921 struct elf_dyn_relocs **pp;
3922 struct elf_dyn_relocs *p;
bbd7ec4a 3923
fcfa13d2 3924 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a 3925 list. Merge any entries against the same section. */
190eb1dd 3926 for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
bbd7ec4a 3927 {
6061a67d 3928 struct elf_dyn_relocs *q;
bbd7ec4a 3929
190eb1dd 3930 for (q = dir->dyn_relocs; q != NULL; q = q->next)
bbd7ec4a
AM
3931 if (q->sec == p->sec)
3932 {
3933 q->pc_count += p->pc_count;
3934 q->count += p->count;
3935 *pp = p->next;
3936 break;
3937 }
3938 if (q == NULL)
3939 pp = &p->next;
3940 }
190eb1dd 3941 *pp = dir->dyn_relocs;
bbd7ec4a
AM
3942 }
3943
190eb1dd
L
3944 dir->dyn_relocs = ind->dyn_relocs;
3945 ind->dyn_relocs = NULL;
65f38f15 3946 }
65f38f15 3947
81848ca0
AM
3948 /* Copy over got entries that we may have already seen to the
3949 symbol which just became indirect. */
411e1bfb
AM
3950 if (eind->elf.got.glist != NULL)
3951 {
3952 if (edir->elf.got.glist != NULL)
3953 {
3954 struct got_entry **entp;
3955 struct got_entry *ent;
3956
3957 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3958 {
3959 struct got_entry *dent;
3960
3961 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3962 if (dent->addend == ent->addend
e717da7e 3963 && dent->owner == ent->owner
411e1bfb
AM
3964 && dent->tls_type == ent->tls_type)
3965 {
3966 dent->got.refcount += ent->got.refcount;
3967 *entp = ent->next;
3968 break;
3969 }
3970 if (dent == NULL)
3971 entp = &ent->next;
3972 }
3973 *entp = edir->elf.got.glist;
3974 }
3975
3976 edir->elf.got.glist = eind->elf.got.glist;
3977 eind->elf.got.glist = NULL;
3978 }
3979
3980 /* And plt entries. */
40d16e0b 3981 move_plt_plist (eind, edir);
411e1bfb 3982
fcfa13d2 3983 if (eind->elf.dynindx != -1)
411e1bfb 3984 {
fcfa13d2
AM
3985 if (edir->elf.dynindx != -1)
3986 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3987 edir->elf.dynstr_index);
411e1bfb
AM
3988 edir->elf.dynindx = eind->elf.dynindx;
3989 edir->elf.dynstr_index = eind->elf.dynstr_index;
3990 eind->elf.dynindx = -1;
3991 eind->elf.dynstr_index = 0;
3992 }
411e1bfb
AM
3993}
3994
8387904d
AM
3995/* Find the function descriptor hash entry from the given function code
3996 hash entry FH. Link the entries via their OH fields. */
3997
3998static struct ppc_link_hash_entry *
b31867b6 3999lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
4000{
4001 struct ppc_link_hash_entry *fdh = fh->oh;
4002
4003 if (fdh == NULL)
4004 {
4005 const char *fd_name = fh->elf.root.root.string + 1;
4006
ed7007c1
AM
4007 fdh = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, fd_name,
4008 FALSE, FALSE, FALSE));
b31867b6
AM
4009 if (fdh == NULL)
4010 return fdh;
4011
4012 fdh->is_func_descriptor = 1;
4013 fdh->oh = fh;
4014 fh->is_func = 1;
4015 fh->oh = fdh;
8387904d
AM
4016 }
4017
8c5b4e52
AM
4018 fdh = ppc_follow_link (fdh);
4019 fdh->is_func_descriptor = 1;
4020 fdh->oh = fh;
4021 return fdh;
8387904d
AM
4022}
4023
8c5b4e52 4024/* Make a fake function descriptor sym for the undefined code sym FH. */
bb700d78
AM
4025
4026static struct ppc_link_hash_entry *
4027make_fdh (struct bfd_link_info *info,
908b32fc 4028 struct ppc_link_hash_entry *fh)
bb700d78 4029{
8c5b4e52
AM
4030 bfd *abfd = fh->elf.root.u.undef.abfd;
4031 struct bfd_link_hash_entry *bh = NULL;
bb700d78 4032 struct ppc_link_hash_entry *fdh;
8c5b4e52
AM
4033 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4034 ? BSF_WEAK
4035 : BSF_GLOBAL);
4036
4037 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4038 fh->elf.root.root.string + 1,
4039 flags, bfd_und_section_ptr, 0,
4040 NULL, FALSE, FALSE, &bh))
bb700d78
AM
4041 return NULL;
4042
4043 fdh = (struct ppc_link_hash_entry *) bh;
4044 fdh->elf.non_elf = 0;
908b32fc
AM
4045 fdh->fake = 1;
4046 fdh->is_func_descriptor = 1;
4047 fdh->oh = fh;
4048 fh->is_func = 1;
4049 fh->oh = fdh;
bb700d78
AM
4050 return fdh;
4051}
4052
8387904d
AM
4053/* Fix function descriptor symbols defined in .opd sections to be
4054 function type. */
555cd476
AM
4055
4056static bfd_boolean
c16153ae 4057ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 4058 struct bfd_link_info *info,
555cd476 4059 Elf_Internal_Sym *isym,
6911b7dc 4060 const char **name,
555cd476
AM
4061 flagword *flags ATTRIBUTE_UNUSED,
4062 asection **sec,
b53dfeb2 4063 bfd_vma *value)
555cd476 4064{
b53dfeb2 4065 if (*sec != NULL
f1885d1e 4066 && strcmp ((*sec)->name, ".opd") == 0)
b53dfeb2
AM
4067 {
4068 asection *code_sec;
4069
4070 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4071 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4072 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4073
4074 /* If the symbol is a function defined in .opd, and the function
4075 code is in a discarded group, let it appear to be undefined. */
0e1862bb 4076 if (!bfd_link_relocatable (info)
b53dfeb2
AM
4077 && (*sec)->reloc_count != 0
4078 && opd_entry_value (*sec, *value, &code_sec, NULL,
4079 FALSE) != (bfd_vma) -1
4080 && discarded_section (code_sec))
4081 {
4082 *sec = bfd_und_section_ptr;
4083 isym->st_shndx = SHN_UNDEF;
4084 }
4085 }
dbd1e97e
AM
4086 else if (*sec != NULL
4087 && strcmp ((*sec)->name, ".toc") == 0
4088 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4089 {
4090 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4091 if (htab != NULL)
4092 htab->params->object_in_toc = 1;
4093 }
433817dd 4094
6911b7dc
AM
4095 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4096 {
4097 if (abiversion (ibfd) == 0)
4098 set_abiversion (ibfd, 2);
4099 else if (abiversion (ibfd) == 1)
4100 {
cf97bcb0
AM
4101 _bfd_error_handler (_("symbol '%s' has invalid st_other"
4102 " for ABI version 1"), *name);
6911b7dc
AM
4103 bfd_set_error (bfd_error_bad_value);
4104 return FALSE;
4105 }
4106 }
4107
555cd476
AM
4108 return TRUE;
4109}
4110
6911b7dc
AM
4111/* Merge non-visibility st_other attributes: local entry point. */
4112
4113static void
4114ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4115 const Elf_Internal_Sym *isym,
4116 bfd_boolean definition,
4117 bfd_boolean dynamic)
4118{
f378ab09 4119 if (definition && (!dynamic || !h->def_regular))
6911b7dc
AM
4120 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4121 | ELF_ST_VISIBILITY (h->other));
4122}
4123
8c5b4e52
AM
4124/* Hook called on merging a symbol. We use this to clear "fake" since
4125 we now have a real symbol. */
4126
4127static bfd_boolean
4128ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
8b5f1ed8 4129 const Elf_Internal_Sym *isym,
8c5b4e52
AM
4130 asection **psec ATTRIBUTE_UNUSED,
4131 bfd_boolean newdef ATTRIBUTE_UNUSED,
4132 bfd_boolean olddef ATTRIBUTE_UNUSED,
4133 bfd *oldbfd ATTRIBUTE_UNUSED,
4134 const asection *oldsec ATTRIBUTE_UNUSED)
4135{
ed7007c1 4136 ppc_elf_hash_entry (h)->fake = 0;
8b5f1ed8 4137 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
ed7007c1 4138 ppc_elf_hash_entry (h)->non_zero_localentry = 1;
8c5b4e52
AM
4139 return TRUE;
4140}
4141
8387904d 4142/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
4143 inclusion of a new ABI object archive that defines "bar".
4144 NAME is a symbol defined in an archive. Return a symbol in the hash
4145 table that might be satisfied by the archive symbols. */
8387904d
AM
4146
4147static struct elf_link_hash_entry *
4148ppc64_elf_archive_symbol_lookup (bfd *abfd,
4149 struct bfd_link_info *info,
4150 const char *name)
4151{
4152 struct elf_link_hash_entry *h;
4153 char *dot_name;
4154 size_t len;
4155
4156 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
4157 if (h != NULL
4158 /* Don't return this sym if it is a fake function descriptor
4159 created by add_symbol_adjust. */
ed7007c1 4160 && !ppc_elf_hash_entry (h)->fake)
8387904d
AM
4161 return h;
4162
4163 if (name[0] == '.')
4164 return h;
4165
4166 len = strlen (name);
4167 dot_name = bfd_alloc (abfd, len + 2);
4168 if (dot_name == NULL)
e99955cd 4169 return (struct elf_link_hash_entry *) -1;
8387904d
AM
4170 dot_name[0] = '.';
4171 memcpy (dot_name + 1, name, len + 1);
4172 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4173 bfd_release (abfd, dot_name);
a804e476
AM
4174 if (h != NULL)
4175 return h;
4176
4177 if (strcmp (name, "__tls_get_addr_opt") == 0)
4178 h = _bfd_elf_archive_symbol_lookup (abfd, info, "__tls_get_addr_desc");
8387904d
AM
4179 return h;
4180}
4181
4182/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
4183 new ABI object defines "bar". Well, at least, undefined dot symbols
4184 are made weak. This stops later archive searches from including an
4185 object if we already have a function descriptor definition. It also
35b0ce59
AM
4186 prevents the linker complaining about undefined symbols.
4187 We also check and correct mismatched symbol visibility here. The
4188 most restrictive visibility of the function descriptor and the
4189 function entry symbol is used. */
8387904d
AM
4190
4191static bfd_boolean
b3fac117 4192add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 4193{
8387904d
AM
4194 struct ppc_link_hash_table *htab;
4195 struct ppc_link_hash_entry *fdh;
4196
b3fac117
AM
4197 if (eh->elf.root.type == bfd_link_hash_warning)
4198 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 4199
8400d40d
AM
4200 if (eh->elf.root.type == bfd_link_hash_indirect)
4201 return TRUE;
4202
b3fac117
AM
4203 if (eh->elf.root.root.string[0] != '.')
4204 abort ();
8387904d 4205
b3fac117 4206 htab = ppc_hash_table (info);
4dfe6ac6
NC
4207 if (htab == NULL)
4208 return FALSE;
4209
b31867b6 4210 fdh = lookup_fdh (eh, htab);
8c5b4e52
AM
4211 if (fdh == NULL
4212 && !bfd_link_relocatable (info)
4213 && (eh->elf.root.type == bfd_link_hash_undefined
4214 || eh->elf.root.type == bfd_link_hash_undefweak)
4215 && eh->elf.ref_regular)
4216 {
4217 /* Make an undefined function descriptor sym, in order to
4218 pull in an --as-needed shared lib. Archives are handled
4219 elsewhere. */
4220 fdh = make_fdh (info, eh);
4221 if (fdh == NULL)
4222 return FALSE;
bb700d78 4223 }
8c5b4e52
AM
4224
4225 if (fdh != NULL)
8387904d 4226 {
35b0ce59
AM
4227 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4228 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
8c5b4e52
AM
4229
4230 /* Make both descriptor and entry symbol have the most
4231 constraining visibility of either symbol. */
35b0ce59
AM
4232 if (entry_vis < descr_vis)
4233 fdh->elf.other += entry_vis - descr_vis;
4234 else if (entry_vis > descr_vis)
4235 eh->elf.other += descr_vis - entry_vis;
4236
8c5b4e52
AM
4237 /* Propagate reference flags from entry symbol to function
4238 descriptor symbol. */
bc4e12de 4239 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
4070765b 4240 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
8c5b4e52
AM
4241 fdh->elf.ref_regular |= eh->elf.ref_regular;
4242 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
4243
4244 if (!fdh->elf.forced_local
4245 && fdh->elf.dynindx == -1
4246 && fdh->elf.versioned != versioned_hidden
4247 && (bfd_link_dll (info)
4248 || fdh->elf.def_dynamic
4249 || fdh->elf.ref_dynamic)
4250 && (eh->elf.ref_regular
4251 || eh->elf.def_regular))
4252 {
2cdcc330 4253 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
8c5b4e52 4254 return FALSE;
35b0ce59 4255 }
8387904d 4256 }
99877b66 4257
8387904d
AM
4258 return TRUE;
4259}
4260
f6c7c3e8
AM
4261/* Set up opd section info and abiversion for IBFD, and process list
4262 of dot-symbols we made in link_hash_newfunc. */
b3fac117 4263
8387904d 4264static bfd_boolean
f6c7c3e8 4265ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
8387904d 4266{
99877b66 4267 struct ppc_link_hash_table *htab;
b3fac117 4268 struct ppc_link_hash_entry **p, *eh;
459609d6 4269 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
433817dd 4270
459609d6 4271 if (opd != NULL && opd->size != 0)
b3fac117 4272 {
b9399fcf
AM
4273 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
4274 ppc64_elf_section_data (opd)->sec_type = sec_opd;
4275
459609d6
AM
4276 if (abiversion (ibfd) == 0)
4277 set_abiversion (ibfd, 1);
8a2058b5 4278 else if (abiversion (ibfd) >= 2)
f6c7c3e8 4279 {
695344c0 4280 /* xgettext:c-format */
cf97bcb0
AM
4281 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"),
4282 ibfd, abiversion (ibfd));
459609d6
AM
4283 bfd_set_error (bfd_error_bad_value);
4284 return FALSE;
f6c7c3e8 4285 }
b9399fcf 4286 }
f6c7c3e8 4287
b9399fcf
AM
4288 if (is_ppc64_elf (info->output_bfd))
4289 {
4290 /* For input files without an explicit abiversion in e_flags
4291 we should have flagged any with symbol st_other bits set
4292 as ELFv1 and above flagged those with .opd as ELFv2.
4293 Set the output abiversion if not yet set, and for any input
4294 still ambiguous, take its abiversion from the output.
4295 Differences in ABI are reported later. */
4296 if (abiversion (info->output_bfd) == 0)
4297 set_abiversion (info->output_bfd, abiversion (ibfd));
4298 else if (abiversion (ibfd) == 0)
4299 set_abiversion (ibfd, abiversion (info->output_bfd));
b3fac117
AM
4300 }
4301
459609d6
AM
4302 htab = ppc_hash_table (info);
4303 if (htab == NULL)
b9399fcf 4304 return TRUE;
459609d6 4305
b9399fcf
AM
4306 if (opd != NULL && opd->size != 0
4307 && (ibfd->flags & DYNAMIC) == 0
4308 && (opd->flags & SEC_RELOC) != 0
4309 && opd->reloc_count != 0
4310 && !bfd_is_abs_section (opd->output_section)
4311 && info->gc_sections)
4312 {
4313 /* Garbage collection needs some extra help with .opd sections.
4314 We don't want to necessarily keep everything referenced by
4315 relocs in .opd, as that would keep all functions. Instead,
4316 if we reference an .opd symbol (a function descriptor), we
4317 want to keep the function code symbol's section. This is
4318 easy for global symbols, but for local syms we need to keep
4319 information about the associated function section. */
4320 bfd_size_type amt;
4321 asection **opd_sym_map;
4322 Elf_Internal_Shdr *symtab_hdr;
4323 Elf_Internal_Rela *relocs, *rel_end, *rel;
4324
4325 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
4326 opd_sym_map = bfd_zalloc (ibfd, amt);
4327 if (opd_sym_map == NULL)
4328 return FALSE;
4329 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
4330 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
4331 info->keep_memory);
4332 if (relocs == NULL)
4333 return FALSE;
4334 symtab_hdr = &elf_symtab_hdr (ibfd);
4335 rel_end = relocs + opd->reloc_count - 1;
4336 for (rel = relocs; rel < rel_end; rel++)
4337 {
4338 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
4339 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
4340
4341 if (r_type == R_PPC64_ADDR64
4342 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
4343 && r_symndx < symtab_hdr->sh_info)
4344 {
4345 Elf_Internal_Sym *isym;
4346 asection *s;
4347
4348 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
4349 if (isym == NULL)
4350 {
4351 if (elf_section_data (opd)->relocs != relocs)
4352 free (relocs);
4353 return FALSE;
4354 }
4355
4356 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
4357 if (s != NULL && s != opd)
4358 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
4359 }
4360 }
4361 if (elf_section_data (opd)->relocs != relocs)
4362 free (relocs);
4363 }
459609d6
AM
4364
4365 p = &htab->dot_syms;
4366 while ((eh = *p) != NULL)
4367 {
4368 *p = NULL;
4369 if (&eh->elf == htab->elf.hgot)
4370 ;
4371 else if (htab->elf.hgot == NULL
4372 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4373 htab->elf.hgot = &eh->elf;
8c5b4e52
AM
4374 else if (abiversion (ibfd) <= 1)
4375 {
4376 htab->need_func_desc_adj = 1;
4377 if (!add_symbol_adjust (eh, info))
4378 return FALSE;
4379 }
459609d6
AM
4380 p = &eh->u.next_dot_sym;
4381 }
b3fac117 4382 return TRUE;
8387904d
AM
4383}
4384
97fed1c9
JJ
4385/* Undo hash table changes when an --as-needed input file is determined
4386 not to be needed. */
4387
4388static bfd_boolean
e5034e59
AM
4389ppc64_elf_notice_as_needed (bfd *ibfd,
4390 struct bfd_link_info *info,
4391 enum notice_asneeded_action act)
97fed1c9 4392{
e5034e59
AM
4393 if (act == notice_not_needed)
4394 {
4395 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 4396
e5034e59
AM
4397 if (htab == NULL)
4398 return FALSE;
4dfe6ac6 4399
e5034e59
AM
4400 htab->dot_syms = NULL;
4401 }
4402 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
4403}
4404
aa374f67
AM
4405/* If --just-symbols against a final linked binary, then assume we need
4406 toc adjusting stubs when calling functions defined there. */
4407
4408static void
4409ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4410{
4411 if ((sec->flags & SEC_CODE) != 0
4412 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4413 && is_ppc64_elf (sec->owner))
4414 {
2c3f079f
AM
4415 if (abiversion (sec->owner) >= 2
4416 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
aa374f67
AM
4417 sec->has_toc_reloc = 1;
4418 }
4419 _bfd_elf_link_just_syms (sec, info);
4420}
4421
e054468f 4422static struct plt_entry **
4ce794b7
AM
4423update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4424 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
4425{
4426 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 4427 struct plt_entry **local_plt;
f961d9dd 4428 unsigned char *local_got_tls_masks;
411e1bfb
AM
4429
4430 if (local_got_ents == NULL)
4431 {
4432 bfd_size_type size = symtab_hdr->sh_info;
4433
e054468f
AM
4434 size *= (sizeof (*local_got_ents)
4435 + sizeof (*local_plt)
4436 + sizeof (*local_got_tls_masks));
4ce794b7 4437 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 4438 if (local_got_ents == NULL)
e054468f 4439 return NULL;
411e1bfb
AM
4440 elf_local_got_ents (abfd) = local_got_ents;
4441 }
4442
37da22e5 4443 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0)
411e1bfb
AM
4444 {
4445 struct got_entry *ent;
4446
4447 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
4448 if (ent->addend == r_addend
4449 && ent->owner == abfd
4450 && ent->tls_type == tls_type)
411e1bfb
AM
4451 break;
4452 if (ent == NULL)
4453 {
986f0783 4454 size_t amt = sizeof (*ent);
4ce794b7 4455 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4456 if (ent == NULL)
4457 return FALSE;
4458 ent->next = local_got_ents[r_symndx];
4459 ent->addend = r_addend;
e717da7e 4460 ent->owner = abfd;
411e1bfb 4461 ent->tls_type = tls_type;
927be08e 4462 ent->is_indirect = FALSE;
411e1bfb
AM
4463 ent->got.refcount = 0;
4464 local_got_ents[r_symndx] = ent;
4465 }
4466 ent->got.refcount += 1;
4467 }
4468
e054468f 4469 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 4470 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
37da22e5 4471 local_got_tls_masks[r_symndx] |= tls_type & 0xff;
e054468f
AM
4472
4473 return local_plt + r_symndx;
65f38f15
AM
4474}
4475
411e1bfb 4476static bfd_boolean
e054468f 4477update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 4478{
411e1bfb 4479 struct plt_entry *ent;
1e2f5b6e 4480
e054468f 4481 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
4482 if (ent->addend == addend)
4483 break;
4484 if (ent == NULL)
1e2f5b6e 4485 {
986f0783 4486 size_t amt = sizeof (*ent);
4ce794b7 4487 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4488 if (ent == NULL)
4489 return FALSE;
e054468f 4490 ent->next = *plist;
411e1bfb
AM
4491 ent->addend = addend;
4492 ent->plt.refcount = 0;
e054468f 4493 *plist = ent;
1e2f5b6e 4494 }
411e1bfb 4495 ent->plt.refcount += 1;
b34976b6 4496 return TRUE;
1e2f5b6e
AM
4497}
4498
e054468f
AM
4499static bfd_boolean
4500is_branch_reloc (enum elf_ppc64_reloc_type r_type)
4501{
4502 return (r_type == R_PPC64_REL24
05d0e962 4503 || r_type == R_PPC64_REL24_NOTOC
e054468f
AM
4504 || r_type == R_PPC64_REL14
4505 || r_type == R_PPC64_REL14_BRTAKEN
4506 || r_type == R_PPC64_REL14_BRNTAKEN
4507 || r_type == R_PPC64_ADDR24
4508 || r_type == R_PPC64_ADDR14
4509 || r_type == R_PPC64_ADDR14_BRTAKEN
23cedd1d 4510 || r_type == R_PPC64_ADDR14_BRNTAKEN
5663e321
AM
4511 || r_type == R_PPC64_PLTCALL
4512 || r_type == R_PPC64_PLTCALL_NOTOC);
23cedd1d
AM
4513}
4514
4515/* Relocs on inline plt call sequence insns prior to the call. */
4516
4517static bfd_boolean
4518is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type)
4519{
4520 return (r_type == R_PPC64_PLT16_HA
4521 || r_type == R_PPC64_PLT16_HI
4522 || r_type == R_PPC64_PLT16_LO
4523 || r_type == R_PPC64_PLT16_LO_DS
5663e321
AM
4524 || r_type == R_PPC64_PLT_PCREL34
4525 || r_type == R_PPC64_PLT_PCREL34_NOTOC
4526 || r_type == R_PPC64_PLTSEQ
4527 || r_type == R_PPC64_PLTSEQ_NOTOC);
e054468f
AM
4528}
4529
5bd4f169 4530/* Look through the relocs for a section during the first phase, and
65f38f15 4531 calculate needed space in the global offset table, procedure
5d1634d7 4532 linkage table, and dynamic reloc sections. */
5bd4f169 4533
b34976b6 4534static bfd_boolean
4ce794b7
AM
4535ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4536 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 4537{
65f38f15 4538 struct ppc_link_hash_table *htab;
5bd4f169 4539 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 4540 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
4541 const Elf_Internal_Rela *rel;
4542 const Elf_Internal_Rela *rel_end;
5bd4f169 4543 asection *sreloc;
3a71aa26 4544 struct elf_link_hash_entry *tga, *dottga;
b9399fcf 4545 bfd_boolean is_opd;
5bd4f169 4546
0e1862bb 4547 if (bfd_link_relocatable (info))
b34976b6 4548 return TRUE;
5bd4f169 4549
0c8d6e5c 4550 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 4551
65f38f15 4552 htab = ppc_hash_table (info);
4dfe6ac6
NC
4553 if (htab == NULL)
4554 return FALSE;
4555
3a71aa26
AM
4556 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4557 FALSE, FALSE, TRUE);
4558 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
4559 FALSE, FALSE, TRUE);
0ffa91dd 4560 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 4561 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 4562 sreloc = NULL;
b9399fcf 4563 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5bd4f169
AM
4564 rel_end = relocs + sec->reloc_count;
4565 for (rel = relocs; rel < rel_end; rel++)
4566 {
4567 unsigned long r_symndx;
4568 struct elf_link_hash_entry *h;
04c9666a 4569 enum elf_ppc64_reloc_type r_type;
727fc41e 4570 int tls_type;
7c8fe5c4 4571 struct _ppc64_elf_section_data *ppc64_sec;
cbf95972 4572 struct plt_entry **ifunc, **plt_list;
5bd4f169
AM
4573
4574 r_symndx = ELF64_R_SYM (rel->r_info);
4575 if (r_symndx < symtab_hdr->sh_info)
4576 h = NULL;
4577 else
973a3492
L
4578 {
4579 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 4580 h = elf_follow_link (h);
1c865ab2
AM
4581
4582 if (h == htab->elf.hgot)
4583 sec->has_toc_reloc = 1;
973a3492 4584 }
5bd4f169 4585
5663e321
AM
4586 r_type = ELF64_R_TYPE (rel->r_info);
4587 switch (r_type)
4588 {
04bdff6a
AM
4589 case R_PPC64_D34:
4590 case R_PPC64_D34_LO:
4591 case R_PPC64_D34_HI30:
4592 case R_PPC64_D34_HA30:
4593 case R_PPC64_D28:
c213164a
AM
4594 case R_PPC64_TPREL34:
4595 case R_PPC64_DTPREL34:
04bdff6a 4596 case R_PPC64_PCREL34:
5663e321 4597 case R_PPC64_GOT_PCREL34:
87c69f97
AM
4598 case R_PPC64_GOT_TLSGD_PCREL34:
4599 case R_PPC64_GOT_TLSLD_PCREL34:
4600 case R_PPC64_GOT_TPREL_PCREL34:
4601 case R_PPC64_GOT_DTPREL_PCREL34:
5663e321
AM
4602 case R_PPC64_PLT_PCREL34:
4603 case R_PPC64_PLT_PCREL34_NOTOC:
04bdff6a 4604 case R_PPC64_PCREL28:
7c1f4227 4605 htab->power10_stubs = 1;
133a1f60
AM
4606 break;
4607 default:
5663e321
AM
4608 break;
4609 }
903b777d
AM
4610
4611 switch (r_type)
4612 {
4613 case R_PPC64_PLT16_HA:
4614 case R_PPC64_GOT_TLSLD16_HA:
4615 case R_PPC64_GOT_TLSGD16_HA:
4616 case R_PPC64_GOT_TPREL16_HA:
4617 case R_PPC64_GOT_DTPREL16_HA:
4618 case R_PPC64_GOT16_HA:
4619 case R_PPC64_TOC16_HA:
4620 case R_PPC64_PLT16_LO:
4621 case R_PPC64_PLT16_LO_DS:
4622 case R_PPC64_GOT_TLSLD16_LO:
4623 case R_PPC64_GOT_TLSGD16_LO:
4624 case R_PPC64_GOT_TPREL16_LO_DS:
4625 case R_PPC64_GOT_DTPREL16_LO_DS:
4626 case R_PPC64_GOT16_LO:
4627 case R_PPC64_GOT16_LO_DS:
4628 case R_PPC64_TOC16_LO:
4629 case R_PPC64_TOC16_LO_DS:
4630 case R_PPC64_GOT_PCREL34:
4631 ppc64_elf_tdata (abfd)->has_optrel = 1;
4632 ppc64_elf_section_data (sec)->has_optrel = 1;
4633 break;
4634 default:
4635 break;
4636 }
4637
f749f26e 4638 ifunc = NULL;
25f23106
AM
4639 if (h != NULL)
4640 {
4641 if (h->type == STT_GNU_IFUNC)
4642 {
4643 h->needs_plt = 1;
4644 ifunc = &h->plt.plist;
4645 }
4646 }
4647 else
4648 {
4649 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4650 abfd, r_symndx);
4651 if (isym == NULL)
4652 return FALSE;
4653
4654 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4655 {
4656 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4657 rel->r_addend,
37da22e5 4658 NON_GOT | PLT_IFUNC);
25f23106
AM
4659 if (ifunc == NULL)
4660 return FALSE;
4661 }
4662 }
727fc41e 4663
f749f26e 4664 tls_type = 0;
a33d1f77 4665 switch (r_type)
5bd4f169 4666 {
727fc41e
AM
4667 case R_PPC64_TLSGD:
4668 case R_PPC64_TLSLD:
4669 /* These special tls relocs tie a call to __tls_get_addr with
4670 its parameter symbol. */
37da22e5 4671 if (h != NULL)
ed7007c1 4672 ppc_elf_hash_entry (h)->tls_mask |= TLS_TLS | TLS_MARK;
37da22e5
AM
4673 else
4674 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4675 rel->r_addend,
37da22e5
AM
4676 NON_GOT | TLS_TLS | TLS_MARK))
4677 return FALSE;
4678 sec->has_tls_reloc = 1;
727fc41e
AM
4679 break;
4680
411e1bfb
AM
4681 case R_PPC64_GOT_TLSLD16:
4682 case R_PPC64_GOT_TLSLD16_LO:
4683 case R_PPC64_GOT_TLSLD16_HI:
4684 case R_PPC64_GOT_TLSLD16_HA:
87c69f97 4685 case R_PPC64_GOT_TLSLD_PCREL34:
951fd09b 4686 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
4687 goto dogottls;
4688
4689 case R_PPC64_GOT_TLSGD16:
4690 case R_PPC64_GOT_TLSGD16_LO:
4691 case R_PPC64_GOT_TLSGD16_HI:
4692 case R_PPC64_GOT_TLSGD16_HA:
87c69f97 4693 case R_PPC64_GOT_TLSGD_PCREL34:
951fd09b 4694 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
4695 goto dogottls;
4696
4697 case R_PPC64_GOT_TPREL16_DS:
4698 case R_PPC64_GOT_TPREL16_LO_DS:
4699 case R_PPC64_GOT_TPREL16_HI:
4700 case R_PPC64_GOT_TPREL16_HA:
87c69f97 4701 case R_PPC64_GOT_TPREL_PCREL34:
7c8bbca5 4702 if (bfd_link_dll (info))
411e1bfb
AM
4703 info->flags |= DF_STATIC_TLS;
4704 tls_type = TLS_TLS | TLS_TPREL;
4705 goto dogottls;
4706
4707 case R_PPC64_GOT_DTPREL16_DS:
4708 case R_PPC64_GOT_DTPREL16_LO_DS:
4709 case R_PPC64_GOT_DTPREL16_HI:
4710 case R_PPC64_GOT_DTPREL16_HA:
87c69f97 4711 case R_PPC64_GOT_DTPREL_PCREL34:
411e1bfb
AM
4712 tls_type = TLS_TLS | TLS_DTPREL;
4713 dogottls:
4714 sec->has_tls_reloc = 1;
066f4018 4715 goto dogot;
411e1bfb 4716
903b777d
AM
4717 case R_PPC64_GOT16:
4718 case R_PPC64_GOT16_LO:
4719 case R_PPC64_GOT16_HI:
65f38f15 4720 case R_PPC64_GOT16_HA:
903b777d 4721 case R_PPC64_GOT16_DS:
066f4018 4722 case R_PPC64_GOT16_LO_DS:
4a421c53 4723 case R_PPC64_GOT_PCREL34:
066f4018 4724 dogot:
65f38f15 4725 /* This symbol requires a global offset table entry. */
4c52953f 4726 sec->has_toc_reloc = 1;
33c0ec9d
AM
4727 if (r_type == R_PPC64_GOT_TLSLD16
4728 || r_type == R_PPC64_GOT_TLSGD16
4729 || r_type == R_PPC64_GOT_TPREL16_DS
4730 || r_type == R_PPC64_GOT_DTPREL16_DS
4731 || r_type == R_PPC64_GOT16
4732 || r_type == R_PPC64_GOT16_DS)
4733 {
4734 htab->do_multi_toc = 1;
d77c8a4b 4735 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
4736 }
4737
e717da7e
AM
4738 if (ppc64_elf_tdata (abfd)->got == NULL
4739 && !create_got_section (abfd, info))
b34976b6 4740 return FALSE;
5bd4f169
AM
4741
4742 if (h != NULL)
4743 {
411e1bfb
AM
4744 struct ppc_link_hash_entry *eh;
4745 struct got_entry *ent;
65f38f15 4746
ed7007c1 4747 eh = ppc_elf_hash_entry (h);
411e1bfb 4748 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
133a1f60 4749 if (ent->addend == rel->r_addend
e717da7e 4750 && ent->owner == abfd
411e1bfb
AM
4751 && ent->tls_type == tls_type)
4752 break;
4753 if (ent == NULL)
5bd4f169 4754 {
986f0783 4755 size_t amt = sizeof (*ent);
4ce794b7 4756 ent = bfd_alloc (abfd, amt);
411e1bfb 4757 if (ent == NULL)
b34976b6 4758 return FALSE;
411e1bfb 4759 ent->next = eh->elf.got.glist;
133a1f60 4760 ent->addend = rel->r_addend;
e717da7e 4761 ent->owner = abfd;
411e1bfb 4762 ent->tls_type = tls_type;
927be08e 4763 ent->is_indirect = FALSE;
411e1bfb
AM
4764 ent->got.refcount = 0;
4765 eh->elf.got.glist = ent;
5bd4f169 4766 }
411e1bfb 4767 ent->got.refcount += 1;
e7b938ca 4768 eh->tls_mask |= tls_type;
5bd4f169 4769 }
411e1bfb
AM
4770 else
4771 /* This is a global offset table entry for a local symbol. */
4772 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4773 rel->r_addend, tls_type))
411e1bfb 4774 return FALSE;
5bd4f169
AM
4775 break;
4776
5bd4f169 4777 case R_PPC64_PLT16_HA:
65f38f15
AM
4778 case R_PPC64_PLT16_HI:
4779 case R_PPC64_PLT16_LO:
08be3224 4780 case R_PPC64_PLT16_LO_DS:
5663e321
AM
4781 case R_PPC64_PLT_PCREL34:
4782 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
4783 case R_PPC64_PLT32:
4784 case R_PPC64_PLT64:
cbf95972
AM
4785 /* This symbol requires a procedure linkage table entry. */
4786 plt_list = ifunc;
4787 if (h != NULL)
e054468f 4788 {
e054468f
AM
4789 h->needs_plt = 1;
4790 if (h->root.root.string[0] == '.'
4791 && h->root.root.string[1] != '\0')
ed7007c1
AM
4792 ppc_elf_hash_entry (h)->is_func = 1;
4793 ppc_elf_hash_entry (h)->tls_mask |= PLT_KEEP;
cbf95972
AM
4794 plt_list = &h->plt.plist;
4795 }
4796 if (plt_list == NULL)
2d7ad24e 4797 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4798 rel->r_addend,
2d7ad24e 4799 NON_GOT | PLT_KEEP);
133a1f60 4800 if (!update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4801 return FALSE;
5bd4f169
AM
4802 break;
4803
4804 /* The following relocations don't need to propagate the
4805 relocation if linking a shared object since they are
4806 section relative. */
4807 case R_PPC64_SECTOFF:
4808 case R_PPC64_SECTOFF_LO:
4809 case R_PPC64_SECTOFF_HI:
4810 case R_PPC64_SECTOFF_HA:
4811 case R_PPC64_SECTOFF_DS:
4812 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
4813 case R_PPC64_DTPREL16:
4814 case R_PPC64_DTPREL16_LO:
4815 case R_PPC64_DTPREL16_HI:
4816 case R_PPC64_DTPREL16_HA:
4817 case R_PPC64_DTPREL16_DS:
4818 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
4819 case R_PPC64_DTPREL16_HIGH:
4820 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
4821 case R_PPC64_DTPREL16_HIGHER:
4822 case R_PPC64_DTPREL16_HIGHERA:
4823 case R_PPC64_DTPREL16_HIGHEST:
4824 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
4825 break;
4826
ad8e1ba5 4827 /* Nor do these. */
25f23106
AM
4828 case R_PPC64_REL16:
4829 case R_PPC64_REL16_LO:
4830 case R_PPC64_REL16_HI:
4831 case R_PPC64_REL16_HA:
4a969973
AM
4832 case R_PPC64_REL16_HIGH:
4833 case R_PPC64_REL16_HIGHA:
4834 case R_PPC64_REL16_HIGHER:
4835 case R_PPC64_REL16_HIGHERA:
4836 case R_PPC64_REL16_HIGHEST:
4837 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
4838 case R_PPC64_REL16_HIGHER34:
4839 case R_PPC64_REL16_HIGHERA34:
4840 case R_PPC64_REL16_HIGHEST34:
4841 case R_PPC64_REL16_HIGHESTA34:
a680de9a 4842 case R_PPC64_REL16DX_HA:
25f23106
AM
4843 break;
4844
45965137
AM
4845 /* Not supported as a dynamic relocation. */
4846 case R_PPC64_ADDR64_LOCAL:
0e1862bb 4847 if (bfd_link_pic (info))
45965137
AM
4848 {
4849 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
4850 ppc_howto_init ();
695344c0 4851 /* xgettext:c-format */
174d0a74 4852 info->callbacks->einfo (_("%H: %s reloc unsupported "
cf97bcb0 4853 "in shared libraries and PIEs\n"),
45965137
AM
4854 abfd, sec, rel->r_offset,
4855 ppc64_elf_howto_table[r_type]->name);
4856 bfd_set_error (bfd_error_bad_value);
4857 return FALSE;
4858 }
4859 break;
4860
ad8e1ba5 4861 case R_PPC64_TOC16:
33c0ec9d
AM
4862 case R_PPC64_TOC16_DS:
4863 htab->do_multi_toc = 1;
d77c8a4b 4864 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
1a0670f3 4865 /* Fall through. */
ad8e1ba5
AM
4866 case R_PPC64_TOC16_LO:
4867 case R_PPC64_TOC16_HI:
4868 case R_PPC64_TOC16_HA:
ad8e1ba5 4869 case R_PPC64_TOC16_LO_DS:
4c52953f 4870 sec->has_toc_reloc = 1;
ec73ddcd 4871 if (h != NULL && bfd_link_executable (info))
1bdd8fac
AM
4872 {
4873 /* We may need a copy reloc. */
4874 h->non_got_ref = 1;
4875 /* Strongly prefer a copy reloc over a dynamic reloc.
4876 glibc ld.so as of 2019-08 will error out if one of
4877 these relocations is emitted. */
4878 h->needs_copy = 1;
4879 goto dodyn;
4880 }
ad8e1ba5
AM
4881 break;
4882
006589cf
AM
4883 /* Marker reloc. */
4884 case R_PPC64_ENTRY:
4885 break;
4886
5bd4f169
AM
4887 /* This relocation describes the C++ object vtable hierarchy.
4888 Reconstruct it for later use during GC. */
4889 case R_PPC64_GNU_VTINHERIT:
c152c796 4890 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 4891 return FALSE;
5bd4f169
AM
4892 break;
4893
4894 /* This relocation describes which C++ vtable entries are actually
4895 used. Record for later use during GC. */
4896 case R_PPC64_GNU_VTENTRY:
a0ea3a14 4897 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 4898 return FALSE;
5bd4f169
AM
4899 break;
4900
721956f4
AM
4901 case R_PPC64_REL14:
4902 case R_PPC64_REL14_BRTAKEN:
4903 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
4904 {
4905 asection *dest = NULL;
4906
4907 /* Heuristic: If jumping outside our section, chances are
4908 we are going to need a stub. */
4909 if (h != NULL)
4910 {
4911 /* If the sym is weak it may be overridden later, so
4912 don't assume we know where a weak sym lives. */
4913 if (h->root.type == bfd_link_hash_defined)
4914 dest = h->root.u.def.section;
4915 }
4916 else
87d72d41
AM
4917 {
4918 Elf_Internal_Sym *isym;
4919
4920 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4921 abfd, r_symndx);
4922 if (isym == NULL)
4923 return FALSE;
4924
4925 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
4926 }
4927
220c76dd 4928 if (dest != sec)
7c8fe5c4 4929 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 4930 }
3e04d765
AM
4931 goto rel24;
4932
4933 case R_PPC64_PLTCALL:
5663e321 4934 case R_PPC64_PLTCALL_NOTOC:
3e04d765 4935 ppc64_elf_section_data (sec)->has_pltcall = 1;
721956f4
AM
4936 /* Fall through. */
4937
5d1634d7 4938 case R_PPC64_REL24:
05d0e962 4939 case R_PPC64_REL24_NOTOC:
3e04d765 4940 rel24:
cbf95972
AM
4941 plt_list = ifunc;
4942 if (h != NULL)
5d1634d7 4943 {
e054468f
AM
4944 h->needs_plt = 1;
4945 if (h->root.root.string[0] == '.'
4946 && h->root.root.string[1] != '\0')
ed7007c1 4947 ppc_elf_hash_entry (h)->is_func = 1;
cbf95972 4948
3a71aa26 4949 if (h == tga || h == dottga)
cbf95972
AM
4950 {
4951 sec->has_tls_reloc = 1;
4952 if (rel != relocs
4953 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
4954 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
4955 /* We have a new-style __tls_get_addr call with
4956 a marker reloc. */
4957 ;
4958 else
4959 /* Mark this section as having an old-style call. */
9737e8af 4960 sec->nomark_tls_get_addr = 1;
cbf95972
AM
4961 }
4962 plt_list = &h->plt.plist;
411e1bfb 4963 }
cbf95972
AM
4964
4965 /* We may need a .plt entry if the function this reloc
4966 refers to is in a shared lib. */
4967 if (plt_list
133a1f60 4968 && !update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4969 return FALSE;
411e1bfb
AM
4970 break;
4971
cbf95972
AM
4972 case R_PPC64_ADDR14:
4973 case R_PPC64_ADDR14_BRNTAKEN:
4974 case R_PPC64_ADDR14_BRTAKEN:
4975 case R_PPC64_ADDR24:
4976 goto dodyn;
4977
411e1bfb
AM
4978 case R_PPC64_TPREL64:
4979 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
7c8bbca5 4980 if (bfd_link_dll (info))
411e1bfb
AM
4981 info->flags |= DF_STATIC_TLS;
4982 goto dotlstoc;
4983
4984 case R_PPC64_DTPMOD64:
4985 if (rel + 1 < rel_end
4986 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4987 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 4988 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 4989 else
951fd09b 4990 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
4991 goto dotlstoc;
4992
4993 case R_PPC64_DTPREL64:
4994 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4995 if (rel != relocs
4996 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4997 && rel[-1].r_offset == rel->r_offset - 8)
4998 /* This is the second reloc of a dtpmod, dtprel pair.
4999 Don't mark with TLS_DTPREL. */
5000 goto dodyn;
5001
5002 dotlstoc:
5003 sec->has_tls_reloc = 1;
5004 if (h != NULL)
ed7007c1 5005 ppc_elf_hash_entry (h)->tls_mask |= tls_type & 0xff;
411e1bfb
AM
5006 else
5007 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 5008 rel->r_addend, tls_type))
411e1bfb
AM
5009 return FALSE;
5010
7c8fe5c4
AM
5011 ppc64_sec = ppc64_elf_section_data (sec);
5012 if (ppc64_sec->sec_type != sec_toc)
411e1bfb 5013 {
3a71aa26
AM
5014 bfd_size_type amt;
5015
e7b938ca 5016 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5017 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5018 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5019 if (ppc64_sec->u.toc.symndx == NULL)
5020 return FALSE;
5021 amt = sec->size * sizeof (bfd_vma) / 8;
5022 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5023 if (ppc64_sec->u.toc.add == NULL)
411e1bfb 5024 return FALSE;
7c8fe5c4
AM
5025 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5026 ppc64_sec->sec_type = sec_toc;
411e1bfb
AM
5027 }
5028 BFD_ASSERT (rel->r_offset % 8 == 0);
3a71aa26 5029 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
133a1f60 5030 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5031
5032 /* Mark the second slot of a GD or LD entry.
5033 -1 to indicate GD and -2 to indicate LD. */
5034 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5035 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5036 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5037 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5038 goto dodyn;
5039
5040 case R_PPC64_TPREL16:
5041 case R_PPC64_TPREL16_LO:
5042 case R_PPC64_TPREL16_HI:
5043 case R_PPC64_TPREL16_HA:
5044 case R_PPC64_TPREL16_DS:
5045 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
5046 case R_PPC64_TPREL16_HIGH:
5047 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5048 case R_PPC64_TPREL16_HIGHER:
5049 case R_PPC64_TPREL16_HIGHERA:
5050 case R_PPC64_TPREL16_HIGHEST:
5051 case R_PPC64_TPREL16_HIGHESTA:
c213164a 5052 case R_PPC64_TPREL34:
7c8bbca5
AM
5053 if (bfd_link_dll (info))
5054 info->flags |= DF_STATIC_TLS;
5055 goto dodyn;
5d1634d7 5056
e86ce104 5057 case R_PPC64_ADDR64:
b9399fcf 5058 if (is_opd
1e2f5b6e 5059 && rel + 1 < rel_end
4ce794b7 5060 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 5061 {
8387904d 5062 if (h != NULL)
ed7007c1 5063 ppc_elf_hash_entry (h)->is_func = 1;
1e2f5b6e 5064 }
e86ce104
AM
5065 /* Fall through. */
5066
65f38f15
AM
5067 case R_PPC64_ADDR16:
5068 case R_PPC64_ADDR16_DS:
5069 case R_PPC64_ADDR16_HA:
5070 case R_PPC64_ADDR16_HI:
f9c6b907
AM
5071 case R_PPC64_ADDR16_HIGH:
5072 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
5073 case R_PPC64_ADDR16_HIGHER:
5074 case R_PPC64_ADDR16_HIGHERA:
5075 case R_PPC64_ADDR16_HIGHEST:
5076 case R_PPC64_ADDR16_HIGHESTA:
5077 case R_PPC64_ADDR16_LO:
5078 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
5079 case R_PPC64_D34:
5080 case R_PPC64_D34_LO:
5081 case R_PPC64_D34_HI30:
5082 case R_PPC64_D34_HA30:
5083 case R_PPC64_ADDR16_HIGHER34:
5084 case R_PPC64_ADDR16_HIGHERA34:
5085 case R_PPC64_ADDR16_HIGHEST34:
5086 case R_PPC64_ADDR16_HIGHESTA34:
5087 case R_PPC64_D28:
0e1862bb 5088 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
a345bc8d
AM
5089 && rel->r_addend == 0)
5090 {
5091 /* We may need a .plt entry if this reloc refers to a
5092 function in a shared lib. */
5663e321 5093 if (!update_plt_info (abfd, &h->plt.plist, 0))
a345bc8d
AM
5094 return FALSE;
5095 h->pointer_equality_needed = 1;
5096 }
5097 /* Fall through. */
5098
5099 case R_PPC64_REL30:
5100 case R_PPC64_REL32:
5101 case R_PPC64_REL64:
65f38f15 5102 case R_PPC64_ADDR32:
65f38f15
AM
5103 case R_PPC64_UADDR16:
5104 case R_PPC64_UADDR32:
5105 case R_PPC64_UADDR64:
5bd4f169 5106 case R_PPC64_TOC:
ec73ddcd 5107 if (h != NULL && bfd_link_executable (info))
81848ca0 5108 /* We may need a copy reloc. */
f5385ebf 5109 h->non_got_ref = 1;
81848ca0 5110
41bd81ab 5111 /* Don't propagate .opd relocs. */
b9399fcf 5112 if (NO_OPD_RELOCS && is_opd)
e86ce104 5113 break;
e86ce104 5114
65f38f15
AM
5115 /* If we are creating a shared library, and this is a reloc
5116 against a global symbol, or a non PC relative reloc
5117 against a local symbol, then we need to copy the reloc
5118 into the shared library. However, if we are linking with
5119 -Bsymbolic, we do not need to copy a reloc against a
5120 global symbol which is defined in an object we are
5121 including in the link (i.e., DEF_REGULAR is set). At
5122 this point we have not seen all the input files, so it is
5123 possible that DEF_REGULAR is not set now but will be set
5124 later (it is never cleared). In case of a weak definition,
5125 DEF_REGULAR may be cleared later by a strong definition in
5126 a shared library. We account for that possibility below by
f4656909 5127 storing information in the dyn_relocs field of the hash
65f38f15
AM
5128 table entry. A similar situation occurs when creating
5129 shared libraries and symbol visibility changes render the
5130 symbol local.
5131
5132 If on the other hand, we are creating an executable, we
5133 may need to keep relocations for symbols satisfied by a
5134 dynamic library if we manage to avoid copy relocs for the
5135 symbol. */
411e1bfb 5136 dodyn:
ec73ddcd
AM
5137 if ((h != NULL
5138 && (h->root.type == bfd_link_hash_defweak
5139 || !h->def_regular))
5140 || (h != NULL
5141 && !bfd_link_executable (info)
5142 && !SYMBOLIC_BIND (info, h))
5143 || (bfd_link_pic (info)
5144 && must_be_dyn_reloc (info, r_type))
0e1862bb 5145 || (!bfd_link_pic (info)
25f23106 5146 && ifunc != NULL))
5bd4f169 5147 {
65f38f15
AM
5148 /* We must copy these reloc types into the output file.
5149 Create a reloc section in dynobj and make room for
5150 this reloc. */
5bd4f169
AM
5151 if (sreloc == NULL)
5152 {
83bac4b0
NC
5153 sreloc = _bfd_elf_make_dynamic_reloc_section
5154 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
65f38f15 5155
5bd4f169 5156 if (sreloc == NULL)
83bac4b0 5157 return FALSE;
5bd4f169
AM
5158 }
5159
65f38f15
AM
5160 /* If this is a global symbol, we count the number of
5161 relocations we need for this symbol. */
5162 if (h != NULL)
5163 {
19e08130
AM
5164 struct elf_dyn_relocs *p;
5165 struct elf_dyn_relocs **head;
5166
190eb1dd 5167 head = &h->dyn_relocs;
19e08130
AM
5168 p = *head;
5169 if (p == NULL || p->sec != sec)
5170 {
5171 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5172 if (p == NULL)
5173 return FALSE;
5174 p->next = *head;
5175 *head = p;
5176 p->sec = sec;
5177 p->count = 0;
5178 p->pc_count = 0;
5179 }
5180 p->count += 1;
5181 if (!must_be_dyn_reloc (info, r_type))
5182 p->pc_count += 1;
65f38f15
AM
5183 }
5184 else
5185 {
ec338859
AM
5186 /* Track dynamic relocs needed for local syms too.
5187 We really need local syms available to do this
5188 easily. Oh well. */
19e08130
AM
5189 struct ppc_dyn_relocs *p;
5190 struct ppc_dyn_relocs **head;
5191 bfd_boolean is_ifunc;
ec338859 5192 asection *s;
6edfbbad 5193 void *vpp;
87d72d41 5194 Elf_Internal_Sym *isym;
6edfbbad 5195
87d72d41
AM
5196 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5197 abfd, r_symndx);
5198 if (isym == NULL)
b34976b6 5199 return FALSE;
ec338859 5200
87d72d41
AM
5201 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5202 if (s == NULL)
5203 s = sec;
5204
6edfbbad 5205 vpp = &elf_section_data (s)->local_dynrel;
19e08130
AM
5206 head = (struct ppc_dyn_relocs **) vpp;
5207 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5208 p = *head;
5209 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5210 p = p->next;
5211 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5212 {
5213 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5214 if (p == NULL)
5215 return FALSE;
5216 p->next = *head;
5217 *head = p;
5218 p->sec = sec;
5219 p->ifunc = is_ifunc;
5220 p->count = 0;
5221 }
5222 p->count += 1;
ec338859 5223 }
65f38f15 5224 }
5bd4f169 5225 break;
65f38f15
AM
5226
5227 default:
96e0dda4 5228 break;
5bd4f169
AM
5229 }
5230 }
5231
b34976b6 5232 return TRUE;
5bd4f169
AM
5233}
5234
ee67d69a
AM
5235/* Merge backend specific data from an object file to the output
5236 object file when linking. */
5237
5238static bfd_boolean
50e03d47 5239ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
ee67d69a 5240{
50e03d47 5241 bfd *obfd = info->output_bfd;
ee67d69a
AM
5242 unsigned long iflags, oflags;
5243
5244 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5245 return TRUE;
5246
5247 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5248 return TRUE;
5249
50e03d47 5250 if (!_bfd_generic_verify_endian_match (ibfd, info))
ee67d69a
AM
5251 return FALSE;
5252
5253 iflags = elf_elfheader (ibfd)->e_flags;
5254 oflags = elf_elfheader (obfd)->e_flags;
5255
f6c7c3e8 5256 if (iflags & ~EF_PPC64_ABI)
ee67d69a 5257 {
4eca0228 5258 _bfd_error_handler
695344c0 5259 /* xgettext:c-format */
871b3ab2 5260 (_("%pB uses unknown e_flags 0x%lx"), ibfd, iflags);
ee67d69a
AM
5261 bfd_set_error (bfd_error_bad_value);
5262 return FALSE;
5263 }
f6c7c3e8 5264 else if (iflags != oflags && iflags != 0)
ee67d69a 5265 {
4eca0228 5266 _bfd_error_handler
695344c0 5267 /* xgettext:c-format */
871b3ab2 5268 (_("%pB: ABI version %ld is not compatible with ABI version %ld output"),
ee67d69a
AM
5269 ibfd, iflags, oflags);
5270 bfd_set_error (bfd_error_bad_value);
5271 return FALSE;
5272 }
5273
4a91d0ba
AM
5274 if (!_bfd_elf_ppc_merge_fp_attributes (ibfd, info))
5275 return FALSE;
005d79fd 5276
ee67d69a 5277 /* Merge Tag_compatibility attributes and any common GNU ones. */
8d2c8c3d 5278 return _bfd_elf_merge_object_attributes (ibfd, info);
ee67d69a
AM
5279}
5280
5281static bfd_boolean
5282ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5283{
5284 /* Print normal ELF private data. */
5285 _bfd_elf_print_private_bfd_data (abfd, ptr);
5286
5287 if (elf_elfheader (abfd)->e_flags != 0)
5288 {
5289 FILE *file = ptr;
5290
ee67d69a
AM
5291 fprintf (file, _("private flags = 0x%lx:"),
5292 elf_elfheader (abfd)->e_flags);
5293
5294 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5295 fprintf (file, _(" [abiv%ld]"),
5296 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5297 fputc ('\n', file);
5298 }
5299
5300 return TRUE;
5301}
5302
8387904d 5303/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
b53dfeb2
AM
5304 of the code entry point, and its section, which must be in the same
5305 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
8387904d
AM
5306
5307static bfd_vma
5308opd_entry_value (asection *opd_sec,
5309 bfd_vma offset,
5310 asection **code_sec,
aef36ac1
AM
5311 bfd_vma *code_off,
5312 bfd_boolean in_code_sec)
8387904d
AM
5313{
5314 bfd *opd_bfd = opd_sec->owner;
8860955f 5315 Elf_Internal_Rela *relocs;
8387904d 5316 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 5317 bfd_vma val;
8387904d 5318
9f296da3
AM
5319 /* No relocs implies we are linking a --just-symbols object, or looking
5320 at a final linked executable with addr2line or somesuch. */
4b85d634
AM
5321 if (opd_sec->reloc_count == 0)
5322 {
729eabd5 5323 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
3b36f7e6 5324
729eabd5
AM
5325 if (contents == NULL)
5326 {
5327 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5328 return (bfd_vma) -1;
5329 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5330 }
ee1e4ede 5331
dbb3fbbb 5332 /* PR 17512: file: 64b9dfbb. */
451dfd38 5333 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
dbb3fbbb
NC
5334 return (bfd_vma) -1;
5335
729eabd5 5336 val = bfd_get_64 (opd_bfd, contents + offset);
aef36ac1
AM
5337 if (code_sec != NULL)
5338 {
5339 asection *sec, *likely = NULL;
ee1e4ede 5340
aef36ac1 5341 if (in_code_sec)
4b85d634 5342 {
aef36ac1
AM
5343 sec = *code_sec;
5344 if (sec->vma <= val
5345 && val < sec->vma + sec->size)
5346 likely = sec;
5347 else
5348 val = -1;
5349 }
5350 else
5351 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5352 if (sec->vma <= val
5353 && (sec->flags & SEC_LOAD) != 0
5354 && (sec->flags & SEC_ALLOC) != 0)
5355 likely = sec;
5356 if (likely != NULL)
5357 {
5358 *code_sec = likely;
5359 if (code_off != NULL)
5360 *code_off = val - likely->vma;
4b85d634
AM
5361 }
5362 }
aef36ac1 5363 return val;
4b85d634
AM
5364 }
5365
0c8d6e5c 5366 BFD_ASSERT (is_ppc64_elf (opd_bfd));
0ffa91dd 5367
729eabd5 5368 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
8860955f
AM
5369 if (relocs == NULL)
5370 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
877a8638
NC
5371 /* PR 17512: file: df8e1fd6. */
5372 if (relocs == NULL)
5373 return (bfd_vma) -1;
645ea6a9 5374
8387904d 5375 /* Go find the opd reloc at the sym address. */
8860955f 5376 lo = relocs;
8387904d 5377 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 5378 val = (bfd_vma) -1;
8387904d
AM
5379 while (lo < hi)
5380 {
5381 look = lo + (hi - lo) / 2;
5382 if (look->r_offset < offset)
5383 lo = look + 1;
5384 else if (look->r_offset > offset)
5385 hi = look;
5386 else
5387 {
0ffa91dd
NC
5388 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5389
8387904d
AM
5390 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5391 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5392 {
5393 unsigned long symndx = ELF64_R_SYM (look->r_info);
b53dfeb2 5394 asection *sec = NULL;
8387904d 5395
b53dfeb2
AM
5396 if (symndx >= symtab_hdr->sh_info
5397 && elf_sym_hashes (opd_bfd) != NULL)
8387904d
AM
5398 {
5399 struct elf_link_hash_entry **sym_hashes;
5400 struct elf_link_hash_entry *rh;
5401
5402 sym_hashes = elf_sym_hashes (opd_bfd);
5403 rh = sym_hashes[symndx - symtab_hdr->sh_info];
128205bb
AM
5404 if (rh != NULL)
5405 {
5406 rh = elf_follow_link (rh);
bb854a36
AM
5407 if (rh->root.type != bfd_link_hash_defined
5408 && rh->root.type != bfd_link_hash_defweak)
5409 break;
5410 if (rh->root.u.def.section->owner == opd_bfd)
b53dfeb2 5411 {
bb854a36
AM
5412 val = rh->root.u.def.value;
5413 sec = rh->root.u.def.section;
b53dfeb2
AM
5414 }
5415 }
5416 }
5417
5418 if (sec == NULL)
5419 {
5420 Elf_Internal_Sym *sym;
5421
5422 if (symndx < symtab_hdr->sh_info)
5423 {
5424 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5425 if (sym == NULL)
5426 {
5427 size_t symcnt = symtab_hdr->sh_info;
5428 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5429 symcnt, 0,
5430 NULL, NULL, NULL);
5431 if (sym == NULL)
5432 break;
5433 symtab_hdr->contents = (bfd_byte *) sym;
5434 }
5435 sym += symndx;
128205bb
AM
5436 }
5437 else
5438 {
b53dfeb2
AM
5439 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5440 1, symndx,
5441 NULL, NULL, NULL);
128205bb
AM
5442 if (sym == NULL)
5443 break;
128205bb 5444 }
b53dfeb2
AM
5445 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5446 if (sec == NULL)
5447 break;
5448 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5449 val = sym->st_value;
8387904d 5450 }
b53dfeb2 5451
8387904d
AM
5452 val += look->r_addend;
5453 if (code_off != NULL)
5454 *code_off = val;
5455 if (code_sec != NULL)
aef36ac1
AM
5456 {
5457 if (in_code_sec && *code_sec != sec)
5458 return -1;
5459 else
5460 *code_sec = sec;
5461 }
b53dfeb2 5462 if (sec->output_section != NULL)
8387904d 5463 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
5464 }
5465 break;
5466 }
5467 }
645ea6a9 5468
645ea6a9 5469 return val;
8387904d
AM
5470}
5471
aef36ac1
AM
5472/* If the ELF symbol SYM might be a function in SEC, return the
5473 function size and set *CODE_OFF to the function's entry point,
5474 otherwise return zero. */
9f296da3 5475
aef36ac1
AM
5476static bfd_size_type
5477ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
5478 bfd_vma *code_off)
9f296da3 5479{
aef36ac1
AM
5480 bfd_size_type size;
5481
5482 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
5483 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
5484 return 0;
5485
5486 size = 0;
5487 if (!(sym->flags & BSF_SYNTHETIC))
5488 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
5489
5490 if (strcmp (sym->section->name, ".opd") == 0)
9f296da3 5491 {
b07bca4e
AM
5492 struct _opd_sec_data *opd = get_opd_info (sym->section);
5493 bfd_vma symval = sym->value;
5494
5495 if (opd != NULL
5496 && opd->adjust != NULL
5497 && elf_section_data (sym->section)->relocs != NULL)
5498 {
5499 /* opd_entry_value will use cached relocs that have been
5500 adjusted, but with raw symbols. That means both local
5501 and global symbols need adjusting. */
5502 long adjust = opd->adjust[OPD_NDX (symval)];
5503 if (adjust == -1)
5504 return 0;
5505 symval += adjust;
5506 }
5507
5508 if (opd_entry_value (sym->section, symval,
aef36ac1
AM
5509 &sec, code_off, TRUE) == (bfd_vma) -1)
5510 return 0;
5511 /* An old ABI binary with dot-syms has a size of 24 on the .opd
5512 symbol. This size has nothing to do with the code size of the
5513 function, which is what we're supposed to return, but the
5514 code size isn't available without looking up the dot-sym.
5515 However, doing that would be a waste of time particularly
5516 since elf_find_function will look at the dot-sym anyway.
5517 Now, elf_find_function will keep the largest size of any
5518 function sym found at the code address of interest, so return
5519 1 here to avoid it incorrectly caching a larger function size
5520 for a small function. This does mean we return the wrong
5521 size for a new-ABI function of size 24, but all that does is
5522 disable caching for such functions. */
5523 if (size == 24)
5524 size = 1;
9f296da3 5525 }
aef36ac1
AM
5526 else
5527 {
5528 if (sym->section != sec)
5529 return 0;
5530 *code_off = sym->value;
5531 }
5532 if (size == 0)
5533 size = 1;
5534 return size;
9f296da3
AM
5535}
5536
f378ab09
AM
5537/* Return true if symbol is a strong function defined in an ELFv2
5538 object with st_other localentry bits of zero, ie. its local entry
5539 point coincides with its global entry point. */
5540
5541static bfd_boolean
5542is_elfv2_localentry0 (struct elf_link_hash_entry *h)
5543{
5544 return (h != NULL
5545 && h->type == STT_FUNC
5546 && h->root.type == bfd_link_hash_defined
5547 && (STO_PPC64_LOCAL_MASK & h->other) == 0
ed7007c1 5548 && !ppc_elf_hash_entry (h)->non_zero_localentry
f378ab09
AM
5549 && is_ppc64_elf (h->root.u.def.section->owner)
5550 && abiversion (h->root.u.def.section->owner) >= 2);
5551}
5552
854b41e7
AM
5553/* Return true if symbol is defined in a regular object file. */
5554
5555static bfd_boolean
5556is_static_defined (struct elf_link_hash_entry *h)
5557{
5558 return ((h->root.type == bfd_link_hash_defined
5559 || h->root.type == bfd_link_hash_defweak)
5560 && h->root.u.def.section != NULL
5561 && h->root.u.def.section->output_section != NULL);
5562}
5563
b31867b6
AM
5564/* If FDH is a function descriptor symbol, return the associated code
5565 entry symbol if it is defined. Return NULL otherwise. */
5566
5567static struct ppc_link_hash_entry *
5568defined_code_entry (struct ppc_link_hash_entry *fdh)
5569{
5570 if (fdh->is_func_descriptor)
5571 {
5572 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
5573 if (fh->elf.root.type == bfd_link_hash_defined
5574 || fh->elf.root.type == bfd_link_hash_defweak)
5575 return fh;
5576 }
5577 return NULL;
5578}
5579
5580/* If FH is a function code entry symbol, return the associated
5581 function descriptor symbol if it is defined. Return NULL otherwise. */
5582
5583static struct ppc_link_hash_entry *
5584defined_func_desc (struct ppc_link_hash_entry *fh)
5585{
5586 if (fh->oh != NULL
5587 && fh->oh->is_func_descriptor)
5588 {
5589 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
5590 if (fdh->elf.root.type == bfd_link_hash_defined
5591 || fdh->elf.root.type == bfd_link_hash_defweak)
5592 return fdh;
5593 }
5594 return NULL;
5595}
5596
ed7007c1
AM
5597/* Given H is a symbol that satisfies is_static_defined, return the
5598 value in the output file. */
5599
5600static bfd_vma
5601defined_sym_val (struct elf_link_hash_entry *h)
5602{
5603 return (h->root.u.def.section->output_section->vma
5604 + h->root.u.def.section->output_offset
5605 + h->root.u.def.value);
5606}
5607
5608/* Return true if H matches __tls_get_addr or one of its variants. */
5609
5610static bfd_boolean
5611is_tls_get_addr (struct elf_link_hash_entry *h,
5612 struct ppc_link_hash_table *htab)
5613{
9e7028aa
AM
5614 return (h == &htab->tls_get_addr_fd->elf || h == &htab->tga_desc_fd->elf
5615 || h == &htab->tls_get_addr->elf || h == &htab->tga_desc->elf);
ed7007c1
AM
5616}
5617
8c5b4e52
AM
5618static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
5619
5620/* Garbage collect sections, after first dealing with dot-symbols. */
5621
5622static bfd_boolean
5623ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
5624{
5625 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5626
5627 if (htab != NULL && htab->need_func_desc_adj)
5628 {
5629 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5630 htab->need_func_desc_adj = 0;
5631 }
5632 return bfd_elf_gc_sections (abfd, info);
5633}
5634
74f0fb50
AM
5635/* Mark all our entry sym sections, both opd and code section. */
5636
5637static void
5638ppc64_elf_gc_keep (struct bfd_link_info *info)
5639{
5640 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5641 struct bfd_sym_chain *sym;
5642
4dfe6ac6
NC
5643 if (htab == NULL)
5644 return;
5645
74f0fb50
AM
5646 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5647 {
b31867b6 5648 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
5649 asection *sec;
5650
ed7007c1
AM
5651 eh = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, sym->name,
5652 FALSE, FALSE, TRUE));
74f0fb50
AM
5653 if (eh == NULL)
5654 continue;
5655 if (eh->elf.root.type != bfd_link_hash_defined
5656 && eh->elf.root.type != bfd_link_hash_defweak)
5657 continue;
5658
b31867b6
AM
5659 fh = defined_code_entry (eh);
5660 if (fh != NULL)
74f0fb50 5661 {
b31867b6 5662 sec = fh->elf.root.u.def.section;
74f0fb50
AM
5663 sec->flags |= SEC_KEEP;
5664 }
5665 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5666 && opd_entry_value (eh->elf.root.u.def.section,
5667 eh->elf.root.u.def.value,
aef36ac1 5668 &sec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50
AM
5669 sec->flags |= SEC_KEEP;
5670
5671 sec = eh->elf.root.u.def.section;
5672 sec->flags |= SEC_KEEP;
5673 }
5674}
5675
64d03ab5
AM
5676/* Mark sections containing dynamically referenced symbols. When
5677 building shared libraries, we must assume that any visible symbol is
5678 referenced. */
5679
5680static bfd_boolean
5681ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5682{
5683 struct bfd_link_info *info = (struct bfd_link_info *) inf;
ed7007c1 5684 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
b31867b6 5685 struct ppc_link_hash_entry *fdh;
b407645f 5686 struct bfd_elf_dynamic_list *d = info->dynamic_list;
64d03ab5 5687
64d03ab5 5688 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
5689 fdh = defined_func_desc (eh);
5690 if (fdh != NULL)
5691 eh = fdh;
64d03ab5
AM
5692
5693 if ((eh->elf.root.type == bfd_link_hash_defined
5694 || eh->elf.root.type == bfd_link_hash_defweak)
87e79a65 5695 && ((eh->elf.ref_dynamic && !eh->elf.forced_local)
1c9177d9 5696 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
64d03ab5 5697 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8 5698 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
0e1862bb 5699 && (!bfd_link_executable (info)
e278ae05 5700 || info->gc_keep_exported
b407645f
AM
5701 || info->export_dynamic
5702 || (eh->elf.dynamic
5703 && d != NULL
2cdcc330
AM
5704 && (*d->match) (&d->head, NULL,
5705 eh->elf.root.root.string)))
e278ae05 5706 && (eh->elf.versioned >= versioned
4c58e0d8
AM
5707 || !bfd_hide_sym_by_version (info->version_info,
5708 eh->elf.root.root.string)))))
64d03ab5
AM
5709 {
5710 asection *code_sec;
b31867b6 5711 struct ppc_link_hash_entry *fh;
64d03ab5
AM
5712
5713 eh->elf.root.u.def.section->flags |= SEC_KEEP;
5714
5715 /* Function descriptor syms cause the associated
5716 function code sym section to be marked. */
b31867b6
AM
5717 fh = defined_code_entry (eh);
5718 if (fh != NULL)
5719 {
5720 code_sec = fh->elf.root.u.def.section;
5721 code_sec->flags |= SEC_KEEP;
5722 }
64d03ab5
AM
5723 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5724 && opd_entry_value (eh->elf.root.u.def.section,
5725 eh->elf.root.u.def.value,
aef36ac1 5726 &code_sec, NULL, FALSE) != (bfd_vma) -1)
64d03ab5
AM
5727 code_sec->flags |= SEC_KEEP;
5728 }
5729
5730 return TRUE;
5731}
5732
5bd4f169
AM
5733/* Return the section that should be marked against GC for a given
5734 relocation. */
5735
5736static asection *
4ce794b7 5737ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 5738 struct bfd_link_info *info,
4ce794b7
AM
5739 Elf_Internal_Rela *rel,
5740 struct elf_link_hash_entry *h,
5741 Elf_Internal_Sym *sym)
5bd4f169 5742{
ccfa59ea
AM
5743 asection *rsec;
5744
ccfa59ea
AM
5745 /* Syms return NULL if we're marking .opd, so we avoid marking all
5746 function sections, as all functions are referenced in .opd. */
5747 rsec = NULL;
5748 if (get_opd_info (sec) != NULL)
5749 return rsec;
1e2f5b6e 5750
5bd4f169
AM
5751 if (h != NULL)
5752 {
04c9666a 5753 enum elf_ppc64_reloc_type r_type;
b31867b6 5754 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 5755
4ce794b7 5756 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 5757 switch (r_type)
5bd4f169
AM
5758 {
5759 case R_PPC64_GNU_VTINHERIT:
5760 case R_PPC64_GNU_VTENTRY:
5761 break;
5762
5763 default:
5764 switch (h->root.type)
5765 {
5766 case bfd_link_hash_defined:
5767 case bfd_link_hash_defweak:
ed7007c1 5768 eh = ppc_elf_hash_entry (h);
b31867b6
AM
5769 fdh = defined_func_desc (eh);
5770 if (fdh != NULL)
8c5b4e52
AM
5771 {
5772 /* -mcall-aixdesc code references the dot-symbol on
5773 a call reloc. Mark the function descriptor too
5774 against garbage collection. */
5775 fdh->elf.mark = 1;
60d67dc8
AM
5776 if (fdh->elf.is_weakalias)
5777 weakdef (&fdh->elf)->mark = 1;
8c5b4e52
AM
5778 eh = fdh;
5779 }
1e2f5b6e
AM
5780
5781 /* Function descriptor syms cause the associated
5782 function code sym section to be marked. */
b31867b6
AM
5783 fh = defined_code_entry (eh);
5784 if (fh != NULL)
ccfa59ea
AM
5785 {
5786 /* They also mark their opd section. */
74f0fb50 5787 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5788
b31867b6 5789 rsec = fh->elf.root.u.def.section;
ccfa59ea 5790 }
8387904d
AM
5791 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5792 && opd_entry_value (eh->elf.root.u.def.section,
5793 eh->elf.root.u.def.value,
aef36ac1 5794 &rsec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50 5795 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5796 else
1e2f5b6e
AM
5797 rsec = h->root.u.def.section;
5798 break;
5bd4f169
AM
5799
5800 case bfd_link_hash_common:
1e2f5b6e
AM
5801 rsec = h->root.u.c.p->section;
5802 break;
5bd4f169
AM
5803
5804 default:
fb34365b 5805 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
5806 }
5807 }
5808 }
5809 else
5810 {
74f0fb50 5811 struct _opd_sec_data *opd;
1e2f5b6e
AM
5812
5813 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
5814 opd = get_opd_info (rsec);
5815 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 5816 {
74f0fb50 5817 rsec->gc_mark = 1;
ccfa59ea 5818
51aecdc5 5819 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
ccfa59ea 5820 }
5bd4f169
AM
5821 }
5822
1e2f5b6e 5823 return rsec;
5bd4f169
AM
5824}
5825
deb0e272
AM
5826/* The maximum size of .sfpr. */
5827#define SFPR_MAX (218*4)
5828
5829struct sfpr_def_parms
5830{
699733f6
AM
5831 const char name[12];
5832 unsigned char lo, hi;
2cdcc330
AM
5833 bfd_byte *(*write_ent) (bfd *, bfd_byte *, int);
5834 bfd_byte *(*write_tail) (bfd *, bfd_byte *, int);
deb0e272
AM
5835};
5836
a4b6fadd
AM
5837/* Auto-generate _save*, _rest* functions in .sfpr.
5838 If STUB_SEC is non-null, define alias symbols in STUB_SEC
5839 instead. */
deb0e272 5840
4dfe6ac6 5841static bfd_boolean
a4b6fadd
AM
5842sfpr_define (struct bfd_link_info *info,
5843 const struct sfpr_def_parms *parm,
5844 asection *stub_sec)
deb0e272
AM
5845{
5846 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5847 unsigned int i;
5848 size_t len = strlen (parm->name);
5849 bfd_boolean writing = FALSE;
699733f6 5850 char sym[16];
deb0e272 5851
4dfe6ac6
NC
5852 if (htab == NULL)
5853 return FALSE;
5854
deb0e272
AM
5855 memcpy (sym, parm->name, len);
5856 sym[len + 2] = 0;
5857
5858 for (i = parm->lo; i <= parm->hi; i++)
5859 {
a4b6fadd 5860 struct ppc_link_hash_entry *h;
deb0e272
AM
5861
5862 sym[len + 0] = i / 10 + '0';
5863 sym[len + 1] = i % 10 + '0';
ed7007c1
AM
5864 h = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, sym,
5865 writing, TRUE, TRUE));
a4b6fadd 5866 if (stub_sec != NULL)
deb0e272 5867 {
a4b6fadd
AM
5868 if (h != NULL
5869 && h->elf.root.type == bfd_link_hash_defined
5870 && h->elf.root.u.def.section == htab->sfpr)
5871 {
5872 struct elf_link_hash_entry *s;
5873 char buf[32];
5874 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
5875 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
5876 if (s == NULL)
5877 return FALSE;
779f2ae7 5878 if (s->root.type == bfd_link_hash_new)
a4b6fadd
AM
5879 {
5880 s->root.type = bfd_link_hash_defined;
5881 s->root.u.def.section = stub_sec;
7dda8d3c 5882 s->root.u.def.value = (stub_sec->size - htab->sfpr->size
a4b6fadd
AM
5883 + h->elf.root.u.def.value);
5884 s->ref_regular = 1;
5885 s->def_regular = 1;
5886 s->ref_regular_nonweak = 1;
5887 s->forced_local = 1;
5888 s->non_elf = 0;
5889 s->root.linker_def = 1;
5890 }
5891 }
5892 continue;
5893 }
5894 if (h != NULL)
5895 {
5896 h->save_res = 1;
5897 if (!h->elf.def_regular)
deb0e272 5898 {
a4b6fadd
AM
5899 h->elf.root.type = bfd_link_hash_defined;
5900 h->elf.root.u.def.section = htab->sfpr;
5901 h->elf.root.u.def.value = htab->sfpr->size;
5902 h->elf.type = STT_FUNC;
5903 h->elf.def_regular = 1;
b32547cd 5904 h->elf.non_elf = 0;
a4b6fadd
AM
5905 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
5906 writing = TRUE;
deb0e272 5907 if (htab->sfpr->contents == NULL)
a4b6fadd 5908 {
2cdcc330
AM
5909 htab->sfpr->contents
5910 = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
a4b6fadd
AM
5911 if (htab->sfpr->contents == NULL)
5912 return FALSE;
5913 }
deb0e272
AM
5914 }
5915 }
5916 if (writing)
5917 {
5918 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5919 if (i != parm->hi)
5920 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5921 else
5922 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5923 htab->sfpr->size = p - htab->sfpr->contents;
5924 }
5925 }
5926
5927 return TRUE;
5928}
5929
5930static bfd_byte *
5931savegpr0 (bfd *abfd, bfd_byte *p, int r)
5932{
5933 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5934 return p + 4;
5935}
5936
5937static bfd_byte *
5938savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5939{
5940 p = savegpr0 (abfd, p, r);
a078d95a 5941 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
5942 p = p + 4;
5943 bfd_put_32 (abfd, BLR, p);
5944 return p + 4;
5945}
5946
5947static bfd_byte *
5948restgpr0 (bfd *abfd, bfd_byte *p, int r)
5949{
5950 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5951 return p + 4;
5952}
5953
5954static bfd_byte *
5955restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5956{
a078d95a 5957 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
5958 p = p + 4;
5959 p = restgpr0 (abfd, p, r);
5960 bfd_put_32 (abfd, MTLR_R0, p);
5961 p = p + 4;
5962 if (r == 29)
5963 {
5964 p = restgpr0 (abfd, p, 30);
5965 p = restgpr0 (abfd, p, 31);
5966 }
5967 bfd_put_32 (abfd, BLR, p);
5968 return p + 4;
5969}
5970
5971static bfd_byte *
5972savegpr1 (bfd *abfd, bfd_byte *p, int r)
5973{
5974 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5975 return p + 4;
5976}
5977
5978static bfd_byte *
5979savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5980{
5981 p = savegpr1 (abfd, p, r);
5982 bfd_put_32 (abfd, BLR, p);
5983 return p + 4;
5984}
5985
5986static bfd_byte *
5987restgpr1 (bfd *abfd, bfd_byte *p, int r)
5988{
5989 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5990 return p + 4;
5991}
5992
5993static bfd_byte *
5994restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5995{
5996 p = restgpr1 (abfd, p, r);
5997 bfd_put_32 (abfd, BLR, p);
5998 return p + 4;
5999}
6000
6001static bfd_byte *
6002savefpr (bfd *abfd, bfd_byte *p, int r)
6003{
6004 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6005 return p + 4;
6006}
6007
6008static bfd_byte *
6009savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6010{
6011 p = savefpr (abfd, p, r);
a078d95a 6012 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6013 p = p + 4;
6014 bfd_put_32 (abfd, BLR, p);
6015 return p + 4;
6016}
6017
6018static bfd_byte *
6019restfpr (bfd *abfd, bfd_byte *p, int r)
6020{
6021 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6022 return p + 4;
6023}
6024
6025static bfd_byte *
6026restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6027{
a078d95a 6028 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6029 p = p + 4;
6030 p = restfpr (abfd, p, r);
6031 bfd_put_32 (abfd, MTLR_R0, p);
6032 p = p + 4;
6033 if (r == 29)
6034 {
6035 p = restfpr (abfd, p, 30);
6036 p = restfpr (abfd, p, 31);
6037 }
6038 bfd_put_32 (abfd, BLR, p);
6039 return p + 4;
6040}
6041
6042static bfd_byte *
6043savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6044{
6045 p = savefpr (abfd, p, r);
6046 bfd_put_32 (abfd, BLR, p);
6047 return p + 4;
6048}
6049
6050static bfd_byte *
6051restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6052{
6053 p = restfpr (abfd, p, r);
6054 bfd_put_32 (abfd, BLR, p);
6055 return p + 4;
6056}
6057
6058static bfd_byte *
6059savevr (bfd *abfd, bfd_byte *p, int r)
6060{
6061 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6062 p = p + 4;
6063 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6064 return p + 4;
6065}
6066
6067static bfd_byte *
6068savevr_tail (bfd *abfd, bfd_byte *p, int r)
6069{
6070 p = savevr (abfd, p, r);
6071 bfd_put_32 (abfd, BLR, p);
6072 return p + 4;
6073}
6074
6075static bfd_byte *
6076restvr (bfd *abfd, bfd_byte *p, int r)
6077{
6078 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6079 p = p + 4;
6080 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6081 return p + 4;
6082}
6083
6084static bfd_byte *
6085restvr_tail (bfd *abfd, bfd_byte *p, int r)
6086{
6087 p = restvr (abfd, p, r);
6088 bfd_put_32 (abfd, BLR, p);
6089 return p + 4;
6090}
6091
9e7028aa
AM
6092#define STDU_R1_0R1 0xf8210001
6093#define ADDI_R1_R1 0x38210000
6094
6095/* Emit prologue of wrapper preserving regs around a call to
6096 __tls_get_addr_opt. */
6097
6098static bfd_byte *
6099tls_get_addr_prologue (bfd *obfd, bfd_byte *p, struct ppc_link_hash_table *htab)
6100{
6101 unsigned int i;
6102
6103 bfd_put_32 (obfd, MFLR_R0, p);
6104 p += 4;
6105 bfd_put_32 (obfd, STD_R0_0R1 + 16, p);
6106 p += 4;
6107
6108 if (htab->opd_abi)
6109 {
6110 for (i = 4; i < 12; i++)
6111 {
6112 bfd_put_32 (obfd,
6113 STD_R0_0R1 | i << 21 | (-(13 - i) * 8 & 0xffff), p);
6114 p += 4;
6115 }
6116 bfd_put_32 (obfd, STDU_R1_0R1 | (-128 & 0xffff), p);
6117 p += 4;
6118 }
6119 else
6120 {
6121 for (i = 4; i < 12; i++)
6122 {
6123 bfd_put_32 (obfd,
6124 STD_R0_0R1 | i << 21 | (-(12 - i) * 8 & 0xffff), p);
6125 p += 4;
6126 }
6127 bfd_put_32 (obfd, STDU_R1_0R1 | (-96 & 0xffff), p);
6128 p += 4;
6129 }
6130 return p;
6131}
6132
6133/* Emit epilogue of wrapper preserving regs around a call to
6134 __tls_get_addr_opt. */
6135
6136static bfd_byte *
6137tls_get_addr_epilogue (bfd *obfd, bfd_byte *p, struct ppc_link_hash_table *htab)
6138{
6139 unsigned int i;
6140
6141 if (htab->opd_abi)
6142 {
6143 for (i = 4; i < 12; i++)
6144 {
6145 bfd_put_32 (obfd, LD_R0_0R1 | i << 21 | (128 - (13 - i) * 8), p);
6146 p += 4;
6147 }
6148 bfd_put_32 (obfd, ADDI_R1_R1 | 128, p);
6149 p += 4;
6150 }
6151 else
6152 {
6153 for (i = 4; i < 12; i++)
6154 {
6155 bfd_put_32 (obfd, LD_R0_0R1 | i << 21 | (96 - (12 - i) * 8), p);
6156 p += 4;
6157 }
6158 bfd_put_32 (obfd, ADDI_R1_R1 | 96, p);
6159 p += 4;
6160 }
6161 bfd_put_32 (obfd, LD_R0_0R1 | 16, p);
6162 p += 4;
6163 bfd_put_32 (obfd, MTLR_R0, p);
6164 p += 4;
6165 bfd_put_32 (obfd, BLR, p);
6166 p += 4;
6167 return p;
6168}
6169
e86ce104
AM
6170/* Called via elf_link_hash_traverse to transfer dynamic linking
6171 information on function code symbol entries to their corresponding
6172 function descriptor symbol entries. */
deb0e272 6173
b34976b6 6174static bfd_boolean
4ce794b7 6175func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6176{
e86ce104 6177 struct bfd_link_info *info;
65f38f15 6178 struct ppc_link_hash_table *htab;
50bc7936
AM
6179 struct ppc_link_hash_entry *fh;
6180 struct ppc_link_hash_entry *fdh;
6181 bfd_boolean force_local;
5bd4f169 6182
ed7007c1 6183 fh = ppc_elf_hash_entry (h);
50bc7936 6184 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 6185 return TRUE;
e86ce104 6186
8c5b4e52
AM
6187 if (!fh->is_func)
6188 return TRUE;
6189
6190 if (fh->elf.root.root.string[0] != '.'
6191 || fh->elf.root.root.string[1] == '\0')
6192 return TRUE;
6193
4ce794b7 6194 info = inf;
65f38f15 6195 htab = ppc_hash_table (info);
4dfe6ac6
NC
6196 if (htab == NULL)
6197 return FALSE;
5bd4f169 6198
8c5b4e52
AM
6199 /* Find the corresponding function descriptor symbol. */
6200 fdh = lookup_fdh (fh, htab);
6201
c09bdfe5
AM
6202 /* Resolve undefined references to dot-symbols as the value
6203 in the function descriptor, if we have one in a regular object.
6204 This is to satisfy cases like ".quad .foo". Calls to functions
6205 in dynamic objects are handled elsewhere. */
8c5b4e52
AM
6206 if ((fh->elf.root.type == bfd_link_hash_undefined
6207 || fh->elf.root.type == bfd_link_hash_undefweak)
6208 && (fdh->elf.root.type == bfd_link_hash_defined
6209 || fdh->elf.root.type == bfd_link_hash_defweak)
b31867b6
AM
6210 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6211 && opd_entry_value (fdh->elf.root.u.def.section,
6212 fdh->elf.root.u.def.value,
c09bdfe5 6213 &fh->elf.root.u.def.section,
aef36ac1 6214 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
c09bdfe5 6215 {
b31867b6 6216 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 6217 fh->elf.forced_local = 1;
b31867b6
AM
6218 fh->elf.def_regular = fdh->elf.def_regular;
6219 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
6220 }
6221
8c5b4e52
AM
6222 if (!fh->elf.dynamic)
6223 {
6224 struct plt_entry *ent;
5bd4f169 6225
8c5b4e52
AM
6226 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6227 if (ent->plt.refcount > 0)
6228 break;
6229 if (ent == NULL)
6230 return TRUE;
6231 }
5bd4f169 6232
8c5b4e52 6233 /* Create a descriptor as undefined if necessary. */
50bc7936 6234 if (fdh == NULL
0e1862bb 6235 && !bfd_link_executable (info)
50bc7936
AM
6236 && (fh->elf.root.type == bfd_link_hash_undefined
6237 || fh->elf.root.type == bfd_link_hash_undefweak))
6238 {
908b32fc 6239 fdh = make_fdh (info, fh);
bb700d78
AM
6240 if (fdh == NULL)
6241 return FALSE;
50bc7936 6242 }
648cca2c 6243
8c5b4e52 6244 /* We can't support overriding of symbols on a fake descriptor. */
908b32fc
AM
6245 if (fdh != NULL
6246 && fdh->fake
8c5b4e52
AM
6247 && (fh->elf.root.type == bfd_link_hash_defined
6248 || fh->elf.root.type == bfd_link_hash_defweak))
6249 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
908b32fc 6250
8c5b4e52
AM
6251 /* Transfer dynamic linking information to the function descriptor. */
6252 if (fdh != NULL)
6253 {
f5385ebf
AM
6254 fdh->elf.ref_regular |= fh->elf.ref_regular;
6255 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6256 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6257 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
8c5b4e52
AM
6258 fdh->elf.dynamic |= fh->elf.dynamic;
6259 fdh->elf.needs_plt |= (fh->elf.needs_plt
6260 || fh->elf.type == STT_FUNC
6261 || fh->elf.type == STT_GNU_IFUNC);
6262 move_plt_plist (fh, fdh);
6263
6264 if (!fdh->elf.forced_local
6265 && fh->elf.dynindx != -1)
6266 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6267 return FALSE;
e86ce104
AM
6268 }
6269
50bc7936
AM
6270 /* Now that the info is on the function descriptor, clear the
6271 function code sym info. Any function code syms for which we
6272 don't have a definition in a regular file, we force local.
6273 This prevents a shared library from exporting syms that have
6274 been imported from another library. Function code syms that
6275 are really in the library we must leave global to prevent the
6276 linker dragging in a definition from a static library. */
93f3fa99
AM
6277 force_local = (!fh->elf.def_regular
6278 || fdh == NULL
6279 || !fdh->elf.def_regular
6280 || fdh->elf.forced_local);
50bc7936
AM
6281 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6282
b34976b6 6283 return TRUE;
e86ce104 6284}
40b8271b 6285
a4b6fadd
AM
6286static const struct sfpr_def_parms save_res_funcs[] =
6287 {
6288 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6289 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6290 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6291 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6292 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6293 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6294 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6295 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6296 { "._savef", 14, 31, savefpr, savefpr1_tail },
6297 { "._restf", 14, 31, restfpr, restfpr1_tail },
6298 { "_savevr_", 20, 31, savevr, savevr_tail },
6299 { "_restvr_", 20, 31, restvr, restvr_tail }
6300 };
6301
e86ce104 6302/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
6303 this hook to a) provide some gcc support functions, and b) transfer
6304 dynamic linking information gathered so far on function code symbol
6305 entries, to their corresponding function descriptor symbol entries. */
deb0e272 6306
b34976b6 6307static bfd_boolean
4ce794b7
AM
6308ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6309 struct bfd_link_info *info)
e86ce104
AM
6310{
6311 struct ppc_link_hash_table *htab;
6312
6313 htab = ppc_hash_table (info);
4dfe6ac6
NC
6314 if (htab == NULL)
6315 return FALSE;
6316
b32547cd
AM
6317 /* Provide any missing _save* and _rest* functions. */
6318 if (htab->sfpr != NULL)
6319 {
6320 unsigned int i;
6321
6322 htab->sfpr->size = 0;
6323 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
6324 if (!sfpr_define (info, &save_res_funcs[i], NULL))
6325 return FALSE;
6326 if (htab->sfpr->size == 0)
6327 htab->sfpr->flags |= SEC_EXCLUDE;
6328 }
6329
6330 if (bfd_link_relocatable (info))
6331 return TRUE;
6332
6333 if (htab->elf.hgot != NULL)
dba6fa9b
AM
6334 {
6335 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
6336 /* Make .TOC. defined so as to prevent it being made dynamic.
6337 The wrong value here is fixed later in ppc64_elf_set_toc. */
43417696
AM
6338 if (!htab->elf.hgot->def_regular
6339 || htab->elf.hgot->root.type != bfd_link_hash_defined)
6340 {
6341 htab->elf.hgot->root.type = bfd_link_hash_defined;
6342 htab->elf.hgot->root.u.def.value = 0;
6343 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
6344 htab->elf.hgot->def_regular = 1;
6345 htab->elf.hgot->root.linker_def = 1;
6346 }
dba6fa9b 6347 htab->elf.hgot->type = STT_OBJECT;
2cdcc330
AM
6348 htab->elf.hgot->other
6349 = (htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
dba6fa9b 6350 }
c66bb0ee 6351
8c5b4e52
AM
6352 if (htab->need_func_desc_adj)
6353 {
6354 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6355 htab->need_func_desc_adj = 0;
6356 }
805fc799 6357
b34976b6 6358 return TRUE;
e86ce104
AM
6359}
6360
d311bc8b 6361/* Return true if we have dynamic relocs against H or any of its weak
ab2477e1
AM
6362 aliases, that apply to read-only sections. Cannot be used after
6363 size_dynamic_sections. */
d311bc8b
AM
6364
6365static bfd_boolean
6366alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
6367{
ed7007c1 6368 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
d311bc8b
AM
6369 do
6370 {
5dbc8b37 6371 if (_bfd_elf_readonly_dynrelocs (&eh->elf))
d311bc8b 6372 return TRUE;
ed7007c1 6373 eh = ppc_elf_hash_entry (eh->elf.u.alias);
2cdcc330
AM
6374 }
6375 while (eh != NULL && &eh->elf != h);
d311bc8b
AM
6376
6377 return FALSE;
6378}
8a2058b5 6379
8a9e8e72
AM
6380/* Return whether EH has pc-relative dynamic relocs. */
6381
6382static bfd_boolean
6383pc_dynrelocs (struct ppc_link_hash_entry *eh)
6384{
6385 struct elf_dyn_relocs *p;
6386
190eb1dd 6387 for (p = eh->elf.dyn_relocs; p != NULL; p = p->next)
8a9e8e72
AM
6388 if (p->pc_count != 0)
6389 return TRUE;
6390 return FALSE;
6391}
6392
8a2058b5
AM
6393/* Return true if a global entry stub will be created for H. Valid
6394 for ELFv2 before plt entries have been allocated. */
6395
6396static bfd_boolean
6397global_entry_stub (struct elf_link_hash_entry *h)
6398{
6399 struct plt_entry *pent;
6400
6401 if (!h->pointer_equality_needed
6402 || h->def_regular)
6403 return FALSE;
6404
6405 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
6406 if (pent->plt.refcount > 0
6407 && pent->addend == 0)
6408 return TRUE;
6409
6410 return FALSE;
6411}
6412
e86ce104
AM
6413/* Adjust a symbol defined by a dynamic object and referenced by a
6414 regular object. The current definition is in some section of the
6415 dynamic object, but we're not including those sections. We have to
6416 change the definition to something the rest of the link can
6417 understand. */
6418
b34976b6 6419static bfd_boolean
4ce794b7
AM
6420ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6421 struct elf_link_hash_entry *h)
e86ce104
AM
6422{
6423 struct ppc_link_hash_table *htab;
5474d94f 6424 asection *s, *srel;
e86ce104
AM
6425
6426 htab = ppc_hash_table (info);
4dfe6ac6
NC
6427 if (htab == NULL)
6428 return FALSE;
e86ce104
AM
6429
6430 /* Deal with function syms. */
6431 if (h->type == STT_FUNC
e054468f 6432 || h->type == STT_GNU_IFUNC
f5385ebf 6433 || h->needs_plt)
e86ce104 6434 {
ed7007c1 6435 bfd_boolean local = (ppc_elf_hash_entry (h)->save_res
529fe20e
AM
6436 || SYMBOL_CALLS_LOCAL (info, h)
6437 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
6438 /* Discard dyn_relocs when non-pic if we've decided that a
6439 function symbol is local and not an ifunc. We keep dynamic
6440 relocs for ifuncs when local rather than always emitting a
6441 plt call stub for them and defining the symbol on the call
6442 stub. We can't do that for ELFv1 anyway (a function symbol
6443 is defined on a descriptor, not code) and it can be faster at
6444 run-time due to not needing to bounce through a stub. The
6445 dyn_relocs for ifuncs will be applied even in a static
6446 executable. */
6447 if (!bfd_link_pic (info)
6448 && h->type != STT_GNU_IFUNC
6449 && local)
190eb1dd 6450 h->dyn_relocs = NULL;
529fe20e 6451
e86ce104
AM
6452 /* Clear procedure linkage table information for any symbol that
6453 won't need a .plt entry. */
411e1bfb
AM
6454 struct plt_entry *ent;
6455 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6456 if (ent->plt.refcount > 0)
6457 break;
8387904d 6458 if (ent == NULL
2d7ad24e
AM
6459 || (h->type != STT_GNU_IFUNC
6460 && local
3e04d765 6461 && (htab->can_convert_all_inline_plt
ed7007c1 6462 || (ppc_elf_hash_entry (h)->tls_mask
3e04d765 6463 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
40b8271b 6464 {
411e1bfb 6465 h->plt.plist = NULL;
f5385ebf 6466 h->needs_plt = 0;
d1eca1e4 6467 h->pointer_equality_needed = 0;
40b8271b 6468 }
8a2058b5 6469 else if (abiversion (info->output_bfd) >= 2)
a345bc8d 6470 {
d1eca1e4
AM
6471 /* Taking a function's address in a read/write section
6472 doesn't require us to define the function symbol in the
6473 executable on a global entry stub. A dynamic reloc can
8a2058b5
AM
6474 be used instead. The reason we prefer a few more dynamic
6475 relocs is that calling via a global entry stub costs a
6476 few more instructions, and pointer_equality_needed causes
6477 extra work in ld.so when resolving these symbols. */
529fe20e 6478 if (global_entry_stub (h))
d1eca1e4 6479 {
5dbc8b37 6480 if (!_bfd_elf_readonly_dynrelocs (h))
529fe20e
AM
6481 {
6482 h->pointer_equality_needed = 0;
04383fd1
AM
6483 /* If we haven't seen a branch reloc and the symbol
6484 isn't an ifunc then we don't need a plt entry. */
529fe20e
AM
6485 if (!h->needs_plt)
6486 h->plt.plist = NULL;
6487 }
6488 else if (!bfd_link_pic (info))
6489 /* We are going to be defining the function symbol on the
6490 plt stub, so no dyn_relocs needed when non-pic. */
190eb1dd 6491 h->dyn_relocs = NULL;
d1eca1e4
AM
6492 }
6493
3988aed5
AM
6494 /* ELFv2 function symbols can't have copy relocs. */
6495 return TRUE;
6496 }
6497 else if (!h->needs_plt
5dbc8b37 6498 && !_bfd_elf_readonly_dynrelocs (h))
3988aed5 6499 {
04383fd1
AM
6500 /* If we haven't seen a branch reloc and the symbol isn't an
6501 ifunc then we don't need a plt entry. */
3988aed5
AM
6502 h->plt.plist = NULL;
6503 h->pointer_equality_needed = 0;
a345bc8d
AM
6504 return TRUE;
6505 }
5bd4f169 6506 }
bbd7ec4a 6507 else
411e1bfb 6508 h->plt.plist = NULL;
5bd4f169
AM
6509
6510 /* If this is a weak symbol, and there is a real definition, the
6511 processor independent code will have arranged for us to see the
6512 real definition first, and we can just use the same value. */
60d67dc8 6513 if (h->is_weakalias)
5bd4f169 6514 {
60d67dc8
AM
6515 struct elf_link_hash_entry *def = weakdef (h);
6516 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
6517 h->root.u.def.section = def->root.u.def.section;
6518 h->root.u.def.value = def->root.u.def.value;
4a7e5234
AM
6519 if (def->root.u.def.section == htab->elf.sdynbss
6520 || def->root.u.def.section == htab->elf.sdynrelro)
190eb1dd 6521 h->dyn_relocs = NULL;
b34976b6 6522 return TRUE;
5bd4f169
AM
6523 }
6524
5bd4f169
AM
6525 /* If we are creating a shared library, we must presume that the
6526 only references to the symbol are via the global offset table.
6527 For such cases we need not do anything here; the relocations will
6528 be handled correctly by relocate_section. */
ec73ddcd 6529 if (!bfd_link_executable (info))
b34976b6 6530 return TRUE;
5bd4f169 6531
65f38f15
AM
6532 /* If there are no references to this symbol that do not use the
6533 GOT, we don't need to generate a copy reloc. */
f5385ebf 6534 if (!h->non_got_ref)
b34976b6 6535 return TRUE;
65f38f15 6536
b186458a 6537 /* Don't generate a copy reloc for symbols defined in the executable. */
d93d1c80 6538 if (!h->def_dynamic || !h->ref_regular || h->def_regular
b186458a 6539
d93d1c80
AM
6540 /* If -z nocopyreloc was given, don't generate them either. */
6541 || info->nocopyreloc
a127494f 6542
dce2246a 6543 /* If we don't find any dynamic relocs in read-only sections, then
d93d1c80 6544 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1bdd8fac
AM
6545 || (ELIMINATE_COPY_RELOCS
6546 && !h->needs_copy
6547 && !alias_readonly_dynrelocs (h))
65f38f15 6548
d93d1c80
AM
6549 /* Protected variables do not work with .dynbss. The copy in
6550 .dynbss won't be used by the shared library with the protected
6551 definition for the variable. Text relocations are preferable
6552 to an incorrect program. */
6553 || h->protected_def)
529fe20e 6554 return TRUE;
a127494f 6555
e1c6cf61
AM
6556 if (h->type == STT_FUNC
6557 || h->type == STT_GNU_IFUNC)
97b639ba 6558 {
e1c6cf61
AM
6559 /* .dynbss copies of function symbols only work if we have
6560 ELFv1 dot-symbols. ELFv1 compilers since 2004 default to not
6561 use dot-symbols and set the function symbol size to the text
6562 size of the function rather than the size of the descriptor.
6563 That's wrong for copying a descriptor. */
ed7007c1 6564 if (ppc_elf_hash_entry (h)->oh == NULL
e1c6cf61
AM
6565 || !(h->size == 24 || h->size == 16))
6566 return TRUE;
6567
6568 /* We should never get here, but unfortunately there are old
6569 versions of gcc (circa gcc-3.2) that improperly for the
6570 ELFv1 ABI put initialized function pointers, vtable refs and
6571 suchlike in read-only sections. Allow them to proceed, but
6572 warn that this might break at runtime. */
25f53a85 6573 info->callbacks->einfo
c1c8c1ef 6574 (_("%P: copy reloc against `%pT' requires lazy plt linking; "
25f53a85 6575 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
6576 h->root.root.string);
6577 }
5d35169e
AM
6578
6579 /* This is a reference to a symbol defined by a dynamic object which
6580 is not a function. */
6581
5bd4f169
AM
6582 /* We must allocate the symbol in our .dynbss section, which will
6583 become part of the .bss section of the executable. There will be
6584 an entry for this symbol in the .dynsym section. The dynamic
6585 object will contain position independent code, so all references
6586 from the dynamic object to this symbol will go through the global
6587 offset table. The dynamic linker will use the .dynsym entry to
6588 determine the address it must put in the global offset table, so
6589 both the dynamic object and the regular object will refer to the
6590 same memory location for the variable. */
5474d94f
AM
6591 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6592 {
6593 s = htab->elf.sdynrelro;
6594 srel = htab->elf.sreldynrelro;
6595 }
6596 else
6597 {
6598 s = htab->elf.sdynbss;
6599 srel = htab->elf.srelbss;
6600 }
1d7e9d18 6601 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 6602 {
4a7e5234
AM
6603 /* We must generate a R_PPC64_COPY reloc to tell the dynamic
6604 linker to copy the initial value out of the dynamic object
6605 and into the runtime process image. */
5474d94f 6606 srel->size += sizeof (Elf64_External_Rela);
f5385ebf 6607 h->needs_copy = 1;
5bd4f169
AM
6608 }
6609
529fe20e 6610 /* We no longer want dyn_relocs. */
190eb1dd 6611 h->dyn_relocs = NULL;
6cabe1ea 6612 return _bfd_elf_adjust_dynamic_copy (info, h, s);
5bd4f169
AM
6613}
6614
e86ce104
AM
6615/* If given a function descriptor symbol, hide both the function code
6616 sym and the descriptor. */
6617static void
4ce794b7
AM
6618ppc64_elf_hide_symbol (struct bfd_link_info *info,
6619 struct elf_link_hash_entry *h,
6620 bfd_boolean force_local)
e86ce104 6621{
34814b9f 6622 struct ppc_link_hash_entry *eh;
e86ce104
AM
6623 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6624
87469ba2
AM
6625 if (ppc_hash_table (info) == NULL)
6626 return;
6627
ed7007c1 6628 eh = ppc_elf_hash_entry (h);
34814b9f 6629 if (eh->is_func_descriptor)
e86ce104 6630 {
34814b9f 6631 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 6632
721956f4 6633 if (fh == NULL)
d1329ca3
AM
6634 {
6635 const char *p, *q;
b8ac2841 6636 struct elf_link_hash_table *htab = elf_hash_table (info);
d1329ca3
AM
6637 char save;
6638
6639 /* We aren't supposed to use alloca in BFD because on
6640 systems which do not have alloca the version in libiberty
6641 calls xmalloc, which might cause the program to crash
6642 when it runs out of memory. This function doesn't have a
6643 return status, so there's no way to gracefully return an
6644 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
6645 accessed; It's either a string in an ELF string table,
6646 or allocated in an objalloc structure. */
d1329ca3 6647
34814b9f 6648 p = eh->elf.root.root.string - 1;
d1329ca3
AM
6649 save = *p;
6650 *(char *) p = '.';
ed7007c1
AM
6651 fh = ppc_elf_hash_entry (elf_link_hash_lookup (htab, p, FALSE,
6652 FALSE, FALSE));
d1329ca3
AM
6653 *(char *) p = save;
6654
6655 /* Unfortunately, if it so happens that the string we were
6656 looking for was allocated immediately before this string,
6657 then we overwrote the string terminator. That's the only
6658 reason the lookup should fail. */
6659 if (fh == NULL)
6660 {
34814b9f
AM
6661 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6662 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 6663 --q, --p;
34814b9f 6664 if (q < eh->elf.root.root.string && *p == '.')
ed7007c1
AM
6665 fh = ppc_elf_hash_entry (elf_link_hash_lookup (htab, p, FALSE,
6666 FALSE, FALSE));
d1329ca3
AM
6667 }
6668 if (fh != NULL)
6669 {
34814b9f
AM
6670 eh->oh = fh;
6671 fh->oh = eh;
d1329ca3
AM
6672 }
6673 }
e86ce104 6674 if (fh != NULL)
34814b9f 6675 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
6676 }
6677}
6678
411e1bfb 6679static bfd_boolean
8843416a
AM
6680get_sym_h (struct elf_link_hash_entry **hp,
6681 Elf_Internal_Sym **symp,
6682 asection **symsecp,
f961d9dd 6683 unsigned char **tls_maskp,
8843416a
AM
6684 Elf_Internal_Sym **locsymsp,
6685 unsigned long r_symndx,
6686 bfd *ibfd)
411e1bfb 6687{
0ffa91dd 6688 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
6689
6690 if (r_symndx >= symtab_hdr->sh_info)
6691 {
6692 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6693 struct elf_link_hash_entry *h;
6694
6695 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 6696 h = elf_follow_link (h);
411e1bfb
AM
6697
6698 if (hp != NULL)
6699 *hp = h;
6700
6701 if (symp != NULL)
6702 *symp = NULL;
6703
6704 if (symsecp != NULL)
6705 {
6706 asection *symsec = NULL;
6707 if (h->root.type == bfd_link_hash_defined
6708 || h->root.type == bfd_link_hash_defweak)
6709 symsec = h->root.u.def.section;
6710 *symsecp = symsec;
6711 }
6712
e7b938ca 6713 if (tls_maskp != NULL)
ed7007c1 6714 *tls_maskp = &ppc_elf_hash_entry (h)->tls_mask;
411e1bfb
AM
6715 }
6716 else
6717 {
6718 Elf_Internal_Sym *sym;
6719 Elf_Internal_Sym *locsyms = *locsymsp;
6720
6721 if (locsyms == NULL)
6722 {
6723 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6724 if (locsyms == NULL)
6725 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6726 symtab_hdr->sh_info,
6727 0, NULL, NULL, NULL);
6728 if (locsyms == NULL)
6729 return FALSE;
6730 *locsymsp = locsyms;
6731 }
6732 sym = locsyms + r_symndx;
6733
6734 if (hp != NULL)
6735 *hp = NULL;
6736
6737 if (symp != NULL)
6738 *symp = sym;
6739
6740 if (symsecp != NULL)
cb33740c 6741 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 6742
e7b938ca 6743 if (tls_maskp != NULL)
411e1bfb
AM
6744 {
6745 struct got_entry **lgot_ents;
f961d9dd 6746 unsigned char *tls_mask;
411e1bfb 6747
e7b938ca 6748 tls_mask = NULL;
411e1bfb
AM
6749 lgot_ents = elf_local_got_ents (ibfd);
6750 if (lgot_ents != NULL)
6751 {
e054468f
AM
6752 struct plt_entry **local_plt = (struct plt_entry **)
6753 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 6754 unsigned char *lgot_masks = (unsigned char *)
e054468f 6755 (local_plt + symtab_hdr->sh_info);
e7b938ca 6756 tls_mask = &lgot_masks[r_symndx];
411e1bfb 6757 }
e7b938ca 6758 *tls_maskp = tls_mask;
411e1bfb
AM
6759 }
6760 }
6761 return TRUE;
6762}
6763
e7b938ca 6764/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 6765 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 6766 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
6767
6768static int
f961d9dd 6769get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
6770 unsigned long *toc_symndx,
6771 bfd_vma *toc_addend,
0d4792f7 6772 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
6773 const Elf_Internal_Rela *rel,
6774 bfd *ibfd)
411e1bfb
AM
6775{
6776 unsigned long r_symndx;
0d4792f7 6777 int next_r;
411e1bfb
AM
6778 struct elf_link_hash_entry *h;
6779 Elf_Internal_Sym *sym;
6780 asection *sec;
6781 bfd_vma off;
6782
6783 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 6784 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 6785 return 0;
411e1bfb 6786
37da22e5
AM
6787 if ((*tls_maskp != NULL
6788 && (**tls_maskp & TLS_TLS) != 0
6789 && **tls_maskp != (TLS_TLS | TLS_MARK))
411e1bfb 6790 || sec == NULL
6bee8834 6791 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 6792 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 6793 return 1;
411e1bfb
AM
6794
6795 /* Look inside a TOC section too. */
6796 if (h != NULL)
6797 {
6798 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
6799 off = h->root.u.def.value;
6800 }
6801 else
6802 off = sym->st_value;
6803 off += rel->r_addend;
6804 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
6805 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
6806 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
6807 if (toc_symndx != NULL)
6808 *toc_symndx = r_symndx;
3a71aa26
AM
6809 if (toc_addend != NULL)
6810 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
6811 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6812 return 0;
854b41e7 6813 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
6814 && (next_r == -1 || next_r == -2))
6815 return 1 - next_r;
951fd09b 6816 return 1;
411e1bfb
AM
6817}
6818
3b421ab3
AM
6819/* Find (or create) an entry in the tocsave hash table. */
6820
6821static struct tocsave_entry *
6822tocsave_find (struct ppc_link_hash_table *htab,
6823 enum insert_option insert,
6824 Elf_Internal_Sym **local_syms,
6825 const Elf_Internal_Rela *irela,
6826 bfd *ibfd)
6827{
6828 unsigned long r_indx;
6829 struct elf_link_hash_entry *h;
6830 Elf_Internal_Sym *sym;
6831 struct tocsave_entry ent, *p;
6832 hashval_t hash;
6833 struct tocsave_entry **slot;
6834
6835 r_indx = ELF64_R_SYM (irela->r_info);
6836 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
6837 return NULL;
6838 if (ent.sec == NULL || ent.sec->output_section == NULL)
6839 {
4eca0228 6840 _bfd_error_handler
871b3ab2 6841 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
3b421ab3
AM
6842 return NULL;
6843 }
6844
6845 if (h != NULL)
6846 ent.offset = h->root.u.def.value;
6847 else
6848 ent.offset = sym->st_value;
6849 ent.offset += irela->r_addend;
6850
6851 hash = tocsave_htab_hash (&ent);
6852 slot = ((struct tocsave_entry **)
6853 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
6854 if (slot == NULL)
6855 return NULL;
6856
6857 if (*slot == NULL)
6858 {
6859 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
6860 if (p == NULL)
6861 return NULL;
6862 *p = ent;
6863 *slot = p;
6864 }
6865 return *slot;
6866}
6867
754021d0 6868/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 6869 code for the old ABI, these will already have been done. */
754021d0
AM
6870
6871static bfd_boolean
6872adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
6873{
6874 struct ppc_link_hash_entry *eh;
6875 asection *sym_sec;
74f0fb50 6876 struct _opd_sec_data *opd;
754021d0
AM
6877
6878 if (h->root.type == bfd_link_hash_indirect)
6879 return TRUE;
6880
754021d0
AM
6881 if (h->root.type != bfd_link_hash_defined
6882 && h->root.type != bfd_link_hash_defweak)
6883 return TRUE;
6884
ed7007c1 6885 eh = ppc_elf_hash_entry (h);
754021d0
AM
6886 if (eh->adjust_done)
6887 return TRUE;
6888
6889 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
6890 opd = get_opd_info (sym_sec);
6891 if (opd != NULL && opd->adjust != NULL)
754021d0 6892 {
51aecdc5 6893 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
4025353c
AM
6894 if (adjust == -1)
6895 {
6896 /* This entry has been deleted. */
b3fac117 6897 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
6898 if (dsec == NULL)
6899 {
6900 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 6901 if (discarded_section (dsec))
81688140 6902 {
b3fac117 6903 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
6904 break;
6905 }
6906 }
4025353c 6907 eh->elf.root.u.def.value = 0;
81688140 6908 eh->elf.root.u.def.section = dsec;
4025353c
AM
6909 }
6910 else
6911 eh->elf.root.u.def.value += adjust;
754021d0
AM
6912 eh->adjust_done = 1;
6913 }
6914 return TRUE;
6915}
6916
8c1d1bb8 6917/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 6918 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
6919 have already been determined. */
6920
6921static bfd_boolean
6922dec_dynrel_count (bfd_vma r_info,
6923 asection *sec,
6924 struct bfd_link_info *info,
6925 Elf_Internal_Sym **local_syms,
6926 struct elf_link_hash_entry *h,
19e08130 6927 Elf_Internal_Sym *sym)
8c1d1bb8
AM
6928{
6929 enum elf_ppc64_reloc_type r_type;
19e08130 6930 asection *sym_sec = NULL;
8c1d1bb8
AM
6931
6932 /* Can this reloc be dynamic? This switch, and later tests here
6933 should be kept in sync with the code in check_relocs. */
6934 r_type = ELF64_R_TYPE (r_info);
6935 switch (r_type)
6936 {
6937 default:
6938 return TRUE;
6939
1bdd8fac
AM
6940 case R_PPC64_TOC16:
6941 case R_PPC64_TOC16_DS:
6942 case R_PPC64_TOC16_LO:
6943 case R_PPC64_TOC16_HI:
6944 case R_PPC64_TOC16_HA:
6945 case R_PPC64_TOC16_LO_DS:
6946 if (h == NULL)
6947 return TRUE;
6948 break;
6949
8c1d1bb8
AM
6950 case R_PPC64_TPREL16:
6951 case R_PPC64_TPREL16_LO:
6952 case R_PPC64_TPREL16_HI:
6953 case R_PPC64_TPREL16_HA:
6954 case R_PPC64_TPREL16_DS:
6955 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
6956 case R_PPC64_TPREL16_HIGH:
6957 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
6958 case R_PPC64_TPREL16_HIGHER:
6959 case R_PPC64_TPREL16_HIGHERA:
6960 case R_PPC64_TPREL16_HIGHEST:
6961 case R_PPC64_TPREL16_HIGHESTA:
8c1d1bb8 6962 case R_PPC64_TPREL64:
c213164a 6963 case R_PPC64_TPREL34:
8c1d1bb8
AM
6964 case R_PPC64_DTPMOD64:
6965 case R_PPC64_DTPREL64:
6966 case R_PPC64_ADDR64:
6967 case R_PPC64_REL30:
6968 case R_PPC64_REL32:
6969 case R_PPC64_REL64:
6970 case R_PPC64_ADDR14:
6971 case R_PPC64_ADDR14_BRNTAKEN:
6972 case R_PPC64_ADDR14_BRTAKEN:
6973 case R_PPC64_ADDR16:
6974 case R_PPC64_ADDR16_DS:
6975 case R_PPC64_ADDR16_HA:
6976 case R_PPC64_ADDR16_HI:
f9c6b907
AM
6977 case R_PPC64_ADDR16_HIGH:
6978 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
6979 case R_PPC64_ADDR16_HIGHER:
6980 case R_PPC64_ADDR16_HIGHERA:
6981 case R_PPC64_ADDR16_HIGHEST:
6982 case R_PPC64_ADDR16_HIGHESTA:
6983 case R_PPC64_ADDR16_LO:
6984 case R_PPC64_ADDR16_LO_DS:
6985 case R_PPC64_ADDR24:
6986 case R_PPC64_ADDR32:
6987 case R_PPC64_UADDR16:
6988 case R_PPC64_UADDR32:
6989 case R_PPC64_UADDR64:
6990 case R_PPC64_TOC:
5663e321
AM
6991 case R_PPC64_D34:
6992 case R_PPC64_D34_LO:
6993 case R_PPC64_D34_HI30:
6994 case R_PPC64_D34_HA30:
6995 case R_PPC64_ADDR16_HIGHER34:
6996 case R_PPC64_ADDR16_HIGHERA34:
6997 case R_PPC64_ADDR16_HIGHEST34:
6998 case R_PPC64_ADDR16_HIGHESTA34:
6999 case R_PPC64_D28:
8c1d1bb8
AM
7000 break;
7001 }
7002
7003 if (local_syms != NULL)
7004 {
7005 unsigned long r_symndx;
8c1d1bb8
AM
7006 bfd *ibfd = sec->owner;
7007
7008 r_symndx = ELF64_R_SYM (r_info);
7009 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7010 return FALSE;
7011 }
7012
ec73ddcd
AM
7013 if ((h != NULL
7014 && (h->root.type == bfd_link_hash_defweak
7015 || !h->def_regular))
7016 || (h != NULL
7017 && !bfd_link_executable (info)
7018 && !SYMBOLIC_BIND (info, h))
7019 || (bfd_link_pic (info)
7020 && must_be_dyn_reloc (info, r_type))
7021 || (!bfd_link_pic (info)
7022 && (h != NULL
7023 ? h->type == STT_GNU_IFUNC
7024 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
8c1d1bb8
AM
7025 ;
7026 else
7027 return TRUE;
7028
7029 if (h != NULL)
6edfbbad 7030 {
19e08130
AM
7031 struct elf_dyn_relocs *p;
7032 struct elf_dyn_relocs **pp;
190eb1dd 7033 pp = &h->dyn_relocs;
19e08130
AM
7034
7035 /* elf_gc_sweep may have already removed all dyn relocs associated
7036 with local syms for a given section. Also, symbol flags are
7037 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7038 report a dynreloc miscount. */
7039 if (*pp == NULL && info->gc_sections)
7040 return TRUE;
7041
7042 while ((p = *pp) != NULL)
60124e18 7043 {
19e08130
AM
7044 if (p->sec == sec)
7045 {
7046 if (!must_be_dyn_reloc (info, r_type))
7047 p->pc_count -= 1;
7048 p->count -= 1;
7049 if (p->count == 0)
7050 *pp = p->next;
7051 return TRUE;
7052 }
7053 pp = &p->next;
60124e18 7054 }
6edfbbad 7055 }
19e08130
AM
7056 else
7057 {
7058 struct ppc_dyn_relocs *p;
7059 struct ppc_dyn_relocs **pp;
7060 void *vpp;
7061 bfd_boolean is_ifunc;
8c1d1bb8 7062
19e08130
AM
7063 if (local_syms == NULL)
7064 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7065 if (sym_sec == NULL)
7066 sym_sec = sec;
c57da1a7 7067
19e08130
AM
7068 vpp = &elf_section_data (sym_sec)->local_dynrel;
7069 pp = (struct ppc_dyn_relocs **) vpp;
7070
7071 if (*pp == NULL && info->gc_sections)
7072 return TRUE;
7073
7074 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7075 while ((p = *pp) != NULL)
8c1d1bb8 7076 {
19e08130
AM
7077 if (p->sec == sec && p->ifunc == is_ifunc)
7078 {
7079 p->count -= 1;
7080 if (p->count == 0)
7081 *pp = p->next;
7082 return TRUE;
7083 }
7084 pp = &p->next;
8c1d1bb8 7085 }
8c1d1bb8
AM
7086 }
7087
695344c0 7088 /* xgettext:c-format */
cf97bcb0
AM
7089 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"),
7090 sec->owner, sec);
8c1d1bb8
AM
7091 bfd_set_error (bfd_error_bad_value);
7092 return FALSE;
7093}
7094
754021d0
AM
7095/* Remove unused Official Procedure Descriptor entries. Currently we
7096 only remove those associated with functions in discarded link-once
7097 sections, or weakly defined functions that have been overridden. It
7098 would be possible to remove many more entries for statically linked
7099 applications. */
7100
b34976b6 7101bfd_boolean
e7d1c40c 7102ppc64_elf_edit_opd (struct bfd_link_info *info)
1e2f5b6e
AM
7103{
7104 bfd *ibfd;
754021d0 7105 bfd_boolean some_edited = FALSE;
3f764659 7106 asection *need_pad = NULL;
e7d1c40c
AM
7107 struct ppc_link_hash_table *htab;
7108
7109 htab = ppc_hash_table (info);
7110 if (htab == NULL)
7111 return FALSE;
1e2f5b6e 7112
c72f2fb2 7113 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1e2f5b6e
AM
7114 {
7115 asection *sec;
7116 Elf_Internal_Rela *relstart, *rel, *relend;
7117 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7118 Elf_Internal_Sym *local_syms;
74f0fb50 7119 struct _opd_sec_data *opd;
51aecdc5 7120 bfd_boolean need_edit, add_aux_fields, broken;
3f764659 7121 bfd_size_type cnt_16b = 0;
1e2f5b6e 7122
854b41e7
AM
7123 if (!is_ppc64_elf (ibfd))
7124 continue;
7125
1e2f5b6e 7126 sec = bfd_get_section_by_name (ibfd, ".opd");
46de2a7c 7127 if (sec == NULL || sec->size == 0)
1e2f5b6e
AM
7128 continue;
7129
dbaa2011 7130 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7131 continue;
7132
1e2f5b6e
AM
7133 if (sec->output_section == bfd_abs_section_ptr)
7134 continue;
7135
7136 /* Look through the section relocs. */
7137 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7138 continue;
7139
6cdc0ccc 7140 local_syms = NULL;
0ffa91dd 7141 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7142
7143 /* Read the relocations. */
4ce794b7 7144 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7145 info->keep_memory);
1e2f5b6e 7146 if (relstart == NULL)
b34976b6 7147 return FALSE;
1e2f5b6e
AM
7148
7149 /* First run through the relocs to check they are sane, and to
7150 determine whether we need to edit this opd section. */
b34976b6 7151 need_edit = FALSE;
51aecdc5 7152 broken = FALSE;
3f764659 7153 need_pad = sec;
1e2f5b6e 7154 relend = relstart + sec->reloc_count;
50bc7936 7155 for (rel = relstart; rel < relend; )
1e2f5b6e 7156 {
04c9666a 7157 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7158 unsigned long r_symndx;
7159 asection *sym_sec;
7160 struct elf_link_hash_entry *h;
7161 Elf_Internal_Sym *sym;
51aecdc5 7162 bfd_vma offset;
1e2f5b6e 7163
51aecdc5 7164 /* .opd contains an array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7165 only interested in the reloc pointing to a function entry
7166 point. */
51aecdc5
AM
7167 offset = rel->r_offset;
7168 if (rel + 1 == relend
7169 || rel[1].r_offset != offset + 8)
1e2f5b6e
AM
7170 {
7171 /* If someone messes with .opd alignment then after a
7172 "ld -r" we might have padding in the middle of .opd.
7173 Also, there's nothing to prevent someone putting
7174 something silly in .opd with the assembler. No .opd
b34976b6 7175 optimization for them! */
3f764659 7176 broken_opd:
4eca0228 7177 _bfd_error_handler
871b3ab2 7178 (_("%pB: .opd is not a regular array of opd entries"), ibfd);
51aecdc5 7179 broken = TRUE;
1e2f5b6e
AM
7180 break;
7181 }
7182
50bc7936
AM
7183 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7184 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7185 {
4eca0228 7186 _bfd_error_handler
695344c0 7187 /* xgettext:c-format */
871b3ab2 7188 (_("%pB: unexpected reloc type %u in .opd section"),
d003868e 7189 ibfd, r_type);
51aecdc5 7190 broken = TRUE;
50bc7936
AM
7191 break;
7192 }
7193
1e2f5b6e 7194 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7195 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7196 r_symndx, ibfd))
50bc7936 7197 goto error_ret;
1e2f5b6e
AM
7198
7199 if (sym_sec == NULL || sym_sec->owner == NULL)
7200 {
411e1bfb
AM
7201 const char *sym_name;
7202 if (h != NULL)
7203 sym_name = h->root.root.string;
7204 else
26c61ae5
L
7205 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7206 sym_sec);
411e1bfb 7207
4eca0228 7208 _bfd_error_handler
695344c0 7209 /* xgettext:c-format */
871b3ab2 7210 (_("%pB: undefined sym `%s' in .opd section"),
d003868e 7211 ibfd, sym_name);
51aecdc5 7212 broken = TRUE;
1e2f5b6e
AM
7213 break;
7214 }
7215
51020317
AM
7216 /* opd entries are always for functions defined in the
7217 current input bfd. If the symbol isn't defined in the
7218 input bfd, then we won't be using the function in this
7219 bfd; It must be defined in a linkonce section in another
7220 bfd, or is weak. It's also possible that we are
7221 discarding the function due to a linker script /DISCARD/,
7222 which we test for via the output_section. */
7223 if (sym_sec->owner != ibfd
7224 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 7225 need_edit = TRUE;
1e2f5b6e 7226
50bc7936 7227 rel += 2;
51aecdc5
AM
7228 if (rel + 1 == relend
7229 || (rel + 2 < relend
7230 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
7231 ++rel;
7232
7233 if (rel == relend)
3f764659
JJ
7234 {
7235 if (sec->size == offset + 24)
7236 {
7237 need_pad = NULL;
7238 break;
7239 }
51aecdc5 7240 if (sec->size == offset + 16)
3f764659
JJ
7241 {
7242 cnt_16b++;
7243 break;
7244 }
7245 goto broken_opd;
7246 }
3f764659
JJ
7247 else if (rel + 1 < relend
7248 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7249 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7250 {
51aecdc5
AM
7251 if (rel[0].r_offset == offset + 16)
7252 cnt_16b++;
7253 else if (rel[0].r_offset != offset + 24)
7254 goto broken_opd;
3f764659
JJ
7255 }
7256 else
7257 goto broken_opd;
1e2f5b6e
AM
7258 }
7259
e7d1c40c 7260 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
3f764659 7261
51aecdc5 7262 if (!broken && (need_edit || add_aux_fields))
1e2f5b6e
AM
7263 {
7264 Elf_Internal_Rela *write_rel;
d4730f92 7265 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 7266 bfd_byte *rptr, *wptr;
983bddc8 7267 bfd_byte *new_contents;
74f0fb50
AM
7268 bfd_size_type amt;
7269
983bddc8 7270 new_contents = NULL;
51aecdc5 7271 amt = OPD_NDX (sec->size) * sizeof (long);
74f0fb50 7272 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 7273 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50
AM
7274 if (opd->adjust == NULL)
7275 return FALSE;
1e2f5b6e
AM
7276
7277 /* This seems a waste of time as input .opd sections are all
7278 zeros as generated by gcc, but I suppose there's no reason
7279 this will always be so. We might start putting something in
7280 the third word of .opd entries. */
7281 if ((sec->flags & SEC_IN_MEMORY) == 0)
7282 {
eea6121a
AM
7283 bfd_byte *loc;
7284 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 7285 {
c9594989 7286 free (loc);
50bc7936 7287 error_ret:
c9594989 7288 if (symtab_hdr->contents != (unsigned char *) local_syms)
6cdc0ccc 7289 free (local_syms);
6cdc0ccc
AM
7290 if (elf_section_data (sec)->relocs != relstart)
7291 free (relstart);
b34976b6 7292 return FALSE;
6cdc0ccc 7293 }
1e2f5b6e
AM
7294 sec->contents = loc;
7295 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7296 }
7297
7298 elf_section_data (sec)->relocs = relstart;
7299
3f764659 7300 new_contents = sec->contents;
3f764659
JJ
7301 if (add_aux_fields)
7302 {
7303 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7304 if (new_contents == NULL)
7305 return FALSE;
51aecdc5 7306 need_pad = NULL;
3f764659 7307 }
b4f4e59f
AM
7308 wptr = new_contents;
7309 rptr = sec->contents;
1e2f5b6e 7310 write_rel = relstart;
51aecdc5 7311 for (rel = relstart; rel < relend; )
1e2f5b6e 7312 {
50bc7936
AM
7313 unsigned long r_symndx;
7314 asection *sym_sec;
7315 struct elf_link_hash_entry *h;
51aecdc5 7316 struct ppc_link_hash_entry *fdh = NULL;
50bc7936 7317 Elf_Internal_Sym *sym;
51aecdc5
AM
7318 long opd_ent_size;
7319 Elf_Internal_Rela *next_rel;
7320 bfd_boolean skip;
50bc7936
AM
7321
7322 r_symndx = ELF64_R_SYM (rel->r_info);
7323 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 7324 r_symndx, ibfd))
50bc7936
AM
7325 goto error_ret;
7326
51aecdc5
AM
7327 next_rel = rel + 2;
7328 if (next_rel + 1 == relend
7329 || (next_rel + 2 < relend
7330 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
7331 ++next_rel;
7332
7333 /* See if the .opd entry is full 24 byte or
7334 16 byte (with fd_aux entry overlapped with next
7335 fd_func). */
7336 opd_ent_size = 24;
7337 if (next_rel == relend)
1e2f5b6e 7338 {
51aecdc5 7339 if (sec->size == rel->r_offset + 16)
3f764659 7340 opd_ent_size = 16;
51aecdc5
AM
7341 }
7342 else if (next_rel->r_offset == rel->r_offset + 16)
7343 opd_ent_size = 16;
3f764659 7344
51aecdc5
AM
7345 if (h != NULL
7346 && h->root.root.string[0] == '.')
7347 {
ed7007c1 7348 fdh = ppc_elf_hash_entry (h)->oh;
8c5b4e52
AM
7349 if (fdh != NULL)
7350 {
7351 fdh = ppc_follow_link (fdh);
7352 if (fdh->elf.root.type != bfd_link_hash_defined
7353 && fdh->elf.root.type != bfd_link_hash_defweak)
7354 fdh = NULL;
7355 }
51aecdc5 7356 }
1e2f5b6e 7357
51aecdc5
AM
7358 skip = (sym_sec->owner != ibfd
7359 || sym_sec->output_section == bfd_abs_section_ptr);
7360 if (skip)
7361 {
7362 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7 7363 {
51aecdc5
AM
7364 /* Arrange for the function descriptor sym
7365 to be dropped. */
7366 fdh->elf.root.u.def.value = 0;
7367 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 7368 }
51aecdc5 7369 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
1e2f5b6e 7370
0e1862bb 7371 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
51aecdc5
AM
7372 rel = next_rel;
7373 else
7374 while (1)
7375 {
7376 if (!dec_dynrel_count (rel->r_info, sec, info,
7377 NULL, h, sym))
7378 goto error_ret;
754021d0 7379
51aecdc5
AM
7380 if (++rel == next_rel)
7381 break;
1e2f5b6e 7382
51aecdc5
AM
7383 r_symndx = ELF64_R_SYM (rel->r_info);
7384 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7385 r_symndx, ibfd))
7386 goto error_ret;
7387 }
50bc7936
AM
7388 }
7389 else
1e2f5b6e 7390 {
51aecdc5
AM
7391 /* We'll be keeping this opd entry. */
7392 long adjust;
7393
7394 if (fdh != NULL)
7395 {
7396 /* Redefine the function descriptor symbol to
7397 this location in the opd section. It is
7398 necessary to update the value here rather
7399 than using an array of adjustments as we do
7400 for local symbols, because various places
7401 in the generic ELF code use the value
7402 stored in u.def.value. */
7403 fdh->elf.root.u.def.value = wptr - new_contents;
7404 fdh->adjust_done = 1;
7405 }
7406
7407 /* Local syms are a bit tricky. We could
7408 tweak them as they can be cached, but
7409 we'd need to look through the local syms
7410 for the function descriptor sym which we
7411 don't have at the moment. So keep an
7412 array of adjustments. */
7413 adjust = (wptr - new_contents) - (rptr - sec->contents);
7414 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
7415
7416 if (wptr != rptr)
7417 memcpy (wptr, rptr, opd_ent_size);
7418 wptr += opd_ent_size;
7419 if (add_aux_fields && opd_ent_size == 16)
7420 {
7421 memset (wptr, '\0', 8);
7422 wptr += 8;
7423 }
7424
50bc7936 7425 /* We need to adjust any reloc offsets to point to the
51aecdc5
AM
7426 new opd entries. */
7427 for ( ; rel != next_rel; ++rel)
7428 {
7429 rel->r_offset += adjust;
7430 if (write_rel != rel)
7431 memcpy (write_rel, rel, sizeof (*rel));
7432 ++write_rel;
7433 }
1e2f5b6e 7434 }
51aecdc5
AM
7435
7436 rptr += opd_ent_size;
1e2f5b6e
AM
7437 }
7438
3f764659 7439 sec->size = wptr - new_contents;
1e2f5b6e 7440 sec->reloc_count = write_rel - relstart;
3f764659
JJ
7441 if (add_aux_fields)
7442 {
7443 free (sec->contents);
7444 sec->contents = new_contents;
7445 }
7446
05bf9422 7447 /* Fudge the header size too, as this is used later in
cdcf6e38 7448 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
7449 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7450 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
754021d0 7451 some_edited = TRUE;
1e2f5b6e 7452 }
6cdc0ccc 7453 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 7454 free (relstart);
6cdc0ccc 7455
411e1bfb
AM
7456 if (local_syms != NULL
7457 && symtab_hdr->contents != (unsigned char *) local_syms)
7458 {
7459 if (!info->keep_memory)
7460 free (local_syms);
7461 else
7462 symtab_hdr->contents = (unsigned char *) local_syms;
7463 }
7464 }
7465
754021d0
AM
7466 if (some_edited)
7467 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7468
3f764659
JJ
7469 /* If we are doing a final link and the last .opd entry is just 16 byte
7470 long, add a 8 byte padding after it. */
0e1862bb 7471 if (need_pad != NULL && !bfd_link_relocatable (info))
3f764659
JJ
7472 {
7473 bfd_byte *p;
7474
7475 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7476 {
7477 BFD_ASSERT (need_pad->size > 0);
7478
7479 p = bfd_malloc (need_pad->size + 8);
7480 if (p == NULL)
7481 return FALSE;
699733f6 7482
2cdcc330
AM
7483 if (!bfd_get_section_contents (need_pad->owner, need_pad,
7484 p, 0, need_pad->size))
3f764659
JJ
7485 return FALSE;
7486
7487 need_pad->contents = p;
7488 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7489 }
7490 else
7491 {
7492 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7493 if (p == NULL)
7494 return FALSE;
7495
7496 need_pad->contents = p;
7497 }
7498
7499 memset (need_pad->contents + need_pad->size, 0, 8);
7500 need_pad->size += 8;
7501 }
7502
411e1bfb
AM
7503 return TRUE;
7504}
7505
3e04d765
AM
7506/* Analyze inline PLT call relocations to see whether calls to locally
7507 defined functions can be converted to direct calls. */
7508
7509bfd_boolean
7510ppc64_elf_inline_plt (struct bfd_link_info *info)
7511{
7512 struct ppc_link_hash_table *htab;
7513 bfd *ibfd;
7514 asection *sec;
7515 bfd_vma low_vma, high_vma, limit;
7516
7517 htab = ppc_hash_table (info);
7518 if (htab == NULL)
7519 return FALSE;
7520
7521 /* A bl insn can reach -0x2000000 to 0x1fffffc. The limit is
7522 reduced somewhat to cater for possible stubs that might be added
7523 between the call and its destination. */
7524 if (htab->params->group_size < 0)
7525 {
7526 limit = -htab->params->group_size;
7527 if (limit == 1)
7528 limit = 0x1e00000;
7529 }
7530 else
7531 {
7532 limit = htab->params->group_size;
7533 if (limit == 1)
7534 limit = 0x1c00000;
7535 }
7536
7537 low_vma = -1;
7538 high_vma = 0;
7539 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
7540 if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
7541 {
7542 if (low_vma > sec->vma)
7543 low_vma = sec->vma;
7544 if (high_vma < sec->vma + sec->size)
7545 high_vma = sec->vma + sec->size;
7546 }
7547
7548 /* If a "bl" can reach anywhere in local code sections, then we can
7549 convert all inline PLT sequences to direct calls when the symbol
7550 is local. */
7551 if (high_vma - low_vma < limit)
7552 {
7553 htab->can_convert_all_inline_plt = 1;
7554 return TRUE;
7555 }
7556
7557 /* Otherwise, go looking through relocs for cases where a direct
7558 call won't reach. Mark the symbol on any such reloc to disable
7559 the optimization and keep the PLT entry as it seems likely that
7560 this will be better than creating trampolines. Note that this
7561 will disable the optimization for all inline PLT calls to a
7562 particular symbol, not just those that won't reach. The
7563 difficulty in doing a more precise optimization is that the
7564 linker needs to make a decision depending on whether a
7565 particular R_PPC64_PLTCALL insn can be turned into a direct
7566 call, for each of the R_PPC64_PLTSEQ and R_PPC64_PLT16* insns in
7567 the sequence, and there is nothing that ties those relocs
7568 together except their symbol. */
7569
7570 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7571 {
7572 Elf_Internal_Shdr *symtab_hdr;
7573 Elf_Internal_Sym *local_syms;
7574
7575 if (!is_ppc64_elf (ibfd))
7576 continue;
7577
7578 local_syms = NULL;
7579 symtab_hdr = &elf_symtab_hdr (ibfd);
7580
7581 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7582 if (ppc64_elf_section_data (sec)->has_pltcall
7583 && !bfd_is_abs_section (sec->output_section))
7584 {
7585 Elf_Internal_Rela *relstart, *rel, *relend;
7586
7587 /* Read the relocations. */
7588 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7589 info->keep_memory);
7590 if (relstart == NULL)
7591 return FALSE;
7592
7593 relend = relstart + sec->reloc_count;
435edf0b 7594 for (rel = relstart; rel < relend; rel++)
3e04d765
AM
7595 {
7596 enum elf_ppc64_reloc_type r_type;
7597 unsigned long r_symndx;
7598 asection *sym_sec;
7599 struct elf_link_hash_entry *h;
7600 Elf_Internal_Sym *sym;
7601 unsigned char *tls_maskp;
7602
7603 r_type = ELF64_R_TYPE (rel->r_info);
5663e321
AM
7604 if (r_type != R_PPC64_PLTCALL
7605 && r_type != R_PPC64_PLTCALL_NOTOC)
3e04d765
AM
7606 continue;
7607
7608 r_symndx = ELF64_R_SYM (rel->r_info);
7609 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
7610 r_symndx, ibfd))
7611 {
7612 if (elf_section_data (sec)->relocs != relstart)
7613 free (relstart);
c9594989 7614 if (symtab_hdr->contents != (bfd_byte *) local_syms)
3e04d765
AM
7615 free (local_syms);
7616 return FALSE;
7617 }
7618
7619 if (sym_sec != NULL && sym_sec->output_section != NULL)
7620 {
7621 bfd_vma from, to;
7622 if (h != NULL)
7623 to = h->root.u.def.value;
7624 else
7625 to = sym->st_value;
7626 to += (rel->r_addend
7627 + sym_sec->output_offset
7628 + sym_sec->output_section->vma);
7629 from = (rel->r_offset
7630 + sec->output_offset
7631 + sec->output_section->vma);
5663e321
AM
7632 if (to - from + limit < 2 * limit
7633 && !(r_type == R_PPC64_PLTCALL_NOTOC
7634 && (((h ? h->other : sym->st_other)
7635 & STO_PPC64_LOCAL_MASK)
4a4e7361 7636 > 1 << STO_PPC64_LOCAL_BIT)))
3e04d765
AM
7637 *tls_maskp &= ~PLT_KEEP;
7638 }
7639 }
7640 if (elf_section_data (sec)->relocs != relstart)
7641 free (relstart);
7642 }
7643
7644 if (local_syms != NULL
7645 && symtab_hdr->contents != (unsigned char *) local_syms)
7646 {
7647 if (!info->keep_memory)
7648 free (local_syms);
7649 else
7650 symtab_hdr->contents = (unsigned char *) local_syms;
7651 }
7652 }
7653
7654 return TRUE;
7655}
7656
e1918d23 7657/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 7658
e1918d23 7659asection *
e7d1c40c 7660ppc64_elf_tls_setup (struct bfd_link_info *info)
411e1bfb 7661{
411e1bfb 7662 struct ppc_link_hash_table *htab;
9e7028aa 7663 struct elf_link_hash_entry *tga, *tga_fd, *desc, *desc_fd;
411e1bfb 7664
411e1bfb 7665 htab = ppc_hash_table (info);
4dfe6ac6
NC
7666 if (htab == NULL)
7667 return NULL;
7668
ee67d69a
AM
7669 if (abiversion (info->output_bfd) == 1)
7670 htab->opd_abi = 1;
7671
e7d1c40c 7672 if (htab->params->no_multi_toc)
33c0ec9d
AM
7673 htab->do_multi_toc = 0;
7674 else if (!htab->do_multi_toc)
e7d1c40c 7675 htab->params->no_multi_toc = 1;
33c0ec9d 7676
8b5f1ed8
AM
7677 /* Default to --no-plt-localentry, as this option can cause problems
7678 with symbol interposition. For example, glibc libpthread.so and
7679 libc.so duplicate many pthread symbols, with a fallback
7680 implementation in libc.so. In some cases the fallback does more
7681 work than the pthread implementation. __pthread_condattr_destroy
7682 is one such symbol: the libpthread.so implementation is
7683 localentry:0 while the libc.so implementation is localentry:8.
7684 An app that "cleverly" uses dlopen to only load necessary
7685 libraries at runtime may omit loading libpthread.so when not
7686 running multi-threaded, which then results in the libc.so
7687 fallback symbols being used and ld.so complaining. Now there
7688 are workarounds in ld (see non_zero_localentry) to detect the
7689 pthread situation, but that may not be the only case where
7690 --plt-localentry can cause trouble. */
f378ab09 7691 if (htab->params->plt_localentry0 < 0)
8b5f1ed8 7692 htab->params->plt_localentry0 = 0;
d44c746a
AM
7693 if (htab->params->plt_localentry0
7694 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
7695 FALSE, FALSE, FALSE) == NULL)
cf97bcb0
AM
7696 _bfd_error_handler
7697 (_("warning: --plt-localentry is especially dangerous without "
7698 "ld.so support to detect ABI violations"));
f378ab09 7699
9e7028aa
AM
7700 tga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7701 FALSE, FALSE, TRUE);
7702 htab->tls_get_addr = ppc_elf_hash_entry (tga);
7703
a7f2871e 7704 /* Move dynamic linking info to the function descriptor sym. */
9e7028aa
AM
7705 if (tga != NULL)
7706 func_desc_adjust (tga, info);
7707 tga_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7708 FALSE, FALSE, TRUE);
7709 htab->tls_get_addr_fd = ppc_elf_hash_entry (tga_fd);
7710
7711 desc = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_desc",
7712 FALSE, FALSE, TRUE);
7713 htab->tga_desc = ppc_elf_hash_entry (desc);
7714 if (desc != NULL)
7715 func_desc_adjust (desc, info);
7716 desc_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_desc",
7717 FALSE, FALSE, TRUE);
7718 htab->tga_desc_fd = ppc_elf_hash_entry (desc_fd);
7719
7c9cf415 7720 if (htab->params->tls_get_addr_opt)
a7f2871e 7721 {
9e7028aa 7722 struct elf_link_hash_entry *opt, *opt_fd;
a7f2871e
AM
7723
7724 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7725 FALSE, FALSE, TRUE);
7726 if (opt != NULL)
7727 func_desc_adjust (opt, info);
7728 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7729 FALSE, FALSE, TRUE);
7730 if (opt_fd != NULL
7731 && (opt_fd->root.type == bfd_link_hash_defined
7732 || opt_fd->root.type == bfd_link_hash_defweak))
7733 {
7734 /* If glibc supports an optimized __tls_get_addr call stub,
7735 signalled by the presence of __tls_get_addr_opt, and we'll
7736 be calling __tls_get_addr via a plt call stub, then
7737 make __tls_get_addr point to __tls_get_addr_opt. */
9e7028aa
AM
7738 if (!(htab->elf.dynamic_sections_created
7739 && tga_fd != NULL
7740 && (tga_fd->type == STT_FUNC
7741 || tga_fd->needs_plt)
7742 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
7743 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd))))
7744 tga_fd = NULL;
7745 if (!(htab->elf.dynamic_sections_created
7746 && desc_fd != NULL
7747 && (desc_fd->type == STT_FUNC
7748 || desc_fd->needs_plt)
7749 && !(SYMBOL_CALLS_LOCAL (info, desc_fd)
7750 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, desc_fd))))
7751 desc_fd = NULL;
7752
7753 if (tga_fd != NULL || desc_fd != NULL)
7754 {
7755 struct plt_entry *ent = NULL;
7756
7757 if (tga_fd != NULL)
7758 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7759 if (ent->plt.refcount > 0)
7760 break;
7761 if (ent == NULL && desc_fd != NULL)
7762 for (ent = desc_fd->plt.plist; ent != NULL; ent = ent->next)
7763 if (ent->plt.refcount > 0)
7764 break;
a7f2871e
AM
7765 if (ent != NULL)
7766 {
9e7028aa
AM
7767 if (tga_fd != NULL)
7768 {
7769 tga_fd->root.type = bfd_link_hash_indirect;
7770 tga_fd->root.u.i.link = &opt_fd->root;
7771 tga_fd->root.u.i.warning = NULL;
7772 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
7773 }
7774 if (desc_fd != NULL)
7775 {
7776 desc_fd->root.type = bfd_link_hash_indirect;
7777 desc_fd->root.u.i.link = &opt_fd->root;
7778 desc_fd->root.u.i.warning = NULL;
7779 ppc64_elf_copy_indirect_symbol (info, opt_fd, desc_fd);
7780 }
b531344c 7781 opt_fd->mark = 1;
a7f2871e
AM
7782 if (opt_fd->dynindx != -1)
7783 {
7784 /* Use __tls_get_addr_opt in dynamic relocations. */
7785 opt_fd->dynindx = -1;
7786 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7787 opt_fd->dynstr_index);
7788 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
854b41e7 7789 return NULL;
a7f2871e 7790 }
9e7028aa 7791 if (tga_fd != NULL)
a7f2871e 7792 {
9e7028aa
AM
7793 htab->tls_get_addr_fd = ppc_elf_hash_entry (opt_fd);
7794 tga = &htab->tls_get_addr->elf;
7795 if (opt != NULL && tga != NULL)
7796 {
7797 tga->root.type = bfd_link_hash_indirect;
7798 tga->root.u.i.link = &opt->root;
7799 tga->root.u.i.warning = NULL;
7800 ppc64_elf_copy_indirect_symbol (info, opt, tga);
7801 opt->mark = 1;
7802 _bfd_elf_link_hash_hide_symbol (info, opt,
7803 tga->forced_local);
7804 htab->tls_get_addr = ppc_elf_hash_entry (opt);
7805 }
7806 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7807 htab->tls_get_addr_fd->is_func_descriptor = 1;
7808 if (htab->tls_get_addr != NULL)
7809 {
7810 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7811 htab->tls_get_addr->is_func = 1;
7812 }
a7f2871e 7813 }
9e7028aa 7814 if (desc_fd != NULL)
a7f2871e 7815 {
9e7028aa
AM
7816 htab->tga_desc_fd = ppc_elf_hash_entry (opt_fd);
7817 if (opt != NULL && desc != NULL)
7818 {
7819 desc->root.type = bfd_link_hash_indirect;
7820 desc->root.u.i.link = &opt->root;
7821 desc->root.u.i.warning = NULL;
7822 ppc64_elf_copy_indirect_symbol (info, opt, desc);
7823 opt->mark = 1;
7824 _bfd_elf_link_hash_hide_symbol (info, opt,
7825 desc->forced_local);
7826 htab->tga_desc = ppc_elf_hash_entry (opt);
7827 }
7828 htab->tga_desc_fd->oh = htab->tga_desc;
7829 htab->tga_desc_fd->is_func_descriptor = 1;
7830 if (htab->tga_desc != NULL)
7831 {
7832 htab->tga_desc->oh = htab->tga_desc_fd;
7833 htab->tga_desc->is_func = 1;
7834 }
a7f2871e
AM
7835 }
7836 }
7837 }
7838 }
7c9cf415
AM
7839 else if (htab->params->tls_get_addr_opt < 0)
7840 htab->params->tls_get_addr_opt = 0;
a7f2871e 7841 }
9e7028aa
AM
7842
7843 if (htab->tga_desc_fd != NULL
7844 && htab->params->tls_get_addr_opt
7845 && htab->params->no_tls_get_addr_regsave == -1)
7846 htab->params->no_tls_get_addr_regsave = 0;
7847
33c0ec9d 7848 return _bfd_elf_tls_setup (info->output_bfd, info);
3a71aa26 7849}
8387904d 7850
3a71aa26 7851/* Return TRUE iff REL is a branch reloc with a global symbol matching
9e7028aa 7852 any of HASH1, HASH2, HASH3, or HASH4. */
8387904d 7853
3a71aa26
AM
7854static bfd_boolean
7855branch_reloc_hash_match (const bfd *ibfd,
7856 const Elf_Internal_Rela *rel,
7857 const struct ppc_link_hash_entry *hash1,
9e7028aa
AM
7858 const struct ppc_link_hash_entry *hash2,
7859 const struct ppc_link_hash_entry *hash3,
7860 const struct ppc_link_hash_entry *hash4)
3a71aa26
AM
7861{
7862 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7863 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7864 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7865
e054468f 7866 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 7867 {
3a71aa26
AM
7868 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7869 struct elf_link_hash_entry *h;
8387904d 7870
3a71aa26 7871 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7872 h = elf_follow_link (h);
9e7028aa
AM
7873 if (h == &hash1->elf || h == &hash2->elf
7874 || h == &hash3->elf || h == &hash4->elf)
3a71aa26 7875 return TRUE;
a48ebf4d 7876 }
3a71aa26 7877 return FALSE;
951fd09b 7878}
411e1bfb 7879
951fd09b
AM
7880/* Run through all the TLS relocs looking for optimization
7881 opportunities. The linker has been hacked (see ppc64elf.em) to do
7882 a preliminary section layout so that we know the TLS segment
7883 offsets. We can't optimize earlier because some optimizations need
7884 to know the tp offset, and we need to optimize before allocating
7885 dynamic relocations. */
7886
7887bfd_boolean
33c0ec9d 7888ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
7889{
7890 bfd *ibfd;
7891 asection *sec;
7892 struct ppc_link_hash_table *htab;
663a1470 7893 unsigned char *toc_ref;
102890f0 7894 int pass;
951fd09b 7895
3cbc1e5e 7896 if (!bfd_link_executable (info))
411e1bfb
AM
7897 return TRUE;
7898
951fd09b 7899 htab = ppc_hash_table (info);
4dfe6ac6
NC
7900 if (htab == NULL)
7901 return FALSE;
7902
663a1470
AM
7903 /* Make two passes over the relocs. On the first pass, mark toc
7904 entries involved with tls relocs, and check that tls relocs
7905 involved in setting up a tls_get_addr call are indeed followed by
7906 such a call. If they are not, we can't do any tls optimization.
7907 On the second pass twiddle tls_mask flags to notify
7908 relocate_section that optimization can be done, and adjust got
7909 and plt refcounts. */
7910 toc_ref = NULL;
7911 for (pass = 0; pass < 2; ++pass)
c72f2fb2 7912 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
663a1470
AM
7913 {
7914 Elf_Internal_Sym *locsyms = NULL;
7915 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7916
102890f0
AM
7917 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7918 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7919 {
7920 Elf_Internal_Rela *relstart, *rel, *relend;
663a1470 7921 bfd_boolean found_tls_get_addr_arg = 0;
411e1bfb 7922
102890f0
AM
7923 /* Read the relocations. */
7924 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7925 info->keep_memory);
7926 if (relstart == NULL)
2915c55b
JK
7927 {
7928 free (toc_ref);
7929 return FALSE;
7930 }
411e1bfb 7931
102890f0
AM
7932 relend = relstart + sec->reloc_count;
7933 for (rel = relstart; rel < relend; rel++)
7934 {
7935 enum elf_ppc64_reloc_type r_type;
7936 unsigned long r_symndx;
7937 struct elf_link_hash_entry *h;
7938 Elf_Internal_Sym *sym;
7939 asection *sym_sec;
f961d9dd 7940 unsigned char *tls_mask;
46e9995a 7941 unsigned int tls_set, tls_clear, tls_type = 0;
102890f0
AM
7942 bfd_vma value;
7943 bfd_boolean ok_tprel, is_local;
7944 long toc_ref_index = 0;
7945 int expecting_tls_get_addr = 0;
663a1470 7946 bfd_boolean ret = FALSE;
411e1bfb 7947
102890f0
AM
7948 r_symndx = ELF64_R_SYM (rel->r_info);
7949 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
7950 r_symndx, ibfd))
7951 {
7952 err_free_rel:
7953 if (elf_section_data (sec)->relocs != relstart)
7954 free (relstart);
c9594989
AM
7955 free (toc_ref);
7956 if (elf_symtab_hdr (ibfd).contents
7957 != (unsigned char *) locsyms)
102890f0 7958 free (locsyms);
663a1470 7959 return ret;
102890f0 7960 }
411e1bfb 7961
102890f0
AM
7962 if (h != NULL)
7963 {
766bc656
AM
7964 if (h->root.type == bfd_link_hash_defined
7965 || h->root.type == bfd_link_hash_defweak)
7966 value = h->root.u.def.value;
7967 else if (h->root.type == bfd_link_hash_undefweak)
7968 value = 0;
7969 else
663a1470
AM
7970 {
7971 found_tls_get_addr_arg = 0;
7972 continue;
7973 }
102890f0
AM
7974 }
7975 else
7976 /* Symbols referenced by TLS relocs must be of type
7977 STT_TLS. So no need for .opd local sym adjust. */
7978 value = sym->st_value;
7979
7980 ok_tprel = FALSE;
f749f26e
AM
7981 is_local = SYMBOL_REFERENCES_LOCAL (info, h);
7982 if (is_local)
102890f0 7983 {
766bc656
AM
7984 if (h != NULL
7985 && h->root.type == bfd_link_hash_undefweak)
7986 ok_tprel = TRUE;
c27b8c2a
AM
7987 else if (sym_sec != NULL
7988 && sym_sec->output_section != NULL)
766bc656
AM
7989 {
7990 value += sym_sec->output_offset;
7991 value += sym_sec->output_section->vma;
0b147428 7992 value -= htab->elf.tls_sec->vma + TP_OFFSET;
c213164a
AM
7993 /* Note that even though the prefix insns
7994 allow a 1<<33 offset we use the same test
7995 as for addis;addi. There may be a mix of
7996 pcrel and non-pcrel code and the decision
7997 to optimise is per symbol, not per TLS
7998 sequence. */
0b147428 7999 ok_tprel = value + 0x80008000ULL < 1ULL << 32;
766bc656 8000 }
102890f0 8001 }
951fd09b 8002
102890f0 8003 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
8004 /* If this section has old-style __tls_get_addr calls
8005 without marker relocs, then check that each
8006 __tls_get_addr call reloc is preceded by a reloc
8007 that conceivably belongs to the __tls_get_addr arg
8008 setup insn. If we don't find matching arg setup
8009 relocs, don't do any tls optimization. */
8010 if (pass == 0
9737e8af 8011 && sec->nomark_tls_get_addr
663a1470 8012 && h != NULL
ed7007c1 8013 && is_tls_get_addr (h, htab)
663a1470
AM
8014 && !found_tls_get_addr_arg
8015 && is_branch_reloc (r_type))
8016 {
25f53a85 8017 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
8018 "TLS optimization disabled\n"),
8019 ibfd, sec, rel->r_offset);
8020 ret = TRUE;
8021 goto err_free_rel;
8022 }
8023
8024 found_tls_get_addr_arg = 0;
102890f0
AM
8025 switch (r_type)
8026 {
8027 case R_PPC64_GOT_TLSLD16:
8028 case R_PPC64_GOT_TLSLD16_LO:
87c69f97 8029 case R_PPC64_GOT_TLSLD_PCREL34:
102890f0 8030 expecting_tls_get_addr = 1;
663a1470 8031 found_tls_get_addr_arg = 1;
1a0670f3 8032 /* Fall through. */
102890f0
AM
8033
8034 case R_PPC64_GOT_TLSLD16_HI:
8035 case R_PPC64_GOT_TLSLD16_HA:
8036 /* These relocs should never be against a symbol
8037 defined in a shared lib. Leave them alone if
8038 that turns out to be the case. */
8039 if (!is_local)
8040 continue;
411e1bfb 8041
102890f0 8042 /* LD -> LE */
411e1bfb 8043 tls_set = 0;
102890f0
AM
8044 tls_clear = TLS_LD;
8045 tls_type = TLS_TLS | TLS_LD;
8046 break;
411e1bfb 8047
102890f0
AM
8048 case R_PPC64_GOT_TLSGD16:
8049 case R_PPC64_GOT_TLSGD16_LO:
87c69f97 8050 case R_PPC64_GOT_TLSGD_PCREL34:
102890f0 8051 expecting_tls_get_addr = 1;
663a1470 8052 found_tls_get_addr_arg = 1;
1a0670f3 8053 /* Fall through. */
102890f0
AM
8054
8055 case R_PPC64_GOT_TLSGD16_HI:
8056 case R_PPC64_GOT_TLSGD16_HA:
8057 if (ok_tprel)
8058 /* GD -> LE */
411e1bfb 8059 tls_set = 0;
102890f0
AM
8060 else
8061 /* GD -> IE */
b00a0a86 8062 tls_set = TLS_TLS | TLS_GDIE;
102890f0
AM
8063 tls_clear = TLS_GD;
8064 tls_type = TLS_TLS | TLS_GD;
8065 break;
8066
87c69f97 8067 case R_PPC64_GOT_TPREL_PCREL34:
102890f0
AM
8068 case R_PPC64_GOT_TPREL16_DS:
8069 case R_PPC64_GOT_TPREL16_LO_DS:
8070 case R_PPC64_GOT_TPREL16_HI:
8071 case R_PPC64_GOT_TPREL16_HA:
8072 if (ok_tprel)
8073 {
8074 /* IE -> LE */
8075 tls_set = 0;
8076 tls_clear = TLS_TPREL;
8077 tls_type = TLS_TLS | TLS_TPREL;
8078 break;
8079 }
411e1bfb
AM
8080 continue;
8081
727fc41e 8082 case R_PPC64_TLSLD:
7d04a20a
AM
8083 if (!is_local)
8084 continue;
8085 /* Fall through. */
8086 case R_PPC64_TLSGD:
23cedd1d
AM
8087 if (rel + 1 < relend
8088 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
8089 {
8090 if (pass != 0
2cdcc330 8091 && (ELF64_R_TYPE (rel[1].r_info)
5663e321
AM
8092 != R_PPC64_PLTSEQ)
8093 && (ELF64_R_TYPE (rel[1].r_info)
8094 != R_PPC64_PLTSEQ_NOTOC))
23cedd1d
AM
8095 {
8096 r_symndx = ELF64_R_SYM (rel[1].r_info);
8097 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms,
2cdcc330 8098 r_symndx, ibfd))
23cedd1d
AM
8099 goto err_free_rel;
8100 if (h != NULL)
8101 {
8102 struct plt_entry *ent = NULL;
8103
8104 for (ent = h->plt.plist;
8105 ent != NULL;
8106 ent = ent->next)
8107 if (ent->addend == rel[1].r_addend)
8108 break;
8109
8110 if (ent != NULL
8111 && ent->plt.refcount > 0)
8112 ent->plt.refcount -= 1;
8113 }
8114 }
8115 continue;
8116 }
663a1470 8117 found_tls_get_addr_arg = 1;
1a0670f3 8118 /* Fall through. */
663a1470
AM
8119
8120 case R_PPC64_TLS:
8121 case R_PPC64_TOC16:
8122 case R_PPC64_TOC16_LO:
102890f0
AM
8123 if (sym_sec == NULL || sym_sec != toc)
8124 continue;
8125
8126 /* Mark this toc entry as referenced by a TLS
8127 code sequence. We can do that now in the
8128 case of R_PPC64_TLS, and after checking for
8129 tls_get_addr for the TOC16 relocs. */
8130 if (toc_ref == NULL)
2cdcc330
AM
8131 toc_ref
8132 = bfd_zmalloc (toc->output_section->rawsize / 8);
663a1470
AM
8133 if (toc_ref == NULL)
8134 goto err_free_rel;
8135
102890f0
AM
8136 if (h != NULL)
8137 value = h->root.u.def.value;
8138 else
8139 value = sym->st_value;
8140 value += rel->r_addend;
73242275
AM
8141 if (value % 8 != 0)
8142 continue;
8143 BFD_ASSERT (value < toc->size
8144 && toc->output_offset % 8 == 0);
663a1470 8145 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
8146 if (r_type == R_PPC64_TLS
8147 || r_type == R_PPC64_TLSGD
8148 || r_type == R_PPC64_TLSLD)
102890f0
AM
8149 {
8150 toc_ref[toc_ref_index] = 1;
8151 continue;
8152 }
8153
8154 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8155 continue;
8156
8157 tls_set = 0;
8158 tls_clear = 0;
8159 expecting_tls_get_addr = 2;
8160 break;
8161
8162 case R_PPC64_TPREL64:
8163 if (pass == 0
8164 || sec != toc
8165 || toc_ref == NULL
663a1470 8166 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8167 continue;
8168 if (ok_tprel)
8169 {
8170 /* IE -> LE */
8171 tls_set = TLS_EXPLICIT;
8172 tls_clear = TLS_TPREL;
8173 break;
8174 }
8175 continue;
8176
8177 case R_PPC64_DTPMOD64:
8178 if (pass == 0
8179 || sec != toc
8180 || toc_ref == NULL
663a1470 8181 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8182 continue;
8183 if (rel + 1 < relend
8184 && (rel[1].r_info
8185 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8186 && rel[1].r_offset == rel->r_offset + 8)
8187 {
8188 if (ok_tprel)
8189 /* GD -> LE */
8190 tls_set = TLS_EXPLICIT | TLS_GD;
8191 else
8192 /* GD -> IE */
b00a0a86 8193 tls_set = TLS_EXPLICIT | TLS_GD | TLS_GDIE;
102890f0
AM
8194 tls_clear = TLS_GD;
8195 }
8196 else
8197 {
8198 if (!is_local)
8199 continue;
8200
8201 /* LD -> LE */
8202 tls_set = TLS_EXPLICIT;
8203 tls_clear = TLS_LD;
8204 }
8205 break;
8206
8207 default:
8208 continue;
8209 }
8210
8211 if (pass == 0)
8212 {
727fc41e 8213 if (!expecting_tls_get_addr
9737e8af 8214 || !sec->nomark_tls_get_addr)
102890f0
AM
8215 continue;
8216
3a71aa26
AM
8217 if (rel + 1 < relend
8218 && branch_reloc_hash_match (ibfd, rel + 1,
9e7028aa
AM
8219 htab->tls_get_addr_fd,
8220 htab->tga_desc_fd,
3a71aa26 8221 htab->tls_get_addr,
9e7028aa 8222 htab->tga_desc))
102890f0 8223 {
3a71aa26 8224 if (expecting_tls_get_addr == 2)
102890f0 8225 {
3a71aa26 8226 /* Check for toc tls entries. */
f961d9dd 8227 unsigned char *toc_tls;
3a71aa26
AM
8228 int retval;
8229
8230 retval = get_tls_mask (&toc_tls, NULL, NULL,
8231 &locsyms,
8232 rel, ibfd);
8233 if (retval == 0)
8234 goto err_free_rel;
663a1470
AM
8235 if (toc_tls != NULL)
8236 {
37da22e5
AM
8237 if ((*toc_tls & TLS_TLS) != 0
8238 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0))
663a1470
AM
8239 found_tls_get_addr_arg = 1;
8240 if (retval > 1)
8241 toc_ref[toc_ref_index] = 1;
8242 }
102890f0 8243 }
3a71aa26 8244 continue;
102890f0
AM
8245 }
8246
102890f0
AM
8247 /* Uh oh, we didn't find the expected call. We
8248 could just mark this symbol to exclude it
8249 from tls optimization but it's safer to skip
663a1470 8250 the entire optimization. */
695344c0 8251 /* xgettext:c-format */
25f53a85 8252 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8253 "TLS optimization disabled\n"),
8254 ibfd, sec, rel->r_offset);
8255 ret = TRUE;
8256 goto err_free_rel;
102890f0
AM
8257 }
8258
37da22e5
AM
8259 /* If we don't have old-style __tls_get_addr calls
8260 without TLSGD/TLSLD marker relocs, and we haven't
8261 found a new-style __tls_get_addr call with a
8262 marker for this symbol, then we either have a
8263 broken object file or an -mlongcall style
8264 indirect call to __tls_get_addr without a marker.
8265 Disable optimization in this case. */
8266 if ((tls_clear & (TLS_GD | TLS_LD)) != 0
8267 && (tls_set & TLS_EXPLICIT) == 0
9737e8af 8268 && !sec->nomark_tls_get_addr
37da22e5
AM
8269 && ((*tls_mask & (TLS_TLS | TLS_MARK))
8270 != (TLS_TLS | TLS_MARK)))
8271 continue;
8272
7d04a20a 8273 if (expecting_tls_get_addr == 1 + !sec->nomark_tls_get_addr)
102890f0 8274 {
23cedd1d
AM
8275 struct plt_entry *ent = NULL;
8276
9e7028aa
AM
8277 if (htab->tls_get_addr_fd != NULL)
8278 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8279 ent != NULL;
8280 ent = ent->next)
8281 if (ent->addend == 0)
8282 break;
8283
8284 if (ent == NULL && htab->tga_desc_fd != NULL)
8285 for (ent = htab->tga_desc_fd->elf.plt.plist;
8286 ent != NULL;
8287 ent = ent->next)
8288 if (ent->addend == 0)
8289 break;
8290
8291 if (ent == NULL && htab->tls_get_addr != NULL)
23cedd1d
AM
8292 for (ent = htab->tls_get_addr->elf.plt.plist;
8293 ent != NULL;
8294 ent = ent->next)
8295 if (ent->addend == 0)
102890f0 8296 break;
411e1bfb 8297
9e7028aa
AM
8298 if (ent == NULL && htab->tga_desc != NULL)
8299 for (ent = htab->tga_desc->elf.plt.plist;
23cedd1d
AM
8300 ent != NULL;
8301 ent = ent->next)
8302 if (ent->addend == 0)
102890f0 8303 break;
23cedd1d
AM
8304
8305 if (ent != NULL
8306 && ent->plt.refcount > 0)
8307 ent->plt.refcount -= 1;
102890f0 8308 }
411e1bfb 8309
102890f0 8310 if (tls_clear == 0)
30038c59
AM
8311 continue;
8312
102890f0
AM
8313 if ((tls_set & TLS_EXPLICIT) == 0)
8314 {
8315 struct got_entry *ent;
411e1bfb 8316
102890f0
AM
8317 /* Adjust got entry for this reloc. */
8318 if (h != NULL)
8319 ent = h->got.glist;
8320 else
8321 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 8322
102890f0
AM
8323 for (; ent != NULL; ent = ent->next)
8324 if (ent->addend == rel->r_addend
8325 && ent->owner == ibfd
8326 && ent->tls_type == tls_type)
8327 break;
8328 if (ent == NULL)
8329 abort ();
411e1bfb 8330
102890f0
AM
8331 if (tls_set == 0)
8332 {
8333 /* We managed to get rid of a got entry. */
8334 if (ent->got.refcount > 0)
8335 ent->got.refcount -= 1;
8336 }
8337 }
8338 else
8339 {
8340 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8341 we'll lose one or two dyn relocs. */
8342 if (!dec_dynrel_count (rel->r_info, sec, info,
19e08130 8343 NULL, h, sym))
102890f0 8344 return FALSE;
411e1bfb 8345
102890f0
AM
8346 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8347 {
8348 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
19e08130 8349 NULL, h, sym))
102890f0
AM
8350 return FALSE;
8351 }
8352 }
411e1bfb 8353
46e9995a 8354 *tls_mask |= tls_set & 0xff;
102890f0
AM
8355 *tls_mask &= ~tls_clear;
8356 }
8c1d1bb8 8357
102890f0
AM
8358 if (elf_section_data (sec)->relocs != relstart)
8359 free (relstart);
8360 }
411e1bfb 8361
663a1470
AM
8362 if (locsyms != NULL
8363 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8364 {
8365 if (!info->keep_memory)
8366 free (locsyms);
8367 else
8368 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8369 }
8370 }
411e1bfb 8371
c9594989 8372 free (toc_ref);
9a23f96e 8373 htab->do_tls_opt = 1;
b34976b6 8374 return TRUE;
1e2f5b6e 8375}
b34976b6 8376
c5614fa4
AM
8377/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8378 the values of any global symbols in a toc section that has been
8379 edited. Globals in toc sections should be a rarity, so this function
8380 sets a flag if any are found in toc sections other than the one just
de194d85 8381 edited, so that further hash table traversals can be avoided. */
c5614fa4
AM
8382
8383struct adjust_toc_info
8384{
8385 asection *toc;
8386 unsigned long *skip;
8387 bfd_boolean global_toc_syms;
8388};
8389
ba761f19
AM
8390enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8391
c5614fa4
AM
8392static bfd_boolean
8393adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8394{
8395 struct ppc_link_hash_entry *eh;
8396 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 8397 unsigned long i;
c5614fa4 8398
c5614fa4
AM
8399 if (h->root.type != bfd_link_hash_defined
8400 && h->root.type != bfd_link_hash_defweak)
8401 return TRUE;
8402
ed7007c1 8403 eh = ppc_elf_hash_entry (h);
c5614fa4
AM
8404 if (eh->adjust_done)
8405 return TRUE;
8406
8407 if (eh->elf.root.u.def.section == toc_inf->toc)
8408 {
854b41e7
AM
8409 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8410 i = toc_inf->toc->rawsize >> 3;
c5614fa4 8411 else
854b41e7
AM
8412 i = eh->elf.root.u.def.value >> 3;
8413
ba761f19 8414 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4 8415 {
4eca0228 8416 _bfd_error_handler
854b41e7
AM
8417 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8418 do
8419 ++i;
ba761f19 8420 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 8421 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 8422 }
854b41e7
AM
8423
8424 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
8425 eh->adjust_done = 1;
8426 }
8427 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8428 toc_inf->global_toc_syms = TRUE;
8429
8430 return TRUE;
8431}
8432
39eeab25
AM
8433/* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8434 on a _LO variety toc/got reloc. */
560c8763
AM
8435
8436static bfd_boolean
39eeab25 8437ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
560c8763 8438{
2365f8d7
AM
8439 return ((insn & (0x3fu << 26)) == 12u << 26 /* addic */
8440 || (insn & (0x3fu << 26)) == 14u << 26 /* addi */
8441 || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */
8442 || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */
8443 || (insn & (0x3fu << 26)) == 36u << 26 /* stw */
8444 || (insn & (0x3fu << 26)) == 38u << 26 /* stb */
8445 || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */
8446 || (insn & (0x3fu << 26)) == 42u << 26 /* lha */
8447 || (insn & (0x3fu << 26)) == 44u << 26 /* sth */
8448 || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */
8449 || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */
8450 || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */
8451 || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */
8452 || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */
8453 || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */
8454 || (insn & (0x3fu << 26)) == 56u << 26 /* lq,lfq */
8455 || ((insn & (0x3fu << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
39eeab25
AM
8456 /* Exclude lfqu by testing reloc. If relocs are ever
8457 defined for the reduced D field in psq_lu then those
8458 will need testing too. */
8459 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8460 || ((insn & (0x3fu << 26)) == 58u << 26 /* ld,lwa */
39eeab25 8461 && (insn & 1) == 0)
2365f8d7
AM
8462 || (insn & (0x3fu << 26)) == 60u << 26 /* stfq */
8463 || ((insn & (0x3fu << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
39eeab25
AM
8464 /* Exclude stfqu. psq_stu as above for psq_lu. */
8465 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8466 || ((insn & (0x3fu << 26)) == 62u << 26 /* std,stq */
39eeab25 8467 && (insn & 1) == 0));
560c8763
AM
8468}
8469
4a421c53
AM
8470/* PCREL_OPT in one instance flags to the linker that a pair of insns:
8471 pld ra,symbol@got@pcrel
dd9b12c2 8472 load/store rt,off(ra)
4a421c53 8473 or
d4b87b1e 8474 pla ra,symbol@pcrel
dd9b12c2 8475 load/store rt,off(ra)
4a421c53 8476 may be translated to
dd9b12c2 8477 pload/pstore rt,symbol+off@pcrel
4a421c53
AM
8478 nop.
8479 This function returns true if the optimization is possible, placing
dd9b12c2 8480 the prefix insn in *PINSN1, a NOP in *PINSN2 and the offset in *POFF.
4a421c53
AM
8481
8482 On entry to this function, the linker has already determined that
d4b87b1e 8483 the pld can be replaced with pla: *PINSN1 is that pla insn,
4a421c53
AM
8484 while *PINSN2 is the second instruction. */
8485
8486static bfd_boolean
dd9b12c2 8487xlate_pcrel_opt (uint64_t *pinsn1, uint64_t *pinsn2, bfd_signed_vma *poff)
4a421c53 8488{
77486630
AM
8489 uint64_t insn1 = *pinsn1;
8490 uint64_t insn2 = *pinsn2;
dd9b12c2 8491 bfd_signed_vma off;
4a421c53 8492
77486630
AM
8493 if ((insn2 & (63ULL << 58)) == 1ULL << 58)
8494 {
8495 /* Check that regs match. */
8496 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
8497 return FALSE;
8498
8499 /* P8LS or PMLS form, non-pcrel. */
8500 if ((insn2 & (-1ULL << 50) & ~(1ULL << 56)) != (1ULL << 58))
8501 return FALSE;
8502
8503 *pinsn1 = (insn2 & ~(31 << 16) & ~0x3ffff0000ffffULL) | (1ULL << 52);
8504 *pinsn2 = PNOP;
8505 off = ((insn2 >> 16) & 0x3ffff0000ULL) | (insn2 & 0xffff);
8506 *poff = (off ^ 0x200000000ULL) - 0x200000000ULL;
8507 return TRUE;
8508 }
8509
8510 insn2 >>= 32;
8511
4a421c53 8512 /* Check that regs match. */
77486630 8513 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
4a421c53
AM
8514 return FALSE;
8515
8516 switch ((insn2 >> 26) & 63)
8517 {
8518 default:
8519 return FALSE;
8520
8521 case 32: /* lwz */
8522 case 34: /* lbz */
8523 case 36: /* stw */
8524 case 38: /* stb */
8525 case 40: /* lhz */
8526 case 42: /* lha */
8527 case 44: /* sth */
8528 case 48: /* lfs */
8529 case 50: /* lfd */
8530 case 52: /* stfs */
8531 case 54: /* stfd */
8532 /* These are the PMLS cases, where we just need to tack a prefix
dd9b12c2 8533 on the insn. */
77486630 8534 insn1 = ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
4a421c53 8535 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8536 off = insn2 & 0xffff;
4a421c53
AM
8537 break;
8538
8539 case 58: /* lwa, ld */
dd9b12c2 8540 if ((insn2 & 1) != 0)
4a421c53 8541 return FALSE;
77486630 8542 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8543 | (insn2 & 2 ? 41ULL << 26 : 57ULL << 26)
8544 | (insn2 & (31ULL << 21)));
dd9b12c2 8545 off = insn2 & 0xfffc;
4a421c53
AM
8546 break;
8547
8548 case 57: /* lxsd, lxssp */
dd9b12c2 8549 if ((insn2 & 3) < 2)
4a421c53 8550 return FALSE;
77486630 8551 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8552 | ((40ULL | (insn2 & 3)) << 26)
8553 | (insn2 & (31ULL << 21)));
dd9b12c2 8554 off = insn2 & 0xfffc;
4a421c53
AM
8555 break;
8556
8557 case 61: /* stxsd, stxssp, lxv, stxv */
8558 if ((insn2 & 3) == 0)
8559 return FALSE;
8560 else if ((insn2 & 3) >= 2)
8561 {
77486630 8562 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8563 | ((44ULL | (insn2 & 3)) << 26)
8564 | (insn2 & (31ULL << 21)));
dd9b12c2 8565 off = insn2 & 0xfffc;
4a421c53
AM
8566 }
8567 else
8568 {
77486630 8569 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8570 | ((50ULL | (insn2 & 4) | ((insn2 & 8) >> 3)) << 26)
8571 | (insn2 & (31ULL << 21)));
dd9b12c2 8572 off = insn2 & 0xfff0;
4a421c53
AM
8573 }
8574 break;
8575
8576 case 56: /* lq */
77486630 8577 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53 8578 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8579 off = insn2 & 0xffff;
4a421c53
AM
8580 break;
8581
94ba9882
AM
8582 case 6: /* lxvp, stxvp */
8583 if ((insn2 & 0xe) != 0)
8584 return FALSE;
8585 insn1 = ((1ULL << 58) | (1ULL << 52)
8586 | ((insn2 & 1) == 0 ? 58ULL << 26 : 62ULL << 26)
8587 | (insn2 & (31ULL << 21)));
8588 off = insn2 & 0xfff0;
8589 break;
8590
4a421c53 8591 case 62: /* std, stq */
dd9b12c2 8592 if ((insn2 & 1) != 0)
4a421c53 8593 return FALSE;
77486630 8594 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8595 | ((insn2 & 2) == 0 ? 61ULL << 26 : 60ULL << 26)
8596 | (insn2 & (31ULL << 21)));
dd9b12c2 8597 off = insn2 & 0xfffc;
4a421c53
AM
8598 break;
8599 }
8600
77486630 8601 *pinsn1 = insn1;
4a421c53 8602 *pinsn2 = (uint64_t) NOP << 32;
dd9b12c2 8603 *poff = (off ^ 0x8000) - 0x8000;
4a421c53
AM
8604 return TRUE;
8605}
8606
c5614fa4
AM
8607/* Examine all relocs referencing .toc sections in order to remove
8608 unused .toc entries. */
8609
8610bfd_boolean
33c0ec9d 8611ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
8612{
8613 bfd *ibfd;
8614 struct adjust_toc_info toc_inf;
67f0cbdb 8615 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 8616
67f0cbdb 8617 htab->do_toc_opt = 1;
c5614fa4 8618 toc_inf.global_toc_syms = TRUE;
c72f2fb2 8619 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
c5614fa4
AM
8620 {
8621 asection *toc, *sec;
8622 Elf_Internal_Shdr *symtab_hdr;
8623 Elf_Internal_Sym *local_syms;
425b145b 8624 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
8625 unsigned long *skip, *drop;
8626 unsigned char *used;
8627 unsigned char *keep, last, some_unused;
8628
854b41e7
AM
8629 if (!is_ppc64_elf (ibfd))
8630 continue;
8631
c5614fa4
AM
8632 toc = bfd_get_section_by_name (ibfd, ".toc");
8633 if (toc == NULL
92b7a70f 8634 || toc->size == 0
dbaa2011
AM
8635 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8636 || discarded_section (toc))
c5614fa4
AM
8637 continue;
8638
425b145b 8639 toc_relocs = NULL;
c5614fa4 8640 local_syms = NULL;
0ffa91dd 8641 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
8642
8643 /* Look at sections dropped from the final link. */
8644 skip = NULL;
8645 relstart = NULL;
8646 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8647 {
8648 if (sec->reloc_count == 0
dbaa2011 8649 || !discarded_section (sec)
c5614fa4
AM
8650 || get_opd_info (sec)
8651 || (sec->flags & SEC_ALLOC) == 0
8652 || (sec->flags & SEC_DEBUGGING) != 0)
8653 continue;
8654
8655 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8656 if (relstart == NULL)
8657 goto error_ret;
8658
8659 /* Run through the relocs to see which toc entries might be
8660 unused. */
8661 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8662 {
8663 enum elf_ppc64_reloc_type r_type;
8664 unsigned long r_symndx;
8665 asection *sym_sec;
8666 struct elf_link_hash_entry *h;
8667 Elf_Internal_Sym *sym;
8668 bfd_vma val;
8669
8670 r_type = ELF64_R_TYPE (rel->r_info);
8671 switch (r_type)
8672 {
8673 default:
8674 continue;
8675
8676 case R_PPC64_TOC16:
8677 case R_PPC64_TOC16_LO:
8678 case R_PPC64_TOC16_HI:
8679 case R_PPC64_TOC16_HA:
8680 case R_PPC64_TOC16_DS:
8681 case R_PPC64_TOC16_LO_DS:
8682 break;
8683 }
8684
8685 r_symndx = ELF64_R_SYM (rel->r_info);
8686 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8687 r_symndx, ibfd))
8688 goto error_ret;
8689
8690 if (sym_sec != toc)
8691 continue;
8692
8693 if (h != NULL)
8694 val = h->root.u.def.value;
8695 else
8696 val = sym->st_value;
8697 val += rel->r_addend;
8698
8699 if (val >= toc->size)
8700 continue;
8701
8702 /* Anything in the toc ought to be aligned to 8 bytes.
8703 If not, don't mark as unused. */
8704 if (val & 7)
8705 continue;
8706
8707 if (skip == NULL)
8708 {
854b41e7 8709 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
8710 if (skip == NULL)
8711 goto error_ret;
8712 }
8713
ba761f19 8714 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
8715 }
8716
8717 if (elf_section_data (sec)->relocs != relstart)
8718 free (relstart);
8719 }
8720
ba761f19
AM
8721 /* For largetoc loads of address constants, we can convert
8722 . addis rx,2,addr@got@ha
8723 . ld ry,addr@got@l(rx)
8724 to
8725 . addis rx,2,addr@toc@ha
8726 . addi ry,rx,addr@toc@l
8727 when addr is within 2G of the toc pointer. This then means
8728 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 8729
ba761f19
AM
8730 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8731 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8732 && toc->reloc_count != 0)
8733 {
8734 /* Read toc relocs. */
425b145b
AM
8735 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8736 info->keep_memory);
8737 if (toc_relocs == NULL)
ba761f19
AM
8738 goto error_ret;
8739
425b145b 8740 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
8741 {
8742 enum elf_ppc64_reloc_type r_type;
8743 unsigned long r_symndx;
8744 asection *sym_sec;
8745 struct elf_link_hash_entry *h;
8746 Elf_Internal_Sym *sym;
8747 bfd_vma val, addr;
8748
8749 r_type = ELF64_R_TYPE (rel->r_info);
8750 if (r_type != R_PPC64_ADDR64)
8751 continue;
8752
8753 r_symndx = ELF64_R_SYM (rel->r_info);
8754 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8755 r_symndx, ibfd))
8756 goto error_ret;
8757
425b145b 8758 if (sym_sec == NULL
c27b8c2a 8759 || sym_sec->output_section == NULL
dbaa2011 8760 || discarded_section (sym_sec))
425b145b
AM
8761 continue;
8762
afe397ea 8763 if (!SYMBOL_REFERENCES_LOCAL (info, h))
ba761f19
AM
8764 continue;
8765
8766 if (h != NULL)
bddc25c9
AM
8767 {
8768 if (h->type == STT_GNU_IFUNC)
8769 continue;
8770 val = h->root.u.def.value;
8771 }
ba761f19 8772 else
bddc25c9
AM
8773 {
8774 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8775 continue;
8776 val = sym->st_value;
8777 }
ba761f19
AM
8778 val += rel->r_addend;
8779 val += sym_sec->output_section->vma + sym_sec->output_offset;
8780
8781 /* We don't yet know the exact toc pointer value, but we
8782 know it will be somewhere in the toc section. Don't
8783 optimize if the difference from any possible toc
8784 pointer is outside [ff..f80008000, 7fff7fff]. */
8785 addr = toc->output_section->vma + TOC_BASE_OFF;
8786 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8787 continue;
8788
8789 addr = toc->output_section->vma + toc->output_section->rawsize;
8790 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8791 continue;
8792
8793 if (skip == NULL)
8794 {
8795 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8796 if (skip == NULL)
8797 goto error_ret;
8798 }
8799
8800 skip[rel->r_offset >> 3]
425b145b 8801 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 8802 }
ba761f19
AM
8803 }
8804
c5614fa4
AM
8805 if (skip == NULL)
8806 continue;
8807
8808 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8809 if (used == NULL)
8810 {
8811 error_ret:
c9594989 8812 if (symtab_hdr->contents != (unsigned char *) local_syms)
c5614fa4
AM
8813 free (local_syms);
8814 if (sec != NULL
c5614fa4
AM
8815 && elf_section_data (sec)->relocs != relstart)
8816 free (relstart);
c9594989 8817 if (elf_section_data (toc)->relocs != toc_relocs)
425b145b 8818 free (toc_relocs);
c9594989 8819 free (skip);
c5614fa4
AM
8820 return FALSE;
8821 }
8822
30038c59
AM
8823 /* Now check all kept sections that might reference the toc.
8824 Check the toc itself last. */
8825 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8826 : ibfd->sections);
c5614fa4 8827 sec != NULL;
c5614fa4 8828 sec = (sec == toc ? NULL
c5614fa4 8829 : sec->next == NULL ? toc
30038c59 8830 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
8831 : sec->next))
8832 {
8833 int repeat;
8834
8835 if (sec->reloc_count == 0
dbaa2011 8836 || discarded_section (sec)
c5614fa4
AM
8837 || get_opd_info (sec)
8838 || (sec->flags & SEC_ALLOC) == 0
8839 || (sec->flags & SEC_DEBUGGING) != 0)
8840 continue;
8841
854b41e7
AM
8842 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8843 info->keep_memory);
c5614fa4 8844 if (relstart == NULL)
2915c55b
JK
8845 {
8846 free (used);
8847 goto error_ret;
8848 }
c5614fa4
AM
8849
8850 /* Mark toc entries referenced as used. */
c5614fa4 8851 do
d4f1ee75
AM
8852 {
8853 repeat = 0;
8854 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8855 {
8856 enum elf_ppc64_reloc_type r_type;
8857 unsigned long r_symndx;
8858 asection *sym_sec;
8859 struct elf_link_hash_entry *h;
8860 Elf_Internal_Sym *sym;
8861 bfd_vma val;
98528052 8862
d4f1ee75 8863 r_type = ELF64_R_TYPE (rel->r_info);
d4f1ee75
AM
8864 switch (r_type)
8865 {
8866 case R_PPC64_TOC16:
8867 case R_PPC64_TOC16_LO:
8868 case R_PPC64_TOC16_HI:
8869 case R_PPC64_TOC16_HA:
8870 case R_PPC64_TOC16_DS:
8871 case R_PPC64_TOC16_LO_DS:
8872 /* In case we're taking addresses of toc entries. */
8873 case R_PPC64_ADDR64:
8874 break;
c5614fa4 8875
d4f1ee75
AM
8876 default:
8877 continue;
8878 }
c5614fa4 8879
d4f1ee75
AM
8880 r_symndx = ELF64_R_SYM (rel->r_info);
8881 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8882 r_symndx, ibfd))
8883 {
8884 free (used);
8885 goto error_ret;
8886 }
c5614fa4 8887
d4f1ee75
AM
8888 if (sym_sec != toc)
8889 continue;
c5614fa4 8890
d4f1ee75
AM
8891 if (h != NULL)
8892 val = h->root.u.def.value;
8893 else
8894 val = sym->st_value;
8895 val += rel->r_addend;
ba761f19 8896
d4f1ee75
AM
8897 if (val >= toc->size)
8898 continue;
ba761f19 8899
d4f1ee75
AM
8900 if ((skip[val >> 3] & can_optimize) != 0)
8901 {
8902 bfd_vma off;
8903 unsigned char opc;
8904
8905 switch (r_type)
8906 {
8907 case R_PPC64_TOC16_HA:
ba761f19 8908 break;
ba761f19 8909
d4f1ee75
AM
8910 case R_PPC64_TOC16_LO_DS:
8911 off = rel->r_offset;
8912 off += (bfd_big_endian (ibfd) ? -2 : 3);
8913 if (!bfd_get_section_contents (ibfd, sec, &opc,
8914 off, 1))
8915 {
8916 free (used);
8917 goto error_ret;
8918 }
8919 if ((opc & (0x3f << 2)) == (58u << 2))
8920 break;
1a0670f3 8921 /* Fall through. */
ba761f19 8922
d4f1ee75
AM
8923 default:
8924 /* Wrong sort of reloc, or not a ld. We may
8925 as well clear ref_from_discarded too. */
8926 skip[val >> 3] = 0;
8927 }
8928 }
8929
8930 if (sec != toc)
8931 used[val >> 3] = 1;
8932 /* For the toc section, we only mark as used if this
8933 entry itself isn't unused. */
8934 else if ((used[rel->r_offset >> 3]
8935 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
8936 && !used[val >> 3])
8937 {
8938 /* Do all the relocs again, to catch reference
8939 chains. */
8940 repeat = 1;
8941 used[val >> 3] = 1;
8942 }
8943 }
8944 }
c5614fa4 8945 while (repeat);
854b41e7
AM
8946
8947 if (elf_section_data (sec)->relocs != relstart)
8948 free (relstart);
c5614fa4
AM
8949 }
8950
8951 /* Merge the used and skip arrays. Assume that TOC
8952 doublewords not appearing as either used or unused belong
de194d85 8953 to an entry more than one doubleword in size. */
c5614fa4
AM
8954 for (drop = skip, keep = used, last = 0, some_unused = 0;
8955 drop < skip + (toc->size + 7) / 8;
8956 ++drop, ++keep)
8957 {
8958 if (*keep)
8959 {
ba761f19
AM
8960 *drop &= ~ref_from_discarded;
8961 if ((*drop & can_optimize) != 0)
8962 some_unused = 1;
c5614fa4
AM
8963 last = 0;
8964 }
b140b010 8965 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
8966 {
8967 some_unused = 1;
ba761f19 8968 last = ref_from_discarded;
c5614fa4
AM
8969 }
8970 else
8971 *drop = last;
8972 }
8973
8974 free (used);
8975
8976 if (some_unused)
8977 {
8978 bfd_byte *contents, *src;
8979 unsigned long off;
d62b3684 8980 Elf_Internal_Sym *sym;
ba761f19 8981 bfd_boolean local_toc_syms = FALSE;
c5614fa4
AM
8982
8983 /* Shuffle the toc contents, and at the same time convert the
8984 skip array from booleans into offsets. */
8985 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8986 goto error_ret;
8987
8988 elf_section_data (toc)->this_hdr.contents = contents;
8989
8990 for (src = contents, off = 0, drop = skip;
8991 src < contents + toc->size;
8992 src += 8, ++drop)
8993 {
ba761f19
AM
8994 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
8995 off += 8;
c5614fa4
AM
8996 else if (off != 0)
8997 {
8998 *drop = off;
8999 memcpy (src - off, src, 8);
9000 }
9001 }
854b41e7 9002 *drop = off;
c5614fa4
AM
9003 toc->rawsize = toc->size;
9004 toc->size = src - contents - off;
9005
ba761f19
AM
9006 /* Adjust addends for relocs against the toc section sym,
9007 and optimize any accesses we can. */
c5614fa4
AM
9008 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9009 {
9010 if (sec->reloc_count == 0
dbaa2011 9011 || discarded_section (sec))
c5614fa4
AM
9012 continue;
9013
9014 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 9015 info->keep_memory);
c5614fa4
AM
9016 if (relstart == NULL)
9017 goto error_ret;
9018
9019 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9020 {
9021 enum elf_ppc64_reloc_type r_type;
9022 unsigned long r_symndx;
9023 asection *sym_sec;
9024 struct elf_link_hash_entry *h;
854b41e7 9025 bfd_vma val;
c5614fa4
AM
9026
9027 r_type = ELF64_R_TYPE (rel->r_info);
9028 switch (r_type)
9029 {
9030 default:
9031 continue;
9032
9033 case R_PPC64_TOC16:
9034 case R_PPC64_TOC16_LO:
9035 case R_PPC64_TOC16_HI:
9036 case R_PPC64_TOC16_HA:
9037 case R_PPC64_TOC16_DS:
9038 case R_PPC64_TOC16_LO_DS:
9039 case R_PPC64_ADDR64:
9040 break;
9041 }
9042
9043 r_symndx = ELF64_R_SYM (rel->r_info);
9044 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9045 r_symndx, ibfd))
9046 goto error_ret;
9047
ba761f19 9048 if (sym_sec != toc)
c5614fa4
AM
9049 continue;
9050
ba761f19
AM
9051 if (h != NULL)
9052 val = h->root.u.def.value;
9053 else
9054 {
9055 val = sym->st_value;
9056 if (val != 0)
9057 local_toc_syms = TRUE;
9058 }
9059
9060 val += rel->r_addend;
854b41e7
AM
9061
9062 if (val > toc->rawsize)
9063 val = toc->rawsize;
ba761f19
AM
9064 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9065 continue;
9066 else if ((skip[val >> 3] & can_optimize) != 0)
9067 {
9068 Elf_Internal_Rela *tocrel
425b145b 9069 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
9070 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9071
9072 switch (r_type)
9073 {
9074 case R_PPC64_TOC16_HA:
9075 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9076 break;
9077
9078 case R_PPC64_TOC16_LO_DS:
9079 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9080 break;
9081
9082 default:
28942f62
AM
9083 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9084 ppc_howto_init ();
b140b010 9085 info->callbacks->einfo
695344c0 9086 /* xgettext:c-format */
174d0a74 9087 (_("%H: %s references "
b140b010
AM
9088 "optimized away TOC entry\n"),
9089 ibfd, sec, rel->r_offset,
9090 ppc64_elf_howto_table[r_type]->name);
9091 bfd_set_error (bfd_error_bad_value);
9092 goto error_ret;
ba761f19
AM
9093 }
9094 rel->r_addend = tocrel->r_addend;
9095 elf_section_data (sec)->relocs = relstart;
9096 continue;
9097 }
9098
9099 if (h != NULL || sym->st_value != 0)
9100 continue;
854b41e7
AM
9101
9102 rel->r_addend -= skip[val >> 3];
9103 elf_section_data (sec)->relocs = relstart;
c5614fa4 9104 }
854b41e7
AM
9105
9106 if (elf_section_data (sec)->relocs != relstart)
9107 free (relstart);
c5614fa4
AM
9108 }
9109
9110 /* We shouldn't have local or global symbols defined in the TOC,
9111 but handle them anyway. */
df22d223
AM
9112 if (local_syms != NULL)
9113 for (sym = local_syms;
9114 sym < local_syms + symtab_hdr->sh_info;
9115 ++sym)
9116 if (sym->st_value != 0
9117 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9118 {
9119 unsigned long i;
854b41e7 9120
df22d223
AM
9121 if (sym->st_value > toc->rawsize)
9122 i = toc->rawsize >> 3;
9123 else
9124 i = sym->st_value >> 3;
854b41e7 9125
df22d223
AM
9126 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9127 {
9128 if (local_toc_syms)
4eca0228 9129 _bfd_error_handler
df22d223
AM
9130 (_("%s defined on removed toc entry"),
9131 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9132 do
9133 ++i;
9134 while ((skip[i] & (ref_from_discarded | can_optimize)));
9135 sym->st_value = (bfd_vma) i << 3;
9136 }
d62b3684 9137
df22d223
AM
9138 sym->st_value -= skip[i];
9139 symtab_hdr->contents = (unsigned char *) local_syms;
9140 }
c5614fa4 9141
854b41e7 9142 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
9143 if (toc_inf.global_toc_syms)
9144 {
9145 toc_inf.toc = toc;
9146 toc_inf.skip = skip;
9147 toc_inf.global_toc_syms = FALSE;
9148 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9149 &toc_inf);
9150 }
854b41e7
AM
9151
9152 if (toc->reloc_count != 0)
9153 {
d4730f92 9154 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
9155 Elf_Internal_Rela *wrel;
9156 bfd_size_type sz;
9157
854b41e7 9158 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
9159 if (toc_relocs == NULL)
9160 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9161 info->keep_memory);
9162 if (toc_relocs == NULL)
9163 goto error_ret;
9164
425b145b
AM
9165 wrel = toc_relocs;
9166 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9167 if ((skip[rel->r_offset >> 3]
9168 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
9169 {
9170 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9171 wrel->r_info = rel->r_info;
9172 wrel->r_addend = rel->r_addend;
9173 ++wrel;
9174 }
9175 else if (!dec_dynrel_count (rel->r_info, toc, info,
9176 &local_syms, NULL, NULL))
9177 goto error_ret;
9178
425b145b
AM
9179 elf_section_data (toc)->relocs = toc_relocs;
9180 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
9181 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9182 sz = rel_hdr->sh_entsize;
9183 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9184 }
c5614fa4 9185 }
c9594989 9186 else if (elf_section_data (toc)->relocs != toc_relocs)
425b145b 9187 free (toc_relocs);
c5614fa4
AM
9188
9189 if (local_syms != NULL
9190 && symtab_hdr->contents != (unsigned char *) local_syms)
9191 {
9192 if (!info->keep_memory)
9193 free (local_syms);
9194 else
9195 symtab_hdr->contents = (unsigned char *) local_syms;
9196 }
9197 free (skip);
9198 }
9199
066f4018 9200 /* Look for cases where we can change an indirect GOT access to
4a421c53
AM
9201 a GOT relative or PC relative access, possibly reducing the
9202 number of GOT entries. */
066f4018
AM
9203 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9204 {
9205 asection *sec;
9206 Elf_Internal_Shdr *symtab_hdr;
9207 Elf_Internal_Sym *local_syms;
9208 Elf_Internal_Rela *relstart, *rel;
9209 bfd_vma got;
9210
9211 if (!is_ppc64_elf (ibfd))
9212 continue;
9213
903b777d 9214 if (!ppc64_elf_tdata (ibfd)->has_optrel)
066f4018
AM
9215 continue;
9216
9217 sec = ppc64_elf_tdata (ibfd)->got;
903b777d
AM
9218 got = 0;
9219 if (sec != NULL)
9220 got = sec->output_section->vma + sec->output_offset + 0x8000;
066f4018
AM
9221
9222 local_syms = NULL;
9223 symtab_hdr = &elf_symtab_hdr (ibfd);
9224
9225 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9226 {
9227 if (sec->reloc_count == 0
903b777d 9228 || !ppc64_elf_section_data (sec)->has_optrel
066f4018
AM
9229 || discarded_section (sec))
9230 continue;
9231
9232 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9233 info->keep_memory);
9234 if (relstart == NULL)
9235 {
9236 got_error_ret:
c9594989 9237 if (symtab_hdr->contents != (unsigned char *) local_syms)
066f4018
AM
9238 free (local_syms);
9239 if (sec != NULL
066f4018
AM
9240 && elf_section_data (sec)->relocs != relstart)
9241 free (relstart);
9242 return FALSE;
9243 }
9244
9245 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9246 {
9247 enum elf_ppc64_reloc_type r_type;
9248 unsigned long r_symndx;
9249 Elf_Internal_Sym *sym;
9250 asection *sym_sec;
9251 struct elf_link_hash_entry *h;
9252 struct got_entry *ent;
133a1f60 9253 bfd_vma val, pc;
4a421c53 9254 unsigned char buf[8];
066f4018 9255 unsigned int insn;
903b777d 9256 enum {no_check, check_lo, check_ha} insn_check;
066f4018
AM
9257
9258 r_type = ELF64_R_TYPE (rel->r_info);
903b777d
AM
9259 switch (r_type)
9260 {
9261 default:
9262 insn_check = no_check;
9263 break;
9264
9265 case R_PPC64_PLT16_HA:
9266 case R_PPC64_GOT_TLSLD16_HA:
9267 case R_PPC64_GOT_TLSGD16_HA:
9268 case R_PPC64_GOT_TPREL16_HA:
9269 case R_PPC64_GOT_DTPREL16_HA:
9270 case R_PPC64_GOT16_HA:
9271 case R_PPC64_TOC16_HA:
9272 insn_check = check_ha;
9273 break;
9274
9275 case R_PPC64_PLT16_LO:
9276 case R_PPC64_PLT16_LO_DS:
9277 case R_PPC64_GOT_TLSLD16_LO:
9278 case R_PPC64_GOT_TLSGD16_LO:
9279 case R_PPC64_GOT_TPREL16_LO_DS:
9280 case R_PPC64_GOT_DTPREL16_LO_DS:
9281 case R_PPC64_GOT16_LO:
9282 case R_PPC64_GOT16_LO_DS:
9283 case R_PPC64_TOC16_LO:
9284 case R_PPC64_TOC16_LO_DS:
9285 insn_check = check_lo;
9286 break;
9287 }
9288
9289 if (insn_check != no_check)
9290 {
9291 bfd_vma off = rel->r_offset & ~3;
9292
9293 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9294 goto got_error_ret;
9295
9296 insn = bfd_get_32 (ibfd, buf);
9297 if (insn_check == check_lo
9298 ? !ok_lo_toc_insn (insn, r_type)
2365f8d7 9299 : ((insn & ((0x3fu << 26) | 0x1f << 16))
903b777d
AM
9300 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9301 {
9302 char str[12];
9303
9304 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9305 sprintf (str, "%#08x", insn);
9306 info->callbacks->einfo
9307 /* xgettext:c-format */
9308 (_("%H: got/toc optimization is not supported for"
9309 " %s instruction\n"),
9310 ibfd, sec, rel->r_offset & ~3, str);
9311 continue;
9312 }
9313 }
9314
066f4018
AM
9315 switch (r_type)
9316 {
bb22a418
AM
9317 /* Note that we don't delete GOT entries for
9318 R_PPC64_GOT16_DS since we'd need a lot more
9319 analysis. For starters, the preliminary layout is
9320 before the GOT, PLT, dynamic sections and stubs are
9321 laid out. Then we'd need to allow for changes in
9322 distance between sections caused by alignment. */
066f4018
AM
9323 default:
9324 continue;
9325
066f4018
AM
9326 case R_PPC64_GOT16_HA:
9327 case R_PPC64_GOT16_LO_DS:
4a421c53 9328 case R_PPC64_GOT_PCREL34:
066f4018
AM
9329 break;
9330 }
9331
9332 r_symndx = ELF64_R_SYM (rel->r_info);
9333 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9334 r_symndx, ibfd))
9335 goto got_error_ret;
9336
6d5554a6
AM
9337 if (sym_sec == NULL
9338 || sym_sec->output_section == NULL
9339 || discarded_section (sym_sec))
9340 continue;
9341
06507dab
AM
9342 if ((h ? h->type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
9343 continue;
9344
066f4018
AM
9345 if (!SYMBOL_REFERENCES_LOCAL (info, h))
9346 continue;
9347
9348 if (h != NULL)
9349 val = h->root.u.def.value;
9350 else
9351 val = sym->st_value;
133a1f60 9352 val += rel->r_addend;
066f4018
AM
9353 val += sym_sec->output_section->vma + sym_sec->output_offset;
9354
bb22a418
AM
9355/* Fudge factor to allow for the fact that the preliminary layout
9356 isn't exact. Reduce limits by this factor. */
9357#define LIMIT_ADJUST(LIMIT) ((LIMIT) - (LIMIT) / 16)
9358
066f4018
AM
9359 switch (r_type)
9360 {
9361 default:
9362 continue;
9363
066f4018 9364 case R_PPC64_GOT16_HA:
bb22a418
AM
9365 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9366 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9367 continue;
9368
9369 if (!bfd_get_section_contents (ibfd, sec, buf,
9370 rel->r_offset & ~3, 4))
9371 goto got_error_ret;
9372 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9373 if (((insn & ((0x3fu << 26) | 0x1f << 16))
066f4018
AM
9374 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9375 continue;
9376 break;
9377
9378 case R_PPC64_GOT16_LO_DS:
bb22a418
AM
9379 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9380 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9381 continue;
9382 if (!bfd_get_section_contents (ibfd, sec, buf,
9383 rel->r_offset & ~3, 4))
9384 goto got_error_ret;
9385 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9386 if ((insn & (0x3fu << 26 | 0x3)) != 58u << 26 /* ld */)
066f4018
AM
9387 continue;
9388 break;
4a421c53
AM
9389
9390 case R_PPC64_GOT_PCREL34:
9391 pc = rel->r_offset;
9392 pc += sec->output_section->vma + sec->output_offset;
bb22a418
AM
9393 if (val - pc + LIMIT_ADJUST (1ULL << 33)
9394 >= LIMIT_ADJUST (1ULL << 34))
4a421c53
AM
9395 continue;
9396 if (!bfd_get_section_contents (ibfd, sec, buf,
9397 rel->r_offset & ~3, 8))
9398 goto got_error_ret;
9399 insn = bfd_get_32 (ibfd, buf);
9400 if ((insn & (-1u << 18)) != ((1u << 26) | (1u << 20)))
9401 continue;
9402 insn = bfd_get_32 (ibfd, buf + 4);
2365f8d7 9403 if ((insn & (0x3fu << 26)) != 57u << 26)
4a421c53
AM
9404 continue;
9405 break;
066f4018 9406 }
bb22a418 9407#undef LIMIT_ADJUST
066f4018
AM
9408
9409 if (h != NULL)
9410 ent = h->got.glist;
9411 else
9412 {
9413 struct got_entry **local_got_ents = elf_local_got_ents (ibfd);
9414 ent = local_got_ents[r_symndx];
9415 }
9416 for (; ent != NULL; ent = ent->next)
133a1f60 9417 if (ent->addend == rel->r_addend
066f4018
AM
9418 && ent->owner == ibfd
9419 && ent->tls_type == 0)
9420 break;
9421 BFD_ASSERT (ent && ent->got.refcount > 0);
9422 ent->got.refcount -= 1;
9423 }
9424
9425 if (elf_section_data (sec)->relocs != relstart)
9426 free (relstart);
9427 }
9428
9429 if (local_syms != NULL
9430 && symtab_hdr->contents != (unsigned char *) local_syms)
9431 {
9432 if (!info->keep_memory)
9433 free (local_syms);
9434 else
9435 symtab_hdr->contents = (unsigned char *) local_syms;
9436 }
9437 }
9438
c5614fa4
AM
9439 return TRUE;
9440}
9441
1bbe0902
AM
9442/* Return true iff input section I references the TOC using
9443 instructions limited to +/-32k offsets. */
9444
9445bfd_boolean
9446ppc64_elf_has_small_toc_reloc (asection *i)
9447{
9448 return (is_ppc64_elf (i->owner)
9449 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9450}
9451
927be08e
AM
9452/* Allocate space for one GOT entry. */
9453
9454static void
9455allocate_got (struct elf_link_hash_entry *h,
9456 struct bfd_link_info *info,
9457 struct got_entry *gent)
9458{
9459 struct ppc_link_hash_table *htab = ppc_hash_table (info);
ed7007c1 9460 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
927be08e
AM
9461 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9462 ? 16 : 8);
9463 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9464 ? 2 : 1) * sizeof (Elf64_External_Rela);
9465 asection *got = ppc64_elf_tdata (gent->owner)->got;
9466
9467 gent->got.offset = got->size;
9468 got->size += entsize;
9469
19e08130 9470 if (h->type == STT_GNU_IFUNC)
927be08e 9471 {
33e44f2e 9472 htab->elf.irelplt->size += rentsize;
19e08130 9473 htab->got_reli_size += rentsize;
927be08e 9474 }
f15d0b54 9475 else if (((bfd_link_pic (info)
f749f26e 9476 && !(gent->tls_type != 0
f15d0b54
AM
9477 && bfd_link_executable (info)
9478 && SYMBOL_REFERENCES_LOCAL (info, h)))
f0158f44
AM
9479 || (htab->elf.dynamic_sections_created
9480 && h->dynindx != -1
9481 && !SYMBOL_REFERENCES_LOCAL (info, h)))
21d68fcd 9482 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
927be08e 9483 {
19e08130 9484 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9485 relgot->size += rentsize;
927be08e
AM
9486 }
9487}
9488
7865406b
AM
9489/* This function merges got entries in the same toc group. */
9490
9491static void
9492merge_got_entries (struct got_entry **pent)
9493{
9494 struct got_entry *ent, *ent2;
9495
9496 for (ent = *pent; ent != NULL; ent = ent->next)
9497 if (!ent->is_indirect)
9498 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9499 if (!ent2->is_indirect
9500 && ent2->addend == ent->addend
9501 && ent2->tls_type == ent->tls_type
9502 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9503 {
9504 ent2->is_indirect = TRUE;
9505 ent2->got.ent = ent;
9506 }
9507}
9508
46434633 9509/* If H is undefined, make it dynamic if that makes sense. */
f0158f44
AM
9510
9511static bfd_boolean
46434633
AM
9512ensure_undef_dynamic (struct bfd_link_info *info,
9513 struct elf_link_hash_entry *h)
f0158f44
AM
9514{
9515 struct elf_link_hash_table *htab = elf_hash_table (info);
9516
9517 if (htab->dynamic_sections_created
46434633
AM
9518 && ((info->dynamic_undefined_weak != 0
9519 && h->root.type == bfd_link_hash_undefweak)
9520 || h->root.type == bfd_link_hash_undefined)
f0158f44
AM
9521 && h->dynindx == -1
9522 && !h->forced_local
9523 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9524 return bfd_elf_link_record_dynamic_symbol (info, h);
9525 return TRUE;
9526}
9527
65f38f15
AM
9528/* Allocate space in .plt, .got and associated reloc sections for
9529 dynamic relocs. */
5bd4f169 9530
b34976b6 9531static bfd_boolean
4ce794b7 9532allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9533{
65f38f15
AM
9534 struct bfd_link_info *info;
9535 struct ppc_link_hash_table *htab;
5bd4f169 9536 asection *s;
65f38f15 9537 struct ppc_link_hash_entry *eh;
0b8bcf0d 9538 struct got_entry **pgent, *gent;
5bd4f169 9539
e92d460e 9540 if (h->root.type == bfd_link_hash_indirect)
b34976b6 9541 return TRUE;
5bd4f169 9542
65f38f15
AM
9543 info = (struct bfd_link_info *) inf;
9544 htab = ppc_hash_table (info);
4dfe6ac6
NC
9545 if (htab == NULL)
9546 return FALSE;
5bd4f169 9547
ed7007c1 9548 eh = ppc_elf_hash_entry (h);
951fd09b
AM
9549 /* Run through the TLS GD got entries first if we're changing them
9550 to TPREL. */
b00a0a86 9551 if ((eh->tls_mask & (TLS_TLS | TLS_GDIE)) == (TLS_TLS | TLS_GDIE))
951fd09b
AM
9552 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9553 if (gent->got.refcount > 0
9554 && (gent->tls_type & TLS_GD) != 0)
9555 {
9556 /* This was a GD entry that has been converted to TPREL. If
9557 there happens to be a TPREL entry we can use that one. */
9558 struct got_entry *ent;
9559 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9560 if (ent->got.refcount > 0
9561 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9562 && ent->addend == gent->addend
9563 && ent->owner == gent->owner)
951fd09b
AM
9564 {
9565 gent->got.refcount = 0;
9566 break;
9567 }
9568
9569 /* If not, then we'll be using our own TPREL entry. */
9570 if (gent->got.refcount != 0)
9571 gent->tls_type = TLS_TLS | TLS_TPREL;
9572 }
9573
7865406b
AM
9574 /* Remove any list entry that won't generate a word in the GOT before
9575 we call merge_got_entries. Otherwise we risk merging to empty
9576 entries. */
0b8bcf0d
AM
9577 pgent = &h->got.glist;
9578 while ((gent = *pgent) != NULL)
411e1bfb 9579 if (gent->got.refcount > 0)
7865406b
AM
9580 {
9581 if ((gent->tls_type & TLS_LD) != 0
f749f26e 9582 && SYMBOL_REFERENCES_LOCAL (info, h))
7865406b
AM
9583 {
9584 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9585 *pgent = gent->next;
9586 }
9587 else
9588 pgent = &gent->next;
9589 }
9590 else
9591 *pgent = gent->next;
9592
9593 if (!htab->do_multi_toc)
9594 merge_got_entries (&h->got.glist);
9595
9596 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9597 if (!gent->is_indirect)
411e1bfb 9598 {
ec73ddcd
AM
9599 /* Ensure we catch all the cases where this symbol should
9600 be made dynamic. */
46434633 9601 if (!ensure_undef_dynamic (info, h))
f0158f44 9602 return FALSE;
65f38f15 9603
0c8d6e5c 9604 if (!is_ppc64_elf (gent->owner))
927be08e 9605 abort ();
0ffa91dd 9606
927be08e 9607 allocate_got (h, info, gent);
411e1bfb 9608 }
65f38f15 9609
954b63d4
AM
9610 /* If no dynamic sections we can't have dynamic relocs, except for
9611 IFUNCs which are handled even in static executables. */
8a2058b5
AM
9612 if (!htab->elf.dynamic_sections_created
9613 && h->type != STT_GNU_IFUNC)
190eb1dd 9614 h->dyn_relocs = NULL;
8a2058b5 9615
529fe20e
AM
9616 /* Discard relocs on undefined symbols that must be local. */
9617 else if (h->root.type == bfd_link_hash_undefined
9618 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
190eb1dd 9619 h->dyn_relocs = NULL;
529fe20e 9620
954b63d4
AM
9621 /* Also discard relocs on undefined weak syms with non-default
9622 visibility, or when dynamic_undefined_weak says so. */
21d68fcd 9623 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
190eb1dd 9624 h->dyn_relocs = NULL;
954b63d4 9625
190eb1dd 9626 if (h->dyn_relocs != NULL)
65f38f15 9627 {
8a2058b5
AM
9628 struct elf_dyn_relocs *p, **pp;
9629
57e7d118
AM
9630 /* In the shared -Bsymbolic case, discard space allocated for
9631 dynamic pc-relative relocs against symbols which turn out to
9632 be defined in regular objects. For the normal shared case,
9633 discard space for relocs that have become local due to symbol
9634 visibility changes. */
57e7d118 9635 if (bfd_link_pic (info))
65f38f15 9636 {
57e7d118
AM
9637 /* Relocs that use pc_count are those that appear on a call
9638 insn, or certain REL relocs (see must_be_dyn_reloc) that
9639 can be generated via assembly. We want calls to
9640 protected symbols to resolve directly to the function
9641 rather than going via the plt. If people want function
9642 pointer comparisons to work as expected then they should
9643 avoid writing weird assembly. */
9644 if (SYMBOL_CALLS_LOCAL (info, h))
9645 {
190eb1dd 9646 for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
57e7d118
AM
9647 {
9648 p->count -= p->pc_count;
9649 p->pc_count = 0;
9650 if (p->count == 0)
9651 *pp = p->next;
9652 else
9653 pp = &p->next;
9654 }
9655 }
65f38f15 9656
190eb1dd 9657 if (h->dyn_relocs != NULL)
5bd4f169 9658 {
ec73ddcd
AM
9659 /* Ensure we catch all the cases where this symbol
9660 should be made dynamic. */
46434633 9661 if (!ensure_undef_dynamic (info, h))
f0158f44 9662 return FALSE;
5bd4f169 9663 }
65f38f15 9664 }
ec73ddcd
AM
9665
9666 /* For a fixed position executable, discard space for
9667 relocs against symbols which are not dynamic. */
9668 else if (h->type != STT_GNU_IFUNC)
57e7d118 9669 {
529fe20e
AM
9670 if (h->dynamic_adjusted
9671 && !h->def_regular
9672 && !ELF_COMMON_DEF_P (h))
f0158f44 9673 {
ec73ddcd
AM
9674 /* Ensure we catch all the cases where this symbol
9675 should be made dynamic. */
46434633 9676 if (!ensure_undef_dynamic (info, h))
f0158f44 9677 return FALSE;
dfbb6ac9 9678
ec73ddcd 9679 /* But if that didn't work out, discard dynamic relocs. */
f0158f44 9680 if (h->dynindx == -1)
190eb1dd 9681 h->dyn_relocs = NULL;
f0158f44
AM
9682 }
9683 else
190eb1dd 9684 h->dyn_relocs = NULL;
57e7d118
AM
9685 }
9686
9687 /* Finally, allocate space. */
190eb1dd 9688 for (p = h->dyn_relocs; p != NULL; p = p->next)
57e7d118
AM
9689 {
9690 asection *sreloc = elf_section_data (p->sec)->sreloc;
9691 if (eh->elf.type == STT_GNU_IFUNC)
9692 sreloc = htab->elf.irelplt;
9693 sreloc->size += p->count * sizeof (Elf64_External_Rela);
dfbb6ac9 9694 }
65f38f15 9695 }
57e7d118 9696
2d7ad24e
AM
9697 /* We might need a PLT entry when the symbol
9698 a) is dynamic, or
9699 b) is an ifunc, or
9700 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
9701 d) has plt16 relocs and we are linking statically. */
9702 if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
9703 || h->type == STT_GNU_IFUNC
9704 || (h->needs_plt && h->dynamic_adjusted)
9705 || (h->needs_plt
9706 && h->def_regular
9707 && !htab->elf.dynamic_sections_created
3e04d765 9708 && !htab->can_convert_all_inline_plt
ed7007c1 9709 && (ppc_elf_hash_entry (h)->tls_mask
2d7ad24e 9710 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
65f38f15 9711 {
57e7d118
AM
9712 struct plt_entry *pent;
9713 bfd_boolean doneone = FALSE;
9714 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9715 if (pent->plt.refcount > 0)
9716 {
9717 if (!htab->elf.dynamic_sections_created
9718 || h->dynindx == -1)
9719 {
2d7ad24e
AM
9720 if (h->type == STT_GNU_IFUNC)
9721 {
9722 s = htab->elf.iplt;
9723 pent->plt.offset = s->size;
9724 s->size += PLT_ENTRY_SIZE (htab);
9725 s = htab->elf.irelplt;
9726 }
9727 else
9728 {
9729 s = htab->pltlocal;
9730 pent->plt.offset = s->size;
9731 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
9732 s = bfd_link_pic (info) ? htab->relpltlocal : NULL;
9733 }
57e7d118
AM
9734 }
9735 else
9736 {
9737 /* If this is the first .plt entry, make room for the special
9738 first entry. */
9739 s = htab->elf.splt;
9740 if (s->size == 0)
9741 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
65f38f15 9742
57e7d118 9743 pent->plt.offset = s->size;
65f38f15 9744
57e7d118
AM
9745 /* Make room for this entry. */
9746 s->size += PLT_ENTRY_SIZE (htab);
65f38f15 9747
57e7d118
AM
9748 /* Make room for the .glink code. */
9749 s = htab->glink;
9750 if (s->size == 0)
9e390558 9751 s->size += GLINK_PLTRESOLVE_SIZE (htab);
57e7d118
AM
9752 if (htab->opd_abi)
9753 {
9754 /* We need bigger stubs past index 32767. */
9e390558 9755 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4)
57e7d118
AM
9756 s->size += 4;
9757 s->size += 2*4;
9758 }
9759 else
9760 s->size += 4;
65f38f15 9761
57e7d118
AM
9762 /* We also need to make an entry in the .rela.plt section. */
9763 s = htab->elf.srelplt;
9764 }
2d7ad24e
AM
9765 if (s != NULL)
9766 s->size += sizeof (Elf64_External_Rela);
57e7d118
AM
9767 doneone = TRUE;
9768 }
9769 else
9770 pent->plt.offset = (bfd_vma) -1;
9771 if (!doneone)
9772 {
9773 h->plt.plist = NULL;
9774 h->needs_plt = 0;
9775 }
65f38f15 9776 }
57e7d118 9777 else
65f38f15 9778 {
57e7d118
AM
9779 h->plt.plist = NULL;
9780 h->needs_plt = 0;
65f38f15
AM
9781 }
9782
b34976b6 9783 return TRUE;
65f38f15
AM
9784}
9785
9e390558
AM
9786#define PPC_LO(v) ((v) & 0xffff)
9787#define PPC_HI(v) (((v) >> 16) & 0xffff)
9788#define PPC_HA(v) PPC_HI ((v) + 0x8000)
04bdff6a
AM
9789#define D34(v) \
9790 ((((v) & 0x3ffff0000ULL) << 16) | (v & 0xffff))
9791#define HA34(v) ((v + (1ULL << 33)) >> 34)
9e390558 9792
a345bc8d
AM
9793/* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9794 to set up space for global entry stubs. These are put in glink,
9795 after the branch table. */
65f38f15 9796
b34976b6 9797static bfd_boolean
a345bc8d 9798size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
65f38f15 9799{
a345bc8d
AM
9800 struct bfd_link_info *info;
9801 struct ppc_link_hash_table *htab;
9802 struct plt_entry *pent;
9e390558 9803 asection *s, *plt;
65f38f15 9804
a345bc8d
AM
9805 if (h->root.type == bfd_link_hash_indirect)
9806 return TRUE;
65f38f15 9807
a345bc8d
AM
9808 if (!h->pointer_equality_needed)
9809 return TRUE;
65f38f15 9810
a345bc8d
AM
9811 if (h->def_regular)
9812 return TRUE;
65f38f15 9813
a345bc8d
AM
9814 info = inf;
9815 htab = ppc_hash_table (info);
9816 if (htab == NULL)
9817 return FALSE;
9818
9e390558
AM
9819 s = htab->global_entry;
9820 plt = htab->elf.splt;
a345bc8d
AM
9821 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9822 if (pent->plt.offset != (bfd_vma) -1
9823 && pent->addend == 0)
9824 {
afe397ea
AM
9825 /* For ELFv2, if this symbol is not defined in a regular file
9826 and we are not generating a shared library or pie, then we
9827 need to define the symbol in the executable on a call stub.
9828 This is to avoid text relocations. */
9e390558
AM
9829 bfd_vma off, stub_align, stub_off, stub_size;
9830 unsigned int align_power;
9831
9832 stub_size = 16;
9833 stub_off = s->size;
9834 if (htab->params->plt_stub_align >= 0)
9835 align_power = htab->params->plt_stub_align;
9836 else
9837 align_power = -htab->params->plt_stub_align;
9838 /* Setting section alignment is delayed until we know it is
9839 non-empty. Otherwise the .text output section will be
9840 aligned at least to plt_stub_align even when no global
9841 entry stubs are needed. */
9842 if (s->alignment_power < align_power)
9843 s->alignment_power = align_power;
9844 stub_align = (bfd_vma) 1 << align_power;
9845 if (htab->params->plt_stub_align >= 0
9846 || ((((stub_off + stub_size - 1) & -stub_align)
9847 - (stub_off & -stub_align))
9848 > ((stub_size - 1) & -stub_align)))
9849 stub_off = (stub_off + stub_align - 1) & -stub_align;
9850 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
9851 off -= stub_off + s->output_offset + s->output_section->vma;
9852 /* Note that for --plt-stub-align negative we have a possible
9853 dependency between stub offset and size. Break that
9854 dependency by assuming the max stub size when calculating
9855 the stub offset. */
9856 if (PPC_HA (off) == 0)
9857 stub_size -= 4;
8a2058b5 9858 h->root.type = bfd_link_hash_defined;
afe397ea 9859 h->root.u.def.section = s;
9e390558
AM
9860 h->root.u.def.value = stub_off;
9861 s->size = stub_off + stub_size;
a345bc8d
AM
9862 break;
9863 }
9864 return TRUE;
9865}
9866
65f38f15
AM
9867/* Set the sizes of the dynamic sections. */
9868
b34976b6 9869static bfd_boolean
ee67d69a 9870ppc64_elf_size_dynamic_sections (bfd *output_bfd,
4ce794b7 9871 struct bfd_link_info *info)
65f38f15
AM
9872{
9873 struct ppc_link_hash_table *htab;
9874 bfd *dynobj;
9875 asection *s;
b34976b6 9876 bfd_boolean relocs;
65f38f15 9877 bfd *ibfd;
7865406b 9878 struct got_entry *first_tlsld;
65f38f15
AM
9879
9880 htab = ppc_hash_table (info);
4dfe6ac6
NC
9881 if (htab == NULL)
9882 return FALSE;
9883
65f38f15
AM
9884 dynobj = htab->elf.dynobj;
9885 if (dynobj == NULL)
9886 abort ();
9887
9888 if (htab->elf.dynamic_sections_created)
9889 {
9890 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 9891 if (bfd_link_executable (info) && !info->nointerp)
65f38f15 9892 {
3d4d4302 9893 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
9894 if (s == NULL)
9895 abort ();
eea6121a 9896 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
9897 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9898 }
9899 }
9900
9901 /* Set up .got offsets for local syms, and space for local dynamic
9902 relocs. */
c72f2fb2 9903 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
65f38f15 9904 {
411e1bfb
AM
9905 struct got_entry **lgot_ents;
9906 struct got_entry **end_lgot_ents;
e054468f
AM
9907 struct plt_entry **local_plt;
9908 struct plt_entry **end_local_plt;
f961d9dd 9909 unsigned char *lgot_masks;
65f38f15
AM
9910 bfd_size_type locsymcount;
9911 Elf_Internal_Shdr *symtab_hdr;
65f38f15 9912
0c8d6e5c 9913 if (!is_ppc64_elf (ibfd))
65f38f15
AM
9914 continue;
9915
9916 for (s = ibfd->sections; s != NULL; s = s->next)
9917 {
19e08130 9918 struct ppc_dyn_relocs *p;
65f38f15 9919
6edfbbad 9920 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 9921 {
ec338859
AM
9922 if (!bfd_is_abs_section (p->sec)
9923 && bfd_is_abs_section (p->sec->output_section))
9924 {
9925 /* Input section has been discarded, either because
9926 it is a copy of a linkonce section or due to
9927 linker script /DISCARD/, so we'll be discarding
9928 the relocs too. */
9929 }
248866a8 9930 else if (p->count != 0)
ec338859 9931 {
19e08130
AM
9932 asection *srel = elf_section_data (p->sec)->sreloc;
9933 if (p->ifunc)
33e44f2e 9934 srel = htab->elf.irelplt;
eea6121a 9935 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
9936 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9937 info->flags |= DF_TEXTREL;
ec338859 9938 }
65f38f15
AM
9939 }
9940 }
9941
411e1bfb
AM
9942 lgot_ents = elf_local_got_ents (ibfd);
9943 if (!lgot_ents)
65f38f15
AM
9944 continue;
9945
0ffa91dd 9946 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 9947 locsymcount = symtab_hdr->sh_info;
411e1bfb 9948 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
9949 local_plt = (struct plt_entry **) end_lgot_ents;
9950 end_local_plt = local_plt + locsymcount;
f961d9dd 9951 lgot_masks = (unsigned char *) end_local_plt;
e717da7e 9952 s = ppc64_elf_tdata (ibfd)->got;
e7b938ca 9953 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 9954 {
0b8bcf0d 9955 struct got_entry **pent, *ent;
411e1bfb 9956
0b8bcf0d
AM
9957 pent = lgot_ents;
9958 while ((ent = *pent) != NULL)
411e1bfb
AM
9959 if (ent->got.refcount > 0)
9960 {
e7b938ca 9961 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 9962 {
927be08e 9963 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 9964 *pent = ent->next;
411e1bfb
AM
9965 }
9966 else
9967 {
19e08130
AM
9968 unsigned int ent_size = 8;
9969 unsigned int rel_size = sizeof (Elf64_External_Rela);
9970
eea6121a 9971 ent->got.offset = s->size;
e7b938ca 9972 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 9973 {
19e08130
AM
9974 ent_size *= 2;
9975 rel_size *= 2;
9976 }
9977 s->size += ent_size;
37da22e5 9978 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 9979 {
33e44f2e 9980 htab->elf.irelplt->size += rel_size;
19e08130
AM
9981 htab->got_reli_size += rel_size;
9982 }
93370e8e
AM
9983 else if (bfd_link_pic (info)
9984 && !(ent->tls_type != 0
9985 && bfd_link_executable (info)))
19e08130
AM
9986 {
9987 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9988 srel->size += rel_size;
927be08e 9989 }
0b8bcf0d 9990 pent = &ent->next;
411e1bfb
AM
9991 }
9992 }
9993 else
0b8bcf0d 9994 *pent = ent->next;
65f38f15 9995 }
e054468f 9996
2d7ad24e
AM
9997 /* Allocate space for plt calls to local syms. */
9998 lgot_masks = (unsigned char *) end_local_plt;
9999 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
e054468f
AM
10000 {
10001 struct plt_entry *ent;
10002
10003 for (ent = *local_plt; ent != NULL; ent = ent->next)
10004 if (ent->plt.refcount > 0)
10005 {
2d7ad24e
AM
10006 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
10007 {
10008 s = htab->elf.iplt;
10009 ent->plt.offset = s->size;
10010 s->size += PLT_ENTRY_SIZE (htab);
10011 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
10012 }
3e04d765
AM
10013 else if (htab->can_convert_all_inline_plt
10014 || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
2d7ad24e
AM
10015 ent->plt.offset = (bfd_vma) -1;
10016 else
10017 {
10018 s = htab->pltlocal;
10019 ent->plt.offset = s->size;
10020 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
10021 if (bfd_link_pic (info))
10022 htab->relpltlocal->size += sizeof (Elf64_External_Rela);
10023 }
e054468f
AM
10024 }
10025 else
10026 ent->plt.offset = (bfd_vma) -1;
10027 }
65f38f15
AM
10028 }
10029
10030 /* Allocate global sym .plt and .got entries, and space for global
10031 sym dynamic relocs. */
4ce794b7 10032 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
a345bc8d 10033
0e1862bb 10034 if (!htab->opd_abi && !bfd_link_pic (info))
a345bc8d 10035 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
65f38f15 10036
7865406b 10037 first_tlsld = NULL;
c72f2fb2 10038 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
102890f0 10039 {
7865406b
AM
10040 struct got_entry *ent;
10041
0c8d6e5c 10042 if (!is_ppc64_elf (ibfd))
102890f0
AM
10043 continue;
10044
7865406b
AM
10045 ent = ppc64_tlsld_got (ibfd);
10046 if (ent->got.refcount > 0)
102890f0 10047 {
7865406b 10048 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 10049 {
7865406b
AM
10050 ent->is_indirect = TRUE;
10051 ent->got.ent = first_tlsld;
10052 }
10053 else
10054 {
10055 if (first_tlsld == NULL)
10056 first_tlsld = ent;
10057 s = ppc64_elf_tdata (ibfd)->got;
10058 ent->got.offset = s->size;
10059 ent->owner = ibfd;
10060 s->size += 16;
f749f26e 10061 if (bfd_link_dll (info))
7865406b
AM
10062 {
10063 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10064 srel->size += sizeof (Elf64_External_Rela);
10065 }
102890f0
AM
10066 }
10067 }
10068 else
7865406b 10069 ent->got.offset = (bfd_vma) -1;
102890f0
AM
10070 }
10071
65f38f15
AM
10072 /* We now have determined the sizes of the various dynamic sections.
10073 Allocate memory for them. */
b34976b6 10074 relocs = FALSE;
65f38f15
AM
10075 for (s = dynobj->sections; s != NULL; s = s->next)
10076 {
10077 if ((s->flags & SEC_LINKER_CREATED) == 0)
10078 continue;
10079
4ce794b7 10080 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
10081 /* These haven't been allocated yet; don't strip. */
10082 continue;
33e44f2e
AM
10083 else if (s == htab->elf.sgot
10084 || s == htab->elf.splt
10085 || s == htab->elf.iplt
2d7ad24e 10086 || s == htab->pltlocal
c456f082 10087 || s == htab->glink
9e390558 10088 || s == htab->global_entry
5474d94f
AM
10089 || s == htab->elf.sdynbss
10090 || s == htab->elf.sdynrelro)
65f38f15
AM
10091 {
10092 /* Strip this section if we don't need it; see the
10093 comment below. */
5bd4f169 10094 }
58d180e8
AM
10095 else if (s == htab->glink_eh_frame)
10096 {
10097 if (!bfd_is_abs_section (s->output_section))
10098 /* Not sized yet. */
10099 continue;
10100 }
70cc837d 10101 else if (CONST_STRNEQ (s->name, ".rela"))
5bd4f169 10102 {
c456f082 10103 if (s->size != 0)
5bd4f169 10104 {
33e44f2e 10105 if (s != htab->elf.srelplt)
b34976b6 10106 relocs = TRUE;
5bd4f169
AM
10107
10108 /* We use the reloc_count field as a counter if we need
10109 to copy relocs into the output file. */
10110 s->reloc_count = 0;
10111 }
10112 }
65f38f15 10113 else
5bd4f169
AM
10114 {
10115 /* It's not one of our sections, so don't allocate space. */
10116 continue;
10117 }
10118
eea6121a 10119 if (s->size == 0)
5bd4f169 10120 {
c456f082
AM
10121 /* If we don't need this section, strip it from the
10122 output file. This is mostly to handle .rela.bss and
10123 .rela.plt. We must create both sections in
10124 create_dynamic_sections, because they must be created
10125 before the linker maps input sections to output
10126 sections. The linker does that before
10127 adjust_dynamic_symbol is called, and it is that
10128 function which decides whether anything needs to go
10129 into these sections. */
8423293d 10130 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
10131 continue;
10132 }
10133
06bcf541
AM
10134 if (bfd_is_abs_section (s->output_section))
10135 _bfd_error_handler (_("warning: discarding dynamic section %s"),
10136 s->name);
10137
c456f082 10138 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
10139 continue;
10140
65f38f15
AM
10141 /* Allocate memory for the section contents. We use bfd_zalloc
10142 here in case unused entries are not reclaimed before the
10143 section's contents are written out. This should not happen,
411e1bfb
AM
10144 but this way if it does we get a R_PPC64_NONE reloc in .rela
10145 sections instead of garbage.
10146 We also rely on the section contents being zero when writing
5474d94f 10147 the GOT and .dynrelro. */
eea6121a 10148 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 10149 if (s->contents == NULL)
b34976b6 10150 return FALSE;
5bd4f169
AM
10151 }
10152
c72f2fb2 10153 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
e717da7e 10154 {
0c8d6e5c 10155 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
10156 continue;
10157
e717da7e 10158 s = ppc64_elf_tdata (ibfd)->got;
33e44f2e 10159 if (s != NULL && s != htab->elf.sgot)
e717da7e 10160 {
eea6121a 10161 if (s->size == 0)
8423293d 10162 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10163 else
10164 {
eea6121a 10165 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10166 if (s->contents == NULL)
10167 return FALSE;
10168 }
10169 }
10170 s = ppc64_elf_tdata (ibfd)->relgot;
10171 if (s != NULL)
10172 {
eea6121a 10173 if (s->size == 0)
8423293d 10174 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10175 else
10176 {
eea6121a 10177 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10178 if (s->contents == NULL)
10179 return FALSE;
10180 relocs = TRUE;
10181 s->reloc_count = 0;
10182 }
10183 }
10184 }
10185
e86ce104 10186 if (htab->elf.dynamic_sections_created)
5bd4f169 10187 {
e8910a83
AM
10188 bfd_boolean tls_opt;
10189
5bd4f169
AM
10190 /* Add some entries to the .dynamic section. We fill in the
10191 values later, in ppc64_elf_finish_dynamic_sections, but we
10192 must add the entries now so that we get the correct size for
10193 the .dynamic section. The DT_DEBUG entry is filled in by the
10194 dynamic linker and used by the debugger. */
dc810e39 10195#define add_dynamic_entry(TAG, VAL) \
5a580b3a 10196 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 10197
0e1862bb 10198 if (bfd_link_executable (info))
5bd4f169 10199 {
dc810e39 10200 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 10201 return FALSE;
5bd4f169
AM
10202 }
10203
33e44f2e 10204 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5bd4f169 10205 {
dc810e39
AM
10206 if (!add_dynamic_entry (DT_PLTGOT, 0)
10207 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10208 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
10209 || !add_dynamic_entry (DT_JMPREL, 0)
10210 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 10211 return FALSE;
5bd4f169
AM
10212 }
10213
ee67d69a 10214 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
10215 {
10216 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10217 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 10218 return FALSE;
19397422
AM
10219 }
10220
7c9cf415 10221 tls_opt = (htab->params->tls_get_addr_opt
9e7028aa
AM
10222 && ((htab->tls_get_addr_fd != NULL
10223 && htab->tls_get_addr_fd->elf.plt.plist != NULL)
10224 || (htab->tga_desc_fd != NULL
10225 && htab->tga_desc_fd->elf.plt.plist != NULL)));
e8910a83
AM
10226 if (tls_opt || !htab->opd_abi)
10227 {
10228 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10229 return FALSE;
10230 }
a7f2871e 10231
5bd4f169
AM
10232 if (relocs)
10233 {
dc810e39
AM
10234 if (!add_dynamic_entry (DT_RELA, 0)
10235 || !add_dynamic_entry (DT_RELASZ, 0)
10236 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 10237 return FALSE;
5bd4f169 10238
65f38f15
AM
10239 /* If any dynamic relocs apply to a read-only section,
10240 then we need a DT_TEXTREL entry. */
248866a8 10241 if ((info->flags & DF_TEXTREL) == 0)
d49e5065
L
10242 elf_link_hash_traverse (&htab->elf,
10243 _bfd_elf_maybe_set_textrel, info);
5bd4f169 10244
65f38f15 10245 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 10246 {
65f38f15 10247 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 10248 return FALSE;
5bd4f169 10249 }
5bd4f169 10250 }
5bd4f169 10251 }
65f38f15 10252#undef add_dynamic_entry
5bd4f169 10253
b34976b6 10254 return TRUE;
5bd4f169
AM
10255}
10256
a345bc8d
AM
10257/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10258
10259static bfd_boolean
10260ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10261{
10262 if (h->plt.plist != NULL
10263 && !h->def_regular
10264 && !h->pointer_equality_needed)
10265 return FALSE;
10266
10267 return _bfd_elf_hash_symbol (h);
10268}
10269
721956f4 10270/* Determine the type of stub needed, if any, for a call. */
5bd4f169 10271
4ce794b7
AM
10272static inline enum ppc_stub_type
10273ppc_type_of_stub (asection *input_sec,
10274 const Elf_Internal_Rela *rel,
10275 struct ppc_link_hash_entry **hash,
e054468f 10276 struct plt_entry **plt_ent,
6911b7dc
AM
10277 bfd_vma destination,
10278 unsigned long local_off)
5bd4f169 10279{
721956f4
AM
10280 struct ppc_link_hash_entry *h = *hash;
10281 bfd_vma location;
10282 bfd_vma branch_offset;
10283 bfd_vma max_branch_offset;
4ce794b7 10284 enum elf_ppc64_reloc_type r_type;
5bd4f169 10285
721956f4
AM
10286 if (h != NULL)
10287 {
e054468f 10288 struct plt_entry *ent;
7fe2b9a6 10289 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
10290 if (h->oh != NULL
10291 && h->oh->is_func_descriptor)
7b8f6675
AM
10292 {
10293 fdh = ppc_follow_link (h->oh);
10294 *hash = fdh;
10295 }
8387904d 10296
e054468f
AM
10297 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10298 if (ent->addend == rel->r_addend
10299 && ent->plt.offset != (bfd_vma) -1)
10300 {
e054468f
AM
10301 *plt_ent = ent;
10302 return ppc_stub_plt_call;
10303 }
5bd4f169 10304
7fe2b9a6
AM
10305 /* Here, we know we don't have a plt entry. If we don't have a
10306 either a defined function descriptor or a defined entry symbol
10307 in a regular object file, then it is pointless trying to make
10308 any other type of stub. */
854b41e7
AM
10309 if (!is_static_defined (&fdh->elf)
10310 && !is_static_defined (&h->elf))
721956f4 10311 return ppc_stub_none;
5d1634d7 10312 }
e054468f
AM
10313 else if (elf_local_got_ents (input_sec->owner) != NULL)
10314 {
10315 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10316 struct plt_entry **local_plt = (struct plt_entry **)
10317 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10318 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10319
10320 if (local_plt[r_symndx] != NULL)
10321 {
10322 struct plt_entry *ent;
10323
10324 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10325 if (ent->addend == rel->r_addend
10326 && ent->plt.offset != (bfd_vma) -1)
10327 {
10328 *plt_ent = ent;
10329 return ppc_stub_plt_call;
10330 }
10331 }
10332 }
5d1634d7 10333
721956f4
AM
10334 /* Determine where the call point is. */
10335 location = (input_sec->output_offset
10336 + input_sec->output_section->vma
10337 + rel->r_offset);
5d1634d7 10338
721956f4
AM
10339 branch_offset = destination - location;
10340 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 10341
721956f4
AM
10342 /* Determine if a long branch stub is needed. */
10343 max_branch_offset = 1 << 25;
23cedd1d
AM
10344 if (r_type == R_PPC64_REL14
10345 || r_type == R_PPC64_REL14_BRTAKEN
10346 || r_type == R_PPC64_REL14_BRNTAKEN)
721956f4 10347 max_branch_offset = 1 << 15;
5d1634d7 10348
6911b7dc 10349 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
721956f4
AM
10350 /* We need a stub. Figure out whether a long_branch or plt_branch
10351 is needed later. */
10352 return ppc_stub_long_branch;
5d1634d7 10353
721956f4 10354 return ppc_stub_none;
5d1634d7
AM
10355}
10356
f891966f
AM
10357/* Gets the address of a label (1:) in r11 and builds an offset in r12,
10358 then adds it to r11 (LOAD false) or loads r12 from r11+r12 (LOAD true).
10359 . mflr %r12
10360 . bcl 20,31,1f
10361 .1: mflr %r11
10362 . mtlr %r12
05d0e962 10363 . lis %r12,xxx-1b@highest
f891966f 10364 . ori %r12,%r12,xxx-1b@higher
05d0e962 10365 . sldi %r12,%r12,32
f891966f 10366 . oris %r12,%r12,xxx-1b@high
05d0e962 10367 . ori %r12,%r12,xxx-1b@l
f891966f 10368 . add/ldx %r12,%r11,%r12 */
05d0e962
AM
10369
10370static bfd_byte *
10371build_offset (bfd *abfd, bfd_byte *p, bfd_vma off, bfd_boolean load)
10372{
f891966f
AM
10373 bfd_put_32 (abfd, MFLR_R12, p);
10374 p += 4;
10375 bfd_put_32 (abfd, BCL_20_31, p);
10376 p += 4;
10377 bfd_put_32 (abfd, MFLR_R11, p);
10378 p += 4;
10379 bfd_put_32 (abfd, MTLR_R12, p);
10380 p += 4;
05d0e962
AM
10381 if (off + 0x8000 < 0x10000)
10382 {
10383 if (load)
10384 bfd_put_32 (abfd, LD_R12_0R11 + PPC_LO (off), p);
10385 else
10386 bfd_put_32 (abfd, ADDI_R12_R11 + PPC_LO (off), p);
10387 p += 4;
10388 }
10389 else if (off + 0x80008000ULL < 0x100000000ULL)
10390 {
10391 bfd_put_32 (abfd, ADDIS_R12_R11 + PPC_HA (off), p);
10392 p += 4;
10393 if (load)
10394 bfd_put_32 (abfd, LD_R12_0R12 + PPC_LO (off), p);
10395 else
10396 bfd_put_32 (abfd, ADDI_R12_R12 + PPC_LO (off), p);
10397 p += 4;
10398 }
10399 else
10400 {
10401 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10402 {
10403 bfd_put_32 (abfd, LI_R12_0 + ((off >> 32) & 0xffff), p);
10404 p += 4;
10405 }
10406 else
10407 {
10408 bfd_put_32 (abfd, LIS_R12 + ((off >> 48) & 0xffff), p);
10409 p += 4;
10410 if (((off >> 32) & 0xffff) != 0)
10411 {
10412 bfd_put_32 (abfd, ORI_R12_R12_0 + ((off >> 32) & 0xffff), p);
10413 p += 4;
10414 }
10415 }
10416 if (((off >> 32) & 0xffffffffULL) != 0)
10417 {
10418 bfd_put_32 (abfd, SLDI_R12_R12_32, p);
10419 p += 4;
10420 }
10421 if (PPC_HI (off) != 0)
10422 {
10423 bfd_put_32 (abfd, ORIS_R12_R12_0 + PPC_HI (off), p);
10424 p += 4;
10425 }
10426 if (PPC_LO (off) != 0)
10427 {
10428 bfd_put_32 (abfd, ORI_R12_R12_0 + PPC_LO (off), p);
10429 p += 4;
10430 }
10431 if (load)
10432 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10433 else
10434 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10435 p += 4;
10436 }
10437 return p;
10438}
10439
10440static unsigned int
10441size_offset (bfd_vma off)
10442{
10443 unsigned int size;
10444 if (off + 0x8000 < 0x10000)
10445 size = 4;
10446 else if (off + 0x80008000ULL < 0x100000000ULL)
10447 size = 8;
10448 else
10449 {
10450 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10451 size = 4;
10452 else
10453 {
10454 size = 4;
10455 if (((off >> 32) & 0xffff) != 0)
10456 size += 4;
10457 }
10458 if (((off >> 32) & 0xffffffffULL) != 0)
10459 size += 4;
10460 if (PPC_HI (off) != 0)
10461 size += 4;
10462 if (PPC_LO (off) != 0)
10463 size += 4;
10464 size += 4;
10465 }
f891966f 10466 return size + 16;
05d0e962
AM
10467}
10468
3d58e1fc
AM
10469static unsigned int
10470num_relocs_for_offset (bfd_vma off)
10471{
10472 unsigned int num_rel;
10473 if (off + 0x8000 < 0x10000)
10474 num_rel = 1;
10475 else if (off + 0x80008000ULL < 0x100000000ULL)
10476 num_rel = 2;
10477 else
10478 {
10479 num_rel = 1;
10480 if (off + 0x800000000000ULL >= 0x1000000000000ULL
10481 && ((off >> 32) & 0xffff) != 0)
10482 num_rel += 1;
10483 if (PPC_HI (off) != 0)
10484 num_rel += 1;
10485 if (PPC_LO (off) != 0)
10486 num_rel += 1;
10487 }
10488 return num_rel;
10489}
10490
10491static Elf_Internal_Rela *
10492emit_relocs_for_offset (struct bfd_link_info *info, Elf_Internal_Rela *r,
10493 bfd_vma roff, bfd_vma targ, bfd_vma off)
10494{
10495 bfd_vma relative_targ = targ - (roff - 8);
10496 if (bfd_big_endian (info->output_bfd))
10497 roff += 2;
10498 r->r_offset = roff;
10499 r->r_addend = relative_targ + roff;
10500 if (off + 0x8000 < 0x10000)
10501 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16);
10502 else if (off + 0x80008000ULL < 0x100000000ULL)
10503 {
10504 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HA);
10505 ++r;
10506 roff += 4;
10507 r->r_offset = roff;
10508 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10509 r->r_addend = relative_targ + roff;
10510 }
10511 else
10512 {
10513 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10514 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10515 else
10516 {
10517 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHEST);
10518 if (((off >> 32) & 0xffff) != 0)
10519 {
10520 ++r;
10521 roff += 4;
10522 r->r_offset = roff;
10523 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10524 r->r_addend = relative_targ + roff;
10525 }
10526 }
10527 if (((off >> 32) & 0xffffffffULL) != 0)
10528 roff += 4;
10529 if (PPC_HI (off) != 0)
10530 {
10531 ++r;
10532 roff += 4;
10533 r->r_offset = roff;
10534 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGH);
10535 r->r_addend = relative_targ + roff;
10536 }
10537 if (PPC_LO (off) != 0)
10538 {
10539 ++r;
10540 roff += 4;
10541 r->r_offset = roff;
10542 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10543 r->r_addend = relative_targ + roff;
10544 }
10545 }
10546 return r;
10547}
10548
04bdff6a 10549static bfd_byte *
7c1f4227 10550build_power10_offset (bfd *abfd, bfd_byte *p, bfd_vma off, int odd,
04bdff6a
AM
10551 bfd_boolean load)
10552{
10553 uint64_t insn;
10554 if (off - odd + (1ULL << 33) < 1ULL << 34)
10555 {
10556 off -= odd;
10557 if (odd)
10558 {
10559 bfd_put_32 (abfd, NOP, p);
10560 p += 4;
10561 }
10562 if (load)
10563 insn = PLD_R12_PC;
10564 else
10565 insn = PADDI_R12_PC;
10566 insn |= D34 (off);
10567 bfd_put_32 (abfd, insn >> 32, p);
10568 p += 4;
10569 bfd_put_32 (abfd, insn, p);
10570 }
10571 /* The minimum value for paddi is -0x200000000. The minimum value
10572 for li is -0x8000, which when shifted by 34 and added gives a
10573 minimum value of -0x2000200000000. The maximum value is
10574 0x1ffffffff+0x7fff<<34 which is 0x2000200000000-1. */
10575 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10576 {
10577 off -= 8 - odd;
10578 bfd_put_32 (abfd, LI_R11_0 | (HA34 (off) & 0xffff), p);
10579 p += 4;
10580 if (!odd)
10581 {
10582 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10583 p += 4;
10584 }
10585 insn = PADDI_R12_PC | D34 (off);
10586 bfd_put_32 (abfd, insn >> 32, p);
10587 p += 4;
10588 bfd_put_32 (abfd, insn, p);
10589 p += 4;
10590 if (odd)
10591 {
10592 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10593 p += 4;
10594 }
10595 if (load)
10596 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10597 else
10598 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10599 }
10600 else
10601 {
10602 off -= odd + 8;
10603 bfd_put_32 (abfd, LIS_R11 | ((HA34 (off) >> 16) & 0x3fff), p);
10604 p += 4;
10605 bfd_put_32 (abfd, ORI_R11_R11_0 | (HA34 (off) & 0xffff), p);
10606 p += 4;
10607 if (odd)
10608 {
10609 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10610 p += 4;
10611 }
10612 insn = PADDI_R12_PC | D34 (off);
10613 bfd_put_32 (abfd, insn >> 32, p);
10614 p += 4;
10615 bfd_put_32 (abfd, insn, p);
10616 p += 4;
10617 if (!odd)
10618 {
10619 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10620 p += 4;
10621 }
10622 if (load)
10623 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10624 else
10625 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10626 }
10627 p += 4;
10628 return p;
10629}
10630
10631static unsigned int
7c1f4227 10632size_power10_offset (bfd_vma off, int odd)
04bdff6a
AM
10633{
10634 if (off - odd + (1ULL << 33) < 1ULL << 34)
10635 return odd + 8;
10636 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10637 return 20;
10638 else
10639 return 24;
10640}
10641
10642static unsigned int
7c1f4227 10643num_relocs_for_power10_offset (bfd_vma off, int odd)
04bdff6a
AM
10644{
10645 if (off - odd + (1ULL << 33) < 1ULL << 34)
10646 return 1;
10647 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10648 return 2;
10649 else
10650 return 3;
10651}
10652
10653static Elf_Internal_Rela *
7c1f4227 10654emit_relocs_for_power10_offset (struct bfd_link_info *info,
04bdff6a
AM
10655 Elf_Internal_Rela *r, bfd_vma roff,
10656 bfd_vma targ, bfd_vma off, int odd)
10657{
10658 if (off - odd + (1ULL << 33) < 1ULL << 34)
10659 roff += odd;
10660 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10661 {
10662 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10663 r->r_offset = roff + d_offset;
10664 r->r_addend = targ + 8 - odd - d_offset;
10665 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10666 ++r;
10667 roff += 8 - odd;
10668 }
10669 else
10670 {
10671 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10672 r->r_offset = roff + d_offset;
10673 r->r_addend = targ + 8 + odd - d_offset;
10674 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHESTA34);
10675 ++r;
10676 roff += 4;
10677 r->r_offset = roff + d_offset;
10678 r->r_addend = targ + 4 + odd - d_offset;
10679 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10680 ++r;
10681 roff += 4 + odd;
10682 }
10683 r->r_offset = roff;
10684 r->r_addend = targ;
10685 r->r_info = ELF64_R_INFO (0, R_PPC64_PCREL34);
10686 return r;
10687}
10688
df136d64
AM
10689/* Emit .eh_frame opcode to advance pc by DELTA. */
10690
10691static bfd_byte *
10692eh_advance (bfd *abfd, bfd_byte *eh, unsigned int delta)
10693{
10694 delta /= 4;
10695 if (delta < 64)
10696 *eh++ = DW_CFA_advance_loc + delta;
10697 else if (delta < 256)
10698 {
10699 *eh++ = DW_CFA_advance_loc1;
10700 *eh++ = delta;
10701 }
10702 else if (delta < 65536)
10703 {
10704 *eh++ = DW_CFA_advance_loc2;
10705 bfd_put_16 (abfd, delta, eh);
10706 eh += 2;
10707 }
10708 else
10709 {
10710 *eh++ = DW_CFA_advance_loc4;
10711 bfd_put_32 (abfd, delta, eh);
10712 eh += 4;
10713 }
10714 return eh;
10715}
10716
10717/* Size of required .eh_frame opcode to advance pc by DELTA. */
10718
10719static unsigned int
10720eh_advance_size (unsigned int delta)
10721{
10722 if (delta < 64 * 4)
10723 /* DW_CFA_advance_loc+[1..63]. */
10724 return 1;
10725 if (delta < 256 * 4)
10726 /* DW_CFA_advance_loc1, byte. */
10727 return 2;
10728 if (delta < 65536 * 4)
10729 /* DW_CFA_advance_loc2, 2 bytes. */
10730 return 3;
10731 /* DW_CFA_advance_loc4, 4 bytes. */
10732 return 5;
10733}
10734
794e51c0
AM
10735/* With power7 weakly ordered memory model, it is possible for ld.so
10736 to update a plt entry in one thread and have another thread see a
10737 stale zero toc entry. To avoid this we need some sort of acquire
10738 barrier in the call stub. One solution is to make the load of the
10739 toc word seem to appear to depend on the load of the function entry
10740 word. Another solution is to test for r2 being zero, and branch to
10741 the appropriate glink entry if so.
10742
10743 . fake dep barrier compare
71a39c98
AM
10744 . ld 12,xxx(2) ld 12,xxx(2)
10745 . mtctr 12 mtctr 12
10746 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
10747 . add 2,2,11 cmpldi 2,0
10748 . ld 2,xxx+8(2) bnectr+
10749 . bctr b <glink_entry>
10750
10751 The solution involving the compare turns out to be faster, so
10752 that's what we use unless the branch won't reach. */
10753
10754#define ALWAYS_USE_FAKE_DEP 0
10755#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 10756
794e51c0
AM
10757static inline unsigned int
10758plt_stub_size (struct ppc_link_hash_table *htab,
10759 struct ppc_stub_hash_entry *stub_entry,
10760 bfd_vma off)
10761{
05d0e962 10762 unsigned size;
b9e5796b 10763
05d0e962
AM
10764 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
10765 {
7c1f4227 10766 if (htab->power10_stubs)
04bdff6a
AM
10767 {
10768 bfd_vma start = (stub_entry->stub_offset
10769 + stub_entry->group->stub_sec->output_offset
10770 + stub_entry->group->stub_sec->output_section->vma);
10771 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10772 start += 4;
7c1f4227 10773 size = 8 + size_power10_offset (off, start & 4);
04bdff6a
AM
10774 }
10775 else
10776 size = 8 + size_offset (off - 8);
05d0e962
AM
10777 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10778 size += 4;
10779 return size;
10780 }
10781
10782 size = 12;
b9e5796b
AM
10783 if (ALWAYS_EMIT_R2SAVE
10784 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10785 size += 4;
10786 if (PPC_HA (off) != 0)
794e51c0 10787 size += 4;
b9e5796b
AM
10788 if (htab->opd_abi)
10789 {
10790 size += 4;
e7d1c40c 10791 if (htab->params->plt_static_chain)
b9e5796b 10792 size += 4;
bd4d2eaa
AM
10793 if (htab->params->plt_thread_safe
10794 && htab->elf.dynamic_sections_created
10795 && stub_entry->h != NULL
10796 && stub_entry->h->elf.dynindx != -1)
b9e5796b 10797 size += 8;
e7d1c40c 10798 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
b9e5796b
AM
10799 size += 4;
10800 }
794e51c0 10801 if (stub_entry->h != NULL
ed7007c1 10802 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 10803 && htab->params->tls_get_addr_opt)
f378ab09 10804 {
9e7028aa
AM
10805 if (htab->params->no_tls_get_addr_regsave)
10806 {
10807 size += 7 * 4;
10808 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
10809 size += 6 * 4;
10810 }
10811 else
10812 {
10813 size += 30 * 4;
10814 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
10815 size += 4;
10816 }
f378ab09 10817 }
794e51c0
AM
10818 return size;
10819}
10820
2420fff6
AM
10821/* Depending on the sign of plt_stub_align:
10822 If positive, return the padding to align to a 2**plt_stub_align
10823 boundary.
10824 If negative, if this stub would cross fewer 2**plt_stub_align
10825 boundaries if we align, then return the padding needed to do so. */
10826
794e51c0
AM
10827static inline unsigned int
10828plt_stub_pad (struct ppc_link_hash_table *htab,
10829 struct ppc_stub_hash_entry *stub_entry,
10830 bfd_vma plt_off)
10831{
2420fff6 10832 int stub_align;
1aa42141 10833 unsigned stub_size;
6f20ed8a 10834 bfd_vma stub_off = stub_entry->group->stub_sec->size;
794e51c0 10835
2420fff6
AM
10836 if (htab->params->plt_stub_align >= 0)
10837 {
10838 stub_align = 1 << htab->params->plt_stub_align;
10839 if ((stub_off & (stub_align - 1)) != 0)
10840 return stub_align - (stub_off & (stub_align - 1));
10841 return 0;
10842 }
10843
10844 stub_align = 1 << -htab->params->plt_stub_align;
1aa42141 10845 stub_size = plt_stub_size (htab, stub_entry, plt_off);
794e51c0 10846 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
e05fa0ba 10847 > ((stub_size - 1) & -stub_align))
794e51c0
AM
10848 return stub_align - (stub_off & (stub_align - 1));
10849 return 0;
10850}
10851
10852/* Build a .plt call stub. */
10853
10854static inline bfd_byte *
10855build_plt_stub (struct ppc_link_hash_table *htab,
10856 struct ppc_stub_hash_entry *stub_entry,
10857 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10858{
e7d1c40c 10859 bfd *obfd = htab->params->stub_bfd;
b9e5796b 10860 bfd_boolean plt_load_toc = htab->opd_abi;
e7d1c40c 10861 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
bd4d2eaa
AM
10862 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10863 && htab->elf.dynamic_sections_created
10864 && stub_entry->h != NULL
10865 && stub_entry->h->elf.dynindx != -1);
794e51c0
AM
10866 bfd_boolean use_fake_dep = plt_thread_safe;
10867 bfd_vma cmp_branch_off = 0;
10868
10869 if (!ALWAYS_USE_FAKE_DEP
b9e5796b 10870 && plt_load_toc
794e51c0 10871 && plt_thread_safe
ed7007c1 10872 && !(is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 10873 && htab->params->tls_get_addr_opt))
794e51c0
AM
10874 {
10875 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
b9e5796b
AM
10876 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10877 / PLT_ENTRY_SIZE (htab));
9e390558 10878 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8;
794e51c0
AM
10879 bfd_vma to, from;
10880
68d62958
AM
10881 if (pltindex > 32768)
10882 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
10883 to = (glinkoff
10884 + htab->glink->output_offset
10885 + htab->glink->output_section->vma);
6f20ed8a 10886 from = (p - stub_entry->group->stub_sec->contents
794e51c0
AM
10887 + 4 * (ALWAYS_EMIT_R2SAVE
10888 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10889 + 4 * (PPC_HA (offset) != 0)
10890 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10891 != PPC_HA (offset))
10892 + 4 * (plt_static_chain != 0)
10893 + 20
6f20ed8a
AM
10894 + stub_entry->group->stub_sec->output_offset
10895 + stub_entry->group->stub_sec->output_section->vma);
794e51c0
AM
10896 cmp_branch_off = to - from;
10897 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10898 }
10899
ac2df442
AM
10900 if (PPC_HA (offset) != 0)
10901 {
176a0d42
AM
10902 if (r != NULL)
10903 {
794e51c0
AM
10904 if (ALWAYS_EMIT_R2SAVE
10905 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10906 r[0].r_offset += 4;
176a0d42 10907 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 10908 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
10909 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10910 r[1].r_addend = r[0].r_addend;
b9e5796b 10911 if (plt_load_toc)
176a0d42 10912 {
b9e5796b 10913 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10914 {
b9e5796b
AM
10915 r[2].r_offset = r[1].r_offset + 4;
10916 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10917 r[2].r_addend = r[0].r_addend;
10918 }
10919 else
10920 {
10921 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10922 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10923 r[2].r_addend = r[0].r_addend + 8;
10924 if (plt_static_chain)
10925 {
10926 r[3].r_offset = r[2].r_offset + 4;
10927 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10928 r[3].r_addend = r[0].r_addend + 16;
10929 }
c7131b65 10930 }
176a0d42
AM
10931 }
10932 }
794e51c0
AM
10933 if (ALWAYS_EMIT_R2SAVE
10934 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10935 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
397998fc
AM
10936 if (plt_load_toc)
10937 {
10938 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10939 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10940 }
10941 else
10942 {
10943 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10944 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10945 }
b9e5796b
AM
10946 if (plt_load_toc
10947 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 10948 {
71a39c98 10949 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
10950 offset = 0;
10951 }
71a39c98 10952 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10953 if (plt_load_toc)
794e51c0 10954 {
b9e5796b
AM
10955 if (use_fake_dep)
10956 {
10957 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10958 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10959 }
10960 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10961 if (plt_static_chain)
10962 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
794e51c0 10963 }
ac2df442
AM
10964 }
10965 else
10966 {
176a0d42
AM
10967 if (r != NULL)
10968 {
794e51c0
AM
10969 if (ALWAYS_EMIT_R2SAVE
10970 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10971 r[0].r_offset += 4;
176a0d42 10972 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
b9e5796b 10973 if (plt_load_toc)
176a0d42 10974 {
b9e5796b 10975 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10976 {
b9e5796b
AM
10977 r[1].r_offset = r[0].r_offset + 4;
10978 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10979 r[1].r_addend = r[0].r_addend;
10980 }
10981 else
10982 {
10983 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10984 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10985 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10986 if (plt_static_chain)
10987 {
10988 r[2].r_offset = r[1].r_offset + 4;
10989 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10990 r[2].r_addend = r[0].r_addend + 8;
10991 }
c7131b65 10992 }
176a0d42
AM
10993 }
10994 }
794e51c0
AM
10995 if (ALWAYS_EMIT_R2SAVE
10996 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10997 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
71a39c98 10998 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
b9e5796b
AM
10999 if (plt_load_toc
11000 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
11001 {
11002 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
11003 offset = 0;
11004 }
71a39c98 11005 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 11006 if (plt_load_toc)
794e51c0 11007 {
b9e5796b
AM
11008 if (use_fake_dep)
11009 {
11010 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
11011 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
11012 }
11013 if (plt_static_chain)
11014 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
11015 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
794e51c0 11016 }
ac2df442 11017 }
b9e5796b 11018 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
794e51c0
AM
11019 {
11020 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
11021 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 11022 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
11023 }
11024 else
407aa07c 11025 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
11026 return p;
11027}
11028
a7f2871e
AM
11029/* Build a special .plt call stub for __tls_get_addr. */
11030
b9ca1af6 11031#define LD_R0_0R3 0xe8030000
a7f2871e
AM
11032#define LD_R12_0R3 0xe9830000
11033#define MR_R0_R3 0x7c601b78
b9ca1af6 11034#define CMPDI_R0_0 0x2c200000
a7f2871e
AM
11035#define ADD_R3_R12_R13 0x7c6c6a14
11036#define BEQLR 0x4d820020
11037#define MR_R3_R0 0x7c030378
a7f2871e 11038#define BCTRL 0x4e800421
a7f2871e
AM
11039
11040static inline bfd_byte *
794e51c0
AM
11041build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
11042 struct ppc_stub_hash_entry *stub_entry,
11043 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 11044{
e7d1c40c 11045 bfd *obfd = htab->params->stub_bfd;
df136d64 11046 bfd_byte *loc = p;
9e7028aa 11047 unsigned int i;
794e51c0 11048
b9ca1af6 11049 bfd_put_32 (obfd, LD_R0_0R3 + 0, p), p += 4;
a7f2871e 11050 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
b9ca1af6 11051 bfd_put_32 (obfd, CMPDI_R0_0, p), p += 4;
a7f2871e 11052 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
a7f2871e
AM
11053 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
11054 bfd_put_32 (obfd, BEQLR, p), p += 4;
11055 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
9e7028aa
AM
11056 if (htab->params->no_tls_get_addr_regsave)
11057 {
11058 if (r != NULL)
11059 r[0].r_offset += 7 * 4;
11060 if (stub_entry->stub_type != ppc_stub_plt_call_r2save)
11061 return build_plt_stub (htab, stub_entry, p, offset, r);
11062
11063 bfd_put_32 (obfd, MFLR_R0, p);
11064 p += 4;
11065 bfd_put_32 (obfd, STD_R0_0R1 + STK_LINKER (htab), p);
11066 p += 4;
11067
11068 if (r != NULL)
11069 r[0].r_offset += 2 * 4;
11070 p = build_plt_stub (htab, stub_entry, p, offset, r);
11071 bfd_put_32 (obfd, BCTRL, p - 4);
11072
11073 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p);
11074 p += 4;
11075 bfd_put_32 (obfd, LD_R0_0R1 + STK_LINKER (htab), p);
11076 p += 4;
11077 bfd_put_32 (obfd, MTLR_R0, p);
11078 p += 4;
11079 bfd_put_32 (obfd, BLR, p);
11080 p += 4;
11081 }
11082 else
11083 {
11084 p = tls_get_addr_prologue (obfd, p, htab);
f378ab09 11085
9e7028aa
AM
11086 if (r != NULL)
11087 r[0].r_offset += 18 * 4;
a7f2871e 11088
9e7028aa
AM
11089 p = build_plt_stub (htab, stub_entry, p, offset, r);
11090 bfd_put_32 (obfd, BCTRL, p - 4);
11091
11092 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
11093 {
11094 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p);
11095 p += 4;
11096 }
a7f2871e 11097
9e7028aa
AM
11098 p = tls_get_addr_epilogue (obfd, p, htab);
11099 }
a7f2871e 11100
df136d64
AM
11101 if (htab->glink_eh_frame != NULL
11102 && htab->glink_eh_frame->size != 0)
11103 {
11104 bfd_byte *base, *eh;
df136d64
AM
11105
11106 base = htab->glink_eh_frame->contents + stub_entry->group->eh_base + 17;
11107 eh = base + stub_entry->group->eh_size;
9e7028aa
AM
11108 if (htab->params->no_tls_get_addr_regsave)
11109 {
11110 unsigned int lr_used, delta;
11111 lr_used = stub_entry->stub_offset + (p - 20 - loc);
11112 delta = lr_used - stub_entry->group->lr_restore;
11113 stub_entry->group->lr_restore = lr_used + 16;
11114 eh = eh_advance (htab->elf.dynobj, eh, delta);
11115 *eh++ = DW_CFA_offset_extended_sf;
11116 *eh++ = 65;
11117 *eh++ = -(STK_LINKER (htab) / 8) & 0x7f;
11118 *eh++ = DW_CFA_advance_loc + 4;
11119 }
11120 else
11121 {
11122 unsigned int cfa_updt, delta;
11123 /* After the bctrl, lr has been modified so we need to emit
11124 .eh_frame info saying the return address is on the stack. In
11125 fact we must put the EH info at or before the call rather
11126 than after it, because the EH info for a call needs to be
11127 specified by that point.
11128 See libgcc/unwind-dw2.c execute_cfa_program.
11129 Any stack pointer update must be described immediately after
11130 the instruction making the change, and since the stdu occurs
11131 after saving regs we put all the reg saves and the cfa
11132 change there. */
11133 cfa_updt = stub_entry->stub_offset + 18 * 4;
11134 delta = cfa_updt - stub_entry->group->lr_restore;
11135 stub_entry->group->lr_restore
11136 = stub_entry->stub_offset + (p - loc) - 4;
11137 eh = eh_advance (htab->elf.dynobj, eh, delta);
11138 *eh++ = DW_CFA_def_cfa_offset;
11139 if (htab->opd_abi)
11140 {
11141 *eh++ = 128;
11142 *eh++ = 1;
11143 }
11144 else
11145 *eh++ = 96;
11146 *eh++ = DW_CFA_offset_extended_sf;
11147 *eh++ = 65;
11148 *eh++ = (-16 / 8) & 0x7f;
11149 for (i = 4; i < 12; i++)
11150 {
11151 *eh++ = DW_CFA_offset + i;
11152 *eh++ = (htab->opd_abi ? 13 : 12) - i;
11153 }
11154 *eh++ = (DW_CFA_advance_loc
11155 + (stub_entry->group->lr_restore - 8 - cfa_updt) / 4);
11156 *eh++ = DW_CFA_def_cfa_offset;
11157 *eh++ = 0;
11158 for (i = 4; i < 12; i++)
11159 *eh++ = DW_CFA_restore + i;
11160 *eh++ = DW_CFA_advance_loc + 2;
11161 }
df136d64
AM
11162 *eh++ = DW_CFA_restore_extended;
11163 *eh++ = 65;
11164 stub_entry->group->eh_size = eh - base;
11165 }
a7f2871e
AM
11166 return p;
11167}
11168
176a0d42
AM
11169static Elf_Internal_Rela *
11170get_relocs (asection *sec, int count)
11171{
11172 Elf_Internal_Rela *relocs;
11173 struct bfd_elf_section_data *elfsec_data;
11174
11175 elfsec_data = elf_section_data (sec);
11176 relocs = elfsec_data->relocs;
11177 if (relocs == NULL)
11178 {
11179 bfd_size_type relsize;
11180 relsize = sec->reloc_count * sizeof (*relocs);
11181 relocs = bfd_alloc (sec->owner, relsize);
11182 if (relocs == NULL)
11183 return NULL;
11184 elfsec_data->relocs = relocs;
d4730f92
BS
11185 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
11186 sizeof (Elf_Internal_Shdr));
11187 if (elfsec_data->rela.hdr == NULL)
11188 return NULL;
11189 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
11190 * sizeof (Elf64_External_Rela));
11191 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
11192 sec->reloc_count = 0;
11193 }
11194 relocs += sec->reloc_count;
11195 sec->reloc_count += count;
11196 return relocs;
11197}
11198
3d58e1fc
AM
11199/* Convert the relocs R[0] thru R[-NUM_REL+1], which are all no-symbol
11200 forms, to the equivalent relocs against the global symbol given by
11201 STUB_ENTRY->H. */
11202
11203static bfd_boolean
11204use_global_in_relocs (struct ppc_link_hash_table *htab,
11205 struct ppc_stub_hash_entry *stub_entry,
11206 Elf_Internal_Rela *r, unsigned int num_rel)
11207{
11208 struct elf_link_hash_entry **hashes;
11209 unsigned long symndx;
11210 struct ppc_link_hash_entry *h;
11211 bfd_vma symval;
11212
11213 /* Relocs are always against symbols in their own object file. Fake
11214 up global sym hashes for the stub bfd (which has no symbols). */
11215 hashes = elf_sym_hashes (htab->params->stub_bfd);
11216 if (hashes == NULL)
11217 {
11218 bfd_size_type hsize;
11219
11220 /* When called the first time, stub_globals will contain the
11221 total number of symbols seen during stub sizing. After
11222 allocating, stub_globals is used as an index to fill the
11223 hashes array. */
11224 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
11225 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
11226 if (hashes == NULL)
11227 return FALSE;
11228 elf_sym_hashes (htab->params->stub_bfd) = hashes;
11229 htab->stub_globals = 1;
11230 }
11231 symndx = htab->stub_globals++;
11232 h = stub_entry->h;
11233 hashes[symndx] = &h->elf;
11234 if (h->oh != NULL && h->oh->is_func)
11235 h = ppc_follow_link (h->oh);
11236 BFD_ASSERT (h->elf.root.type == bfd_link_hash_defined
11237 || h->elf.root.type == bfd_link_hash_defweak);
ed7007c1 11238 symval = defined_sym_val (&h->elf);
3d58e1fc
AM
11239 while (num_rel-- != 0)
11240 {
11241 r->r_info = ELF64_R_INFO (symndx, ELF64_R_TYPE (r->r_info));
11242 if (h->elf.root.u.def.section != stub_entry->target_section)
11243 {
11244 /* H is an opd symbol. The addend must be zero, and the
11245 branch reloc is the only one we can convert. */
11246 r->r_addend = 0;
11247 break;
11248 }
11249 else
11250 r->r_addend -= symval;
11251 --r;
11252 }
11253 return TRUE;
11254}
11255
aa374f67 11256static bfd_vma
25f53a85 11257get_r2off (struct bfd_link_info *info,
aa374f67
AM
11258 struct ppc_stub_hash_entry *stub_entry)
11259{
25f53a85 11260 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 11261 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
aa374f67
AM
11262
11263 if (r2off == 0)
11264 {
11265 /* Support linking -R objects. Get the toc pointer from the
11266 opd entry. */
11267 char buf[8];
b9e5796b
AM
11268 if (!htab->opd_abi)
11269 return r2off;
aa374f67
AM
11270 asection *opd = stub_entry->h->elf.root.u.def.section;
11271 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
11272
11273 if (strcmp (opd->name, ".opd") != 0
11274 || opd->reloc_count != 0)
11275 {
2cdcc330
AM
11276 info->callbacks->einfo
11277 (_("%P: cannot find opd entry toc for `%pT'\n"),
11278 stub_entry->h->elf.root.root.string);
aa374f67 11279 bfd_set_error (bfd_error_bad_value);
a7c49797 11280 return (bfd_vma) -1;
aa374f67
AM
11281 }
11282 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
a7c49797 11283 return (bfd_vma) -1;
aa374f67 11284 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 11285 r2off -= elf_gp (info->output_bfd);
aa374f67 11286 }
6f20ed8a 11287 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
aa374f67
AM
11288 return r2off;
11289}
11290
b34976b6 11291static bfd_boolean
4ce794b7 11292ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 11293{
721956f4
AM
11294 struct ppc_stub_hash_entry *stub_entry;
11295 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
11296 struct bfd_link_info *info;
11297 struct ppc_link_hash_table *htab;
721956f4 11298 bfd_byte *loc;
3d58e1fc 11299 bfd_byte *p, *relp;
1aa42141 11300 bfd_vma targ, off;
176a0d42 11301 Elf_Internal_Rela *r;
e054468f 11302 asection *plt;
3d58e1fc 11303 int num_rel;
04bdff6a 11304 int odd;
5d1634d7 11305
721956f4
AM
11306 /* Massage our args to the form they really have. */
11307 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 11308 info = in_arg;
5d1634d7 11309
abf874aa
CL
11310 /* Fail if the target section could not be assigned to an output
11311 section. The user should fix his linker script. */
11312 if (stub_entry->target_section != NULL
11313 && stub_entry->target_section->output_section == NULL
11314 && info->non_contiguous_regions)
53215f21
CL
11315 info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
11316 "Retry without --enable-non-contiguous-regions.\n"),
11317 stub_entry->target_section);
abf874aa
CL
11318
11319 /* Same for the group. */
11320 if (stub_entry->group->stub_sec != NULL
11321 && stub_entry->group->stub_sec->output_section == NULL
11322 && info->non_contiguous_regions)
53215f21
CL
11323 info->callbacks->einfo (_("%F%P: Could not assign group %pA target %pA to an "
11324 "output section. Retry without "
11325 "--enable-non-contiguous-regions.\n"),
11326 stub_entry->group->stub_sec,
11327 stub_entry->target_section);
abf874aa 11328
5d1634d7 11329 htab = ppc_hash_table (info);
4dfe6ac6
NC
11330 if (htab == NULL)
11331 return FALSE;
5d1634d7 11332
1aa42141 11333 BFD_ASSERT (stub_entry->stub_offset >= stub_entry->group->stub_sec->size);
6f20ed8a 11334 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
721956f4 11335
4ce794b7 11336 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 11337 switch (stub_entry->stub_type)
5d1634d7 11338 {
721956f4 11339 case ppc_stub_long_branch:
ad8e1ba5 11340 case ppc_stub_long_branch_r2off:
721956f4 11341 /* Branches are relative. This is where we are going to. */
1aa42141 11342 targ = (stub_entry->target_value
6911b7dc
AM
11343 + stub_entry->target_section->output_offset
11344 + stub_entry->target_section->output_section->vma);
1aa42141 11345 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
5d1634d7 11346
721956f4 11347 /* And this is where we are coming from. */
1aa42141
AM
11348 off = (stub_entry->stub_offset
11349 + stub_entry->group->stub_sec->output_offset
11350 + stub_entry->group->stub_sec->output_section->vma);
11351 off = targ - off;
e86ce104 11352
9e390558 11353 p = loc;
ac2df442 11354 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 11355 {
25f53a85 11356 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 11357
a7c49797 11358 if (r2off == (bfd_vma) -1)
aa374f67
AM
11359 {
11360 htab->stub_error = TRUE;
11361 return FALSE;
11362 }
9e390558
AM
11363 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11364 p += 4;
ac2df442
AM
11365 if (PPC_HA (r2off) != 0)
11366 {
e7d1c40c 11367 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11368 ADDIS_R2_R2 | PPC_HA (r2off), p);
11369 p += 4;
a7c49797
AM
11370 }
11371 if (PPC_LO (r2off) != 0)
11372 {
11373 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11374 ADDI_R2_R2 | PPC_LO (r2off), p);
11375 p += 4;
ac2df442 11376 }
9e390558 11377 off -= p - loc;
ad8e1ba5 11378 }
9e390558
AM
11379 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p);
11380 p += 4;
ad8e1ba5 11381
5c3dead3
AM
11382 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11383 {
cf97bcb0
AM
11384 _bfd_error_handler
11385 (_("long branch stub `%s' offset overflow"),
bc30df16 11386 stub_entry->root.string);
5c3dead3
AM
11387 htab->stub_error = TRUE;
11388 return FALSE;
11389 }
ee75fd95
AM
11390
11391 if (info->emitrelocations)
11392 {
6f20ed8a 11393 r = get_relocs (stub_entry->group->stub_sec, 1);
176a0d42
AM
11394 if (r == NULL)
11395 return FALSE;
9e390558 11396 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
ee75fd95 11397 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
1aa42141 11398 r->r_addend = targ;
3d58e1fc
AM
11399 if (stub_entry->h != NULL
11400 && !use_global_in_relocs (htab, stub_entry, r, 1))
11401 return FALSE;
ee75fd95 11402 }
721956f4 11403 break;
e86ce104 11404
721956f4 11405 case ppc_stub_plt_branch:
ad8e1ba5 11406 case ppc_stub_plt_branch_r2off:
721956f4
AM
11407 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11408 stub_entry->root.string + 9,
b34976b6 11409 FALSE, FALSE);
721956f4
AM
11410 if (br_entry == NULL)
11411 {
cf97bcb0
AM
11412 _bfd_error_handler (_("can't find branch stub `%s'"),
11413 stub_entry->root.string);
b34976b6
AM
11414 htab->stub_error = TRUE;
11415 return FALSE;
721956f4
AM
11416 }
11417
1aa42141 11418 targ = (stub_entry->target_value
176a0d42
AM
11419 + stub_entry->target_section->output_offset
11420 + stub_entry->target_section->output_section->vma);
6911b7dc 11421 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
1aa42141 11422 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 11423
1aa42141 11424 bfd_put_64 (htab->brlt->owner, targ,
4ce794b7 11425 htab->brlt->contents + br_entry->offset);
721956f4 11426
f94498ff 11427 if (br_entry->iter == htab->stub_iteration)
721956f4 11428 {
f94498ff 11429 br_entry->iter = 0;
84f5d08e 11430
f94498ff 11431 if (htab->relbrlt != NULL)
84f5d08e 11432 {
f94498ff
AM
11433 /* Create a reloc for the branch lookup table entry. */
11434 Elf_Internal_Rela rela;
11435 bfd_byte *rl;
11436
11437 rela.r_offset = (br_entry->offset
11438 + htab->brlt->output_offset
11439 + htab->brlt->output_section->vma);
11440 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11441 rela.r_addend = targ;
f94498ff
AM
11442
11443 rl = htab->relbrlt->contents;
11444 rl += (htab->relbrlt->reloc_count++
11445 * sizeof (Elf64_External_Rela));
11446 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
11447 }
11448 else if (info->emitrelocations)
11449 {
176a0d42
AM
11450 r = get_relocs (htab->brlt, 1);
11451 if (r == NULL)
11452 return FALSE;
11453 /* brlt, being SEC_LINKER_CREATED does not go through the
11454 normal reloc processing. Symbols and offsets are not
11455 translated from input file to output file form, so
11456 set up the offset per the output file. */
f94498ff
AM
11457 r->r_offset = (br_entry->offset
11458 + htab->brlt->output_offset
11459 + htab->brlt->output_section->vma);
11460 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11461 r->r_addend = targ;
84f5d08e 11462 }
84f5d08e 11463 }
721956f4 11464
1aa42141 11465 targ = (br_entry->offset
176a0d42
AM
11466 + htab->brlt->output_offset
11467 + htab->brlt->output_section->vma);
11468
1aa42141
AM
11469 off = (elf_gp (info->output_bfd)
11470 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11471 off = targ - off;
721956f4 11472
ad8e1ba5 11473 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 11474 {
25f53a85 11475 info->callbacks->einfo
c1c8c1ef 11476 (_("%P: linkage table error against `%pT'\n"),
721956f4 11477 stub_entry->root.string);
5d1634d7 11478 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11479 htab->stub_error = TRUE;
11480 return FALSE;
5d1634d7 11481 }
41bd81ab 11482
176a0d42
AM
11483 if (info->emitrelocations)
11484 {
6f20ed8a 11485 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
176a0d42
AM
11486 if (r == NULL)
11487 return FALSE;
6f20ed8a 11488 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11489 if (bfd_big_endian (info->output_bfd))
11490 r[0].r_offset += 2;
00f412ee 11491 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
176a0d42
AM
11492 r[0].r_offset += 4;
11493 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
1aa42141 11494 r[0].r_addend = targ;
176a0d42
AM
11495 if (PPC_HA (off) != 0)
11496 {
11497 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11498 r[1].r_offset = r[0].r_offset + 4;
11499 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11500 r[1].r_addend = r[0].r_addend;
11501 }
11502 }
11503
9e390558 11504 p = loc;
00f412ee 11505 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ad8e1ba5 11506 {
176a0d42 11507 if (PPC_HA (off) != 0)
ac2df442 11508 {
e7d1c40c 11509 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11510 ADDIS_R12_R2 | PPC_HA (off), p);
11511 p += 4;
e7d1c40c 11512 bfd_put_32 (htab->params->stub_bfd,
9e390558 11513 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11514 }
11515 else
9e390558
AM
11516 bfd_put_32 (htab->params->stub_bfd,
11517 LD_R12_0R2 | PPC_LO (off), p);
ad8e1ba5
AM
11518 }
11519 else
11520 {
25f53a85 11521 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 11522
a7c49797 11523 if (r2off == (bfd_vma) -1)
aa374f67
AM
11524 {
11525 htab->stub_error = TRUE;
11526 return FALSE;
11527 }
ad8e1ba5 11528
9e390558
AM
11529 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11530 p += 4;
176a0d42 11531 if (PPC_HA (off) != 0)
ac2df442 11532 {
e7d1c40c 11533 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11534 ADDIS_R12_R2 | PPC_HA (off), p);
11535 p += 4;
e7d1c40c 11536 bfd_put_32 (htab->params->stub_bfd,
9e390558 11537 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11538 }
11539 else
9e390558 11540 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p);
ac2df442
AM
11541
11542 if (PPC_HA (r2off) != 0)
11543 {
9e390558 11544 p += 4;
e7d1c40c 11545 bfd_put_32 (htab->params->stub_bfd,
9e390558 11546 ADDIS_R2_R2 | PPC_HA (r2off), p);
00f412ee
AM
11547 }
11548 if (PPC_LO (r2off) != 0)
11549 {
9e390558 11550 p += 4;
e7d1c40c 11551 bfd_put_32 (htab->params->stub_bfd,
9e390558 11552 ADDI_R2_R2 | PPC_LO (r2off), p);
ac2df442 11553 }
ad8e1ba5 11554 }
9e390558
AM
11555 p += 4;
11556 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11557 p += 4;
407aa07c
AM
11558 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11559 p += 4;
721956f4 11560 break;
5d1634d7 11561
05d0e962
AM
11562 case ppc_stub_long_branch_notoc:
11563 case ppc_stub_long_branch_both:
11564 case ppc_stub_plt_branch_notoc:
11565 case ppc_stub_plt_branch_both:
11566 case ppc_stub_plt_call_notoc:
11567 case ppc_stub_plt_call_both:
11568 p = loc;
f891966f 11569 off = (stub_entry->stub_offset
05d0e962
AM
11570 + stub_entry->group->stub_sec->output_offset
11571 + stub_entry->group->stub_sec->output_section->vma);
11572 if (stub_entry->stub_type == ppc_stub_long_branch_both
11573 || stub_entry->stub_type == ppc_stub_plt_branch_both
11574 || stub_entry->stub_type == ppc_stub_plt_call_both)
11575 {
11576 off += 4;
11577 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11578 p += 4;
11579 }
11580 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
11581 {
11582 targ = stub_entry->plt_ent->plt.offset & ~1;
11583 if (targ >= (bfd_vma) -2)
11584 abort ();
11585
11586 plt = htab->elf.splt;
11587 if (!htab->elf.dynamic_sections_created
11588 || stub_entry->h == NULL
11589 || stub_entry->h->elf.dynindx == -1)
11590 {
11591 if (stub_entry->symtype == STT_GNU_IFUNC)
11592 plt = htab->elf.iplt;
11593 else
11594 plt = htab->pltlocal;
11595 }
11596 targ += plt->output_offset + plt->output_section->vma;
11597 }
11598 else
11599 targ = (stub_entry->target_value
11600 + stub_entry->target_section->output_offset
11601 + stub_entry->target_section->output_section->vma);
04bdff6a 11602 odd = off & 4;
05d0e962 11603 off = targ - off;
f891966f 11604
3d58e1fc
AM
11605 relp = p;
11606 num_rel = 0;
7c1f4227 11607 if (htab->power10_stubs)
04bdff6a
AM
11608 {
11609 bfd_boolean load = stub_entry->stub_type >= ppc_stub_plt_call_notoc;
7c1f4227 11610 p = build_power10_offset (htab->params->stub_bfd, p, off, odd, load);
04bdff6a
AM
11611 }
11612 else
11613 {
11614 /* The notoc stubs calculate their target (either a PLT entry or
11615 the global entry point of a function) relative to the PC
11616 returned by the "bcl" two instructions past the start of the
11617 sequence emitted by build_offset. The offset is therefore 8
11618 less than calculated from the start of the sequence. */
11619 off -= 8;
11620 p = build_offset (htab->params->stub_bfd, p, off,
11621 stub_entry->stub_type >= ppc_stub_plt_call_notoc);
11622 }
11623
f891966f 11624 if (stub_entry->stub_type <= ppc_stub_long_branch_both)
05d0e962 11625 {
f891966f 11626 bfd_vma from;
3d58e1fc 11627 num_rel = 1;
f891966f
AM
11628 from = (stub_entry->stub_offset
11629 + stub_entry->group->stub_sec->output_offset
11630 + stub_entry->group->stub_sec->output_section->vma
11631 + (p - loc));
05d0e962 11632 bfd_put_32 (htab->params->stub_bfd,
f891966f 11633 B_DOT | ((targ - from) & 0x3fffffc), p);
05d0e962
AM
11634 }
11635 else
11636 {
11637 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11638 p += 4;
11639 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11640 }
11641 p += 4;
df136d64 11642
3d58e1fc
AM
11643 if (info->emitrelocations)
11644 {
04bdff6a 11645 bfd_vma roff = relp - stub_entry->group->stub_sec->contents;
7c1f4227
AM
11646 if (htab->power10_stubs)
11647 num_rel += num_relocs_for_power10_offset (off, odd);
04bdff6a
AM
11648 else
11649 {
11650 num_rel += num_relocs_for_offset (off);
11651 roff += 16;
11652 }
3d58e1fc
AM
11653 r = get_relocs (stub_entry->group->stub_sec, num_rel);
11654 if (r == NULL)
11655 return FALSE;
7c1f4227
AM
11656 if (htab->power10_stubs)
11657 r = emit_relocs_for_power10_offset (info, r, roff, targ, off, odd);
04bdff6a
AM
11658 else
11659 r = emit_relocs_for_offset (info, r, roff, targ, off);
3d58e1fc
AM
11660 if (stub_entry->stub_type == ppc_stub_long_branch_notoc
11661 || stub_entry->stub_type == ppc_stub_long_branch_both)
11662 {
11663 ++r;
11664 roff = p - 4 - stub_entry->group->stub_sec->contents;
11665 r->r_offset = roff;
11666 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
11667 r->r_addend = targ;
11668 if (stub_entry->h != NULL
11669 && !use_global_in_relocs (htab, stub_entry, r, num_rel))
11670 return FALSE;
11671 }
11672 }
11673
7c1f4227 11674 if (!htab->power10_stubs
04bdff6a
AM
11675 && htab->glink_eh_frame != NULL
11676 && htab->glink_eh_frame->size != 0)
df136d64
AM
11677 {
11678 bfd_byte *base, *eh;
11679 unsigned int lr_used, delta;
11680
11681 base = (htab->glink_eh_frame->contents
11682 + stub_entry->group->eh_base + 17);
11683 eh = base + stub_entry->group->eh_size;
11684 lr_used = stub_entry->stub_offset + 8;
11685 if (stub_entry->stub_type == ppc_stub_long_branch_both
11686 || stub_entry->stub_type == ppc_stub_plt_branch_both
11687 || stub_entry->stub_type == ppc_stub_plt_call_both)
11688 lr_used += 4;
11689 delta = lr_used - stub_entry->group->lr_restore;
11690 stub_entry->group->lr_restore = lr_used + 8;
11691 eh = eh_advance (htab->elf.dynobj, eh, delta);
11692 *eh++ = DW_CFA_register;
11693 *eh++ = 65;
11694 *eh++ = 12;
11695 *eh++ = DW_CFA_advance_loc + 2;
11696 *eh++ = DW_CFA_restore_extended;
11697 *eh++ = 65;
11698 stub_entry->group->eh_size = eh - base;
11699 }
05d0e962
AM
11700 break;
11701
721956f4 11702 case ppc_stub_plt_call:
794e51c0 11703 case ppc_stub_plt_call_r2save:
e054468f 11704 if (stub_entry->h != NULL
b31867b6
AM
11705 && stub_entry->h->is_func_descriptor
11706 && stub_entry->h->oh != NULL)
c862ae31 11707 {
b31867b6
AM
11708 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11709
11710 /* If the old-ABI "dot-symbol" is undefined make it weak so
6f20ed8a 11711 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
8c5b4e52
AM
11712 if (fh->elf.root.type == bfd_link_hash_undefined
11713 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11714 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
b31867b6 11715 fh->elf.root.type = bfd_link_hash_undefweak;
c862ae31
AM
11716 }
11717
721956f4 11718 /* Now build the stub. */
1aa42141
AM
11719 targ = stub_entry->plt_ent->plt.offset & ~1;
11720 if (targ >= (bfd_vma) -2)
721956f4
AM
11721 abort ();
11722
33e44f2e 11723 plt = htab->elf.splt;
25f23106
AM
11724 if (!htab->elf.dynamic_sections_created
11725 || stub_entry->h == NULL
11726 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11727 {
11728 if (stub_entry->symtype == STT_GNU_IFUNC)
11729 plt = htab->elf.iplt;
11730 else
11731 plt = htab->pltlocal;
11732 }
1aa42141 11733 targ += plt->output_offset + plt->output_section->vma;
e054468f 11734
1aa42141
AM
11735 off = (elf_gp (info->output_bfd)
11736 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11737 off = targ - off;
721956f4 11738
ad8e1ba5 11739 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 11740 {
25f53a85 11741 info->callbacks->einfo
695344c0 11742 /* xgettext:c-format */
c1c8c1ef 11743 (_("%P: linkage table error against `%pT'\n"),
e054468f
AM
11744 stub_entry->h != NULL
11745 ? stub_entry->h->elf.root.root.string
11746 : "<local sym>");
721956f4 11747 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11748 htab->stub_error = TRUE;
11749 return FALSE;
721956f4
AM
11750 }
11751
176a0d42
AM
11752 r = NULL;
11753 if (info->emitrelocations)
11754 {
6f20ed8a 11755 r = get_relocs (stub_entry->group->stub_sec,
3ba720c7
AM
11756 ((PPC_HA (off) != 0)
11757 + (htab->opd_abi
e7d1c40c 11758 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
11759 && PPC_HA (off + 16) == PPC_HA (off))
11760 : 1)));
176a0d42
AM
11761 if (r == NULL)
11762 return FALSE;
6f20ed8a 11763 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11764 if (bfd_big_endian (info->output_bfd))
11765 r[0].r_offset += 2;
1aa42141 11766 r[0].r_addend = targ;
176a0d42 11767 }
a7f2871e 11768 if (stub_entry->h != NULL
ed7007c1 11769 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 11770 && htab->params->tls_get_addr_opt)
794e51c0 11771 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 11772 else
794e51c0 11773 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
11774 break;
11775
a4b6fadd
AM
11776 case ppc_stub_save_res:
11777 return TRUE;
11778
721956f4
AM
11779 default:
11780 BFD_FAIL ();
b34976b6 11781 return FALSE;
721956f4
AM
11782 }
11783
1aa42141 11784 stub_entry->group->stub_sec->size = stub_entry->stub_offset + (p - loc);
97b639ba 11785
e7d1c40c 11786 if (htab->params->emit_stub_syms)
97b639ba
AM
11787 {
11788 struct elf_link_hash_entry *h;
ee75fd95
AM
11789 size_t len1, len2;
11790 char *name;
11791 const char *const stub_str[] = { "long_branch",
05d0e962
AM
11792 "long_branch",
11793 "long_branch",
3f6ff479
AM
11794 "long_branch",
11795 "plt_branch",
ee75fd95 11796 "plt_branch",
05d0e962
AM
11797 "plt_branch",
11798 "plt_branch",
11799 "plt_call",
11800 "plt_call",
794e51c0 11801 "plt_call",
ee75fd95
AM
11802 "plt_call" };
11803
11804 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11805 len2 = strlen (stub_entry->root.string);
11806 name = bfd_malloc (len1 + len2 + 2);
11807 if (name == NULL)
11808 return FALSE;
11809 memcpy (name, stub_entry->root.string, 9);
11810 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11811 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11812 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
11813 if (h == NULL)
11814 return FALSE;
11815 if (h->root.type == bfd_link_hash_new)
11816 {
11817 h->root.type = bfd_link_hash_defined;
6f20ed8a 11818 h->root.u.def.section = stub_entry->group->stub_sec;
97b639ba 11819 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
11820 h->ref_regular = 1;
11821 h->def_regular = 1;
11822 h->ref_regular_nonweak = 1;
11823 h->forced_local = 1;
11824 h->non_elf = 0;
2ec55de3 11825 h->root.linker_def = 1;
97b639ba
AM
11826 }
11827 }
11828
b34976b6 11829 return TRUE;
721956f4
AM
11830}
11831
11832/* As above, but don't actually build the stub. Just bump offset so
11833 we know stub section sizes, and select plt_branch stubs where
11834 long_branch stubs won't do. */
11835
b34976b6 11836static bfd_boolean
4ce794b7 11837ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
11838{
11839 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 11840 struct bfd_link_info *info;
721956f4 11841 struct ppc_link_hash_table *htab;
f891966f
AM
11842 asection *plt;
11843 bfd_vma targ, off, r2off;
04bdff6a 11844 unsigned int size, extra, lr_used, delta, odd;
721956f4
AM
11845
11846 /* Massage our args to the form they really have. */
11847 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
11848 info = in_arg;
11849
11850 htab = ppc_hash_table (info);
4dfe6ac6
NC
11851 if (htab == NULL)
11852 return FALSE;
721956f4 11853
abf874aa
CL
11854 /* Fail if the target section could not be assigned to an output
11855 section. The user should fix his linker script. */
11856 if (stub_entry->target_section != NULL
11857 && stub_entry->target_section->output_section == NULL
11858 && info->non_contiguous_regions)
53215f21
CL
11859 info->callbacks->einfo (_("%F%P: Could not assign %pA to an output section. "
11860 "Retry without --enable-non-contiguous-regions.\n"),
11861 stub_entry->target_section);
abf874aa
CL
11862
11863 /* Same for the group. */
11864 if (stub_entry->group->stub_sec != NULL
11865 && stub_entry->group->stub_sec->output_section == NULL
11866 && info->non_contiguous_regions)
53215f21
CL
11867 info->callbacks->einfo (_("%F%P: Could not assign group %pA target %pA to an "
11868 "output section. Retry without "
11869 "--enable-non-contiguous-regions.\n"),
11870 stub_entry->group->stub_sec,
11871 stub_entry->target_section);
abf874aa 11872
1aa42141
AM
11873 /* Make a note of the offset within the stubs for this entry. */
11874 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11875
a4b6fadd
AM
11876 if (stub_entry->h != NULL
11877 && stub_entry->h->save_res
11878 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11879 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11880 {
11881 /* Don't make stubs to out-of-line register save/restore
11882 functions. Instead, emit copies of the functions. */
11883 stub_entry->group->needs_save_res = 1;
11884 stub_entry->stub_type = ppc_stub_save_res;
11885 return TRUE;
11886 }
11887
f891966f 11888 switch (stub_entry->stub_type)
721956f4 11889 {
f891966f
AM
11890 case ppc_stub_plt_branch:
11891 case ppc_stub_plt_branch_r2off:
11892 /* Reset the stub type from the plt branch variant in case we now
11893 can reach with a shorter stub. */
11894 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11895 /* Fall through. */
11896 case ppc_stub_long_branch:
11897 case ppc_stub_long_branch_r2off:
1aa42141
AM
11898 targ = (stub_entry->target_value
11899 + stub_entry->target_section->output_offset
11900 + stub_entry->target_section->output_section->vma);
f891966f 11901 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
1aa42141
AM
11902 off = (stub_entry->stub_offset
11903 + stub_entry->group->stub_sec->output_offset
11904 + stub_entry->group->stub_sec->output_section->vma);
721956f4 11905
ad8e1ba5 11906 size = 4;
f891966f 11907 r2off = 0;
ad8e1ba5
AM
11908 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11909 {
25f53a85 11910 r2off = get_r2off (info, stub_entry);
a7c49797 11911 if (r2off == (bfd_vma) -1)
aa374f67
AM
11912 {
11913 htab->stub_error = TRUE;
11914 return FALSE;
11915 }
a7c49797 11916 size = 8;
ac2df442 11917 if (PPC_HA (r2off) != 0)
a7c49797
AM
11918 size += 4;
11919 if (PPC_LO (r2off) != 0)
11920 size += 4;
1aa42141 11921 off += size - 4;
ad8e1ba5 11922 }
1aa42141 11923 off = targ - off;
ad8e1ba5 11924
f891966f
AM
11925 /* If the branch offset is too big, use a ppc_stub_plt_branch.
11926 Do the same for -R objects without function descriptors. */
11927 if ((stub_entry->stub_type == ppc_stub_long_branch_r2off
11928 && r2off == 0
11929 && htab->sec_info[stub_entry->target_section->id].toc_off == 0)
11930 || off + (1 << 25) >= (bfd_vma) (1 << 26))
721956f4 11931 {
f891966f 11932 struct ppc_branch_hash_entry *br_entry;
df136d64 11933
f891966f
AM
11934 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11935 stub_entry->root.string + 9,
11936 TRUE, FALSE);
11937 if (br_entry == NULL)
721956f4 11938 {
f891966f
AM
11939 _bfd_error_handler (_("can't build branch stub `%s'"),
11940 stub_entry->root.string);
11941 htab->stub_error = TRUE;
11942 return FALSE;
721956f4
AM
11943 }
11944
f891966f 11945 if (br_entry->iter != htab->stub_iteration)
721956f4 11946 {
f891966f
AM
11947 br_entry->iter = htab->stub_iteration;
11948 br_entry->offset = htab->brlt->size;
11949 htab->brlt->size += 8;
63bc6f6c 11950
f891966f
AM
11951 if (htab->relbrlt != NULL)
11952 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11953 else if (info->emitrelocations)
84f5d08e 11954 {
f891966f
AM
11955 htab->brlt->reloc_count += 1;
11956 htab->brlt->flags |= SEC_RELOC;
05d0e962 11957 }
f891966f 11958 }
ac2df442 11959
f891966f
AM
11960 targ = (br_entry->offset
11961 + htab->brlt->output_offset
11962 + htab->brlt->output_section->vma);
11963 off = (elf_gp (info->output_bfd)
11964 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11965 off = targ - off;
176a0d42 11966
f891966f
AM
11967 if (info->emitrelocations)
11968 {
11969 stub_entry->group->stub_sec->reloc_count
11970 += 1 + (PPC_HA (off) != 0);
11971 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11972 }
05d0e962 11973
f891966f
AM
11974 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11975 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11976 {
11977 size = 12;
11978 if (PPC_HA (off) != 0)
11979 size = 16;
ac2df442 11980 }
f891966f 11981 else
ac2df442 11982 {
f891966f
AM
11983 size = 16;
11984 if (PPC_HA (off) != 0)
11985 size += 4;
11986
11987 if (PPC_HA (r2off) != 0)
11988 size += 4;
11989 if (PPC_LO (r2off) != 0)
11990 size += 4;
ac2df442 11991 }
721956f4 11992 }
f891966f
AM
11993 else if (info->emitrelocations)
11994 {
11995 stub_entry->group->stub_sec->reloc_count += 1;
11996 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11997 }
11998 break;
11999
12000 case ppc_stub_plt_branch_notoc:
12001 case ppc_stub_plt_branch_both:
12002 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
12003 /* Fall through. */
12004 case ppc_stub_long_branch_notoc:
12005 case ppc_stub_long_branch_both:
12006 off = (stub_entry->stub_offset
12007 + stub_entry->group->stub_sec->output_offset
12008 + stub_entry->group->stub_sec->output_section->vma);
12009 size = 0;
12010 if (stub_entry->stub_type == ppc_stub_long_branch_both)
12011 size = 4;
12012 off += size;
12013 targ = (stub_entry->target_value
12014 + stub_entry->target_section->output_offset
12015 + stub_entry->target_section->output_section->vma);
04bdff6a 12016 odd = off & 4;
f891966f
AM
12017 off = targ - off;
12018
3d58e1fc
AM
12019 if (info->emitrelocations)
12020 {
04bdff6a 12021 unsigned int num_rel;
7c1f4227
AM
12022 if (htab->power10_stubs)
12023 num_rel = num_relocs_for_power10_offset (off, odd);
04bdff6a
AM
12024 else
12025 num_rel = num_relocs_for_offset (off - 8);
12026 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
12027 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12028 }
12029
7c1f4227
AM
12030 if (htab->power10_stubs)
12031 extra = size_power10_offset (off, odd);
04bdff6a
AM
12032 else
12033 extra = size_offset (off - 8);
f891966f
AM
12034 /* Include branch insn plus those in the offset sequence. */
12035 size += 4 + extra;
12036 /* The branch insn is at the end, or "extra" bytes along. So
12037 its offset will be "extra" bytes less that that already
12038 calculated. */
12039 off -= extra;
12040
7c1f4227 12041 if (!htab->power10_stubs)
04bdff6a
AM
12042 {
12043 /* After the bcl, lr has been modified so we need to emit
12044 .eh_frame info saying the return address is in r12. */
12045 lr_used = stub_entry->stub_offset + 8;
12046 if (stub_entry->stub_type == ppc_stub_long_branch_both)
12047 lr_used += 4;
12048 /* The eh_frame info will consist of a DW_CFA_advance_loc or
12049 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
12050 DW_CFA_restore_extended 65. */
12051 delta = lr_used - stub_entry->group->lr_restore;
12052 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12053 stub_entry->group->lr_restore = lr_used + 8;
12054 }
f891966f
AM
12055
12056 /* If the branch can't reach, use a plt_branch. */
12057 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
12058 {
12059 stub_entry->stub_type += (ppc_stub_plt_branch_notoc
12060 - ppc_stub_long_branch_notoc);
12061 size += 4;
12062 }
3d58e1fc
AM
12063 else if (info->emitrelocations)
12064 stub_entry->group->stub_sec->reloc_count +=1;
f891966f
AM
12065 break;
12066
12067 case ppc_stub_plt_call_notoc:
12068 case ppc_stub_plt_call_both:
12069 off = (stub_entry->stub_offset
12070 + stub_entry->group->stub_sec->output_offset
12071 + stub_entry->group->stub_sec->output_section->vma);
12072 if (stub_entry->stub_type == ppc_stub_plt_call_both)
12073 off += 4;
12074 targ = stub_entry->plt_ent->plt.offset & ~1;
12075 if (targ >= (bfd_vma) -2)
12076 abort ();
12077
12078 plt = htab->elf.splt;
12079 if (!htab->elf.dynamic_sections_created
12080 || stub_entry->h == NULL
12081 || stub_entry->h->elf.dynindx == -1)
12082 {
12083 if (stub_entry->symtype == STT_GNU_IFUNC)
12084 plt = htab->elf.iplt;
12085 else
12086 plt = htab->pltlocal;
12087 }
12088 targ += plt->output_offset + plt->output_section->vma;
04bdff6a 12089 odd = off & 4;
f891966f
AM
12090 off = targ - off;
12091
12092 if (htab->params->plt_stub_align != 0)
12093 {
12094 unsigned pad = plt_stub_pad (htab, stub_entry, off);
12095
12096 stub_entry->group->stub_sec->size += pad;
12097 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
12098 off -= pad;
12099 }
12100
3d58e1fc
AM
12101 if (info->emitrelocations)
12102 {
04bdff6a 12103 unsigned int num_rel;
7c1f4227
AM
12104 if (htab->power10_stubs)
12105 num_rel = num_relocs_for_power10_offset (off, odd);
04bdff6a
AM
12106 else
12107 num_rel = num_relocs_for_offset (off - 8);
12108 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
12109 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12110 }
12111
f891966f
AM
12112 size = plt_stub_size (htab, stub_entry, off);
12113
7c1f4227 12114 if (!htab->power10_stubs)
04bdff6a
AM
12115 {
12116 /* After the bcl, lr has been modified so we need to emit
12117 .eh_frame info saying the return address is in r12. */
12118 lr_used = stub_entry->stub_offset + 8;
12119 if (stub_entry->stub_type == ppc_stub_plt_call_both)
12120 lr_used += 4;
12121 /* The eh_frame info will consist of a DW_CFA_advance_loc or
12122 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
12123 DW_CFA_restore_extended 65. */
12124 delta = lr_used - stub_entry->group->lr_restore;
12125 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12126 stub_entry->group->lr_restore = lr_used + 8;
12127 }
f891966f
AM
12128 break;
12129
12130 case ppc_stub_plt_call:
12131 case ppc_stub_plt_call_r2save:
12132 targ = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
12133 if (targ >= (bfd_vma) -2)
12134 abort ();
12135 plt = htab->elf.splt;
12136 if (!htab->elf.dynamic_sections_created
12137 || stub_entry->h == NULL
12138 || stub_entry->h->elf.dynindx == -1)
12139 {
12140 if (stub_entry->symtype == STT_GNU_IFUNC)
12141 plt = htab->elf.iplt;
12142 else
12143 plt = htab->pltlocal;
12144 }
12145 targ += plt->output_offset + plt->output_section->vma;
12146
12147 off = (elf_gp (info->output_bfd)
12148 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
12149 off = targ - off;
12150
12151 if (htab->params->plt_stub_align != 0)
12152 {
12153 unsigned pad = plt_stub_pad (htab, stub_entry, off);
12154
12155 stub_entry->group->stub_sec->size += pad;
12156 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
12157 }
12158
12159 if (info->emitrelocations)
12160 {
12161 stub_entry->group->stub_sec->reloc_count
12162 += ((PPC_HA (off) != 0)
12163 + (htab->opd_abi
12164 ? 2 + (htab->params->plt_static_chain
12165 && PPC_HA (off + 16) == PPC_HA (off))
12166 : 1));
12167 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12168 }
12169
12170 size = plt_stub_size (htab, stub_entry, off);
12171
12172 if (stub_entry->h != NULL
ed7007c1 12173 && is_tls_get_addr (&stub_entry->h->elf, htab)
f891966f
AM
12174 && htab->params->tls_get_addr_opt
12175 && stub_entry->stub_type == ppc_stub_plt_call_r2save)
12176 {
9e7028aa
AM
12177 if (htab->params->no_tls_get_addr_regsave)
12178 {
12179 lr_used = stub_entry->stub_offset + size - 20;
12180 /* The eh_frame info will consist of a DW_CFA_advance_loc
12181 or variant, DW_CFA_offset_externed_sf, 65, -stackoff,
12182 DW_CFA_advance_loc+4, DW_CFA_restore_extended, 65. */
12183 delta = lr_used - stub_entry->group->lr_restore;
12184 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12185 }
12186 else
12187 {
12188 /* Adjustments to r1 need to be described. */
12189 unsigned int cfa_updt = stub_entry->stub_offset + 18 * 4;
12190 delta = cfa_updt - stub_entry->group->lr_restore;
12191 stub_entry->group->eh_size += eh_advance_size (delta);
12192 stub_entry->group->eh_size += htab->opd_abi ? 36 : 35;
12193 }
f891966f
AM
12194 stub_entry->group->lr_restore = size - 4;
12195 }
12196 break;
12197
12198 default:
12199 BFD_FAIL ();
12200 return FALSE;
721956f4
AM
12201 }
12202
6f20ed8a 12203 stub_entry->group->stub_sec->size += size;
b34976b6 12204 return TRUE;
721956f4
AM
12205}
12206
12207/* Set up various things so that we can make a list of input sections
12208 for each output section included in the link. Returns -1 on error,
cedb70c5 12209 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
12210
12211int
e7d1c40c 12212ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4 12213{
6f20ed8a 12214 unsigned int id;
986f0783 12215 size_t amt;
721956f4
AM
12216 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12217
4dfe6ac6
NC
12218 if (htab == NULL)
12219 return -1;
4c52953f 12220
7cf7fcc8 12221 htab->sec_info_arr_size = _bfd_section_id;
6f20ed8a
AM
12222 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
12223 htab->sec_info = bfd_zmalloc (amt);
12224 if (htab->sec_info == NULL)
721956f4
AM
12225 return -1;
12226
3d6f9012
AM
12227 /* Set toc_off for com, und, abs and ind sections. */
12228 for (id = 0; id < 3; id++)
6f20ed8a 12229 htab->sec_info[id].toc_off = TOC_BASE_OFF;
734b6cf9 12230
721956f4
AM
12231 return 1;
12232}
12233
927be08e
AM
12234/* Set up for first pass at multitoc partitioning. */
12235
12236void
12237ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
12238{
12239 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12240
1c865ab2 12241 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
12242 htab->toc_bfd = NULL;
12243 htab->toc_first_sec = NULL;
12244}
12245
e717da7e
AM
12246/* The linker repeatedly calls this function for each TOC input section
12247 and linker generated GOT section. Group input bfds such that the toc
927be08e 12248 within a group is less than 64k in size. */
ad8e1ba5 12249
927be08e 12250bfd_boolean
4ce794b7 12251ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
12252{
12253 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 12254 bfd_vma addr, off, limit;
ad8e1ba5 12255
4dfe6ac6
NC
12256 if (htab == NULL)
12257 return FALSE;
12258
927be08e 12259 if (!htab->second_toc_pass)
4c52953f 12260 {
927be08e 12261 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
12262 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
12263
12264 if (new_bfd)
bf102f86
AM
12265 {
12266 htab->toc_bfd = isec->owner;
12267 htab->toc_first_sec = isec;
12268 }
927be08e 12269
bf102f86
AM
12270 addr = isec->output_offset + isec->output_section->vma;
12271 off = addr - htab->toc_curr;
d77c8a4b
AM
12272 limit = 0x80008000;
12273 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
12274 limit = 0x10000;
12275 if (off + isec->size > limit)
bf102f86
AM
12276 {
12277 addr = (htab->toc_first_sec->output_offset
12278 + htab->toc_first_sec->output_section->vma);
12279 htab->toc_curr = addr;
a27e685f 12280 htab->toc_curr &= -TOC_BASE_ALIGN;
bf102f86 12281 }
99877b66 12282
927be08e
AM
12283 /* toc_curr is the base address of this toc group. Set elf_gp
12284 for the input section to be the offset relative to the
12285 output toc base plus 0x8000. Making the input elf_gp an
12286 offset allows us to move the toc as a whole without
12287 recalculating input elf_gp. */
06bcf541 12288 off = htab->toc_curr - elf_gp (info->output_bfd);
927be08e
AM
12289 off += TOC_BASE_OFF;
12290
12291 /* Die if someone uses a linker script that doesn't keep input
12292 file .toc and .got together. */
a4fd3de5
AM
12293 if (new_bfd
12294 && elf_gp (isec->owner) != 0
927be08e
AM
12295 && elf_gp (isec->owner) != off)
12296 return FALSE;
12297
12298 elf_gp (isec->owner) = off;
12299 return TRUE;
4c52953f 12300 }
927be08e
AM
12301
12302 /* During the second pass toc_first_sec points to the start of
12303 a toc group, and toc_curr is used to track the old elf_gp.
12304 We use toc_bfd to ensure we only look at each bfd once. */
12305 if (htab->toc_bfd == isec->owner)
12306 return TRUE;
12307 htab->toc_bfd = isec->owner;
12308
12309 if (htab->toc_first_sec == NULL
12310 || htab->toc_curr != elf_gp (isec->owner))
12311 {
12312 htab->toc_curr = elf_gp (isec->owner);
12313 htab->toc_first_sec = isec;
12314 }
12315 addr = (htab->toc_first_sec->output_offset
12316 + htab->toc_first_sec->output_section->vma);
06bcf541 12317 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
927be08e
AM
12318 elf_gp (isec->owner) = off;
12319
12320 return TRUE;
ad8e1ba5
AM
12321}
12322
927be08e
AM
12323/* Called via elf_link_hash_traverse to merge GOT entries for global
12324 symbol H. */
12325
12326static bfd_boolean
12327merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12328{
12329 if (h->root.type == bfd_link_hash_indirect)
12330 return TRUE;
12331
927be08e
AM
12332 merge_got_entries (&h->got.glist);
12333
12334 return TRUE;
12335}
12336
12337/* Called via elf_link_hash_traverse to allocate GOT entries for global
12338 symbol H. */
12339
12340static bfd_boolean
12341reallocate_got (struct elf_link_hash_entry *h, void *inf)
12342{
12343 struct got_entry *gent;
12344
12345 if (h->root.type == bfd_link_hash_indirect)
12346 return TRUE;
12347
927be08e
AM
12348 for (gent = h->got.glist; gent != NULL; gent = gent->next)
12349 if (!gent->is_indirect)
12350 allocate_got (h, (struct bfd_link_info *) inf, gent);
12351 return TRUE;
12352}
12353
12354/* Called on the first multitoc pass after the last call to
12355 ppc64_elf_next_toc_section. This function removes duplicate GOT
12356 entries. */
12357
12358bfd_boolean
12359ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
12360{
12361 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
12362 struct bfd *ibfd, *ibfd2;
12363 bfd_boolean done_something;
12364
12365 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 12366
7865406b
AM
12367 if (!htab->do_multi_toc)
12368 return FALSE;
12369
d0fae19d 12370 /* Merge global sym got entries within a toc group. */
927be08e
AM
12371 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
12372
12373 /* And tlsld_got. */
c72f2fb2 12374 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12375 {
12376 struct got_entry *ent, *ent2;
12377
12378 if (!is_ppc64_elf (ibfd))
12379 continue;
12380
12381 ent = ppc64_tlsld_got (ibfd);
12382 if (!ent->is_indirect
12383 && ent->got.offset != (bfd_vma) -1)
12384 {
c72f2fb2 12385 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
12386 {
12387 if (!is_ppc64_elf (ibfd2))
12388 continue;
12389
12390 ent2 = ppc64_tlsld_got (ibfd2);
12391 if (!ent2->is_indirect
12392 && ent2->got.offset != (bfd_vma) -1
12393 && elf_gp (ibfd2) == elf_gp (ibfd))
12394 {
12395 ent2->is_indirect = TRUE;
12396 ent2->got.ent = ent;
12397 }
12398 }
12399 }
12400 }
12401
12402 /* Zap sizes of got sections. */
33e44f2e
AM
12403 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
12404 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
12405 htab->got_reli_size = 0;
12406
c72f2fb2 12407 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12408 {
12409 asection *got, *relgot;
12410
12411 if (!is_ppc64_elf (ibfd))
12412 continue;
12413
12414 got = ppc64_elf_tdata (ibfd)->got;
12415 if (got != NULL)
12416 {
12417 got->rawsize = got->size;
12418 got->size = 0;
12419 relgot = ppc64_elf_tdata (ibfd)->relgot;
12420 relgot->rawsize = relgot->size;
12421 relgot->size = 0;
12422 }
12423 }
12424
12425 /* Now reallocate the got, local syms first. We don't need to
12426 allocate section contents again since we never increase size. */
c72f2fb2 12427 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12428 {
12429 struct got_entry **lgot_ents;
12430 struct got_entry **end_lgot_ents;
12431 struct plt_entry **local_plt;
12432 struct plt_entry **end_local_plt;
f961d9dd 12433 unsigned char *lgot_masks;
927be08e
AM
12434 bfd_size_type locsymcount;
12435 Elf_Internal_Shdr *symtab_hdr;
19e08130 12436 asection *s;
927be08e
AM
12437
12438 if (!is_ppc64_elf (ibfd))
12439 continue;
12440
12441 lgot_ents = elf_local_got_ents (ibfd);
12442 if (!lgot_ents)
12443 continue;
12444
12445 symtab_hdr = &elf_symtab_hdr (ibfd);
12446 locsymcount = symtab_hdr->sh_info;
12447 end_lgot_ents = lgot_ents + locsymcount;
12448 local_plt = (struct plt_entry **) end_lgot_ents;
12449 end_local_plt = local_plt + locsymcount;
f961d9dd 12450 lgot_masks = (unsigned char *) end_local_plt;
927be08e 12451 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
12452 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
12453 {
12454 struct got_entry *ent;
12455
12456 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 12457 {
19e08130
AM
12458 unsigned int ent_size = 8;
12459 unsigned int rel_size = sizeof (Elf64_External_Rela);
12460
d0fae19d
AM
12461 ent->got.offset = s->size;
12462 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 12463 {
19e08130
AM
12464 ent_size *= 2;
12465 rel_size *= 2;
12466 }
12467 s->size += ent_size;
37da22e5 12468 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 12469 {
33e44f2e 12470 htab->elf.irelplt->size += rel_size;
19e08130
AM
12471 htab->got_reli_size += rel_size;
12472 }
6a3858a6 12473 else if (bfd_link_pic (info)
f749f26e 12474 && !(ent->tls_type != 0
6a3858a6 12475 && bfd_link_executable (info)))
19e08130
AM
12476 {
12477 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12478 srel->size += rel_size;
d0fae19d
AM
12479 }
12480 }
927be08e
AM
12481 }
12482 }
12483
12484 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
12485
c72f2fb2 12486 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12487 {
12488 struct got_entry *ent;
12489
12490 if (!is_ppc64_elf (ibfd))
12491 continue;
12492
12493 ent = ppc64_tlsld_got (ibfd);
12494 if (!ent->is_indirect
12495 && ent->got.offset != (bfd_vma) -1)
12496 {
12497 asection *s = ppc64_elf_tdata (ibfd)->got;
12498 ent->got.offset = s->size;
12499 s->size += 16;
f749f26e 12500 if (bfd_link_dll (info))
927be08e
AM
12501 {
12502 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12503 srel->size += sizeof (Elf64_External_Rela);
12504 }
12505 }
12506 }
12507
33e44f2e 12508 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 12509 if (!done_something)
c72f2fb2 12510 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12511 {
12512 asection *got;
12513
12514 if (!is_ppc64_elf (ibfd))
12515 continue;
12516
12517 got = ppc64_elf_tdata (ibfd)->got;
12518 if (got != NULL)
12519 {
12520 done_something = got->rawsize != got->size;
12521 if (done_something)
12522 break;
12523 }
12524 }
12525
12526 if (done_something)
e7d1c40c 12527 (*htab->params->layout_sections_again) ();
927be08e
AM
12528
12529 /* Set up for second pass over toc sections to recalculate elf_gp
12530 on input sections. */
12531 htab->toc_bfd = NULL;
12532 htab->toc_first_sec = NULL;
12533 htab->second_toc_pass = TRUE;
12534 return done_something;
12535}
12536
12537/* Called after second pass of multitoc partitioning. */
12538
12539void
12540ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
12541{
12542 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12543
12544 /* After the second pass, toc_curr tracks the TOC offset used
12545 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 12546 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
12547}
12548
9b5ecbd0
AM
12549/* No toc references were found in ISEC. If the code in ISEC makes no
12550 calls, then there's no need to use toc adjusting stubs when branching
12551 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
12552 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
12553 needed, and 2 if a cyclical call-graph was found but no other reason
12554 for a stub was detected. If called from the top level, a return of
12555 2 means the same as a return of 0. */
9b5ecbd0
AM
12556
12557static int
4ce794b7 12558toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 12559{
9b5ecbd0 12560 int ret;
70cc837d
AM
12561
12562 /* Mark this section as checked. */
12563 isec->call_check_done = 1;
9b5ecbd0 12564
772119ce
AM
12565 /* We know none of our code bearing sections will need toc stubs. */
12566 if ((isec->flags & SEC_LINKER_CREATED) != 0)
12567 return 0;
12568
eea6121a 12569 if (isec->size == 0)
082c50f8
AM
12570 return 0;
12571
4c52953f
AM
12572 if (isec->output_section == NULL)
12573 return 0;
12574
4c52953f 12575 ret = 0;
70cc837d 12576 if (isec->reloc_count != 0)
9b5ecbd0 12577 {
70cc837d
AM
12578 Elf_Internal_Rela *relstart, *rel;
12579 Elf_Internal_Sym *local_syms;
12580 struct ppc_link_hash_table *htab;
2917689a 12581
70cc837d
AM
12582 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
12583 info->keep_memory);
12584 if (relstart == NULL)
12585 return -1;
90aecf7a 12586
70cc837d
AM
12587 /* Look for branches to outside of this section. */
12588 local_syms = NULL;
12589 htab = ppc_hash_table (info);
12590 if (htab == NULL)
12591 return -1;
4c52953f 12592
70cc837d 12593 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 12594 {
70cc837d
AM
12595 enum elf_ppc64_reloc_type r_type;
12596 unsigned long r_symndx;
12597 struct elf_link_hash_entry *h;
12598 struct ppc_link_hash_entry *eh;
12599 Elf_Internal_Sym *sym;
12600 asection *sym_sec;
12601 struct _opd_sec_data *opd;
12602 bfd_vma sym_value;
12603 bfd_vma dest;
12604
12605 r_type = ELF64_R_TYPE (rel->r_info);
12606 if (r_type != R_PPC64_REL24
05d0e962 12607 && r_type != R_PPC64_REL24_NOTOC
70cc837d
AM
12608 && r_type != R_PPC64_REL14
12609 && r_type != R_PPC64_REL14_BRTAKEN
23cedd1d 12610 && r_type != R_PPC64_REL14_BRNTAKEN
5663e321
AM
12611 && r_type != R_PPC64_PLTCALL
12612 && r_type != R_PPC64_PLTCALL_NOTOC)
70cc837d 12613 continue;
4c52953f 12614
70cc837d
AM
12615 r_symndx = ELF64_R_SYM (rel->r_info);
12616 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
12617 isec->owner))
4c52953f 12618 {
70cc837d
AM
12619 ret = -1;
12620 break;
12621 }
4c52953f 12622
70cc837d
AM
12623 /* Calls to dynamic lib functions go through a plt call stub
12624 that uses r2. */
ed7007c1 12625 eh = ppc_elf_hash_entry (h);
70cc837d
AM
12626 if (eh != NULL
12627 && (eh->elf.plt.plist != NULL
12628 || (eh->oh != NULL
12629 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
12630 {
12631 ret = 1;
12632 break;
4c52953f
AM
12633 }
12634
70cc837d
AM
12635 if (sym_sec == NULL)
12636 /* Ignore other undefined symbols. */
4c52953f 12637 continue;
4c52953f 12638
70cc837d
AM
12639 /* Assume branches to other sections not included in the
12640 link need stubs too, to cover -R and absolute syms. */
12641 if (sym_sec->output_section == NULL)
12642 {
12643 ret = 1;
12644 break;
12645 }
4c52953f 12646
70cc837d
AM
12647 if (h == NULL)
12648 sym_value = sym->st_value;
12649 else
12650 {
12651 if (h->root.type != bfd_link_hash_defined
12652 && h->root.type != bfd_link_hash_defweak)
12653 abort ();
12654 sym_value = h->root.u.def.value;
12655 }
12656 sym_value += rel->r_addend;
4c52953f 12657
70cc837d
AM
12658 /* If this branch reloc uses an opd sym, find the code section. */
12659 opd = get_opd_info (sym_sec);
12660 if (opd != NULL)
12661 {
12662 if (h == NULL && opd->adjust != NULL)
12663 {
12664 long adjust;
4c52953f 12665
92a9c616 12666 adjust = opd->adjust[OPD_NDX (sym_value)];
70cc837d
AM
12667 if (adjust == -1)
12668 /* Assume deleted functions won't ever be called. */
12669 continue;
12670 sym_value += adjust;
12671 }
4c52953f 12672
aef36ac1
AM
12673 dest = opd_entry_value (sym_sec, sym_value,
12674 &sym_sec, NULL, FALSE);
70cc837d
AM
12675 if (dest == (bfd_vma) -1)
12676 continue;
12677 }
12678 else
12679 dest = (sym_value
12680 + sym_sec->output_offset
12681 + sym_sec->output_section->vma);
4c52953f 12682
70cc837d
AM
12683 /* Ignore branch to self. */
12684 if (sym_sec == isec)
12685 continue;
4c52953f 12686
70cc837d
AM
12687 /* If the called function uses the toc, we need a stub. */
12688 if (sym_sec->has_toc_reloc
12689 || sym_sec->makes_toc_func_call)
4c52953f 12690 {
70cc837d 12691 ret = 1;
4c52953f
AM
12692 break;
12693 }
70cc837d
AM
12694
12695 /* Assume any branch that needs a long branch stub might in fact
12696 need a plt_branch stub. A plt_branch stub uses r2. */
12697 else if (dest - (isec->output_offset
12698 + isec->output_section->vma
6911b7dc
AM
12699 + rel->r_offset) + (1 << 25)
12700 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
12701 ? h->other
12702 : sym->st_other))
4c52953f 12703 {
70cc837d
AM
12704 ret = 1;
12705 break;
12706 }
12707
12708 /* If calling back to a section in the process of being
12709 tested, we can't say for sure that no toc adjusting stubs
12710 are needed, so don't return zero. */
12711 else if (sym_sec->call_check_in_progress)
12712 ret = 2;
12713
12714 /* Branches to another section that itself doesn't have any TOC
12715 references are OK. Recursively call ourselves to check. */
12716 else if (!sym_sec->call_check_done)
12717 {
12718 int recur;
12719
12720 /* Mark current section as indeterminate, so that other
12721 sections that call back to current won't be marked as
12722 known. */
12723 isec->call_check_in_progress = 1;
12724 recur = toc_adjusting_stub_needed (info, sym_sec);
12725 isec->call_check_in_progress = 0;
12726
4c52953f
AM
12727 if (recur != 0)
12728 {
70cc837d
AM
12729 ret = recur;
12730 if (recur != 2)
12731 break;
4c52953f
AM
12732 }
12733 }
4c52953f 12734 }
70cc837d 12735
c9594989
AM
12736 if (elf_symtab_hdr (isec->owner).contents
12737 != (unsigned char *) local_syms)
70cc837d
AM
12738 free (local_syms);
12739 if (elf_section_data (isec)->relocs != relstart)
12740 free (relstart);
9b5ecbd0
AM
12741 }
12742
70cc837d
AM
12743 if ((ret & 1) == 0
12744 && isec->map_head.s != NULL
12745 && (strcmp (isec->output_section->name, ".init") == 0
12746 || strcmp (isec->output_section->name, ".fini") == 0))
12747 {
12748 if (isec->map_head.s->has_toc_reloc
12749 || isec->map_head.s->makes_toc_func_call)
12750 ret = 1;
12751 else if (!isec->map_head.s->call_check_done)
12752 {
12753 int recur;
12754 isec->call_check_in_progress = 1;
12755 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
12756 isec->call_check_in_progress = 0;
12757 if (recur != 0)
12758 ret = recur;
12759 }
12760 }
12761
12762 if (ret == 1)
12763 isec->makes_toc_func_call = 1;
4c52953f 12764
9b5ecbd0
AM
12765 return ret;
12766}
12767
721956f4
AM
12768/* The linker repeatedly calls this function for each input section,
12769 in the order that input sections are linked into output sections.
12770 Build lists of input sections to determine groupings between which
12771 we may insert linker stubs. */
12772
9b5ecbd0 12773bfd_boolean
4ce794b7 12774ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
12775{
12776 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12777
4dfe6ac6
NC
12778 if (htab == NULL)
12779 return FALSE;
12780
734b6cf9 12781 if ((isec->output_section->flags & SEC_CODE) != 0
6f20ed8a 12782 && isec->output_section->id < htab->sec_info_arr_size)
721956f4 12783 {
3d6f9012
AM
12784 /* This happens to make the list in reverse order,
12785 which is what we want. */
6f20ed8a
AM
12786 htab->sec_info[isec->id].u.list
12787 = htab->sec_info[isec->output_section->id].u.list;
12788 htab->sec_info[isec->output_section->id].u.list = isec;
721956f4 12789 }
ad8e1ba5 12790
4c52953f 12791 if (htab->multi_toc_needed)
9b5ecbd0 12792 {
8b974ba3
AM
12793 /* Analyse sections that aren't already flagged as needing a
12794 valid toc pointer. Exclude .fixup for the linux kernel.
12795 .fixup contains branches, but only back to the function that
12796 hit an exception. */
12797 if (!(isec->has_toc_reloc
12798 || (isec->flags & SEC_CODE) == 0
12799 || strcmp (isec->name, ".fixup") == 0
12800 || isec->call_check_done))
12801 {
12802 if (toc_adjusting_stub_needed (info, isec) < 0)
6683a28d 12803 return FALSE;
8b974ba3
AM
12804 }
12805 /* Make all sections use the TOC assigned for this object file.
12806 This will be wrong for pasted sections; We fix that in
12807 check_pasted_section(). */
12808 if (elf_gp (isec->owner) != 0)
12809 htab->toc_curr = elf_gp (isec->owner);
12810 }
12811
6f20ed8a 12812 htab->sec_info[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 12813 return TRUE;
721956f4
AM
12814}
12815
70cc837d
AM
12816/* Check that all .init and .fini sections use the same toc, if they
12817 have toc relocs. */
12818
12819static bfd_boolean
12820check_pasted_section (struct bfd_link_info *info, const char *name)
12821{
12822 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12823
12824 if (o != NULL)
12825 {
12826 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12827 bfd_vma toc_off = 0;
12828 asection *i;
12829
12830 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12831 if (i->has_toc_reloc)
12832 {
12833 if (toc_off == 0)
6f20ed8a
AM
12834 toc_off = htab->sec_info[i->id].toc_off;
12835 else if (toc_off != htab->sec_info[i->id].toc_off)
70cc837d
AM
12836 return FALSE;
12837 }
6683a28d
AM
12838
12839 if (toc_off == 0)
12840 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12841 if (i->makes_toc_func_call)
12842 {
6f20ed8a 12843 toc_off = htab->sec_info[i->id].toc_off;
6683a28d
AM
12844 break;
12845 }
12846
70cc837d
AM
12847 /* Make sure the whole pasted function uses the same toc offset. */
12848 if (toc_off != 0)
12849 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
6f20ed8a 12850 htab->sec_info[i->id].toc_off = toc_off;
70cc837d
AM
12851 }
12852 return TRUE;
12853}
12854
12855bfd_boolean
12856ppc64_elf_check_init_fini (struct bfd_link_info *info)
12857{
12858 return (check_pasted_section (info, ".init")
12859 & check_pasted_section (info, ".fini"));
12860}
12861
721956f4
AM
12862/* See whether we can group stub sections together. Grouping stub
12863 sections may result in fewer stubs. More importantly, we need to
12864 put all .init* and .fini* stubs at the beginning of the .init or
12865 .fini output sections respectively, because glibc splits the
12866 _init and _fini functions into multiple parts. Putting a stub in
12867 the middle of a function is not a good idea. */
12868
6f20ed8a
AM
12869static bfd_boolean
12870group_sections (struct bfd_link_info *info,
4ce794b7
AM
12871 bfd_size_type stub_group_size,
12872 bfd_boolean stubs_always_before_branch)
721956f4 12873{
6f20ed8a
AM
12874 struct ppc_link_hash_table *htab;
12875 asection *osec;
7c8fe5c4
AM
12876 bfd_boolean suppress_size_errors;
12877
6f20ed8a
AM
12878 htab = ppc_hash_table (info);
12879 if (htab == NULL)
12880 return FALSE;
12881
7c8fe5c4 12882 suppress_size_errors = FALSE;
7c8fe5c4
AM
12883 if (stub_group_size == 1)
12884 {
12885 /* Default values. */
12886 if (stubs_always_before_branch)
09f92717 12887 stub_group_size = 0x1e00000;
7c8fe5c4 12888 else
09f92717 12889 stub_group_size = 0x1c00000;
7c8fe5c4
AM
12890 suppress_size_errors = TRUE;
12891 }
12892
6f20ed8a 12893 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
721956f4 12894 {
6f20ed8a
AM
12895 asection *tail;
12896
12897 if (osec->id >= htab->sec_info_arr_size)
12898 continue;
12899
12900 tail = htab->sec_info[osec->id].u.list;
734b6cf9 12901 while (tail != NULL)
721956f4 12902 {
734b6cf9
AM
12903 asection *curr;
12904 asection *prev;
12905 bfd_size_type total;
12906 bfd_boolean big_sec;
12907 bfd_vma curr_toc;
6f20ed8a 12908 struct map_stub *group;
09f92717 12909 bfd_size_type group_size;
734b6cf9
AM
12910
12911 curr = tail;
eea6121a 12912 total = tail->size;
09f92717
AM
12913 group_size = (ppc64_elf_section_data (tail) != NULL
12914 && ppc64_elf_section_data (tail)->has_14bit_branch
12915 ? stub_group_size >> 10 : stub_group_size);
12916
12917 big_sec = total > group_size;
7c8fe5c4 12918 if (big_sec && !suppress_size_errors)
695344c0 12919 /* xgettext:c-format */
871b3ab2 12920 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
4eca0228 12921 tail->owner, tail);
6f20ed8a 12922 curr_toc = htab->sec_info[tail->id].toc_off;
734b6cf9 12923
6f20ed8a 12924 while ((prev = htab->sec_info[curr->id].u.list) != NULL
734b6cf9 12925 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
12926 < (ppc64_elf_section_data (prev) != NULL
12927 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12928 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12929 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12930 curr = prev;
12931
12932 /* OK, the size from the start of CURR to the end is less
09f92717 12933 than group_size and thus can be handled by one stub
734b6cf9 12934 section. (or the tail section is itself larger than
09f92717
AM
12935 group_size, in which case we may be toast.) We should
12936 really be keeping track of the total size of stubs added
12937 here, as stubs contribute to the final output section
12938 size. That's a little tricky, and this way will only
12939 break if stubs added make the total size more than 2^25,
12940 ie. for the default stub_group_size, if stubs total more
12941 than 2097152 bytes, or nearly 75000 plt call stubs. */
6f20ed8a
AM
12942 group = bfd_alloc (curr->owner, sizeof (*group));
12943 if (group == NULL)
12944 return FALSE;
12945 group->link_sec = curr;
12946 group->stub_sec = NULL;
a4b6fadd 12947 group->needs_save_res = 0;
df136d64
AM
12948 group->lr_restore = 0;
12949 group->eh_size = 0;
12950 group->eh_base = 0;
a4b6fadd
AM
12951 group->next = htab->group;
12952 htab->group = group;
734b6cf9 12953 do
721956f4 12954 {
6f20ed8a 12955 prev = htab->sec_info[tail->id].u.list;
734b6cf9 12956 /* Set up this stub group. */
6f20ed8a 12957 htab->sec_info[tail->id].u.group = group;
721956f4 12958 }
734b6cf9
AM
12959 while (tail != curr && (tail = prev) != NULL);
12960
09f92717 12961 /* But wait, there's more! Input sections up to group_size
734b6cf9
AM
12962 bytes before the stub section can be handled by it too.
12963 Don't do this if we have a really large section after the
12964 stubs, as adding more stubs increases the chance that
12965 branches may not reach into the stub section. */
12966 if (!stubs_always_before_branch && !big_sec)
12967 {
12968 total = 0;
12969 while (prev != NULL
12970 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
12971 < (ppc64_elf_section_data (prev) != NULL
12972 && ppc64_elf_section_data (prev)->has_14bit_branch
2cdcc330
AM
12973 ? (group_size = stub_group_size >> 10)
12974 : group_size))
6f20ed8a 12975 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12976 {
12977 tail = prev;
6f20ed8a
AM
12978 prev = htab->sec_info[tail->id].u.list;
12979 htab->sec_info[tail->id].u.group = group;
734b6cf9
AM
12980 }
12981 }
12982 tail = prev;
721956f4
AM
12983 }
12984 }
6f20ed8a 12985 return TRUE;
721956f4
AM
12986}
12987
58d180e8
AM
12988static const unsigned char glink_eh_frame_cie[] =
12989{
12990 0, 0, 0, 16, /* length. */
12991 0, 0, 0, 0, /* id. */
12992 1, /* CIE version. */
12993 'z', 'R', 0, /* Augmentation string. */
12994 4, /* Code alignment. */
12995 0x78, /* Data alignment. */
12996 65, /* RA reg. */
12997 1, /* Augmentation size. */
12998 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
2e0ce1c8 12999 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
58d180e8
AM
13000};
13001
d969d15f
AM
13002/* Stripping output sections is normally done before dynamic section
13003 symbols have been allocated. This function is called later, and
13004 handles cases like htab->brlt which is mapped to its own output
13005 section. */
13006
13007static void
13008maybe_strip_output (struct bfd_link_info *info, asection *isec)
13009{
13010 if (isec->size == 0
13011 && isec->output_section->size == 0
53d8967a 13012 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
13013 && !bfd_section_removed_from_list (info->output_bfd,
13014 isec->output_section)
13015 && elf_section_data (isec->output_section)->dynindx == 0)
13016 {
13017 isec->output_section->flags |= SEC_EXCLUDE;
13018 bfd_section_list_remove (info->output_bfd, isec->output_section);
13019 info->output_bfd->section_count--;
13020 }
13021}
13022
721956f4
AM
13023/* Determine and set the size of the stub section for a final link.
13024
13025 The basic idea here is to examine all the relocations looking for
13026 PC-relative calls to a target that is unreachable with a "bl"
13027 instruction. */
13028
b34976b6 13029bfd_boolean
e7d1c40c 13030ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
13031{
13032 bfd_size_type stub_group_size;
b34976b6 13033 bfd_boolean stubs_always_before_branch;
721956f4
AM
13034 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13035
4dfe6ac6
NC
13036 if (htab == NULL)
13037 return FALSE;
13038
0e1862bb 13039 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
e7d1c40c 13040 htab->params->plt_thread_safe = 1;
b9e5796b 13041 if (!htab->opd_abi)
e7d1c40c
AM
13042 htab->params->plt_thread_safe = 0;
13043 else if (htab->params->plt_thread_safe == -1)
794e51c0 13044 {
e2458743 13045 static const char *const thread_starter[] =
794e51c0
AM
13046 {
13047 "pthread_create",
13048 /* libstdc++ */
13049 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
13050 /* librt */
13051 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
13052 "mq_notify", "create_timer",
13053 /* libanl */
13054 "getaddrinfo_a",
13055 /* libgomp */
2300b5a1 13056 "GOMP_parallel",
794e51c0 13057 "GOMP_parallel_start",
2300b5a1 13058 "GOMP_parallel_loop_static",
794e51c0 13059 "GOMP_parallel_loop_static_start",
2300b5a1 13060 "GOMP_parallel_loop_dynamic",
794e51c0 13061 "GOMP_parallel_loop_dynamic_start",
2300b5a1 13062 "GOMP_parallel_loop_guided",
794e51c0 13063 "GOMP_parallel_loop_guided_start",
2300b5a1 13064 "GOMP_parallel_loop_runtime",
794e51c0 13065 "GOMP_parallel_loop_runtime_start",
2300b5a1 13066 "GOMP_parallel_sections",
68ffbac6 13067 "GOMP_parallel_sections_start",
f9dffbf0
AM
13068 /* libgo */
13069 "__go_go",
794e51c0
AM
13070 };
13071 unsigned i;
13072
a4b6fadd 13073 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
794e51c0
AM
13074 {
13075 struct elf_link_hash_entry *h;
13076 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
13077 FALSE, FALSE, TRUE);
e7d1c40c
AM
13078 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
13079 if (htab->params->plt_thread_safe)
794e51c0
AM
13080 break;
13081 }
13082 }
e7d1c40c
AM
13083 stubs_always_before_branch = htab->params->group_size < 0;
13084 if (htab->params->group_size < 0)
13085 stub_group_size = -htab->params->group_size;
721956f4 13086 else
e7d1c40c 13087 stub_group_size = htab->params->group_size;
721956f4 13088
6f20ed8a
AM
13089 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
13090 return FALSE;
721956f4 13091
a804e476
AM
13092 htab->tga_group = NULL;
13093 if (!htab->params->no_tls_get_addr_regsave
13094 && htab->tga_desc_fd != NULL
13095 && (htab->tga_desc_fd->elf.root.type == bfd_link_hash_undefined
13096 || htab->tga_desc_fd->elf.root.type == bfd_link_hash_undefweak)
13097 && htab->tls_get_addr_fd != NULL
13098 && is_static_defined (&htab->tls_get_addr_fd->elf))
13099 {
13100 asection *sym_sec, *code_sec, *stub_sec;
13101 bfd_vma sym_value;
13102 struct _opd_sec_data *opd;
13103
13104 sym_sec = htab->tls_get_addr_fd->elf.root.u.def.section;
13105 sym_value = defined_sym_val (&htab->tls_get_addr_fd->elf);
13106 code_sec = sym_sec;
13107 opd = get_opd_info (sym_sec);
13108 if (opd != NULL)
13109 opd_entry_value (sym_sec, sym_value, &code_sec, NULL, FALSE);
13110 htab->tga_group = htab->sec_info[code_sec->id].u.group;
13111 stub_sec = (*htab->params->add_stub_section) (".tga_desc.stub",
13112 htab->tga_group->link_sec);
13113 if (stub_sec == NULL)
13114 return FALSE;
13115 htab->tga_group->stub_sec = stub_sec;
13116
13117 htab->tga_desc_fd->elf.root.type = bfd_link_hash_defined;
13118 htab->tga_desc_fd->elf.root.u.def.section = stub_sec;
13119 htab->tga_desc_fd->elf.root.u.def.value = 0;
13120 htab->tga_desc_fd->elf.type = STT_FUNC;
13121 htab->tga_desc_fd->elf.def_regular = 1;
13122 htab->tga_desc_fd->elf.non_elf = 0;
13123 _bfd_elf_link_hash_hide_symbol (info, &htab->tga_desc_fd->elf, TRUE);
13124 }
13125
c9301e31
AM
13126#define STUB_SHRINK_ITER 20
13127 /* Loop until no stubs added. After iteration 20 of this loop we may
13128 exit on a stub section shrinking. This is to break out of a
13129 pathological case where adding stubs on one iteration decreases
13130 section gaps (perhaps due to alignment), which then requires
13131 fewer or smaller stubs on the next iteration. */
13132
721956f4
AM
13133 while (1)
13134 {
13135 bfd *input_bfd;
13136 unsigned int bfd_indx;
a4b6fadd 13137 struct map_stub *group;
721956f4
AM
13138
13139 htab->stub_iteration += 1;
721956f4
AM
13140
13141 for (input_bfd = info->input_bfds, bfd_indx = 0;
13142 input_bfd != NULL;
c72f2fb2 13143 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
13144 {
13145 Elf_Internal_Shdr *symtab_hdr;
13146 asection *section;
6cdc0ccc 13147 Elf_Internal_Sym *local_syms = NULL;
721956f4 13148
0c8d6e5c 13149 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
13150 continue;
13151
721956f4 13152 /* We'll need the symbol table in a second. */
0ffa91dd 13153 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
13154 if (symtab_hdr->sh_info == 0)
13155 continue;
13156
721956f4
AM
13157 /* Walk over each section attached to the input bfd. */
13158 for (section = input_bfd->sections;
13159 section != NULL;
13160 section = section->next)
13161 {
721956f4 13162 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
13163
13164 /* If there aren't any relocs, then there's nothing more
13165 to do. */
13166 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
13167 || (section->flags & SEC_ALLOC) == 0
13168 || (section->flags & SEC_LOAD) == 0
13169 || (section->flags & SEC_CODE) == 0
721956f4
AM
13170 || section->reloc_count == 0)
13171 continue;
13172
13173 /* If this section is a link-once section that will be
13174 discarded, then don't create any stubs. */
13175 if (section->output_section == NULL
927be08e 13176 || section->output_section->owner != info->output_bfd)
721956f4
AM
13177 continue;
13178
1e2f5b6e
AM
13179 /* Get the relocs. */
13180 internal_relocs
4ce794b7 13181 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 13182 info->keep_memory);
721956f4 13183 if (internal_relocs == NULL)
1e2f5b6e 13184 goto error_ret_free_local;
721956f4
AM
13185
13186 /* Now examine each relocation. */
13187 irela = internal_relocs;
13188 irelaend = irela + section->reloc_count;
13189 for (; irela < irelaend; irela++)
13190 {
4ce794b7
AM
13191 enum elf_ppc64_reloc_type r_type;
13192 unsigned int r_indx;
721956f4
AM
13193 enum ppc_stub_type stub_type;
13194 struct ppc_stub_hash_entry *stub_entry;
8387904d 13195 asection *sym_sec, *code_sec;
e054468f 13196 bfd_vma sym_value, code_value;
721956f4 13197 bfd_vma destination;
6911b7dc 13198 unsigned long local_off;
8843416a 13199 bfd_boolean ok_dest;
721956f4 13200 struct ppc_link_hash_entry *hash;
8387904d 13201 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
13202 struct elf_link_hash_entry *h;
13203 Elf_Internal_Sym *sym;
721956f4
AM
13204 char *stub_name;
13205 const asection *id_sec;
74f0fb50 13206 struct _opd_sec_data *opd;
e054468f 13207 struct plt_entry *plt_ent;
721956f4
AM
13208
13209 r_type = ELF64_R_TYPE (irela->r_info);
13210 r_indx = ELF64_R_SYM (irela->r_info);
13211
4ce794b7 13212 if (r_type >= R_PPC64_max)
721956f4
AM
13213 {
13214 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 13215 goto error_ret_free_internal;
721956f4
AM
13216 }
13217
13218 /* Only look for stubs on branch instructions. */
4ce794b7 13219 if (r_type != R_PPC64_REL24
05d0e962 13220 && r_type != R_PPC64_REL24_NOTOC
4ce794b7
AM
13221 && r_type != R_PPC64_REL14
13222 && r_type != R_PPC64_REL14_BRTAKEN
13223 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
13224 continue;
13225
13226 /* Now determine the call target, its name, value,
13227 section. */
411e1bfb
AM
13228 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
13229 r_indx, input_bfd))
13230 goto error_ret_free_internal;
ed7007c1 13231 hash = ppc_elf_hash_entry (h);
411e1bfb 13232
8843416a 13233 ok_dest = FALSE;
8387904d 13234 fdh = NULL;
7fe2b9a6 13235 sym_value = 0;
411e1bfb 13236 if (hash == NULL)
721956f4 13237 {
411e1bfb 13238 sym_value = sym->st_value;
c27b8c2a
AM
13239 if (sym_sec != NULL
13240 && sym_sec->output_section != NULL)
13241 ok_dest = TRUE;
721956f4 13242 }
7fe2b9a6
AM
13243 else if (hash->elf.root.type == bfd_link_hash_defined
13244 || hash->elf.root.type == bfd_link_hash_defweak)
13245 {
13246 sym_value = hash->elf.root.u.def.value;
13247 if (sym_sec->output_section != NULL)
13248 ok_dest = TRUE;
13249 }
13250 else if (hash->elf.root.type == bfd_link_hash_undefweak
13251 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 13252 {
99877b66 13253 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
13254 use the func descriptor sym instead if it is
13255 defined. */
ceb1f1ef 13256 if (hash->elf.root.root.string[0] == '.'
8c5b4e52 13257 && hash->oh != NULL)
8387904d 13258 {
8c5b4e52 13259 fdh = ppc_follow_link (hash->oh);
8387904d
AM
13260 if (fdh->elf.root.type == bfd_link_hash_defined
13261 || fdh->elf.root.type == bfd_link_hash_defweak)
13262 {
13263 sym_sec = fdh->elf.root.u.def.section;
13264 sym_value = fdh->elf.root.u.def.value;
13265 if (sym_sec->output_section != NULL)
13266 ok_dest = TRUE;
13267 }
99877b66
AM
13268 else
13269 fdh = NULL;
8387904d 13270 }
7fe2b9a6
AM
13271 }
13272 else
13273 {
13274 bfd_set_error (bfd_error_bad_value);
13275 goto error_ret_free_internal;
721956f4
AM
13276 }
13277
8843416a 13278 destination = 0;
6911b7dc 13279 local_off = 0;
8843416a
AM
13280 if (ok_dest)
13281 {
13282 sym_value += irela->r_addend;
13283 destination = (sym_value
13284 + sym_sec->output_offset
13285 + sym_sec->output_section->vma);
6911b7dc
AM
13286 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
13287 ? hash->elf.other
13288 : sym->st_other);
8843416a
AM
13289 }
13290
8387904d 13291 code_sec = sym_sec;
e054468f 13292 code_value = sym_value;
74f0fb50
AM
13293 opd = get_opd_info (sym_sec);
13294 if (opd != NULL)
8387904d
AM
13295 {
13296 bfd_vma dest;
13297
74f0fb50 13298 if (hash == NULL && opd->adjust != NULL)
8387904d 13299 {
51aecdc5 13300 long adjust = opd->adjust[OPD_NDX (sym_value)];
8387904d
AM
13301 if (adjust == -1)
13302 continue;
e054468f 13303 code_value += adjust;
8387904d
AM
13304 sym_value += adjust;
13305 }
13306 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 13307 &code_sec, &code_value, FALSE);
8387904d
AM
13308 if (dest != (bfd_vma) -1)
13309 {
13310 destination = dest;
13311 if (fdh != NULL)
13312 {
13313 /* Fixup old ABI sym to point at code
13314 entry. */
99877b66 13315 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 13316 hash->elf.root.u.def.section = code_sec;
e054468f 13317 hash->elf.root.u.def.value = code_value;
8387904d
AM
13318 }
13319 }
13320 }
13321
721956f4 13322 /* Determine what (if any) linker stub is needed. */
e054468f 13323 plt_ent = NULL;
721956f4 13324 stub_type = ppc_type_of_stub (section, irela, &hash,
6911b7dc
AM
13325 &plt_ent, destination,
13326 local_off);
ad8e1ba5 13327
05d0e962
AM
13328 if (r_type == R_PPC64_REL24_NOTOC)
13329 {
13330 if (stub_type == ppc_stub_plt_call)
13331 stub_type = ppc_stub_plt_call_notoc;
13332 else if (stub_type == ppc_stub_long_branch
13333 || (code_sec != NULL
13334 && code_sec->output_section != NULL
13335 && (((hash ? hash->elf.other : sym->st_other)
13336 & STO_PPC64_LOCAL_MASK)
4a4e7361 13337 > 1 << STO_PPC64_LOCAL_BIT)))
05d0e962
AM
13338 stub_type = ppc_stub_long_branch_notoc;
13339 }
13340 else if (stub_type != ppc_stub_plt_call)
ad8e1ba5
AM
13341 {
13342 /* Check whether we need a TOC adjusting stub.
13343 Since the linker pastes together pieces from
13344 different object files when creating the
13345 _init and _fini functions, it may be that a
13346 call to what looks like a local sym is in
13347 fact a call needing a TOC adjustment. */
33cb30a1
AM
13348 if ((code_sec != NULL
13349 && code_sec->output_section != NULL
13350 && (htab->sec_info[code_sec->id].toc_off
13351 != htab->sec_info[section->id].toc_off)
13352 && (code_sec->has_toc_reloc
13353 || code_sec->makes_toc_func_call))
13354 || (((hash ? hash->elf.other : sym->st_other)
13355 & STO_PPC64_LOCAL_MASK)
13356 == 1 << STO_PPC64_LOCAL_BIT))
ad8e1ba5
AM
13357 stub_type = ppc_stub_long_branch_r2off;
13358 }
13359
721956f4
AM
13360 if (stub_type == ppc_stub_none)
13361 continue;
13362
411e1bfb
AM
13363 /* __tls_get_addr calls might be eliminated. */
13364 if (stub_type != ppc_stub_plt_call
05d0e962 13365 && stub_type != ppc_stub_plt_call_notoc
411e1bfb 13366 && hash != NULL
ed7007c1 13367 && is_tls_get_addr (&hash->elf, htab)
411e1bfb
AM
13368 && section->has_tls_reloc
13369 && irela != internal_relocs)
13370 {
13371 /* Get tls info. */
f961d9dd 13372 unsigned char *tls_mask;
411e1bfb 13373
3a71aa26 13374 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
13375 irela - 1, input_bfd))
13376 goto error_ret_free_internal;
abc489c6
AM
13377 if ((*tls_mask & TLS_TLS) != 0
13378 && (*tls_mask & (TLS_GD | TLS_LD)) == 0)
411e1bfb
AM
13379 continue;
13380 }
13381
f378ab09 13382 if (stub_type == ppc_stub_plt_call)
794e51c0 13383 {
6e1816be
AM
13384 if (!htab->opd_abi
13385 && htab->params->plt_localentry0 != 0
13386 && is_elfv2_localentry0 (&hash->elf))
13387 htab->has_plt_localentry0 = 1;
13388 else if (irela + 1 < irelaend
13389 && irela[1].r_offset == irela->r_offset + 4
13390 && (ELF64_R_TYPE (irela[1].r_info)
13391 == R_PPC64_TOCSAVE))
f378ab09
AM
13392 {
13393 if (!tocsave_find (htab, INSERT,
13394 &local_syms, irela + 1, input_bfd))
13395 goto error_ret_free_internal;
13396 }
f378ab09
AM
13397 else
13398 stub_type = ppc_stub_plt_call_r2save;
794e51c0 13399 }
3b421ab3 13400
721956f4 13401 /* Support for grouping stub sections. */
6f20ed8a 13402 id_sec = htab->sec_info[section->id].u.group->link_sec;
721956f4
AM
13403
13404 /* Get the name of this stub. */
13405 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
13406 if (!stub_name)
13407 goto error_ret_free_internal;
13408
13409 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 13410 stub_name, FALSE, FALSE);
721956f4
AM
13411 if (stub_entry != NULL)
13412 {
05d0e962
AM
13413 enum ppc_stub_type old_type;
13414 /* A stub has already been created, but it may
13415 not be the required type. We shouldn't be
13416 transitioning from plt_call to long_branch
13417 stubs or vice versa, but we might be
13418 upgrading from plt_call to plt_call_r2save or
13419 from long_branch to long_branch_r2off. */
721956f4 13420 free (stub_name);
05d0e962
AM
13421 old_type = stub_entry->stub_type;
13422 switch (old_type)
13423 {
13424 default:
13425 abort ();
13426
13427 case ppc_stub_save_res:
13428 continue;
13429
13430 case ppc_stub_plt_call:
13431 case ppc_stub_plt_call_r2save:
13432 case ppc_stub_plt_call_notoc:
13433 case ppc_stub_plt_call_both:
13434 if (stub_type == ppc_stub_plt_call)
13435 continue;
13436 else if (stub_type == ppc_stub_plt_call_r2save)
13437 {
13438 if (old_type == ppc_stub_plt_call_notoc)
13439 stub_type = ppc_stub_plt_call_both;
13440 }
13441 else if (stub_type == ppc_stub_plt_call_notoc)
13442 {
13443 if (old_type == ppc_stub_plt_call_r2save)
13444 stub_type = ppc_stub_plt_call_both;
13445 }
13446 else
13447 abort ();
13448 break;
13449
13450 case ppc_stub_plt_branch:
13451 case ppc_stub_plt_branch_r2off:
13452 case ppc_stub_plt_branch_notoc:
13453 case ppc_stub_plt_branch_both:
13454 old_type += (ppc_stub_long_branch
13455 - ppc_stub_plt_branch);
13456 /* Fall through. */
13457 case ppc_stub_long_branch:
13458 case ppc_stub_long_branch_r2off:
13459 case ppc_stub_long_branch_notoc:
13460 case ppc_stub_long_branch_both:
13461 if (stub_type == ppc_stub_long_branch)
13462 continue;
13463 else if (stub_type == ppc_stub_long_branch_r2off)
13464 {
13465 if (old_type == ppc_stub_long_branch_notoc)
13466 stub_type = ppc_stub_long_branch_both;
13467 }
13468 else if (stub_type == ppc_stub_long_branch_notoc)
13469 {
13470 if (old_type == ppc_stub_long_branch_r2off)
13471 stub_type = ppc_stub_long_branch_both;
13472 }
13473 else
13474 abort ();
13475 break;
13476 }
13477 if (old_type < stub_type)
794e51c0 13478 stub_entry->stub_type = stub_type;
721956f4
AM
13479 continue;
13480 }
13481
25f53a85 13482 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
13483 if (stub_entry == NULL)
13484 {
13485 free (stub_name);
6cdc0ccc
AM
13486 error_ret_free_internal:
13487 if (elf_section_data (section)->relocs == NULL)
13488 free (internal_relocs);
13489 error_ret_free_local:
c9594989
AM
13490 if (symtab_hdr->contents
13491 != (unsigned char *) local_syms)
6cdc0ccc 13492 free (local_syms);
b34976b6 13493 return FALSE;
721956f4
AM
13494 }
13495
ad8e1ba5 13496 stub_entry->stub_type = stub_type;
05d0e962
AM
13497 if (stub_type >= ppc_stub_plt_call
13498 && stub_type <= ppc_stub_plt_call_both)
e054468f 13499 {
05d0e962
AM
13500 stub_entry->target_value = sym_value;
13501 stub_entry->target_section = sym_sec;
e054468f
AM
13502 }
13503 else
13504 {
05d0e962
AM
13505 stub_entry->target_value = code_value;
13506 stub_entry->target_section = code_sec;
e054468f 13507 }
721956f4 13508 stub_entry->h = hash;
e054468f 13509 stub_entry->plt_ent = plt_ent;
2d7ad24e
AM
13510 stub_entry->symtype
13511 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
6911b7dc 13512 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95 13513
3d58e1fc
AM
13514 if (hash != NULL
13515 && (hash->elf.root.type == bfd_link_hash_defined
13516 || hash->elf.root.type == bfd_link_hash_defweak))
ee75fd95 13517 htab->stub_globals += 1;
721956f4
AM
13518 }
13519
13520 /* We're done with the internal relocs, free them. */
6cdc0ccc 13521 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 13522 free (internal_relocs);
721956f4 13523 }
6cdc0ccc
AM
13524
13525 if (local_syms != NULL
13526 && symtab_hdr->contents != (unsigned char *) local_syms)
13527 {
13528 if (!info->keep_memory)
13529 free (local_syms);
13530 else
13531 symtab_hdr->contents = (unsigned char *) local_syms;
13532 }
721956f4
AM
13533 }
13534
5c3dead3 13535 /* We may have added some stubs. Find out the new size of the
721956f4 13536 stub sections. */
d4aaa2a0 13537 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13538 {
13539 group->lr_restore = 0;
13540 group->eh_size = 0;
13541 if (group->stub_sec != NULL)
13542 {
13543 asection *stub_sec = group->stub_sec;
13544
13545 if (htab->stub_iteration <= STUB_SHRINK_ITER
13546 || stub_sec->rawsize < stub_sec->size)
13547 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
13548 stub_sec->rawsize = stub_sec->size;
13549 stub_sec->size = 0;
13550 stub_sec->reloc_count = 0;
13551 stub_sec->flags &= ~SEC_RELOC;
13552 }
13553 }
a804e476
AM
13554 if (htab->tga_group != NULL)
13555 {
13556 /* See emit_tga_desc and emit_tga_desc_eh_frame. */
13557 htab->tga_group->eh_size
13558 = 1 + 2 + (htab->opd_abi != 0) + 3 + 8 * 2 + 3 + 8 + 3;
13559 htab->tga_group->lr_restore = 23 * 4;
13560 htab->tga_group->stub_sec->size = 24 * 4;
13561 }
eea6121a 13562
ba21f564
AM
13563 if (htab->stub_iteration <= STUB_SHRINK_ITER
13564 || htab->brlt->rawsize < htab->brlt->size)
13565 htab->brlt->rawsize = htab->brlt->size;
eea6121a 13566 htab->brlt->size = 0;
84f5d08e
AM
13567 htab->brlt->reloc_count = 0;
13568 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 13569 if (htab->relbrlt != NULL)
eea6121a 13570 htab->relbrlt->size = 0;
721956f4 13571
63bc6f6c 13572 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 13573
a4b6fadd
AM
13574 for (group = htab->group; group != NULL; group = group->next)
13575 if (group->needs_save_res)
13576 group->stub_sec->size += htab->sfpr->size;
13577
176a0d42
AM
13578 if (info->emitrelocations
13579 && htab->glink != NULL && htab->glink->size != 0)
13580 {
13581 htab->glink->reloc_count = 1;
13582 htab->glink->flags |= SEC_RELOC;
13583 }
13584
58d180e8
AM
13585 if (htab->glink_eh_frame != NULL
13586 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
2d0d44d5 13587 && htab->glink_eh_frame->output_section->size > 8)
58d180e8 13588 {
2e0ce1c8 13589 size_t size = 0, align = 4;
58d180e8 13590
d4aaa2a0 13591 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13592 if (group->eh_size != 0)
13593 size += (group->eh_size + 17 + align - 1) & -align;
58d180e8 13594 if (htab->glink != NULL && htab->glink->size != 0)
2e0ce1c8 13595 size += (24 + align - 1) & -align;
58d180e8 13596 if (size != 0)
2e0ce1c8
AM
13597 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
13598 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
13599 size = (size + align - 1) & -align;
58d180e8
AM
13600 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
13601 htab->glink_eh_frame->size = size;
13602 }
13603
e7d1c40c 13604 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13605 for (group = htab->group; group != NULL; group = group->next)
13606 if (group->stub_sec != NULL)
691d2e9a
AM
13607 {
13608 int align = abs (htab->params->plt_stub_align);
13609 group->stub_sec->size
13610 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
13611 }
d4aaa2a0
AM
13612
13613 for (group = htab->group; group != NULL; group = group->next)
13614 if (group->stub_sec != NULL
13615 && group->stub_sec->rawsize != group->stub_sec->size
c9301e31 13616 && (htab->stub_iteration <= STUB_SHRINK_ITER
d4aaa2a0 13617 || group->stub_sec->rawsize < group->stub_sec->size))
5c3dead3
AM
13618 break;
13619
d4aaa2a0 13620 if (group == NULL
ba21f564
AM
13621 && (htab->brlt->rawsize == htab->brlt->size
13622 || (htab->stub_iteration > STUB_SHRINK_ITER
13623 && htab->brlt->rawsize > htab->brlt->size))
58d180e8 13624 && (htab->glink_eh_frame == NULL
a804e476
AM
13625 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size)
13626 && (htab->tga_group == NULL
13627 || htab->stub_iteration > 1))
5c3dead3
AM
13628 break;
13629
721956f4 13630 /* Ask the linker to do its stuff. */
e7d1c40c 13631 (*htab->params->layout_sections_again) ();
721956f4
AM
13632 }
13633
da44f4e5
AM
13634 if (htab->glink_eh_frame != NULL
13635 && htab->glink_eh_frame->size != 0)
13636 {
13637 bfd_vma val;
13638 bfd_byte *p, *last_fde;
13639 size_t last_fde_len, size, align, pad;
d4aaa2a0 13640 struct map_stub *group;
da44f4e5 13641
df136d64
AM
13642 /* It is necessary to at least have a rough outline of the
13643 linker generated CIEs and FDEs written before
13644 bfd_elf_discard_info is run, in order for these FDEs to be
13645 indexed in .eh_frame_hdr. */
da44f4e5
AM
13646 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
13647 if (p == NULL)
13648 return FALSE;
13649 htab->glink_eh_frame->contents = p;
13650 last_fde = p;
2e0ce1c8 13651 align = 4;
da44f4e5
AM
13652
13653 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
13654 /* CIE length (rewrite in case little-endian). */
2e0ce1c8 13655 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
da44f4e5 13656 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
2e0ce1c8 13657 p += last_fde_len + 4;
da44f4e5 13658
d4aaa2a0 13659 for (group = htab->group; group != NULL; group = group->next)
df136d64 13660 if (group->eh_size != 0)
da44f4e5 13661 {
df136d64 13662 group->eh_base = p - htab->glink_eh_frame->contents;
da44f4e5 13663 last_fde = p;
df136d64 13664 last_fde_len = ((group->eh_size + 17 + align - 1) & -align) - 4;
da44f4e5 13665 /* FDE length. */
2e0ce1c8 13666 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13667 p += 4;
13668 /* CIE pointer. */
13669 val = p - htab->glink_eh_frame->contents;
13670 bfd_put_32 (htab->elf.dynobj, val, p);
13671 p += 4;
13672 /* Offset to stub section, written later. */
13673 p += 4;
13674 /* stub section size. */
d4aaa2a0 13675 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
da44f4e5
AM
13676 p += 4;
13677 /* Augmentation. */
13678 p += 1;
df136d64
AM
13679 /* Make sure we don't have all nops. This is enough for
13680 elf-eh-frame.c to detect the last non-nop opcode. */
13681 p[group->eh_size - 1] = DW_CFA_advance_loc + 1;
d4aaa2a0 13682 p = last_fde + last_fde_len + 4;
da44f4e5
AM
13683 }
13684 if (htab->glink != NULL && htab->glink->size != 0)
13685 {
13686 last_fde = p;
2e0ce1c8 13687 last_fde_len = ((24 + align - 1) & -align) - 4;
da44f4e5 13688 /* FDE length. */
2e0ce1c8 13689 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13690 p += 4;
13691 /* CIE pointer. */
13692 val = p - htab->glink_eh_frame->contents;
13693 bfd_put_32 (htab->elf.dynobj, val, p);
13694 p += 4;
13695 /* Offset to .glink, written later. */
13696 p += 4;
13697 /* .glink size. */
13698 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
13699 p += 4;
13700 /* Augmentation. */
13701 p += 1;
13702
13703 *p++ = DW_CFA_advance_loc + 1;
13704 *p++ = DW_CFA_register;
13705 *p++ = 65;
9f08fa5c 13706 *p++ = htab->opd_abi ? 12 : 0;
15a3a14f 13707 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
da44f4e5
AM
13708 *p++ = DW_CFA_restore_extended;
13709 *p++ = 65;
2e0ce1c8 13710 p += ((24 + align - 1) & -align) - 24;
da44f4e5
AM
13711 }
13712 /* Subsume any padding into the last FDE if user .eh_frame
13713 sections are aligned more than glink_eh_frame. Otherwise any
13714 zero padding will be seen as a terminator. */
2e0ce1c8 13715 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
da44f4e5 13716 size = p - htab->glink_eh_frame->contents;
2e0ce1c8 13717 pad = ((size + align - 1) & -align) - size;
da44f4e5
AM
13718 htab->glink_eh_frame->size = size + pad;
13719 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
13720 }
13721
d969d15f 13722 maybe_strip_output (info, htab->brlt);
2efec98b
AM
13723 if (htab->relbrlt != NULL)
13724 maybe_strip_output (info, htab->relbrlt);
d969d15f
AM
13725 if (htab->glink_eh_frame != NULL)
13726 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 13727
b34976b6 13728 return TRUE;
721956f4
AM
13729}
13730
13731/* Called after we have determined section placement. If sections
805fc799 13732 move, we'll be called again. Provide a value for TOCstart. */
721956f4 13733
805fc799 13734bfd_vma
1c865ab2 13735ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 13736{
805fc799 13737 asection *s;
a27e685f 13738 bfd_vma TOCstart, adjust;
721956f4 13739
43417696
AM
13740 if (info != NULL)
13741 {
13742 struct elf_link_hash_entry *h;
13743 struct elf_link_hash_table *htab = elf_hash_table (info);
13744
13745 if (is_elf_hash_table (htab)
13746 && htab->hgot != NULL)
13747 h = htab->hgot;
13748 else
13749 {
13750 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
13751 if (is_elf_hash_table (htab))
13752 htab->hgot = h;
13753 }
13754 if (h != NULL
13755 && h->root.type == bfd_link_hash_defined
13756 && !h->root.linker_def
13757 && (!is_elf_hash_table (htab)
13758 || h->def_regular))
13759 {
ed7007c1 13760 TOCstart = defined_sym_val (h) - TOC_BASE_OFF;
43417696
AM
13761 _bfd_set_gp_value (obfd, TOCstart);
13762 return TOCstart;
13763 }
13764 }
13765
805fc799
AM
13766 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
13767 order. The TOC starts where the first of these sections starts. */
13768 s = bfd_get_section_by_name (obfd, ".got");
e054468f 13769 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13770 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 13771 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13772 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 13773 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13774 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 13775 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
13776 {
13777 /* This may happen for
13778 o references to TOC base (SYM@toc / TOC[tc0]) without a
13779 .toc directive
13780 o bad linker script
13781 o --gc-sections and empty TOC sections
13782
13783 FIXME: Warn user? */
13784
13785 /* Look for a likely section. We probably won't even be
13786 using TOCstart. */
13787 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13788 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
13789 | SEC_EXCLUDE))
805fc799
AM
13790 == (SEC_ALLOC | SEC_SMALL_DATA))
13791 break;
721956f4 13792 if (s == NULL)
805fc799 13793 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13794 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
13795 == (SEC_ALLOC | SEC_SMALL_DATA))
13796 break;
721956f4 13797 if (s == NULL)
805fc799 13798 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13799 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
13800 == SEC_ALLOC)
805fc799 13801 break;
721956f4 13802 if (s == NULL)
805fc799 13803 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13804 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
13805 break;
13806 }
721956f4 13807
805fc799
AM
13808 TOCstart = 0;
13809 if (s != NULL)
13810 TOCstart = s->output_section->vma + s->output_offset;
721956f4 13811
a27e685f
AM
13812 /* Force alignment. */
13813 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
13814 TOCstart -= adjust;
1c865ab2
AM
13815 _bfd_set_gp_value (obfd, TOCstart);
13816
810d4e75 13817 if (info != NULL && s != NULL)
1c865ab2
AM
13818 {
13819 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13820
810d4e75
AM
13821 if (htab != NULL)
13822 {
13823 if (htab->elf.hgot != NULL)
13824 {
a27e685f 13825 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
810d4e75
AM
13826 htab->elf.hgot->root.u.def.section = s;
13827 }
13828 }
13829 else
1c865ab2 13830 {
810d4e75
AM
13831 struct bfd_link_hash_entry *bh = NULL;
13832 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
a27e685f
AM
13833 s, TOC_BASE_OFF - adjust,
13834 NULL, FALSE, FALSE, &bh);
1c865ab2
AM
13835 }
13836 }
805fc799 13837 return TOCstart;
721956f4
AM
13838}
13839
a345bc8d 13840/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
49c09209 13841 write out any global entry stubs, and PLT relocations. */
a345bc8d
AM
13842
13843static bfd_boolean
49c09209 13844build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
a345bc8d
AM
13845{
13846 struct bfd_link_info *info;
13847 struct ppc_link_hash_table *htab;
49c09209 13848 struct plt_entry *ent;
a345bc8d
AM
13849 asection *s;
13850
13851 if (h->root.type == bfd_link_hash_indirect)
13852 return TRUE;
13853
49c09209
AM
13854 info = inf;
13855 htab = ppc_hash_table (info);
13856 if (htab == NULL)
13857 return FALSE;
13858
13859 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13860 if (ent->plt.offset != (bfd_vma) -1)
13861 {
13862 /* This symbol has an entry in the procedure linkage
13863 table. Set it up. */
13864 Elf_Internal_Rela rela;
2d7ad24e 13865 asection *plt, *relplt;
49c09209
AM
13866 bfd_byte *loc;
13867
13868 if (!htab->elf.dynamic_sections_created
13869 || h->dynindx == -1)
13870 {
13871 if (!(h->def_regular
13872 && (h->root.type == bfd_link_hash_defined
13873 || h->root.type == bfd_link_hash_defweak)))
13874 continue;
2d7ad24e
AM
13875 if (h->type == STT_GNU_IFUNC)
13876 {
13877 plt = htab->elf.iplt;
13878 relplt = htab->elf.irelplt;
cebd6b8a 13879 htab->elf.ifunc_resolvers = TRUE;
2d7ad24e
AM
13880 if (htab->opd_abi)
13881 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13882 else
13883 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13884 }
49c09209 13885 else
2d7ad24e
AM
13886 {
13887 plt = htab->pltlocal;
13888 if (bfd_link_pic (info))
13889 {
13890 relplt = htab->relpltlocal;
13891 if (htab->opd_abi)
13892 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13893 else
13894 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13895 }
13896 else
13897 relplt = NULL;
13898 }
ed7007c1 13899 rela.r_addend = defined_sym_val (h) + ent->addend;
2d7ad24e
AM
13900
13901 if (relplt == NULL)
13902 {
13903 loc = plt->contents + ent->plt.offset;
13904 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
13905 if (htab->opd_abi)
13906 {
13907 bfd_vma toc = elf_gp (info->output_bfd);
13908 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
13909 bfd_put_64 (info->output_bfd, toc, loc + 8);
13910 }
13911 }
13912 else
13913 {
13914 rela.r_offset = (plt->output_section->vma
13915 + plt->output_offset
13916 + ent->plt.offset);
13917 loc = relplt->contents + (relplt->reloc_count++
13918 * sizeof (Elf64_External_Rela));
13919 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13920 }
49c09209
AM
13921 }
13922 else
13923 {
13924 rela.r_offset = (htab->elf.splt->output_section->vma
13925 + htab->elf.splt->output_offset
13926 + ent->plt.offset);
13927 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13928 rela.r_addend = ent->addend;
13929 loc = (htab->elf.srelplt->contents
13930 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
13931 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
13932 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
cebd6b8a 13933 htab->elf.ifunc_resolvers = TRUE;
2d7ad24e 13934 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
49c09209 13935 }
49c09209
AM
13936 }
13937
a345bc8d
AM
13938 if (!h->pointer_equality_needed)
13939 return TRUE;
13940
13941 if (h->def_regular)
13942 return TRUE;
13943
9e390558 13944 s = htab->global_entry;
49c09209
AM
13945 if (s == NULL || s->size == 0)
13946 return TRUE;
13947
13948 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13949 if (ent->plt.offset != (bfd_vma) -1
13950 && ent->addend == 0)
a345bc8d
AM
13951 {
13952 bfd_byte *p;
13953 asection *plt;
13954 bfd_vma off;
13955
a345bc8d 13956 p = s->contents + h->root.u.def.value;
33e44f2e 13957 plt = htab->elf.splt;
a345bc8d
AM
13958 if (!htab->elf.dynamic_sections_created
13959 || h->dynindx == -1)
2d7ad24e
AM
13960 {
13961 if (h->type == STT_GNU_IFUNC)
13962 plt = htab->elf.iplt;
13963 else
13964 plt = htab->pltlocal;
13965 }
49c09209 13966 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
a345bc8d
AM
13967 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
13968
13969 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
13970 {
13971 info->callbacks->einfo
c1c8c1ef 13972 (_("%P: linkage table error against `%pT'\n"),
a345bc8d
AM
13973 h->root.root.string);
13974 bfd_set_error (bfd_error_bad_value);
13975 htab->stub_error = TRUE;
13976 }
13977
7341d5e2
AM
13978 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13979 if (htab->params->emit_stub_syms)
13980 {
13981 size_t len = strlen (h->root.root.string);
13982 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13983
13984 if (name == NULL)
13985 return FALSE;
13986
13987 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13988 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13989 if (h == NULL)
13990 return FALSE;
13991 if (h->root.type == bfd_link_hash_new)
13992 {
13993 h->root.type = bfd_link_hash_defined;
13994 h->root.u.def.section = s;
13995 h->root.u.def.value = p - s->contents;
13996 h->ref_regular = 1;
13997 h->def_regular = 1;
13998 h->ref_regular_nonweak = 1;
13999 h->forced_local = 1;
14000 h->non_elf = 0;
2ec55de3 14001 h->root.linker_def = 1;
7341d5e2
AM
14002 }
14003 }
14004
a345bc8d
AM
14005 if (PPC_HA (off) != 0)
14006 {
14007 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
14008 p += 4;
14009 }
14010 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
14011 p += 4;
14012 bfd_put_32 (s->owner, MTCTR_R12, p);
14013 p += 4;
407aa07c 14014 bfd_put_32 (s->owner, BCTR, p);
a345bc8d
AM
14015 break;
14016 }
14017 return TRUE;
14018}
14019
49c09209
AM
14020/* Write PLT relocs for locals. */
14021
14022static bfd_boolean
14023write_plt_relocs_for_local_syms (struct bfd_link_info *info)
14024{
14025 struct ppc_link_hash_table *htab = ppc_hash_table (info);
14026 bfd *ibfd;
14027
14028 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
14029 {
14030 struct got_entry **lgot_ents, **end_lgot_ents;
14031 struct plt_entry **local_plt, **lplt, **end_local_plt;
14032 Elf_Internal_Shdr *symtab_hdr;
14033 bfd_size_type locsymcount;
14034 Elf_Internal_Sym *local_syms = NULL;
14035 struct plt_entry *ent;
14036
14037 if (!is_ppc64_elf (ibfd))
14038 continue;
14039
14040 lgot_ents = elf_local_got_ents (ibfd);
14041 if (!lgot_ents)
14042 continue;
14043
14044 symtab_hdr = &elf_symtab_hdr (ibfd);
14045 locsymcount = symtab_hdr->sh_info;
14046 end_lgot_ents = lgot_ents + locsymcount;
14047 local_plt = (struct plt_entry **) end_lgot_ents;
14048 end_local_plt = local_plt + locsymcount;
14049 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
14050 for (ent = *lplt; ent != NULL; ent = ent->next)
14051 if (ent->plt.offset != (bfd_vma) -1)
14052 {
14053 Elf_Internal_Sym *sym;
14054 asection *sym_sec;
14055 asection *plt, *relplt;
14056 bfd_byte *loc;
14057 bfd_vma val;
49c09209
AM
14058
14059 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
14060 lplt - local_plt, ibfd))
14061 {
c9594989 14062 if (symtab_hdr->contents != (unsigned char *) local_syms)
49c09209
AM
14063 free (local_syms);
14064 return FALSE;
14065 }
14066
14067 val = sym->st_value + ent->addend;
ba85c15d
AM
14068 if (ELF_ST_TYPE (sym->st_info) != STT_GNU_IFUNC)
14069 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
49c09209
AM
14070 if (sym_sec != NULL && sym_sec->output_section != NULL)
14071 val += sym_sec->output_offset + sym_sec->output_section->vma;
14072
2d7ad24e
AM
14073 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14074 {
cebd6b8a 14075 htab->elf.ifunc_resolvers = TRUE;
2d7ad24e
AM
14076 plt = htab->elf.iplt;
14077 relplt = htab->elf.irelplt;
14078 }
14079 else
14080 {
14081 plt = htab->pltlocal;
14082 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
14083 }
49c09209 14084
2d7ad24e
AM
14085 if (relplt == NULL)
14086 {
14087 loc = plt->contents + ent->plt.offset;
14088 bfd_put_64 (info->output_bfd, val, loc);
14089 if (htab->opd_abi)
14090 {
14091 bfd_vma toc = elf_gp (ibfd);
14092 bfd_put_64 (info->output_bfd, toc, loc + 8);
14093 }
14094 }
49c09209 14095 else
2d7ad24e
AM
14096 {
14097 Elf_Internal_Rela rela;
14098 rela.r_offset = (ent->plt.offset
14099 + plt->output_offset
14100 + plt->output_section->vma);
14101 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14102 {
14103 if (htab->opd_abi)
14104 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
14105 else
14106 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14107 }
14108 else
14109 {
14110 if (htab->opd_abi)
14111 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
14112 else
14113 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14114 }
14115 rela.r_addend = val;
14116 loc = relplt->contents + (relplt->reloc_count++
14117 * sizeof (Elf64_External_Rela));
14118 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
14119 }
49c09209
AM
14120 }
14121
14122 if (local_syms != NULL
14123 && symtab_hdr->contents != (unsigned char *) local_syms)
14124 {
14125 if (!info->keep_memory)
14126 free (local_syms);
14127 else
14128 symtab_hdr->contents = (unsigned char *) local_syms;
14129 }
14130 }
14131 return TRUE;
14132}
14133
a804e476
AM
14134/* Emit the static wrapper function preserving registers around a
14135 __tls_get_addr_opt call. */
14136
14137static bfd_boolean
14138emit_tga_desc (struct ppc_link_hash_table *htab)
14139{
14140 asection *stub_sec = htab->tga_group->stub_sec;
14141 unsigned int cfa_updt = 11 * 4;
14142 bfd_byte *p;
14143 bfd_vma to, from, delta;
14144
14145 BFD_ASSERT (htab->tga_desc_fd->elf.root.type == bfd_link_hash_defined
14146 && htab->tga_desc_fd->elf.root.u.def.section == stub_sec
14147 && htab->tga_desc_fd->elf.root.u.def.value == 0);
14148 to = defined_sym_val (&htab->tls_get_addr_fd->elf);
14149 from = defined_sym_val (&htab->tga_desc_fd->elf) + cfa_updt;
14150 delta = to - from;
14151 if (delta + (1 << 25) >= 1 << 26)
14152 {
14153 _bfd_error_handler (_("__tls_get_addr call offset overflow"));
14154 htab->stub_error = TRUE;
14155 return FALSE;
14156 }
14157
14158 p = stub_sec->contents;
14159 p = tls_get_addr_prologue (htab->elf.dynobj, p, htab);
14160 bfd_put_32 (stub_sec->owner, B_DOT | 1 | (delta & 0x3fffffc), p);
14161 p += 4;
14162 p = tls_get_addr_epilogue (htab->elf.dynobj, p, htab);
14163 return stub_sec->size == (bfd_size_type) (p - stub_sec->contents);
14164}
14165
14166/* Emit eh_frame describing the static wrapper function. */
14167
14168static bfd_byte *
14169emit_tga_desc_eh_frame (struct ppc_link_hash_table *htab, bfd_byte *p)
14170{
14171 unsigned int cfa_updt = 11 * 4;
14172 unsigned int i;
14173
14174 *p++ = DW_CFA_advance_loc + cfa_updt / 4;
14175 *p++ = DW_CFA_def_cfa_offset;
14176 if (htab->opd_abi)
14177 {
14178 *p++ = 128;
14179 *p++ = 1;
14180 }
14181 else
14182 *p++ = 96;
14183 *p++ = DW_CFA_offset_extended_sf;
14184 *p++ = 65;
14185 *p++ = (-16 / 8) & 0x7f;
14186 for (i = 4; i < 12; i++)
14187 {
14188 *p++ = DW_CFA_offset + i;
14189 *p++ = (htab->opd_abi ? 13 : 12) - i;
14190 }
14191 *p++ = DW_CFA_advance_loc + 10;
14192 *p++ = DW_CFA_def_cfa_offset;
14193 *p++ = 0;
14194 for (i = 4; i < 12; i++)
14195 *p++ = DW_CFA_restore + i;
14196 *p++ = DW_CFA_advance_loc + 2;
14197 *p++ = DW_CFA_restore_extended;
14198 *p++ = 65;
14199 return p;
14200}
14201
721956f4
AM
14202/* Build all the stubs associated with the current output file.
14203 The stubs are kept in a hash table attached to the main linker
14204 hash table. This function is called via gldelf64ppc_finish. */
14205
b34976b6 14206bfd_boolean
e7d1c40c 14207ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 14208 char **stats)
5d1634d7
AM
14209{
14210 struct ppc_link_hash_table *htab = ppc_hash_table (info);
a4b6fadd 14211 struct map_stub *group;
721956f4 14212 asection *stub_sec;
5d1634d7 14213 bfd_byte *p;
e717da7e 14214 int stub_sec_count = 0;
5d1634d7 14215
4dfe6ac6
NC
14216 if (htab == NULL)
14217 return FALSE;
14218
eea6121a 14219 /* Allocate memory to hold the linker stubs. */
d4aaa2a0 14220 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
14221 {
14222 group->eh_size = 0;
14223 group->lr_restore = 0;
14224 if ((stub_sec = group->stub_sec) != NULL
14225 && stub_sec->size != 0)
14226 {
14227 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd,
14228 stub_sec->size);
14229 if (stub_sec->contents == NULL)
14230 return FALSE;
14231 stub_sec->size = 0;
14232 }
14233 }
5d1634d7 14234
23eb7e01 14235 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 14236 {
9f951329 14237 unsigned int indx;
ad8e1ba5 14238 bfd_vma plt0;
9f951329 14239
721956f4 14240 /* Build the .glink plt call stub. */
e7d1c40c 14241 if (htab->params->emit_stub_syms)
97b639ba
AM
14242 {
14243 struct elf_link_hash_entry *h;
468392fb
AM
14244 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
14245 TRUE, FALSE, FALSE);
97b639ba
AM
14246 if (h == NULL)
14247 return FALSE;
14248 if (h->root.type == bfd_link_hash_new)
14249 {
14250 h->root.type = bfd_link_hash_defined;
14251 h->root.u.def.section = htab->glink;
ee4bf8d2 14252 h->root.u.def.value = 8;
f5385ebf
AM
14253 h->ref_regular = 1;
14254 h->def_regular = 1;
14255 h->ref_regular_nonweak = 1;
14256 h->forced_local = 1;
14257 h->non_elf = 0;
2ec55de3 14258 h->root.linker_def = 1;
97b639ba
AM
14259 }
14260 }
33e44f2e
AM
14261 plt0 = (htab->elf.splt->output_section->vma
14262 + htab->elf.splt->output_offset
14263 - 16);
176a0d42
AM
14264 if (info->emitrelocations)
14265 {
14266 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
14267 if (r == NULL)
14268 return FALSE;
14269 r->r_offset = (htab->glink->output_offset
14270 + htab->glink->output_section->vma);
14271 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
14272 r->r_addend = plt0;
14273 }
4ce794b7 14274 p = htab->glink->contents;
176a0d42 14275 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
14276 bfd_put_64 (htab->glink->owner, plt0, p);
14277 p += 8;
b9e5796b
AM
14278 if (htab->opd_abi)
14279 {
14280 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
14281 p += 4;
14282 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
14283 p += 4;
14284 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
14285 p += 4;
14286 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
14287 p += 4;
14288 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
14289 p += 4;
14290 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
14291 p += 4;
14292 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
14293 p += 4;
14294 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
14295 p += 4;
14296 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
14297 p += 4;
14298 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
14299 p += 4;
14300 }
14301 else
14302 {
14303 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
14304 p += 4;
14305 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
14306 p += 4;
14307 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
14308 p += 4;
f378ab09
AM
14309 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
14310 p += 4;
b9e5796b
AM
14311 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
14312 p += 4;
14313 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
14314 p += 4;
14315 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
14316 p += 4;
14317 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
14318 p += 4;
14319 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
14320 p += 4;
14321 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
14322 p += 4;
14323 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
14324 p += 4;
14325 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
14326 p += 4;
14327 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
14328 p += 4;
14329 }
407aa07c
AM
14330 bfd_put_32 (htab->glink->owner, BCTR, p);
14331 p += 4;
c75bc4f7 14332 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
ad8e1ba5 14333
9f951329
AM
14334 /* Build the .glink lazy link call stubs. */
14335 indx = 0;
9e390558 14336 while (p < htab->glink->contents + htab->glink->size)
9f951329 14337 {
b9e5796b 14338 if (htab->opd_abi)
9f951329 14339 {
b9e5796b
AM
14340 if (indx < 0x8000)
14341 {
14342 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
14343 p += 4;
14344 }
14345 else
14346 {
14347 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
14348 p += 4;
14349 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
14350 p);
14351 p += 4;
14352 }
9f951329 14353 }
4ce794b7 14354 bfd_put_32 (htab->glink->owner,
ee4bf8d2 14355 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 14356 indx++;
9f951329
AM
14357 p += 4;
14358 }
5d1634d7 14359 }
5d1634d7 14360
a804e476
AM
14361 if (htab->tga_group != NULL)
14362 {
14363 htab->tga_group->lr_restore = 23 * 4;
14364 htab->tga_group->stub_sec->size = 24 * 4;
14365 if (!emit_tga_desc (htab))
14366 return FALSE;
14367 if (htab->glink_eh_frame != NULL
14368 && htab->glink_eh_frame->size != 0)
14369 {
14370 size_t align = 4;
14371
14372 p = htab->glink_eh_frame->contents;
14373 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
14374 p += 17;
14375 htab->tga_group->eh_size = emit_tga_desc_eh_frame (htab, p) - p;
14376 }
14377 }
14378
49c09209
AM
14379 /* Build .glink global entry stubs, and PLT relocs for globals. */
14380 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
14381
14382 if (!write_plt_relocs_for_local_syms (info))
14383 return FALSE;
9e390558 14384
7341d5e2 14385 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 14386 {
4ce794b7 14387 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 14388 htab->brlt->size);
4ce794b7 14389 if (htab->brlt->contents == NULL)
b34976b6 14390 return FALSE;
721956f4 14391 }
ee75fd95 14392 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
14393 {
14394 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 14395 htab->relbrlt->size);
63bc6f6c
AM
14396 if (htab->relbrlt->contents == NULL)
14397 return FALSE;
14398 }
5d1634d7 14399
721956f4
AM
14400 /* Build the stubs as directed by the stub hash table. */
14401 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 14402
a4b6fadd
AM
14403 for (group = htab->group; group != NULL; group = group->next)
14404 if (group->needs_save_res)
7dda8d3c 14405 group->stub_sec->size += htab->sfpr->size;
a4b6fadd 14406
aa8a7074
AM
14407 if (htab->relbrlt != NULL)
14408 htab->relbrlt->reloc_count = 0;
14409
e7d1c40c 14410 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
14411 for (group = htab->group; group != NULL; group = group->next)
14412 if ((stub_sec = group->stub_sec) != NULL)
691d2e9a
AM
14413 {
14414 int align = abs (htab->params->plt_stub_align);
14415 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
14416 }
794e51c0 14417
7dda8d3c
AM
14418 for (group = htab->group; group != NULL; group = group->next)
14419 if (group->needs_save_res)
14420 {
14421 stub_sec = group->stub_sec;
14422 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
14423 htab->sfpr->contents, htab->sfpr->size);
14424 if (htab->params->emit_stub_syms)
14425 {
14426 unsigned int i;
14427
14428 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
14429 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
14430 return FALSE;
14431 }
14432 }
14433
df136d64
AM
14434 if (htab->glink_eh_frame != NULL
14435 && htab->glink_eh_frame->size != 0)
14436 {
14437 bfd_vma val;
14438 size_t align = 4;
14439
14440 p = htab->glink_eh_frame->contents;
14441 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
14442
14443 for (group = htab->group; group != NULL; group = group->next)
14444 if (group->eh_size != 0)
14445 {
14446 /* Offset to stub section. */
14447 val = (group->stub_sec->output_section->vma
14448 + group->stub_sec->output_offset);
14449 val -= (htab->glink_eh_frame->output_section->vma
14450 + htab->glink_eh_frame->output_offset
14451 + (p + 8 - htab->glink_eh_frame->contents));
14452 if (val + 0x80000000 > 0xffffffff)
14453 {
14454 _bfd_error_handler
14455 (_("%s offset too large for .eh_frame sdata4 encoding"),
14456 group->stub_sec->name);
14457 return FALSE;
14458 }
14459 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14460 p += (group->eh_size + 17 + 3) & -4;
14461 }
14462 if (htab->glink != NULL && htab->glink->size != 0)
14463 {
14464 /* Offset to .glink. */
14465 val = (htab->glink->output_section->vma
14466 + htab->glink->output_offset
14467 + 8);
14468 val -= (htab->glink_eh_frame->output_section->vma
14469 + htab->glink_eh_frame->output_offset
14470 + (p + 8 - htab->glink_eh_frame->contents));
14471 if (val + 0x80000000 > 0xffffffff)
14472 {
14473 _bfd_error_handler
14474 (_("%s offset too large for .eh_frame sdata4 encoding"),
14475 htab->glink->name);
14476 return FALSE;
14477 }
14478 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14479 p += (24 + align - 1) & -align;
14480 }
14481 }
14482
d4aaa2a0
AM
14483 for (group = htab->group; group != NULL; group = group->next)
14484 if ((stub_sec = group->stub_sec) != NULL)
e717da7e
AM
14485 {
14486 stub_sec_count += 1;
c9301e31
AM
14487 if (stub_sec->rawsize != stub_sec->size
14488 && (htab->stub_iteration <= STUB_SHRINK_ITER
14489 || stub_sec->rawsize < stub_sec->size))
e717da7e
AM
14490 break;
14491 }
5d1634d7 14492
25516cc5 14493 if (group != NULL)
5d1634d7 14494 {
b34976b6 14495 htab->stub_error = TRUE;
cf97bcb0 14496 _bfd_error_handler (_("stubs don't match calculated size"));
5d1634d7 14497 }
721956f4 14498
d2a300cf
AM
14499 if (htab->stub_error)
14500 return FALSE;
14501
14502 if (stats != NULL)
14503 {
988b7300
AM
14504 char *groupmsg;
14505 if (asprintf (&groupmsg,
14506 ngettext ("linker stubs in %u group\n",
14507 "linker stubs in %u groups\n",
14508 stub_sec_count),
14509 stub_sec_count) < 0)
14510 *stats = NULL;
14511 else
14512 {
14513 if (asprintf (stats, _("%s"
14514 " branch %lu\n"
14515 " branch toc adj %lu\n"
14516 " branch notoc %lu\n"
14517 " branch both %lu\n"
14518 " long branch %lu\n"
14519 " long toc adj %lu\n"
14520 " long notoc %lu\n"
14521 " long both %lu\n"
14522 " plt call %lu\n"
14523 " plt call save %lu\n"
14524 " plt call notoc %lu\n"
14525 " plt call both %lu\n"
14526 " global entry %lu"),
14527 groupmsg,
14528 htab->stub_count[ppc_stub_long_branch - 1],
14529 htab->stub_count[ppc_stub_long_branch_r2off - 1],
14530 htab->stub_count[ppc_stub_long_branch_notoc - 1],
14531 htab->stub_count[ppc_stub_long_branch_both - 1],
14532 htab->stub_count[ppc_stub_plt_branch - 1],
14533 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
14534 htab->stub_count[ppc_stub_plt_branch_notoc - 1],
14535 htab->stub_count[ppc_stub_plt_branch_both - 1],
14536 htab->stub_count[ppc_stub_plt_call - 1],
14537 htab->stub_count[ppc_stub_plt_call_r2save - 1],
14538 htab->stub_count[ppc_stub_plt_call_notoc - 1],
14539 htab->stub_count[ppc_stub_plt_call_both - 1],
14540 htab->stub_count[ppc_stub_global_entry - 1]) < 0)
14541 *stats = NULL;
14542 free (groupmsg);
14543 }
d2a300cf
AM
14544 }
14545 return TRUE;
5bd4f169
AM
14546}
14547
60124e18
AM
14548/* What to do when ld finds relocations against symbols defined in
14549 discarded sections. */
14550
14551static unsigned int
14552ppc64_elf_action_discarded (asection *sec)
14553{
14554 if (strcmp (".opd", sec->name) == 0)
14555 return 0;
14556
14557 if (strcmp (".toc", sec->name) == 0)
14558 return 0;
14559
bce50a28
JJ
14560 if (strcmp (".toc1", sec->name) == 0)
14561 return 0;
14562
60124e18
AM
14563 return _bfd_elf_default_action_discarded (sec);
14564}
14565
e59a1001
AM
14566/* These are the dynamic relocations supported by glibc. */
14567
14568static bfd_boolean
14569ppc64_glibc_dynamic_reloc (enum elf_ppc64_reloc_type r_type)
14570{
14571 switch (r_type)
14572 {
14573 case R_PPC64_RELATIVE:
14574 case R_PPC64_NONE:
14575 case R_PPC64_ADDR64:
14576 case R_PPC64_GLOB_DAT:
14577 case R_PPC64_IRELATIVE:
14578 case R_PPC64_JMP_IREL:
14579 case R_PPC64_JMP_SLOT:
14580 case R_PPC64_DTPMOD64:
14581 case R_PPC64_DTPREL64:
14582 case R_PPC64_TPREL64:
14583 case R_PPC64_TPREL16_LO_DS:
14584 case R_PPC64_TPREL16_DS:
14585 case R_PPC64_TPREL16:
14586 case R_PPC64_TPREL16_LO:
14587 case R_PPC64_TPREL16_HI:
14588 case R_PPC64_TPREL16_HIGH:
14589 case R_PPC64_TPREL16_HA:
14590 case R_PPC64_TPREL16_HIGHA:
14591 case R_PPC64_TPREL16_HIGHER:
14592 case R_PPC64_TPREL16_HIGHEST:
14593 case R_PPC64_TPREL16_HIGHERA:
14594 case R_PPC64_TPREL16_HIGHESTA:
14595 case R_PPC64_ADDR16_LO_DS:
14596 case R_PPC64_ADDR16_LO:
14597 case R_PPC64_ADDR16_HI:
14598 case R_PPC64_ADDR16_HIGH:
14599 case R_PPC64_ADDR16_HA:
14600 case R_PPC64_ADDR16_HIGHA:
14601 case R_PPC64_REL30:
14602 case R_PPC64_COPY:
14603 case R_PPC64_UADDR64:
14604 case R_PPC64_UADDR32:
14605 case R_PPC64_ADDR32:
14606 case R_PPC64_ADDR24:
14607 case R_PPC64_ADDR16:
14608 case R_PPC64_UADDR16:
14609 case R_PPC64_ADDR16_DS:
14610 case R_PPC64_ADDR16_HIGHER:
14611 case R_PPC64_ADDR16_HIGHEST:
14612 case R_PPC64_ADDR16_HIGHERA:
14613 case R_PPC64_ADDR16_HIGHESTA:
14614 case R_PPC64_ADDR14:
14615 case R_PPC64_ADDR14_BRTAKEN:
14616 case R_PPC64_ADDR14_BRNTAKEN:
14617 case R_PPC64_REL32:
14618 case R_PPC64_REL64:
14619 return TRUE;
14620
14621 default:
14622 return FALSE;
14623 }
14624}
14625
5bd4f169
AM
14626/* The RELOCATE_SECTION function is called by the ELF backend linker
14627 to handle the relocations for a section.
14628
14629 The relocs are always passed as Rela structures; if the section
14630 actually uses Rel structures, the r_addend field will always be
14631 zero.
14632
14633 This function is responsible for adjust the section contents as
14634 necessary, and (if using Rela relocs and generating a
1049f94e 14635 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
14636 necessary.
14637
14638 This function does not have to worry about setting the reloc
14639 address or the reloc symbol index.
14640
14641 LOCAL_SYMS is a pointer to the swapped in local symbols.
14642
14643 LOCAL_SECTIONS is an array giving the section in the input file
14644 corresponding to the st_shndx field of each local symbol.
14645
14646 The global hash table entry for the global symbols can be found
14647 via elf_sym_hashes (input_bfd).
14648
1049f94e 14649 When generating relocatable output, this function must handle
5bd4f169
AM
14650 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
14651 going to be the section symbol corresponding to the output
14652 section, which means that the addend must be adjusted
14653 accordingly. */
14654
b34976b6 14655static bfd_boolean
4ce794b7
AM
14656ppc64_elf_relocate_section (bfd *output_bfd,
14657 struct bfd_link_info *info,
14658 bfd *input_bfd,
14659 asection *input_section,
14660 bfd_byte *contents,
14661 Elf_Internal_Rela *relocs,
14662 Elf_Internal_Sym *local_syms,
14663 asection **local_sections)
5bd4f169 14664{
65f38f15 14665 struct ppc_link_hash_table *htab;
5bd4f169
AM
14666 Elf_Internal_Shdr *symtab_hdr;
14667 struct elf_link_hash_entry **sym_hashes;
5bd4f169 14668 Elf_Internal_Rela *rel;
c316a17c 14669 Elf_Internal_Rela *wrel;
5bd4f169 14670 Elf_Internal_Rela *relend;
411e1bfb
AM
14671 Elf_Internal_Rela outrel;
14672 bfd_byte *loc;
411e1bfb 14673 struct got_entry **local_got_ents;
5bd4f169 14674 bfd_vma TOCstart;
b34976b6
AM
14675 bfd_boolean ret = TRUE;
14676 bfd_boolean is_opd;
794e51c0
AM
14677 /* Assume 'at' branch hints. */
14678 bfd_boolean is_isa_v2 = TRUE;
e59a1001 14679 bfd_boolean warned_dynamic = FALSE;
95f0d0d2 14680 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
5bd4f169 14681
65f38f15 14682 /* Initialize howto table if needed. */
5bd4f169 14683 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
14684 ppc_howto_init ();
14685
65f38f15 14686 htab = ppc_hash_table (info);
4dfe6ac6
NC
14687 if (htab == NULL)
14688 return FALSE;
ee75fd95
AM
14689
14690 /* Don't relocate stub sections. */
e7d1c40c 14691 if (input_section->owner == htab->params->stub_bfd)
ee75fd95
AM
14692 return TRUE;
14693
7af5d5c4
AM
14694 if (!is_ppc64_elf (input_bfd))
14695 {
14696 bfd_set_error (bfd_error_wrong_format);
14697 return FALSE;
14698 }
0ffa91dd 14699
411e1bfb 14700 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 14701 TOCstart = elf_gp (output_bfd);
0ffa91dd 14702 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 14703 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 14704 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 14705
c316a17c 14706 rel = wrel = relocs;
5bd4f169 14707 relend = relocs + input_section->reloc_count;
c316a17c 14708 for (; rel < relend; wrel++, rel++)
5bd4f169 14709 {
04c9666a 14710 enum elf_ppc64_reloc_type r_type;
31c76678 14711 bfd_vma addend;
5bd4f169
AM
14712 bfd_reloc_status_type r;
14713 Elf_Internal_Sym *sym;
14714 asection *sec;
039b3fef
AM
14715 struct elf_link_hash_entry *h_elf;
14716 struct ppc_link_hash_entry *h;
14717 struct ppc_link_hash_entry *fdh;
5bd4f169 14718 const char *sym_name;
0d4792f7 14719 unsigned long r_symndx, toc_symndx;
3a71aa26 14720 bfd_vma toc_addend;
f961d9dd
AM
14721 unsigned char tls_mask, tls_gd, tls_type;
14722 unsigned char sym_type;
5bd4f169 14723 bfd_vma relocation;
23cedd1d 14724 bfd_boolean unresolved_reloc, save_unresolved_reloc;
b34976b6 14725 bfd_boolean warned;
bc30df16 14726 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 14727 unsigned int insn;
e11840f9 14728 unsigned int mask;
721956f4
AM
14729 struct ppc_stub_hash_entry *stub_entry;
14730 bfd_vma max_br_offset;
14731 bfd_vma from;
c316a17c 14732 Elf_Internal_Rela orig_rel;
b80eed39
AM
14733 reloc_howto_type *howto;
14734 struct reloc_howto_struct alt_howto;
4a421c53
AM
14735 uint64_t pinsn;
14736 bfd_vma offset;
5bd4f169 14737
c316a17c
AM
14738 again:
14739 orig_rel = *rel;
14740
4ce794b7 14741 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 14742 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
14743
14744 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
14745 symbol of the previous ADDR64 reloc. The symbol gives us the
14746 proper TOC base to use. */
14747 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
c316a17c
AM
14748 && wrel != relocs
14749 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
ee87f2da 14750 && is_opd)
c316a17c 14751 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
ee87f2da 14752
4ce794b7
AM
14753 sym = NULL;
14754 sec = NULL;
039b3fef 14755 h_elf = NULL;
4ce794b7 14756 sym_name = NULL;
b34976b6
AM
14757 unresolved_reloc = FALSE;
14758 warned = FALSE;
65f38f15 14759
0b13192e 14760 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
14761 {
14762 /* It's a local symbol. */
74f0fb50 14763 struct _opd_sec_data *opd;
4025353c 14764
5bd4f169
AM
14765 sym = local_syms + r_symndx;
14766 sec = local_sections[r_symndx];
26c61ae5 14767 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 14768 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 14769 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
14770 opd = get_opd_info (sec);
14771 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 14772 {
51aecdc5
AM
14773 long adjust = opd->adjust[OPD_NDX (sym->st_value
14774 + rel->r_addend)];
4025353c
AM
14775 if (adjust == -1)
14776 relocation = 0;
14777 else
4cc603a5
AM
14778 {
14779 /* If this is a relocation against the opd section sym
14780 and we have edited .opd, adjust the reloc addend so
14781 that ld -r and ld --emit-relocs output is correct.
14782 If it is a reloc against some other .opd symbol,
14783 then the symbol value will be adjusted later. */
14784 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
14785 rel->r_addend += adjust;
14786 else
14787 relocation += adjust;
14788 }
1e2f5b6e 14789 }
5bd4f169
AM
14790 }
14791 else
14792 {
62d887d4
L
14793 bfd_boolean ignored;
14794
b2a8e766
AM
14795 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
14796 r_symndx, symtab_hdr, sym_hashes,
039b3fef 14797 h_elf, sec, relocation,
62d887d4 14798 unresolved_reloc, warned, ignored);
039b3fef
AM
14799 sym_name = h_elf->root.root.string;
14800 sym_type = h_elf->type;
b69fdb4e
AM
14801 if (sec != NULL
14802 && sec->owner == output_bfd
14803 && strcmp (sec->name, ".opd") == 0)
14804 {
14805 /* This is a symbol defined in a linker script. All
14806 such are defined in output sections, even those
14807 defined by simple assignment from a symbol defined in
14808 an input section. Transfer the symbol to an
14809 appropriate input .opd section, so that a branch to
14810 this symbol will be mapped to the location specified
14811 by the opd entry. */
14812 struct bfd_link_order *lo;
14813 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
14814 if (lo->type == bfd_indirect_link_order)
14815 {
14816 asection *isec = lo->u.indirect.section;
14817 if (h_elf->root.u.def.value >= isec->output_offset
14818 && h_elf->root.u.def.value < (isec->output_offset
14819 + isec->size))
14820 {
14821 h_elf->root.u.def.value -= isec->output_offset;
14822 h_elf->root.u.def.section = isec;
14823 sec = isec;
14824 break;
14825 }
14826 }
14827 }
5bd4f169 14828 }
ed7007c1 14829 h = ppc_elf_hash_entry (h_elf);
5bd4f169 14830
dbaa2011 14831 if (sec != NULL && discarded_section (sec))
c316a17c
AM
14832 {
14833 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
14834 input_bfd, input_section,
0930cb30 14835 contents, rel->r_offset);
c316a17c
AM
14836 wrel->r_offset = rel->r_offset;
14837 wrel->r_info = 0;
14838 wrel->r_addend = 0;
14839
14840 /* For ld -r, remove relocations in debug sections against
dcd2b8a0 14841 symbols defined in discarded sections. Not done for
c316a17c
AM
14842 non-debug to preserve relocs in .eh_frame which the
14843 eh_frame editing code expects to be present. */
14844 if (bfd_link_relocatable (info)
14845 && (input_section->flags & SEC_DEBUGGING))
14846 wrel--;
14847
14848 continue;
14849 }
ab96bf03 14850
0e1862bb 14851 if (bfd_link_relocatable (info))
c316a17c 14852 goto copy_reloc;
ab96bf03 14853
f40da81b
AM
14854 if (h != NULL && &h->elf == htab->elf.hgot)
14855 {
6f20ed8a 14856 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
f40da81b
AM
14857 sec = bfd_abs_section_ptr;
14858 unresolved_reloc = FALSE;
14859 }
14860
951fd09b
AM
14861 /* TLS optimizations. Replace instruction sequences and relocs
14862 based on information we collected in tls_optimize. We edit
14863 RELOCS so that --emit-relocs will output something sensible
14864 for the final instruction stream. */
14865 tls_mask = 0;
14866 tls_gd = 0;
0d4792f7 14867 toc_symndx = 0;
727fc41e
AM
14868 if (h != NULL)
14869 tls_mask = h->tls_mask;
14870 else if (local_got_ents != NULL)
411e1bfb 14871 {
e054468f
AM
14872 struct plt_entry **local_plt = (struct plt_entry **)
14873 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 14874 unsigned char *lgot_masks = (unsigned char *)
e054468f 14875 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
14876 tls_mask = lgot_masks[r_symndx];
14877 }
37da22e5 14878 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
727fc41e
AM
14879 && (r_type == R_PPC64_TLS
14880 || r_type == R_PPC64_TLSGD
14881 || r_type == R_PPC64_TLSLD))
14882 {
14883 /* Check for toc tls entries. */
f961d9dd 14884 unsigned char *toc_tls;
0d4792f7 14885
727fc41e
AM
14886 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14887 &local_syms, rel, input_bfd))
14888 return FALSE;
0d4792f7 14889
727fc41e
AM
14890 if (toc_tls)
14891 tls_mask = *toc_tls;
0d4792f7
AM
14892 }
14893
14894 /* Check that tls relocs are used with tls syms, and non-tls
14895 relocs are used with non-tls syms. */
cf35638d 14896 if (r_symndx != STN_UNDEF
0d4792f7
AM
14897 && r_type != R_PPC64_NONE
14898 && (h == NULL
039b3fef
AM
14899 || h->elf.root.type == bfd_link_hash_defined
14900 || h->elf.root.type == bfd_link_hash_defweak)
71c4e95a 14901 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
0d4792f7 14902 {
37da22e5 14903 if ((tls_mask & TLS_TLS) != 0
727fc41e
AM
14904 && (r_type == R_PPC64_TLS
14905 || r_type == R_PPC64_TLSGD
14906 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
14907 /* R_PPC64_TLS is OK against a symbol in the TOC. */
14908 ;
14909 else
25f53a85 14910 info->callbacks->einfo
1d483afe 14911 (!IS_PPC64_TLS_RELOC (r_type)
695344c0 14912 /* xgettext:c-format */
c1c8c1ef 14913 ? _("%H: %s used with TLS symbol `%pT'\n")
695344c0 14914 /* xgettext:c-format */
c1c8c1ef 14915 : _("%H: %s used with non-TLS symbol `%pT'\n"),
25f53a85 14916 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
14917 ppc64_elf_howto_table[r_type]->name,
14918 sym_name);
411e1bfb
AM
14919 }
14920
14921 /* Ensure reloc mapping code below stays sane. */
14922 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
14923 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
14924 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
14925 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
14926 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
14927 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
14928 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
14929 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
14930 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
14931 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
14932 abort ();
0d4792f7 14933
411e1bfb
AM
14934 switch (r_type)
14935 {
14936 default:
411e1bfb
AM
14937 break;
14938
ba761f19 14939 case R_PPC64_LO_DS_OPT:
95f0d0d2 14940 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
2365f8d7 14941 if ((insn & (0x3fu << 26)) != 58u << 26)
ba761f19
AM
14942 abort ();
14943 insn += (14u << 26) - (58u << 26);
95f0d0d2 14944 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
ba761f19
AM
14945 r_type = R_PPC64_TOC16_LO;
14946 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14947 break;
14948
411e1bfb
AM
14949 case R_PPC64_TOC16:
14950 case R_PPC64_TOC16_LO:
14951 case R_PPC64_TOC16_DS:
14952 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
14953 {
14954 /* Check for toc tls entries. */
f961d9dd 14955 unsigned char *toc_tls;
951fd09b 14956 int retval;
411e1bfb 14957
3a71aa26
AM
14958 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14959 &local_syms, rel, input_bfd);
951fd09b 14960 if (retval == 0)
411e1bfb
AM
14961 return FALSE;
14962
14963 if (toc_tls)
14964 {
951fd09b 14965 tls_mask = *toc_tls;
411e1bfb
AM
14966 if (r_type == R_PPC64_TOC16_DS
14967 || r_type == R_PPC64_TOC16_LO_DS)
81407a69 14968 {
37da22e5 14969 if ((tls_mask & TLS_TLS) != 0
81407a69
AM
14970 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
14971 goto toctprel;
14972 }
411e1bfb 14973 else
951fd09b
AM
14974 {
14975 /* If we found a GD reloc pair, then we might be
14976 doing a GD->IE transition. */
14977 if (retval == 2)
14978 {
b00a0a86 14979 tls_gd = TLS_GDIE;
37da22e5
AM
14980 if ((tls_mask & TLS_TLS) != 0
14981 && (tls_mask & TLS_GD) == 0)
102890f0 14982 goto tls_ldgd_opt;
951fd09b
AM
14983 }
14984 else if (retval == 3)
14985 {
37da22e5
AM
14986 if ((tls_mask & TLS_TLS) != 0
14987 && (tls_mask & TLS_LD) == 0)
102890f0 14988 goto tls_ldgd_opt;
951fd09b
AM
14989 }
14990 }
411e1bfb
AM
14991 }
14992 }
14993 break;
14994
9d6ded02
AM
14995 case R_PPC64_GOT_TPREL16_HI:
14996 case R_PPC64_GOT_TPREL16_HA:
37da22e5 14997 if ((tls_mask & TLS_TLS) != 0
9d6ded02
AM
14998 && (tls_mask & TLS_TPREL) == 0)
14999 {
15000 rel->r_offset -= d_offset;
95f0d0d2 15001 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
9d6ded02
AM
15002 r_type = R_PPC64_NONE;
15003 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15004 }
15005 break;
15006
411e1bfb
AM
15007 case R_PPC64_GOT_TPREL16_DS:
15008 case R_PPC64_GOT_TPREL16_LO_DS:
37da22e5 15009 if ((tls_mask & TLS_TLS) != 0
951fd09b 15010 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 15011 {
81407a69 15012 toctprel:
95f0d0d2 15013 insn = bfd_get_32 (input_bfd,
c316a17c 15014 contents + rel->r_offset - d_offset);
411e1bfb
AM
15015 insn &= 31 << 21;
15016 insn |= 0x3c0d0000; /* addis 0,13,0 */
95f0d0d2 15017 bfd_put_32 (input_bfd, insn,
c316a17c 15018 contents + rel->r_offset - d_offset);
411e1bfb 15019 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
15020 if (toc_symndx != 0)
15021 {
15022 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 15023 rel->r_addend = toc_addend;
0d4792f7
AM
15024 /* We changed the symbol. Start over in order to
15025 get h, sym, sec etc. right. */
c316a17c 15026 goto again;
0d4792f7
AM
15027 }
15028 else
15029 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
15030 }
15031 break;
15032
87c69f97 15033 case R_PPC64_GOT_TPREL_PCREL34:
c213164a
AM
15034 if ((tls_mask & TLS_TLS) != 0
15035 && (tls_mask & TLS_TPREL) == 0)
15036 {
15037 /* pld ra,sym@got@tprel@pcrel -> paddi ra,r13,sym@tprel */
15038 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15039 pinsn <<= 32;
15040 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15041 pinsn += ((2ULL << 56) + (-1ULL << 52)
15042 + (14ULL << 26) - (57ULL << 26) + (13ULL << 16));
15043 bfd_put_32 (input_bfd, pinsn >> 32,
15044 contents + rel->r_offset);
15045 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
15046 contents + rel->r_offset + 4);
15047 r_type = R_PPC64_TPREL34;
15048 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15049 }
15050 break;
15051
411e1bfb 15052 case R_PPC64_TLS:
37da22e5 15053 if ((tls_mask & TLS_TLS) != 0
951fd09b 15054 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 15055 {
c213164a 15056 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2d0f3896
AM
15057 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
15058 if (insn == 0)
c213164a
AM
15059 break;
15060 if ((rel->r_offset & 3) == 0)
0d4792f7 15061 {
c213164a
AM
15062 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
15063 /* Was PPC64_TLS which sits on insn boundary, now
15064 PPC64_TPREL16_LO which is at low-order half-word. */
15065 rel->r_offset += d_offset;
15066 r_type = R_PPC64_TPREL16_LO;
15067 if (toc_symndx != 0)
15068 {
15069 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
15070 rel->r_addend = toc_addend;
15071 /* We changed the symbol. Start over in order to
15072 get h, sym, sec etc. right. */
15073 goto again;
15074 }
15075 else
15076 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15077 }
15078 else if ((rel->r_offset & 3) == 1)
15079 {
15080 /* For pcrel IE to LE we already have the full
15081 offset and thus don't need an addi here. A nop
15082 or mr will do. */
2365f8d7 15083 if ((insn & (0x3fu << 26)) == 14 << 26)
c213164a
AM
15084 {
15085 /* Extract regs from addi rt,ra,si. */
15086 unsigned int rt = (insn >> 21) & 0x1f;
15087 unsigned int ra = (insn >> 16) & 0x1f;
15088 if (rt == ra)
15089 insn = NOP;
15090 else
15091 {
15092 /* Build or ra,rs,rb with rb==rs, ie. mr ra,rs. */
15093 insn = (rt << 16) | (ra << 21) | (ra << 11);
15094 insn |= (31u << 26) | (444u << 1);
15095 }
15096 }
15097 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - 1);
0d4792f7 15098 }
411e1bfb
AM
15099 }
15100 break;
15101
411e1bfb
AM
15102 case R_PPC64_GOT_TLSGD16_HI:
15103 case R_PPC64_GOT_TLSGD16_HA:
b00a0a86 15104 tls_gd = TLS_GDIE;
37da22e5 15105 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
951fd09b
AM
15106 goto tls_gdld_hi;
15107 break;
15108
411e1bfb
AM
15109 case R_PPC64_GOT_TLSLD16_HI:
15110 case R_PPC64_GOT_TLSLD16_HA:
37da22e5 15111 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 15112 {
951fd09b
AM
15113 tls_gdld_hi:
15114 if ((tls_mask & tls_gd) != 0)
15115 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
15116 + R_PPC64_GOT_TPREL16_DS);
15117 else
411e1bfb 15118 {
4fe5ca5b 15119 rel->r_offset -= d_offset;
95f0d0d2 15120 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
951fd09b 15121 r_type = R_PPC64_NONE;
411e1bfb 15122 }
951fd09b 15123 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
15124 }
15125 break;
15126
951fd09b
AM
15127 case R_PPC64_GOT_TLSGD16:
15128 case R_PPC64_GOT_TLSGD16_LO:
b00a0a86 15129 tls_gd = TLS_GDIE;
37da22e5 15130 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
102890f0 15131 goto tls_ldgd_opt;
951fd09b 15132 break;
411e1bfb 15133
951fd09b
AM
15134 case R_PPC64_GOT_TLSLD16:
15135 case R_PPC64_GOT_TLSLD16_LO:
37da22e5 15136 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
951fd09b 15137 {
b9f04fe0 15138 unsigned int insn1, insn2;
102890f0
AM
15139
15140 tls_ldgd_opt:
727fc41e
AM
15141 offset = (bfd_vma) -1;
15142 /* If not using the newer R_PPC64_TLSGD/LD to mark
15143 __tls_get_addr calls, we must trust that the call
15144 stays with its arg setup insns, ie. that the next
15145 reloc is the __tls_get_addr call associated with
15146 the current reloc. Edit both insns. */
9737e8af 15147 if (input_section->nomark_tls_get_addr
727fc41e
AM
15148 && rel + 1 < relend
15149 && branch_reloc_hash_match (input_bfd, rel + 1,
9e7028aa
AM
15150 htab->tls_get_addr_fd,
15151 htab->tga_desc_fd,
727fc41e 15152 htab->tls_get_addr,
9e7028aa 15153 htab->tga_desc))
727fc41e 15154 offset = rel[1].r_offset;
b86ac8e3
AM
15155 /* We read the low GOT_TLS (or TOC16) insn because we
15156 need to keep the destination reg. It may be
15157 something other than the usual r3, and moved to r3
15158 before the call by intervening code. */
95f0d0d2 15159 insn1 = bfd_get_32 (input_bfd,
b86ac8e3 15160 contents + rel->r_offset - d_offset);
102890f0 15161 if ((tls_mask & tls_gd) != 0)
411e1bfb 15162 {
102890f0 15163 /* IE */
b86ac8e3 15164 insn1 &= (0x1f << 21) | (0x1f << 16);
2365f8d7 15165 insn1 |= 58u << 26; /* ld */
102890f0 15166 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 15167 if (offset != (bfd_vma) -1)
f58d5a2d 15168 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
46e9995a
AM
15169 if (r_type == R_PPC64_TOC16
15170 || r_type == R_PPC64_TOC16_LO)
102890f0 15171 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
46e9995a
AM
15172 else
15173 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 1)) & 1)
15174 + R_PPC64_GOT_TPREL16_DS);
102890f0
AM
15175 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15176 }
15177 else
15178 {
15179 /* LE */
b86ac8e3
AM
15180 insn1 &= 0x1f << 21;
15181 insn1 |= 0x3c0d0000; /* addis r,13,0 */
102890f0
AM
15182 insn2 = 0x38630000; /* addi 3,3,0 */
15183 if (tls_gd == 0)
951fd09b 15184 {
102890f0 15185 /* Was an LD reloc. */
71c4e95a 15186 r_symndx = STN_UNDEF;
102890f0 15187 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
951fd09b 15188 }
102890f0 15189 else if (toc_symndx != 0)
3a71aa26
AM
15190 {
15191 r_symndx = toc_symndx;
15192 rel->r_addend = toc_addend;
15193 }
102890f0
AM
15194 r_type = R_PPC64_TPREL16_HA;
15195 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
15196 if (offset != (bfd_vma) -1)
15197 {
15198 rel[1].r_info = ELF64_R_INFO (r_symndx,
15199 R_PPC64_TPREL16_LO);
15200 rel[1].r_offset = offset + d_offset;
15201 rel[1].r_addend = rel->r_addend;
15202 }
102890f0 15203 }
95f0d0d2 15204 bfd_put_32 (input_bfd, insn1,
3a71aa26 15205 contents + rel->r_offset - d_offset);
727fc41e 15206 if (offset != (bfd_vma) -1)
c96e0573
AM
15207 {
15208 bfd_put_32 (input_bfd, insn2, contents + offset);
15209 if (offset + 8 <= input_section->size)
15210 {
15211 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
15212 if (insn2 == LD_R2_0R1 + STK_TOC (htab))
15213 bfd_put_32 (input_bfd, NOP, contents + offset + 4);
15214 }
15215 }
727fc41e
AM
15216 if ((tls_mask & tls_gd) == 0
15217 && (tls_gd == 0 || toc_symndx != 0))
15218 {
15219 /* We changed the symbol. Start over in order
15220 to get h, sym, sec etc. right. */
c316a17c 15221 goto again;
727fc41e
AM
15222 }
15223 }
15224 break;
15225
87c69f97 15226 case R_PPC64_GOT_TLSGD_PCREL34:
c213164a
AM
15227 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
15228 {
15229 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15230 pinsn <<= 32;
15231 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15232 if ((tls_mask & TLS_GDIE) != 0)
15233 {
15234 /* IE, pla -> pld */
15235 pinsn += (-2ULL << 56) + (57ULL << 26) - (14ULL << 26);
87c69f97 15236 r_type = R_PPC64_GOT_TPREL_PCREL34;
c213164a
AM
15237 }
15238 else
15239 {
15240 /* LE, pla pcrel -> paddi r13 */
15241 pinsn += (-1ULL << 52) + (13ULL << 16);
15242 r_type = R_PPC64_TPREL34;
15243 }
15244 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15245 bfd_put_32 (input_bfd, pinsn >> 32,
15246 contents + rel->r_offset);
15247 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
15248 contents + rel->r_offset + 4);
15249 }
15250 break;
15251
87c69f97 15252 case R_PPC64_GOT_TLSLD_PCREL34:
c213164a
AM
15253 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
15254 {
15255 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15256 pinsn <<= 32;
15257 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15258 pinsn += (-1ULL << 52) + (13ULL << 16);
15259 bfd_put_32 (input_bfd, pinsn >> 32,
15260 contents + rel->r_offset);
15261 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
15262 contents + rel->r_offset + 4);
15263 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
15264 r_symndx = STN_UNDEF;
15265 r_type = R_PPC64_TPREL34;
15266 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15267 goto again;
15268 }
15269 break;
15270
727fc41e 15271 case R_PPC64_TLSGD:
37da22e5 15272 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
675e2809 15273 && rel + 1 < relend)
727fc41e 15274 {
b9f04fe0 15275 unsigned int insn2;
5663e321 15276 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 15277
4a421c53 15278 offset = rel->r_offset;
5663e321 15279 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
15280 {
15281 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
15282 if (r_type1 == R_PPC64_PLT_PCREL34
15283 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
15284 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
15285 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
15286 break;
15287 }
15288
15289 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
15290 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
15291
b00a0a86 15292 if ((tls_mask & TLS_GDIE) != 0)
727fc41e
AM
15293 {
15294 /* IE */
15295 r_type = R_PPC64_NONE;
15296 insn2 = 0x7c636a14; /* add 3,3,13 */
15297 }
15298 else
15299 {
15300 /* LE */
15301 if (toc_symndx != 0)
15302 {
15303 r_symndx = toc_symndx;
15304 rel->r_addend = toc_addend;
15305 }
c213164a
AM
15306 if (r_type1 == R_PPC64_REL24_NOTOC
15307 || r_type1 == R_PPC64_PLTCALL_NOTOC)
15308 {
15309 r_type = R_PPC64_NONE;
15310 insn2 = NOP;
15311 }
15312 else
15313 {
15314 rel->r_offset = offset + d_offset;
15315 r_type = R_PPC64_TPREL16_LO;
15316 insn2 = 0x38630000; /* addi 3,3,0 */
15317 }
727fc41e
AM
15318 }
15319 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15320 /* Zap the reloc on the _tls_get_addr call too. */
15321 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 15322 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 15323 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
15324 if ((tls_mask & TLS_GDIE) == 0
15325 && toc_symndx != 0
15326 && r_type != R_PPC64_NONE)
c316a17c 15327 goto again;
411e1bfb 15328 }
411e1bfb
AM
15329 break;
15330
727fc41e 15331 case R_PPC64_TLSLD:
37da22e5 15332 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
675e2809 15333 && rel + 1 < relend)
727fc41e 15334 {
b9f04fe0 15335 unsigned int insn2;
5663e321 15336 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 15337
4a421c53 15338 offset = rel->r_offset;
5663e321 15339 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
15340 {
15341 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
15342 if (r_type1 == R_PPC64_PLT_PCREL34
15343 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
15344 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
15345 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
15346 break;
15347 }
15348
15349 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
15350 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
15351
c213164a
AM
15352 if (r_type1 == R_PPC64_REL24_NOTOC
15353 || r_type1 == R_PPC64_PLTCALL_NOTOC)
15354 {
15355 r_type = R_PPC64_NONE;
15356 insn2 = NOP;
15357 }
15358 else
15359 {
15360 rel->r_offset = offset + d_offset;
15361 r_symndx = STN_UNDEF;
15362 r_type = R_PPC64_TPREL16_LO;
15363 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
15364 insn2 = 0x38630000; /* addi 3,3,0 */
15365 }
727fc41e 15366 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
15367 /* Zap the reloc on the _tls_get_addr call too. */
15368 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 15369 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 15370 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
15371 if (r_type != R_PPC64_NONE)
15372 goto again;
727fc41e
AM
15373 }
15374 break;
15375
411e1bfb 15376 case R_PPC64_DTPMOD64:
951fd09b
AM
15377 if (rel + 1 < relend
15378 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
15379 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 15380 {
951fd09b
AM
15381 if ((tls_mask & TLS_GD) == 0)
15382 {
15383 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
b00a0a86 15384 if ((tls_mask & TLS_GDIE) != 0)
951fd09b
AM
15385 r_type = R_PPC64_TPREL64;
15386 else
15387 {
4ce794b7 15388 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
15389 r_type = R_PPC64_NONE;
15390 }
15391 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15392 }
15393 }
15394 else
15395 {
15396 if ((tls_mask & TLS_LD) == 0)
411e1bfb 15397 {
4ce794b7 15398 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 15399 r_type = R_PPC64_NONE;
951fd09b 15400 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 15401 }
411e1bfb
AM
15402 }
15403 break;
15404
15405 case R_PPC64_TPREL64:
951fd09b 15406 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
15407 {
15408 r_type = R_PPC64_NONE;
15409 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15410 }
15411 break;
52a82034 15412
006589cf
AM
15413 case R_PPC64_ENTRY:
15414 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
15415 if (!bfd_link_pic (info)
15416 && !info->traditional_format
15417 && relocation + 0x80008000 <= 0xffffffff)
15418 {
15419 unsigned int insn1, insn2;
15420
15421 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15422 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15423 if ((insn1 & ~0xfffc) == LD_R2_0R12
15424 && insn2 == ADD_R2_R2_R12)
15425 {
95f0d0d2 15426 bfd_put_32 (input_bfd,
006589cf
AM
15427 LIS_R2 + PPC_HA (relocation),
15428 contents + rel->r_offset);
95f0d0d2 15429 bfd_put_32 (input_bfd,
006589cf
AM
15430 ADDI_R2_R2 + PPC_LO (relocation),
15431 contents + rel->r_offset + 4);
15432 }
15433 }
15434 else
15435 {
15436 relocation -= (rel->r_offset
15437 + input_section->output_offset
15438 + input_section->output_section->vma);
15439 if (relocation + 0x80008000 <= 0xffffffff)
15440 {
15441 unsigned int insn1, insn2;
15442
15443 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15444 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15445 if ((insn1 & ~0xfffc) == LD_R2_0R12
15446 && insn2 == ADD_R2_R2_R12)
15447 {
95f0d0d2 15448 bfd_put_32 (input_bfd,
006589cf
AM
15449 ADDIS_R2_R12 + PPC_HA (relocation),
15450 contents + rel->r_offset);
95f0d0d2 15451 bfd_put_32 (input_bfd,
006589cf
AM
15452 ADDI_R2_R2 + PPC_LO (relocation),
15453 contents + rel->r_offset + 4);
15454 }
15455 }
15456 }
15457 break;
15458
52a82034
AM
15459 case R_PPC64_REL16_HA:
15460 /* If we are generating a non-PIC executable, edit
15461 . 0: addis 2,12,.TOC.-0b@ha
15462 . addi 2,2,.TOC.-0b@l
15463 used by ELFv2 global entry points to set up r2, to
15464 . lis 2,.TOC.@ha
15465 . addi 2,2,.TOC.@l
15466 if .TOC. is in range. */
0e1862bb 15467 if (!bfd_link_pic (info)
810d4e75 15468 && !info->traditional_format
006589cf 15469 && !htab->opd_abi
4f038ee5 15470 && rel->r_addend == d_offset
52a82034
AM
15471 && h != NULL && &h->elf == htab->elf.hgot
15472 && rel + 1 < relend
15473 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
15474 && rel[1].r_offset == rel->r_offset + 4
15475 && rel[1].r_addend == rel->r_addend + 4
15476 && relocation + 0x80008000 <= 0xffffffff)
15477 {
15478 unsigned int insn1, insn2;
4a421c53 15479 offset = rel->r_offset - d_offset;
95f0d0d2
AM
15480 insn1 = bfd_get_32 (input_bfd, contents + offset);
15481 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
006589cf
AM
15482 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
15483 && (insn2 & 0xffff0000) == ADDI_R2_R2)
52a82034
AM
15484 {
15485 r_type = R_PPC64_ADDR16_HA;
15486 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15487 rel->r_addend -= d_offset;
15488 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
15489 rel[1].r_addend -= d_offset + 4;
95f0d0d2 15490 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
52a82034
AM
15491 }
15492 }
15493 break;
411e1bfb
AM
15494 }
15495
15496 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 15497 insn = 0;
b25116a9
AM
15498 max_br_offset = 1 << 25;
15499 addend = rel->r_addend;
bc30df16 15500 reloc_dest = DEST_NORMAL;
65f38f15 15501 switch (r_type)
5bd4f169
AM
15502 {
15503 default:
65f38f15 15504 break;
5bd4f169 15505
3b421ab3
AM
15506 case R_PPC64_TOCSAVE:
15507 if (relocation + addend == (rel->r_offset
15508 + input_section->output_offset
15509 + input_section->output_section->vma)
15510 && tocsave_find (htab, NO_INSERT,
15511 &local_syms, rel, input_bfd))
15512 {
15513 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15514 if (insn == NOP
15515 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
15516 bfd_put_32 (input_bfd,
15517 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
15518 contents + rel->r_offset);
15519 }
15520 break;
15521
65f38f15
AM
15522 /* Branch taken prediction relocations. */
15523 case R_PPC64_ADDR14_BRTAKEN:
15524 case R_PPC64_REL14_BRTAKEN:
cedb70c5 15525 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
1a0670f3 15526 /* Fall through. */
65f38f15 15527
86c76c7b 15528 /* Branch not taken prediction relocations. */
65f38f15
AM
15529 case R_PPC64_ADDR14_BRNTAKEN:
15530 case R_PPC64_REL14_BRNTAKEN:
95f0d0d2 15531 insn |= bfd_get_32 (input_bfd,
411e1bfb 15532 contents + rel->r_offset) & ~(0x01 << 21);
1a0670f3 15533 /* Fall through. */
86c76c7b 15534
b25116a9
AM
15535 case R_PPC64_REL14:
15536 max_br_offset = 1 << 15;
1a0670f3 15537 /* Fall through. */
5bd4f169 15538
65f38f15 15539 case R_PPC64_REL24:
05d0e962 15540 case R_PPC64_REL24_NOTOC:
23cedd1d 15541 case R_PPC64_PLTCALL:
5663e321 15542 case R_PPC64_PLTCALL_NOTOC:
ad8e1ba5
AM
15543 /* Calls to functions with a different TOC, such as calls to
15544 shared objects, need to alter the TOC pointer. This is
15545 done using a linkage stub. A REL24 branching to these
15546 linkage stubs needs to be followed by a nop, as the nop
15547 will be replaced with an instruction to restore the TOC
15548 base pointer. */
8387904d 15549 fdh = h;
b31867b6
AM
15550 if (h != NULL
15551 && h->oh != NULL
15552 && h->oh->is_func_descriptor)
15553 fdh = ppc_follow_link (h->oh);
31c76678
DK
15554 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
15555 htab);
5663e321
AM
15556 if ((r_type == R_PPC64_PLTCALL
15557 || r_type == R_PPC64_PLTCALL_NOTOC)
23cedd1d 15558 && stub_entry != NULL
05d0e962
AM
15559 && stub_entry->stub_type >= ppc_stub_plt_call
15560 && stub_entry->stub_type <= ppc_stub_plt_call_both)
23cedd1d
AM
15561 stub_entry = NULL;
15562
6abec6bc 15563 if (stub_entry != NULL
d0abeec8
AM
15564 && ((stub_entry->stub_type >= ppc_stub_plt_call
15565 && stub_entry->stub_type <= ppc_stub_plt_call_both)
ad8e1ba5 15566 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
05d0e962
AM
15567 || stub_entry->stub_type == ppc_stub_plt_branch_both
15568 || stub_entry->stub_type == ppc_stub_long_branch_r2off
15569 || stub_entry->stub_type == ppc_stub_long_branch_both))
41bd81ab 15570 {
b25116a9 15571 bfd_boolean can_plt_call = FALSE;
721956f4 15572
6e1816be
AM
15573 if (stub_entry->stub_type == ppc_stub_plt_call
15574 && !htab->opd_abi
15575 && htab->params->plt_localentry0 != 0
15576 && is_elfv2_localentry0 (&h->elf))
15577 {
15578 /* The function doesn't use or change r2. */
15579 can_plt_call = TRUE;
15580 }
05d0e962
AM
15581 else if (r_type == R_PPC64_REL24_NOTOC)
15582 {
15583 /* NOTOC calls don't need to restore r2. */
15584 can_plt_call = TRUE;
15585 }
6e1816be 15586
f378ab09 15587 /* All of these stubs may modify r2, so there must be a
ba8ca3e7
AM
15588 branch and link followed by a nop. The nop is
15589 replaced by an insn to restore r2. */
6e1816be 15590 else if (rel->r_offset + 8 <= input_section->size)
41bd81ab 15591 {
ba8ca3e7
AM
15592 unsigned long br;
15593
15594 br = bfd_get_32 (input_bfd,
15595 contents + rel->r_offset);
15596 if ((br & 1) != 0)
41bd81ab 15597 {
ba8ca3e7
AM
15598 unsigned long nop;
15599
15600 nop = bfd_get_32 (input_bfd,
15601 contents + rel->r_offset + 4);
23cedd1d
AM
15602 if (nop == LD_R2_0R1 + STK_TOC (htab))
15603 can_plt_call = TRUE;
15604 else if (nop == NOP
15605 || nop == CROR_151515
15606 || nop == CROR_313131)
a7f2871e 15607 {
ba8ca3e7 15608 if (h != NULL
ed7007c1 15609 && is_tls_get_addr (&h->elf, htab)
7c9cf415 15610 && htab->params->tls_get_addr_opt)
ba8ca3e7
AM
15611 {
15612 /* Special stub used, leave nop alone. */
15613 }
15614 else
a078d95a
AM
15615 bfd_put_32 (input_bfd,
15616 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7
AM
15617 contents + rel->r_offset + 4);
15618 can_plt_call = TRUE;
a7f2871e 15619 }
41bd81ab 15620 }
5bd4f169 15621 }
721956f4 15622
ba8ca3e7 15623 if (!can_plt_call && h != NULL)
721956f4 15624 {
ba8ca3e7
AM
15625 const char *name = h->elf.root.root.string;
15626
15627 if (*name == '.')
15628 ++name;
15629
15630 if (strncmp (name, "__libc_start_main", 17) == 0
15631 && (name[17] == 0 || name[17] == '@'))
6ab189d5 15632 {
ba8ca3e7
AM
15633 /* Allow crt1 branch to go via a toc adjusting
15634 stub. Other calls that never return could do
15635 the same, if we could detect such. */
b25116a9 15636 can_plt_call = TRUE;
6ab189d5 15637 }
ba8ca3e7
AM
15638 }
15639
15640 if (!can_plt_call)
15641 {
15642 /* g++ as of 20130507 emits self-calls without a
15643 following nop. This is arguably wrong since we
15644 have conflicting information. On the one hand a
15645 global symbol and on the other a local call
15646 sequence, but don't error for this special case.
15647 It isn't possible to cheaply verify we have
15648 exactly such a call. Allow all calls to the same
15649 section. */
15650 asection *code_sec = sec;
15651
15652 if (get_opd_info (sec) != NULL)
ad8e1ba5 15653 {
ba8ca3e7
AM
15654 bfd_vma off = (relocation + addend
15655 - sec->output_section->vma
15656 - sec->output_offset);
bc30df16 15657
ba8ca3e7 15658 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 15659 }
ba8ca3e7
AM
15660 if (code_sec == input_section)
15661 can_plt_call = TRUE;
15662 }
15663
15664 if (!can_plt_call)
15665 {
05d0e962
AM
15666 if (stub_entry->stub_type >= ppc_stub_plt_call
15667 && stub_entry->stub_type <= ppc_stub_plt_call_both)
4805fc55 15668 info->callbacks->einfo
695344c0 15669 /* xgettext:c-format */
c1c8c1ef 15670 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15671 "(plt call stub)\n"),
4805fc55
AM
15672 input_bfd, input_section, rel->r_offset, sym_name);
15673 else
15674 info->callbacks->einfo
695344c0 15675 /* xgettext:c-format */
c1c8c1ef 15676 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15677 "(toc save/adjust stub)\n"),
4805fc55 15678 input_bfd, input_section, rel->r_offset, sym_name);
ba8ca3e7
AM
15679
15680 bfd_set_error (bfd_error_bad_value);
15681 ret = FALSE;
721956f4
AM
15682 }
15683
b25116a9 15684 if (can_plt_call
05d0e962
AM
15685 && stub_entry->stub_type >= ppc_stub_plt_call
15686 && stub_entry->stub_type <= ppc_stub_plt_call_both)
b25116a9
AM
15687 unresolved_reloc = FALSE;
15688 }
15689
6abec6bc
AM
15690 if ((stub_entry == NULL
15691 || stub_entry->stub_type == ppc_stub_long_branch
15692 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
15693 && get_opd_info (sec) != NULL)
15694 {
15695 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
15696 bfd_vma off = (relocation + addend
15697 - sec->output_section->vma
15698 - sec->output_offset);
aef36ac1 15699 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
15700 if (dest != (bfd_vma) -1)
15701 {
15702 relocation = dest;
15703 addend = 0;
bc30df16 15704 reloc_dest = DEST_OPD;
8387904d
AM
15705 }
15706 }
15707
b25116a9
AM
15708 /* If the branch is out of reach we ought to have a long
15709 branch stub. */
15710 from = (rel->r_offset
15711 + input_section->output_offset
15712 + input_section->output_section->vma);
15713
6911b7dc
AM
15714 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
15715 ? fdh->elf.other
15716 : sym->st_other);
15717
6abec6bc
AM
15718 if (stub_entry != NULL
15719 && (stub_entry->stub_type == ppc_stub_long_branch
15720 || stub_entry->stub_type == ppc_stub_plt_branch)
15721 && (r_type == R_PPC64_ADDR14_BRTAKEN
15722 || r_type == R_PPC64_ADDR14_BRNTAKEN
15723 || (relocation + addend - from + max_br_offset
15724 < 2 * max_br_offset)))
15725 /* Don't use the stub if this branch is in range. */
15726 stub_entry = NULL;
b25116a9 15727
05d0e962
AM
15728 if (stub_entry != NULL
15729 && (stub_entry->stub_type == ppc_stub_long_branch_notoc
15730 || stub_entry->stub_type == ppc_stub_long_branch_both
15731 || stub_entry->stub_type == ppc_stub_plt_branch_notoc
15732 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15733 && (r_type != R_PPC64_REL24_NOTOC
15734 || ((fdh ? fdh->elf.other : sym->st_other)
4a4e7361 15735 & STO_PPC64_LOCAL_MASK) <= 1 << STO_PPC64_LOCAL_BIT)
05d0e962
AM
15736 && (relocation + addend - from + max_br_offset
15737 < 2 * max_br_offset))
15738 stub_entry = NULL;
15739
15740 if (stub_entry != NULL
15741 && (stub_entry->stub_type == ppc_stub_long_branch_r2off
15742 || stub_entry->stub_type == ppc_stub_long_branch_both
15743 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
15744 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15745 && r_type == R_PPC64_REL24_NOTOC
15746 && (relocation + addend - from + max_br_offset
15747 < 2 * max_br_offset))
15748 stub_entry = NULL;
15749
b25116a9
AM
15750 if (stub_entry != NULL)
15751 {
15752 /* Munge up the value and addend so that we call the stub
15753 rather than the procedure directly. */
a4b6fadd
AM
15754 asection *stub_sec = stub_entry->group->stub_sec;
15755
15756 if (stub_entry->stub_type == ppc_stub_save_res)
15757 relocation += (stub_sec->output_offset
15758 + stub_sec->output_section->vma
15759 + stub_sec->size - htab->sfpr->size
15760 - htab->sfpr->output_offset
15761 - htab->sfpr->output_section->vma);
15762 else
15763 relocation = (stub_entry->stub_offset
15764 + stub_sec->output_offset
15765 + stub_sec->output_section->vma);
b25116a9 15766 addend = 0;
bc30df16 15767 reloc_dest = DEST_STUB;
3b421ab3 15768
05d0e962
AM
15769 if (((stub_entry->stub_type == ppc_stub_plt_call
15770 && ALWAYS_EMIT_R2SAVE)
15771 || stub_entry->stub_type == ppc_stub_plt_call_r2save
15772 || stub_entry->stub_type == ppc_stub_plt_call_both)
e81b4c93 15773 && !(h != NULL
ed7007c1 15774 && is_tls_get_addr (&h->elf, htab)
e81b4c93 15775 && htab->params->tls_get_addr_opt)
3b421ab3
AM
15776 && rel + 1 < relend
15777 && rel[1].r_offset == rel->r_offset + 4
15778 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
15779 relocation += 4;
05d0e962
AM
15780 else if ((stub_entry->stub_type == ppc_stub_long_branch_both
15781 || stub_entry->stub_type == ppc_stub_plt_branch_both
15782 || stub_entry->stub_type == ppc_stub_plt_call_both)
15783 && r_type == R_PPC64_REL24_NOTOC)
15784 relocation += 4;
5663e321
AM
15785
15786 if (r_type == R_PPC64_REL24_NOTOC
15787 && (stub_entry->stub_type == ppc_stub_plt_call_notoc
15788 || stub_entry->stub_type == ppc_stub_plt_call_both))
15789 htab->notoc_plt = 1;
b25116a9
AM
15790 }
15791
15792 if (insn != 0)
15793 {
794e51c0 15794 if (is_isa_v2)
721956f4 15795 {
b25116a9
AM
15796 /* Set 'a' bit. This is 0b00010 in BO field for branch
15797 on CR(BI) insns (BO == 001at or 011at), and 0b01000
15798 for branch on CTR insns (BO == 1a00t or 1a01t). */
15799 if ((insn & (0x14 << 21)) == (0x04 << 21))
15800 insn |= 0x02 << 21;
15801 else if ((insn & (0x14 << 21)) == (0x10 << 21))
15802 insn |= 0x08 << 21;
15803 else
15804 break;
15805 }
15806 else
15807 {
15808 /* Invert 'y' bit if not the default. */
4cc603a5 15809 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 15810 insn ^= 0x01 << 21;
721956f4 15811 }
b25116a9 15812
95f0d0d2 15813 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
5bd4f169 15814 }
e86ce104 15815
06da1e8e
AM
15816 /* NOP out calls to undefined weak functions.
15817 We can thus call a weak function without first
15818 checking whether the function is defined. */
b25116a9 15819 else if (h != NULL
039b3fef 15820 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 15821 && h->elf.dynindx == -1
05d0e962
AM
15822 && (r_type == R_PPC64_REL24
15823 || r_type == R_PPC64_REL24_NOTOC)
b25116a9 15824 && relocation == 0
4cc603a5 15825 && addend == 0)
e86ce104 15826 {
95f0d0d2 15827 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
c316a17c 15828 goto copy_reloc;
e86ce104 15829 }
65f38f15 15830 break;
066f4018
AM
15831
15832 case R_PPC64_GOT16_DS:
06507dab
AM
15833 if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
15834 break;
066f4018
AM
15835 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15836 if (relocation + addend - from + 0x8000 < 0x10000
15837 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15838 {
15839 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15840 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15841 {
15842 insn += (14u << 26) - (58u << 26);
15843 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15844 r_type = R_PPC64_TOC16;
15845 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15846 }
15847 }
15848 break;
15849
15850 case R_PPC64_GOT16_LO_DS:
15851 case R_PPC64_GOT16_HA:
06507dab
AM
15852 if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
15853 break;
066f4018
AM
15854 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15855 if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
15856 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15857 {
15858 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15859 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15860 {
15861 insn += (14u << 26) - (58u << 26);
15862 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15863 r_type = R_PPC64_TOC16_LO;
15864 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15865 }
2365f8d7 15866 else if ((insn & (0x3fu << 26)) == 15u << 26 /* addis */)
066f4018
AM
15867 {
15868 r_type = R_PPC64_TOC16_HA;
15869 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15870 }
15871 }
15872 break;
4a421c53
AM
15873
15874 case R_PPC64_GOT_PCREL34:
06507dab
AM
15875 if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
15876 break;
4a421c53
AM
15877 from = (rel->r_offset
15878 + input_section->output_section->vma
15879 + input_section->output_offset);
15880 if (relocation - from + (1ULL << 33) < 1ULL << 34
15881 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15882 {
15883 offset = rel->r_offset;
15884 pinsn = bfd_get_32 (input_bfd, contents + offset);
15885 pinsn <<= 32;
15886 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15887 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15888 == ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
15889 {
15890 /* Replace with paddi. */
15891 pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
15892 r_type = R_PPC64_PCREL34;
15893 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15894 bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
15895 bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
15896 goto pcrelopt;
15897 }
15898 }
15899 break;
15900
15901 case R_PPC64_PCREL34:
15902 if (SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15903 {
15904 offset = rel->r_offset;
15905 pinsn = bfd_get_32 (input_bfd, contents + offset);
15906 pinsn <<= 32;
15907 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15908 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15909 == ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
15910 | (14ULL << 26) /* paddi */))
15911 {
15912 pcrelopt:
15913 if (rel + 1 < relend
15914 && rel[1].r_offset == offset
15915 && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT))
15916 {
15917 bfd_vma off2 = rel[1].r_addend;
15918 if (off2 == 0)
15919 /* zero means next insn. */
15920 off2 = 8;
15921 off2 += offset;
15922 if (off2 + 4 <= input_section->size)
15923 {
15924 uint64_t pinsn2;
dd9b12c2 15925 bfd_signed_vma addend_off;
4a421c53
AM
15926 pinsn2 = bfd_get_32 (input_bfd, contents + off2);
15927 pinsn2 <<= 32;
15928 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
77486630
AM
15929 {
15930 if (off2 + 8 > input_section->size)
15931 break;
15932 pinsn2 |= bfd_get_32 (input_bfd,
15933 contents + off2 + 4);
15934 }
dd9b12c2 15935 if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
4a421c53 15936 {
dd9b12c2
AM
15937 addend += addend_off;
15938 rel->r_addend = addend;
4a421c53
AM
15939 bfd_put_32 (input_bfd, pinsn >> 32,
15940 contents + offset);
15941 bfd_put_32 (input_bfd, pinsn,
15942 contents + offset + 4);
15943 bfd_put_32 (input_bfd, pinsn2 >> 32,
15944 contents + off2);
77486630
AM
15945 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
15946 bfd_put_32 (input_bfd, pinsn2,
15947 contents + off2 + 4);
4a421c53
AM
15948 }
15949 }
15950 }
15951 }
15952 }
15953 break;
65f38f15 15954 }
5bd4f169 15955
411e1bfb 15956 tls_type = 0;
23cedd1d 15957 save_unresolved_reloc = unresolved_reloc;
65f38f15
AM
15958 switch (r_type)
15959 {
15960 default:
cf97bcb0
AM
15961 /* xgettext:c-format */
15962 _bfd_error_handler (_("%pB: %s unsupported"),
15963 input_bfd, ppc64_elf_howto_table[r_type]->name);
5bd4f169 15964
65f38f15 15965 bfd_set_error (bfd_error_bad_value);
b34976b6 15966 ret = FALSE;
c316a17c 15967 goto copy_reloc;
5bd4f169 15968
65f38f15 15969 case R_PPC64_NONE:
411e1bfb 15970 case R_PPC64_TLS:
727fc41e
AM
15971 case R_PPC64_TLSGD:
15972 case R_PPC64_TLSLD:
3b421ab3 15973 case R_PPC64_TOCSAVE:
04c9666a
AM
15974 case R_PPC64_GNU_VTINHERIT:
15975 case R_PPC64_GNU_VTENTRY:
006589cf 15976 case R_PPC64_ENTRY:
4a421c53 15977 case R_PPC64_PCREL_OPT:
c316a17c 15978 goto copy_reloc;
5bd4f169
AM
15979
15980 /* GOT16 relocations. Like an ADDR16 using the symbol's
15981 address in the GOT as relocation value instead of the
411e1bfb 15982 symbol's value itself. Also, create a GOT entry for the
5bd4f169 15983 symbol and put the symbol value there. */
411e1bfb
AM
15984 case R_PPC64_GOT_TLSGD16:
15985 case R_PPC64_GOT_TLSGD16_LO:
15986 case R_PPC64_GOT_TLSGD16_HI:
15987 case R_PPC64_GOT_TLSGD16_HA:
87c69f97 15988 case R_PPC64_GOT_TLSGD_PCREL34:
951fd09b 15989 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
15990 goto dogot;
15991
15992 case R_PPC64_GOT_TLSLD16:
15993 case R_PPC64_GOT_TLSLD16_LO:
15994 case R_PPC64_GOT_TLSLD16_HI:
15995 case R_PPC64_GOT_TLSLD16_HA:
87c69f97 15996 case R_PPC64_GOT_TLSLD_PCREL34:
951fd09b 15997 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
15998 goto dogot;
15999
16000 case R_PPC64_GOT_TPREL16_DS:
16001 case R_PPC64_GOT_TPREL16_LO_DS:
16002 case R_PPC64_GOT_TPREL16_HI:
16003 case R_PPC64_GOT_TPREL16_HA:
87c69f97 16004 case R_PPC64_GOT_TPREL_PCREL34:
411e1bfb
AM
16005 tls_type = TLS_TLS | TLS_TPREL;
16006 goto dogot;
16007
16008 case R_PPC64_GOT_DTPREL16_DS:
16009 case R_PPC64_GOT_DTPREL16_LO_DS:
16010 case R_PPC64_GOT_DTPREL16_HI:
16011 case R_PPC64_GOT_DTPREL16_HA:
87c69f97 16012 case R_PPC64_GOT_DTPREL_PCREL34:
411e1bfb
AM
16013 tls_type = TLS_TLS | TLS_DTPREL;
16014 goto dogot;
16015
65f38f15
AM
16016 case R_PPC64_GOT16:
16017 case R_PPC64_GOT16_LO:
16018 case R_PPC64_GOT16_HI:
16019 case R_PPC64_GOT16_HA:
16020 case R_PPC64_GOT16_DS:
16021 case R_PPC64_GOT16_LO_DS:
5663e321 16022 case R_PPC64_GOT_PCREL34:
411e1bfb 16023 dogot:
5bd4f169
AM
16024 {
16025 /* Relocation is to the entry for this symbol in the global
16026 offset table. */
e717da7e 16027 asection *got;
d881513a 16028 bfd_vma *offp;
5bd4f169 16029 bfd_vma off;
d881513a 16030 unsigned long indx = 0;
927be08e 16031 struct got_entry *ent;
65f38f15 16032
d881513a 16033 if (tls_type == (TLS_TLS | TLS_LD)
f749f26e 16034 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
927be08e 16035 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 16036 else
5bd4f169 16037 {
d881513a
AM
16038 if (h != NULL)
16039 {
f0158f44
AM
16040 if (!htab->elf.dynamic_sections_created
16041 || h->elf.dynindx == -1
16042 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
21d68fcd 16043 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
d881513a
AM
16044 /* This is actually a static link, or it is a
16045 -Bsymbolic link and the symbol is defined
16046 locally, or the symbol was forced to be local
16047 because of a version file. */
16048 ;
16049 else
16050 {
039b3fef 16051 indx = h->elf.dynindx;
d881513a
AM
16052 unresolved_reloc = FALSE;
16053 }
039b3fef 16054 ent = h->elf.got.glist;
d881513a 16055 }
411e1bfb 16056 else
5bd4f169 16057 {
d881513a
AM
16058 if (local_got_ents == NULL)
16059 abort ();
16060 ent = local_got_ents[r_symndx];
5bd4f169 16061 }
d881513a
AM
16062
16063 for (; ent != NULL; ent = ent->next)
133a1f60 16064 if (ent->addend == orig_rel.r_addend
e717da7e 16065 && ent->owner == input_bfd
d881513a
AM
16066 && ent->tls_type == tls_type)
16067 break;
5bd4f169 16068 }
411e1bfb 16069
927be08e
AM
16070 if (ent == NULL)
16071 abort ();
16072 if (ent->is_indirect)
16073 ent = ent->got.ent;
16074 offp = &ent->got.offset;
16075 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
16076 if (got == NULL)
16077 abort ();
16078
411e1bfb
AM
16079 /* The offset must always be a multiple of 8. We use the
16080 least significant bit to record whether we have already
16081 processed this entry. */
d881513a 16082 off = *offp;
411e1bfb
AM
16083 if ((off & 1) != 0)
16084 off &= ~1;
5bd4f169
AM
16085 else
16086 {
411e1bfb
AM
16087 /* Generate relocs for the dynamic linker, except in
16088 the case of TLSLD where we'll use one entry per
16089 module. */
25f23106
AM
16090 asection *relgot;
16091 bfd_boolean ifunc;
e717da7e 16092
d881513a 16093 *offp = off | 1;
25f23106
AM
16094 relgot = NULL;
16095 ifunc = (h != NULL
16096 ? h->elf.type == STT_GNU_IFUNC
16097 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 16098 if (ifunc)
82e66161
AM
16099 {
16100 relgot = htab->elf.irelplt;
efb2a7b4 16101 if (indx == 0 || is_static_defined (&h->elf))
cebd6b8a 16102 htab->elf.ifunc_resolvers = TRUE;
82e66161 16103 }
f0158f44
AM
16104 else if (indx != 0
16105 || (bfd_link_pic (info)
16106 && (h == NULL
f749f26e
AM
16107 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
16108 && !(tls_type != 0
f15d0b54
AM
16109 && bfd_link_executable (info)
16110 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
19e08130 16111 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 16112 if (relgot != NULL)
5bd4f169 16113 {
e717da7e
AM
16114 outrel.r_offset = (got->output_section->vma
16115 + got->output_offset
411e1bfb 16116 + off);
133a1f60 16117 outrel.r_addend = orig_rel.r_addend;
d881513a 16118 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 16119 {
411e1bfb 16120 outrel.r_addend = 0;
e515b051 16121 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
16122 if (tls_type == (TLS_TLS | TLS_GD))
16123 {
e717da7e
AM
16124 loc = relgot->contents;
16125 loc += (relgot->reloc_count++
d881513a
AM
16126 * sizeof (Elf64_External_Rela));
16127 bfd_elf64_swap_reloca_out (output_bfd,
16128 &outrel, loc);
e515b051 16129 outrel.r_offset += 8;
133a1f60 16130 outrel.r_addend = orig_rel.r_addend;
d881513a
AM
16131 outrel.r_info
16132 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 16133 }
411e1bfb 16134 }
951fd09b 16135 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 16136 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 16137 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 16138 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
16139 else if (indx != 0)
16140 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
16141 else
81407a69 16142 {
25f23106
AM
16143 if (ifunc)
16144 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
16145 else
16146 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
16147
16148 /* Write the .got section contents for the sake
16149 of prelink. */
e717da7e 16150 loc = got->contents + off;
23fbd6fa
JJ
16151 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
16152 loc);
81407a69 16153 }
81407a69
AM
16154
16155 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
16156 {
16157 outrel.r_addend += relocation;
16158 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
989f9879
AM
16159 {
16160 if (htab->elf.tls_sec == NULL)
16161 outrel.r_addend = 0;
16162 else
16163 outrel.r_addend -= htab->elf.tls_sec->vma;
16164 }
e515b051 16165 }
e717da7e
AM
16166 loc = relgot->contents;
16167 loc += (relgot->reloc_count++
411e1bfb
AM
16168 * sizeof (Elf64_External_Rela));
16169 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
16170 }
16171
ad8e1ba5 16172 /* Init the .got section contents here if we're not
81407a69 16173 emitting a reloc. */
d881513a 16174 else
411e1bfb 16175 {
133a1f60 16176 relocation += orig_rel.r_addend;
f0158f44 16177 if (tls_type != 0)
411e1bfb 16178 {
989f9879
AM
16179 if (htab->elf.tls_sec == NULL)
16180 relocation = 0;
16181 else
16182 {
f0158f44
AM
16183 if (tls_type & TLS_LD)
16184 relocation = 0;
16185 else
16186 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
676ee2b5 16187 if (tls_type & TLS_TPREL)
989f9879
AM
16188 relocation += DTP_OFFSET - TP_OFFSET;
16189 }
5bd4f169 16190
f0158f44 16191 if (tls_type & (TLS_GD | TLS_LD))
7b609f53
AM
16192 {
16193 bfd_put_64 (output_bfd, relocation,
e717da7e 16194 got->contents + off + 8);
676ee2b5 16195 relocation = 1;
7b609f53 16196 }
411e1bfb
AM
16197 }
16198 bfd_put_64 (output_bfd, relocation,
e717da7e 16199 got->contents + off);
5bd4f169
AM
16200 }
16201 }
16202
65f38f15
AM
16203 if (off >= (bfd_vma) -2)
16204 abort ();
16205
bf102f86 16206 relocation = got->output_section->vma + got->output_offset + off;
133a1f60 16207 addend = 0;
c213164a 16208 if (!(r_type == R_PPC64_GOT_PCREL34
87c69f97
AM
16209 || r_type == R_PPC64_GOT_TLSGD_PCREL34
16210 || r_type == R_PPC64_GOT_TLSLD_PCREL34
16211 || r_type == R_PPC64_GOT_TPREL_PCREL34
16212 || r_type == R_PPC64_GOT_DTPREL_PCREL34))
5663e321 16213 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
5bd4f169 16214 }
65f38f15
AM
16215 break;
16216
16217 case R_PPC64_PLT16_HA:
16218 case R_PPC64_PLT16_HI:
16219 case R_PPC64_PLT16_LO:
08be3224 16220 case R_PPC64_PLT16_LO_DS:
5663e321
AM
16221 case R_PPC64_PLT_PCREL34:
16222 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
16223 case R_PPC64_PLT32:
16224 case R_PPC64_PLT64:
23cedd1d 16225 case R_PPC64_PLTSEQ:
5663e321 16226 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d 16227 case R_PPC64_PLTCALL:
5663e321 16228 case R_PPC64_PLTCALL_NOTOC:
65f38f15
AM
16229 /* Relocation is to the entry for this symbol in the
16230 procedure linkage table. */
23cedd1d 16231 unresolved_reloc = TRUE;
cbf95972
AM
16232 {
16233 struct plt_entry **plt_list = NULL;
16234 if (h != NULL)
16235 plt_list = &h->elf.plt.plist;
16236 else if (local_got_ents != NULL)
16237 {
16238 struct plt_entry **local_plt = (struct plt_entry **)
16239 (local_got_ents + symtab_hdr->sh_info);
2d7ad24e 16240 plt_list = local_plt + r_symndx;
cbf95972
AM
16241 }
16242 if (plt_list)
16243 {
16244 struct plt_entry *ent;
65f38f15 16245
cbf95972
AM
16246 for (ent = *plt_list; ent != NULL; ent = ent->next)
16247 if (ent->plt.offset != (bfd_vma) -1
133a1f60 16248 && ent->addend == orig_rel.r_addend)
cbf95972
AM
16249 {
16250 asection *plt;
08be3224 16251 bfd_vma got;
cbf95972
AM
16252
16253 plt = htab->elf.splt;
16254 if (!htab->elf.dynamic_sections_created
16255 || h == NULL
16256 || h->elf.dynindx == -1)
2d7ad24e
AM
16257 {
16258 if (h != NULL
16259 ? h->elf.type == STT_GNU_IFUNC
16260 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
16261 plt = htab->elf.iplt;
16262 else
16263 plt = htab->pltlocal;
16264 }
16265 relocation = (plt->output_section->vma
16266 + plt->output_offset
16267 + ent->plt.offset);
08be3224 16268 if (r_type == R_PPC64_PLT16_HA
2cdcc330
AM
16269 || r_type == R_PPC64_PLT16_HI
16270 || r_type == R_PPC64_PLT16_LO
16271 || r_type == R_PPC64_PLT16_LO_DS)
08be3224
AM
16272 {
16273 got = (elf_gp (output_bfd)
16274 + htab->sec_info[input_section->id].toc_off);
16275 relocation -= got;
16276 }
133a1f60 16277 addend = 0;
cbf95972
AM
16278 unresolved_reloc = FALSE;
16279 break;
16280 }
16281 }
16282 }
65f38f15 16283 break;
5bd4f169 16284
0b13192e
AM
16285 case R_PPC64_TOC:
16286 /* Relocation value is TOC base. */
16287 relocation = TOCstart;
cf35638d 16288 if (r_symndx == STN_UNDEF)
6f20ed8a 16289 relocation += htab->sec_info[input_section->id].toc_off;
8517fae7
AM
16290 else if (unresolved_reloc)
16291 ;
6f20ed8a
AM
16292 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
16293 relocation += htab->sec_info[sec->id].toc_off;
0b13192e
AM
16294 else
16295 unresolved_reloc = TRUE;
ab96bf03 16296 goto dodyn;
0b13192e 16297
5bd4f169
AM
16298 /* TOC16 relocs. We want the offset relative to the TOC base,
16299 which is the address of the start of the TOC plus 0x8000.
16300 The TOC consists of sections .got, .toc, .tocbss, and .plt,
16301 in this order. */
65f38f15
AM
16302 case R_PPC64_TOC16:
16303 case R_PPC64_TOC16_LO:
16304 case R_PPC64_TOC16_HI:
16305 case R_PPC64_TOC16_DS:
16306 case R_PPC64_TOC16_LO_DS:
16307 case R_PPC64_TOC16_HA:
6f20ed8a 16308 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
1bdd8fac
AM
16309 if (h != NULL)
16310 goto dodyn;
5bd4f169
AM
16311 break;
16312
16313 /* Relocate against the beginning of the section. */
65f38f15
AM
16314 case R_PPC64_SECTOFF:
16315 case R_PPC64_SECTOFF_LO:
16316 case R_PPC64_SECTOFF_HI:
16317 case R_PPC64_SECTOFF_DS:
16318 case R_PPC64_SECTOFF_LO_DS:
16319 case R_PPC64_SECTOFF_HA:
4ce794b7 16320 if (sec != NULL)
65f38f15 16321 addend -= sec->output_section->vma;
5bd4f169
AM
16322 break;
16323
25f23106
AM
16324 case R_PPC64_REL16:
16325 case R_PPC64_REL16_LO:
16326 case R_PPC64_REL16_HI:
16327 case R_PPC64_REL16_HA:
4a969973
AM
16328 case R_PPC64_REL16_HIGH:
16329 case R_PPC64_REL16_HIGHA:
16330 case R_PPC64_REL16_HIGHER:
16331 case R_PPC64_REL16_HIGHERA:
16332 case R_PPC64_REL16_HIGHEST:
16333 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
16334 case R_PPC64_REL16_HIGHER34:
16335 case R_PPC64_REL16_HIGHERA34:
16336 case R_PPC64_REL16_HIGHEST34:
16337 case R_PPC64_REL16_HIGHESTA34:
a680de9a 16338 case R_PPC64_REL16DX_HA:
721956f4
AM
16339 case R_PPC64_REL14:
16340 case R_PPC64_REL14_BRNTAKEN:
16341 case R_PPC64_REL14_BRTAKEN:
5d1634d7 16342 case R_PPC64_REL24:
05d0e962 16343 case R_PPC64_REL24_NOTOC:
5663e321
AM
16344 case R_PPC64_PCREL34:
16345 case R_PPC64_PCREL28:
5d1634d7
AM
16346 break;
16347
411e1bfb
AM
16348 case R_PPC64_TPREL16:
16349 case R_PPC64_TPREL16_LO:
16350 case R_PPC64_TPREL16_HI:
16351 case R_PPC64_TPREL16_HA:
16352 case R_PPC64_TPREL16_DS:
16353 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
16354 case R_PPC64_TPREL16_HIGH:
16355 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
16356 case R_PPC64_TPREL16_HIGHER:
16357 case R_PPC64_TPREL16_HIGHERA:
16358 case R_PPC64_TPREL16_HIGHEST:
16359 case R_PPC64_TPREL16_HIGHESTA:
c213164a 16360 case R_PPC64_TPREL34:
766bc656
AM
16361 if (h != NULL
16362 && h->elf.root.type == bfd_link_hash_undefweak
16363 && h->elf.dynindx == -1)
16364 {
16365 /* Make this relocation against an undefined weak symbol
16366 resolve to zero. This is really just a tweak, since
16367 code using weak externs ought to check that they are
16368 defined before using them. */
16369 bfd_byte *p = contents + rel->r_offset - d_offset;
16370
95f0d0d2 16371 insn = bfd_get_32 (input_bfd, p);
766bc656
AM
16372 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
16373 if (insn != 0)
95f0d0d2 16374 bfd_put_32 (input_bfd, insn, p);
766bc656
AM
16375 break;
16376 }
989f9879
AM
16377 if (htab->elf.tls_sec != NULL)
16378 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7c8bbca5
AM
16379 /* The TPREL16 relocs shouldn't really be used in shared
16380 libs or with non-local symbols as that will result in
16381 DT_TEXTREL being set, but support them anyway. */
16382 goto dodyn;
411e1bfb
AM
16383
16384 case R_PPC64_DTPREL16:
16385 case R_PPC64_DTPREL16_LO:
16386 case R_PPC64_DTPREL16_HI:
16387 case R_PPC64_DTPREL16_HA:
16388 case R_PPC64_DTPREL16_DS:
16389 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
16390 case R_PPC64_DTPREL16_HIGH:
16391 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
16392 case R_PPC64_DTPREL16_HIGHER:
16393 case R_PPC64_DTPREL16_HIGHERA:
16394 case R_PPC64_DTPREL16_HIGHEST:
16395 case R_PPC64_DTPREL16_HIGHESTA:
c213164a 16396 case R_PPC64_DTPREL34:
989f9879
AM
16397 if (htab->elf.tls_sec != NULL)
16398 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
16399 break;
16400
45965137
AM
16401 case R_PPC64_ADDR64_LOCAL:
16402 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
16403 ? h->elf.other
16404 : sym->st_other);
16405 break;
16406
e515b051
AM
16407 case R_PPC64_DTPMOD64:
16408 relocation = 1;
16409 addend = 0;
16410 goto dodyn;
16411
411e1bfb 16412 case R_PPC64_TPREL64:
989f9879
AM
16413 if (htab->elf.tls_sec != NULL)
16414 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
16415 goto dodyn;
16416
16417 case R_PPC64_DTPREL64:
989f9879
AM
16418 if (htab->elf.tls_sec != NULL)
16419 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
1a0670f3 16420 /* Fall through. */
411e1bfb 16421
65f38f15
AM
16422 /* Relocations that may need to be propagated if this is a
16423 dynamic object. */
04c9666a 16424 case R_PPC64_REL30:
65f38f15
AM
16425 case R_PPC64_REL32:
16426 case R_PPC64_REL64:
16427 case R_PPC64_ADDR14:
16428 case R_PPC64_ADDR14_BRNTAKEN:
16429 case R_PPC64_ADDR14_BRTAKEN:
16430 case R_PPC64_ADDR16:
16431 case R_PPC64_ADDR16_DS:
16432 case R_PPC64_ADDR16_HA:
16433 case R_PPC64_ADDR16_HI:
f9c6b907
AM
16434 case R_PPC64_ADDR16_HIGH:
16435 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16436 case R_PPC64_ADDR16_HIGHER:
16437 case R_PPC64_ADDR16_HIGHERA:
16438 case R_PPC64_ADDR16_HIGHEST:
16439 case R_PPC64_ADDR16_HIGHESTA:
16440 case R_PPC64_ADDR16_LO:
16441 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
16442 case R_PPC64_ADDR16_HIGHER34:
16443 case R_PPC64_ADDR16_HIGHERA34:
16444 case R_PPC64_ADDR16_HIGHEST34:
16445 case R_PPC64_ADDR16_HIGHESTA34:
65f38f15 16446 case R_PPC64_ADDR24:
65f38f15
AM
16447 case R_PPC64_ADDR32:
16448 case R_PPC64_ADDR64:
16449 case R_PPC64_UADDR16:
16450 case R_PPC64_UADDR32:
16451 case R_PPC64_UADDR64:
5663e321
AM
16452 case R_PPC64_D34:
16453 case R_PPC64_D34_LO:
16454 case R_PPC64_D34_HI30:
16455 case R_PPC64_D34_HA30:
16456 case R_PPC64_D28:
411e1bfb 16457 dodyn:
5d1634d7 16458 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
16459 break;
16460
41bd81ab
AM
16461 if (NO_OPD_RELOCS && is_opd)
16462 break;
16463
8a9e8e72 16464 if (bfd_link_pic (info)
b1b07054 16465 ? ((h == NULL
190eb1dd 16466 || h->elf.dyn_relocs != NULL)
b1b07054
AM
16467 && ((h != NULL && pc_dynrelocs (h))
16468 || must_be_dyn_reloc (info, r_type)))
8a9e8e72 16469 : (h != NULL
190eb1dd 16470 ? h->elf.dyn_relocs != NULL
d311bc8b 16471 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
65f38f15 16472 {
b34976b6 16473 bfd_boolean skip, relocate;
65f38f15 16474 asection *sreloc;
1cf1f670 16475 bfd_vma out_off;
82e66161 16476 long indx = 0;
65f38f15
AM
16477
16478 /* When generating a dynamic object, these relocations
16479 are copied into the output file to be resolved at run
16480 time. */
16481
b34976b6
AM
16482 skip = FALSE;
16483 relocate = FALSE;
65f38f15 16484
1cf1f670
AM
16485 out_off = _bfd_elf_section_offset (output_bfd, info,
16486 input_section, rel->r_offset);
16487 if (out_off == (bfd_vma) -1)
b34976b6 16488 skip = TRUE;
1cf1f670 16489 else if (out_off == (bfd_vma) -2)
b34976b6 16490 skip = TRUE, relocate = TRUE;
1cf1f670
AM
16491 out_off += (input_section->output_section->vma
16492 + input_section->output_offset);
16493 outrel.r_offset = out_off;
411e1bfb 16494 outrel.r_addend = rel->r_addend;
65f38f15 16495
1cf1f670
AM
16496 /* Optimize unaligned reloc use. */
16497 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
16498 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
16499 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
16500 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
16501 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
16502 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
16503 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
16504 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
16505 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
16506
65f38f15 16507 if (skip)
0bb2d96a 16508 memset (&outrel, 0, sizeof outrel);
afe397ea 16509 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
16510 && !is_opd
16511 && r_type != R_PPC64_TOC)
14acf4dc 16512 {
82e66161
AM
16513 indx = h->elf.dynindx;
16514 BFD_ASSERT (indx != -1);
16515 outrel.r_info = ELF64_R_INFO (indx, r_type);
14acf4dc 16516 }
65f38f15
AM
16517 else
16518 {
41bd81ab
AM
16519 /* This symbol is local, or marked to become local,
16520 or this is an opd section reloc which must point
16521 at a local function. */
65f38f15 16522 outrel.r_addend += relocation;
e86ce104 16523 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 16524 {
3fad3c7c 16525 if (is_opd && h != NULL)
afbe61cf
AM
16526 {
16527 /* Lie about opd entries. This case occurs
16528 when building shared libraries and we
16529 reference a function in another shared
3fad3c7c
AM
16530 lib. The same thing happens for a weak
16531 definition in an application that's
16532 overridden by a strong definition in a
16533 shared lib. (I believe this is a generic
16534 bug in binutils handling of weak syms.)
16535 In these cases we won't use the opd
1e2f5b6e 16536 entry in this lib. */
b34976b6 16537 unresolved_reloc = FALSE;
afbe61cf 16538 }
25f23106
AM
16539 if (!is_opd
16540 && r_type == R_PPC64_ADDR64
16541 && (h != NULL
16542 ? h->elf.type == STT_GNU_IFUNC
16543 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
16544 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
16545 else
16546 {
16547 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 16548
25f23106
AM
16549 /* We need to relocate .opd contents for ld.so.
16550 Prelink also wants simple and consistent rules
16551 for relocs. This make all RELATIVE relocs have
16552 *r_offset equal to r_addend. */
16553 relocate = TRUE;
16554 }
65f38f15
AM
16555 }
16556 else
16557 {
25f23106
AM
16558 if (h != NULL
16559 ? h->elf.type == STT_GNU_IFUNC
16560 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
16561 {
25f53a85 16562 info->callbacks->einfo
695344c0 16563 /* xgettext:c-format */
174d0a74 16564 (_("%H: %s for indirect "
c1c8c1ef 16565 "function `%pT' unsupported\n"),
25f53a85 16566 input_bfd, input_section, rel->r_offset,
25f23106
AM
16567 ppc64_elf_howto_table[r_type]->name,
16568 sym_name);
16569 ret = FALSE;
16570 }
cf35638d 16571 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
16572 ;
16573 else if (sec == NULL || sec->owner == NULL)
16574 {
16575 bfd_set_error (bfd_error_bad_value);
b34976b6 16576 return FALSE;
65f38f15
AM
16577 }
16578 else
16579 {
f26a3287 16580 asection *osec = sec->output_section;
65f38f15 16581
f26a3287
AM
16582 if ((osec->flags & SEC_THREAD_LOCAL) != 0)
16583 {
16584 /* TLS symbol values are relative to the
16585 TLS segment. Dynamic relocations for
16586 local TLS symbols therefore can't be
16587 reduced to a relocation against their
16588 section symbol because it holds the
16589 address of the section, not a value
16590 relative to the TLS segment. We could
16591 change the .tdata dynamic section symbol
16592 to be zero value but STN_UNDEF works
16593 and is used elsewhere, eg. for TPREL64
16594 GOT relocs against local TLS symbols. */
16595 osec = htab->elf.tls_sec;
16596 indx = 0;
16597 }
16598 else
74541ad4 16599 {
74541ad4 16600 indx = elf_section_data (osec)->dynindx;
f26a3287
AM
16601 if (indx == 0)
16602 {
16603 if ((osec->flags & SEC_READONLY) == 0
16604 && htab->elf.data_index_section != NULL)
16605 osec = htab->elf.data_index_section;
16606 else
16607 osec = htab->elf.text_index_section;
16608 indx = elf_section_data (osec)->dynindx;
16609 }
16610 BFD_ASSERT (indx != 0);
74541ad4 16611 }
74541ad4 16612
65f38f15
AM
16613 /* We are turning this relocation into one
16614 against a section symbol, so subtract out
16615 the output section's address but not the
16616 offset of the input section in the output
16617 section. */
16618 outrel.r_addend -= osec->vma;
16619 }
16620
16621 outrel.r_info = ELF64_R_INFO (indx, r_type);
16622 }
16623 }
16624
16625 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
16626 if (h != NULL
16627 ? h->elf.type == STT_GNU_IFUNC
16628 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
82e66161
AM
16629 {
16630 sreloc = htab->elf.irelplt;
efb2a7b4 16631 if (indx == 0 || is_static_defined (&h->elf))
cebd6b8a 16632 htab->elf.ifunc_resolvers = TRUE;
82e66161 16633 }
65f38f15
AM
16634 if (sreloc == NULL)
16635 abort ();
16636
dfbb6ac9
AM
16637 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
16638 >= sreloc->size)
16639 abort ();
947216bf
AM
16640 loc = sreloc->contents;
16641 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
16642 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
16643
e59a1001
AM
16644 if (!warned_dynamic
16645 && !ppc64_glibc_dynamic_reloc (ELF64_R_TYPE (outrel.r_info)))
16646 {
16647 info->callbacks->einfo
16648 /* xgettext:c-format */
16649 (_("%X%P: %pB: %s against %pT "
16650 "is not supported by glibc as a dynamic relocation\n"),
16651 input_bfd,
16652 ppc64_elf_howto_table[ELF64_R_TYPE (outrel.r_info)]->name,
16653 sym_name);
16654 warned_dynamic = TRUE;
16655 }
16656
65f38f15
AM
16657 /* If this reloc is against an external symbol, it will
16658 be computed at runtime, so there's no need to do
81407a69
AM
16659 anything now. However, for the sake of prelink ensure
16660 that the section contents are a known value. */
2cdcc330 16661 if (!relocate)
81407a69
AM
16662 {
16663 unresolved_reloc = FALSE;
16664 /* The value chosen here is quite arbitrary as ld.so
16665 ignores section contents except for the special
16666 case of .opd where the contents might be accessed
16667 before relocation. Choose zero, as that won't
16668 cause reloc overflow. */
16669 relocation = 0;
16670 addend = 0;
16671 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
16672 to improve backward compatibility with older
16673 versions of ld. */
16674 if (r_type == R_PPC64_ADDR64)
16675 addend = outrel.r_addend;
16676 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 16677 else if (ppc64_elf_howto_table[r_type]->pc_relative)
f0158f44 16678 addend = outrel.r_offset;
81407a69 16679 }
65f38f15 16680 }
5bd4f169
AM
16681 break;
16682
65f38f15
AM
16683 case R_PPC64_COPY:
16684 case R_PPC64_GLOB_DAT:
16685 case R_PPC64_JMP_SLOT:
25f23106 16686 case R_PPC64_JMP_IREL:
65f38f15
AM
16687 case R_PPC64_RELATIVE:
16688 /* We shouldn't ever see these dynamic relocs in relocatable
16689 files. */
ae9a127f 16690 /* Fall through. */
65f38f15
AM
16691
16692 case R_PPC64_PLTGOT16:
16693 case R_PPC64_PLTGOT16_DS:
16694 case R_PPC64_PLTGOT16_HA:
16695 case R_PPC64_PLTGOT16_HI:
16696 case R_PPC64_PLTGOT16_LO:
16697 case R_PPC64_PLTGOT16_LO_DS:
16698 case R_PPC64_PLTREL32:
16699 case R_PPC64_PLTREL64:
16700 /* These ones haven't been implemented yet. */
16701
25f53a85 16702 info->callbacks->einfo
695344c0 16703 /* xgettext:c-format */
c1c8c1ef 16704 (_("%P: %pB: %s is not supported for `%pT'\n"),
d003868e 16705 input_bfd,
4ce794b7 16706 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
16707
16708 bfd_set_error (bfd_error_invalid_operation);
b34976b6 16709 ret = FALSE;
c316a17c 16710 goto copy_reloc;
65f38f15 16711 }
5bd4f169 16712
67f0cbdb
AM
16713 /* Multi-instruction sequences that access the TOC can be
16714 optimized, eg. addis ra,r2,0; addi rb,ra,x;
07d6d2b8 16715 to nop; addi rb,r2,x; */
67f0cbdb
AM
16716 switch (r_type)
16717 {
16718 default:
16719 break;
16720
16721 case R_PPC64_GOT_TLSLD16_HI:
16722 case R_PPC64_GOT_TLSGD16_HI:
16723 case R_PPC64_GOT_TPREL16_HI:
16724 case R_PPC64_GOT_DTPREL16_HI:
16725 case R_PPC64_GOT16_HI:
16726 case R_PPC64_TOC16_HI:
16727 /* These relocs would only be useful if building up an
16728 offset to later add to r2, perhaps in an indexed
16729 addressing mode instruction. Don't try to optimize.
16730 Unfortunately, the possibility of someone building up an
16731 offset like this or even with the HA relocs, means that
16732 we need to check the high insn when optimizing the low
16733 insn. */
16734 break;
16735
5663e321
AM
16736 case R_PPC64_PLTCALL_NOTOC:
16737 if (!unresolved_reloc)
16738 htab->notoc_plt = 1;
16739 /* Fall through. */
23cedd1d
AM
16740 case R_PPC64_PLTCALL:
16741 if (unresolved_reloc)
16742 {
16743 /* No plt entry. Make this into a direct call. */
16744 bfd_byte *p = contents + rel->r_offset;
16745 insn = bfd_get_32 (input_bfd, p);
16746 insn &= 1;
16747 bfd_put_32 (input_bfd, B_DOT | insn, p);
5663e321
AM
16748 if (r_type == R_PPC64_PLTCALL)
16749 bfd_put_32 (input_bfd, NOP, p + 4);
23cedd1d
AM
16750 unresolved_reloc = save_unresolved_reloc;
16751 r_type = R_PPC64_REL24;
16752 }
16753 break;
16754
5663e321 16755 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d
AM
16756 case R_PPC64_PLTSEQ:
16757 if (unresolved_reloc)
16758 {
16759 unresolved_reloc = FALSE;
16760 goto nop_it;
16761 }
16762 break;
16763
5663e321
AM
16764 case R_PPC64_PLT_PCREL34_NOTOC:
16765 if (!unresolved_reloc)
16766 htab->notoc_plt = 1;
16767 /* Fall through. */
16768 case R_PPC64_PLT_PCREL34:
16769 if (unresolved_reloc)
16770 {
16771 bfd_byte *p = contents + rel->r_offset;
16772 bfd_put_32 (input_bfd, PNOP >> 32, p);
16773 bfd_put_32 (input_bfd, PNOP, p + 4);
16774 unresolved_reloc = FALSE;
16775 goto copy_reloc;
16776 }
16777 break;
16778
23cedd1d
AM
16779 case R_PPC64_PLT16_HA:
16780 if (unresolved_reloc)
16781 {
16782 unresolved_reloc = FALSE;
16783 goto nop_it;
16784 }
16785 /* Fall through. */
67f0cbdb
AM
16786 case R_PPC64_GOT_TLSLD16_HA:
16787 case R_PPC64_GOT_TLSGD16_HA:
16788 case R_PPC64_GOT_TPREL16_HA:
16789 case R_PPC64_GOT_DTPREL16_HA:
16790 case R_PPC64_GOT16_HA:
16791 case R_PPC64_TOC16_HA:
98528052 16792 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16793 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052 16794 {
23cedd1d
AM
16795 bfd_byte *p;
16796 nop_it:
16797 p = contents + (rel->r_offset & ~3);
98528052 16798 bfd_put_32 (input_bfd, NOP, p);
d830549d 16799 goto copy_reloc;
98528052 16800 }
67f0cbdb
AM
16801 break;
16802
23cedd1d
AM
16803 case R_PPC64_PLT16_LO:
16804 case R_PPC64_PLT16_LO_DS:
16805 if (unresolved_reloc)
16806 {
16807 unresolved_reloc = FALSE;
16808 goto nop_it;
16809 }
16810 /* Fall through. */
67f0cbdb
AM
16811 case R_PPC64_GOT_TLSLD16_LO:
16812 case R_PPC64_GOT_TLSGD16_LO:
16813 case R_PPC64_GOT_TPREL16_LO_DS:
16814 case R_PPC64_GOT_DTPREL16_LO_DS:
16815 case R_PPC64_GOT16_LO:
16816 case R_PPC64_GOT16_LO_DS:
16817 case R_PPC64_TOC16_LO:
16818 case R_PPC64_TOC16_LO_DS:
98528052 16819 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16820 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
16821 {
16822 bfd_byte *p = contents + (rel->r_offset & ~3);
16823 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16824 if ((insn & (0x3fu << 26)) == 12u << 26 /* addic */)
560c8763
AM
16825 {
16826 /* Transform addic to addi when we change reg. */
2365f8d7 16827 insn &= ~((0x3fu << 26) | (0x1f << 16));
560c8763
AM
16828 insn |= (14u << 26) | (2 << 16);
16829 }
16830 else
67f0cbdb 16831 {
98528052
AM
16832 insn &= ~(0x1f << 16);
16833 insn |= 2 << 16;
67f0cbdb 16834 }
560c8763 16835 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
16836 }
16837 break;
9a23f96e
AM
16838
16839 case R_PPC64_TPREL16_HA:
16840 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16841 {
16842 bfd_byte *p = contents + (rel->r_offset & ~3);
16843 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16844 if ((insn & ((0x3fu << 26) | 0x1f << 16))
9a23f96e
AM
16845 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */)
16846 /* xgettext:c-format */
16847 info->callbacks->minfo
16848 (_("%H: warning: %s unexpected insn %#x.\n"),
d830549d
AM
16849 input_bfd, input_section, rel->r_offset,
16850 ppc64_elf_howto_table[r_type]->name, insn);
9a23f96e 16851 else
d830549d
AM
16852 {
16853 bfd_put_32 (input_bfd, NOP, p);
16854 goto copy_reloc;
16855 }
9a23f96e
AM
16856 }
16857 break;
16858
16859 case R_PPC64_TPREL16_LO:
16860 case R_PPC64_TPREL16_LO_DS:
16861 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16862 {
16863 bfd_byte *p = contents + (rel->r_offset & ~3);
16864 insn = bfd_get_32 (input_bfd, p);
16865 insn &= ~(0x1f << 16);
16866 insn |= 13 << 16;
16867 bfd_put_32 (input_bfd, insn, p);
16868 }
16869 break;
67f0cbdb
AM
16870 }
16871
65f38f15
AM
16872 /* Do any further special processing. */
16873 switch (r_type)
16874 {
16875 default:
16876 break;
16877
25f23106 16878 case R_PPC64_REL16_HA:
4a969973
AM
16879 case R_PPC64_REL16_HIGHA:
16880 case R_PPC64_REL16_HIGHERA:
16881 case R_PPC64_REL16_HIGHESTA:
a680de9a 16882 case R_PPC64_REL16DX_HA:
f9c6b907
AM
16883 case R_PPC64_ADDR16_HA:
16884 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16885 case R_PPC64_ADDR16_HIGHERA:
16886 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
16887 case R_PPC64_TOC16_HA:
16888 case R_PPC64_SECTOFF_HA:
411e1bfb 16889 case R_PPC64_TPREL16_HA:
f9c6b907 16890 case R_PPC64_TPREL16_HIGHA:
411e1bfb 16891 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 16892 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
16893 case R_PPC64_DTPREL16_HA:
16894 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 16895 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 16896 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
16897 /* It's just possible that this symbol is a weak symbol
16898 that's not actually defined anywhere. In that case,
16899 'sec' would be NULL, and we should leave the symbol
16900 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
16901 if (sec == NULL)
16902 break;
1a0670f3 16903 /* Fall through. */
5c5f6e17
AM
16904
16905 case R_PPC64_GOT16_HA:
16906 case R_PPC64_PLTGOT16_HA:
16907 case R_PPC64_PLT16_HA:
16908 case R_PPC64_GOT_TLSGD16_HA:
16909 case R_PPC64_GOT_TLSLD16_HA:
16910 case R_PPC64_GOT_TPREL16_HA:
16911 case R_PPC64_GOT_DTPREL16_HA:
16912 /* Add 0x10000 if sign bit in 0:15 is set.
16913 Bits 0:15 are not used. */
16914 addend += 0x8000;
65f38f15
AM
16915 break;
16916
5663e321
AM
16917 case R_PPC64_D34_HA30:
16918 case R_PPC64_ADDR16_HIGHERA34:
16919 case R_PPC64_ADDR16_HIGHESTA34:
16920 case R_PPC64_REL16_HIGHERA34:
16921 case R_PPC64_REL16_HIGHESTA34:
16922 if (sec != NULL)
16923 addend += 1ULL << 33;
16924 break;
16925
65f38f15
AM
16926 case R_PPC64_ADDR16_DS:
16927 case R_PPC64_ADDR16_LO_DS:
16928 case R_PPC64_GOT16_DS:
16929 case R_PPC64_GOT16_LO_DS:
16930 case R_PPC64_PLT16_LO_DS:
16931 case R_PPC64_SECTOFF_DS:
16932 case R_PPC64_SECTOFF_LO_DS:
16933 case R_PPC64_TOC16_DS:
16934 case R_PPC64_TOC16_LO_DS:
16935 case R_PPC64_PLTGOT16_DS:
16936 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
16937 case R_PPC64_GOT_TPREL16_DS:
16938 case R_PPC64_GOT_TPREL16_LO_DS:
16939 case R_PPC64_GOT_DTPREL16_DS:
16940 case R_PPC64_GOT_DTPREL16_LO_DS:
16941 case R_PPC64_TPREL16_DS:
16942 case R_PPC64_TPREL16_LO_DS:
16943 case R_PPC64_DTPREL16_DS:
16944 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
16945 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
16946 mask = 3;
a680de9a
PB
16947 /* If this reloc is against an lq, lxv, or stxv insn, then
16948 the value must be a multiple of 16. This is somewhat of
16949 a hack, but the "correct" way to do this by defining _DQ
16950 forms of all the _DS relocs bloats all reloc switches in
16951 this file. It doesn't make much sense to use these
16952 relocs in data, so testing the insn should be safe. */
2365f8d7
AM
16953 if ((insn & (0x3fu << 26)) == (56u << 26)
16954 || ((insn & (0x3fu << 26)) == (61u << 26) && (insn & 3) == 1))
adadcc0c 16955 mask = 15;
a680de9a
PB
16956 relocation += addend;
16957 addend = insn & (mask ^ 3);
16958 if ((relocation & mask) != 0)
65f38f15 16959 {
a680de9a 16960 relocation ^= relocation & mask;
25f53a85 16961 info->callbacks->einfo
695344c0 16962 /* xgettext:c-format */
174d0a74 16963 (_("%H: error: %s not a multiple of %u\n"),
25f53a85 16964 input_bfd, input_section, rel->r_offset,
d830549d 16965 ppc64_elf_howto_table[r_type]->name,
adadcc0c 16966 mask + 1);
65f38f15 16967 bfd_set_error (bfd_error_bad_value);
b34976b6 16968 ret = FALSE;
c316a17c 16969 goto copy_reloc;
65f38f15
AM
16970 }
16971 break;
5bd4f169
AM
16972 }
16973
239e1f3a
AM
16974 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
16975 because such sections are not SEC_ALLOC and thus ld.so will
16976 not process them. */
d830549d 16977 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15 16978 if (unresolved_reloc
239e1f3a 16979 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
16980 && h->elf.def_dynamic)
16981 && _bfd_elf_section_offset (output_bfd, info, input_section,
16982 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 16983 {
25f53a85 16984 info->callbacks->einfo
695344c0 16985 /* xgettext:c-format */
c1c8c1ef 16986 (_("%H: unresolvable %s against `%pT'\n"),
25f53a85 16987 input_bfd, input_section, rel->r_offset,
b80eed39 16988 howto->name,
039b3fef 16989 h->elf.root.root.string);
b34976b6 16990 ret = FALSE;
9c07fe7c 16991 }
5bd4f169 16992
b80eed39
AM
16993 /* 16-bit fields in insns mostly have signed values, but a
16994 few insns have 16-bit unsigned values. Really, we should
16995 have different reloc types. */
16996 if (howto->complain_on_overflow != complain_overflow_dont
16997 && howto->dst_mask == 0xffff
16998 && (input_section->flags & SEC_CODE) != 0)
16999 {
17000 enum complain_overflow complain = complain_overflow_signed;
17001
17002 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 17003 if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */)
a47622ac
AM
17004 complain = complain_overflow_bitfield;
17005 else if (howto->rightshift == 0
2365f8d7
AM
17006 ? ((insn & (0x3fu << 26)) == 28u << 26 /* andi */
17007 || (insn & (0x3fu << 26)) == 24u << 26 /* ori */
17008 || (insn & (0x3fu << 26)) == 26u << 26 /* xori */)
17009 : ((insn & (0x3fu << 26)) == 29u << 26 /* andis */
17010 || (insn & (0x3fu << 26)) == 25u << 26 /* oris */
17011 || (insn & (0x3fu << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
17012 complain = complain_overflow_unsigned;
17013 if (howto->complain_on_overflow != complain)
17014 {
17015 alt_howto = *howto;
17016 alt_howto.complain_on_overflow = complain;
17017 howto = &alt_howto;
17018 }
17019 }
17020
5663e321 17021 switch (r_type)
a680de9a 17022 {
5663e321
AM
17023 /* Split field relocs aren't handled by _bfd_final_link_relocate. */
17024 case R_PPC64_D34:
17025 case R_PPC64_D34_LO:
17026 case R_PPC64_D34_HI30:
17027 case R_PPC64_D34_HA30:
17028 case R_PPC64_PCREL34:
17029 case R_PPC64_GOT_PCREL34:
c213164a
AM
17030 case R_PPC64_TPREL34:
17031 case R_PPC64_DTPREL34:
87c69f97
AM
17032 case R_PPC64_GOT_TLSGD_PCREL34:
17033 case R_PPC64_GOT_TLSLD_PCREL34:
17034 case R_PPC64_GOT_TPREL_PCREL34:
17035 case R_PPC64_GOT_DTPREL_PCREL34:
5663e321
AM
17036 case R_PPC64_PLT_PCREL34:
17037 case R_PPC64_PLT_PCREL34_NOTOC:
17038 case R_PPC64_D28:
17039 case R_PPC64_PCREL28:
17040 if (rel->r_offset + 8 > input_section->size)
17041 r = bfd_reloc_outofrange;
17042 else
17043 {
5663e321
AM
17044 relocation += addend;
17045 if (howto->pc_relative)
17046 relocation -= (rel->r_offset
17047 + input_section->output_offset
17048 + input_section->output_section->vma);
17049 relocation >>= howto->rightshift;
17050
17051 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
17052 pinsn <<= 32;
17053 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
17054
17055 pinsn &= ~howto->dst_mask;
17056 pinsn |= (((relocation << 16) | (relocation & 0xffff))
17057 & howto->dst_mask);
17058 bfd_put_32 (input_bfd, pinsn >> 32, contents + rel->r_offset);
17059 bfd_put_32 (input_bfd, pinsn, contents + rel->r_offset + 4);
17060 r = bfd_reloc_ok;
17061 if (howto->complain_on_overflow == complain_overflow_signed
17062 && (relocation + (1ULL << (howto->bitsize - 1))
17063 >= 1ULL << howto->bitsize))
17064 r = bfd_reloc_overflow;
17065 }
17066 break;
17067
17068 case R_PPC64_REL16DX_HA:
a680de9a
PB
17069 if (rel->r_offset + 4 > input_section->size)
17070 r = bfd_reloc_outofrange;
17071 else
17072 {
17073 relocation += addend;
17074 relocation -= (rel->r_offset
17075 + input_section->output_offset
17076 + input_section->output_section->vma);
3de43e7b 17077 relocation = (bfd_signed_vma) relocation >> 16;
a680de9a
PB
17078 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
17079 insn &= ~0x1fffc1;
3de43e7b 17080 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
a680de9a
PB
17081 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
17082 r = bfd_reloc_ok;
3de43e7b 17083 if (relocation + 0x8000 > 0xffff)
a680de9a
PB
17084 r = bfd_reloc_overflow;
17085 }
5663e321
AM
17086 break;
17087
17088 default:
17089 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
17090 contents, rel->r_offset,
17091 relocation, addend);
a680de9a 17092 }
5bd4f169 17093
ef60b7ff 17094 if (r != bfd_reloc_ok)
5bd4f169 17095 {
bc30df16 17096 char *more_info = NULL;
b80eed39 17097 const char *reloc_name = howto->name;
bc30df16
AM
17098
17099 if (reloc_dest != DEST_NORMAL)
17100 {
17101 more_info = bfd_malloc (strlen (reloc_name) + 8);
17102 if (more_info != NULL)
17103 {
17104 strcpy (more_info, reloc_name);
17105 strcat (more_info, (reloc_dest == DEST_OPD
17106 ? " (OPD)" : " (stub)"));
17107 reloc_name = more_info;
17108 }
17109 }
17110
cd27b276 17111 if (r == bfd_reloc_overflow)
5bd4f169 17112 {
8131c122
AM
17113 /* On code like "if (foo) foo();" don't report overflow
17114 on a branch to zero when foo is undefined. */
17115 if (!warned
17116 && (reloc_dest == DEST_STUB
17117 || !(h != NULL
17118 && (h->elf.root.type == bfd_link_hash_undefweak
17119 || h->elf.root.type == bfd_link_hash_undefined)
17120 && is_branch_reloc (r_type))))
1a72702b
AM
17121 info->callbacks->reloc_overflow (info, &h->elf.root,
17122 sym_name, reloc_name,
17123 orig_rel.r_addend,
17124 input_bfd, input_section,
17125 rel->r_offset);
ef60b7ff
AM
17126 }
17127 else
17128 {
25f53a85 17129 info->callbacks->einfo
695344c0 17130 /* xgettext:c-format */
c1c8c1ef 17131 (_("%H: %s against `%pT': error %d\n"),
25f53a85 17132 input_bfd, input_section, rel->r_offset,
bc30df16 17133 reloc_name, sym_name, (int) r);
b34976b6 17134 ret = FALSE;
ef60b7ff 17135 }
c9594989 17136 free (more_info);
5bd4f169 17137 }
c316a17c
AM
17138 copy_reloc:
17139 if (wrel != rel)
17140 *wrel = *rel;
17141 }
17142
17143 if (wrel != rel)
17144 {
17145 Elf_Internal_Shdr *rel_hdr;
17146 size_t deleted = rel - wrel;
17147
17148 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
17149 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
17150 if (rel_hdr->sh_size == 0)
17151 {
17152 /* It is too late to remove an empty reloc section. Leave
17153 one NONE reloc.
17154 ??? What is wrong with an empty section??? */
17155 rel_hdr->sh_size = rel_hdr->sh_entsize;
17156 deleted -= 1;
17157 }
17158 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
17159 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
17160 input_section->reloc_count -= deleted;
5bd4f169
AM
17161 }
17162
645ea6a9
AM
17163 /* If we're emitting relocations, then shortly after this function
17164 returns, reloc offsets and addends for this section will be
17165 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
17166 file rather than the input. Save a copy of the relocs for
17167 opd_entry_value. */
0e1862bb 17168 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
8860955f
AM
17169 {
17170 bfd_size_type amt;
17171 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
17172 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
17173 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
17174 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
17175 if (rel == NULL)
17176 return FALSE;
17177 memcpy (rel, relocs, amt);
17178 }
5bd4f169
AM
17179 return ret;
17180}
17181
754021d0
AM
17182/* Adjust the value of any local symbols in opd sections. */
17183
6e0b88f1 17184static int
754021d0
AM
17185ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
17186 const char *name ATTRIBUTE_UNUSED,
17187 Elf_Internal_Sym *elfsym,
17188 asection *input_sec,
17189 struct elf_link_hash_entry *h)
17190{
74f0fb50
AM
17191 struct _opd_sec_data *opd;
17192 long adjust;
754021d0
AM
17193 bfd_vma value;
17194
4025353c 17195 if (h != NULL)
6e0b88f1 17196 return 1;
4025353c 17197
74f0fb50
AM
17198 opd = get_opd_info (input_sec);
17199 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 17200 return 1;
754021d0
AM
17201
17202 value = elfsym->st_value - input_sec->output_offset;
0e1862bb 17203 if (!bfd_link_relocatable (info))
754021d0
AM
17204 value -= input_sec->output_section->vma;
17205
51aecdc5 17206 adjust = opd->adjust[OPD_NDX (value)];
4025353c 17207 if (adjust == -1)
6e0b88f1
AM
17208 return 2;
17209
17210 elfsym->st_value += adjust;
17211 return 1;
754021d0
AM
17212}
17213
5bd4f169
AM
17214/* Finish up dynamic symbol handling. We set the contents of various
17215 dynamic sections here. */
17216
b34976b6 17217static bfd_boolean
4ce794b7
AM
17218ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
17219 struct bfd_link_info *info,
17220 struct elf_link_hash_entry *h,
4aef7643 17221 Elf_Internal_Sym *sym)
5bd4f169 17222{
65f38f15 17223 struct ppc_link_hash_table *htab;
8387904d 17224 struct plt_entry *ent;
5bd4f169 17225
65f38f15 17226 htab = ppc_hash_table (info);
4dfe6ac6
NC
17227 if (htab == NULL)
17228 return FALSE;
5bd4f169 17229
49c09209
AM
17230 if (!htab->opd_abi && !h->def_regular)
17231 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
17232 if (ent->plt.offset != (bfd_vma) -1)
17233 {
17234 /* Mark the symbol as undefined, rather than as
17235 defined in glink. Leave the value if there were
17236 any relocations where pointer equality matters
17237 (this is a clue for the dynamic linker, to make
17238 function pointer comparisons work between an
17239 application and shared library), otherwise set it
17240 to zero. */
17241 sym->st_shndx = SHN_UNDEF;
17242 if (!h->pointer_equality_needed)
17243 sym->st_value = 0;
17244 else if (!h->ref_regular_nonweak)
17245 {
17246 /* This breaks function pointer comparisons, but
17247 that is better than breaking tests for a NULL
17248 function pointer. */
17249 sym->st_value = 0;
17250 }
17251 break;
17252 }
5bd4f169 17253
1bdd8fac
AM
17254 if (h->needs_copy
17255 && (h->root.type == bfd_link_hash_defined
17256 || h->root.type == bfd_link_hash_defweak)
17257 && (h->root.u.def.section == htab->elf.sdynbss
17258 || h->root.u.def.section == htab->elf.sdynrelro))
5bd4f169 17259 {
65f38f15 17260 /* This symbol needs a copy reloc. Set it up. */
49c09209 17261 Elf_Internal_Rela rela;
5474d94f 17262 asection *srel;
49c09209 17263 bfd_byte *loc;
5bd4f169 17264
1bdd8fac 17265 if (h->dynindx == -1)
65f38f15 17266 abort ();
5bd4f169 17267
ed7007c1 17268 rela.r_offset = defined_sym_val (h);
5bd4f169
AM
17269 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
17270 rela.r_addend = 0;
afbf7e8e 17271 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
17272 srel = htab->elf.sreldynrelro;
17273 else
17274 srel = htab->elf.srelbss;
17275 loc = srel->contents;
17276 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 17277 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
17278 }
17279
b34976b6 17280 return TRUE;
5bd4f169
AM
17281}
17282
65f38f15
AM
17283/* Used to decide how to sort relocs in an optimal manner for the
17284 dynamic linker, before writing them out. */
17285
17286static enum elf_reloc_type_class
7e612e98
AM
17287ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
17288 const asection *rel_sec,
17289 const Elf_Internal_Rela *rela)
65f38f15 17290{
04c9666a 17291 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
17292 struct ppc_link_hash_table *htab = ppc_hash_table (info);
17293
33e44f2e 17294 if (rel_sec == htab->elf.irelplt)
7e612e98 17295 return reloc_class_ifunc;
a33d1f77 17296
4ce794b7 17297 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 17298 switch (r_type)
65f38f15
AM
17299 {
17300 case R_PPC64_RELATIVE:
17301 return reloc_class_relative;
17302 case R_PPC64_JMP_SLOT:
17303 return reloc_class_plt;
17304 case R_PPC64_COPY:
17305 return reloc_class_copy;
17306 default:
17307 return reloc_class_normal;
17308 }
17309}
17310
5bd4f169
AM
17311/* Finish up the dynamic sections. */
17312
b34976b6 17313static bfd_boolean
4ce794b7
AM
17314ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
17315 struct bfd_link_info *info)
5bd4f169 17316{
65f38f15
AM
17317 struct ppc_link_hash_table *htab;
17318 bfd *dynobj;
5bd4f169 17319 asection *sdyn;
5bd4f169 17320
65f38f15 17321 htab = ppc_hash_table (info);
4dfe6ac6
NC
17322 if (htab == NULL)
17323 return FALSE;
17324
65f38f15 17325 dynobj = htab->elf.dynobj;
3d4d4302 17326 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 17327
65f38f15 17328 if (htab->elf.dynamic_sections_created)
5bd4f169 17329 {
5bd4f169
AM
17330 Elf64_External_Dyn *dyncon, *dynconend;
17331
33e44f2e 17332 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 17333 abort ();
5bd4f169
AM
17334
17335 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 17336 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
17337 for (; dyncon < dynconend; dyncon++)
17338 {
17339 Elf_Internal_Dyn dyn;
19397422 17340 asection *s;
5bd4f169
AM
17341
17342 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
17343
17344 switch (dyn.d_tag)
17345 {
65f38f15
AM
17346 default:
17347 continue;
5bd4f169 17348
5d1634d7 17349 case DT_PPC64_GLINK:
4ce794b7 17350 s = htab->glink;
6348e046 17351 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
17352 /* We stupidly defined DT_PPC64_GLINK to be the start
17353 of glink rather than the first entry point, which is
17354 what ld.so needs, and now have a bigger stub to
17355 support automatic multiple TOCs. */
9e390558 17356 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
5d1634d7
AM
17357 break;
17358
19397422
AM
17359 case DT_PPC64_OPD:
17360 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
17361 if (s == NULL)
17362 continue;
17363 dyn.d_un.d_ptr = s->vma;
19397422
AM
17364 break;
17365
e8910a83 17366 case DT_PPC64_OPT:
5663e321
AM
17367 if ((htab->do_multi_toc && htab->multi_toc_needed)
17368 || htab->notoc_plt)
e8910a83 17369 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
f378ab09
AM
17370 if (htab->has_plt_localentry0)
17371 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
e8910a83
AM
17372 break;
17373
19397422
AM
17374 case DT_PPC64_OPDSZ:
17375 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
17376 if (s == NULL)
17377 continue;
eea6121a 17378 dyn.d_un.d_val = s->size;
19397422
AM
17379 break;
17380
65f38f15 17381 case DT_PLTGOT:
33e44f2e 17382 s = htab->elf.splt;
6348e046 17383 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
17384 break;
17385
17386 case DT_JMPREL:
33e44f2e 17387 s = htab->elf.srelplt;
6348e046 17388 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 17389 break;
5bd4f169 17390
65f38f15 17391 case DT_PLTRELSZ:
33e44f2e 17392 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7 17393 break;
82e66161
AM
17394
17395 case DT_TEXTREL:
cebd6b8a 17396 if (htab->elf.ifunc_resolvers)
82e66161
AM
17397 info->callbacks->einfo
17398 (_("%P: warning: text relocations and GNU indirect "
17399 "functions may result in a segfault at runtime\n"));
17400 continue;
5bd4f169 17401 }
5bd4f169 17402
65f38f15 17403 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 17404 }
5bd4f169
AM
17405 }
17406
6528b6eb
AM
17407 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
17408 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17409 {
17410 /* Fill in the first entry in the global offset table.
17411 We use it to hold the link-time TOCbase. */
17412 bfd_put_64 (output_bfd,
60ee0d4a 17413 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 17414 htab->elf.sgot->contents);
5d1634d7
AM
17415
17416 /* Set .got entry size. */
2cdcc330
AM
17417 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
17418 = 8;
5d1634d7
AM
17419 }
17420
6528b6eb
AM
17421 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
17422 && htab->elf.splt->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17423 {
17424 /* Set .plt entry size. */
33e44f2e 17425 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 17426 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
17427 }
17428
84f5d08e
AM
17429 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
17430 brlt ourselves if emitrelocations. */
17431 if (htab->brlt != NULL
17432 && htab->brlt->reloc_count != 0
17433 && !_bfd_elf_link_output_relocs (output_bfd,
17434 htab->brlt,
d4730f92 17435 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
17436 elf_section_data (htab->brlt)->relocs,
17437 NULL))
17438 return FALSE;
17439
176a0d42
AM
17440 if (htab->glink != NULL
17441 && htab->glink->reloc_count != 0
17442 && !_bfd_elf_link_output_relocs (output_bfd,
17443 htab->glink,
d4730f92 17444 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
17445 elf_section_data (htab->glink)->relocs,
17446 NULL))
17447 return FALSE;
17448
da44f4e5 17449
df136d64
AM
17450 if (htab->glink_eh_frame != NULL
17451 && htab->glink_eh_frame->size != 0
17452 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
17453 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
17454 htab->glink_eh_frame,
17455 htab->glink_eh_frame->contents))
17456 return FALSE;
58d180e8 17457
e717da7e 17458 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
17459 since we didn't add them to DYNOBJ. We know dynobj is the first
17460 bfd. */
c72f2fb2 17461 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
17462 {
17463 asection *s;
7b53ace3 17464
0c8d6e5c 17465 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
17466 continue;
17467
e717da7e
AM
17468 s = ppc64_elf_tdata (dynobj)->got;
17469 if (s != NULL
eea6121a 17470 && s->size != 0
e717da7e
AM
17471 && s->output_section != bfd_abs_section_ptr
17472 && !bfd_set_section_contents (output_bfd, s->output_section,
17473 s->contents, s->output_offset,
eea6121a 17474 s->size))
e717da7e
AM
17475 return FALSE;
17476 s = ppc64_elf_tdata (dynobj)->relgot;
17477 if (s != NULL
eea6121a 17478 && s->size != 0
e717da7e
AM
17479 && s->output_section != bfd_abs_section_ptr
17480 && !bfd_set_section_contents (output_bfd, s->output_section,
17481 s->contents, s->output_offset,
eea6121a 17482 s->size))
e717da7e
AM
17483 return FALSE;
17484 }
f6c52c13 17485
b34976b6 17486 return TRUE;
5bd4f169
AM
17487}
17488
5bd4f169 17489#include "elf64-target.h"
7b8e7dad
AM
17490
17491/* FreeBSD support */
17492
17493#undef TARGET_LITTLE_SYM
17494#undef TARGET_LITTLE_NAME
17495
17496#undef TARGET_BIG_SYM
6d00b590 17497#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
17498#undef TARGET_BIG_NAME
17499#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
17500
17501#undef ELF_OSABI
17502#define ELF_OSABI ELFOSABI_FREEBSD
17503
17504#undef elf64_bed
17505#define elf64_bed elf64_powerpc_fbsd_bed
17506
17507#include "elf64-target.h"
This page took 2.93958 seconds and 4 git commands to generate.