]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf64-ppc.c
Automatic date update in version.in
[thirdparty/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
82e66161
AM
3242 /* Whether there exist local gnu indirect function resolvers,
3243 referenced by dynamic relocations. */
3244 unsigned int local_ifunc_resolver:1;
3245 unsigned int maybe_local_ifunc_resolver:1;
3246
f378ab09
AM
3247 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
3248 unsigned int has_plt_localentry0:1;
3249
5663e321
AM
3250 /* Whether calls are made via the PLT from NOTOC functions. */
3251 unsigned int notoc_plt:1;
3252
7c1f4227
AM
3253 /* Whether to use power10 instructions in linkage stubs. */
3254 unsigned int power10_stubs:1;
04bdff6a 3255
721956f4
AM
3256 /* Incremented every time we size stubs. */
3257 unsigned int stub_iteration;
5d1634d7 3258
87d72d41
AM
3259 /* Small local sym cache. */
3260 struct sym_cache sym_cache;
65f38f15
AM
3261};
3262
4c52953f
AM
3263/* Rename some of the generic section flags to better document how they
3264 are used here. */
b0dddeec
AM
3265
3266/* Nonzero if this section has TLS related relocations. */
3267#define has_tls_reloc sec_flg0
3268
9737e8af
AM
3269/* Nonzero if this section has a call to __tls_get_addr lacking marker
3270 relocations. */
3271#define nomark_tls_get_addr sec_flg1
b0dddeec
AM
3272
3273/* Nonzero if this section has any toc or got relocs. */
3274#define has_toc_reloc sec_flg2
3275
3276/* Nonzero if this section has a call to another section that uses
3277 the toc or got. */
d77c8a4b 3278#define makes_toc_func_call sec_flg3
b0dddeec
AM
3279
3280/* Recursion protection when determining above flag. */
d77c8a4b 3281#define call_check_in_progress sec_flg4
70cc837d 3282#define call_check_done sec_flg5
4c52953f 3283
65f38f15
AM
3284/* Get the ppc64 ELF linker hash table from a link_info structure. */
3285
3286#define ppc_hash_table(p) \
4dfe6ac6
NC
3287 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3288 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
65f38f15 3289
721956f4
AM
3290#define ppc_stub_hash_lookup(table, string, create, copy) \
3291 ((struct ppc_stub_hash_entry *) \
3292 bfd_hash_lookup ((table), (string), (create), (copy)))
3293
3294#define ppc_branch_hash_lookup(table, string, create, copy) \
3295 ((struct ppc_branch_hash_entry *) \
3296 bfd_hash_lookup ((table), (string), (create), (copy)))
3297
3298/* Create an entry in the stub hash table. */
3299
3300static struct bfd_hash_entry *
4ce794b7
AM
3301stub_hash_newfunc (struct bfd_hash_entry *entry,
3302 struct bfd_hash_table *table,
3303 const char *string)
721956f4
AM
3304{
3305 /* Allocate the structure if it has not already been allocated by a
3306 subclass. */
3307 if (entry == NULL)
3308 {
3309 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3310 if (entry == NULL)
3311 return entry;
3312 }
3313
3314 /* Call the allocation method of the superclass. */
3315 entry = bfd_hash_newfunc (entry, table, string);
3316 if (entry != NULL)
3317 {
3318 struct ppc_stub_hash_entry *eh;
3319
3320 /* Initialize the local fields. */
3321 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 3322 eh->stub_type = ppc_stub_none;
6f20ed8a 3323 eh->group = NULL;
721956f4
AM
3324 eh->stub_offset = 0;
3325 eh->target_value = 0;
3326 eh->target_section = NULL;
721956f4 3327 eh->h = NULL;
6911b7dc 3328 eh->plt_ent = NULL;
6911b7dc 3329 eh->other = 0;
721956f4
AM
3330 }
3331
3332 return entry;
3333}
3334
3335/* Create an entry in the branch hash table. */
3336
3337static struct bfd_hash_entry *
4ce794b7
AM
3338branch_hash_newfunc (struct bfd_hash_entry *entry,
3339 struct bfd_hash_table *table,
3340 const char *string)
721956f4
AM
3341{
3342 /* Allocate the structure if it has not already been allocated by a
3343 subclass. */
3344 if (entry == NULL)
3345 {
3346 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3347 if (entry == NULL)
3348 return entry;
3349 }
3350
3351 /* Call the allocation method of the superclass. */
3352 entry = bfd_hash_newfunc (entry, table, string);
3353 if (entry != NULL)
3354 {
3355 struct ppc_branch_hash_entry *eh;
3356
3357 /* Initialize the local fields. */
3358 eh = (struct ppc_branch_hash_entry *) entry;
3359 eh->offset = 0;
3360 eh->iter = 0;
3361 }
3362
3363 return entry;
3364}
3365
65f38f15
AM
3366/* Create an entry in a ppc64 ELF linker hash table. */
3367
3368static struct bfd_hash_entry *
4ce794b7
AM
3369link_hash_newfunc (struct bfd_hash_entry *entry,
3370 struct bfd_hash_table *table,
3371 const char *string)
65f38f15
AM
3372{
3373 /* Allocate the structure if it has not already been allocated by a
3374 subclass. */
3375 if (entry == NULL)
3376 {
3377 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3378 if (entry == NULL)
3379 return entry;
3380 }
3381
3382 /* Call the allocation method of the superclass. */
3383 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3384 if (entry != NULL)
3385 {
3386 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3387
b3fac117 3388 memset (&eh->u.stub_cache, 0,
908b32fc 3389 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
3390 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3391
3392 /* When making function calls, old ABI code references function entry
3393 points (dot symbols), while new ABI code references the function
3394 descriptor symbol. We need to make any combination of reference and
3395 definition work together, without breaking archive linking.
3396
3397 For a defined function "foo" and an undefined call to "bar":
3398 An old object defines "foo" and ".foo", references ".bar" (possibly
3399 "bar" too).
3400 A new object defines "foo" and references "bar".
3401
3402 A new object thus has no problem with its undefined symbols being
3403 satisfied by definitions in an old object. On the other hand, the
3404 old object won't have ".bar" satisfied by a new object.
3405
3406 Keep a list of newly added dot-symbols. */
3407
3408 if (string[0] == '.')
3409 {
3410 struct ppc_link_hash_table *htab;
3411
3412 htab = (struct ppc_link_hash_table *) table;
3413 eh->u.next_dot_sym = htab->dot_syms;
3414 htab->dot_syms = eh;
3415 }
65f38f15
AM
3416 }
3417
3418 return entry;
3419}
3420
2cdcc330
AM
3421struct tocsave_entry
3422{
3b421ab3
AM
3423 asection *sec;
3424 bfd_vma offset;
3425};
3426
3427static hashval_t
3428tocsave_htab_hash (const void *p)
3429{
3430 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4aef7643 3431 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
3b421ab3
AM
3432}
3433
3434static int
3435tocsave_htab_eq (const void *p1, const void *p2)
3436{
3437 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
3438 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
3439 return e1->sec == e2->sec && e1->offset == e2->offset;
3440}
3441
68faa637
AM
3442/* Destroy a ppc64 ELF linker hash table. */
3443
3444static void
d495ab0d 3445ppc64_elf_link_hash_table_free (bfd *obfd)
68faa637 3446{
d495ab0d 3447 struct ppc_link_hash_table *htab;
68faa637 3448
d495ab0d 3449 htab = (struct ppc_link_hash_table *) obfd->link.hash;
68faa637
AM
3450 if (htab->tocsave_htab)
3451 htab_delete (htab->tocsave_htab);
d495ab0d
AM
3452 bfd_hash_table_free (&htab->branch_hash_table);
3453 bfd_hash_table_free (&htab->stub_hash_table);
3454 _bfd_elf_link_hash_table_free (obfd);
68faa637
AM
3455}
3456
65f38f15
AM
3457/* Create a ppc64 ELF linker hash table. */
3458
3459static struct bfd_link_hash_table *
4ce794b7 3460ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
3461{
3462 struct ppc_link_hash_table *htab;
986f0783 3463 size_t amt = sizeof (struct ppc_link_hash_table);
65f38f15 3464
4ce794b7 3465 htab = bfd_zmalloc (amt);
65f38f15
AM
3466 if (htab == NULL)
3467 return NULL;
3468
66eb6687 3469 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
3470 sizeof (struct ppc_link_hash_entry),
3471 PPC64_ELF_DATA))
65f38f15 3472 {
e2d34d7d 3473 free (htab);
65f38f15
AM
3474 return NULL;
3475 }
3476
721956f4 3477 /* Init the stub hash table too. */
66eb6687
AM
3478 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
3479 sizeof (struct ppc_stub_hash_entry)))
2915c55b 3480 {
d495ab0d 3481 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3482 return NULL;
3483 }
721956f4
AM
3484
3485 /* And the branch hash table. */
66eb6687
AM
3486 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
3487 sizeof (struct ppc_branch_hash_entry)))
2915c55b
JK
3488 {
3489 bfd_hash_table_free (&htab->stub_hash_table);
d495ab0d 3490 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3491 return NULL;
3492 }
721956f4 3493
3b421ab3
AM
3494 htab->tocsave_htab = htab_try_create (1024,
3495 tocsave_htab_hash,
3496 tocsave_htab_eq,
3497 NULL);
3498 if (htab->tocsave_htab == NULL)
2915c55b 3499 {
d495ab0d 3500 ppc64_elf_link_hash_table_free (abfd);
2915c55b
JK
3501 return NULL;
3502 }
d495ab0d 3503 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
3b421ab3 3504
3254fd24
AM
3505 /* Initializing two fields of the union is just cosmetic. We really
3506 only care about glist, but when compiled on a 32-bit host the
3507 bfd_vma fields are larger. Setting the bfd_vma to zero makes
3508 debugger inspection of these fields look nicer. */
a6aa5195
AM
3509 htab->elf.init_got_refcount.refcount = 0;
3510 htab->elf.init_got_refcount.glist = NULL;
3511 htab->elf.init_plt_refcount.refcount = 0;
3512 htab->elf.init_plt_refcount.glist = NULL;
3513 htab->elf.init_got_offset.offset = 0;
3514 htab->elf.init_got_offset.glist = NULL;
3515 htab->elf.init_plt_offset.offset = 0;
3516 htab->elf.init_plt_offset.glist = NULL;
3254fd24 3517
65f38f15
AM
3518 return &htab->elf.root;
3519}
3520
bfeb4a28
AM
3521/* Create sections for linker generated code. */
3522
3523static bfd_boolean
3524create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3525{
3526 struct ppc_link_hash_table *htab;
3527 flagword flags;
3528
3529 htab = ppc_hash_table (info);
3530
bfeb4a28
AM
3531 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3532 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
b32547cd
AM
3533 if (htab->params->save_restore_funcs)
3534 {
3535 /* Create .sfpr for code to save and restore fp regs. */
3536 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
3537 flags);
3538 if (htab->sfpr == NULL
fd361982 3539 || !bfd_set_section_alignment (htab->sfpr, 2))
b32547cd
AM
3540 return FALSE;
3541 }
3542
3543 if (bfd_link_relocatable (info))
3544 return TRUE;
bfeb4a28
AM
3545
3546 /* Create .glink for lazy dynamic linking support. */
3547 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3548 flags);
3549 if (htab->glink == NULL
fd361982 3550 || !bfd_set_section_alignment (htab->glink, 3))
bfeb4a28
AM
3551 return FALSE;
3552
9e390558
AM
3553 /* The part of .glink used by global entry stubs, separate so that
3554 it can be aligned appropriately without affecting htab->glink. */
3555 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3556 flags);
3557 if (htab->global_entry == NULL
fd361982 3558 || !bfd_set_section_alignment (htab->global_entry, 2))
9e390558
AM
3559 return FALSE;
3560
bfeb4a28
AM
3561 if (!info->no_ld_generated_unwind_info)
3562 {
3563 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
3564 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3565 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
3566 ".eh_frame",
3567 flags);
3568 if (htab->glink_eh_frame == NULL
fd361982 3569 || !bfd_set_section_alignment (htab->glink_eh_frame, 2))
bfeb4a28
AM
3570 return FALSE;
3571 }
3572
3573 flags = SEC_ALLOC | SEC_LINKER_CREATED;
33e44f2e
AM
3574 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
3575 if (htab->elf.iplt == NULL
fd361982 3576 || !bfd_set_section_alignment (htab->elf.iplt, 3))
bfeb4a28
AM
3577 return FALSE;
3578
3579 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3580 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
33e44f2e
AM
3581 htab->elf.irelplt
3582 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
3583 if (htab->elf.irelplt == NULL
fd361982 3584 || !bfd_set_section_alignment (htab->elf.irelplt, 3))
bfeb4a28
AM
3585 return FALSE;
3586
3587 /* Create branch lookup table for plt_branch stubs. */
3588 flags = (SEC_ALLOC | SEC_LOAD
3589 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3590 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3591 flags);
3592 if (htab->brlt == NULL
fd361982 3593 || !bfd_set_section_alignment (htab->brlt, 3))
bfeb4a28
AM
3594 return FALSE;
3595
2d7ad24e
AM
3596 /* Local plt entries, put in .branch_lt but a separate section for
3597 convenience. */
3598 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3599 flags);
3600 if (htab->pltlocal == NULL
fd361982 3601 || !bfd_set_section_alignment (htab->pltlocal, 3))
2d7ad24e
AM
3602 return FALSE;
3603
0e1862bb 3604 if (!bfd_link_pic (info))
bfeb4a28
AM
3605 return TRUE;
3606
3607 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3608 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2d7ad24e
AM
3609 htab->relbrlt
3610 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
bfeb4a28 3611 if (htab->relbrlt == NULL
fd361982 3612 || !bfd_set_section_alignment (htab->relbrlt, 3))
bfeb4a28
AM
3613 return FALSE;
3614
2d7ad24e
AM
3615 htab->relpltlocal
3616 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
3617 if (htab->relpltlocal == NULL
fd361982 3618 || !bfd_set_section_alignment (htab->relpltlocal, 3))
2d7ad24e
AM
3619 return FALSE;
3620
bfeb4a28
AM
3621 return TRUE;
3622}
3623
e717da7e
AM
3624/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
3625
bfeb4a28 3626bfd_boolean
e7d1c40c
AM
3627ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
3628 struct ppc64_elf_params *params)
e717da7e
AM
3629{
3630 struct ppc_link_hash_table *htab;
3631
e7d1c40c 3632 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
e717da7e
AM
3633
3634/* Always hook our dynamic sections into the first bfd, which is the
3635 linker created stub bfd. This ensures that the GOT header is at
3636 the start of the output TOC section. */
3637 htab = ppc_hash_table (info);
e7d1c40c
AM
3638 htab->elf.dynobj = params->stub_bfd;
3639 htab->params = params;
bfeb4a28 3640
bfeb4a28 3641 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
3642}
3643
721956f4
AM
3644/* Build a name for an entry in the stub hash table. */
3645
3646static char *
4ce794b7
AM
3647ppc_stub_name (const asection *input_section,
3648 const asection *sym_sec,
3649 const struct ppc_link_hash_entry *h,
3650 const Elf_Internal_Rela *rel)
721956f4
AM
3651{
3652 char *stub_name;
bcaa2f82 3653 ssize_t len;
721956f4
AM
3654
3655 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3656 offsets from a sym as a branch target? In fact, we could
3657 probably assume the addend is always zero. */
3658 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3659
3660 if (h)
3661 {
3662 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3663 stub_name = bfd_malloc (len);
46de2a7c
AM
3664 if (stub_name == NULL)
3665 return stub_name;
3666
bcaa2f82
AM
3667 len = sprintf (stub_name, "%08x.%s+%x",
3668 input_section->id & 0xffffffff,
3669 h->elf.root.root.string,
3670 (int) rel->r_addend & 0xffffffff);
721956f4
AM
3671 }
3672 else
3673 {
ad8e1ba5 3674 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 3675 stub_name = bfd_malloc (len);
46de2a7c
AM
3676 if (stub_name == NULL)
3677 return stub_name;
3678
bcaa2f82
AM
3679 len = sprintf (stub_name, "%08x.%x:%x+%x",
3680 input_section->id & 0xffffffff,
3681 sym_sec->id & 0xffffffff,
3682 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3683 (int) rel->r_addend & 0xffffffff);
721956f4 3684 }
bcaa2f82 3685 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 3686 stub_name[len - 2] = 0;
721956f4
AM
3687 return stub_name;
3688}
3689
3690/* Look up an entry in the stub hash. Stub entries are cached because
3691 creating the stub name takes a bit of time. */
3692
3693static struct ppc_stub_hash_entry *
4ce794b7
AM
3694ppc_get_stub_entry (const asection *input_section,
3695 const asection *sym_sec,
039b3fef 3696 struct ppc_link_hash_entry *h,
4ce794b7
AM
3697 const Elf_Internal_Rela *rel,
3698 struct ppc_link_hash_table *htab)
721956f4
AM
3699{
3700 struct ppc_stub_hash_entry *stub_entry;
6f20ed8a 3701 struct map_stub *group;
721956f4
AM
3702
3703 /* If this input section is part of a group of sections sharing one
3704 stub section, then use the id of the first section in the group.
3705 Stub names need to include a section id, as there may well be
3706 more than one stub used to reach say, printf, and we need to
3707 distinguish between them. */
6f20ed8a 3708 group = htab->sec_info[input_section->id].u.group;
89d77b8a
AM
3709 if (group == NULL)
3710 return NULL;
721956f4 3711
b3fac117
AM
3712 if (h != NULL && h->u.stub_cache != NULL
3713 && h->u.stub_cache->h == h
6f20ed8a 3714 && h->u.stub_cache->group == group)
721956f4 3715 {
b3fac117 3716 stub_entry = h->u.stub_cache;
721956f4
AM
3717 }
3718 else
3719 {
3720 char *stub_name;
3721
6f20ed8a 3722 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
721956f4
AM
3723 if (stub_name == NULL)
3724 return NULL;
3725
3726 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 3727 stub_name, FALSE, FALSE);
721956f4 3728 if (h != NULL)
b3fac117 3729 h->u.stub_cache = stub_entry;
721956f4
AM
3730
3731 free (stub_name);
3732 }
3733
3734 return stub_entry;
3735}
3736
3737/* Add a new stub entry to the stub hash. Not all fields of the new
3738 stub entry are initialised. */
3739
3740static struct ppc_stub_hash_entry *
4ce794b7
AM
3741ppc_add_stub (const char *stub_name,
3742 asection *section,
25f53a85 3743 struct bfd_link_info *info)
721956f4 3744{
25f53a85 3745 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 3746 struct map_stub *group;
721956f4
AM
3747 asection *link_sec;
3748 asection *stub_sec;
3749 struct ppc_stub_hash_entry *stub_entry;
3750
6f20ed8a
AM
3751 group = htab->sec_info[section->id].u.group;
3752 link_sec = group->link_sec;
3753 stub_sec = group->stub_sec;
721956f4
AM
3754 if (stub_sec == NULL)
3755 {
6f20ed8a
AM
3756 size_t namelen;
3757 bfd_size_type len;
3758 char *s_name;
721956f4 3759
6f20ed8a
AM
3760 namelen = strlen (link_sec->name);
3761 len = namelen + sizeof (STUB_SUFFIX);
3762 s_name = bfd_alloc (htab->params->stub_bfd, len);
3763 if (s_name == NULL)
3764 return NULL;
721956f4 3765
6f20ed8a
AM
3766 memcpy (s_name, link_sec->name, namelen);
3767 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3768 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
3769 if (stub_sec == NULL)
3770 return NULL;
3771 group->stub_sec = stub_sec;
721956f4
AM
3772 }
3773
3774 /* Enter this entry into the linker stub hash table. */
3775 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 3776 TRUE, FALSE);
721956f4
AM
3777 if (stub_entry == NULL)
3778 {
695344c0 3779 /* xgettext:c-format */
cf97bcb0
AM
3780 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
3781 section->owner, stub_name);
721956f4
AM
3782 return NULL;
3783 }
3784
6f20ed8a 3785 stub_entry->group = group;
721956f4 3786 stub_entry->stub_offset = 0;
721956f4
AM
3787 return stub_entry;
3788}
3789
e717da7e
AM
3790/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3791 not already done. */
65f38f15 3792
b34976b6 3793static bfd_boolean
e717da7e 3794create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 3795{
e717da7e
AM
3796 asection *got, *relgot;
3797 flagword flags;
3798 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 3799
0c8d6e5c 3800 if (!is_ppc64_elf (abfd))
0ffa91dd 3801 return FALSE;
4dfe6ac6
NC
3802 if (htab == NULL)
3803 return FALSE;
0ffa91dd 3804
33e44f2e
AM
3805 if (!htab->elf.sgot
3806 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
3807 return FALSE;
e717da7e
AM
3808
3809 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3810 | SEC_LINKER_CREATED);
3811
c456f082 3812 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 3813 if (!got
fd361982 3814 || !bfd_set_section_alignment (got, 3))
e717da7e 3815 return FALSE;
65f38f15 3816
c456f082
AM
3817 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
3818 flags | SEC_READONLY);
e717da7e 3819 if (!relgot
fd361982 3820 || !bfd_set_section_alignment (relgot, 3))
b34976b6 3821 return FALSE;
e717da7e
AM
3822
3823 ppc64_elf_tdata (abfd)->got = got;
3824 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 3825 return TRUE;
65f38f15 3826}
5bd4f169 3827
b31867b6
AM
3828/* Follow indirect and warning symbol links. */
3829
3830static inline struct bfd_link_hash_entry *
3831follow_link (struct bfd_link_hash_entry *h)
3832{
3833 while (h->type == bfd_link_hash_indirect
3834 || h->type == bfd_link_hash_warning)
3835 h = h->u.i.link;
3836 return h;
3837}
3838
3839static inline struct elf_link_hash_entry *
3840elf_follow_link (struct elf_link_hash_entry *h)
3841{
3842 return (struct elf_link_hash_entry *) follow_link (&h->root);
3843}
3844
3845static inline struct ppc_link_hash_entry *
3846ppc_follow_link (struct ppc_link_hash_entry *h)
3847{
ed7007c1 3848 return ppc_elf_hash_entry (elf_follow_link (&h->elf));
b31867b6
AM
3849}
3850
40d16e0b
AM
3851/* Merge PLT info on FROM with that on TO. */
3852
3853static void
3854move_plt_plist (struct ppc_link_hash_entry *from,
3855 struct ppc_link_hash_entry *to)
3856{
3857 if (from->elf.plt.plist != NULL)
3858 {
3859 if (to->elf.plt.plist != NULL)
3860 {
3861 struct plt_entry **entp;
3862 struct plt_entry *ent;
3863
3864 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
3865 {
3866 struct plt_entry *dent;
3867
3868 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
3869 if (dent->addend == ent->addend)
3870 {
3871 dent->plt.refcount += ent->plt.refcount;
3872 *entp = ent->next;
3873 break;
3874 }
3875 if (dent == NULL)
3876 entp = &ent->next;
3877 }
3878 *entp = to->elf.plt.plist;
3879 }
3880
3881 to->elf.plt.plist = from->elf.plt.plist;
3882 from->elf.plt.plist = NULL;
3883 }
3884}
3885
65f38f15
AM
3886/* Copy the extra info we tack onto an elf_link_hash_entry. */
3887
3888static void
fcfa13d2
AM
3889ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
3890 struct elf_link_hash_entry *dir,
3891 struct elf_link_hash_entry *ind)
65f38f15
AM
3892{
3893 struct ppc_link_hash_entry *edir, *eind;
3894
ed7007c1
AM
3895 edir = ppc_elf_hash_entry (dir);
3896 eind = ppc_elf_hash_entry (ind);
65f38f15 3897
c79d6685
AM
3898 edir->is_func |= eind->is_func;
3899 edir->is_func_descriptor |= eind->is_func_descriptor;
3900 edir->tls_mask |= eind->tls_mask;
3901 if (eind->oh != NULL)
3902 edir->oh = ppc_follow_link (eind->oh);
3903
474436e6 3904 if (edir->elf.versioned != versioned_hidden)
e81830c5
AM
3905 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
3906 edir->elf.ref_regular |= eind->elf.ref_regular;
3907 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4a7e5234 3908 edir->elf.non_got_ref |= eind->elf.non_got_ref;
e81830c5
AM
3909 edir->elf.needs_plt |= eind->elf.needs_plt;
3910 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
c79d6685 3911
d311bc8b
AM
3912 /* If we were called to copy over info for a weak sym, don't copy
3913 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
3914 in order to simplify readonly_dynrelocs and save a field in the
3915 symbol hash entry, but that means dyn_relocs can't be used in any
3916 tests about a specific symbol, or affect other symbol flags which
ab2477e1 3917 are then tested. */
d311bc8b 3918 if (eind->elf.root.type != bfd_link_hash_indirect)
ab2477e1 3919 return;
d311bc8b 3920
411e1bfb 3921 /* Copy over any dynamic relocs we may have on the indirect sym. */
190eb1dd 3922 if (ind->dyn_relocs != NULL)
65f38f15 3923 {
190eb1dd 3924 if (dir->dyn_relocs != NULL)
bbd7ec4a 3925 {
6061a67d
AM
3926 struct elf_dyn_relocs **pp;
3927 struct elf_dyn_relocs *p;
bbd7ec4a 3928
fcfa13d2 3929 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a 3930 list. Merge any entries against the same section. */
190eb1dd 3931 for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
bbd7ec4a 3932 {
6061a67d 3933 struct elf_dyn_relocs *q;
bbd7ec4a 3934
190eb1dd 3935 for (q = dir->dyn_relocs; q != NULL; q = q->next)
bbd7ec4a
AM
3936 if (q->sec == p->sec)
3937 {
3938 q->pc_count += p->pc_count;
3939 q->count += p->count;
3940 *pp = p->next;
3941 break;
3942 }
3943 if (q == NULL)
3944 pp = &p->next;
3945 }
190eb1dd 3946 *pp = dir->dyn_relocs;
bbd7ec4a
AM
3947 }
3948
190eb1dd
L
3949 dir->dyn_relocs = ind->dyn_relocs;
3950 ind->dyn_relocs = NULL;
65f38f15 3951 }
65f38f15 3952
81848ca0
AM
3953 /* Copy over got entries that we may have already seen to the
3954 symbol which just became indirect. */
411e1bfb
AM
3955 if (eind->elf.got.glist != NULL)
3956 {
3957 if (edir->elf.got.glist != NULL)
3958 {
3959 struct got_entry **entp;
3960 struct got_entry *ent;
3961
3962 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3963 {
3964 struct got_entry *dent;
3965
3966 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3967 if (dent->addend == ent->addend
e717da7e 3968 && dent->owner == ent->owner
411e1bfb
AM
3969 && dent->tls_type == ent->tls_type)
3970 {
3971 dent->got.refcount += ent->got.refcount;
3972 *entp = ent->next;
3973 break;
3974 }
3975 if (dent == NULL)
3976 entp = &ent->next;
3977 }
3978 *entp = edir->elf.got.glist;
3979 }
3980
3981 edir->elf.got.glist = eind->elf.got.glist;
3982 eind->elf.got.glist = NULL;
3983 }
3984
3985 /* And plt entries. */
40d16e0b 3986 move_plt_plist (eind, edir);
411e1bfb 3987
fcfa13d2 3988 if (eind->elf.dynindx != -1)
411e1bfb 3989 {
fcfa13d2
AM
3990 if (edir->elf.dynindx != -1)
3991 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3992 edir->elf.dynstr_index);
411e1bfb
AM
3993 edir->elf.dynindx = eind->elf.dynindx;
3994 edir->elf.dynstr_index = eind->elf.dynstr_index;
3995 eind->elf.dynindx = -1;
3996 eind->elf.dynstr_index = 0;
3997 }
411e1bfb
AM
3998}
3999
8387904d
AM
4000/* Find the function descriptor hash entry from the given function code
4001 hash entry FH. Link the entries via their OH fields. */
4002
4003static struct ppc_link_hash_entry *
b31867b6 4004lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
4005{
4006 struct ppc_link_hash_entry *fdh = fh->oh;
4007
4008 if (fdh == NULL)
4009 {
4010 const char *fd_name = fh->elf.root.root.string + 1;
4011
ed7007c1
AM
4012 fdh = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, fd_name,
4013 FALSE, FALSE, FALSE));
b31867b6
AM
4014 if (fdh == NULL)
4015 return fdh;
4016
4017 fdh->is_func_descriptor = 1;
4018 fdh->oh = fh;
4019 fh->is_func = 1;
4020 fh->oh = fdh;
8387904d
AM
4021 }
4022
8c5b4e52
AM
4023 fdh = ppc_follow_link (fdh);
4024 fdh->is_func_descriptor = 1;
4025 fdh->oh = fh;
4026 return fdh;
8387904d
AM
4027}
4028
8c5b4e52 4029/* Make a fake function descriptor sym for the undefined code sym FH. */
bb700d78
AM
4030
4031static struct ppc_link_hash_entry *
4032make_fdh (struct bfd_link_info *info,
908b32fc 4033 struct ppc_link_hash_entry *fh)
bb700d78 4034{
8c5b4e52
AM
4035 bfd *abfd = fh->elf.root.u.undef.abfd;
4036 struct bfd_link_hash_entry *bh = NULL;
bb700d78 4037 struct ppc_link_hash_entry *fdh;
8c5b4e52
AM
4038 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4039 ? BSF_WEAK
4040 : BSF_GLOBAL);
4041
4042 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4043 fh->elf.root.root.string + 1,
4044 flags, bfd_und_section_ptr, 0,
4045 NULL, FALSE, FALSE, &bh))
bb700d78
AM
4046 return NULL;
4047
4048 fdh = (struct ppc_link_hash_entry *) bh;
4049 fdh->elf.non_elf = 0;
908b32fc
AM
4050 fdh->fake = 1;
4051 fdh->is_func_descriptor = 1;
4052 fdh->oh = fh;
4053 fh->is_func = 1;
4054 fh->oh = fdh;
bb700d78
AM
4055 return fdh;
4056}
4057
8387904d
AM
4058/* Fix function descriptor symbols defined in .opd sections to be
4059 function type. */
555cd476
AM
4060
4061static bfd_boolean
c16153ae 4062ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 4063 struct bfd_link_info *info,
555cd476 4064 Elf_Internal_Sym *isym,
6911b7dc 4065 const char **name,
555cd476
AM
4066 flagword *flags ATTRIBUTE_UNUSED,
4067 asection **sec,
b53dfeb2 4068 bfd_vma *value)
555cd476 4069{
b53dfeb2 4070 if (*sec != NULL
f1885d1e 4071 && strcmp ((*sec)->name, ".opd") == 0)
b53dfeb2
AM
4072 {
4073 asection *code_sec;
4074
4075 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4076 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4077 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4078
4079 /* If the symbol is a function defined in .opd, and the function
4080 code is in a discarded group, let it appear to be undefined. */
0e1862bb 4081 if (!bfd_link_relocatable (info)
b53dfeb2
AM
4082 && (*sec)->reloc_count != 0
4083 && opd_entry_value (*sec, *value, &code_sec, NULL,
4084 FALSE) != (bfd_vma) -1
4085 && discarded_section (code_sec))
4086 {
4087 *sec = bfd_und_section_ptr;
4088 isym->st_shndx = SHN_UNDEF;
4089 }
4090 }
dbd1e97e
AM
4091 else if (*sec != NULL
4092 && strcmp ((*sec)->name, ".toc") == 0
4093 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4094 {
4095 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4096 if (htab != NULL)
4097 htab->params->object_in_toc = 1;
4098 }
433817dd 4099
6911b7dc
AM
4100 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4101 {
4102 if (abiversion (ibfd) == 0)
4103 set_abiversion (ibfd, 2);
4104 else if (abiversion (ibfd) == 1)
4105 {
cf97bcb0
AM
4106 _bfd_error_handler (_("symbol '%s' has invalid st_other"
4107 " for ABI version 1"), *name);
6911b7dc
AM
4108 bfd_set_error (bfd_error_bad_value);
4109 return FALSE;
4110 }
4111 }
4112
555cd476
AM
4113 return TRUE;
4114}
4115
6911b7dc
AM
4116/* Merge non-visibility st_other attributes: local entry point. */
4117
4118static void
4119ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4120 const Elf_Internal_Sym *isym,
4121 bfd_boolean definition,
4122 bfd_boolean dynamic)
4123{
f378ab09 4124 if (definition && (!dynamic || !h->def_regular))
6911b7dc
AM
4125 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4126 | ELF_ST_VISIBILITY (h->other));
4127}
4128
8c5b4e52
AM
4129/* Hook called on merging a symbol. We use this to clear "fake" since
4130 we now have a real symbol. */
4131
4132static bfd_boolean
4133ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
8b5f1ed8 4134 const Elf_Internal_Sym *isym,
8c5b4e52
AM
4135 asection **psec ATTRIBUTE_UNUSED,
4136 bfd_boolean newdef ATTRIBUTE_UNUSED,
4137 bfd_boolean olddef ATTRIBUTE_UNUSED,
4138 bfd *oldbfd ATTRIBUTE_UNUSED,
4139 const asection *oldsec ATTRIBUTE_UNUSED)
4140{
ed7007c1 4141 ppc_elf_hash_entry (h)->fake = 0;
8b5f1ed8 4142 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
ed7007c1 4143 ppc_elf_hash_entry (h)->non_zero_localentry = 1;
8c5b4e52
AM
4144 return TRUE;
4145}
4146
8387904d 4147/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
4148 inclusion of a new ABI object archive that defines "bar".
4149 NAME is a symbol defined in an archive. Return a symbol in the hash
4150 table that might be satisfied by the archive symbols. */
8387904d
AM
4151
4152static struct elf_link_hash_entry *
4153ppc64_elf_archive_symbol_lookup (bfd *abfd,
4154 struct bfd_link_info *info,
4155 const char *name)
4156{
4157 struct elf_link_hash_entry *h;
4158 char *dot_name;
4159 size_t len;
4160
4161 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
4162 if (h != NULL
4163 /* Don't return this sym if it is a fake function descriptor
4164 created by add_symbol_adjust. */
ed7007c1 4165 && !ppc_elf_hash_entry (h)->fake)
8387904d
AM
4166 return h;
4167
4168 if (name[0] == '.')
4169 return h;
4170
4171 len = strlen (name);
4172 dot_name = bfd_alloc (abfd, len + 2);
4173 if (dot_name == NULL)
e99955cd 4174 return (struct elf_link_hash_entry *) -1;
8387904d
AM
4175 dot_name[0] = '.';
4176 memcpy (dot_name + 1, name, len + 1);
4177 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4178 bfd_release (abfd, dot_name);
a804e476
AM
4179 if (h != NULL)
4180 return h;
4181
4182 if (strcmp (name, "__tls_get_addr_opt") == 0)
4183 h = _bfd_elf_archive_symbol_lookup (abfd, info, "__tls_get_addr_desc");
8387904d
AM
4184 return h;
4185}
4186
4187/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
4188 new ABI object defines "bar". Well, at least, undefined dot symbols
4189 are made weak. This stops later archive searches from including an
4190 object if we already have a function descriptor definition. It also
35b0ce59
AM
4191 prevents the linker complaining about undefined symbols.
4192 We also check and correct mismatched symbol visibility here. The
4193 most restrictive visibility of the function descriptor and the
4194 function entry symbol is used. */
8387904d
AM
4195
4196static bfd_boolean
b3fac117 4197add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 4198{
8387904d
AM
4199 struct ppc_link_hash_table *htab;
4200 struct ppc_link_hash_entry *fdh;
4201
b3fac117
AM
4202 if (eh->elf.root.type == bfd_link_hash_warning)
4203 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 4204
8400d40d
AM
4205 if (eh->elf.root.type == bfd_link_hash_indirect)
4206 return TRUE;
4207
b3fac117
AM
4208 if (eh->elf.root.root.string[0] != '.')
4209 abort ();
8387904d 4210
b3fac117 4211 htab = ppc_hash_table (info);
4dfe6ac6
NC
4212 if (htab == NULL)
4213 return FALSE;
4214
b31867b6 4215 fdh = lookup_fdh (eh, htab);
8c5b4e52
AM
4216 if (fdh == NULL
4217 && !bfd_link_relocatable (info)
4218 && (eh->elf.root.type == bfd_link_hash_undefined
4219 || eh->elf.root.type == bfd_link_hash_undefweak)
4220 && eh->elf.ref_regular)
4221 {
4222 /* Make an undefined function descriptor sym, in order to
4223 pull in an --as-needed shared lib. Archives are handled
4224 elsewhere. */
4225 fdh = make_fdh (info, eh);
4226 if (fdh == NULL)
4227 return FALSE;
bb700d78 4228 }
8c5b4e52
AM
4229
4230 if (fdh != NULL)
8387904d 4231 {
35b0ce59
AM
4232 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4233 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
8c5b4e52
AM
4234
4235 /* Make both descriptor and entry symbol have the most
4236 constraining visibility of either symbol. */
35b0ce59
AM
4237 if (entry_vis < descr_vis)
4238 fdh->elf.other += entry_vis - descr_vis;
4239 else if (entry_vis > descr_vis)
4240 eh->elf.other += descr_vis - entry_vis;
4241
8c5b4e52
AM
4242 /* Propagate reference flags from entry symbol to function
4243 descriptor symbol. */
bc4e12de 4244 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
4070765b 4245 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
8c5b4e52
AM
4246 fdh->elf.ref_regular |= eh->elf.ref_regular;
4247 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
4248
4249 if (!fdh->elf.forced_local
4250 && fdh->elf.dynindx == -1
4251 && fdh->elf.versioned != versioned_hidden
4252 && (bfd_link_dll (info)
4253 || fdh->elf.def_dynamic
4254 || fdh->elf.ref_dynamic)
4255 && (eh->elf.ref_regular
4256 || eh->elf.def_regular))
4257 {
2cdcc330 4258 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
8c5b4e52 4259 return FALSE;
35b0ce59 4260 }
8387904d 4261 }
99877b66 4262
8387904d
AM
4263 return TRUE;
4264}
4265
f6c7c3e8
AM
4266/* Set up opd section info and abiversion for IBFD, and process list
4267 of dot-symbols we made in link_hash_newfunc. */
b3fac117 4268
8387904d 4269static bfd_boolean
f6c7c3e8 4270ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
8387904d 4271{
99877b66 4272 struct ppc_link_hash_table *htab;
b3fac117 4273 struct ppc_link_hash_entry **p, *eh;
459609d6 4274 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
433817dd 4275
459609d6 4276 if (opd != NULL && opd->size != 0)
b3fac117 4277 {
b9399fcf
AM
4278 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
4279 ppc64_elf_section_data (opd)->sec_type = sec_opd;
4280
459609d6
AM
4281 if (abiversion (ibfd) == 0)
4282 set_abiversion (ibfd, 1);
8a2058b5 4283 else if (abiversion (ibfd) >= 2)
f6c7c3e8 4284 {
695344c0 4285 /* xgettext:c-format */
cf97bcb0
AM
4286 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"),
4287 ibfd, abiversion (ibfd));
459609d6
AM
4288 bfd_set_error (bfd_error_bad_value);
4289 return FALSE;
f6c7c3e8 4290 }
b9399fcf 4291 }
f6c7c3e8 4292
b9399fcf
AM
4293 if (is_ppc64_elf (info->output_bfd))
4294 {
4295 /* For input files without an explicit abiversion in e_flags
4296 we should have flagged any with symbol st_other bits set
4297 as ELFv1 and above flagged those with .opd as ELFv2.
4298 Set the output abiversion if not yet set, and for any input
4299 still ambiguous, take its abiversion from the output.
4300 Differences in ABI are reported later. */
4301 if (abiversion (info->output_bfd) == 0)
4302 set_abiversion (info->output_bfd, abiversion (ibfd));
4303 else if (abiversion (ibfd) == 0)
4304 set_abiversion (ibfd, abiversion (info->output_bfd));
b3fac117
AM
4305 }
4306
459609d6
AM
4307 htab = ppc_hash_table (info);
4308 if (htab == NULL)
b9399fcf 4309 return TRUE;
459609d6 4310
b9399fcf
AM
4311 if (opd != NULL && opd->size != 0
4312 && (ibfd->flags & DYNAMIC) == 0
4313 && (opd->flags & SEC_RELOC) != 0
4314 && opd->reloc_count != 0
4315 && !bfd_is_abs_section (opd->output_section)
4316 && info->gc_sections)
4317 {
4318 /* Garbage collection needs some extra help with .opd sections.
4319 We don't want to necessarily keep everything referenced by
4320 relocs in .opd, as that would keep all functions. Instead,
4321 if we reference an .opd symbol (a function descriptor), we
4322 want to keep the function code symbol's section. This is
4323 easy for global symbols, but for local syms we need to keep
4324 information about the associated function section. */
4325 bfd_size_type amt;
4326 asection **opd_sym_map;
4327 Elf_Internal_Shdr *symtab_hdr;
4328 Elf_Internal_Rela *relocs, *rel_end, *rel;
4329
4330 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
4331 opd_sym_map = bfd_zalloc (ibfd, amt);
4332 if (opd_sym_map == NULL)
4333 return FALSE;
4334 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
4335 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
4336 info->keep_memory);
4337 if (relocs == NULL)
4338 return FALSE;
4339 symtab_hdr = &elf_symtab_hdr (ibfd);
4340 rel_end = relocs + opd->reloc_count - 1;
4341 for (rel = relocs; rel < rel_end; rel++)
4342 {
4343 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
4344 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
4345
4346 if (r_type == R_PPC64_ADDR64
4347 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
4348 && r_symndx < symtab_hdr->sh_info)
4349 {
4350 Elf_Internal_Sym *isym;
4351 asection *s;
4352
4353 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
4354 if (isym == NULL)
4355 {
4356 if (elf_section_data (opd)->relocs != relocs)
4357 free (relocs);
4358 return FALSE;
4359 }
4360
4361 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
4362 if (s != NULL && s != opd)
4363 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
4364 }
4365 }
4366 if (elf_section_data (opd)->relocs != relocs)
4367 free (relocs);
4368 }
459609d6
AM
4369
4370 p = &htab->dot_syms;
4371 while ((eh = *p) != NULL)
4372 {
4373 *p = NULL;
4374 if (&eh->elf == htab->elf.hgot)
4375 ;
4376 else if (htab->elf.hgot == NULL
4377 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4378 htab->elf.hgot = &eh->elf;
8c5b4e52
AM
4379 else if (abiversion (ibfd) <= 1)
4380 {
4381 htab->need_func_desc_adj = 1;
4382 if (!add_symbol_adjust (eh, info))
4383 return FALSE;
4384 }
459609d6
AM
4385 p = &eh->u.next_dot_sym;
4386 }
b3fac117 4387 return TRUE;
8387904d
AM
4388}
4389
97fed1c9
JJ
4390/* Undo hash table changes when an --as-needed input file is determined
4391 not to be needed. */
4392
4393static bfd_boolean
e5034e59
AM
4394ppc64_elf_notice_as_needed (bfd *ibfd,
4395 struct bfd_link_info *info,
4396 enum notice_asneeded_action act)
97fed1c9 4397{
e5034e59
AM
4398 if (act == notice_not_needed)
4399 {
4400 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 4401
e5034e59
AM
4402 if (htab == NULL)
4403 return FALSE;
4dfe6ac6 4404
e5034e59
AM
4405 htab->dot_syms = NULL;
4406 }
4407 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
4408}
4409
aa374f67
AM
4410/* If --just-symbols against a final linked binary, then assume we need
4411 toc adjusting stubs when calling functions defined there. */
4412
4413static void
4414ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4415{
4416 if ((sec->flags & SEC_CODE) != 0
4417 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4418 && is_ppc64_elf (sec->owner))
4419 {
2c3f079f
AM
4420 if (abiversion (sec->owner) >= 2
4421 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
aa374f67
AM
4422 sec->has_toc_reloc = 1;
4423 }
4424 _bfd_elf_link_just_syms (sec, info);
4425}
4426
e054468f 4427static struct plt_entry **
4ce794b7
AM
4428update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4429 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
4430{
4431 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 4432 struct plt_entry **local_plt;
f961d9dd 4433 unsigned char *local_got_tls_masks;
411e1bfb
AM
4434
4435 if (local_got_ents == NULL)
4436 {
4437 bfd_size_type size = symtab_hdr->sh_info;
4438
e054468f
AM
4439 size *= (sizeof (*local_got_ents)
4440 + sizeof (*local_plt)
4441 + sizeof (*local_got_tls_masks));
4ce794b7 4442 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 4443 if (local_got_ents == NULL)
e054468f 4444 return NULL;
411e1bfb
AM
4445 elf_local_got_ents (abfd) = local_got_ents;
4446 }
4447
37da22e5 4448 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0)
411e1bfb
AM
4449 {
4450 struct got_entry *ent;
4451
4452 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
4453 if (ent->addend == r_addend
4454 && ent->owner == abfd
4455 && ent->tls_type == tls_type)
411e1bfb
AM
4456 break;
4457 if (ent == NULL)
4458 {
986f0783 4459 size_t amt = sizeof (*ent);
4ce794b7 4460 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4461 if (ent == NULL)
4462 return FALSE;
4463 ent->next = local_got_ents[r_symndx];
4464 ent->addend = r_addend;
e717da7e 4465 ent->owner = abfd;
411e1bfb 4466 ent->tls_type = tls_type;
927be08e 4467 ent->is_indirect = FALSE;
411e1bfb
AM
4468 ent->got.refcount = 0;
4469 local_got_ents[r_symndx] = ent;
4470 }
4471 ent->got.refcount += 1;
4472 }
4473
e054468f 4474 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 4475 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
37da22e5 4476 local_got_tls_masks[r_symndx] |= tls_type & 0xff;
e054468f
AM
4477
4478 return local_plt + r_symndx;
65f38f15
AM
4479}
4480
411e1bfb 4481static bfd_boolean
e054468f 4482update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 4483{
411e1bfb 4484 struct plt_entry *ent;
1e2f5b6e 4485
e054468f 4486 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
4487 if (ent->addend == addend)
4488 break;
4489 if (ent == NULL)
1e2f5b6e 4490 {
986f0783 4491 size_t amt = sizeof (*ent);
4ce794b7 4492 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4493 if (ent == NULL)
4494 return FALSE;
e054468f 4495 ent->next = *plist;
411e1bfb
AM
4496 ent->addend = addend;
4497 ent->plt.refcount = 0;
e054468f 4498 *plist = ent;
1e2f5b6e 4499 }
411e1bfb 4500 ent->plt.refcount += 1;
b34976b6 4501 return TRUE;
1e2f5b6e
AM
4502}
4503
e054468f
AM
4504static bfd_boolean
4505is_branch_reloc (enum elf_ppc64_reloc_type r_type)
4506{
4507 return (r_type == R_PPC64_REL24
05d0e962 4508 || r_type == R_PPC64_REL24_NOTOC
e054468f
AM
4509 || r_type == R_PPC64_REL14
4510 || r_type == R_PPC64_REL14_BRTAKEN
4511 || r_type == R_PPC64_REL14_BRNTAKEN
4512 || r_type == R_PPC64_ADDR24
4513 || r_type == R_PPC64_ADDR14
4514 || r_type == R_PPC64_ADDR14_BRTAKEN
23cedd1d 4515 || r_type == R_PPC64_ADDR14_BRNTAKEN
5663e321
AM
4516 || r_type == R_PPC64_PLTCALL
4517 || r_type == R_PPC64_PLTCALL_NOTOC);
23cedd1d
AM
4518}
4519
4520/* Relocs on inline plt call sequence insns prior to the call. */
4521
4522static bfd_boolean
4523is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type)
4524{
4525 return (r_type == R_PPC64_PLT16_HA
4526 || r_type == R_PPC64_PLT16_HI
4527 || r_type == R_PPC64_PLT16_LO
4528 || r_type == R_PPC64_PLT16_LO_DS
5663e321
AM
4529 || r_type == R_PPC64_PLT_PCREL34
4530 || r_type == R_PPC64_PLT_PCREL34_NOTOC
4531 || r_type == R_PPC64_PLTSEQ
4532 || r_type == R_PPC64_PLTSEQ_NOTOC);
e054468f
AM
4533}
4534
5bd4f169 4535/* Look through the relocs for a section during the first phase, and
65f38f15 4536 calculate needed space in the global offset table, procedure
5d1634d7 4537 linkage table, and dynamic reloc sections. */
5bd4f169 4538
b34976b6 4539static bfd_boolean
4ce794b7
AM
4540ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4541 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 4542{
65f38f15 4543 struct ppc_link_hash_table *htab;
5bd4f169 4544 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 4545 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
4546 const Elf_Internal_Rela *rel;
4547 const Elf_Internal_Rela *rel_end;
5bd4f169 4548 asection *sreloc;
3a71aa26 4549 struct elf_link_hash_entry *tga, *dottga;
b9399fcf 4550 bfd_boolean is_opd;
5bd4f169 4551
0e1862bb 4552 if (bfd_link_relocatable (info))
b34976b6 4553 return TRUE;
5bd4f169 4554
0c8d6e5c 4555 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 4556
65f38f15 4557 htab = ppc_hash_table (info);
4dfe6ac6
NC
4558 if (htab == NULL)
4559 return FALSE;
4560
3a71aa26
AM
4561 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4562 FALSE, FALSE, TRUE);
4563 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
4564 FALSE, FALSE, TRUE);
0ffa91dd 4565 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 4566 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 4567 sreloc = NULL;
b9399fcf 4568 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5bd4f169
AM
4569 rel_end = relocs + sec->reloc_count;
4570 for (rel = relocs; rel < rel_end; rel++)
4571 {
4572 unsigned long r_symndx;
4573 struct elf_link_hash_entry *h;
04c9666a 4574 enum elf_ppc64_reloc_type r_type;
727fc41e 4575 int tls_type;
7c8fe5c4 4576 struct _ppc64_elf_section_data *ppc64_sec;
cbf95972 4577 struct plt_entry **ifunc, **plt_list;
5bd4f169
AM
4578
4579 r_symndx = ELF64_R_SYM (rel->r_info);
4580 if (r_symndx < symtab_hdr->sh_info)
4581 h = NULL;
4582 else
973a3492
L
4583 {
4584 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 4585 h = elf_follow_link (h);
1c865ab2
AM
4586
4587 if (h == htab->elf.hgot)
4588 sec->has_toc_reloc = 1;
973a3492 4589 }
5bd4f169 4590
5663e321
AM
4591 r_type = ELF64_R_TYPE (rel->r_info);
4592 switch (r_type)
4593 {
04bdff6a
AM
4594 case R_PPC64_D34:
4595 case R_PPC64_D34_LO:
4596 case R_PPC64_D34_HI30:
4597 case R_PPC64_D34_HA30:
4598 case R_PPC64_D28:
c213164a
AM
4599 case R_PPC64_TPREL34:
4600 case R_PPC64_DTPREL34:
04bdff6a 4601 case R_PPC64_PCREL34:
5663e321 4602 case R_PPC64_GOT_PCREL34:
87c69f97
AM
4603 case R_PPC64_GOT_TLSGD_PCREL34:
4604 case R_PPC64_GOT_TLSLD_PCREL34:
4605 case R_PPC64_GOT_TPREL_PCREL34:
4606 case R_PPC64_GOT_DTPREL_PCREL34:
5663e321
AM
4607 case R_PPC64_PLT_PCREL34:
4608 case R_PPC64_PLT_PCREL34_NOTOC:
04bdff6a 4609 case R_PPC64_PCREL28:
7c1f4227 4610 htab->power10_stubs = 1;
133a1f60
AM
4611 break;
4612 default:
5663e321
AM
4613 break;
4614 }
903b777d
AM
4615
4616 switch (r_type)
4617 {
4618 case R_PPC64_PLT16_HA:
4619 case R_PPC64_GOT_TLSLD16_HA:
4620 case R_PPC64_GOT_TLSGD16_HA:
4621 case R_PPC64_GOT_TPREL16_HA:
4622 case R_PPC64_GOT_DTPREL16_HA:
4623 case R_PPC64_GOT16_HA:
4624 case R_PPC64_TOC16_HA:
4625 case R_PPC64_PLT16_LO:
4626 case R_PPC64_PLT16_LO_DS:
4627 case R_PPC64_GOT_TLSLD16_LO:
4628 case R_PPC64_GOT_TLSGD16_LO:
4629 case R_PPC64_GOT_TPREL16_LO_DS:
4630 case R_PPC64_GOT_DTPREL16_LO_DS:
4631 case R_PPC64_GOT16_LO:
4632 case R_PPC64_GOT16_LO_DS:
4633 case R_PPC64_TOC16_LO:
4634 case R_PPC64_TOC16_LO_DS:
4635 case R_PPC64_GOT_PCREL34:
4636 ppc64_elf_tdata (abfd)->has_optrel = 1;
4637 ppc64_elf_section_data (sec)->has_optrel = 1;
4638 break;
4639 default:
4640 break;
4641 }
4642
f749f26e 4643 ifunc = NULL;
25f23106
AM
4644 if (h != NULL)
4645 {
4646 if (h->type == STT_GNU_IFUNC)
4647 {
4648 h->needs_plt = 1;
4649 ifunc = &h->plt.plist;
4650 }
4651 }
4652 else
4653 {
4654 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4655 abfd, r_symndx);
4656 if (isym == NULL)
4657 return FALSE;
4658
4659 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4660 {
4661 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4662 rel->r_addend,
37da22e5 4663 NON_GOT | PLT_IFUNC);
25f23106
AM
4664 if (ifunc == NULL)
4665 return FALSE;
4666 }
4667 }
727fc41e 4668
f749f26e 4669 tls_type = 0;
a33d1f77 4670 switch (r_type)
5bd4f169 4671 {
727fc41e
AM
4672 case R_PPC64_TLSGD:
4673 case R_PPC64_TLSLD:
4674 /* These special tls relocs tie a call to __tls_get_addr with
4675 its parameter symbol. */
37da22e5 4676 if (h != NULL)
ed7007c1 4677 ppc_elf_hash_entry (h)->tls_mask |= TLS_TLS | TLS_MARK;
37da22e5
AM
4678 else
4679 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4680 rel->r_addend,
37da22e5
AM
4681 NON_GOT | TLS_TLS | TLS_MARK))
4682 return FALSE;
4683 sec->has_tls_reloc = 1;
727fc41e
AM
4684 break;
4685
411e1bfb
AM
4686 case R_PPC64_GOT_TLSLD16:
4687 case R_PPC64_GOT_TLSLD16_LO:
4688 case R_PPC64_GOT_TLSLD16_HI:
4689 case R_PPC64_GOT_TLSLD16_HA:
87c69f97 4690 case R_PPC64_GOT_TLSLD_PCREL34:
951fd09b 4691 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
4692 goto dogottls;
4693
4694 case R_PPC64_GOT_TLSGD16:
4695 case R_PPC64_GOT_TLSGD16_LO:
4696 case R_PPC64_GOT_TLSGD16_HI:
4697 case R_PPC64_GOT_TLSGD16_HA:
87c69f97 4698 case R_PPC64_GOT_TLSGD_PCREL34:
951fd09b 4699 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
4700 goto dogottls;
4701
4702 case R_PPC64_GOT_TPREL16_DS:
4703 case R_PPC64_GOT_TPREL16_LO_DS:
4704 case R_PPC64_GOT_TPREL16_HI:
4705 case R_PPC64_GOT_TPREL16_HA:
87c69f97 4706 case R_PPC64_GOT_TPREL_PCREL34:
7c8bbca5 4707 if (bfd_link_dll (info))
411e1bfb
AM
4708 info->flags |= DF_STATIC_TLS;
4709 tls_type = TLS_TLS | TLS_TPREL;
4710 goto dogottls;
4711
4712 case R_PPC64_GOT_DTPREL16_DS:
4713 case R_PPC64_GOT_DTPREL16_LO_DS:
4714 case R_PPC64_GOT_DTPREL16_HI:
4715 case R_PPC64_GOT_DTPREL16_HA:
87c69f97 4716 case R_PPC64_GOT_DTPREL_PCREL34:
411e1bfb
AM
4717 tls_type = TLS_TLS | TLS_DTPREL;
4718 dogottls:
4719 sec->has_tls_reloc = 1;
066f4018 4720 goto dogot;
411e1bfb 4721
903b777d
AM
4722 case R_PPC64_GOT16:
4723 case R_PPC64_GOT16_LO:
4724 case R_PPC64_GOT16_HI:
65f38f15 4725 case R_PPC64_GOT16_HA:
903b777d 4726 case R_PPC64_GOT16_DS:
066f4018 4727 case R_PPC64_GOT16_LO_DS:
4a421c53 4728 case R_PPC64_GOT_PCREL34:
066f4018 4729 dogot:
65f38f15 4730 /* This symbol requires a global offset table entry. */
4c52953f 4731 sec->has_toc_reloc = 1;
33c0ec9d
AM
4732 if (r_type == R_PPC64_GOT_TLSLD16
4733 || r_type == R_PPC64_GOT_TLSGD16
4734 || r_type == R_PPC64_GOT_TPREL16_DS
4735 || r_type == R_PPC64_GOT_DTPREL16_DS
4736 || r_type == R_PPC64_GOT16
4737 || r_type == R_PPC64_GOT16_DS)
4738 {
4739 htab->do_multi_toc = 1;
d77c8a4b 4740 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
4741 }
4742
e717da7e
AM
4743 if (ppc64_elf_tdata (abfd)->got == NULL
4744 && !create_got_section (abfd, info))
b34976b6 4745 return FALSE;
5bd4f169
AM
4746
4747 if (h != NULL)
4748 {
411e1bfb
AM
4749 struct ppc_link_hash_entry *eh;
4750 struct got_entry *ent;
65f38f15 4751
ed7007c1 4752 eh = ppc_elf_hash_entry (h);
411e1bfb 4753 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
133a1f60 4754 if (ent->addend == rel->r_addend
e717da7e 4755 && ent->owner == abfd
411e1bfb
AM
4756 && ent->tls_type == tls_type)
4757 break;
4758 if (ent == NULL)
5bd4f169 4759 {
986f0783 4760 size_t amt = sizeof (*ent);
4ce794b7 4761 ent = bfd_alloc (abfd, amt);
411e1bfb 4762 if (ent == NULL)
b34976b6 4763 return FALSE;
411e1bfb 4764 ent->next = eh->elf.got.glist;
133a1f60 4765 ent->addend = rel->r_addend;
e717da7e 4766 ent->owner = abfd;
411e1bfb 4767 ent->tls_type = tls_type;
927be08e 4768 ent->is_indirect = FALSE;
411e1bfb
AM
4769 ent->got.refcount = 0;
4770 eh->elf.got.glist = ent;
5bd4f169 4771 }
411e1bfb 4772 ent->got.refcount += 1;
e7b938ca 4773 eh->tls_mask |= tls_type;
5bd4f169 4774 }
411e1bfb
AM
4775 else
4776 /* This is a global offset table entry for a local symbol. */
4777 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4778 rel->r_addend, tls_type))
411e1bfb 4779 return FALSE;
5bd4f169
AM
4780 break;
4781
5bd4f169 4782 case R_PPC64_PLT16_HA:
65f38f15
AM
4783 case R_PPC64_PLT16_HI:
4784 case R_PPC64_PLT16_LO:
08be3224 4785 case R_PPC64_PLT16_LO_DS:
5663e321
AM
4786 case R_PPC64_PLT_PCREL34:
4787 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
4788 case R_PPC64_PLT32:
4789 case R_PPC64_PLT64:
cbf95972
AM
4790 /* This symbol requires a procedure linkage table entry. */
4791 plt_list = ifunc;
4792 if (h != NULL)
e054468f 4793 {
e054468f
AM
4794 h->needs_plt = 1;
4795 if (h->root.root.string[0] == '.'
4796 && h->root.root.string[1] != '\0')
ed7007c1
AM
4797 ppc_elf_hash_entry (h)->is_func = 1;
4798 ppc_elf_hash_entry (h)->tls_mask |= PLT_KEEP;
cbf95972
AM
4799 plt_list = &h->plt.plist;
4800 }
4801 if (plt_list == NULL)
2d7ad24e 4802 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4803 rel->r_addend,
2d7ad24e 4804 NON_GOT | PLT_KEEP);
133a1f60 4805 if (!update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4806 return FALSE;
5bd4f169
AM
4807 break;
4808
4809 /* The following relocations don't need to propagate the
4810 relocation if linking a shared object since they are
4811 section relative. */
4812 case R_PPC64_SECTOFF:
4813 case R_PPC64_SECTOFF_LO:
4814 case R_PPC64_SECTOFF_HI:
4815 case R_PPC64_SECTOFF_HA:
4816 case R_PPC64_SECTOFF_DS:
4817 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
4818 case R_PPC64_DTPREL16:
4819 case R_PPC64_DTPREL16_LO:
4820 case R_PPC64_DTPREL16_HI:
4821 case R_PPC64_DTPREL16_HA:
4822 case R_PPC64_DTPREL16_DS:
4823 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
4824 case R_PPC64_DTPREL16_HIGH:
4825 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
4826 case R_PPC64_DTPREL16_HIGHER:
4827 case R_PPC64_DTPREL16_HIGHERA:
4828 case R_PPC64_DTPREL16_HIGHEST:
4829 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
4830 break;
4831
ad8e1ba5 4832 /* Nor do these. */
25f23106
AM
4833 case R_PPC64_REL16:
4834 case R_PPC64_REL16_LO:
4835 case R_PPC64_REL16_HI:
4836 case R_PPC64_REL16_HA:
4a969973
AM
4837 case R_PPC64_REL16_HIGH:
4838 case R_PPC64_REL16_HIGHA:
4839 case R_PPC64_REL16_HIGHER:
4840 case R_PPC64_REL16_HIGHERA:
4841 case R_PPC64_REL16_HIGHEST:
4842 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
4843 case R_PPC64_REL16_HIGHER34:
4844 case R_PPC64_REL16_HIGHERA34:
4845 case R_PPC64_REL16_HIGHEST34:
4846 case R_PPC64_REL16_HIGHESTA34:
a680de9a 4847 case R_PPC64_REL16DX_HA:
25f23106
AM
4848 break;
4849
45965137
AM
4850 /* Not supported as a dynamic relocation. */
4851 case R_PPC64_ADDR64_LOCAL:
0e1862bb 4852 if (bfd_link_pic (info))
45965137
AM
4853 {
4854 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
4855 ppc_howto_init ();
695344c0 4856 /* xgettext:c-format */
174d0a74 4857 info->callbacks->einfo (_("%H: %s reloc unsupported "
cf97bcb0 4858 "in shared libraries and PIEs\n"),
45965137
AM
4859 abfd, sec, rel->r_offset,
4860 ppc64_elf_howto_table[r_type]->name);
4861 bfd_set_error (bfd_error_bad_value);
4862 return FALSE;
4863 }
4864 break;
4865
ad8e1ba5 4866 case R_PPC64_TOC16:
33c0ec9d
AM
4867 case R_PPC64_TOC16_DS:
4868 htab->do_multi_toc = 1;
d77c8a4b 4869 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
1a0670f3 4870 /* Fall through. */
ad8e1ba5
AM
4871 case R_PPC64_TOC16_LO:
4872 case R_PPC64_TOC16_HI:
4873 case R_PPC64_TOC16_HA:
ad8e1ba5 4874 case R_PPC64_TOC16_LO_DS:
4c52953f 4875 sec->has_toc_reloc = 1;
ec73ddcd 4876 if (h != NULL && bfd_link_executable (info))
1bdd8fac
AM
4877 {
4878 /* We may need a copy reloc. */
4879 h->non_got_ref = 1;
4880 /* Strongly prefer a copy reloc over a dynamic reloc.
4881 glibc ld.so as of 2019-08 will error out if one of
4882 these relocations is emitted. */
4883 h->needs_copy = 1;
4884 goto dodyn;
4885 }
ad8e1ba5
AM
4886 break;
4887
006589cf
AM
4888 /* Marker reloc. */
4889 case R_PPC64_ENTRY:
4890 break;
4891
5bd4f169
AM
4892 /* This relocation describes the C++ object vtable hierarchy.
4893 Reconstruct it for later use during GC. */
4894 case R_PPC64_GNU_VTINHERIT:
c152c796 4895 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 4896 return FALSE;
5bd4f169
AM
4897 break;
4898
4899 /* This relocation describes which C++ vtable entries are actually
4900 used. Record for later use during GC. */
4901 case R_PPC64_GNU_VTENTRY:
a0ea3a14 4902 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 4903 return FALSE;
5bd4f169
AM
4904 break;
4905
721956f4
AM
4906 case R_PPC64_REL14:
4907 case R_PPC64_REL14_BRTAKEN:
4908 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
4909 {
4910 asection *dest = NULL;
4911
4912 /* Heuristic: If jumping outside our section, chances are
4913 we are going to need a stub. */
4914 if (h != NULL)
4915 {
4916 /* If the sym is weak it may be overridden later, so
4917 don't assume we know where a weak sym lives. */
4918 if (h->root.type == bfd_link_hash_defined)
4919 dest = h->root.u.def.section;
4920 }
4921 else
87d72d41
AM
4922 {
4923 Elf_Internal_Sym *isym;
4924
4925 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4926 abfd, r_symndx);
4927 if (isym == NULL)
4928 return FALSE;
4929
4930 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
4931 }
4932
220c76dd 4933 if (dest != sec)
7c8fe5c4 4934 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 4935 }
3e04d765
AM
4936 goto rel24;
4937
4938 case R_PPC64_PLTCALL:
5663e321 4939 case R_PPC64_PLTCALL_NOTOC:
3e04d765 4940 ppc64_elf_section_data (sec)->has_pltcall = 1;
721956f4
AM
4941 /* Fall through. */
4942
5d1634d7 4943 case R_PPC64_REL24:
05d0e962 4944 case R_PPC64_REL24_NOTOC:
3e04d765 4945 rel24:
cbf95972
AM
4946 plt_list = ifunc;
4947 if (h != NULL)
5d1634d7 4948 {
e054468f
AM
4949 h->needs_plt = 1;
4950 if (h->root.root.string[0] == '.'
4951 && h->root.root.string[1] != '\0')
ed7007c1 4952 ppc_elf_hash_entry (h)->is_func = 1;
cbf95972 4953
3a71aa26 4954 if (h == tga || h == dottga)
cbf95972
AM
4955 {
4956 sec->has_tls_reloc = 1;
4957 if (rel != relocs
4958 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
4959 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
4960 /* We have a new-style __tls_get_addr call with
4961 a marker reloc. */
4962 ;
4963 else
4964 /* Mark this section as having an old-style call. */
9737e8af 4965 sec->nomark_tls_get_addr = 1;
cbf95972
AM
4966 }
4967 plt_list = &h->plt.plist;
411e1bfb 4968 }
cbf95972
AM
4969
4970 /* We may need a .plt entry if the function this reloc
4971 refers to is in a shared lib. */
4972 if (plt_list
133a1f60 4973 && !update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4974 return FALSE;
411e1bfb
AM
4975 break;
4976
cbf95972
AM
4977 case R_PPC64_ADDR14:
4978 case R_PPC64_ADDR14_BRNTAKEN:
4979 case R_PPC64_ADDR14_BRTAKEN:
4980 case R_PPC64_ADDR24:
4981 goto dodyn;
4982
411e1bfb
AM
4983 case R_PPC64_TPREL64:
4984 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
7c8bbca5 4985 if (bfd_link_dll (info))
411e1bfb
AM
4986 info->flags |= DF_STATIC_TLS;
4987 goto dotlstoc;
4988
4989 case R_PPC64_DTPMOD64:
4990 if (rel + 1 < rel_end
4991 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4992 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 4993 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 4994 else
951fd09b 4995 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
4996 goto dotlstoc;
4997
4998 case R_PPC64_DTPREL64:
4999 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5000 if (rel != relocs
5001 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5002 && rel[-1].r_offset == rel->r_offset - 8)
5003 /* This is the second reloc of a dtpmod, dtprel pair.
5004 Don't mark with TLS_DTPREL. */
5005 goto dodyn;
5006
5007 dotlstoc:
5008 sec->has_tls_reloc = 1;
5009 if (h != NULL)
ed7007c1 5010 ppc_elf_hash_entry (h)->tls_mask |= tls_type & 0xff;
411e1bfb
AM
5011 else
5012 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 5013 rel->r_addend, tls_type))
411e1bfb
AM
5014 return FALSE;
5015
7c8fe5c4
AM
5016 ppc64_sec = ppc64_elf_section_data (sec);
5017 if (ppc64_sec->sec_type != sec_toc)
411e1bfb 5018 {
3a71aa26
AM
5019 bfd_size_type amt;
5020
e7b938ca 5021 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5022 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5023 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5024 if (ppc64_sec->u.toc.symndx == NULL)
5025 return FALSE;
5026 amt = sec->size * sizeof (bfd_vma) / 8;
5027 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5028 if (ppc64_sec->u.toc.add == NULL)
411e1bfb 5029 return FALSE;
7c8fe5c4
AM
5030 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5031 ppc64_sec->sec_type = sec_toc;
411e1bfb
AM
5032 }
5033 BFD_ASSERT (rel->r_offset % 8 == 0);
3a71aa26 5034 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
133a1f60 5035 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5036
5037 /* Mark the second slot of a GD or LD entry.
5038 -1 to indicate GD and -2 to indicate LD. */
5039 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5040 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5041 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5042 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5043 goto dodyn;
5044
5045 case R_PPC64_TPREL16:
5046 case R_PPC64_TPREL16_LO:
5047 case R_PPC64_TPREL16_HI:
5048 case R_PPC64_TPREL16_HA:
5049 case R_PPC64_TPREL16_DS:
5050 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
5051 case R_PPC64_TPREL16_HIGH:
5052 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5053 case R_PPC64_TPREL16_HIGHER:
5054 case R_PPC64_TPREL16_HIGHERA:
5055 case R_PPC64_TPREL16_HIGHEST:
5056 case R_PPC64_TPREL16_HIGHESTA:
c213164a 5057 case R_PPC64_TPREL34:
7c8bbca5
AM
5058 if (bfd_link_dll (info))
5059 info->flags |= DF_STATIC_TLS;
5060 goto dodyn;
5d1634d7 5061
e86ce104 5062 case R_PPC64_ADDR64:
b9399fcf 5063 if (is_opd
1e2f5b6e 5064 && rel + 1 < rel_end
4ce794b7 5065 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 5066 {
8387904d 5067 if (h != NULL)
ed7007c1 5068 ppc_elf_hash_entry (h)->is_func = 1;
1e2f5b6e 5069 }
e86ce104
AM
5070 /* Fall through. */
5071
65f38f15
AM
5072 case R_PPC64_ADDR16:
5073 case R_PPC64_ADDR16_DS:
5074 case R_PPC64_ADDR16_HA:
5075 case R_PPC64_ADDR16_HI:
f9c6b907
AM
5076 case R_PPC64_ADDR16_HIGH:
5077 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
5078 case R_PPC64_ADDR16_HIGHER:
5079 case R_PPC64_ADDR16_HIGHERA:
5080 case R_PPC64_ADDR16_HIGHEST:
5081 case R_PPC64_ADDR16_HIGHESTA:
5082 case R_PPC64_ADDR16_LO:
5083 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
5084 case R_PPC64_D34:
5085 case R_PPC64_D34_LO:
5086 case R_PPC64_D34_HI30:
5087 case R_PPC64_D34_HA30:
5088 case R_PPC64_ADDR16_HIGHER34:
5089 case R_PPC64_ADDR16_HIGHERA34:
5090 case R_PPC64_ADDR16_HIGHEST34:
5091 case R_PPC64_ADDR16_HIGHESTA34:
5092 case R_PPC64_D28:
0e1862bb 5093 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
a345bc8d
AM
5094 && rel->r_addend == 0)
5095 {
5096 /* We may need a .plt entry if this reloc refers to a
5097 function in a shared lib. */
5663e321 5098 if (!update_plt_info (abfd, &h->plt.plist, 0))
a345bc8d
AM
5099 return FALSE;
5100 h->pointer_equality_needed = 1;
5101 }
5102 /* Fall through. */
5103
5104 case R_PPC64_REL30:
5105 case R_PPC64_REL32:
5106 case R_PPC64_REL64:
65f38f15 5107 case R_PPC64_ADDR32:
65f38f15
AM
5108 case R_PPC64_UADDR16:
5109 case R_PPC64_UADDR32:
5110 case R_PPC64_UADDR64:
5bd4f169 5111 case R_PPC64_TOC:
ec73ddcd 5112 if (h != NULL && bfd_link_executable (info))
81848ca0 5113 /* We may need a copy reloc. */
f5385ebf 5114 h->non_got_ref = 1;
81848ca0 5115
41bd81ab 5116 /* Don't propagate .opd relocs. */
b9399fcf 5117 if (NO_OPD_RELOCS && is_opd)
e86ce104 5118 break;
e86ce104 5119
65f38f15
AM
5120 /* If we are creating a shared library, and this is a reloc
5121 against a global symbol, or a non PC relative reloc
5122 against a local symbol, then we need to copy the reloc
5123 into the shared library. However, if we are linking with
5124 -Bsymbolic, we do not need to copy a reloc against a
5125 global symbol which is defined in an object we are
5126 including in the link (i.e., DEF_REGULAR is set). At
5127 this point we have not seen all the input files, so it is
5128 possible that DEF_REGULAR is not set now but will be set
5129 later (it is never cleared). In case of a weak definition,
5130 DEF_REGULAR may be cleared later by a strong definition in
5131 a shared library. We account for that possibility below by
f4656909 5132 storing information in the dyn_relocs field of the hash
65f38f15
AM
5133 table entry. A similar situation occurs when creating
5134 shared libraries and symbol visibility changes render the
5135 symbol local.
5136
5137 If on the other hand, we are creating an executable, we
5138 may need to keep relocations for symbols satisfied by a
5139 dynamic library if we manage to avoid copy relocs for the
5140 symbol. */
411e1bfb 5141 dodyn:
ec73ddcd
AM
5142 if ((h != NULL
5143 && (h->root.type == bfd_link_hash_defweak
5144 || !h->def_regular))
5145 || (h != NULL
5146 && !bfd_link_executable (info)
5147 && !SYMBOLIC_BIND (info, h))
5148 || (bfd_link_pic (info)
5149 && must_be_dyn_reloc (info, r_type))
0e1862bb 5150 || (!bfd_link_pic (info)
25f23106 5151 && ifunc != NULL))
5bd4f169 5152 {
65f38f15
AM
5153 /* We must copy these reloc types into the output file.
5154 Create a reloc section in dynobj and make room for
5155 this reloc. */
5bd4f169
AM
5156 if (sreloc == NULL)
5157 {
83bac4b0
NC
5158 sreloc = _bfd_elf_make_dynamic_reloc_section
5159 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
65f38f15 5160
5bd4f169 5161 if (sreloc == NULL)
83bac4b0 5162 return FALSE;
5bd4f169
AM
5163 }
5164
65f38f15
AM
5165 /* If this is a global symbol, we count the number of
5166 relocations we need for this symbol. */
5167 if (h != NULL)
5168 {
19e08130
AM
5169 struct elf_dyn_relocs *p;
5170 struct elf_dyn_relocs **head;
5171
190eb1dd 5172 head = &h->dyn_relocs;
19e08130
AM
5173 p = *head;
5174 if (p == NULL || p->sec != sec)
5175 {
5176 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5177 if (p == NULL)
5178 return FALSE;
5179 p->next = *head;
5180 *head = p;
5181 p->sec = sec;
5182 p->count = 0;
5183 p->pc_count = 0;
5184 }
5185 p->count += 1;
5186 if (!must_be_dyn_reloc (info, r_type))
5187 p->pc_count += 1;
65f38f15
AM
5188 }
5189 else
5190 {
ec338859
AM
5191 /* Track dynamic relocs needed for local syms too.
5192 We really need local syms available to do this
5193 easily. Oh well. */
19e08130
AM
5194 struct ppc_dyn_relocs *p;
5195 struct ppc_dyn_relocs **head;
5196 bfd_boolean is_ifunc;
ec338859 5197 asection *s;
6edfbbad 5198 void *vpp;
87d72d41 5199 Elf_Internal_Sym *isym;
6edfbbad 5200
87d72d41
AM
5201 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5202 abfd, r_symndx);
5203 if (isym == NULL)
b34976b6 5204 return FALSE;
ec338859 5205
87d72d41
AM
5206 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5207 if (s == NULL)
5208 s = sec;
5209
6edfbbad 5210 vpp = &elf_section_data (s)->local_dynrel;
19e08130
AM
5211 head = (struct ppc_dyn_relocs **) vpp;
5212 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5213 p = *head;
5214 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5215 p = p->next;
5216 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5217 {
5218 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5219 if (p == NULL)
5220 return FALSE;
5221 p->next = *head;
5222 *head = p;
5223 p->sec = sec;
5224 p->ifunc = is_ifunc;
5225 p->count = 0;
5226 }
5227 p->count += 1;
ec338859 5228 }
65f38f15 5229 }
5bd4f169 5230 break;
65f38f15
AM
5231
5232 default:
96e0dda4 5233 break;
5bd4f169
AM
5234 }
5235 }
5236
b34976b6 5237 return TRUE;
5bd4f169
AM
5238}
5239
ee67d69a
AM
5240/* Merge backend specific data from an object file to the output
5241 object file when linking. */
5242
5243static bfd_boolean
50e03d47 5244ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
ee67d69a 5245{
50e03d47 5246 bfd *obfd = info->output_bfd;
ee67d69a
AM
5247 unsigned long iflags, oflags;
5248
5249 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5250 return TRUE;
5251
5252 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5253 return TRUE;
5254
50e03d47 5255 if (!_bfd_generic_verify_endian_match (ibfd, info))
ee67d69a
AM
5256 return FALSE;
5257
5258 iflags = elf_elfheader (ibfd)->e_flags;
5259 oflags = elf_elfheader (obfd)->e_flags;
5260
f6c7c3e8 5261 if (iflags & ~EF_PPC64_ABI)
ee67d69a 5262 {
4eca0228 5263 _bfd_error_handler
695344c0 5264 /* xgettext:c-format */
871b3ab2 5265 (_("%pB uses unknown e_flags 0x%lx"), ibfd, iflags);
ee67d69a
AM
5266 bfd_set_error (bfd_error_bad_value);
5267 return FALSE;
5268 }
f6c7c3e8 5269 else if (iflags != oflags && iflags != 0)
ee67d69a 5270 {
4eca0228 5271 _bfd_error_handler
695344c0 5272 /* xgettext:c-format */
871b3ab2 5273 (_("%pB: ABI version %ld is not compatible with ABI version %ld output"),
ee67d69a
AM
5274 ibfd, iflags, oflags);
5275 bfd_set_error (bfd_error_bad_value);
5276 return FALSE;
5277 }
5278
4a91d0ba
AM
5279 if (!_bfd_elf_ppc_merge_fp_attributes (ibfd, info))
5280 return FALSE;
005d79fd 5281
ee67d69a 5282 /* Merge Tag_compatibility attributes and any common GNU ones. */
8d2c8c3d 5283 return _bfd_elf_merge_object_attributes (ibfd, info);
ee67d69a
AM
5284}
5285
5286static bfd_boolean
5287ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5288{
5289 /* Print normal ELF private data. */
5290 _bfd_elf_print_private_bfd_data (abfd, ptr);
5291
5292 if (elf_elfheader (abfd)->e_flags != 0)
5293 {
5294 FILE *file = ptr;
5295
ee67d69a
AM
5296 fprintf (file, _("private flags = 0x%lx:"),
5297 elf_elfheader (abfd)->e_flags);
5298
5299 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5300 fprintf (file, _(" [abiv%ld]"),
5301 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5302 fputc ('\n', file);
5303 }
5304
5305 return TRUE;
5306}
5307
8387904d 5308/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
b53dfeb2
AM
5309 of the code entry point, and its section, which must be in the same
5310 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
8387904d
AM
5311
5312static bfd_vma
5313opd_entry_value (asection *opd_sec,
5314 bfd_vma offset,
5315 asection **code_sec,
aef36ac1
AM
5316 bfd_vma *code_off,
5317 bfd_boolean in_code_sec)
8387904d
AM
5318{
5319 bfd *opd_bfd = opd_sec->owner;
8860955f 5320 Elf_Internal_Rela *relocs;
8387904d 5321 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 5322 bfd_vma val;
8387904d 5323
9f296da3
AM
5324 /* No relocs implies we are linking a --just-symbols object, or looking
5325 at a final linked executable with addr2line or somesuch. */
4b85d634
AM
5326 if (opd_sec->reloc_count == 0)
5327 {
729eabd5 5328 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
3b36f7e6 5329
729eabd5
AM
5330 if (contents == NULL)
5331 {
5332 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5333 return (bfd_vma) -1;
5334 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5335 }
ee1e4ede 5336
dbb3fbbb 5337 /* PR 17512: file: 64b9dfbb. */
451dfd38 5338 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
dbb3fbbb
NC
5339 return (bfd_vma) -1;
5340
729eabd5 5341 val = bfd_get_64 (opd_bfd, contents + offset);
aef36ac1
AM
5342 if (code_sec != NULL)
5343 {
5344 asection *sec, *likely = NULL;
ee1e4ede 5345
aef36ac1 5346 if (in_code_sec)
4b85d634 5347 {
aef36ac1
AM
5348 sec = *code_sec;
5349 if (sec->vma <= val
5350 && val < sec->vma + sec->size)
5351 likely = sec;
5352 else
5353 val = -1;
5354 }
5355 else
5356 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5357 if (sec->vma <= val
5358 && (sec->flags & SEC_LOAD) != 0
5359 && (sec->flags & SEC_ALLOC) != 0)
5360 likely = sec;
5361 if (likely != NULL)
5362 {
5363 *code_sec = likely;
5364 if (code_off != NULL)
5365 *code_off = val - likely->vma;
4b85d634
AM
5366 }
5367 }
aef36ac1 5368 return val;
4b85d634
AM
5369 }
5370
0c8d6e5c 5371 BFD_ASSERT (is_ppc64_elf (opd_bfd));
0ffa91dd 5372
729eabd5 5373 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
8860955f
AM
5374 if (relocs == NULL)
5375 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
877a8638
NC
5376 /* PR 17512: file: df8e1fd6. */
5377 if (relocs == NULL)
5378 return (bfd_vma) -1;
645ea6a9 5379
8387904d 5380 /* Go find the opd reloc at the sym address. */
8860955f 5381 lo = relocs;
8387904d 5382 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 5383 val = (bfd_vma) -1;
8387904d
AM
5384 while (lo < hi)
5385 {
5386 look = lo + (hi - lo) / 2;
5387 if (look->r_offset < offset)
5388 lo = look + 1;
5389 else if (look->r_offset > offset)
5390 hi = look;
5391 else
5392 {
0ffa91dd
NC
5393 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5394
8387904d
AM
5395 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5396 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5397 {
5398 unsigned long symndx = ELF64_R_SYM (look->r_info);
b53dfeb2 5399 asection *sec = NULL;
8387904d 5400
b53dfeb2
AM
5401 if (symndx >= symtab_hdr->sh_info
5402 && elf_sym_hashes (opd_bfd) != NULL)
8387904d
AM
5403 {
5404 struct elf_link_hash_entry **sym_hashes;
5405 struct elf_link_hash_entry *rh;
5406
5407 sym_hashes = elf_sym_hashes (opd_bfd);
5408 rh = sym_hashes[symndx - symtab_hdr->sh_info];
128205bb
AM
5409 if (rh != NULL)
5410 {
5411 rh = elf_follow_link (rh);
bb854a36
AM
5412 if (rh->root.type != bfd_link_hash_defined
5413 && rh->root.type != bfd_link_hash_defweak)
5414 break;
5415 if (rh->root.u.def.section->owner == opd_bfd)
b53dfeb2 5416 {
bb854a36
AM
5417 val = rh->root.u.def.value;
5418 sec = rh->root.u.def.section;
b53dfeb2
AM
5419 }
5420 }
5421 }
5422
5423 if (sec == NULL)
5424 {
5425 Elf_Internal_Sym *sym;
5426
5427 if (symndx < symtab_hdr->sh_info)
5428 {
5429 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5430 if (sym == NULL)
5431 {
5432 size_t symcnt = symtab_hdr->sh_info;
5433 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5434 symcnt, 0,
5435 NULL, NULL, NULL);
5436 if (sym == NULL)
5437 break;
5438 symtab_hdr->contents = (bfd_byte *) sym;
5439 }
5440 sym += symndx;
128205bb
AM
5441 }
5442 else
5443 {
b53dfeb2
AM
5444 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5445 1, symndx,
5446 NULL, NULL, NULL);
128205bb
AM
5447 if (sym == NULL)
5448 break;
128205bb 5449 }
b53dfeb2
AM
5450 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5451 if (sec == NULL)
5452 break;
5453 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5454 val = sym->st_value;
8387904d 5455 }
b53dfeb2 5456
8387904d
AM
5457 val += look->r_addend;
5458 if (code_off != NULL)
5459 *code_off = val;
5460 if (code_sec != NULL)
aef36ac1
AM
5461 {
5462 if (in_code_sec && *code_sec != sec)
5463 return -1;
5464 else
5465 *code_sec = sec;
5466 }
b53dfeb2 5467 if (sec->output_section != NULL)
8387904d 5468 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
5469 }
5470 break;
5471 }
5472 }
645ea6a9 5473
645ea6a9 5474 return val;
8387904d
AM
5475}
5476
aef36ac1
AM
5477/* If the ELF symbol SYM might be a function in SEC, return the
5478 function size and set *CODE_OFF to the function's entry point,
5479 otherwise return zero. */
9f296da3 5480
aef36ac1
AM
5481static bfd_size_type
5482ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
5483 bfd_vma *code_off)
9f296da3 5484{
aef36ac1
AM
5485 bfd_size_type size;
5486
5487 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
5488 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
5489 return 0;
5490
5491 size = 0;
5492 if (!(sym->flags & BSF_SYNTHETIC))
5493 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
5494
5495 if (strcmp (sym->section->name, ".opd") == 0)
9f296da3 5496 {
b07bca4e
AM
5497 struct _opd_sec_data *opd = get_opd_info (sym->section);
5498 bfd_vma symval = sym->value;
5499
5500 if (opd != NULL
5501 && opd->adjust != NULL
5502 && elf_section_data (sym->section)->relocs != NULL)
5503 {
5504 /* opd_entry_value will use cached relocs that have been
5505 adjusted, but with raw symbols. That means both local
5506 and global symbols need adjusting. */
5507 long adjust = opd->adjust[OPD_NDX (symval)];
5508 if (adjust == -1)
5509 return 0;
5510 symval += adjust;
5511 }
5512
5513 if (opd_entry_value (sym->section, symval,
aef36ac1
AM
5514 &sec, code_off, TRUE) == (bfd_vma) -1)
5515 return 0;
5516 /* An old ABI binary with dot-syms has a size of 24 on the .opd
5517 symbol. This size has nothing to do with the code size of the
5518 function, which is what we're supposed to return, but the
5519 code size isn't available without looking up the dot-sym.
5520 However, doing that would be a waste of time particularly
5521 since elf_find_function will look at the dot-sym anyway.
5522 Now, elf_find_function will keep the largest size of any
5523 function sym found at the code address of interest, so return
5524 1 here to avoid it incorrectly caching a larger function size
5525 for a small function. This does mean we return the wrong
5526 size for a new-ABI function of size 24, but all that does is
5527 disable caching for such functions. */
5528 if (size == 24)
5529 size = 1;
9f296da3 5530 }
aef36ac1
AM
5531 else
5532 {
5533 if (sym->section != sec)
5534 return 0;
5535 *code_off = sym->value;
5536 }
5537 if (size == 0)
5538 size = 1;
5539 return size;
9f296da3
AM
5540}
5541
f378ab09
AM
5542/* Return true if symbol is a strong function defined in an ELFv2
5543 object with st_other localentry bits of zero, ie. its local entry
5544 point coincides with its global entry point. */
5545
5546static bfd_boolean
5547is_elfv2_localentry0 (struct elf_link_hash_entry *h)
5548{
5549 return (h != NULL
5550 && h->type == STT_FUNC
5551 && h->root.type == bfd_link_hash_defined
5552 && (STO_PPC64_LOCAL_MASK & h->other) == 0
ed7007c1 5553 && !ppc_elf_hash_entry (h)->non_zero_localentry
f378ab09
AM
5554 && is_ppc64_elf (h->root.u.def.section->owner)
5555 && abiversion (h->root.u.def.section->owner) >= 2);
5556}
5557
854b41e7
AM
5558/* Return true if symbol is defined in a regular object file. */
5559
5560static bfd_boolean
5561is_static_defined (struct elf_link_hash_entry *h)
5562{
5563 return ((h->root.type == bfd_link_hash_defined
5564 || h->root.type == bfd_link_hash_defweak)
5565 && h->root.u.def.section != NULL
5566 && h->root.u.def.section->output_section != NULL);
5567}
5568
b31867b6
AM
5569/* If FDH is a function descriptor symbol, return the associated code
5570 entry symbol if it is defined. Return NULL otherwise. */
5571
5572static struct ppc_link_hash_entry *
5573defined_code_entry (struct ppc_link_hash_entry *fdh)
5574{
5575 if (fdh->is_func_descriptor)
5576 {
5577 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
5578 if (fh->elf.root.type == bfd_link_hash_defined
5579 || fh->elf.root.type == bfd_link_hash_defweak)
5580 return fh;
5581 }
5582 return NULL;
5583}
5584
5585/* If FH is a function code entry symbol, return the associated
5586 function descriptor symbol if it is defined. Return NULL otherwise. */
5587
5588static struct ppc_link_hash_entry *
5589defined_func_desc (struct ppc_link_hash_entry *fh)
5590{
5591 if (fh->oh != NULL
5592 && fh->oh->is_func_descriptor)
5593 {
5594 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
5595 if (fdh->elf.root.type == bfd_link_hash_defined
5596 || fdh->elf.root.type == bfd_link_hash_defweak)
5597 return fdh;
5598 }
5599 return NULL;
5600}
5601
ed7007c1
AM
5602/* Given H is a symbol that satisfies is_static_defined, return the
5603 value in the output file. */
5604
5605static bfd_vma
5606defined_sym_val (struct elf_link_hash_entry *h)
5607{
5608 return (h->root.u.def.section->output_section->vma
5609 + h->root.u.def.section->output_offset
5610 + h->root.u.def.value);
5611}
5612
5613/* Return true if H matches __tls_get_addr or one of its variants. */
5614
5615static bfd_boolean
5616is_tls_get_addr (struct elf_link_hash_entry *h,
5617 struct ppc_link_hash_table *htab)
5618{
9e7028aa
AM
5619 return (h == &htab->tls_get_addr_fd->elf || h == &htab->tga_desc_fd->elf
5620 || h == &htab->tls_get_addr->elf || h == &htab->tga_desc->elf);
ed7007c1
AM
5621}
5622
8c5b4e52
AM
5623static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
5624
5625/* Garbage collect sections, after first dealing with dot-symbols. */
5626
5627static bfd_boolean
5628ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
5629{
5630 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5631
5632 if (htab != NULL && htab->need_func_desc_adj)
5633 {
5634 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5635 htab->need_func_desc_adj = 0;
5636 }
5637 return bfd_elf_gc_sections (abfd, info);
5638}
5639
74f0fb50
AM
5640/* Mark all our entry sym sections, both opd and code section. */
5641
5642static void
5643ppc64_elf_gc_keep (struct bfd_link_info *info)
5644{
5645 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5646 struct bfd_sym_chain *sym;
5647
4dfe6ac6
NC
5648 if (htab == NULL)
5649 return;
5650
74f0fb50
AM
5651 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5652 {
b31867b6 5653 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
5654 asection *sec;
5655
ed7007c1
AM
5656 eh = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, sym->name,
5657 FALSE, FALSE, TRUE));
74f0fb50
AM
5658 if (eh == NULL)
5659 continue;
5660 if (eh->elf.root.type != bfd_link_hash_defined
5661 && eh->elf.root.type != bfd_link_hash_defweak)
5662 continue;
5663
b31867b6
AM
5664 fh = defined_code_entry (eh);
5665 if (fh != NULL)
74f0fb50 5666 {
b31867b6 5667 sec = fh->elf.root.u.def.section;
74f0fb50
AM
5668 sec->flags |= SEC_KEEP;
5669 }
5670 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5671 && opd_entry_value (eh->elf.root.u.def.section,
5672 eh->elf.root.u.def.value,
aef36ac1 5673 &sec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50
AM
5674 sec->flags |= SEC_KEEP;
5675
5676 sec = eh->elf.root.u.def.section;
5677 sec->flags |= SEC_KEEP;
5678 }
5679}
5680
64d03ab5
AM
5681/* Mark sections containing dynamically referenced symbols. When
5682 building shared libraries, we must assume that any visible symbol is
5683 referenced. */
5684
5685static bfd_boolean
5686ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5687{
5688 struct bfd_link_info *info = (struct bfd_link_info *) inf;
ed7007c1 5689 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
b31867b6 5690 struct ppc_link_hash_entry *fdh;
b407645f 5691 struct bfd_elf_dynamic_list *d = info->dynamic_list;
64d03ab5 5692
64d03ab5 5693 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
5694 fdh = defined_func_desc (eh);
5695 if (fdh != NULL)
5696 eh = fdh;
64d03ab5
AM
5697
5698 if ((eh->elf.root.type == bfd_link_hash_defined
5699 || eh->elf.root.type == bfd_link_hash_defweak)
87e79a65 5700 && ((eh->elf.ref_dynamic && !eh->elf.forced_local)
1c9177d9 5701 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
64d03ab5 5702 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8 5703 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
0e1862bb 5704 && (!bfd_link_executable (info)
e278ae05 5705 || info->gc_keep_exported
b407645f
AM
5706 || info->export_dynamic
5707 || (eh->elf.dynamic
5708 && d != NULL
2cdcc330
AM
5709 && (*d->match) (&d->head, NULL,
5710 eh->elf.root.root.string)))
e278ae05 5711 && (eh->elf.versioned >= versioned
4c58e0d8
AM
5712 || !bfd_hide_sym_by_version (info->version_info,
5713 eh->elf.root.root.string)))))
64d03ab5
AM
5714 {
5715 asection *code_sec;
b31867b6 5716 struct ppc_link_hash_entry *fh;
64d03ab5
AM
5717
5718 eh->elf.root.u.def.section->flags |= SEC_KEEP;
5719
5720 /* Function descriptor syms cause the associated
5721 function code sym section to be marked. */
b31867b6
AM
5722 fh = defined_code_entry (eh);
5723 if (fh != NULL)
5724 {
5725 code_sec = fh->elf.root.u.def.section;
5726 code_sec->flags |= SEC_KEEP;
5727 }
64d03ab5
AM
5728 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5729 && opd_entry_value (eh->elf.root.u.def.section,
5730 eh->elf.root.u.def.value,
aef36ac1 5731 &code_sec, NULL, FALSE) != (bfd_vma) -1)
64d03ab5
AM
5732 code_sec->flags |= SEC_KEEP;
5733 }
5734
5735 return TRUE;
5736}
5737
5bd4f169
AM
5738/* Return the section that should be marked against GC for a given
5739 relocation. */
5740
5741static asection *
4ce794b7 5742ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 5743 struct bfd_link_info *info,
4ce794b7
AM
5744 Elf_Internal_Rela *rel,
5745 struct elf_link_hash_entry *h,
5746 Elf_Internal_Sym *sym)
5bd4f169 5747{
ccfa59ea
AM
5748 asection *rsec;
5749
ccfa59ea
AM
5750 /* Syms return NULL if we're marking .opd, so we avoid marking all
5751 function sections, as all functions are referenced in .opd. */
5752 rsec = NULL;
5753 if (get_opd_info (sec) != NULL)
5754 return rsec;
1e2f5b6e 5755
5bd4f169
AM
5756 if (h != NULL)
5757 {
04c9666a 5758 enum elf_ppc64_reloc_type r_type;
b31867b6 5759 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 5760
4ce794b7 5761 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 5762 switch (r_type)
5bd4f169
AM
5763 {
5764 case R_PPC64_GNU_VTINHERIT:
5765 case R_PPC64_GNU_VTENTRY:
5766 break;
5767
5768 default:
5769 switch (h->root.type)
5770 {
5771 case bfd_link_hash_defined:
5772 case bfd_link_hash_defweak:
ed7007c1 5773 eh = ppc_elf_hash_entry (h);
b31867b6
AM
5774 fdh = defined_func_desc (eh);
5775 if (fdh != NULL)
8c5b4e52
AM
5776 {
5777 /* -mcall-aixdesc code references the dot-symbol on
5778 a call reloc. Mark the function descriptor too
5779 against garbage collection. */
5780 fdh->elf.mark = 1;
60d67dc8
AM
5781 if (fdh->elf.is_weakalias)
5782 weakdef (&fdh->elf)->mark = 1;
8c5b4e52
AM
5783 eh = fdh;
5784 }
1e2f5b6e
AM
5785
5786 /* Function descriptor syms cause the associated
5787 function code sym section to be marked. */
b31867b6
AM
5788 fh = defined_code_entry (eh);
5789 if (fh != NULL)
ccfa59ea
AM
5790 {
5791 /* They also mark their opd section. */
74f0fb50 5792 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5793
b31867b6 5794 rsec = fh->elf.root.u.def.section;
ccfa59ea 5795 }
8387904d
AM
5796 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5797 && opd_entry_value (eh->elf.root.u.def.section,
5798 eh->elf.root.u.def.value,
aef36ac1 5799 &rsec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50 5800 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5801 else
1e2f5b6e
AM
5802 rsec = h->root.u.def.section;
5803 break;
5bd4f169
AM
5804
5805 case bfd_link_hash_common:
1e2f5b6e
AM
5806 rsec = h->root.u.c.p->section;
5807 break;
5bd4f169
AM
5808
5809 default:
fb34365b 5810 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
5811 }
5812 }
5813 }
5814 else
5815 {
74f0fb50 5816 struct _opd_sec_data *opd;
1e2f5b6e
AM
5817
5818 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
5819 opd = get_opd_info (rsec);
5820 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 5821 {
74f0fb50 5822 rsec->gc_mark = 1;
ccfa59ea 5823
51aecdc5 5824 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
ccfa59ea 5825 }
5bd4f169
AM
5826 }
5827
1e2f5b6e 5828 return rsec;
5bd4f169
AM
5829}
5830
deb0e272
AM
5831/* The maximum size of .sfpr. */
5832#define SFPR_MAX (218*4)
5833
5834struct sfpr_def_parms
5835{
699733f6
AM
5836 const char name[12];
5837 unsigned char lo, hi;
2cdcc330
AM
5838 bfd_byte *(*write_ent) (bfd *, bfd_byte *, int);
5839 bfd_byte *(*write_tail) (bfd *, bfd_byte *, int);
deb0e272
AM
5840};
5841
a4b6fadd
AM
5842/* Auto-generate _save*, _rest* functions in .sfpr.
5843 If STUB_SEC is non-null, define alias symbols in STUB_SEC
5844 instead. */
deb0e272 5845
4dfe6ac6 5846static bfd_boolean
a4b6fadd
AM
5847sfpr_define (struct bfd_link_info *info,
5848 const struct sfpr_def_parms *parm,
5849 asection *stub_sec)
deb0e272
AM
5850{
5851 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5852 unsigned int i;
5853 size_t len = strlen (parm->name);
5854 bfd_boolean writing = FALSE;
699733f6 5855 char sym[16];
deb0e272 5856
4dfe6ac6
NC
5857 if (htab == NULL)
5858 return FALSE;
5859
deb0e272
AM
5860 memcpy (sym, parm->name, len);
5861 sym[len + 2] = 0;
5862
5863 for (i = parm->lo; i <= parm->hi; i++)
5864 {
a4b6fadd 5865 struct ppc_link_hash_entry *h;
deb0e272
AM
5866
5867 sym[len + 0] = i / 10 + '0';
5868 sym[len + 1] = i % 10 + '0';
ed7007c1
AM
5869 h = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, sym,
5870 writing, TRUE, TRUE));
a4b6fadd 5871 if (stub_sec != NULL)
deb0e272 5872 {
a4b6fadd
AM
5873 if (h != NULL
5874 && h->elf.root.type == bfd_link_hash_defined
5875 && h->elf.root.u.def.section == htab->sfpr)
5876 {
5877 struct elf_link_hash_entry *s;
5878 char buf[32];
5879 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
5880 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
5881 if (s == NULL)
5882 return FALSE;
779f2ae7 5883 if (s->root.type == bfd_link_hash_new)
a4b6fadd
AM
5884 {
5885 s->root.type = bfd_link_hash_defined;
5886 s->root.u.def.section = stub_sec;
7dda8d3c 5887 s->root.u.def.value = (stub_sec->size - htab->sfpr->size
a4b6fadd
AM
5888 + h->elf.root.u.def.value);
5889 s->ref_regular = 1;
5890 s->def_regular = 1;
5891 s->ref_regular_nonweak = 1;
5892 s->forced_local = 1;
5893 s->non_elf = 0;
5894 s->root.linker_def = 1;
5895 }
5896 }
5897 continue;
5898 }
5899 if (h != NULL)
5900 {
5901 h->save_res = 1;
5902 if (!h->elf.def_regular)
deb0e272 5903 {
a4b6fadd
AM
5904 h->elf.root.type = bfd_link_hash_defined;
5905 h->elf.root.u.def.section = htab->sfpr;
5906 h->elf.root.u.def.value = htab->sfpr->size;
5907 h->elf.type = STT_FUNC;
5908 h->elf.def_regular = 1;
b32547cd 5909 h->elf.non_elf = 0;
a4b6fadd
AM
5910 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
5911 writing = TRUE;
deb0e272 5912 if (htab->sfpr->contents == NULL)
a4b6fadd 5913 {
2cdcc330
AM
5914 htab->sfpr->contents
5915 = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
a4b6fadd
AM
5916 if (htab->sfpr->contents == NULL)
5917 return FALSE;
5918 }
deb0e272
AM
5919 }
5920 }
5921 if (writing)
5922 {
5923 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5924 if (i != parm->hi)
5925 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5926 else
5927 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5928 htab->sfpr->size = p - htab->sfpr->contents;
5929 }
5930 }
5931
5932 return TRUE;
5933}
5934
5935static bfd_byte *
5936savegpr0 (bfd *abfd, bfd_byte *p, int r)
5937{
5938 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5939 return p + 4;
5940}
5941
5942static bfd_byte *
5943savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5944{
5945 p = savegpr0 (abfd, p, r);
a078d95a 5946 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
5947 p = p + 4;
5948 bfd_put_32 (abfd, BLR, p);
5949 return p + 4;
5950}
5951
5952static bfd_byte *
5953restgpr0 (bfd *abfd, bfd_byte *p, int r)
5954{
5955 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5956 return p + 4;
5957}
5958
5959static bfd_byte *
5960restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5961{
a078d95a 5962 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
5963 p = p + 4;
5964 p = restgpr0 (abfd, p, r);
5965 bfd_put_32 (abfd, MTLR_R0, p);
5966 p = p + 4;
5967 if (r == 29)
5968 {
5969 p = restgpr0 (abfd, p, 30);
5970 p = restgpr0 (abfd, p, 31);
5971 }
5972 bfd_put_32 (abfd, BLR, p);
5973 return p + 4;
5974}
5975
5976static bfd_byte *
5977savegpr1 (bfd *abfd, bfd_byte *p, int r)
5978{
5979 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5980 return p + 4;
5981}
5982
5983static bfd_byte *
5984savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5985{
5986 p = savegpr1 (abfd, p, r);
5987 bfd_put_32 (abfd, BLR, p);
5988 return p + 4;
5989}
5990
5991static bfd_byte *
5992restgpr1 (bfd *abfd, bfd_byte *p, int r)
5993{
5994 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5995 return p + 4;
5996}
5997
5998static bfd_byte *
5999restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6000{
6001 p = restgpr1 (abfd, p, r);
6002 bfd_put_32 (abfd, BLR, p);
6003 return p + 4;
6004}
6005
6006static bfd_byte *
6007savefpr (bfd *abfd, bfd_byte *p, int r)
6008{
6009 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6010 return p + 4;
6011}
6012
6013static bfd_byte *
6014savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6015{
6016 p = savefpr (abfd, p, r);
a078d95a 6017 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6018 p = p + 4;
6019 bfd_put_32 (abfd, BLR, p);
6020 return p + 4;
6021}
6022
6023static bfd_byte *
6024restfpr (bfd *abfd, bfd_byte *p, int r)
6025{
6026 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6027 return p + 4;
6028}
6029
6030static bfd_byte *
6031restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6032{
a078d95a 6033 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6034 p = p + 4;
6035 p = restfpr (abfd, p, r);
6036 bfd_put_32 (abfd, MTLR_R0, p);
6037 p = p + 4;
6038 if (r == 29)
6039 {
6040 p = restfpr (abfd, p, 30);
6041 p = restfpr (abfd, p, 31);
6042 }
6043 bfd_put_32 (abfd, BLR, p);
6044 return p + 4;
6045}
6046
6047static bfd_byte *
6048savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6049{
6050 p = savefpr (abfd, p, r);
6051 bfd_put_32 (abfd, BLR, p);
6052 return p + 4;
6053}
6054
6055static bfd_byte *
6056restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6057{
6058 p = restfpr (abfd, p, r);
6059 bfd_put_32 (abfd, BLR, p);
6060 return p + 4;
6061}
6062
6063static bfd_byte *
6064savevr (bfd *abfd, bfd_byte *p, int r)
6065{
6066 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6067 p = p + 4;
6068 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6069 return p + 4;
6070}
6071
6072static bfd_byte *
6073savevr_tail (bfd *abfd, bfd_byte *p, int r)
6074{
6075 p = savevr (abfd, p, r);
6076 bfd_put_32 (abfd, BLR, p);
6077 return p + 4;
6078}
6079
6080static bfd_byte *
6081restvr (bfd *abfd, bfd_byte *p, int r)
6082{
6083 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6084 p = p + 4;
6085 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6086 return p + 4;
6087}
6088
6089static bfd_byte *
6090restvr_tail (bfd *abfd, bfd_byte *p, int r)
6091{
6092 p = restvr (abfd, p, r);
6093 bfd_put_32 (abfd, BLR, p);
6094 return p + 4;
6095}
6096
9e7028aa
AM
6097#define STDU_R1_0R1 0xf8210001
6098#define ADDI_R1_R1 0x38210000
6099
6100/* Emit prologue of wrapper preserving regs around a call to
6101 __tls_get_addr_opt. */
6102
6103static bfd_byte *
6104tls_get_addr_prologue (bfd *obfd, bfd_byte *p, struct ppc_link_hash_table *htab)
6105{
6106 unsigned int i;
6107
6108 bfd_put_32 (obfd, MFLR_R0, p);
6109 p += 4;
6110 bfd_put_32 (obfd, STD_R0_0R1 + 16, p);
6111 p += 4;
6112
6113 if (htab->opd_abi)
6114 {
6115 for (i = 4; i < 12; i++)
6116 {
6117 bfd_put_32 (obfd,
6118 STD_R0_0R1 | i << 21 | (-(13 - i) * 8 & 0xffff), p);
6119 p += 4;
6120 }
6121 bfd_put_32 (obfd, STDU_R1_0R1 | (-128 & 0xffff), p);
6122 p += 4;
6123 }
6124 else
6125 {
6126 for (i = 4; i < 12; i++)
6127 {
6128 bfd_put_32 (obfd,
6129 STD_R0_0R1 | i << 21 | (-(12 - i) * 8 & 0xffff), p);
6130 p += 4;
6131 }
6132 bfd_put_32 (obfd, STDU_R1_0R1 | (-96 & 0xffff), p);
6133 p += 4;
6134 }
6135 return p;
6136}
6137
6138/* Emit epilogue of wrapper preserving regs around a call to
6139 __tls_get_addr_opt. */
6140
6141static bfd_byte *
6142tls_get_addr_epilogue (bfd *obfd, bfd_byte *p, struct ppc_link_hash_table *htab)
6143{
6144 unsigned int i;
6145
6146 if (htab->opd_abi)
6147 {
6148 for (i = 4; i < 12; i++)
6149 {
6150 bfd_put_32 (obfd, LD_R0_0R1 | i << 21 | (128 - (13 - i) * 8), p);
6151 p += 4;
6152 }
6153 bfd_put_32 (obfd, ADDI_R1_R1 | 128, p);
6154 p += 4;
6155 }
6156 else
6157 {
6158 for (i = 4; i < 12; i++)
6159 {
6160 bfd_put_32 (obfd, LD_R0_0R1 | i << 21 | (96 - (12 - i) * 8), p);
6161 p += 4;
6162 }
6163 bfd_put_32 (obfd, ADDI_R1_R1 | 96, p);
6164 p += 4;
6165 }
6166 bfd_put_32 (obfd, LD_R0_0R1 | 16, p);
6167 p += 4;
6168 bfd_put_32 (obfd, MTLR_R0, p);
6169 p += 4;
6170 bfd_put_32 (obfd, BLR, p);
6171 p += 4;
6172 return p;
6173}
6174
e86ce104
AM
6175/* Called via elf_link_hash_traverse to transfer dynamic linking
6176 information on function code symbol entries to their corresponding
6177 function descriptor symbol entries. */
deb0e272 6178
b34976b6 6179static bfd_boolean
4ce794b7 6180func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6181{
e86ce104 6182 struct bfd_link_info *info;
65f38f15 6183 struct ppc_link_hash_table *htab;
50bc7936
AM
6184 struct ppc_link_hash_entry *fh;
6185 struct ppc_link_hash_entry *fdh;
6186 bfd_boolean force_local;
5bd4f169 6187
ed7007c1 6188 fh = ppc_elf_hash_entry (h);
50bc7936 6189 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 6190 return TRUE;
e86ce104 6191
8c5b4e52
AM
6192 if (!fh->is_func)
6193 return TRUE;
6194
6195 if (fh->elf.root.root.string[0] != '.'
6196 || fh->elf.root.root.string[1] == '\0')
6197 return TRUE;
6198
4ce794b7 6199 info = inf;
65f38f15 6200 htab = ppc_hash_table (info);
4dfe6ac6
NC
6201 if (htab == NULL)
6202 return FALSE;
5bd4f169 6203
8c5b4e52
AM
6204 /* Find the corresponding function descriptor symbol. */
6205 fdh = lookup_fdh (fh, htab);
6206
c09bdfe5
AM
6207 /* Resolve undefined references to dot-symbols as the value
6208 in the function descriptor, if we have one in a regular object.
6209 This is to satisfy cases like ".quad .foo". Calls to functions
6210 in dynamic objects are handled elsewhere. */
8c5b4e52
AM
6211 if ((fh->elf.root.type == bfd_link_hash_undefined
6212 || fh->elf.root.type == bfd_link_hash_undefweak)
6213 && (fdh->elf.root.type == bfd_link_hash_defined
6214 || fdh->elf.root.type == bfd_link_hash_defweak)
b31867b6
AM
6215 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6216 && opd_entry_value (fdh->elf.root.u.def.section,
6217 fdh->elf.root.u.def.value,
c09bdfe5 6218 &fh->elf.root.u.def.section,
aef36ac1 6219 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
c09bdfe5 6220 {
b31867b6 6221 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 6222 fh->elf.forced_local = 1;
b31867b6
AM
6223 fh->elf.def_regular = fdh->elf.def_regular;
6224 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
6225 }
6226
8c5b4e52
AM
6227 if (!fh->elf.dynamic)
6228 {
6229 struct plt_entry *ent;
5bd4f169 6230
8c5b4e52
AM
6231 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6232 if (ent->plt.refcount > 0)
6233 break;
6234 if (ent == NULL)
6235 return TRUE;
6236 }
5bd4f169 6237
8c5b4e52 6238 /* Create a descriptor as undefined if necessary. */
50bc7936 6239 if (fdh == NULL
0e1862bb 6240 && !bfd_link_executable (info)
50bc7936
AM
6241 && (fh->elf.root.type == bfd_link_hash_undefined
6242 || fh->elf.root.type == bfd_link_hash_undefweak))
6243 {
908b32fc 6244 fdh = make_fdh (info, fh);
bb700d78
AM
6245 if (fdh == NULL)
6246 return FALSE;
50bc7936 6247 }
648cca2c 6248
8c5b4e52 6249 /* We can't support overriding of symbols on a fake descriptor. */
908b32fc
AM
6250 if (fdh != NULL
6251 && fdh->fake
8c5b4e52
AM
6252 && (fh->elf.root.type == bfd_link_hash_defined
6253 || fh->elf.root.type == bfd_link_hash_defweak))
6254 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
908b32fc 6255
8c5b4e52
AM
6256 /* Transfer dynamic linking information to the function descriptor. */
6257 if (fdh != NULL)
6258 {
f5385ebf
AM
6259 fdh->elf.ref_regular |= fh->elf.ref_regular;
6260 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6261 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6262 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
8c5b4e52
AM
6263 fdh->elf.dynamic |= fh->elf.dynamic;
6264 fdh->elf.needs_plt |= (fh->elf.needs_plt
6265 || fh->elf.type == STT_FUNC
6266 || fh->elf.type == STT_GNU_IFUNC);
6267 move_plt_plist (fh, fdh);
6268
6269 if (!fdh->elf.forced_local
6270 && fh->elf.dynindx != -1)
6271 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6272 return FALSE;
e86ce104
AM
6273 }
6274
50bc7936
AM
6275 /* Now that the info is on the function descriptor, clear the
6276 function code sym info. Any function code syms for which we
6277 don't have a definition in a regular file, we force local.
6278 This prevents a shared library from exporting syms that have
6279 been imported from another library. Function code syms that
6280 are really in the library we must leave global to prevent the
6281 linker dragging in a definition from a static library. */
93f3fa99
AM
6282 force_local = (!fh->elf.def_regular
6283 || fdh == NULL
6284 || !fdh->elf.def_regular
6285 || fdh->elf.forced_local);
50bc7936
AM
6286 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6287
b34976b6 6288 return TRUE;
e86ce104 6289}
40b8271b 6290
a4b6fadd
AM
6291static const struct sfpr_def_parms save_res_funcs[] =
6292 {
6293 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6294 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6295 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6296 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6297 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6298 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6299 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6300 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6301 { "._savef", 14, 31, savefpr, savefpr1_tail },
6302 { "._restf", 14, 31, restfpr, restfpr1_tail },
6303 { "_savevr_", 20, 31, savevr, savevr_tail },
6304 { "_restvr_", 20, 31, restvr, restvr_tail }
6305 };
6306
e86ce104 6307/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
6308 this hook to a) provide some gcc support functions, and b) transfer
6309 dynamic linking information gathered so far on function code symbol
6310 entries, to their corresponding function descriptor symbol entries. */
deb0e272 6311
b34976b6 6312static bfd_boolean
4ce794b7
AM
6313ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6314 struct bfd_link_info *info)
e86ce104
AM
6315{
6316 struct ppc_link_hash_table *htab;
6317
6318 htab = ppc_hash_table (info);
4dfe6ac6
NC
6319 if (htab == NULL)
6320 return FALSE;
6321
b32547cd
AM
6322 /* Provide any missing _save* and _rest* functions. */
6323 if (htab->sfpr != NULL)
6324 {
6325 unsigned int i;
6326
6327 htab->sfpr->size = 0;
6328 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
6329 if (!sfpr_define (info, &save_res_funcs[i], NULL))
6330 return FALSE;
6331 if (htab->sfpr->size == 0)
6332 htab->sfpr->flags |= SEC_EXCLUDE;
6333 }
6334
6335 if (bfd_link_relocatable (info))
6336 return TRUE;
6337
6338 if (htab->elf.hgot != NULL)
dba6fa9b
AM
6339 {
6340 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
6341 /* Make .TOC. defined so as to prevent it being made dynamic.
6342 The wrong value here is fixed later in ppc64_elf_set_toc. */
43417696
AM
6343 if (!htab->elf.hgot->def_regular
6344 || htab->elf.hgot->root.type != bfd_link_hash_defined)
6345 {
6346 htab->elf.hgot->root.type = bfd_link_hash_defined;
6347 htab->elf.hgot->root.u.def.value = 0;
6348 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
6349 htab->elf.hgot->def_regular = 1;
6350 htab->elf.hgot->root.linker_def = 1;
6351 }
dba6fa9b 6352 htab->elf.hgot->type = STT_OBJECT;
2cdcc330
AM
6353 htab->elf.hgot->other
6354 = (htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
dba6fa9b 6355 }
c66bb0ee 6356
8c5b4e52
AM
6357 if (htab->need_func_desc_adj)
6358 {
6359 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6360 htab->need_func_desc_adj = 0;
6361 }
805fc799 6362
b34976b6 6363 return TRUE;
e86ce104
AM
6364}
6365
d311bc8b 6366/* Return true if we have dynamic relocs against H or any of its weak
ab2477e1
AM
6367 aliases, that apply to read-only sections. Cannot be used after
6368 size_dynamic_sections. */
d311bc8b
AM
6369
6370static bfd_boolean
6371alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
6372{
ed7007c1 6373 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
d311bc8b
AM
6374 do
6375 {
5dbc8b37 6376 if (_bfd_elf_readonly_dynrelocs (&eh->elf))
d311bc8b 6377 return TRUE;
ed7007c1 6378 eh = ppc_elf_hash_entry (eh->elf.u.alias);
2cdcc330
AM
6379 }
6380 while (eh != NULL && &eh->elf != h);
d311bc8b
AM
6381
6382 return FALSE;
6383}
8a2058b5 6384
8a9e8e72
AM
6385/* Return whether EH has pc-relative dynamic relocs. */
6386
6387static bfd_boolean
6388pc_dynrelocs (struct ppc_link_hash_entry *eh)
6389{
6390 struct elf_dyn_relocs *p;
6391
190eb1dd 6392 for (p = eh->elf.dyn_relocs; p != NULL; p = p->next)
8a9e8e72
AM
6393 if (p->pc_count != 0)
6394 return TRUE;
6395 return FALSE;
6396}
6397
8a2058b5
AM
6398/* Return true if a global entry stub will be created for H. Valid
6399 for ELFv2 before plt entries have been allocated. */
6400
6401static bfd_boolean
6402global_entry_stub (struct elf_link_hash_entry *h)
6403{
6404 struct plt_entry *pent;
6405
6406 if (!h->pointer_equality_needed
6407 || h->def_regular)
6408 return FALSE;
6409
6410 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
6411 if (pent->plt.refcount > 0
6412 && pent->addend == 0)
6413 return TRUE;
6414
6415 return FALSE;
6416}
6417
e86ce104
AM
6418/* Adjust a symbol defined by a dynamic object and referenced by a
6419 regular object. The current definition is in some section of the
6420 dynamic object, but we're not including those sections. We have to
6421 change the definition to something the rest of the link can
6422 understand. */
6423
b34976b6 6424static bfd_boolean
4ce794b7
AM
6425ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6426 struct elf_link_hash_entry *h)
e86ce104
AM
6427{
6428 struct ppc_link_hash_table *htab;
5474d94f 6429 asection *s, *srel;
e86ce104
AM
6430
6431 htab = ppc_hash_table (info);
4dfe6ac6
NC
6432 if (htab == NULL)
6433 return FALSE;
e86ce104
AM
6434
6435 /* Deal with function syms. */
6436 if (h->type == STT_FUNC
e054468f 6437 || h->type == STT_GNU_IFUNC
f5385ebf 6438 || h->needs_plt)
e86ce104 6439 {
ed7007c1 6440 bfd_boolean local = (ppc_elf_hash_entry (h)->save_res
529fe20e
AM
6441 || SYMBOL_CALLS_LOCAL (info, h)
6442 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
6443 /* Discard dyn_relocs when non-pic if we've decided that a
6444 function symbol is local and not an ifunc. We keep dynamic
6445 relocs for ifuncs when local rather than always emitting a
6446 plt call stub for them and defining the symbol on the call
6447 stub. We can't do that for ELFv1 anyway (a function symbol
6448 is defined on a descriptor, not code) and it can be faster at
6449 run-time due to not needing to bounce through a stub. The
6450 dyn_relocs for ifuncs will be applied even in a static
6451 executable. */
6452 if (!bfd_link_pic (info)
6453 && h->type != STT_GNU_IFUNC
6454 && local)
190eb1dd 6455 h->dyn_relocs = NULL;
529fe20e 6456
e86ce104
AM
6457 /* Clear procedure linkage table information for any symbol that
6458 won't need a .plt entry. */
411e1bfb
AM
6459 struct plt_entry *ent;
6460 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6461 if (ent->plt.refcount > 0)
6462 break;
8387904d 6463 if (ent == NULL
2d7ad24e
AM
6464 || (h->type != STT_GNU_IFUNC
6465 && local
3e04d765 6466 && (htab->can_convert_all_inline_plt
ed7007c1 6467 || (ppc_elf_hash_entry (h)->tls_mask
3e04d765 6468 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
40b8271b 6469 {
411e1bfb 6470 h->plt.plist = NULL;
f5385ebf 6471 h->needs_plt = 0;
d1eca1e4 6472 h->pointer_equality_needed = 0;
40b8271b 6473 }
8a2058b5 6474 else if (abiversion (info->output_bfd) >= 2)
a345bc8d 6475 {
d1eca1e4
AM
6476 /* Taking a function's address in a read/write section
6477 doesn't require us to define the function symbol in the
6478 executable on a global entry stub. A dynamic reloc can
8a2058b5
AM
6479 be used instead. The reason we prefer a few more dynamic
6480 relocs is that calling via a global entry stub costs a
6481 few more instructions, and pointer_equality_needed causes
6482 extra work in ld.so when resolving these symbols. */
529fe20e 6483 if (global_entry_stub (h))
d1eca1e4 6484 {
5dbc8b37 6485 if (!_bfd_elf_readonly_dynrelocs (h))
529fe20e
AM
6486 {
6487 h->pointer_equality_needed = 0;
04383fd1
AM
6488 /* If we haven't seen a branch reloc and the symbol
6489 isn't an ifunc then we don't need a plt entry. */
529fe20e
AM
6490 if (!h->needs_plt)
6491 h->plt.plist = NULL;
6492 }
6493 else if (!bfd_link_pic (info))
6494 /* We are going to be defining the function symbol on the
6495 plt stub, so no dyn_relocs needed when non-pic. */
190eb1dd 6496 h->dyn_relocs = NULL;
d1eca1e4
AM
6497 }
6498
3988aed5
AM
6499 /* ELFv2 function symbols can't have copy relocs. */
6500 return TRUE;
6501 }
6502 else if (!h->needs_plt
5dbc8b37 6503 && !_bfd_elf_readonly_dynrelocs (h))
3988aed5 6504 {
04383fd1
AM
6505 /* If we haven't seen a branch reloc and the symbol isn't an
6506 ifunc then we don't need a plt entry. */
3988aed5
AM
6507 h->plt.plist = NULL;
6508 h->pointer_equality_needed = 0;
a345bc8d
AM
6509 return TRUE;
6510 }
5bd4f169 6511 }
bbd7ec4a 6512 else
411e1bfb 6513 h->plt.plist = NULL;
5bd4f169
AM
6514
6515 /* If this is a weak symbol, and there is a real definition, the
6516 processor independent code will have arranged for us to see the
6517 real definition first, and we can just use the same value. */
60d67dc8 6518 if (h->is_weakalias)
5bd4f169 6519 {
60d67dc8
AM
6520 struct elf_link_hash_entry *def = weakdef (h);
6521 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
6522 h->root.u.def.section = def->root.u.def.section;
6523 h->root.u.def.value = def->root.u.def.value;
4a7e5234
AM
6524 if (def->root.u.def.section == htab->elf.sdynbss
6525 || def->root.u.def.section == htab->elf.sdynrelro)
190eb1dd 6526 h->dyn_relocs = NULL;
b34976b6 6527 return TRUE;
5bd4f169
AM
6528 }
6529
5bd4f169
AM
6530 /* If we are creating a shared library, we must presume that the
6531 only references to the symbol are via the global offset table.
6532 For such cases we need not do anything here; the relocations will
6533 be handled correctly by relocate_section. */
ec73ddcd 6534 if (!bfd_link_executable (info))
b34976b6 6535 return TRUE;
5bd4f169 6536
65f38f15
AM
6537 /* If there are no references to this symbol that do not use the
6538 GOT, we don't need to generate a copy reloc. */
f5385ebf 6539 if (!h->non_got_ref)
b34976b6 6540 return TRUE;
65f38f15 6541
b186458a 6542 /* Don't generate a copy reloc for symbols defined in the executable. */
d93d1c80 6543 if (!h->def_dynamic || !h->ref_regular || h->def_regular
b186458a 6544
d93d1c80
AM
6545 /* If -z nocopyreloc was given, don't generate them either. */
6546 || info->nocopyreloc
a127494f 6547
dce2246a 6548 /* If we don't find any dynamic relocs in read-only sections, then
d93d1c80 6549 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1bdd8fac
AM
6550 || (ELIMINATE_COPY_RELOCS
6551 && !h->needs_copy
6552 && !alias_readonly_dynrelocs (h))
65f38f15 6553
d93d1c80
AM
6554 /* Protected variables do not work with .dynbss. The copy in
6555 .dynbss won't be used by the shared library with the protected
6556 definition for the variable. Text relocations are preferable
6557 to an incorrect program. */
6558 || h->protected_def)
529fe20e 6559 return TRUE;
a127494f 6560
e1c6cf61
AM
6561 if (h->type == STT_FUNC
6562 || h->type == STT_GNU_IFUNC)
97b639ba 6563 {
e1c6cf61
AM
6564 /* .dynbss copies of function symbols only work if we have
6565 ELFv1 dot-symbols. ELFv1 compilers since 2004 default to not
6566 use dot-symbols and set the function symbol size to the text
6567 size of the function rather than the size of the descriptor.
6568 That's wrong for copying a descriptor. */
ed7007c1 6569 if (ppc_elf_hash_entry (h)->oh == NULL
e1c6cf61
AM
6570 || !(h->size == 24 || h->size == 16))
6571 return TRUE;
6572
6573 /* We should never get here, but unfortunately there are old
6574 versions of gcc (circa gcc-3.2) that improperly for the
6575 ELFv1 ABI put initialized function pointers, vtable refs and
6576 suchlike in read-only sections. Allow them to proceed, but
6577 warn that this might break at runtime. */
25f53a85 6578 info->callbacks->einfo
c1c8c1ef 6579 (_("%P: copy reloc against `%pT' requires lazy plt linking; "
25f53a85 6580 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
6581 h->root.root.string);
6582 }
5d35169e
AM
6583
6584 /* This is a reference to a symbol defined by a dynamic object which
6585 is not a function. */
6586
5bd4f169
AM
6587 /* We must allocate the symbol in our .dynbss section, which will
6588 become part of the .bss section of the executable. There will be
6589 an entry for this symbol in the .dynsym section. The dynamic
6590 object will contain position independent code, so all references
6591 from the dynamic object to this symbol will go through the global
6592 offset table. The dynamic linker will use the .dynsym entry to
6593 determine the address it must put in the global offset table, so
6594 both the dynamic object and the regular object will refer to the
6595 same memory location for the variable. */
5474d94f
AM
6596 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6597 {
6598 s = htab->elf.sdynrelro;
6599 srel = htab->elf.sreldynrelro;
6600 }
6601 else
6602 {
6603 s = htab->elf.sdynbss;
6604 srel = htab->elf.srelbss;
6605 }
1d7e9d18 6606 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 6607 {
4a7e5234
AM
6608 /* We must generate a R_PPC64_COPY reloc to tell the dynamic
6609 linker to copy the initial value out of the dynamic object
6610 and into the runtime process image. */
5474d94f 6611 srel->size += sizeof (Elf64_External_Rela);
f5385ebf 6612 h->needs_copy = 1;
5bd4f169
AM
6613 }
6614
529fe20e 6615 /* We no longer want dyn_relocs. */
190eb1dd 6616 h->dyn_relocs = NULL;
6cabe1ea 6617 return _bfd_elf_adjust_dynamic_copy (info, h, s);
5bd4f169
AM
6618}
6619
e86ce104
AM
6620/* If given a function descriptor symbol, hide both the function code
6621 sym and the descriptor. */
6622static void
4ce794b7
AM
6623ppc64_elf_hide_symbol (struct bfd_link_info *info,
6624 struct elf_link_hash_entry *h,
6625 bfd_boolean force_local)
e86ce104 6626{
34814b9f 6627 struct ppc_link_hash_entry *eh;
e86ce104
AM
6628 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6629
87469ba2
AM
6630 if (ppc_hash_table (info) == NULL)
6631 return;
6632
ed7007c1 6633 eh = ppc_elf_hash_entry (h);
34814b9f 6634 if (eh->is_func_descriptor)
e86ce104 6635 {
34814b9f 6636 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 6637
721956f4 6638 if (fh == NULL)
d1329ca3
AM
6639 {
6640 const char *p, *q;
b8ac2841 6641 struct elf_link_hash_table *htab = elf_hash_table (info);
d1329ca3
AM
6642 char save;
6643
6644 /* We aren't supposed to use alloca in BFD because on
6645 systems which do not have alloca the version in libiberty
6646 calls xmalloc, which might cause the program to crash
6647 when it runs out of memory. This function doesn't have a
6648 return status, so there's no way to gracefully return an
6649 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
6650 accessed; It's either a string in an ELF string table,
6651 or allocated in an objalloc structure. */
d1329ca3 6652
34814b9f 6653 p = eh->elf.root.root.string - 1;
d1329ca3
AM
6654 save = *p;
6655 *(char *) p = '.';
ed7007c1
AM
6656 fh = ppc_elf_hash_entry (elf_link_hash_lookup (htab, p, FALSE,
6657 FALSE, FALSE));
d1329ca3
AM
6658 *(char *) p = save;
6659
6660 /* Unfortunately, if it so happens that the string we were
6661 looking for was allocated immediately before this string,
6662 then we overwrote the string terminator. That's the only
6663 reason the lookup should fail. */
6664 if (fh == NULL)
6665 {
34814b9f
AM
6666 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6667 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 6668 --q, --p;
34814b9f 6669 if (q < eh->elf.root.root.string && *p == '.')
ed7007c1
AM
6670 fh = ppc_elf_hash_entry (elf_link_hash_lookup (htab, p, FALSE,
6671 FALSE, FALSE));
d1329ca3
AM
6672 }
6673 if (fh != NULL)
6674 {
34814b9f
AM
6675 eh->oh = fh;
6676 fh->oh = eh;
d1329ca3
AM
6677 }
6678 }
e86ce104 6679 if (fh != NULL)
34814b9f 6680 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
6681 }
6682}
6683
411e1bfb 6684static bfd_boolean
8843416a
AM
6685get_sym_h (struct elf_link_hash_entry **hp,
6686 Elf_Internal_Sym **symp,
6687 asection **symsecp,
f961d9dd 6688 unsigned char **tls_maskp,
8843416a
AM
6689 Elf_Internal_Sym **locsymsp,
6690 unsigned long r_symndx,
6691 bfd *ibfd)
411e1bfb 6692{
0ffa91dd 6693 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
6694
6695 if (r_symndx >= symtab_hdr->sh_info)
6696 {
6697 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6698 struct elf_link_hash_entry *h;
6699
6700 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 6701 h = elf_follow_link (h);
411e1bfb
AM
6702
6703 if (hp != NULL)
6704 *hp = h;
6705
6706 if (symp != NULL)
6707 *symp = NULL;
6708
6709 if (symsecp != NULL)
6710 {
6711 asection *symsec = NULL;
6712 if (h->root.type == bfd_link_hash_defined
6713 || h->root.type == bfd_link_hash_defweak)
6714 symsec = h->root.u.def.section;
6715 *symsecp = symsec;
6716 }
6717
e7b938ca 6718 if (tls_maskp != NULL)
ed7007c1 6719 *tls_maskp = &ppc_elf_hash_entry (h)->tls_mask;
411e1bfb
AM
6720 }
6721 else
6722 {
6723 Elf_Internal_Sym *sym;
6724 Elf_Internal_Sym *locsyms = *locsymsp;
6725
6726 if (locsyms == NULL)
6727 {
6728 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6729 if (locsyms == NULL)
6730 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6731 symtab_hdr->sh_info,
6732 0, NULL, NULL, NULL);
6733 if (locsyms == NULL)
6734 return FALSE;
6735 *locsymsp = locsyms;
6736 }
6737 sym = locsyms + r_symndx;
6738
6739 if (hp != NULL)
6740 *hp = NULL;
6741
6742 if (symp != NULL)
6743 *symp = sym;
6744
6745 if (symsecp != NULL)
cb33740c 6746 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 6747
e7b938ca 6748 if (tls_maskp != NULL)
411e1bfb
AM
6749 {
6750 struct got_entry **lgot_ents;
f961d9dd 6751 unsigned char *tls_mask;
411e1bfb 6752
e7b938ca 6753 tls_mask = NULL;
411e1bfb
AM
6754 lgot_ents = elf_local_got_ents (ibfd);
6755 if (lgot_ents != NULL)
6756 {
e054468f
AM
6757 struct plt_entry **local_plt = (struct plt_entry **)
6758 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 6759 unsigned char *lgot_masks = (unsigned char *)
e054468f 6760 (local_plt + symtab_hdr->sh_info);
e7b938ca 6761 tls_mask = &lgot_masks[r_symndx];
411e1bfb 6762 }
e7b938ca 6763 *tls_maskp = tls_mask;
411e1bfb
AM
6764 }
6765 }
6766 return TRUE;
6767}
6768
e7b938ca 6769/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 6770 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 6771 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
6772
6773static int
f961d9dd 6774get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
6775 unsigned long *toc_symndx,
6776 bfd_vma *toc_addend,
0d4792f7 6777 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
6778 const Elf_Internal_Rela *rel,
6779 bfd *ibfd)
411e1bfb
AM
6780{
6781 unsigned long r_symndx;
0d4792f7 6782 int next_r;
411e1bfb
AM
6783 struct elf_link_hash_entry *h;
6784 Elf_Internal_Sym *sym;
6785 asection *sec;
6786 bfd_vma off;
6787
6788 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 6789 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 6790 return 0;
411e1bfb 6791
37da22e5
AM
6792 if ((*tls_maskp != NULL
6793 && (**tls_maskp & TLS_TLS) != 0
6794 && **tls_maskp != (TLS_TLS | TLS_MARK))
411e1bfb 6795 || sec == NULL
6bee8834 6796 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 6797 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 6798 return 1;
411e1bfb
AM
6799
6800 /* Look inside a TOC section too. */
6801 if (h != NULL)
6802 {
6803 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
6804 off = h->root.u.def.value;
6805 }
6806 else
6807 off = sym->st_value;
6808 off += rel->r_addend;
6809 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
6810 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
6811 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
6812 if (toc_symndx != NULL)
6813 *toc_symndx = r_symndx;
3a71aa26
AM
6814 if (toc_addend != NULL)
6815 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
6816 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6817 return 0;
854b41e7 6818 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
6819 && (next_r == -1 || next_r == -2))
6820 return 1 - next_r;
951fd09b 6821 return 1;
411e1bfb
AM
6822}
6823
3b421ab3
AM
6824/* Find (or create) an entry in the tocsave hash table. */
6825
6826static struct tocsave_entry *
6827tocsave_find (struct ppc_link_hash_table *htab,
6828 enum insert_option insert,
6829 Elf_Internal_Sym **local_syms,
6830 const Elf_Internal_Rela *irela,
6831 bfd *ibfd)
6832{
6833 unsigned long r_indx;
6834 struct elf_link_hash_entry *h;
6835 Elf_Internal_Sym *sym;
6836 struct tocsave_entry ent, *p;
6837 hashval_t hash;
6838 struct tocsave_entry **slot;
6839
6840 r_indx = ELF64_R_SYM (irela->r_info);
6841 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
6842 return NULL;
6843 if (ent.sec == NULL || ent.sec->output_section == NULL)
6844 {
4eca0228 6845 _bfd_error_handler
871b3ab2 6846 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
3b421ab3
AM
6847 return NULL;
6848 }
6849
6850 if (h != NULL)
6851 ent.offset = h->root.u.def.value;
6852 else
6853 ent.offset = sym->st_value;
6854 ent.offset += irela->r_addend;
6855
6856 hash = tocsave_htab_hash (&ent);
6857 slot = ((struct tocsave_entry **)
6858 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
6859 if (slot == NULL)
6860 return NULL;
6861
6862 if (*slot == NULL)
6863 {
6864 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
6865 if (p == NULL)
6866 return NULL;
6867 *p = ent;
6868 *slot = p;
6869 }
6870 return *slot;
6871}
6872
754021d0 6873/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 6874 code for the old ABI, these will already have been done. */
754021d0
AM
6875
6876static bfd_boolean
6877adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
6878{
6879 struct ppc_link_hash_entry *eh;
6880 asection *sym_sec;
74f0fb50 6881 struct _opd_sec_data *opd;
754021d0
AM
6882
6883 if (h->root.type == bfd_link_hash_indirect)
6884 return TRUE;
6885
754021d0
AM
6886 if (h->root.type != bfd_link_hash_defined
6887 && h->root.type != bfd_link_hash_defweak)
6888 return TRUE;
6889
ed7007c1 6890 eh = ppc_elf_hash_entry (h);
754021d0
AM
6891 if (eh->adjust_done)
6892 return TRUE;
6893
6894 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
6895 opd = get_opd_info (sym_sec);
6896 if (opd != NULL && opd->adjust != NULL)
754021d0 6897 {
51aecdc5 6898 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
4025353c
AM
6899 if (adjust == -1)
6900 {
6901 /* This entry has been deleted. */
b3fac117 6902 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
6903 if (dsec == NULL)
6904 {
6905 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 6906 if (discarded_section (dsec))
81688140 6907 {
b3fac117 6908 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
6909 break;
6910 }
6911 }
4025353c 6912 eh->elf.root.u.def.value = 0;
81688140 6913 eh->elf.root.u.def.section = dsec;
4025353c
AM
6914 }
6915 else
6916 eh->elf.root.u.def.value += adjust;
754021d0
AM
6917 eh->adjust_done = 1;
6918 }
6919 return TRUE;
6920}
6921
8c1d1bb8 6922/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 6923 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
6924 have already been determined. */
6925
6926static bfd_boolean
6927dec_dynrel_count (bfd_vma r_info,
6928 asection *sec,
6929 struct bfd_link_info *info,
6930 Elf_Internal_Sym **local_syms,
6931 struct elf_link_hash_entry *h,
19e08130 6932 Elf_Internal_Sym *sym)
8c1d1bb8
AM
6933{
6934 enum elf_ppc64_reloc_type r_type;
19e08130 6935 asection *sym_sec = NULL;
8c1d1bb8
AM
6936
6937 /* Can this reloc be dynamic? This switch, and later tests here
6938 should be kept in sync with the code in check_relocs. */
6939 r_type = ELF64_R_TYPE (r_info);
6940 switch (r_type)
6941 {
6942 default:
6943 return TRUE;
6944
1bdd8fac
AM
6945 case R_PPC64_TOC16:
6946 case R_PPC64_TOC16_DS:
6947 case R_PPC64_TOC16_LO:
6948 case R_PPC64_TOC16_HI:
6949 case R_PPC64_TOC16_HA:
6950 case R_PPC64_TOC16_LO_DS:
6951 if (h == NULL)
6952 return TRUE;
6953 break;
6954
8c1d1bb8
AM
6955 case R_PPC64_TPREL16:
6956 case R_PPC64_TPREL16_LO:
6957 case R_PPC64_TPREL16_HI:
6958 case R_PPC64_TPREL16_HA:
6959 case R_PPC64_TPREL16_DS:
6960 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
6961 case R_PPC64_TPREL16_HIGH:
6962 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
6963 case R_PPC64_TPREL16_HIGHER:
6964 case R_PPC64_TPREL16_HIGHERA:
6965 case R_PPC64_TPREL16_HIGHEST:
6966 case R_PPC64_TPREL16_HIGHESTA:
8c1d1bb8 6967 case R_PPC64_TPREL64:
c213164a 6968 case R_PPC64_TPREL34:
8c1d1bb8
AM
6969 case R_PPC64_DTPMOD64:
6970 case R_PPC64_DTPREL64:
6971 case R_PPC64_ADDR64:
6972 case R_PPC64_REL30:
6973 case R_PPC64_REL32:
6974 case R_PPC64_REL64:
6975 case R_PPC64_ADDR14:
6976 case R_PPC64_ADDR14_BRNTAKEN:
6977 case R_PPC64_ADDR14_BRTAKEN:
6978 case R_PPC64_ADDR16:
6979 case R_PPC64_ADDR16_DS:
6980 case R_PPC64_ADDR16_HA:
6981 case R_PPC64_ADDR16_HI:
f9c6b907
AM
6982 case R_PPC64_ADDR16_HIGH:
6983 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
6984 case R_PPC64_ADDR16_HIGHER:
6985 case R_PPC64_ADDR16_HIGHERA:
6986 case R_PPC64_ADDR16_HIGHEST:
6987 case R_PPC64_ADDR16_HIGHESTA:
6988 case R_PPC64_ADDR16_LO:
6989 case R_PPC64_ADDR16_LO_DS:
6990 case R_PPC64_ADDR24:
6991 case R_PPC64_ADDR32:
6992 case R_PPC64_UADDR16:
6993 case R_PPC64_UADDR32:
6994 case R_PPC64_UADDR64:
6995 case R_PPC64_TOC:
5663e321
AM
6996 case R_PPC64_D34:
6997 case R_PPC64_D34_LO:
6998 case R_PPC64_D34_HI30:
6999 case R_PPC64_D34_HA30:
7000 case R_PPC64_ADDR16_HIGHER34:
7001 case R_PPC64_ADDR16_HIGHERA34:
7002 case R_PPC64_ADDR16_HIGHEST34:
7003 case R_PPC64_ADDR16_HIGHESTA34:
7004 case R_PPC64_D28:
8c1d1bb8
AM
7005 break;
7006 }
7007
7008 if (local_syms != NULL)
7009 {
7010 unsigned long r_symndx;
8c1d1bb8
AM
7011 bfd *ibfd = sec->owner;
7012
7013 r_symndx = ELF64_R_SYM (r_info);
7014 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7015 return FALSE;
7016 }
7017
ec73ddcd
AM
7018 if ((h != NULL
7019 && (h->root.type == bfd_link_hash_defweak
7020 || !h->def_regular))
7021 || (h != NULL
7022 && !bfd_link_executable (info)
7023 && !SYMBOLIC_BIND (info, h))
7024 || (bfd_link_pic (info)
7025 && must_be_dyn_reloc (info, r_type))
7026 || (!bfd_link_pic (info)
7027 && (h != NULL
7028 ? h->type == STT_GNU_IFUNC
7029 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
8c1d1bb8
AM
7030 ;
7031 else
7032 return TRUE;
7033
7034 if (h != NULL)
6edfbbad 7035 {
19e08130
AM
7036 struct elf_dyn_relocs *p;
7037 struct elf_dyn_relocs **pp;
190eb1dd 7038 pp = &h->dyn_relocs;
19e08130
AM
7039
7040 /* elf_gc_sweep may have already removed all dyn relocs associated
7041 with local syms for a given section. Also, symbol flags are
7042 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7043 report a dynreloc miscount. */
7044 if (*pp == NULL && info->gc_sections)
7045 return TRUE;
7046
7047 while ((p = *pp) != NULL)
60124e18 7048 {
19e08130
AM
7049 if (p->sec == sec)
7050 {
7051 if (!must_be_dyn_reloc (info, r_type))
7052 p->pc_count -= 1;
7053 p->count -= 1;
7054 if (p->count == 0)
7055 *pp = p->next;
7056 return TRUE;
7057 }
7058 pp = &p->next;
60124e18 7059 }
6edfbbad 7060 }
19e08130
AM
7061 else
7062 {
7063 struct ppc_dyn_relocs *p;
7064 struct ppc_dyn_relocs **pp;
7065 void *vpp;
7066 bfd_boolean is_ifunc;
8c1d1bb8 7067
19e08130
AM
7068 if (local_syms == NULL)
7069 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7070 if (sym_sec == NULL)
7071 sym_sec = sec;
c57da1a7 7072
19e08130
AM
7073 vpp = &elf_section_data (sym_sec)->local_dynrel;
7074 pp = (struct ppc_dyn_relocs **) vpp;
7075
7076 if (*pp == NULL && info->gc_sections)
7077 return TRUE;
7078
7079 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7080 while ((p = *pp) != NULL)
8c1d1bb8 7081 {
19e08130
AM
7082 if (p->sec == sec && p->ifunc == is_ifunc)
7083 {
7084 p->count -= 1;
7085 if (p->count == 0)
7086 *pp = p->next;
7087 return TRUE;
7088 }
7089 pp = &p->next;
8c1d1bb8 7090 }
8c1d1bb8
AM
7091 }
7092
695344c0 7093 /* xgettext:c-format */
cf97bcb0
AM
7094 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"),
7095 sec->owner, sec);
8c1d1bb8
AM
7096 bfd_set_error (bfd_error_bad_value);
7097 return FALSE;
7098}
7099
754021d0
AM
7100/* Remove unused Official Procedure Descriptor entries. Currently we
7101 only remove those associated with functions in discarded link-once
7102 sections, or weakly defined functions that have been overridden. It
7103 would be possible to remove many more entries for statically linked
7104 applications. */
7105
b34976b6 7106bfd_boolean
e7d1c40c 7107ppc64_elf_edit_opd (struct bfd_link_info *info)
1e2f5b6e
AM
7108{
7109 bfd *ibfd;
754021d0 7110 bfd_boolean some_edited = FALSE;
3f764659 7111 asection *need_pad = NULL;
e7d1c40c
AM
7112 struct ppc_link_hash_table *htab;
7113
7114 htab = ppc_hash_table (info);
7115 if (htab == NULL)
7116 return FALSE;
1e2f5b6e 7117
c72f2fb2 7118 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1e2f5b6e
AM
7119 {
7120 asection *sec;
7121 Elf_Internal_Rela *relstart, *rel, *relend;
7122 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7123 Elf_Internal_Sym *local_syms;
74f0fb50 7124 struct _opd_sec_data *opd;
51aecdc5 7125 bfd_boolean need_edit, add_aux_fields, broken;
3f764659 7126 bfd_size_type cnt_16b = 0;
1e2f5b6e 7127
854b41e7
AM
7128 if (!is_ppc64_elf (ibfd))
7129 continue;
7130
1e2f5b6e 7131 sec = bfd_get_section_by_name (ibfd, ".opd");
46de2a7c 7132 if (sec == NULL || sec->size == 0)
1e2f5b6e
AM
7133 continue;
7134
dbaa2011 7135 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7136 continue;
7137
1e2f5b6e
AM
7138 if (sec->output_section == bfd_abs_section_ptr)
7139 continue;
7140
7141 /* Look through the section relocs. */
7142 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7143 continue;
7144
6cdc0ccc 7145 local_syms = NULL;
0ffa91dd 7146 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7147
7148 /* Read the relocations. */
4ce794b7 7149 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7150 info->keep_memory);
1e2f5b6e 7151 if (relstart == NULL)
b34976b6 7152 return FALSE;
1e2f5b6e
AM
7153
7154 /* First run through the relocs to check they are sane, and to
7155 determine whether we need to edit this opd section. */
b34976b6 7156 need_edit = FALSE;
51aecdc5 7157 broken = FALSE;
3f764659 7158 need_pad = sec;
1e2f5b6e 7159 relend = relstart + sec->reloc_count;
50bc7936 7160 for (rel = relstart; rel < relend; )
1e2f5b6e 7161 {
04c9666a 7162 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7163 unsigned long r_symndx;
7164 asection *sym_sec;
7165 struct elf_link_hash_entry *h;
7166 Elf_Internal_Sym *sym;
51aecdc5 7167 bfd_vma offset;
1e2f5b6e 7168
51aecdc5 7169 /* .opd contains an array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7170 only interested in the reloc pointing to a function entry
7171 point. */
51aecdc5
AM
7172 offset = rel->r_offset;
7173 if (rel + 1 == relend
7174 || rel[1].r_offset != offset + 8)
1e2f5b6e
AM
7175 {
7176 /* If someone messes with .opd alignment then after a
7177 "ld -r" we might have padding in the middle of .opd.
7178 Also, there's nothing to prevent someone putting
7179 something silly in .opd with the assembler. No .opd
b34976b6 7180 optimization for them! */
3f764659 7181 broken_opd:
4eca0228 7182 _bfd_error_handler
871b3ab2 7183 (_("%pB: .opd is not a regular array of opd entries"), ibfd);
51aecdc5 7184 broken = TRUE;
1e2f5b6e
AM
7185 break;
7186 }
7187
50bc7936
AM
7188 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7189 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7190 {
4eca0228 7191 _bfd_error_handler
695344c0 7192 /* xgettext:c-format */
871b3ab2 7193 (_("%pB: unexpected reloc type %u in .opd section"),
d003868e 7194 ibfd, r_type);
51aecdc5 7195 broken = TRUE;
50bc7936
AM
7196 break;
7197 }
7198
1e2f5b6e 7199 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7200 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7201 r_symndx, ibfd))
50bc7936 7202 goto error_ret;
1e2f5b6e
AM
7203
7204 if (sym_sec == NULL || sym_sec->owner == NULL)
7205 {
411e1bfb
AM
7206 const char *sym_name;
7207 if (h != NULL)
7208 sym_name = h->root.root.string;
7209 else
26c61ae5
L
7210 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7211 sym_sec);
411e1bfb 7212
4eca0228 7213 _bfd_error_handler
695344c0 7214 /* xgettext:c-format */
871b3ab2 7215 (_("%pB: undefined sym `%s' in .opd section"),
d003868e 7216 ibfd, sym_name);
51aecdc5 7217 broken = TRUE;
1e2f5b6e
AM
7218 break;
7219 }
7220
51020317
AM
7221 /* opd entries are always for functions defined in the
7222 current input bfd. If the symbol isn't defined in the
7223 input bfd, then we won't be using the function in this
7224 bfd; It must be defined in a linkonce section in another
7225 bfd, or is weak. It's also possible that we are
7226 discarding the function due to a linker script /DISCARD/,
7227 which we test for via the output_section. */
7228 if (sym_sec->owner != ibfd
7229 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 7230 need_edit = TRUE;
1e2f5b6e 7231
50bc7936 7232 rel += 2;
51aecdc5
AM
7233 if (rel + 1 == relend
7234 || (rel + 2 < relend
7235 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
7236 ++rel;
7237
7238 if (rel == relend)
3f764659
JJ
7239 {
7240 if (sec->size == offset + 24)
7241 {
7242 need_pad = NULL;
7243 break;
7244 }
51aecdc5 7245 if (sec->size == offset + 16)
3f764659
JJ
7246 {
7247 cnt_16b++;
7248 break;
7249 }
7250 goto broken_opd;
7251 }
3f764659
JJ
7252 else if (rel + 1 < relend
7253 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7254 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7255 {
51aecdc5
AM
7256 if (rel[0].r_offset == offset + 16)
7257 cnt_16b++;
7258 else if (rel[0].r_offset != offset + 24)
7259 goto broken_opd;
3f764659
JJ
7260 }
7261 else
7262 goto broken_opd;
1e2f5b6e
AM
7263 }
7264
e7d1c40c 7265 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
3f764659 7266
51aecdc5 7267 if (!broken && (need_edit || add_aux_fields))
1e2f5b6e
AM
7268 {
7269 Elf_Internal_Rela *write_rel;
d4730f92 7270 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 7271 bfd_byte *rptr, *wptr;
983bddc8 7272 bfd_byte *new_contents;
74f0fb50
AM
7273 bfd_size_type amt;
7274
983bddc8 7275 new_contents = NULL;
51aecdc5 7276 amt = OPD_NDX (sec->size) * sizeof (long);
74f0fb50 7277 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 7278 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50
AM
7279 if (opd->adjust == NULL)
7280 return FALSE;
1e2f5b6e
AM
7281
7282 /* This seems a waste of time as input .opd sections are all
7283 zeros as generated by gcc, but I suppose there's no reason
7284 this will always be so. We might start putting something in
7285 the third word of .opd entries. */
7286 if ((sec->flags & SEC_IN_MEMORY) == 0)
7287 {
eea6121a
AM
7288 bfd_byte *loc;
7289 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 7290 {
c9594989 7291 free (loc);
50bc7936 7292 error_ret:
c9594989 7293 if (symtab_hdr->contents != (unsigned char *) local_syms)
6cdc0ccc 7294 free (local_syms);
6cdc0ccc
AM
7295 if (elf_section_data (sec)->relocs != relstart)
7296 free (relstart);
b34976b6 7297 return FALSE;
6cdc0ccc 7298 }
1e2f5b6e
AM
7299 sec->contents = loc;
7300 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7301 }
7302
7303 elf_section_data (sec)->relocs = relstart;
7304
3f764659 7305 new_contents = sec->contents;
3f764659
JJ
7306 if (add_aux_fields)
7307 {
7308 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7309 if (new_contents == NULL)
7310 return FALSE;
51aecdc5 7311 need_pad = NULL;
3f764659 7312 }
b4f4e59f
AM
7313 wptr = new_contents;
7314 rptr = sec->contents;
1e2f5b6e 7315 write_rel = relstart;
51aecdc5 7316 for (rel = relstart; rel < relend; )
1e2f5b6e 7317 {
50bc7936
AM
7318 unsigned long r_symndx;
7319 asection *sym_sec;
7320 struct elf_link_hash_entry *h;
51aecdc5 7321 struct ppc_link_hash_entry *fdh = NULL;
50bc7936 7322 Elf_Internal_Sym *sym;
51aecdc5
AM
7323 long opd_ent_size;
7324 Elf_Internal_Rela *next_rel;
7325 bfd_boolean skip;
50bc7936
AM
7326
7327 r_symndx = ELF64_R_SYM (rel->r_info);
7328 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 7329 r_symndx, ibfd))
50bc7936
AM
7330 goto error_ret;
7331
51aecdc5
AM
7332 next_rel = rel + 2;
7333 if (next_rel + 1 == relend
7334 || (next_rel + 2 < relend
7335 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
7336 ++next_rel;
7337
7338 /* See if the .opd entry is full 24 byte or
7339 16 byte (with fd_aux entry overlapped with next
7340 fd_func). */
7341 opd_ent_size = 24;
7342 if (next_rel == relend)
1e2f5b6e 7343 {
51aecdc5 7344 if (sec->size == rel->r_offset + 16)
3f764659 7345 opd_ent_size = 16;
51aecdc5
AM
7346 }
7347 else if (next_rel->r_offset == rel->r_offset + 16)
7348 opd_ent_size = 16;
3f764659 7349
51aecdc5
AM
7350 if (h != NULL
7351 && h->root.root.string[0] == '.')
7352 {
ed7007c1 7353 fdh = ppc_elf_hash_entry (h)->oh;
8c5b4e52
AM
7354 if (fdh != NULL)
7355 {
7356 fdh = ppc_follow_link (fdh);
7357 if (fdh->elf.root.type != bfd_link_hash_defined
7358 && fdh->elf.root.type != bfd_link_hash_defweak)
7359 fdh = NULL;
7360 }
51aecdc5 7361 }
1e2f5b6e 7362
51aecdc5
AM
7363 skip = (sym_sec->owner != ibfd
7364 || sym_sec->output_section == bfd_abs_section_ptr);
7365 if (skip)
7366 {
7367 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7 7368 {
51aecdc5
AM
7369 /* Arrange for the function descriptor sym
7370 to be dropped. */
7371 fdh->elf.root.u.def.value = 0;
7372 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 7373 }
51aecdc5 7374 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
1e2f5b6e 7375
0e1862bb 7376 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
51aecdc5
AM
7377 rel = next_rel;
7378 else
7379 while (1)
7380 {
7381 if (!dec_dynrel_count (rel->r_info, sec, info,
7382 NULL, h, sym))
7383 goto error_ret;
754021d0 7384
51aecdc5
AM
7385 if (++rel == next_rel)
7386 break;
1e2f5b6e 7387
51aecdc5
AM
7388 r_symndx = ELF64_R_SYM (rel->r_info);
7389 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7390 r_symndx, ibfd))
7391 goto error_ret;
7392 }
50bc7936
AM
7393 }
7394 else
1e2f5b6e 7395 {
51aecdc5
AM
7396 /* We'll be keeping this opd entry. */
7397 long adjust;
7398
7399 if (fdh != NULL)
7400 {
7401 /* Redefine the function descriptor symbol to
7402 this location in the opd section. It is
7403 necessary to update the value here rather
7404 than using an array of adjustments as we do
7405 for local symbols, because various places
7406 in the generic ELF code use the value
7407 stored in u.def.value. */
7408 fdh->elf.root.u.def.value = wptr - new_contents;
7409 fdh->adjust_done = 1;
7410 }
7411
7412 /* Local syms are a bit tricky. We could
7413 tweak them as they can be cached, but
7414 we'd need to look through the local syms
7415 for the function descriptor sym which we
7416 don't have at the moment. So keep an
7417 array of adjustments. */
7418 adjust = (wptr - new_contents) - (rptr - sec->contents);
7419 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
7420
7421 if (wptr != rptr)
7422 memcpy (wptr, rptr, opd_ent_size);
7423 wptr += opd_ent_size;
7424 if (add_aux_fields && opd_ent_size == 16)
7425 {
7426 memset (wptr, '\0', 8);
7427 wptr += 8;
7428 }
7429
50bc7936 7430 /* We need to adjust any reloc offsets to point to the
51aecdc5
AM
7431 new opd entries. */
7432 for ( ; rel != next_rel; ++rel)
7433 {
7434 rel->r_offset += adjust;
7435 if (write_rel != rel)
7436 memcpy (write_rel, rel, sizeof (*rel));
7437 ++write_rel;
7438 }
1e2f5b6e 7439 }
51aecdc5
AM
7440
7441 rptr += opd_ent_size;
1e2f5b6e
AM
7442 }
7443
3f764659 7444 sec->size = wptr - new_contents;
1e2f5b6e 7445 sec->reloc_count = write_rel - relstart;
3f764659
JJ
7446 if (add_aux_fields)
7447 {
7448 free (sec->contents);
7449 sec->contents = new_contents;
7450 }
7451
05bf9422 7452 /* Fudge the header size too, as this is used later in
cdcf6e38 7453 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
7454 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7455 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
754021d0 7456 some_edited = TRUE;
1e2f5b6e 7457 }
6cdc0ccc 7458 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 7459 free (relstart);
6cdc0ccc 7460
411e1bfb
AM
7461 if (local_syms != NULL
7462 && symtab_hdr->contents != (unsigned char *) local_syms)
7463 {
7464 if (!info->keep_memory)
7465 free (local_syms);
7466 else
7467 symtab_hdr->contents = (unsigned char *) local_syms;
7468 }
7469 }
7470
754021d0
AM
7471 if (some_edited)
7472 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7473
3f764659
JJ
7474 /* If we are doing a final link and the last .opd entry is just 16 byte
7475 long, add a 8 byte padding after it. */
0e1862bb 7476 if (need_pad != NULL && !bfd_link_relocatable (info))
3f764659
JJ
7477 {
7478 bfd_byte *p;
7479
7480 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7481 {
7482 BFD_ASSERT (need_pad->size > 0);
7483
7484 p = bfd_malloc (need_pad->size + 8);
7485 if (p == NULL)
7486 return FALSE;
699733f6 7487
2cdcc330
AM
7488 if (!bfd_get_section_contents (need_pad->owner, need_pad,
7489 p, 0, need_pad->size))
3f764659
JJ
7490 return FALSE;
7491
7492 need_pad->contents = p;
7493 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7494 }
7495 else
7496 {
7497 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7498 if (p == NULL)
7499 return FALSE;
7500
7501 need_pad->contents = p;
7502 }
7503
7504 memset (need_pad->contents + need_pad->size, 0, 8);
7505 need_pad->size += 8;
7506 }
7507
411e1bfb
AM
7508 return TRUE;
7509}
7510
3e04d765
AM
7511/* Analyze inline PLT call relocations to see whether calls to locally
7512 defined functions can be converted to direct calls. */
7513
7514bfd_boolean
7515ppc64_elf_inline_plt (struct bfd_link_info *info)
7516{
7517 struct ppc_link_hash_table *htab;
7518 bfd *ibfd;
7519 asection *sec;
7520 bfd_vma low_vma, high_vma, limit;
7521
7522 htab = ppc_hash_table (info);
7523 if (htab == NULL)
7524 return FALSE;
7525
7526 /* A bl insn can reach -0x2000000 to 0x1fffffc. The limit is
7527 reduced somewhat to cater for possible stubs that might be added
7528 between the call and its destination. */
7529 if (htab->params->group_size < 0)
7530 {
7531 limit = -htab->params->group_size;
7532 if (limit == 1)
7533 limit = 0x1e00000;
7534 }
7535 else
7536 {
7537 limit = htab->params->group_size;
7538 if (limit == 1)
7539 limit = 0x1c00000;
7540 }
7541
7542 low_vma = -1;
7543 high_vma = 0;
7544 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
7545 if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
7546 {
7547 if (low_vma > sec->vma)
7548 low_vma = sec->vma;
7549 if (high_vma < sec->vma + sec->size)
7550 high_vma = sec->vma + sec->size;
7551 }
7552
7553 /* If a "bl" can reach anywhere in local code sections, then we can
7554 convert all inline PLT sequences to direct calls when the symbol
7555 is local. */
7556 if (high_vma - low_vma < limit)
7557 {
7558 htab->can_convert_all_inline_plt = 1;
7559 return TRUE;
7560 }
7561
7562 /* Otherwise, go looking through relocs for cases where a direct
7563 call won't reach. Mark the symbol on any such reloc to disable
7564 the optimization and keep the PLT entry as it seems likely that
7565 this will be better than creating trampolines. Note that this
7566 will disable the optimization for all inline PLT calls to a
7567 particular symbol, not just those that won't reach. The
7568 difficulty in doing a more precise optimization is that the
7569 linker needs to make a decision depending on whether a
7570 particular R_PPC64_PLTCALL insn can be turned into a direct
7571 call, for each of the R_PPC64_PLTSEQ and R_PPC64_PLT16* insns in
7572 the sequence, and there is nothing that ties those relocs
7573 together except their symbol. */
7574
7575 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7576 {
7577 Elf_Internal_Shdr *symtab_hdr;
7578 Elf_Internal_Sym *local_syms;
7579
7580 if (!is_ppc64_elf (ibfd))
7581 continue;
7582
7583 local_syms = NULL;
7584 symtab_hdr = &elf_symtab_hdr (ibfd);
7585
7586 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7587 if (ppc64_elf_section_data (sec)->has_pltcall
7588 && !bfd_is_abs_section (sec->output_section))
7589 {
7590 Elf_Internal_Rela *relstart, *rel, *relend;
7591
7592 /* Read the relocations. */
7593 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7594 info->keep_memory);
7595 if (relstart == NULL)
7596 return FALSE;
7597
7598 relend = relstart + sec->reloc_count;
435edf0b 7599 for (rel = relstart; rel < relend; rel++)
3e04d765
AM
7600 {
7601 enum elf_ppc64_reloc_type r_type;
7602 unsigned long r_symndx;
7603 asection *sym_sec;
7604 struct elf_link_hash_entry *h;
7605 Elf_Internal_Sym *sym;
7606 unsigned char *tls_maskp;
7607
7608 r_type = ELF64_R_TYPE (rel->r_info);
5663e321
AM
7609 if (r_type != R_PPC64_PLTCALL
7610 && r_type != R_PPC64_PLTCALL_NOTOC)
3e04d765
AM
7611 continue;
7612
7613 r_symndx = ELF64_R_SYM (rel->r_info);
7614 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
7615 r_symndx, ibfd))
7616 {
7617 if (elf_section_data (sec)->relocs != relstart)
7618 free (relstart);
c9594989 7619 if (symtab_hdr->contents != (bfd_byte *) local_syms)
3e04d765
AM
7620 free (local_syms);
7621 return FALSE;
7622 }
7623
7624 if (sym_sec != NULL && sym_sec->output_section != NULL)
7625 {
7626 bfd_vma from, to;
7627 if (h != NULL)
7628 to = h->root.u.def.value;
7629 else
7630 to = sym->st_value;
7631 to += (rel->r_addend
7632 + sym_sec->output_offset
7633 + sym_sec->output_section->vma);
7634 from = (rel->r_offset
7635 + sec->output_offset
7636 + sec->output_section->vma);
5663e321
AM
7637 if (to - from + limit < 2 * limit
7638 && !(r_type == R_PPC64_PLTCALL_NOTOC
7639 && (((h ? h->other : sym->st_other)
7640 & STO_PPC64_LOCAL_MASK)
4a4e7361 7641 > 1 << STO_PPC64_LOCAL_BIT)))
3e04d765
AM
7642 *tls_maskp &= ~PLT_KEEP;
7643 }
7644 }
7645 if (elf_section_data (sec)->relocs != relstart)
7646 free (relstart);
7647 }
7648
7649 if (local_syms != NULL
7650 && symtab_hdr->contents != (unsigned char *) local_syms)
7651 {
7652 if (!info->keep_memory)
7653 free (local_syms);
7654 else
7655 symtab_hdr->contents = (unsigned char *) local_syms;
7656 }
7657 }
7658
7659 return TRUE;
7660}
7661
e1918d23 7662/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 7663
e1918d23 7664asection *
e7d1c40c 7665ppc64_elf_tls_setup (struct bfd_link_info *info)
411e1bfb 7666{
411e1bfb 7667 struct ppc_link_hash_table *htab;
9e7028aa 7668 struct elf_link_hash_entry *tga, *tga_fd, *desc, *desc_fd;
411e1bfb 7669
411e1bfb 7670 htab = ppc_hash_table (info);
4dfe6ac6
NC
7671 if (htab == NULL)
7672 return NULL;
7673
ee67d69a
AM
7674 if (abiversion (info->output_bfd) == 1)
7675 htab->opd_abi = 1;
7676
e7d1c40c 7677 if (htab->params->no_multi_toc)
33c0ec9d
AM
7678 htab->do_multi_toc = 0;
7679 else if (!htab->do_multi_toc)
e7d1c40c 7680 htab->params->no_multi_toc = 1;
33c0ec9d 7681
8b5f1ed8
AM
7682 /* Default to --no-plt-localentry, as this option can cause problems
7683 with symbol interposition. For example, glibc libpthread.so and
7684 libc.so duplicate many pthread symbols, with a fallback
7685 implementation in libc.so. In some cases the fallback does more
7686 work than the pthread implementation. __pthread_condattr_destroy
7687 is one such symbol: the libpthread.so implementation is
7688 localentry:0 while the libc.so implementation is localentry:8.
7689 An app that "cleverly" uses dlopen to only load necessary
7690 libraries at runtime may omit loading libpthread.so when not
7691 running multi-threaded, which then results in the libc.so
7692 fallback symbols being used and ld.so complaining. Now there
7693 are workarounds in ld (see non_zero_localentry) to detect the
7694 pthread situation, but that may not be the only case where
7695 --plt-localentry can cause trouble. */
f378ab09 7696 if (htab->params->plt_localentry0 < 0)
8b5f1ed8 7697 htab->params->plt_localentry0 = 0;
d44c746a
AM
7698 if (htab->params->plt_localentry0
7699 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
7700 FALSE, FALSE, FALSE) == NULL)
cf97bcb0
AM
7701 _bfd_error_handler
7702 (_("warning: --plt-localentry is especially dangerous without "
7703 "ld.so support to detect ABI violations"));
f378ab09 7704
9e7028aa
AM
7705 tga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7706 FALSE, FALSE, TRUE);
7707 htab->tls_get_addr = ppc_elf_hash_entry (tga);
7708
a7f2871e 7709 /* Move dynamic linking info to the function descriptor sym. */
9e7028aa
AM
7710 if (tga != NULL)
7711 func_desc_adjust (tga, info);
7712 tga_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7713 FALSE, FALSE, TRUE);
7714 htab->tls_get_addr_fd = ppc_elf_hash_entry (tga_fd);
7715
7716 desc = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_desc",
7717 FALSE, FALSE, TRUE);
7718 htab->tga_desc = ppc_elf_hash_entry (desc);
7719 if (desc != NULL)
7720 func_desc_adjust (desc, info);
7721 desc_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_desc",
7722 FALSE, FALSE, TRUE);
7723 htab->tga_desc_fd = ppc_elf_hash_entry (desc_fd);
7724
7c9cf415 7725 if (htab->params->tls_get_addr_opt)
a7f2871e 7726 {
9e7028aa 7727 struct elf_link_hash_entry *opt, *opt_fd;
a7f2871e
AM
7728
7729 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7730 FALSE, FALSE, TRUE);
7731 if (opt != NULL)
7732 func_desc_adjust (opt, info);
7733 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7734 FALSE, FALSE, TRUE);
7735 if (opt_fd != NULL
7736 && (opt_fd->root.type == bfd_link_hash_defined
7737 || opt_fd->root.type == bfd_link_hash_defweak))
7738 {
7739 /* If glibc supports an optimized __tls_get_addr call stub,
7740 signalled by the presence of __tls_get_addr_opt, and we'll
7741 be calling __tls_get_addr via a plt call stub, then
7742 make __tls_get_addr point to __tls_get_addr_opt. */
9e7028aa
AM
7743 if (!(htab->elf.dynamic_sections_created
7744 && tga_fd != NULL
7745 && (tga_fd->type == STT_FUNC
7746 || tga_fd->needs_plt)
7747 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
7748 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd))))
7749 tga_fd = NULL;
7750 if (!(htab->elf.dynamic_sections_created
7751 && desc_fd != NULL
7752 && (desc_fd->type == STT_FUNC
7753 || desc_fd->needs_plt)
7754 && !(SYMBOL_CALLS_LOCAL (info, desc_fd)
7755 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, desc_fd))))
7756 desc_fd = NULL;
7757
7758 if (tga_fd != NULL || desc_fd != NULL)
7759 {
7760 struct plt_entry *ent = NULL;
7761
7762 if (tga_fd != NULL)
7763 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7764 if (ent->plt.refcount > 0)
7765 break;
7766 if (ent == NULL && desc_fd != NULL)
7767 for (ent = desc_fd->plt.plist; ent != NULL; ent = ent->next)
7768 if (ent->plt.refcount > 0)
7769 break;
a7f2871e
AM
7770 if (ent != NULL)
7771 {
9e7028aa
AM
7772 if (tga_fd != NULL)
7773 {
7774 tga_fd->root.type = bfd_link_hash_indirect;
7775 tga_fd->root.u.i.link = &opt_fd->root;
7776 tga_fd->root.u.i.warning = NULL;
7777 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
7778 }
7779 if (desc_fd != NULL)
7780 {
7781 desc_fd->root.type = bfd_link_hash_indirect;
7782 desc_fd->root.u.i.link = &opt_fd->root;
7783 desc_fd->root.u.i.warning = NULL;
7784 ppc64_elf_copy_indirect_symbol (info, opt_fd, desc_fd);
7785 }
b531344c 7786 opt_fd->mark = 1;
a7f2871e
AM
7787 if (opt_fd->dynindx != -1)
7788 {
7789 /* Use __tls_get_addr_opt in dynamic relocations. */
7790 opt_fd->dynindx = -1;
7791 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7792 opt_fd->dynstr_index);
7793 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
854b41e7 7794 return NULL;
a7f2871e 7795 }
9e7028aa 7796 if (tga_fd != NULL)
a7f2871e 7797 {
9e7028aa
AM
7798 htab->tls_get_addr_fd = ppc_elf_hash_entry (opt_fd);
7799 tga = &htab->tls_get_addr->elf;
7800 if (opt != NULL && tga != NULL)
7801 {
7802 tga->root.type = bfd_link_hash_indirect;
7803 tga->root.u.i.link = &opt->root;
7804 tga->root.u.i.warning = NULL;
7805 ppc64_elf_copy_indirect_symbol (info, opt, tga);
7806 opt->mark = 1;
7807 _bfd_elf_link_hash_hide_symbol (info, opt,
7808 tga->forced_local);
7809 htab->tls_get_addr = ppc_elf_hash_entry (opt);
7810 }
7811 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7812 htab->tls_get_addr_fd->is_func_descriptor = 1;
7813 if (htab->tls_get_addr != NULL)
7814 {
7815 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7816 htab->tls_get_addr->is_func = 1;
7817 }
a7f2871e 7818 }
9e7028aa 7819 if (desc_fd != NULL)
a7f2871e 7820 {
9e7028aa
AM
7821 htab->tga_desc_fd = ppc_elf_hash_entry (opt_fd);
7822 if (opt != NULL && desc != NULL)
7823 {
7824 desc->root.type = bfd_link_hash_indirect;
7825 desc->root.u.i.link = &opt->root;
7826 desc->root.u.i.warning = NULL;
7827 ppc64_elf_copy_indirect_symbol (info, opt, desc);
7828 opt->mark = 1;
7829 _bfd_elf_link_hash_hide_symbol (info, opt,
7830 desc->forced_local);
7831 htab->tga_desc = ppc_elf_hash_entry (opt);
7832 }
7833 htab->tga_desc_fd->oh = htab->tga_desc;
7834 htab->tga_desc_fd->is_func_descriptor = 1;
7835 if (htab->tga_desc != NULL)
7836 {
7837 htab->tga_desc->oh = htab->tga_desc_fd;
7838 htab->tga_desc->is_func = 1;
7839 }
a7f2871e
AM
7840 }
7841 }
7842 }
7843 }
7c9cf415
AM
7844 else if (htab->params->tls_get_addr_opt < 0)
7845 htab->params->tls_get_addr_opt = 0;
a7f2871e 7846 }
9e7028aa
AM
7847
7848 if (htab->tga_desc_fd != NULL
7849 && htab->params->tls_get_addr_opt
7850 && htab->params->no_tls_get_addr_regsave == -1)
7851 htab->params->no_tls_get_addr_regsave = 0;
7852
33c0ec9d 7853 return _bfd_elf_tls_setup (info->output_bfd, info);
3a71aa26 7854}
8387904d 7855
3a71aa26 7856/* Return TRUE iff REL is a branch reloc with a global symbol matching
9e7028aa 7857 any of HASH1, HASH2, HASH3, or HASH4. */
8387904d 7858
3a71aa26
AM
7859static bfd_boolean
7860branch_reloc_hash_match (const bfd *ibfd,
7861 const Elf_Internal_Rela *rel,
7862 const struct ppc_link_hash_entry *hash1,
9e7028aa
AM
7863 const struct ppc_link_hash_entry *hash2,
7864 const struct ppc_link_hash_entry *hash3,
7865 const struct ppc_link_hash_entry *hash4)
3a71aa26
AM
7866{
7867 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7868 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7869 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7870
e054468f 7871 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 7872 {
3a71aa26
AM
7873 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7874 struct elf_link_hash_entry *h;
8387904d 7875
3a71aa26 7876 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7877 h = elf_follow_link (h);
9e7028aa
AM
7878 if (h == &hash1->elf || h == &hash2->elf
7879 || h == &hash3->elf || h == &hash4->elf)
3a71aa26 7880 return TRUE;
a48ebf4d 7881 }
3a71aa26 7882 return FALSE;
951fd09b 7883}
411e1bfb 7884
951fd09b
AM
7885/* Run through all the TLS relocs looking for optimization
7886 opportunities. The linker has been hacked (see ppc64elf.em) to do
7887 a preliminary section layout so that we know the TLS segment
7888 offsets. We can't optimize earlier because some optimizations need
7889 to know the tp offset, and we need to optimize before allocating
7890 dynamic relocations. */
7891
7892bfd_boolean
33c0ec9d 7893ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
7894{
7895 bfd *ibfd;
7896 asection *sec;
7897 struct ppc_link_hash_table *htab;
663a1470 7898 unsigned char *toc_ref;
102890f0 7899 int pass;
951fd09b 7900
3cbc1e5e 7901 if (!bfd_link_executable (info))
411e1bfb
AM
7902 return TRUE;
7903
951fd09b 7904 htab = ppc_hash_table (info);
4dfe6ac6
NC
7905 if (htab == NULL)
7906 return FALSE;
7907
663a1470
AM
7908 /* Make two passes over the relocs. On the first pass, mark toc
7909 entries involved with tls relocs, and check that tls relocs
7910 involved in setting up a tls_get_addr call are indeed followed by
7911 such a call. If they are not, we can't do any tls optimization.
7912 On the second pass twiddle tls_mask flags to notify
7913 relocate_section that optimization can be done, and adjust got
7914 and plt refcounts. */
7915 toc_ref = NULL;
7916 for (pass = 0; pass < 2; ++pass)
c72f2fb2 7917 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
663a1470
AM
7918 {
7919 Elf_Internal_Sym *locsyms = NULL;
7920 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7921
102890f0
AM
7922 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7923 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7924 {
7925 Elf_Internal_Rela *relstart, *rel, *relend;
663a1470 7926 bfd_boolean found_tls_get_addr_arg = 0;
411e1bfb 7927
102890f0
AM
7928 /* Read the relocations. */
7929 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7930 info->keep_memory);
7931 if (relstart == NULL)
2915c55b
JK
7932 {
7933 free (toc_ref);
7934 return FALSE;
7935 }
411e1bfb 7936
102890f0
AM
7937 relend = relstart + sec->reloc_count;
7938 for (rel = relstart; rel < relend; rel++)
7939 {
7940 enum elf_ppc64_reloc_type r_type;
7941 unsigned long r_symndx;
7942 struct elf_link_hash_entry *h;
7943 Elf_Internal_Sym *sym;
7944 asection *sym_sec;
f961d9dd 7945 unsigned char *tls_mask;
46e9995a 7946 unsigned int tls_set, tls_clear, tls_type = 0;
102890f0
AM
7947 bfd_vma value;
7948 bfd_boolean ok_tprel, is_local;
7949 long toc_ref_index = 0;
7950 int expecting_tls_get_addr = 0;
663a1470 7951 bfd_boolean ret = FALSE;
411e1bfb 7952
102890f0
AM
7953 r_symndx = ELF64_R_SYM (rel->r_info);
7954 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
7955 r_symndx, ibfd))
7956 {
7957 err_free_rel:
7958 if (elf_section_data (sec)->relocs != relstart)
7959 free (relstart);
c9594989
AM
7960 free (toc_ref);
7961 if (elf_symtab_hdr (ibfd).contents
7962 != (unsigned char *) locsyms)
102890f0 7963 free (locsyms);
663a1470 7964 return ret;
102890f0 7965 }
411e1bfb 7966
102890f0
AM
7967 if (h != NULL)
7968 {
766bc656
AM
7969 if (h->root.type == bfd_link_hash_defined
7970 || h->root.type == bfd_link_hash_defweak)
7971 value = h->root.u.def.value;
7972 else if (h->root.type == bfd_link_hash_undefweak)
7973 value = 0;
7974 else
663a1470
AM
7975 {
7976 found_tls_get_addr_arg = 0;
7977 continue;
7978 }
102890f0
AM
7979 }
7980 else
7981 /* Symbols referenced by TLS relocs must be of type
7982 STT_TLS. So no need for .opd local sym adjust. */
7983 value = sym->st_value;
7984
7985 ok_tprel = FALSE;
f749f26e
AM
7986 is_local = SYMBOL_REFERENCES_LOCAL (info, h);
7987 if (is_local)
102890f0 7988 {
766bc656
AM
7989 if (h != NULL
7990 && h->root.type == bfd_link_hash_undefweak)
7991 ok_tprel = TRUE;
c27b8c2a
AM
7992 else if (sym_sec != NULL
7993 && sym_sec->output_section != NULL)
766bc656
AM
7994 {
7995 value += sym_sec->output_offset;
7996 value += sym_sec->output_section->vma;
0b147428 7997 value -= htab->elf.tls_sec->vma + TP_OFFSET;
c213164a
AM
7998 /* Note that even though the prefix insns
7999 allow a 1<<33 offset we use the same test
8000 as for addis;addi. There may be a mix of
8001 pcrel and non-pcrel code and the decision
8002 to optimise is per symbol, not per TLS
8003 sequence. */
0b147428 8004 ok_tprel = value + 0x80008000ULL < 1ULL << 32;
766bc656 8005 }
102890f0 8006 }
951fd09b 8007
102890f0 8008 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
8009 /* If this section has old-style __tls_get_addr calls
8010 without marker relocs, then check that each
8011 __tls_get_addr call reloc is preceded by a reloc
8012 that conceivably belongs to the __tls_get_addr arg
8013 setup insn. If we don't find matching arg setup
8014 relocs, don't do any tls optimization. */
8015 if (pass == 0
9737e8af 8016 && sec->nomark_tls_get_addr
663a1470 8017 && h != NULL
ed7007c1 8018 && is_tls_get_addr (h, htab)
663a1470
AM
8019 && !found_tls_get_addr_arg
8020 && is_branch_reloc (r_type))
8021 {
25f53a85 8022 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
8023 "TLS optimization disabled\n"),
8024 ibfd, sec, rel->r_offset);
8025 ret = TRUE;
8026 goto err_free_rel;
8027 }
8028
8029 found_tls_get_addr_arg = 0;
102890f0
AM
8030 switch (r_type)
8031 {
8032 case R_PPC64_GOT_TLSLD16:
8033 case R_PPC64_GOT_TLSLD16_LO:
87c69f97 8034 case R_PPC64_GOT_TLSLD_PCREL34:
102890f0 8035 expecting_tls_get_addr = 1;
663a1470 8036 found_tls_get_addr_arg = 1;
1a0670f3 8037 /* Fall through. */
102890f0
AM
8038
8039 case R_PPC64_GOT_TLSLD16_HI:
8040 case R_PPC64_GOT_TLSLD16_HA:
8041 /* These relocs should never be against a symbol
8042 defined in a shared lib. Leave them alone if
8043 that turns out to be the case. */
8044 if (!is_local)
8045 continue;
411e1bfb 8046
102890f0 8047 /* LD -> LE */
411e1bfb 8048 tls_set = 0;
102890f0
AM
8049 tls_clear = TLS_LD;
8050 tls_type = TLS_TLS | TLS_LD;
8051 break;
411e1bfb 8052
102890f0
AM
8053 case R_PPC64_GOT_TLSGD16:
8054 case R_PPC64_GOT_TLSGD16_LO:
87c69f97 8055 case R_PPC64_GOT_TLSGD_PCREL34:
102890f0 8056 expecting_tls_get_addr = 1;
663a1470 8057 found_tls_get_addr_arg = 1;
1a0670f3 8058 /* Fall through. */
102890f0
AM
8059
8060 case R_PPC64_GOT_TLSGD16_HI:
8061 case R_PPC64_GOT_TLSGD16_HA:
8062 if (ok_tprel)
8063 /* GD -> LE */
411e1bfb 8064 tls_set = 0;
102890f0
AM
8065 else
8066 /* GD -> IE */
b00a0a86 8067 tls_set = TLS_TLS | TLS_GDIE;
102890f0
AM
8068 tls_clear = TLS_GD;
8069 tls_type = TLS_TLS | TLS_GD;
8070 break;
8071
87c69f97 8072 case R_PPC64_GOT_TPREL_PCREL34:
102890f0
AM
8073 case R_PPC64_GOT_TPREL16_DS:
8074 case R_PPC64_GOT_TPREL16_LO_DS:
8075 case R_PPC64_GOT_TPREL16_HI:
8076 case R_PPC64_GOT_TPREL16_HA:
8077 if (ok_tprel)
8078 {
8079 /* IE -> LE */
8080 tls_set = 0;
8081 tls_clear = TLS_TPREL;
8082 tls_type = TLS_TLS | TLS_TPREL;
8083 break;
8084 }
411e1bfb
AM
8085 continue;
8086
727fc41e 8087 case R_PPC64_TLSLD:
7d04a20a
AM
8088 if (!is_local)
8089 continue;
8090 /* Fall through. */
8091 case R_PPC64_TLSGD:
23cedd1d
AM
8092 if (rel + 1 < relend
8093 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
8094 {
8095 if (pass != 0
2cdcc330 8096 && (ELF64_R_TYPE (rel[1].r_info)
5663e321
AM
8097 != R_PPC64_PLTSEQ)
8098 && (ELF64_R_TYPE (rel[1].r_info)
8099 != R_PPC64_PLTSEQ_NOTOC))
23cedd1d
AM
8100 {
8101 r_symndx = ELF64_R_SYM (rel[1].r_info);
8102 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms,
2cdcc330 8103 r_symndx, ibfd))
23cedd1d
AM
8104 goto err_free_rel;
8105 if (h != NULL)
8106 {
8107 struct plt_entry *ent = NULL;
8108
8109 for (ent = h->plt.plist;
8110 ent != NULL;
8111 ent = ent->next)
8112 if (ent->addend == rel[1].r_addend)
8113 break;
8114
8115 if (ent != NULL
8116 && ent->plt.refcount > 0)
8117 ent->plt.refcount -= 1;
8118 }
8119 }
8120 continue;
8121 }
663a1470 8122 found_tls_get_addr_arg = 1;
1a0670f3 8123 /* Fall through. */
663a1470
AM
8124
8125 case R_PPC64_TLS:
8126 case R_PPC64_TOC16:
8127 case R_PPC64_TOC16_LO:
102890f0
AM
8128 if (sym_sec == NULL || sym_sec != toc)
8129 continue;
8130
8131 /* Mark this toc entry as referenced by a TLS
8132 code sequence. We can do that now in the
8133 case of R_PPC64_TLS, and after checking for
8134 tls_get_addr for the TOC16 relocs. */
8135 if (toc_ref == NULL)
2cdcc330
AM
8136 toc_ref
8137 = bfd_zmalloc (toc->output_section->rawsize / 8);
663a1470
AM
8138 if (toc_ref == NULL)
8139 goto err_free_rel;
8140
102890f0
AM
8141 if (h != NULL)
8142 value = h->root.u.def.value;
8143 else
8144 value = sym->st_value;
8145 value += rel->r_addend;
73242275
AM
8146 if (value % 8 != 0)
8147 continue;
8148 BFD_ASSERT (value < toc->size
8149 && toc->output_offset % 8 == 0);
663a1470 8150 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
8151 if (r_type == R_PPC64_TLS
8152 || r_type == R_PPC64_TLSGD
8153 || r_type == R_PPC64_TLSLD)
102890f0
AM
8154 {
8155 toc_ref[toc_ref_index] = 1;
8156 continue;
8157 }
8158
8159 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8160 continue;
8161
8162 tls_set = 0;
8163 tls_clear = 0;
8164 expecting_tls_get_addr = 2;
8165 break;
8166
8167 case R_PPC64_TPREL64:
8168 if (pass == 0
8169 || sec != toc
8170 || toc_ref == NULL
663a1470 8171 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8172 continue;
8173 if (ok_tprel)
8174 {
8175 /* IE -> LE */
8176 tls_set = TLS_EXPLICIT;
8177 tls_clear = TLS_TPREL;
8178 break;
8179 }
8180 continue;
8181
8182 case R_PPC64_DTPMOD64:
8183 if (pass == 0
8184 || sec != toc
8185 || toc_ref == NULL
663a1470 8186 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8187 continue;
8188 if (rel + 1 < relend
8189 && (rel[1].r_info
8190 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8191 && rel[1].r_offset == rel->r_offset + 8)
8192 {
8193 if (ok_tprel)
8194 /* GD -> LE */
8195 tls_set = TLS_EXPLICIT | TLS_GD;
8196 else
8197 /* GD -> IE */
b00a0a86 8198 tls_set = TLS_EXPLICIT | TLS_GD | TLS_GDIE;
102890f0
AM
8199 tls_clear = TLS_GD;
8200 }
8201 else
8202 {
8203 if (!is_local)
8204 continue;
8205
8206 /* LD -> LE */
8207 tls_set = TLS_EXPLICIT;
8208 tls_clear = TLS_LD;
8209 }
8210 break;
8211
8212 default:
8213 continue;
8214 }
8215
8216 if (pass == 0)
8217 {
727fc41e 8218 if (!expecting_tls_get_addr
9737e8af 8219 || !sec->nomark_tls_get_addr)
102890f0
AM
8220 continue;
8221
3a71aa26
AM
8222 if (rel + 1 < relend
8223 && branch_reloc_hash_match (ibfd, rel + 1,
9e7028aa
AM
8224 htab->tls_get_addr_fd,
8225 htab->tga_desc_fd,
3a71aa26 8226 htab->tls_get_addr,
9e7028aa 8227 htab->tga_desc))
102890f0 8228 {
3a71aa26 8229 if (expecting_tls_get_addr == 2)
102890f0 8230 {
3a71aa26 8231 /* Check for toc tls entries. */
f961d9dd 8232 unsigned char *toc_tls;
3a71aa26
AM
8233 int retval;
8234
8235 retval = get_tls_mask (&toc_tls, NULL, NULL,
8236 &locsyms,
8237 rel, ibfd);
8238 if (retval == 0)
8239 goto err_free_rel;
663a1470
AM
8240 if (toc_tls != NULL)
8241 {
37da22e5
AM
8242 if ((*toc_tls & TLS_TLS) != 0
8243 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0))
663a1470
AM
8244 found_tls_get_addr_arg = 1;
8245 if (retval > 1)
8246 toc_ref[toc_ref_index] = 1;
8247 }
102890f0 8248 }
3a71aa26 8249 continue;
102890f0
AM
8250 }
8251
102890f0
AM
8252 /* Uh oh, we didn't find the expected call. We
8253 could just mark this symbol to exclude it
8254 from tls optimization but it's safer to skip
663a1470 8255 the entire optimization. */
695344c0 8256 /* xgettext:c-format */
25f53a85 8257 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8258 "TLS optimization disabled\n"),
8259 ibfd, sec, rel->r_offset);
8260 ret = TRUE;
8261 goto err_free_rel;
102890f0
AM
8262 }
8263
37da22e5
AM
8264 /* If we don't have old-style __tls_get_addr calls
8265 without TLSGD/TLSLD marker relocs, and we haven't
8266 found a new-style __tls_get_addr call with a
8267 marker for this symbol, then we either have a
8268 broken object file or an -mlongcall style
8269 indirect call to __tls_get_addr without a marker.
8270 Disable optimization in this case. */
8271 if ((tls_clear & (TLS_GD | TLS_LD)) != 0
8272 && (tls_set & TLS_EXPLICIT) == 0
9737e8af 8273 && !sec->nomark_tls_get_addr
37da22e5
AM
8274 && ((*tls_mask & (TLS_TLS | TLS_MARK))
8275 != (TLS_TLS | TLS_MARK)))
8276 continue;
8277
7d04a20a 8278 if (expecting_tls_get_addr == 1 + !sec->nomark_tls_get_addr)
102890f0 8279 {
23cedd1d
AM
8280 struct plt_entry *ent = NULL;
8281
9e7028aa
AM
8282 if (htab->tls_get_addr_fd != NULL)
8283 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8284 ent != NULL;
8285 ent = ent->next)
8286 if (ent->addend == 0)
8287 break;
8288
8289 if (ent == NULL && htab->tga_desc_fd != NULL)
8290 for (ent = htab->tga_desc_fd->elf.plt.plist;
8291 ent != NULL;
8292 ent = ent->next)
8293 if (ent->addend == 0)
8294 break;
8295
8296 if (ent == NULL && htab->tls_get_addr != NULL)
23cedd1d
AM
8297 for (ent = htab->tls_get_addr->elf.plt.plist;
8298 ent != NULL;
8299 ent = ent->next)
8300 if (ent->addend == 0)
102890f0 8301 break;
411e1bfb 8302
9e7028aa
AM
8303 if (ent == NULL && htab->tga_desc != NULL)
8304 for (ent = htab->tga_desc->elf.plt.plist;
23cedd1d
AM
8305 ent != NULL;
8306 ent = ent->next)
8307 if (ent->addend == 0)
102890f0 8308 break;
23cedd1d
AM
8309
8310 if (ent != NULL
8311 && ent->plt.refcount > 0)
8312 ent->plt.refcount -= 1;
102890f0 8313 }
411e1bfb 8314
102890f0 8315 if (tls_clear == 0)
30038c59
AM
8316 continue;
8317
102890f0
AM
8318 if ((tls_set & TLS_EXPLICIT) == 0)
8319 {
8320 struct got_entry *ent;
411e1bfb 8321
102890f0
AM
8322 /* Adjust got entry for this reloc. */
8323 if (h != NULL)
8324 ent = h->got.glist;
8325 else
8326 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 8327
102890f0
AM
8328 for (; ent != NULL; ent = ent->next)
8329 if (ent->addend == rel->r_addend
8330 && ent->owner == ibfd
8331 && ent->tls_type == tls_type)
8332 break;
8333 if (ent == NULL)
8334 abort ();
411e1bfb 8335
102890f0
AM
8336 if (tls_set == 0)
8337 {
8338 /* We managed to get rid of a got entry. */
8339 if (ent->got.refcount > 0)
8340 ent->got.refcount -= 1;
8341 }
8342 }
8343 else
8344 {
8345 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8346 we'll lose one or two dyn relocs. */
8347 if (!dec_dynrel_count (rel->r_info, sec, info,
19e08130 8348 NULL, h, sym))
102890f0 8349 return FALSE;
411e1bfb 8350
102890f0
AM
8351 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8352 {
8353 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
19e08130 8354 NULL, h, sym))
102890f0
AM
8355 return FALSE;
8356 }
8357 }
411e1bfb 8358
46e9995a 8359 *tls_mask |= tls_set & 0xff;
102890f0
AM
8360 *tls_mask &= ~tls_clear;
8361 }
8c1d1bb8 8362
102890f0
AM
8363 if (elf_section_data (sec)->relocs != relstart)
8364 free (relstart);
8365 }
411e1bfb 8366
663a1470
AM
8367 if (locsyms != NULL
8368 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8369 {
8370 if (!info->keep_memory)
8371 free (locsyms);
8372 else
8373 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8374 }
8375 }
411e1bfb 8376
c9594989 8377 free (toc_ref);
9a23f96e 8378 htab->do_tls_opt = 1;
b34976b6 8379 return TRUE;
1e2f5b6e 8380}
b34976b6 8381
c5614fa4
AM
8382/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8383 the values of any global symbols in a toc section that has been
8384 edited. Globals in toc sections should be a rarity, so this function
8385 sets a flag if any are found in toc sections other than the one just
de194d85 8386 edited, so that further hash table traversals can be avoided. */
c5614fa4
AM
8387
8388struct adjust_toc_info
8389{
8390 asection *toc;
8391 unsigned long *skip;
8392 bfd_boolean global_toc_syms;
8393};
8394
ba761f19
AM
8395enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8396
c5614fa4
AM
8397static bfd_boolean
8398adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8399{
8400 struct ppc_link_hash_entry *eh;
8401 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 8402 unsigned long i;
c5614fa4 8403
c5614fa4
AM
8404 if (h->root.type != bfd_link_hash_defined
8405 && h->root.type != bfd_link_hash_defweak)
8406 return TRUE;
8407
ed7007c1 8408 eh = ppc_elf_hash_entry (h);
c5614fa4
AM
8409 if (eh->adjust_done)
8410 return TRUE;
8411
8412 if (eh->elf.root.u.def.section == toc_inf->toc)
8413 {
854b41e7
AM
8414 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8415 i = toc_inf->toc->rawsize >> 3;
c5614fa4 8416 else
854b41e7
AM
8417 i = eh->elf.root.u.def.value >> 3;
8418
ba761f19 8419 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4 8420 {
4eca0228 8421 _bfd_error_handler
854b41e7
AM
8422 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8423 do
8424 ++i;
ba761f19 8425 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 8426 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 8427 }
854b41e7
AM
8428
8429 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
8430 eh->adjust_done = 1;
8431 }
8432 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8433 toc_inf->global_toc_syms = TRUE;
8434
8435 return TRUE;
8436}
8437
39eeab25
AM
8438/* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8439 on a _LO variety toc/got reloc. */
560c8763
AM
8440
8441static bfd_boolean
39eeab25 8442ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
560c8763 8443{
2365f8d7
AM
8444 return ((insn & (0x3fu << 26)) == 12u << 26 /* addic */
8445 || (insn & (0x3fu << 26)) == 14u << 26 /* addi */
8446 || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */
8447 || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */
8448 || (insn & (0x3fu << 26)) == 36u << 26 /* stw */
8449 || (insn & (0x3fu << 26)) == 38u << 26 /* stb */
8450 || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */
8451 || (insn & (0x3fu << 26)) == 42u << 26 /* lha */
8452 || (insn & (0x3fu << 26)) == 44u << 26 /* sth */
8453 || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */
8454 || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */
8455 || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */
8456 || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */
8457 || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */
8458 || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */
8459 || (insn & (0x3fu << 26)) == 56u << 26 /* lq,lfq */
8460 || ((insn & (0x3fu << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
39eeab25
AM
8461 /* Exclude lfqu by testing reloc. If relocs are ever
8462 defined for the reduced D field in psq_lu then those
8463 will need testing too. */
8464 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8465 || ((insn & (0x3fu << 26)) == 58u << 26 /* ld,lwa */
39eeab25 8466 && (insn & 1) == 0)
2365f8d7
AM
8467 || (insn & (0x3fu << 26)) == 60u << 26 /* stfq */
8468 || ((insn & (0x3fu << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
39eeab25
AM
8469 /* Exclude stfqu. psq_stu as above for psq_lu. */
8470 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8471 || ((insn & (0x3fu << 26)) == 62u << 26 /* std,stq */
39eeab25 8472 && (insn & 1) == 0));
560c8763
AM
8473}
8474
4a421c53
AM
8475/* PCREL_OPT in one instance flags to the linker that a pair of insns:
8476 pld ra,symbol@got@pcrel
dd9b12c2 8477 load/store rt,off(ra)
4a421c53 8478 or
d4b87b1e 8479 pla ra,symbol@pcrel
dd9b12c2 8480 load/store rt,off(ra)
4a421c53 8481 may be translated to
dd9b12c2 8482 pload/pstore rt,symbol+off@pcrel
4a421c53
AM
8483 nop.
8484 This function returns true if the optimization is possible, placing
dd9b12c2 8485 the prefix insn in *PINSN1, a NOP in *PINSN2 and the offset in *POFF.
4a421c53
AM
8486
8487 On entry to this function, the linker has already determined that
d4b87b1e 8488 the pld can be replaced with pla: *PINSN1 is that pla insn,
4a421c53
AM
8489 while *PINSN2 is the second instruction. */
8490
8491static bfd_boolean
dd9b12c2 8492xlate_pcrel_opt (uint64_t *pinsn1, uint64_t *pinsn2, bfd_signed_vma *poff)
4a421c53 8493{
77486630
AM
8494 uint64_t insn1 = *pinsn1;
8495 uint64_t insn2 = *pinsn2;
dd9b12c2 8496 bfd_signed_vma off;
4a421c53 8497
77486630
AM
8498 if ((insn2 & (63ULL << 58)) == 1ULL << 58)
8499 {
8500 /* Check that regs match. */
8501 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
8502 return FALSE;
8503
8504 /* P8LS or PMLS form, non-pcrel. */
8505 if ((insn2 & (-1ULL << 50) & ~(1ULL << 56)) != (1ULL << 58))
8506 return FALSE;
8507
8508 *pinsn1 = (insn2 & ~(31 << 16) & ~0x3ffff0000ffffULL) | (1ULL << 52);
8509 *pinsn2 = PNOP;
8510 off = ((insn2 >> 16) & 0x3ffff0000ULL) | (insn2 & 0xffff);
8511 *poff = (off ^ 0x200000000ULL) - 0x200000000ULL;
8512 return TRUE;
8513 }
8514
8515 insn2 >>= 32;
8516
4a421c53 8517 /* Check that regs match. */
77486630 8518 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
4a421c53
AM
8519 return FALSE;
8520
8521 switch ((insn2 >> 26) & 63)
8522 {
8523 default:
8524 return FALSE;
8525
8526 case 32: /* lwz */
8527 case 34: /* lbz */
8528 case 36: /* stw */
8529 case 38: /* stb */
8530 case 40: /* lhz */
8531 case 42: /* lha */
8532 case 44: /* sth */
8533 case 48: /* lfs */
8534 case 50: /* lfd */
8535 case 52: /* stfs */
8536 case 54: /* stfd */
8537 /* These are the PMLS cases, where we just need to tack a prefix
dd9b12c2 8538 on the insn. */
77486630 8539 insn1 = ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
4a421c53 8540 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8541 off = insn2 & 0xffff;
4a421c53
AM
8542 break;
8543
8544 case 58: /* lwa, ld */
dd9b12c2 8545 if ((insn2 & 1) != 0)
4a421c53 8546 return FALSE;
77486630 8547 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8548 | (insn2 & 2 ? 41ULL << 26 : 57ULL << 26)
8549 | (insn2 & (31ULL << 21)));
dd9b12c2 8550 off = insn2 & 0xfffc;
4a421c53
AM
8551 break;
8552
8553 case 57: /* lxsd, lxssp */
dd9b12c2 8554 if ((insn2 & 3) < 2)
4a421c53 8555 return FALSE;
77486630 8556 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8557 | ((40ULL | (insn2 & 3)) << 26)
8558 | (insn2 & (31ULL << 21)));
dd9b12c2 8559 off = insn2 & 0xfffc;
4a421c53
AM
8560 break;
8561
8562 case 61: /* stxsd, stxssp, lxv, stxv */
8563 if ((insn2 & 3) == 0)
8564 return FALSE;
8565 else if ((insn2 & 3) >= 2)
8566 {
77486630 8567 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8568 | ((44ULL | (insn2 & 3)) << 26)
8569 | (insn2 & (31ULL << 21)));
dd9b12c2 8570 off = insn2 & 0xfffc;
4a421c53
AM
8571 }
8572 else
8573 {
77486630 8574 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8575 | ((50ULL | (insn2 & 4) | ((insn2 & 8) >> 3)) << 26)
8576 | (insn2 & (31ULL << 21)));
dd9b12c2 8577 off = insn2 & 0xfff0;
4a421c53
AM
8578 }
8579 break;
8580
8581 case 56: /* lq */
77486630 8582 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53 8583 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8584 off = insn2 & 0xffff;
4a421c53
AM
8585 break;
8586
94ba9882
AM
8587 case 6: /* lxvp, stxvp */
8588 if ((insn2 & 0xe) != 0)
8589 return FALSE;
8590 insn1 = ((1ULL << 58) | (1ULL << 52)
8591 | ((insn2 & 1) == 0 ? 58ULL << 26 : 62ULL << 26)
8592 | (insn2 & (31ULL << 21)));
8593 off = insn2 & 0xfff0;
8594 break;
8595
4a421c53 8596 case 62: /* std, stq */
dd9b12c2 8597 if ((insn2 & 1) != 0)
4a421c53 8598 return FALSE;
77486630 8599 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8600 | ((insn2 & 2) == 0 ? 61ULL << 26 : 60ULL << 26)
8601 | (insn2 & (31ULL << 21)));
dd9b12c2 8602 off = insn2 & 0xfffc;
4a421c53
AM
8603 break;
8604 }
8605
77486630 8606 *pinsn1 = insn1;
4a421c53 8607 *pinsn2 = (uint64_t) NOP << 32;
dd9b12c2 8608 *poff = (off ^ 0x8000) - 0x8000;
4a421c53
AM
8609 return TRUE;
8610}
8611
c5614fa4
AM
8612/* Examine all relocs referencing .toc sections in order to remove
8613 unused .toc entries. */
8614
8615bfd_boolean
33c0ec9d 8616ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
8617{
8618 bfd *ibfd;
8619 struct adjust_toc_info toc_inf;
67f0cbdb 8620 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 8621
67f0cbdb 8622 htab->do_toc_opt = 1;
c5614fa4 8623 toc_inf.global_toc_syms = TRUE;
c72f2fb2 8624 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
c5614fa4
AM
8625 {
8626 asection *toc, *sec;
8627 Elf_Internal_Shdr *symtab_hdr;
8628 Elf_Internal_Sym *local_syms;
425b145b 8629 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
8630 unsigned long *skip, *drop;
8631 unsigned char *used;
8632 unsigned char *keep, last, some_unused;
8633
854b41e7
AM
8634 if (!is_ppc64_elf (ibfd))
8635 continue;
8636
c5614fa4
AM
8637 toc = bfd_get_section_by_name (ibfd, ".toc");
8638 if (toc == NULL
92b7a70f 8639 || toc->size == 0
dbaa2011
AM
8640 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8641 || discarded_section (toc))
c5614fa4
AM
8642 continue;
8643
425b145b 8644 toc_relocs = NULL;
c5614fa4 8645 local_syms = NULL;
0ffa91dd 8646 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
8647
8648 /* Look at sections dropped from the final link. */
8649 skip = NULL;
8650 relstart = NULL;
8651 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8652 {
8653 if (sec->reloc_count == 0
dbaa2011 8654 || !discarded_section (sec)
c5614fa4
AM
8655 || get_opd_info (sec)
8656 || (sec->flags & SEC_ALLOC) == 0
8657 || (sec->flags & SEC_DEBUGGING) != 0)
8658 continue;
8659
8660 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8661 if (relstart == NULL)
8662 goto error_ret;
8663
8664 /* Run through the relocs to see which toc entries might be
8665 unused. */
8666 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8667 {
8668 enum elf_ppc64_reloc_type r_type;
8669 unsigned long r_symndx;
8670 asection *sym_sec;
8671 struct elf_link_hash_entry *h;
8672 Elf_Internal_Sym *sym;
8673 bfd_vma val;
8674
8675 r_type = ELF64_R_TYPE (rel->r_info);
8676 switch (r_type)
8677 {
8678 default:
8679 continue;
8680
8681 case R_PPC64_TOC16:
8682 case R_PPC64_TOC16_LO:
8683 case R_PPC64_TOC16_HI:
8684 case R_PPC64_TOC16_HA:
8685 case R_PPC64_TOC16_DS:
8686 case R_PPC64_TOC16_LO_DS:
8687 break;
8688 }
8689
8690 r_symndx = ELF64_R_SYM (rel->r_info);
8691 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8692 r_symndx, ibfd))
8693 goto error_ret;
8694
8695 if (sym_sec != toc)
8696 continue;
8697
8698 if (h != NULL)
8699 val = h->root.u.def.value;
8700 else
8701 val = sym->st_value;
8702 val += rel->r_addend;
8703
8704 if (val >= toc->size)
8705 continue;
8706
8707 /* Anything in the toc ought to be aligned to 8 bytes.
8708 If not, don't mark as unused. */
8709 if (val & 7)
8710 continue;
8711
8712 if (skip == NULL)
8713 {
854b41e7 8714 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
8715 if (skip == NULL)
8716 goto error_ret;
8717 }
8718
ba761f19 8719 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
8720 }
8721
8722 if (elf_section_data (sec)->relocs != relstart)
8723 free (relstart);
8724 }
8725
ba761f19
AM
8726 /* For largetoc loads of address constants, we can convert
8727 . addis rx,2,addr@got@ha
8728 . ld ry,addr@got@l(rx)
8729 to
8730 . addis rx,2,addr@toc@ha
8731 . addi ry,rx,addr@toc@l
8732 when addr is within 2G of the toc pointer. This then means
8733 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 8734
ba761f19
AM
8735 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8736 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8737 && toc->reloc_count != 0)
8738 {
8739 /* Read toc relocs. */
425b145b
AM
8740 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8741 info->keep_memory);
8742 if (toc_relocs == NULL)
ba761f19
AM
8743 goto error_ret;
8744
425b145b 8745 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
8746 {
8747 enum elf_ppc64_reloc_type r_type;
8748 unsigned long r_symndx;
8749 asection *sym_sec;
8750 struct elf_link_hash_entry *h;
8751 Elf_Internal_Sym *sym;
8752 bfd_vma val, addr;
8753
8754 r_type = ELF64_R_TYPE (rel->r_info);
8755 if (r_type != R_PPC64_ADDR64)
8756 continue;
8757
8758 r_symndx = ELF64_R_SYM (rel->r_info);
8759 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8760 r_symndx, ibfd))
8761 goto error_ret;
8762
425b145b 8763 if (sym_sec == NULL
c27b8c2a 8764 || sym_sec->output_section == NULL
dbaa2011 8765 || discarded_section (sym_sec))
425b145b
AM
8766 continue;
8767
afe397ea 8768 if (!SYMBOL_REFERENCES_LOCAL (info, h))
ba761f19
AM
8769 continue;
8770
8771 if (h != NULL)
bddc25c9
AM
8772 {
8773 if (h->type == STT_GNU_IFUNC)
8774 continue;
8775 val = h->root.u.def.value;
8776 }
ba761f19 8777 else
bddc25c9
AM
8778 {
8779 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8780 continue;
8781 val = sym->st_value;
8782 }
ba761f19
AM
8783 val += rel->r_addend;
8784 val += sym_sec->output_section->vma + sym_sec->output_offset;
8785
8786 /* We don't yet know the exact toc pointer value, but we
8787 know it will be somewhere in the toc section. Don't
8788 optimize if the difference from any possible toc
8789 pointer is outside [ff..f80008000, 7fff7fff]. */
8790 addr = toc->output_section->vma + TOC_BASE_OFF;
8791 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8792 continue;
8793
8794 addr = toc->output_section->vma + toc->output_section->rawsize;
8795 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8796 continue;
8797
8798 if (skip == NULL)
8799 {
8800 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8801 if (skip == NULL)
8802 goto error_ret;
8803 }
8804
8805 skip[rel->r_offset >> 3]
425b145b 8806 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 8807 }
ba761f19
AM
8808 }
8809
c5614fa4
AM
8810 if (skip == NULL)
8811 continue;
8812
8813 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8814 if (used == NULL)
8815 {
8816 error_ret:
c9594989 8817 if (symtab_hdr->contents != (unsigned char *) local_syms)
c5614fa4
AM
8818 free (local_syms);
8819 if (sec != NULL
c5614fa4
AM
8820 && elf_section_data (sec)->relocs != relstart)
8821 free (relstart);
c9594989 8822 if (elf_section_data (toc)->relocs != toc_relocs)
425b145b 8823 free (toc_relocs);
c9594989 8824 free (skip);
c5614fa4
AM
8825 return FALSE;
8826 }
8827
30038c59
AM
8828 /* Now check all kept sections that might reference the toc.
8829 Check the toc itself last. */
8830 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8831 : ibfd->sections);
c5614fa4 8832 sec != NULL;
c5614fa4 8833 sec = (sec == toc ? NULL
c5614fa4 8834 : sec->next == NULL ? toc
30038c59 8835 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
8836 : sec->next))
8837 {
8838 int repeat;
8839
8840 if (sec->reloc_count == 0
dbaa2011 8841 || discarded_section (sec)
c5614fa4
AM
8842 || get_opd_info (sec)
8843 || (sec->flags & SEC_ALLOC) == 0
8844 || (sec->flags & SEC_DEBUGGING) != 0)
8845 continue;
8846
854b41e7
AM
8847 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8848 info->keep_memory);
c5614fa4 8849 if (relstart == NULL)
2915c55b
JK
8850 {
8851 free (used);
8852 goto error_ret;
8853 }
c5614fa4
AM
8854
8855 /* Mark toc entries referenced as used. */
c5614fa4 8856 do
d4f1ee75
AM
8857 {
8858 repeat = 0;
8859 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8860 {
8861 enum elf_ppc64_reloc_type r_type;
8862 unsigned long r_symndx;
8863 asection *sym_sec;
8864 struct elf_link_hash_entry *h;
8865 Elf_Internal_Sym *sym;
8866 bfd_vma val;
98528052 8867
d4f1ee75 8868 r_type = ELF64_R_TYPE (rel->r_info);
d4f1ee75
AM
8869 switch (r_type)
8870 {
8871 case R_PPC64_TOC16:
8872 case R_PPC64_TOC16_LO:
8873 case R_PPC64_TOC16_HI:
8874 case R_PPC64_TOC16_HA:
8875 case R_PPC64_TOC16_DS:
8876 case R_PPC64_TOC16_LO_DS:
8877 /* In case we're taking addresses of toc entries. */
8878 case R_PPC64_ADDR64:
8879 break;
c5614fa4 8880
d4f1ee75
AM
8881 default:
8882 continue;
8883 }
c5614fa4 8884
d4f1ee75
AM
8885 r_symndx = ELF64_R_SYM (rel->r_info);
8886 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8887 r_symndx, ibfd))
8888 {
8889 free (used);
8890 goto error_ret;
8891 }
c5614fa4 8892
d4f1ee75
AM
8893 if (sym_sec != toc)
8894 continue;
c5614fa4 8895
d4f1ee75
AM
8896 if (h != NULL)
8897 val = h->root.u.def.value;
8898 else
8899 val = sym->st_value;
8900 val += rel->r_addend;
ba761f19 8901
d4f1ee75
AM
8902 if (val >= toc->size)
8903 continue;
ba761f19 8904
d4f1ee75
AM
8905 if ((skip[val >> 3] & can_optimize) != 0)
8906 {
8907 bfd_vma off;
8908 unsigned char opc;
8909
8910 switch (r_type)
8911 {
8912 case R_PPC64_TOC16_HA:
ba761f19 8913 break;
ba761f19 8914
d4f1ee75
AM
8915 case R_PPC64_TOC16_LO_DS:
8916 off = rel->r_offset;
8917 off += (bfd_big_endian (ibfd) ? -2 : 3);
8918 if (!bfd_get_section_contents (ibfd, sec, &opc,
8919 off, 1))
8920 {
8921 free (used);
8922 goto error_ret;
8923 }
8924 if ((opc & (0x3f << 2)) == (58u << 2))
8925 break;
1a0670f3 8926 /* Fall through. */
ba761f19 8927
d4f1ee75
AM
8928 default:
8929 /* Wrong sort of reloc, or not a ld. We may
8930 as well clear ref_from_discarded too. */
8931 skip[val >> 3] = 0;
8932 }
8933 }
8934
8935 if (sec != toc)
8936 used[val >> 3] = 1;
8937 /* For the toc section, we only mark as used if this
8938 entry itself isn't unused. */
8939 else if ((used[rel->r_offset >> 3]
8940 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
8941 && !used[val >> 3])
8942 {
8943 /* Do all the relocs again, to catch reference
8944 chains. */
8945 repeat = 1;
8946 used[val >> 3] = 1;
8947 }
8948 }
8949 }
c5614fa4 8950 while (repeat);
854b41e7
AM
8951
8952 if (elf_section_data (sec)->relocs != relstart)
8953 free (relstart);
c5614fa4
AM
8954 }
8955
8956 /* Merge the used and skip arrays. Assume that TOC
8957 doublewords not appearing as either used or unused belong
de194d85 8958 to an entry more than one doubleword in size. */
c5614fa4
AM
8959 for (drop = skip, keep = used, last = 0, some_unused = 0;
8960 drop < skip + (toc->size + 7) / 8;
8961 ++drop, ++keep)
8962 {
8963 if (*keep)
8964 {
ba761f19
AM
8965 *drop &= ~ref_from_discarded;
8966 if ((*drop & can_optimize) != 0)
8967 some_unused = 1;
c5614fa4
AM
8968 last = 0;
8969 }
b140b010 8970 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
8971 {
8972 some_unused = 1;
ba761f19 8973 last = ref_from_discarded;
c5614fa4
AM
8974 }
8975 else
8976 *drop = last;
8977 }
8978
8979 free (used);
8980
8981 if (some_unused)
8982 {
8983 bfd_byte *contents, *src;
8984 unsigned long off;
d62b3684 8985 Elf_Internal_Sym *sym;
ba761f19 8986 bfd_boolean local_toc_syms = FALSE;
c5614fa4
AM
8987
8988 /* Shuffle the toc contents, and at the same time convert the
8989 skip array from booleans into offsets. */
8990 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8991 goto error_ret;
8992
8993 elf_section_data (toc)->this_hdr.contents = contents;
8994
8995 for (src = contents, off = 0, drop = skip;
8996 src < contents + toc->size;
8997 src += 8, ++drop)
8998 {
ba761f19
AM
8999 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9000 off += 8;
c5614fa4
AM
9001 else if (off != 0)
9002 {
9003 *drop = off;
9004 memcpy (src - off, src, 8);
9005 }
9006 }
854b41e7 9007 *drop = off;
c5614fa4
AM
9008 toc->rawsize = toc->size;
9009 toc->size = src - contents - off;
9010
ba761f19
AM
9011 /* Adjust addends for relocs against the toc section sym,
9012 and optimize any accesses we can. */
c5614fa4
AM
9013 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9014 {
9015 if (sec->reloc_count == 0
dbaa2011 9016 || discarded_section (sec))
c5614fa4
AM
9017 continue;
9018
9019 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 9020 info->keep_memory);
c5614fa4
AM
9021 if (relstart == NULL)
9022 goto error_ret;
9023
9024 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9025 {
9026 enum elf_ppc64_reloc_type r_type;
9027 unsigned long r_symndx;
9028 asection *sym_sec;
9029 struct elf_link_hash_entry *h;
854b41e7 9030 bfd_vma val;
c5614fa4
AM
9031
9032 r_type = ELF64_R_TYPE (rel->r_info);
9033 switch (r_type)
9034 {
9035 default:
9036 continue;
9037
9038 case R_PPC64_TOC16:
9039 case R_PPC64_TOC16_LO:
9040 case R_PPC64_TOC16_HI:
9041 case R_PPC64_TOC16_HA:
9042 case R_PPC64_TOC16_DS:
9043 case R_PPC64_TOC16_LO_DS:
9044 case R_PPC64_ADDR64:
9045 break;
9046 }
9047
9048 r_symndx = ELF64_R_SYM (rel->r_info);
9049 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9050 r_symndx, ibfd))
9051 goto error_ret;
9052
ba761f19 9053 if (sym_sec != toc)
c5614fa4
AM
9054 continue;
9055
ba761f19
AM
9056 if (h != NULL)
9057 val = h->root.u.def.value;
9058 else
9059 {
9060 val = sym->st_value;
9061 if (val != 0)
9062 local_toc_syms = TRUE;
9063 }
9064
9065 val += rel->r_addend;
854b41e7
AM
9066
9067 if (val > toc->rawsize)
9068 val = toc->rawsize;
ba761f19
AM
9069 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9070 continue;
9071 else if ((skip[val >> 3] & can_optimize) != 0)
9072 {
9073 Elf_Internal_Rela *tocrel
425b145b 9074 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
9075 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9076
9077 switch (r_type)
9078 {
9079 case R_PPC64_TOC16_HA:
9080 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9081 break;
9082
9083 case R_PPC64_TOC16_LO_DS:
9084 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9085 break;
9086
9087 default:
28942f62
AM
9088 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9089 ppc_howto_init ();
b140b010 9090 info->callbacks->einfo
695344c0 9091 /* xgettext:c-format */
174d0a74 9092 (_("%H: %s references "
b140b010
AM
9093 "optimized away TOC entry\n"),
9094 ibfd, sec, rel->r_offset,
9095 ppc64_elf_howto_table[r_type]->name);
9096 bfd_set_error (bfd_error_bad_value);
9097 goto error_ret;
ba761f19
AM
9098 }
9099 rel->r_addend = tocrel->r_addend;
9100 elf_section_data (sec)->relocs = relstart;
9101 continue;
9102 }
9103
9104 if (h != NULL || sym->st_value != 0)
9105 continue;
854b41e7
AM
9106
9107 rel->r_addend -= skip[val >> 3];
9108 elf_section_data (sec)->relocs = relstart;
c5614fa4 9109 }
854b41e7
AM
9110
9111 if (elf_section_data (sec)->relocs != relstart)
9112 free (relstart);
c5614fa4
AM
9113 }
9114
9115 /* We shouldn't have local or global symbols defined in the TOC,
9116 but handle them anyway. */
df22d223
AM
9117 if (local_syms != NULL)
9118 for (sym = local_syms;
9119 sym < local_syms + symtab_hdr->sh_info;
9120 ++sym)
9121 if (sym->st_value != 0
9122 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9123 {
9124 unsigned long i;
854b41e7 9125
df22d223
AM
9126 if (sym->st_value > toc->rawsize)
9127 i = toc->rawsize >> 3;
9128 else
9129 i = sym->st_value >> 3;
854b41e7 9130
df22d223
AM
9131 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9132 {
9133 if (local_toc_syms)
4eca0228 9134 _bfd_error_handler
df22d223
AM
9135 (_("%s defined on removed toc entry"),
9136 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9137 do
9138 ++i;
9139 while ((skip[i] & (ref_from_discarded | can_optimize)));
9140 sym->st_value = (bfd_vma) i << 3;
9141 }
d62b3684 9142
df22d223
AM
9143 sym->st_value -= skip[i];
9144 symtab_hdr->contents = (unsigned char *) local_syms;
9145 }
c5614fa4 9146
854b41e7 9147 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
9148 if (toc_inf.global_toc_syms)
9149 {
9150 toc_inf.toc = toc;
9151 toc_inf.skip = skip;
9152 toc_inf.global_toc_syms = FALSE;
9153 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9154 &toc_inf);
9155 }
854b41e7
AM
9156
9157 if (toc->reloc_count != 0)
9158 {
d4730f92 9159 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
9160 Elf_Internal_Rela *wrel;
9161 bfd_size_type sz;
9162
854b41e7 9163 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
9164 if (toc_relocs == NULL)
9165 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9166 info->keep_memory);
9167 if (toc_relocs == NULL)
9168 goto error_ret;
9169
425b145b
AM
9170 wrel = toc_relocs;
9171 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9172 if ((skip[rel->r_offset >> 3]
9173 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
9174 {
9175 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9176 wrel->r_info = rel->r_info;
9177 wrel->r_addend = rel->r_addend;
9178 ++wrel;
9179 }
9180 else if (!dec_dynrel_count (rel->r_info, toc, info,
9181 &local_syms, NULL, NULL))
9182 goto error_ret;
9183
425b145b
AM
9184 elf_section_data (toc)->relocs = toc_relocs;
9185 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
9186 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9187 sz = rel_hdr->sh_entsize;
9188 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9189 }
c5614fa4 9190 }
c9594989 9191 else if (elf_section_data (toc)->relocs != toc_relocs)
425b145b 9192 free (toc_relocs);
c5614fa4
AM
9193
9194 if (local_syms != NULL
9195 && symtab_hdr->contents != (unsigned char *) local_syms)
9196 {
9197 if (!info->keep_memory)
9198 free (local_syms);
9199 else
9200 symtab_hdr->contents = (unsigned char *) local_syms;
9201 }
9202 free (skip);
9203 }
9204
066f4018 9205 /* Look for cases where we can change an indirect GOT access to
4a421c53
AM
9206 a GOT relative or PC relative access, possibly reducing the
9207 number of GOT entries. */
066f4018
AM
9208 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9209 {
9210 asection *sec;
9211 Elf_Internal_Shdr *symtab_hdr;
9212 Elf_Internal_Sym *local_syms;
9213 Elf_Internal_Rela *relstart, *rel;
9214 bfd_vma got;
9215
9216 if (!is_ppc64_elf (ibfd))
9217 continue;
9218
903b777d 9219 if (!ppc64_elf_tdata (ibfd)->has_optrel)
066f4018
AM
9220 continue;
9221
9222 sec = ppc64_elf_tdata (ibfd)->got;
903b777d
AM
9223 got = 0;
9224 if (sec != NULL)
9225 got = sec->output_section->vma + sec->output_offset + 0x8000;
066f4018
AM
9226
9227 local_syms = NULL;
9228 symtab_hdr = &elf_symtab_hdr (ibfd);
9229
9230 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9231 {
9232 if (sec->reloc_count == 0
903b777d 9233 || !ppc64_elf_section_data (sec)->has_optrel
066f4018
AM
9234 || discarded_section (sec))
9235 continue;
9236
9237 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9238 info->keep_memory);
9239 if (relstart == NULL)
9240 {
9241 got_error_ret:
c9594989 9242 if (symtab_hdr->contents != (unsigned char *) local_syms)
066f4018
AM
9243 free (local_syms);
9244 if (sec != NULL
066f4018
AM
9245 && elf_section_data (sec)->relocs != relstart)
9246 free (relstart);
9247 return FALSE;
9248 }
9249
9250 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9251 {
9252 enum elf_ppc64_reloc_type r_type;
9253 unsigned long r_symndx;
9254 Elf_Internal_Sym *sym;
9255 asection *sym_sec;
9256 struct elf_link_hash_entry *h;
9257 struct got_entry *ent;
133a1f60 9258 bfd_vma val, pc;
4a421c53 9259 unsigned char buf[8];
066f4018 9260 unsigned int insn;
903b777d 9261 enum {no_check, check_lo, check_ha} insn_check;
066f4018
AM
9262
9263 r_type = ELF64_R_TYPE (rel->r_info);
903b777d
AM
9264 switch (r_type)
9265 {
9266 default:
9267 insn_check = no_check;
9268 break;
9269
9270 case R_PPC64_PLT16_HA:
9271 case R_PPC64_GOT_TLSLD16_HA:
9272 case R_PPC64_GOT_TLSGD16_HA:
9273 case R_PPC64_GOT_TPREL16_HA:
9274 case R_PPC64_GOT_DTPREL16_HA:
9275 case R_PPC64_GOT16_HA:
9276 case R_PPC64_TOC16_HA:
9277 insn_check = check_ha;
9278 break;
9279
9280 case R_PPC64_PLT16_LO:
9281 case R_PPC64_PLT16_LO_DS:
9282 case R_PPC64_GOT_TLSLD16_LO:
9283 case R_PPC64_GOT_TLSGD16_LO:
9284 case R_PPC64_GOT_TPREL16_LO_DS:
9285 case R_PPC64_GOT_DTPREL16_LO_DS:
9286 case R_PPC64_GOT16_LO:
9287 case R_PPC64_GOT16_LO_DS:
9288 case R_PPC64_TOC16_LO:
9289 case R_PPC64_TOC16_LO_DS:
9290 insn_check = check_lo;
9291 break;
9292 }
9293
9294 if (insn_check != no_check)
9295 {
9296 bfd_vma off = rel->r_offset & ~3;
9297
9298 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9299 goto got_error_ret;
9300
9301 insn = bfd_get_32 (ibfd, buf);
9302 if (insn_check == check_lo
9303 ? !ok_lo_toc_insn (insn, r_type)
2365f8d7 9304 : ((insn & ((0x3fu << 26) | 0x1f << 16))
903b777d
AM
9305 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9306 {
9307 char str[12];
9308
9309 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9310 sprintf (str, "%#08x", insn);
9311 info->callbacks->einfo
9312 /* xgettext:c-format */
9313 (_("%H: got/toc optimization is not supported for"
9314 " %s instruction\n"),
9315 ibfd, sec, rel->r_offset & ~3, str);
9316 continue;
9317 }
9318 }
9319
066f4018
AM
9320 switch (r_type)
9321 {
bb22a418
AM
9322 /* Note that we don't delete GOT entries for
9323 R_PPC64_GOT16_DS since we'd need a lot more
9324 analysis. For starters, the preliminary layout is
9325 before the GOT, PLT, dynamic sections and stubs are
9326 laid out. Then we'd need to allow for changes in
9327 distance between sections caused by alignment. */
066f4018
AM
9328 default:
9329 continue;
9330
066f4018
AM
9331 case R_PPC64_GOT16_HA:
9332 case R_PPC64_GOT16_LO_DS:
4a421c53 9333 case R_PPC64_GOT_PCREL34:
066f4018
AM
9334 break;
9335 }
9336
9337 r_symndx = ELF64_R_SYM (rel->r_info);
9338 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9339 r_symndx, ibfd))
9340 goto got_error_ret;
9341
6d5554a6
AM
9342 if (sym_sec == NULL
9343 || sym_sec->output_section == NULL
9344 || discarded_section (sym_sec))
9345 continue;
9346
06507dab
AM
9347 if ((h ? h->type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
9348 continue;
9349
066f4018
AM
9350 if (!SYMBOL_REFERENCES_LOCAL (info, h))
9351 continue;
9352
9353 if (h != NULL)
9354 val = h->root.u.def.value;
9355 else
9356 val = sym->st_value;
133a1f60 9357 val += rel->r_addend;
066f4018
AM
9358 val += sym_sec->output_section->vma + sym_sec->output_offset;
9359
bb22a418
AM
9360/* Fudge factor to allow for the fact that the preliminary layout
9361 isn't exact. Reduce limits by this factor. */
9362#define LIMIT_ADJUST(LIMIT) ((LIMIT) - (LIMIT) / 16)
9363
066f4018
AM
9364 switch (r_type)
9365 {
9366 default:
9367 continue;
9368
066f4018 9369 case R_PPC64_GOT16_HA:
bb22a418
AM
9370 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9371 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9372 continue;
9373
9374 if (!bfd_get_section_contents (ibfd, sec, buf,
9375 rel->r_offset & ~3, 4))
9376 goto got_error_ret;
9377 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9378 if (((insn & ((0x3fu << 26) | 0x1f << 16))
066f4018
AM
9379 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9380 continue;
9381 break;
9382
9383 case R_PPC64_GOT16_LO_DS:
bb22a418
AM
9384 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9385 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9386 continue;
9387 if (!bfd_get_section_contents (ibfd, sec, buf,
9388 rel->r_offset & ~3, 4))
9389 goto got_error_ret;
9390 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9391 if ((insn & (0x3fu << 26 | 0x3)) != 58u << 26 /* ld */)
066f4018
AM
9392 continue;
9393 break;
4a421c53
AM
9394
9395 case R_PPC64_GOT_PCREL34:
9396 pc = rel->r_offset;
9397 pc += sec->output_section->vma + sec->output_offset;
bb22a418
AM
9398 if (val - pc + LIMIT_ADJUST (1ULL << 33)
9399 >= LIMIT_ADJUST (1ULL << 34))
4a421c53
AM
9400 continue;
9401 if (!bfd_get_section_contents (ibfd, sec, buf,
9402 rel->r_offset & ~3, 8))
9403 goto got_error_ret;
9404 insn = bfd_get_32 (ibfd, buf);
9405 if ((insn & (-1u << 18)) != ((1u << 26) | (1u << 20)))
9406 continue;
9407 insn = bfd_get_32 (ibfd, buf + 4);
2365f8d7 9408 if ((insn & (0x3fu << 26)) != 57u << 26)
4a421c53
AM
9409 continue;
9410 break;
066f4018 9411 }
bb22a418 9412#undef LIMIT_ADJUST
066f4018
AM
9413
9414 if (h != NULL)
9415 ent = h->got.glist;
9416 else
9417 {
9418 struct got_entry **local_got_ents = elf_local_got_ents (ibfd);
9419 ent = local_got_ents[r_symndx];
9420 }
9421 for (; ent != NULL; ent = ent->next)
133a1f60 9422 if (ent->addend == rel->r_addend
066f4018
AM
9423 && ent->owner == ibfd
9424 && ent->tls_type == 0)
9425 break;
9426 BFD_ASSERT (ent && ent->got.refcount > 0);
9427 ent->got.refcount -= 1;
9428 }
9429
9430 if (elf_section_data (sec)->relocs != relstart)
9431 free (relstart);
9432 }
9433
9434 if (local_syms != NULL
9435 && symtab_hdr->contents != (unsigned char *) local_syms)
9436 {
9437 if (!info->keep_memory)
9438 free (local_syms);
9439 else
9440 symtab_hdr->contents = (unsigned char *) local_syms;
9441 }
9442 }
9443
c5614fa4
AM
9444 return TRUE;
9445}
9446
1bbe0902
AM
9447/* Return true iff input section I references the TOC using
9448 instructions limited to +/-32k offsets. */
9449
9450bfd_boolean
9451ppc64_elf_has_small_toc_reloc (asection *i)
9452{
9453 return (is_ppc64_elf (i->owner)
9454 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9455}
9456
927be08e
AM
9457/* Allocate space for one GOT entry. */
9458
9459static void
9460allocate_got (struct elf_link_hash_entry *h,
9461 struct bfd_link_info *info,
9462 struct got_entry *gent)
9463{
9464 struct ppc_link_hash_table *htab = ppc_hash_table (info);
ed7007c1 9465 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
927be08e
AM
9466 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9467 ? 16 : 8);
9468 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9469 ? 2 : 1) * sizeof (Elf64_External_Rela);
9470 asection *got = ppc64_elf_tdata (gent->owner)->got;
9471
9472 gent->got.offset = got->size;
9473 got->size += entsize;
9474
19e08130 9475 if (h->type == STT_GNU_IFUNC)
927be08e 9476 {
33e44f2e 9477 htab->elf.irelplt->size += rentsize;
19e08130 9478 htab->got_reli_size += rentsize;
927be08e 9479 }
f15d0b54 9480 else if (((bfd_link_pic (info)
f749f26e 9481 && !(gent->tls_type != 0
f15d0b54
AM
9482 && bfd_link_executable (info)
9483 && SYMBOL_REFERENCES_LOCAL (info, h)))
f0158f44
AM
9484 || (htab->elf.dynamic_sections_created
9485 && h->dynindx != -1
9486 && !SYMBOL_REFERENCES_LOCAL (info, h)))
21d68fcd 9487 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
927be08e 9488 {
19e08130 9489 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9490 relgot->size += rentsize;
927be08e
AM
9491 }
9492}
9493
7865406b
AM
9494/* This function merges got entries in the same toc group. */
9495
9496static void
9497merge_got_entries (struct got_entry **pent)
9498{
9499 struct got_entry *ent, *ent2;
9500
9501 for (ent = *pent; ent != NULL; ent = ent->next)
9502 if (!ent->is_indirect)
9503 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9504 if (!ent2->is_indirect
9505 && ent2->addend == ent->addend
9506 && ent2->tls_type == ent->tls_type
9507 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9508 {
9509 ent2->is_indirect = TRUE;
9510 ent2->got.ent = ent;
9511 }
9512}
9513
46434633 9514/* If H is undefined, make it dynamic if that makes sense. */
f0158f44
AM
9515
9516static bfd_boolean
46434633
AM
9517ensure_undef_dynamic (struct bfd_link_info *info,
9518 struct elf_link_hash_entry *h)
f0158f44
AM
9519{
9520 struct elf_link_hash_table *htab = elf_hash_table (info);
9521
9522 if (htab->dynamic_sections_created
46434633
AM
9523 && ((info->dynamic_undefined_weak != 0
9524 && h->root.type == bfd_link_hash_undefweak)
9525 || h->root.type == bfd_link_hash_undefined)
f0158f44
AM
9526 && h->dynindx == -1
9527 && !h->forced_local
9528 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9529 return bfd_elf_link_record_dynamic_symbol (info, h);
9530 return TRUE;
9531}
9532
65f38f15
AM
9533/* Allocate space in .plt, .got and associated reloc sections for
9534 dynamic relocs. */
5bd4f169 9535
b34976b6 9536static bfd_boolean
4ce794b7 9537allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9538{
65f38f15
AM
9539 struct bfd_link_info *info;
9540 struct ppc_link_hash_table *htab;
5bd4f169 9541 asection *s;
65f38f15 9542 struct ppc_link_hash_entry *eh;
0b8bcf0d 9543 struct got_entry **pgent, *gent;
5bd4f169 9544
e92d460e 9545 if (h->root.type == bfd_link_hash_indirect)
b34976b6 9546 return TRUE;
5bd4f169 9547
65f38f15
AM
9548 info = (struct bfd_link_info *) inf;
9549 htab = ppc_hash_table (info);
4dfe6ac6
NC
9550 if (htab == NULL)
9551 return FALSE;
5bd4f169 9552
ed7007c1 9553 eh = ppc_elf_hash_entry (h);
951fd09b
AM
9554 /* Run through the TLS GD got entries first if we're changing them
9555 to TPREL. */
b00a0a86 9556 if ((eh->tls_mask & (TLS_TLS | TLS_GDIE)) == (TLS_TLS | TLS_GDIE))
951fd09b
AM
9557 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9558 if (gent->got.refcount > 0
9559 && (gent->tls_type & TLS_GD) != 0)
9560 {
9561 /* This was a GD entry that has been converted to TPREL. If
9562 there happens to be a TPREL entry we can use that one. */
9563 struct got_entry *ent;
9564 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9565 if (ent->got.refcount > 0
9566 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9567 && ent->addend == gent->addend
9568 && ent->owner == gent->owner)
951fd09b
AM
9569 {
9570 gent->got.refcount = 0;
9571 break;
9572 }
9573
9574 /* If not, then we'll be using our own TPREL entry. */
9575 if (gent->got.refcount != 0)
9576 gent->tls_type = TLS_TLS | TLS_TPREL;
9577 }
9578
7865406b
AM
9579 /* Remove any list entry that won't generate a word in the GOT before
9580 we call merge_got_entries. Otherwise we risk merging to empty
9581 entries. */
0b8bcf0d
AM
9582 pgent = &h->got.glist;
9583 while ((gent = *pgent) != NULL)
411e1bfb 9584 if (gent->got.refcount > 0)
7865406b
AM
9585 {
9586 if ((gent->tls_type & TLS_LD) != 0
f749f26e 9587 && SYMBOL_REFERENCES_LOCAL (info, h))
7865406b
AM
9588 {
9589 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9590 *pgent = gent->next;
9591 }
9592 else
9593 pgent = &gent->next;
9594 }
9595 else
9596 *pgent = gent->next;
9597
9598 if (!htab->do_multi_toc)
9599 merge_got_entries (&h->got.glist);
9600
9601 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9602 if (!gent->is_indirect)
411e1bfb 9603 {
ec73ddcd
AM
9604 /* Ensure we catch all the cases where this symbol should
9605 be made dynamic. */
46434633 9606 if (!ensure_undef_dynamic (info, h))
f0158f44 9607 return FALSE;
65f38f15 9608
0c8d6e5c 9609 if (!is_ppc64_elf (gent->owner))
927be08e 9610 abort ();
0ffa91dd 9611
927be08e 9612 allocate_got (h, info, gent);
411e1bfb 9613 }
65f38f15 9614
954b63d4
AM
9615 /* If no dynamic sections we can't have dynamic relocs, except for
9616 IFUNCs which are handled even in static executables. */
8a2058b5
AM
9617 if (!htab->elf.dynamic_sections_created
9618 && h->type != STT_GNU_IFUNC)
190eb1dd 9619 h->dyn_relocs = NULL;
8a2058b5 9620
529fe20e
AM
9621 /* Discard relocs on undefined symbols that must be local. */
9622 else if (h->root.type == bfd_link_hash_undefined
9623 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
190eb1dd 9624 h->dyn_relocs = NULL;
529fe20e 9625
954b63d4
AM
9626 /* Also discard relocs on undefined weak syms with non-default
9627 visibility, or when dynamic_undefined_weak says so. */
21d68fcd 9628 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
190eb1dd 9629 h->dyn_relocs = NULL;
954b63d4 9630
190eb1dd 9631 if (h->dyn_relocs != NULL)
65f38f15 9632 {
8a2058b5
AM
9633 struct elf_dyn_relocs *p, **pp;
9634
57e7d118
AM
9635 /* In the shared -Bsymbolic case, discard space allocated for
9636 dynamic pc-relative relocs against symbols which turn out to
9637 be defined in regular objects. For the normal shared case,
9638 discard space for relocs that have become local due to symbol
9639 visibility changes. */
57e7d118 9640 if (bfd_link_pic (info))
65f38f15 9641 {
57e7d118
AM
9642 /* Relocs that use pc_count are those that appear on a call
9643 insn, or certain REL relocs (see must_be_dyn_reloc) that
9644 can be generated via assembly. We want calls to
9645 protected symbols to resolve directly to the function
9646 rather than going via the plt. If people want function
9647 pointer comparisons to work as expected then they should
9648 avoid writing weird assembly. */
9649 if (SYMBOL_CALLS_LOCAL (info, h))
9650 {
190eb1dd 9651 for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
57e7d118
AM
9652 {
9653 p->count -= p->pc_count;
9654 p->pc_count = 0;
9655 if (p->count == 0)
9656 *pp = p->next;
9657 else
9658 pp = &p->next;
9659 }
9660 }
65f38f15 9661
190eb1dd 9662 if (h->dyn_relocs != NULL)
5bd4f169 9663 {
ec73ddcd
AM
9664 /* Ensure we catch all the cases where this symbol
9665 should be made dynamic. */
46434633 9666 if (!ensure_undef_dynamic (info, h))
f0158f44 9667 return FALSE;
5bd4f169 9668 }
65f38f15 9669 }
ec73ddcd
AM
9670
9671 /* For a fixed position executable, discard space for
9672 relocs against symbols which are not dynamic. */
9673 else if (h->type != STT_GNU_IFUNC)
57e7d118 9674 {
529fe20e
AM
9675 if (h->dynamic_adjusted
9676 && !h->def_regular
9677 && !ELF_COMMON_DEF_P (h))
f0158f44 9678 {
ec73ddcd
AM
9679 /* Ensure we catch all the cases where this symbol
9680 should be made dynamic. */
46434633 9681 if (!ensure_undef_dynamic (info, h))
f0158f44 9682 return FALSE;
dfbb6ac9 9683
ec73ddcd 9684 /* But if that didn't work out, discard dynamic relocs. */
f0158f44 9685 if (h->dynindx == -1)
190eb1dd 9686 h->dyn_relocs = NULL;
f0158f44
AM
9687 }
9688 else
190eb1dd 9689 h->dyn_relocs = NULL;
57e7d118
AM
9690 }
9691
9692 /* Finally, allocate space. */
190eb1dd 9693 for (p = h->dyn_relocs; p != NULL; p = p->next)
57e7d118
AM
9694 {
9695 asection *sreloc = elf_section_data (p->sec)->sreloc;
9696 if (eh->elf.type == STT_GNU_IFUNC)
9697 sreloc = htab->elf.irelplt;
9698 sreloc->size += p->count * sizeof (Elf64_External_Rela);
dfbb6ac9 9699 }
65f38f15 9700 }
57e7d118 9701
2d7ad24e
AM
9702 /* We might need a PLT entry when the symbol
9703 a) is dynamic, or
9704 b) is an ifunc, or
9705 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
9706 d) has plt16 relocs and we are linking statically. */
9707 if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
9708 || h->type == STT_GNU_IFUNC
9709 || (h->needs_plt && h->dynamic_adjusted)
9710 || (h->needs_plt
9711 && h->def_regular
9712 && !htab->elf.dynamic_sections_created
3e04d765 9713 && !htab->can_convert_all_inline_plt
ed7007c1 9714 && (ppc_elf_hash_entry (h)->tls_mask
2d7ad24e 9715 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
65f38f15 9716 {
57e7d118
AM
9717 struct plt_entry *pent;
9718 bfd_boolean doneone = FALSE;
9719 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9720 if (pent->plt.refcount > 0)
9721 {
9722 if (!htab->elf.dynamic_sections_created
9723 || h->dynindx == -1)
9724 {
2d7ad24e
AM
9725 if (h->type == STT_GNU_IFUNC)
9726 {
9727 s = htab->elf.iplt;
9728 pent->plt.offset = s->size;
9729 s->size += PLT_ENTRY_SIZE (htab);
9730 s = htab->elf.irelplt;
9731 }
9732 else
9733 {
9734 s = htab->pltlocal;
9735 pent->plt.offset = s->size;
9736 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
9737 s = bfd_link_pic (info) ? htab->relpltlocal : NULL;
9738 }
57e7d118
AM
9739 }
9740 else
9741 {
9742 /* If this is the first .plt entry, make room for the special
9743 first entry. */
9744 s = htab->elf.splt;
9745 if (s->size == 0)
9746 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
65f38f15 9747
57e7d118 9748 pent->plt.offset = s->size;
65f38f15 9749
57e7d118
AM
9750 /* Make room for this entry. */
9751 s->size += PLT_ENTRY_SIZE (htab);
65f38f15 9752
57e7d118
AM
9753 /* Make room for the .glink code. */
9754 s = htab->glink;
9755 if (s->size == 0)
9e390558 9756 s->size += GLINK_PLTRESOLVE_SIZE (htab);
57e7d118
AM
9757 if (htab->opd_abi)
9758 {
9759 /* We need bigger stubs past index 32767. */
9e390558 9760 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4)
57e7d118
AM
9761 s->size += 4;
9762 s->size += 2*4;
9763 }
9764 else
9765 s->size += 4;
65f38f15 9766
57e7d118
AM
9767 /* We also need to make an entry in the .rela.plt section. */
9768 s = htab->elf.srelplt;
9769 }
2d7ad24e
AM
9770 if (s != NULL)
9771 s->size += sizeof (Elf64_External_Rela);
57e7d118
AM
9772 doneone = TRUE;
9773 }
9774 else
9775 pent->plt.offset = (bfd_vma) -1;
9776 if (!doneone)
9777 {
9778 h->plt.plist = NULL;
9779 h->needs_plt = 0;
9780 }
65f38f15 9781 }
57e7d118 9782 else
65f38f15 9783 {
57e7d118
AM
9784 h->plt.plist = NULL;
9785 h->needs_plt = 0;
65f38f15
AM
9786 }
9787
b34976b6 9788 return TRUE;
65f38f15
AM
9789}
9790
9e390558
AM
9791#define PPC_LO(v) ((v) & 0xffff)
9792#define PPC_HI(v) (((v) >> 16) & 0xffff)
9793#define PPC_HA(v) PPC_HI ((v) + 0x8000)
04bdff6a
AM
9794#define D34(v) \
9795 ((((v) & 0x3ffff0000ULL) << 16) | (v & 0xffff))
9796#define HA34(v) ((v + (1ULL << 33)) >> 34)
9e390558 9797
a345bc8d
AM
9798/* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9799 to set up space for global entry stubs. These are put in glink,
9800 after the branch table. */
65f38f15 9801
b34976b6 9802static bfd_boolean
a345bc8d 9803size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
65f38f15 9804{
a345bc8d
AM
9805 struct bfd_link_info *info;
9806 struct ppc_link_hash_table *htab;
9807 struct plt_entry *pent;
9e390558 9808 asection *s, *plt;
65f38f15 9809
a345bc8d
AM
9810 if (h->root.type == bfd_link_hash_indirect)
9811 return TRUE;
65f38f15 9812
a345bc8d
AM
9813 if (!h->pointer_equality_needed)
9814 return TRUE;
65f38f15 9815
a345bc8d
AM
9816 if (h->def_regular)
9817 return TRUE;
65f38f15 9818
a345bc8d
AM
9819 info = inf;
9820 htab = ppc_hash_table (info);
9821 if (htab == NULL)
9822 return FALSE;
9823
9e390558
AM
9824 s = htab->global_entry;
9825 plt = htab->elf.splt;
a345bc8d
AM
9826 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9827 if (pent->plt.offset != (bfd_vma) -1
9828 && pent->addend == 0)
9829 {
afe397ea
AM
9830 /* For ELFv2, if this symbol is not defined in a regular file
9831 and we are not generating a shared library or pie, then we
9832 need to define the symbol in the executable on a call stub.
9833 This is to avoid text relocations. */
9e390558
AM
9834 bfd_vma off, stub_align, stub_off, stub_size;
9835 unsigned int align_power;
9836
9837 stub_size = 16;
9838 stub_off = s->size;
9839 if (htab->params->plt_stub_align >= 0)
9840 align_power = htab->params->plt_stub_align;
9841 else
9842 align_power = -htab->params->plt_stub_align;
9843 /* Setting section alignment is delayed until we know it is
9844 non-empty. Otherwise the .text output section will be
9845 aligned at least to plt_stub_align even when no global
9846 entry stubs are needed. */
9847 if (s->alignment_power < align_power)
9848 s->alignment_power = align_power;
9849 stub_align = (bfd_vma) 1 << align_power;
9850 if (htab->params->plt_stub_align >= 0
9851 || ((((stub_off + stub_size - 1) & -stub_align)
9852 - (stub_off & -stub_align))
9853 > ((stub_size - 1) & -stub_align)))
9854 stub_off = (stub_off + stub_align - 1) & -stub_align;
9855 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
9856 off -= stub_off + s->output_offset + s->output_section->vma;
9857 /* Note that for --plt-stub-align negative we have a possible
9858 dependency between stub offset and size. Break that
9859 dependency by assuming the max stub size when calculating
9860 the stub offset. */
9861 if (PPC_HA (off) == 0)
9862 stub_size -= 4;
8a2058b5 9863 h->root.type = bfd_link_hash_defined;
afe397ea 9864 h->root.u.def.section = s;
9e390558
AM
9865 h->root.u.def.value = stub_off;
9866 s->size = stub_off + stub_size;
a345bc8d
AM
9867 break;
9868 }
9869 return TRUE;
9870}
9871
65f38f15
AM
9872/* Set the sizes of the dynamic sections. */
9873
b34976b6 9874static bfd_boolean
ee67d69a 9875ppc64_elf_size_dynamic_sections (bfd *output_bfd,
4ce794b7 9876 struct bfd_link_info *info)
65f38f15
AM
9877{
9878 struct ppc_link_hash_table *htab;
9879 bfd *dynobj;
9880 asection *s;
b34976b6 9881 bfd_boolean relocs;
65f38f15 9882 bfd *ibfd;
7865406b 9883 struct got_entry *first_tlsld;
65f38f15
AM
9884
9885 htab = ppc_hash_table (info);
4dfe6ac6
NC
9886 if (htab == NULL)
9887 return FALSE;
9888
65f38f15
AM
9889 dynobj = htab->elf.dynobj;
9890 if (dynobj == NULL)
9891 abort ();
9892
9893 if (htab->elf.dynamic_sections_created)
9894 {
9895 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 9896 if (bfd_link_executable (info) && !info->nointerp)
65f38f15 9897 {
3d4d4302 9898 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
9899 if (s == NULL)
9900 abort ();
eea6121a 9901 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
9902 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9903 }
9904 }
9905
9906 /* Set up .got offsets for local syms, and space for local dynamic
9907 relocs. */
c72f2fb2 9908 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
65f38f15 9909 {
411e1bfb
AM
9910 struct got_entry **lgot_ents;
9911 struct got_entry **end_lgot_ents;
e054468f
AM
9912 struct plt_entry **local_plt;
9913 struct plt_entry **end_local_plt;
f961d9dd 9914 unsigned char *lgot_masks;
65f38f15
AM
9915 bfd_size_type locsymcount;
9916 Elf_Internal_Shdr *symtab_hdr;
65f38f15 9917
0c8d6e5c 9918 if (!is_ppc64_elf (ibfd))
65f38f15
AM
9919 continue;
9920
9921 for (s = ibfd->sections; s != NULL; s = s->next)
9922 {
19e08130 9923 struct ppc_dyn_relocs *p;
65f38f15 9924
6edfbbad 9925 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 9926 {
ec338859
AM
9927 if (!bfd_is_abs_section (p->sec)
9928 && bfd_is_abs_section (p->sec->output_section))
9929 {
9930 /* Input section has been discarded, either because
9931 it is a copy of a linkonce section or due to
9932 linker script /DISCARD/, so we'll be discarding
9933 the relocs too. */
9934 }
248866a8 9935 else if (p->count != 0)
ec338859 9936 {
19e08130
AM
9937 asection *srel = elf_section_data (p->sec)->sreloc;
9938 if (p->ifunc)
33e44f2e 9939 srel = htab->elf.irelplt;
eea6121a 9940 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
9941 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9942 info->flags |= DF_TEXTREL;
ec338859 9943 }
65f38f15
AM
9944 }
9945 }
9946
411e1bfb
AM
9947 lgot_ents = elf_local_got_ents (ibfd);
9948 if (!lgot_ents)
65f38f15
AM
9949 continue;
9950
0ffa91dd 9951 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 9952 locsymcount = symtab_hdr->sh_info;
411e1bfb 9953 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
9954 local_plt = (struct plt_entry **) end_lgot_ents;
9955 end_local_plt = local_plt + locsymcount;
f961d9dd 9956 lgot_masks = (unsigned char *) end_local_plt;
e717da7e 9957 s = ppc64_elf_tdata (ibfd)->got;
e7b938ca 9958 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 9959 {
0b8bcf0d 9960 struct got_entry **pent, *ent;
411e1bfb 9961
0b8bcf0d
AM
9962 pent = lgot_ents;
9963 while ((ent = *pent) != NULL)
411e1bfb
AM
9964 if (ent->got.refcount > 0)
9965 {
e7b938ca 9966 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 9967 {
927be08e 9968 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 9969 *pent = ent->next;
411e1bfb
AM
9970 }
9971 else
9972 {
19e08130
AM
9973 unsigned int ent_size = 8;
9974 unsigned int rel_size = sizeof (Elf64_External_Rela);
9975
eea6121a 9976 ent->got.offset = s->size;
e7b938ca 9977 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 9978 {
19e08130
AM
9979 ent_size *= 2;
9980 rel_size *= 2;
9981 }
9982 s->size += ent_size;
37da22e5 9983 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 9984 {
33e44f2e 9985 htab->elf.irelplt->size += rel_size;
19e08130
AM
9986 htab->got_reli_size += rel_size;
9987 }
93370e8e
AM
9988 else if (bfd_link_pic (info)
9989 && !(ent->tls_type != 0
9990 && bfd_link_executable (info)))
19e08130
AM
9991 {
9992 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9993 srel->size += rel_size;
927be08e 9994 }
0b8bcf0d 9995 pent = &ent->next;
411e1bfb
AM
9996 }
9997 }
9998 else
0b8bcf0d 9999 *pent = ent->next;
65f38f15 10000 }
e054468f 10001
2d7ad24e
AM
10002 /* Allocate space for plt calls to local syms. */
10003 lgot_masks = (unsigned char *) end_local_plt;
10004 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
e054468f
AM
10005 {
10006 struct plt_entry *ent;
10007
10008 for (ent = *local_plt; ent != NULL; ent = ent->next)
10009 if (ent->plt.refcount > 0)
10010 {
2d7ad24e
AM
10011 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
10012 {
10013 s = htab->elf.iplt;
10014 ent->plt.offset = s->size;
10015 s->size += PLT_ENTRY_SIZE (htab);
10016 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
10017 }
3e04d765
AM
10018 else if (htab->can_convert_all_inline_plt
10019 || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
2d7ad24e
AM
10020 ent->plt.offset = (bfd_vma) -1;
10021 else
10022 {
10023 s = htab->pltlocal;
10024 ent->plt.offset = s->size;
10025 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
10026 if (bfd_link_pic (info))
10027 htab->relpltlocal->size += sizeof (Elf64_External_Rela);
10028 }
e054468f
AM
10029 }
10030 else
10031 ent->plt.offset = (bfd_vma) -1;
10032 }
65f38f15
AM
10033 }
10034
10035 /* Allocate global sym .plt and .got entries, and space for global
10036 sym dynamic relocs. */
4ce794b7 10037 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
a345bc8d 10038
0e1862bb 10039 if (!htab->opd_abi && !bfd_link_pic (info))
a345bc8d 10040 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
65f38f15 10041
7865406b 10042 first_tlsld = NULL;
c72f2fb2 10043 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
102890f0 10044 {
7865406b
AM
10045 struct got_entry *ent;
10046
0c8d6e5c 10047 if (!is_ppc64_elf (ibfd))
102890f0
AM
10048 continue;
10049
7865406b
AM
10050 ent = ppc64_tlsld_got (ibfd);
10051 if (ent->got.refcount > 0)
102890f0 10052 {
7865406b 10053 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 10054 {
7865406b
AM
10055 ent->is_indirect = TRUE;
10056 ent->got.ent = first_tlsld;
10057 }
10058 else
10059 {
10060 if (first_tlsld == NULL)
10061 first_tlsld = ent;
10062 s = ppc64_elf_tdata (ibfd)->got;
10063 ent->got.offset = s->size;
10064 ent->owner = ibfd;
10065 s->size += 16;
f749f26e 10066 if (bfd_link_dll (info))
7865406b
AM
10067 {
10068 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10069 srel->size += sizeof (Elf64_External_Rela);
10070 }
102890f0
AM
10071 }
10072 }
10073 else
7865406b 10074 ent->got.offset = (bfd_vma) -1;
102890f0
AM
10075 }
10076
65f38f15
AM
10077 /* We now have determined the sizes of the various dynamic sections.
10078 Allocate memory for them. */
b34976b6 10079 relocs = FALSE;
65f38f15
AM
10080 for (s = dynobj->sections; s != NULL; s = s->next)
10081 {
10082 if ((s->flags & SEC_LINKER_CREATED) == 0)
10083 continue;
10084
4ce794b7 10085 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
10086 /* These haven't been allocated yet; don't strip. */
10087 continue;
33e44f2e
AM
10088 else if (s == htab->elf.sgot
10089 || s == htab->elf.splt
10090 || s == htab->elf.iplt
2d7ad24e 10091 || s == htab->pltlocal
c456f082 10092 || s == htab->glink
9e390558 10093 || s == htab->global_entry
5474d94f
AM
10094 || s == htab->elf.sdynbss
10095 || s == htab->elf.sdynrelro)
65f38f15
AM
10096 {
10097 /* Strip this section if we don't need it; see the
10098 comment below. */
5bd4f169 10099 }
58d180e8
AM
10100 else if (s == htab->glink_eh_frame)
10101 {
10102 if (!bfd_is_abs_section (s->output_section))
10103 /* Not sized yet. */
10104 continue;
10105 }
70cc837d 10106 else if (CONST_STRNEQ (s->name, ".rela"))
5bd4f169 10107 {
c456f082 10108 if (s->size != 0)
5bd4f169 10109 {
33e44f2e 10110 if (s != htab->elf.srelplt)
b34976b6 10111 relocs = TRUE;
5bd4f169
AM
10112
10113 /* We use the reloc_count field as a counter if we need
10114 to copy relocs into the output file. */
10115 s->reloc_count = 0;
10116 }
10117 }
65f38f15 10118 else
5bd4f169
AM
10119 {
10120 /* It's not one of our sections, so don't allocate space. */
10121 continue;
10122 }
10123
eea6121a 10124 if (s->size == 0)
5bd4f169 10125 {
c456f082
AM
10126 /* If we don't need this section, strip it from the
10127 output file. This is mostly to handle .rela.bss and
10128 .rela.plt. We must create both sections in
10129 create_dynamic_sections, because they must be created
10130 before the linker maps input sections to output
10131 sections. The linker does that before
10132 adjust_dynamic_symbol is called, and it is that
10133 function which decides whether anything needs to go
10134 into these sections. */
8423293d 10135 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
10136 continue;
10137 }
10138
06bcf541
AM
10139 if (bfd_is_abs_section (s->output_section))
10140 _bfd_error_handler (_("warning: discarding dynamic section %s"),
10141 s->name);
10142
c456f082 10143 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
10144 continue;
10145
65f38f15
AM
10146 /* Allocate memory for the section contents. We use bfd_zalloc
10147 here in case unused entries are not reclaimed before the
10148 section's contents are written out. This should not happen,
411e1bfb
AM
10149 but this way if it does we get a R_PPC64_NONE reloc in .rela
10150 sections instead of garbage.
10151 We also rely on the section contents being zero when writing
5474d94f 10152 the GOT and .dynrelro. */
eea6121a 10153 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 10154 if (s->contents == NULL)
b34976b6 10155 return FALSE;
5bd4f169
AM
10156 }
10157
c72f2fb2 10158 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
e717da7e 10159 {
0c8d6e5c 10160 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
10161 continue;
10162
e717da7e 10163 s = ppc64_elf_tdata (ibfd)->got;
33e44f2e 10164 if (s != NULL && s != htab->elf.sgot)
e717da7e 10165 {
eea6121a 10166 if (s->size == 0)
8423293d 10167 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10168 else
10169 {
eea6121a 10170 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10171 if (s->contents == NULL)
10172 return FALSE;
10173 }
10174 }
10175 s = ppc64_elf_tdata (ibfd)->relgot;
10176 if (s != NULL)
10177 {
eea6121a 10178 if (s->size == 0)
8423293d 10179 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10180 else
10181 {
eea6121a 10182 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10183 if (s->contents == NULL)
10184 return FALSE;
10185 relocs = TRUE;
10186 s->reloc_count = 0;
10187 }
10188 }
10189 }
10190
e86ce104 10191 if (htab->elf.dynamic_sections_created)
5bd4f169 10192 {
e8910a83
AM
10193 bfd_boolean tls_opt;
10194
5bd4f169
AM
10195 /* Add some entries to the .dynamic section. We fill in the
10196 values later, in ppc64_elf_finish_dynamic_sections, but we
10197 must add the entries now so that we get the correct size for
10198 the .dynamic section. The DT_DEBUG entry is filled in by the
10199 dynamic linker and used by the debugger. */
dc810e39 10200#define add_dynamic_entry(TAG, VAL) \
5a580b3a 10201 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 10202
0e1862bb 10203 if (bfd_link_executable (info))
5bd4f169 10204 {
dc810e39 10205 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 10206 return FALSE;
5bd4f169
AM
10207 }
10208
33e44f2e 10209 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5bd4f169 10210 {
dc810e39
AM
10211 if (!add_dynamic_entry (DT_PLTGOT, 0)
10212 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10213 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
10214 || !add_dynamic_entry (DT_JMPREL, 0)
10215 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 10216 return FALSE;
5bd4f169
AM
10217 }
10218
ee67d69a 10219 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
10220 {
10221 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10222 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 10223 return FALSE;
19397422
AM
10224 }
10225
7c9cf415 10226 tls_opt = (htab->params->tls_get_addr_opt
9e7028aa
AM
10227 && ((htab->tls_get_addr_fd != NULL
10228 && htab->tls_get_addr_fd->elf.plt.plist != NULL)
10229 || (htab->tga_desc_fd != NULL
10230 && htab->tga_desc_fd->elf.plt.plist != NULL)));
e8910a83
AM
10231 if (tls_opt || !htab->opd_abi)
10232 {
10233 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10234 return FALSE;
10235 }
a7f2871e 10236
5bd4f169
AM
10237 if (relocs)
10238 {
dc810e39
AM
10239 if (!add_dynamic_entry (DT_RELA, 0)
10240 || !add_dynamic_entry (DT_RELASZ, 0)
10241 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 10242 return FALSE;
5bd4f169 10243
65f38f15
AM
10244 /* If any dynamic relocs apply to a read-only section,
10245 then we need a DT_TEXTREL entry. */
248866a8 10246 if ((info->flags & DF_TEXTREL) == 0)
d49e5065
L
10247 elf_link_hash_traverse (&htab->elf,
10248 _bfd_elf_maybe_set_textrel, info);
5bd4f169 10249
65f38f15 10250 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 10251 {
65f38f15 10252 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 10253 return FALSE;
5bd4f169 10254 }
5bd4f169 10255 }
5bd4f169 10256 }
65f38f15 10257#undef add_dynamic_entry
5bd4f169 10258
b34976b6 10259 return TRUE;
5bd4f169
AM
10260}
10261
a345bc8d
AM
10262/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10263
10264static bfd_boolean
10265ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10266{
10267 if (h->plt.plist != NULL
10268 && !h->def_regular
10269 && !h->pointer_equality_needed)
10270 return FALSE;
10271
10272 return _bfd_elf_hash_symbol (h);
10273}
10274
721956f4 10275/* Determine the type of stub needed, if any, for a call. */
5bd4f169 10276
4ce794b7
AM
10277static inline enum ppc_stub_type
10278ppc_type_of_stub (asection *input_sec,
10279 const Elf_Internal_Rela *rel,
10280 struct ppc_link_hash_entry **hash,
e054468f 10281 struct plt_entry **plt_ent,
6911b7dc
AM
10282 bfd_vma destination,
10283 unsigned long local_off)
5bd4f169 10284{
721956f4
AM
10285 struct ppc_link_hash_entry *h = *hash;
10286 bfd_vma location;
10287 bfd_vma branch_offset;
10288 bfd_vma max_branch_offset;
4ce794b7 10289 enum elf_ppc64_reloc_type r_type;
5bd4f169 10290
721956f4
AM
10291 if (h != NULL)
10292 {
e054468f 10293 struct plt_entry *ent;
7fe2b9a6 10294 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
10295 if (h->oh != NULL
10296 && h->oh->is_func_descriptor)
7b8f6675
AM
10297 {
10298 fdh = ppc_follow_link (h->oh);
10299 *hash = fdh;
10300 }
8387904d 10301
e054468f
AM
10302 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10303 if (ent->addend == rel->r_addend
10304 && ent->plt.offset != (bfd_vma) -1)
10305 {
e054468f
AM
10306 *plt_ent = ent;
10307 return ppc_stub_plt_call;
10308 }
5bd4f169 10309
7fe2b9a6
AM
10310 /* Here, we know we don't have a plt entry. If we don't have a
10311 either a defined function descriptor or a defined entry symbol
10312 in a regular object file, then it is pointless trying to make
10313 any other type of stub. */
854b41e7
AM
10314 if (!is_static_defined (&fdh->elf)
10315 && !is_static_defined (&h->elf))
721956f4 10316 return ppc_stub_none;
5d1634d7 10317 }
e054468f
AM
10318 else if (elf_local_got_ents (input_sec->owner) != NULL)
10319 {
10320 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10321 struct plt_entry **local_plt = (struct plt_entry **)
10322 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10323 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10324
10325 if (local_plt[r_symndx] != NULL)
10326 {
10327 struct plt_entry *ent;
10328
10329 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10330 if (ent->addend == rel->r_addend
10331 && ent->plt.offset != (bfd_vma) -1)
10332 {
10333 *plt_ent = ent;
10334 return ppc_stub_plt_call;
10335 }
10336 }
10337 }
5d1634d7 10338
721956f4
AM
10339 /* Determine where the call point is. */
10340 location = (input_sec->output_offset
10341 + input_sec->output_section->vma
10342 + rel->r_offset);
5d1634d7 10343
721956f4
AM
10344 branch_offset = destination - location;
10345 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 10346
721956f4
AM
10347 /* Determine if a long branch stub is needed. */
10348 max_branch_offset = 1 << 25;
23cedd1d
AM
10349 if (r_type == R_PPC64_REL14
10350 || r_type == R_PPC64_REL14_BRTAKEN
10351 || r_type == R_PPC64_REL14_BRNTAKEN)
721956f4 10352 max_branch_offset = 1 << 15;
5d1634d7 10353
6911b7dc 10354 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
721956f4
AM
10355 /* We need a stub. Figure out whether a long_branch or plt_branch
10356 is needed later. */
10357 return ppc_stub_long_branch;
5d1634d7 10358
721956f4 10359 return ppc_stub_none;
5d1634d7
AM
10360}
10361
f891966f
AM
10362/* Gets the address of a label (1:) in r11 and builds an offset in r12,
10363 then adds it to r11 (LOAD false) or loads r12 from r11+r12 (LOAD true).
10364 . mflr %r12
10365 . bcl 20,31,1f
10366 .1: mflr %r11
10367 . mtlr %r12
05d0e962 10368 . lis %r12,xxx-1b@highest
f891966f 10369 . ori %r12,%r12,xxx-1b@higher
05d0e962 10370 . sldi %r12,%r12,32
f891966f 10371 . oris %r12,%r12,xxx-1b@high
05d0e962 10372 . ori %r12,%r12,xxx-1b@l
f891966f 10373 . add/ldx %r12,%r11,%r12 */
05d0e962
AM
10374
10375static bfd_byte *
10376build_offset (bfd *abfd, bfd_byte *p, bfd_vma off, bfd_boolean load)
10377{
f891966f
AM
10378 bfd_put_32 (abfd, MFLR_R12, p);
10379 p += 4;
10380 bfd_put_32 (abfd, BCL_20_31, p);
10381 p += 4;
10382 bfd_put_32 (abfd, MFLR_R11, p);
10383 p += 4;
10384 bfd_put_32 (abfd, MTLR_R12, p);
10385 p += 4;
05d0e962
AM
10386 if (off + 0x8000 < 0x10000)
10387 {
10388 if (load)
10389 bfd_put_32 (abfd, LD_R12_0R11 + PPC_LO (off), p);
10390 else
10391 bfd_put_32 (abfd, ADDI_R12_R11 + PPC_LO (off), p);
10392 p += 4;
10393 }
10394 else if (off + 0x80008000ULL < 0x100000000ULL)
10395 {
10396 bfd_put_32 (abfd, ADDIS_R12_R11 + PPC_HA (off), p);
10397 p += 4;
10398 if (load)
10399 bfd_put_32 (abfd, LD_R12_0R12 + PPC_LO (off), p);
10400 else
10401 bfd_put_32 (abfd, ADDI_R12_R12 + PPC_LO (off), p);
10402 p += 4;
10403 }
10404 else
10405 {
10406 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10407 {
10408 bfd_put_32 (abfd, LI_R12_0 + ((off >> 32) & 0xffff), p);
10409 p += 4;
10410 }
10411 else
10412 {
10413 bfd_put_32 (abfd, LIS_R12 + ((off >> 48) & 0xffff), p);
10414 p += 4;
10415 if (((off >> 32) & 0xffff) != 0)
10416 {
10417 bfd_put_32 (abfd, ORI_R12_R12_0 + ((off >> 32) & 0xffff), p);
10418 p += 4;
10419 }
10420 }
10421 if (((off >> 32) & 0xffffffffULL) != 0)
10422 {
10423 bfd_put_32 (abfd, SLDI_R12_R12_32, p);
10424 p += 4;
10425 }
10426 if (PPC_HI (off) != 0)
10427 {
10428 bfd_put_32 (abfd, ORIS_R12_R12_0 + PPC_HI (off), p);
10429 p += 4;
10430 }
10431 if (PPC_LO (off) != 0)
10432 {
10433 bfd_put_32 (abfd, ORI_R12_R12_0 + PPC_LO (off), p);
10434 p += 4;
10435 }
10436 if (load)
10437 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10438 else
10439 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10440 p += 4;
10441 }
10442 return p;
10443}
10444
10445static unsigned int
10446size_offset (bfd_vma off)
10447{
10448 unsigned int size;
10449 if (off + 0x8000 < 0x10000)
10450 size = 4;
10451 else if (off + 0x80008000ULL < 0x100000000ULL)
10452 size = 8;
10453 else
10454 {
10455 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10456 size = 4;
10457 else
10458 {
10459 size = 4;
10460 if (((off >> 32) & 0xffff) != 0)
10461 size += 4;
10462 }
10463 if (((off >> 32) & 0xffffffffULL) != 0)
10464 size += 4;
10465 if (PPC_HI (off) != 0)
10466 size += 4;
10467 if (PPC_LO (off) != 0)
10468 size += 4;
10469 size += 4;
10470 }
f891966f 10471 return size + 16;
05d0e962
AM
10472}
10473
3d58e1fc
AM
10474static unsigned int
10475num_relocs_for_offset (bfd_vma off)
10476{
10477 unsigned int num_rel;
10478 if (off + 0x8000 < 0x10000)
10479 num_rel = 1;
10480 else if (off + 0x80008000ULL < 0x100000000ULL)
10481 num_rel = 2;
10482 else
10483 {
10484 num_rel = 1;
10485 if (off + 0x800000000000ULL >= 0x1000000000000ULL
10486 && ((off >> 32) & 0xffff) != 0)
10487 num_rel += 1;
10488 if (PPC_HI (off) != 0)
10489 num_rel += 1;
10490 if (PPC_LO (off) != 0)
10491 num_rel += 1;
10492 }
10493 return num_rel;
10494}
10495
10496static Elf_Internal_Rela *
10497emit_relocs_for_offset (struct bfd_link_info *info, Elf_Internal_Rela *r,
10498 bfd_vma roff, bfd_vma targ, bfd_vma off)
10499{
10500 bfd_vma relative_targ = targ - (roff - 8);
10501 if (bfd_big_endian (info->output_bfd))
10502 roff += 2;
10503 r->r_offset = roff;
10504 r->r_addend = relative_targ + roff;
10505 if (off + 0x8000 < 0x10000)
10506 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16);
10507 else if (off + 0x80008000ULL < 0x100000000ULL)
10508 {
10509 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HA);
10510 ++r;
10511 roff += 4;
10512 r->r_offset = roff;
10513 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10514 r->r_addend = relative_targ + roff;
10515 }
10516 else
10517 {
10518 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10519 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10520 else
10521 {
10522 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHEST);
10523 if (((off >> 32) & 0xffff) != 0)
10524 {
10525 ++r;
10526 roff += 4;
10527 r->r_offset = roff;
10528 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10529 r->r_addend = relative_targ + roff;
10530 }
10531 }
10532 if (((off >> 32) & 0xffffffffULL) != 0)
10533 roff += 4;
10534 if (PPC_HI (off) != 0)
10535 {
10536 ++r;
10537 roff += 4;
10538 r->r_offset = roff;
10539 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGH);
10540 r->r_addend = relative_targ + roff;
10541 }
10542 if (PPC_LO (off) != 0)
10543 {
10544 ++r;
10545 roff += 4;
10546 r->r_offset = roff;
10547 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10548 r->r_addend = relative_targ + roff;
10549 }
10550 }
10551 return r;
10552}
10553
04bdff6a 10554static bfd_byte *
7c1f4227 10555build_power10_offset (bfd *abfd, bfd_byte *p, bfd_vma off, int odd,
04bdff6a
AM
10556 bfd_boolean load)
10557{
10558 uint64_t insn;
10559 if (off - odd + (1ULL << 33) < 1ULL << 34)
10560 {
10561 off -= odd;
10562 if (odd)
10563 {
10564 bfd_put_32 (abfd, NOP, p);
10565 p += 4;
10566 }
10567 if (load)
10568 insn = PLD_R12_PC;
10569 else
10570 insn = PADDI_R12_PC;
10571 insn |= D34 (off);
10572 bfd_put_32 (abfd, insn >> 32, p);
10573 p += 4;
10574 bfd_put_32 (abfd, insn, p);
10575 }
10576 /* The minimum value for paddi is -0x200000000. The minimum value
10577 for li is -0x8000, which when shifted by 34 and added gives a
10578 minimum value of -0x2000200000000. The maximum value is
10579 0x1ffffffff+0x7fff<<34 which is 0x2000200000000-1. */
10580 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10581 {
10582 off -= 8 - odd;
10583 bfd_put_32 (abfd, LI_R11_0 | (HA34 (off) & 0xffff), p);
10584 p += 4;
10585 if (!odd)
10586 {
10587 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10588 p += 4;
10589 }
10590 insn = PADDI_R12_PC | D34 (off);
10591 bfd_put_32 (abfd, insn >> 32, p);
10592 p += 4;
10593 bfd_put_32 (abfd, insn, p);
10594 p += 4;
10595 if (odd)
10596 {
10597 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10598 p += 4;
10599 }
10600 if (load)
10601 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10602 else
10603 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10604 }
10605 else
10606 {
10607 off -= odd + 8;
10608 bfd_put_32 (abfd, LIS_R11 | ((HA34 (off) >> 16) & 0x3fff), p);
10609 p += 4;
10610 bfd_put_32 (abfd, ORI_R11_R11_0 | (HA34 (off) & 0xffff), p);
10611 p += 4;
10612 if (odd)
10613 {
10614 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10615 p += 4;
10616 }
10617 insn = PADDI_R12_PC | D34 (off);
10618 bfd_put_32 (abfd, insn >> 32, p);
10619 p += 4;
10620 bfd_put_32 (abfd, insn, p);
10621 p += 4;
10622 if (!odd)
10623 {
10624 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10625 p += 4;
10626 }
10627 if (load)
10628 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10629 else
10630 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10631 }
10632 p += 4;
10633 return p;
10634}
10635
10636static unsigned int
7c1f4227 10637size_power10_offset (bfd_vma off, int odd)
04bdff6a
AM
10638{
10639 if (off - odd + (1ULL << 33) < 1ULL << 34)
10640 return odd + 8;
10641 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10642 return 20;
10643 else
10644 return 24;
10645}
10646
10647static unsigned int
7c1f4227 10648num_relocs_for_power10_offset (bfd_vma off, int odd)
04bdff6a
AM
10649{
10650 if (off - odd + (1ULL << 33) < 1ULL << 34)
10651 return 1;
10652 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10653 return 2;
10654 else
10655 return 3;
10656}
10657
10658static Elf_Internal_Rela *
7c1f4227 10659emit_relocs_for_power10_offset (struct bfd_link_info *info,
04bdff6a
AM
10660 Elf_Internal_Rela *r, bfd_vma roff,
10661 bfd_vma targ, bfd_vma off, int odd)
10662{
10663 if (off - odd + (1ULL << 33) < 1ULL << 34)
10664 roff += odd;
10665 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10666 {
10667 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10668 r->r_offset = roff + d_offset;
10669 r->r_addend = targ + 8 - odd - d_offset;
10670 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10671 ++r;
10672 roff += 8 - odd;
10673 }
10674 else
10675 {
10676 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10677 r->r_offset = roff + d_offset;
10678 r->r_addend = targ + 8 + odd - d_offset;
10679 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHESTA34);
10680 ++r;
10681 roff += 4;
10682 r->r_offset = roff + d_offset;
10683 r->r_addend = targ + 4 + odd - d_offset;
10684 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10685 ++r;
10686 roff += 4 + odd;
10687 }
10688 r->r_offset = roff;
10689 r->r_addend = targ;
10690 r->r_info = ELF64_R_INFO (0, R_PPC64_PCREL34);
10691 return r;
10692}
10693
df136d64
AM
10694/* Emit .eh_frame opcode to advance pc by DELTA. */
10695
10696static bfd_byte *
10697eh_advance (bfd *abfd, bfd_byte *eh, unsigned int delta)
10698{
10699 delta /= 4;
10700 if (delta < 64)
10701 *eh++ = DW_CFA_advance_loc + delta;
10702 else if (delta < 256)
10703 {
10704 *eh++ = DW_CFA_advance_loc1;
10705 *eh++ = delta;
10706 }
10707 else if (delta < 65536)
10708 {
10709 *eh++ = DW_CFA_advance_loc2;
10710 bfd_put_16 (abfd, delta, eh);
10711 eh += 2;
10712 }
10713 else
10714 {
10715 *eh++ = DW_CFA_advance_loc4;
10716 bfd_put_32 (abfd, delta, eh);
10717 eh += 4;
10718 }
10719 return eh;
10720}
10721
10722/* Size of required .eh_frame opcode to advance pc by DELTA. */
10723
10724static unsigned int
10725eh_advance_size (unsigned int delta)
10726{
10727 if (delta < 64 * 4)
10728 /* DW_CFA_advance_loc+[1..63]. */
10729 return 1;
10730 if (delta < 256 * 4)
10731 /* DW_CFA_advance_loc1, byte. */
10732 return 2;
10733 if (delta < 65536 * 4)
10734 /* DW_CFA_advance_loc2, 2 bytes. */
10735 return 3;
10736 /* DW_CFA_advance_loc4, 4 bytes. */
10737 return 5;
10738}
10739
794e51c0
AM
10740/* With power7 weakly ordered memory model, it is possible for ld.so
10741 to update a plt entry in one thread and have another thread see a
10742 stale zero toc entry. To avoid this we need some sort of acquire
10743 barrier in the call stub. One solution is to make the load of the
10744 toc word seem to appear to depend on the load of the function entry
10745 word. Another solution is to test for r2 being zero, and branch to
10746 the appropriate glink entry if so.
10747
10748 . fake dep barrier compare
71a39c98
AM
10749 . ld 12,xxx(2) ld 12,xxx(2)
10750 . mtctr 12 mtctr 12
10751 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
10752 . add 2,2,11 cmpldi 2,0
10753 . ld 2,xxx+8(2) bnectr+
10754 . bctr b <glink_entry>
10755
10756 The solution involving the compare turns out to be faster, so
10757 that's what we use unless the branch won't reach. */
10758
10759#define ALWAYS_USE_FAKE_DEP 0
10760#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 10761
794e51c0
AM
10762static inline unsigned int
10763plt_stub_size (struct ppc_link_hash_table *htab,
10764 struct ppc_stub_hash_entry *stub_entry,
10765 bfd_vma off)
10766{
05d0e962 10767 unsigned size;
b9e5796b 10768
05d0e962
AM
10769 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
10770 {
7c1f4227 10771 if (htab->power10_stubs)
04bdff6a
AM
10772 {
10773 bfd_vma start = (stub_entry->stub_offset
10774 + stub_entry->group->stub_sec->output_offset
10775 + stub_entry->group->stub_sec->output_section->vma);
10776 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10777 start += 4;
7c1f4227 10778 size = 8 + size_power10_offset (off, start & 4);
04bdff6a
AM
10779 }
10780 else
10781 size = 8 + size_offset (off - 8);
05d0e962
AM
10782 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10783 size += 4;
10784 return size;
10785 }
10786
10787 size = 12;
b9e5796b
AM
10788 if (ALWAYS_EMIT_R2SAVE
10789 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10790 size += 4;
10791 if (PPC_HA (off) != 0)
794e51c0 10792 size += 4;
b9e5796b
AM
10793 if (htab->opd_abi)
10794 {
10795 size += 4;
e7d1c40c 10796 if (htab->params->plt_static_chain)
b9e5796b 10797 size += 4;
bd4d2eaa
AM
10798 if (htab->params->plt_thread_safe
10799 && htab->elf.dynamic_sections_created
10800 && stub_entry->h != NULL
10801 && stub_entry->h->elf.dynindx != -1)
b9e5796b 10802 size += 8;
e7d1c40c 10803 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
b9e5796b
AM
10804 size += 4;
10805 }
794e51c0 10806 if (stub_entry->h != NULL
ed7007c1 10807 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 10808 && htab->params->tls_get_addr_opt)
f378ab09 10809 {
9e7028aa
AM
10810 if (htab->params->no_tls_get_addr_regsave)
10811 {
10812 size += 7 * 4;
10813 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
10814 size += 6 * 4;
10815 }
10816 else
10817 {
10818 size += 30 * 4;
10819 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
10820 size += 4;
10821 }
f378ab09 10822 }
794e51c0
AM
10823 return size;
10824}
10825
2420fff6
AM
10826/* Depending on the sign of plt_stub_align:
10827 If positive, return the padding to align to a 2**plt_stub_align
10828 boundary.
10829 If negative, if this stub would cross fewer 2**plt_stub_align
10830 boundaries if we align, then return the padding needed to do so. */
10831
794e51c0
AM
10832static inline unsigned int
10833plt_stub_pad (struct ppc_link_hash_table *htab,
10834 struct ppc_stub_hash_entry *stub_entry,
10835 bfd_vma plt_off)
10836{
2420fff6 10837 int stub_align;
1aa42141 10838 unsigned stub_size;
6f20ed8a 10839 bfd_vma stub_off = stub_entry->group->stub_sec->size;
794e51c0 10840
2420fff6
AM
10841 if (htab->params->plt_stub_align >= 0)
10842 {
10843 stub_align = 1 << htab->params->plt_stub_align;
10844 if ((stub_off & (stub_align - 1)) != 0)
10845 return stub_align - (stub_off & (stub_align - 1));
10846 return 0;
10847 }
10848
10849 stub_align = 1 << -htab->params->plt_stub_align;
1aa42141 10850 stub_size = plt_stub_size (htab, stub_entry, plt_off);
794e51c0 10851 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
e05fa0ba 10852 > ((stub_size - 1) & -stub_align))
794e51c0
AM
10853 return stub_align - (stub_off & (stub_align - 1));
10854 return 0;
10855}
10856
10857/* Build a .plt call stub. */
10858
10859static inline bfd_byte *
10860build_plt_stub (struct ppc_link_hash_table *htab,
10861 struct ppc_stub_hash_entry *stub_entry,
10862 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10863{
e7d1c40c 10864 bfd *obfd = htab->params->stub_bfd;
b9e5796b 10865 bfd_boolean plt_load_toc = htab->opd_abi;
e7d1c40c 10866 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
bd4d2eaa
AM
10867 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10868 && htab->elf.dynamic_sections_created
10869 && stub_entry->h != NULL
10870 && stub_entry->h->elf.dynindx != -1);
794e51c0
AM
10871 bfd_boolean use_fake_dep = plt_thread_safe;
10872 bfd_vma cmp_branch_off = 0;
10873
10874 if (!ALWAYS_USE_FAKE_DEP
b9e5796b 10875 && plt_load_toc
794e51c0 10876 && plt_thread_safe
ed7007c1 10877 && !(is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 10878 && htab->params->tls_get_addr_opt))
794e51c0
AM
10879 {
10880 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
b9e5796b
AM
10881 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10882 / PLT_ENTRY_SIZE (htab));
9e390558 10883 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8;
794e51c0
AM
10884 bfd_vma to, from;
10885
68d62958
AM
10886 if (pltindex > 32768)
10887 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
10888 to = (glinkoff
10889 + htab->glink->output_offset
10890 + htab->glink->output_section->vma);
6f20ed8a 10891 from = (p - stub_entry->group->stub_sec->contents
794e51c0
AM
10892 + 4 * (ALWAYS_EMIT_R2SAVE
10893 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10894 + 4 * (PPC_HA (offset) != 0)
10895 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10896 != PPC_HA (offset))
10897 + 4 * (plt_static_chain != 0)
10898 + 20
6f20ed8a
AM
10899 + stub_entry->group->stub_sec->output_offset
10900 + stub_entry->group->stub_sec->output_section->vma);
794e51c0
AM
10901 cmp_branch_off = to - from;
10902 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10903 }
10904
ac2df442
AM
10905 if (PPC_HA (offset) != 0)
10906 {
176a0d42
AM
10907 if (r != NULL)
10908 {
794e51c0
AM
10909 if (ALWAYS_EMIT_R2SAVE
10910 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10911 r[0].r_offset += 4;
176a0d42 10912 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 10913 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
10914 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10915 r[1].r_addend = r[0].r_addend;
b9e5796b 10916 if (plt_load_toc)
176a0d42 10917 {
b9e5796b 10918 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10919 {
b9e5796b
AM
10920 r[2].r_offset = r[1].r_offset + 4;
10921 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10922 r[2].r_addend = r[0].r_addend;
10923 }
10924 else
10925 {
10926 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10927 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10928 r[2].r_addend = r[0].r_addend + 8;
10929 if (plt_static_chain)
10930 {
10931 r[3].r_offset = r[2].r_offset + 4;
10932 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10933 r[3].r_addend = r[0].r_addend + 16;
10934 }
c7131b65 10935 }
176a0d42
AM
10936 }
10937 }
794e51c0
AM
10938 if (ALWAYS_EMIT_R2SAVE
10939 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10940 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
397998fc
AM
10941 if (plt_load_toc)
10942 {
10943 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10944 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10945 }
10946 else
10947 {
10948 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10949 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10950 }
b9e5796b
AM
10951 if (plt_load_toc
10952 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 10953 {
71a39c98 10954 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
10955 offset = 0;
10956 }
71a39c98 10957 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10958 if (plt_load_toc)
794e51c0 10959 {
b9e5796b
AM
10960 if (use_fake_dep)
10961 {
10962 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10963 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10964 }
10965 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10966 if (plt_static_chain)
10967 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
794e51c0 10968 }
ac2df442
AM
10969 }
10970 else
10971 {
176a0d42
AM
10972 if (r != NULL)
10973 {
794e51c0
AM
10974 if (ALWAYS_EMIT_R2SAVE
10975 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10976 r[0].r_offset += 4;
176a0d42 10977 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
b9e5796b 10978 if (plt_load_toc)
176a0d42 10979 {
b9e5796b 10980 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10981 {
b9e5796b
AM
10982 r[1].r_offset = r[0].r_offset + 4;
10983 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10984 r[1].r_addend = r[0].r_addend;
10985 }
10986 else
10987 {
10988 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10989 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10990 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10991 if (plt_static_chain)
10992 {
10993 r[2].r_offset = r[1].r_offset + 4;
10994 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10995 r[2].r_addend = r[0].r_addend + 8;
10996 }
c7131b65 10997 }
176a0d42
AM
10998 }
10999 }
794e51c0
AM
11000 if (ALWAYS_EMIT_R2SAVE
11001 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 11002 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
71a39c98 11003 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
b9e5796b
AM
11004 if (plt_load_toc
11005 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
11006 {
11007 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
11008 offset = 0;
11009 }
71a39c98 11010 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 11011 if (plt_load_toc)
794e51c0 11012 {
b9e5796b
AM
11013 if (use_fake_dep)
11014 {
11015 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
11016 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
11017 }
11018 if (plt_static_chain)
11019 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
11020 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
794e51c0 11021 }
ac2df442 11022 }
b9e5796b 11023 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
794e51c0
AM
11024 {
11025 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
11026 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 11027 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
11028 }
11029 else
407aa07c 11030 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
11031 return p;
11032}
11033
a7f2871e
AM
11034/* Build a special .plt call stub for __tls_get_addr. */
11035
b9ca1af6 11036#define LD_R0_0R3 0xe8030000
a7f2871e
AM
11037#define LD_R12_0R3 0xe9830000
11038#define MR_R0_R3 0x7c601b78
b9ca1af6 11039#define CMPDI_R0_0 0x2c200000
a7f2871e
AM
11040#define ADD_R3_R12_R13 0x7c6c6a14
11041#define BEQLR 0x4d820020
11042#define MR_R3_R0 0x7c030378
a7f2871e 11043#define BCTRL 0x4e800421
a7f2871e
AM
11044
11045static inline bfd_byte *
794e51c0
AM
11046build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
11047 struct ppc_stub_hash_entry *stub_entry,
11048 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 11049{
e7d1c40c 11050 bfd *obfd = htab->params->stub_bfd;
df136d64 11051 bfd_byte *loc = p;
9e7028aa 11052 unsigned int i;
794e51c0 11053
b9ca1af6 11054 bfd_put_32 (obfd, LD_R0_0R3 + 0, p), p += 4;
a7f2871e 11055 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
b9ca1af6 11056 bfd_put_32 (obfd, CMPDI_R0_0, p), p += 4;
a7f2871e 11057 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
a7f2871e
AM
11058 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
11059 bfd_put_32 (obfd, BEQLR, p), p += 4;
11060 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
9e7028aa
AM
11061 if (htab->params->no_tls_get_addr_regsave)
11062 {
11063 if (r != NULL)
11064 r[0].r_offset += 7 * 4;
11065 if (stub_entry->stub_type != ppc_stub_plt_call_r2save)
11066 return build_plt_stub (htab, stub_entry, p, offset, r);
11067
11068 bfd_put_32 (obfd, MFLR_R0, p);
11069 p += 4;
11070 bfd_put_32 (obfd, STD_R0_0R1 + STK_LINKER (htab), p);
11071 p += 4;
11072
11073 if (r != NULL)
11074 r[0].r_offset += 2 * 4;
11075 p = build_plt_stub (htab, stub_entry, p, offset, r);
11076 bfd_put_32 (obfd, BCTRL, p - 4);
11077
11078 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p);
11079 p += 4;
11080 bfd_put_32 (obfd, LD_R0_0R1 + STK_LINKER (htab), p);
11081 p += 4;
11082 bfd_put_32 (obfd, MTLR_R0, p);
11083 p += 4;
11084 bfd_put_32 (obfd, BLR, p);
11085 p += 4;
11086 }
11087 else
11088 {
11089 p = tls_get_addr_prologue (obfd, p, htab);
f378ab09 11090
9e7028aa
AM
11091 if (r != NULL)
11092 r[0].r_offset += 18 * 4;
a7f2871e 11093
9e7028aa
AM
11094 p = build_plt_stub (htab, stub_entry, p, offset, r);
11095 bfd_put_32 (obfd, BCTRL, p - 4);
11096
11097 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
11098 {
11099 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p);
11100 p += 4;
11101 }
a7f2871e 11102
9e7028aa
AM
11103 p = tls_get_addr_epilogue (obfd, p, htab);
11104 }
a7f2871e 11105
df136d64
AM
11106 if (htab->glink_eh_frame != NULL
11107 && htab->glink_eh_frame->size != 0)
11108 {
11109 bfd_byte *base, *eh;
df136d64
AM
11110
11111 base = htab->glink_eh_frame->contents + stub_entry->group->eh_base + 17;
11112 eh = base + stub_entry->group->eh_size;
9e7028aa
AM
11113 if (htab->params->no_tls_get_addr_regsave)
11114 {
11115 unsigned int lr_used, delta;
11116 lr_used = stub_entry->stub_offset + (p - 20 - loc);
11117 delta = lr_used - stub_entry->group->lr_restore;
11118 stub_entry->group->lr_restore = lr_used + 16;
11119 eh = eh_advance (htab->elf.dynobj, eh, delta);
11120 *eh++ = DW_CFA_offset_extended_sf;
11121 *eh++ = 65;
11122 *eh++ = -(STK_LINKER (htab) / 8) & 0x7f;
11123 *eh++ = DW_CFA_advance_loc + 4;
11124 }
11125 else
11126 {
11127 unsigned int cfa_updt, delta;
11128 /* After the bctrl, lr has been modified so we need to emit
11129 .eh_frame info saying the return address is on the stack. In
11130 fact we must put the EH info at or before the call rather
11131 than after it, because the EH info for a call needs to be
11132 specified by that point.
11133 See libgcc/unwind-dw2.c execute_cfa_program.
11134 Any stack pointer update must be described immediately after
11135 the instruction making the change, and since the stdu occurs
11136 after saving regs we put all the reg saves and the cfa
11137 change there. */
11138 cfa_updt = stub_entry->stub_offset + 18 * 4;
11139 delta = cfa_updt - stub_entry->group->lr_restore;
11140 stub_entry->group->lr_restore
11141 = stub_entry->stub_offset + (p - loc) - 4;
11142 eh = eh_advance (htab->elf.dynobj, eh, delta);
11143 *eh++ = DW_CFA_def_cfa_offset;
11144 if (htab->opd_abi)
11145 {
11146 *eh++ = 128;
11147 *eh++ = 1;
11148 }
11149 else
11150 *eh++ = 96;
11151 *eh++ = DW_CFA_offset_extended_sf;
11152 *eh++ = 65;
11153 *eh++ = (-16 / 8) & 0x7f;
11154 for (i = 4; i < 12; i++)
11155 {
11156 *eh++ = DW_CFA_offset + i;
11157 *eh++ = (htab->opd_abi ? 13 : 12) - i;
11158 }
11159 *eh++ = (DW_CFA_advance_loc
11160 + (stub_entry->group->lr_restore - 8 - cfa_updt) / 4);
11161 *eh++ = DW_CFA_def_cfa_offset;
11162 *eh++ = 0;
11163 for (i = 4; i < 12; i++)
11164 *eh++ = DW_CFA_restore + i;
11165 *eh++ = DW_CFA_advance_loc + 2;
11166 }
df136d64
AM
11167 *eh++ = DW_CFA_restore_extended;
11168 *eh++ = 65;
11169 stub_entry->group->eh_size = eh - base;
11170 }
a7f2871e
AM
11171 return p;
11172}
11173
176a0d42
AM
11174static Elf_Internal_Rela *
11175get_relocs (asection *sec, int count)
11176{
11177 Elf_Internal_Rela *relocs;
11178 struct bfd_elf_section_data *elfsec_data;
11179
11180 elfsec_data = elf_section_data (sec);
11181 relocs = elfsec_data->relocs;
11182 if (relocs == NULL)
11183 {
11184 bfd_size_type relsize;
11185 relsize = sec->reloc_count * sizeof (*relocs);
11186 relocs = bfd_alloc (sec->owner, relsize);
11187 if (relocs == NULL)
11188 return NULL;
11189 elfsec_data->relocs = relocs;
d4730f92
BS
11190 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
11191 sizeof (Elf_Internal_Shdr));
11192 if (elfsec_data->rela.hdr == NULL)
11193 return NULL;
11194 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
11195 * sizeof (Elf64_External_Rela));
11196 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
11197 sec->reloc_count = 0;
11198 }
11199 relocs += sec->reloc_count;
11200 sec->reloc_count += count;
11201 return relocs;
11202}
11203
3d58e1fc
AM
11204/* Convert the relocs R[0] thru R[-NUM_REL+1], which are all no-symbol
11205 forms, to the equivalent relocs against the global symbol given by
11206 STUB_ENTRY->H. */
11207
11208static bfd_boolean
11209use_global_in_relocs (struct ppc_link_hash_table *htab,
11210 struct ppc_stub_hash_entry *stub_entry,
11211 Elf_Internal_Rela *r, unsigned int num_rel)
11212{
11213 struct elf_link_hash_entry **hashes;
11214 unsigned long symndx;
11215 struct ppc_link_hash_entry *h;
11216 bfd_vma symval;
11217
11218 /* Relocs are always against symbols in their own object file. Fake
11219 up global sym hashes for the stub bfd (which has no symbols). */
11220 hashes = elf_sym_hashes (htab->params->stub_bfd);
11221 if (hashes == NULL)
11222 {
11223 bfd_size_type hsize;
11224
11225 /* When called the first time, stub_globals will contain the
11226 total number of symbols seen during stub sizing. After
11227 allocating, stub_globals is used as an index to fill the
11228 hashes array. */
11229 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
11230 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
11231 if (hashes == NULL)
11232 return FALSE;
11233 elf_sym_hashes (htab->params->stub_bfd) = hashes;
11234 htab->stub_globals = 1;
11235 }
11236 symndx = htab->stub_globals++;
11237 h = stub_entry->h;
11238 hashes[symndx] = &h->elf;
11239 if (h->oh != NULL && h->oh->is_func)
11240 h = ppc_follow_link (h->oh);
11241 BFD_ASSERT (h->elf.root.type == bfd_link_hash_defined
11242 || h->elf.root.type == bfd_link_hash_defweak);
ed7007c1 11243 symval = defined_sym_val (&h->elf);
3d58e1fc
AM
11244 while (num_rel-- != 0)
11245 {
11246 r->r_info = ELF64_R_INFO (symndx, ELF64_R_TYPE (r->r_info));
11247 if (h->elf.root.u.def.section != stub_entry->target_section)
11248 {
11249 /* H is an opd symbol. The addend must be zero, and the
11250 branch reloc is the only one we can convert. */
11251 r->r_addend = 0;
11252 break;
11253 }
11254 else
11255 r->r_addend -= symval;
11256 --r;
11257 }
11258 return TRUE;
11259}
11260
aa374f67 11261static bfd_vma
25f53a85 11262get_r2off (struct bfd_link_info *info,
aa374f67
AM
11263 struct ppc_stub_hash_entry *stub_entry)
11264{
25f53a85 11265 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 11266 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
aa374f67
AM
11267
11268 if (r2off == 0)
11269 {
11270 /* Support linking -R objects. Get the toc pointer from the
11271 opd entry. */
11272 char buf[8];
b9e5796b
AM
11273 if (!htab->opd_abi)
11274 return r2off;
aa374f67
AM
11275 asection *opd = stub_entry->h->elf.root.u.def.section;
11276 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
11277
11278 if (strcmp (opd->name, ".opd") != 0
11279 || opd->reloc_count != 0)
11280 {
2cdcc330
AM
11281 info->callbacks->einfo
11282 (_("%P: cannot find opd entry toc for `%pT'\n"),
11283 stub_entry->h->elf.root.root.string);
aa374f67 11284 bfd_set_error (bfd_error_bad_value);
a7c49797 11285 return (bfd_vma) -1;
aa374f67
AM
11286 }
11287 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
a7c49797 11288 return (bfd_vma) -1;
aa374f67 11289 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 11290 r2off -= elf_gp (info->output_bfd);
aa374f67 11291 }
6f20ed8a 11292 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
aa374f67
AM
11293 return r2off;
11294}
11295
b34976b6 11296static bfd_boolean
4ce794b7 11297ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 11298{
721956f4
AM
11299 struct ppc_stub_hash_entry *stub_entry;
11300 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
11301 struct bfd_link_info *info;
11302 struct ppc_link_hash_table *htab;
721956f4 11303 bfd_byte *loc;
3d58e1fc 11304 bfd_byte *p, *relp;
1aa42141 11305 bfd_vma targ, off;
176a0d42 11306 Elf_Internal_Rela *r;
e054468f 11307 asection *plt;
3d58e1fc 11308 int num_rel;
04bdff6a 11309 int odd;
5d1634d7 11310
721956f4
AM
11311 /* Massage our args to the form they really have. */
11312 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 11313 info = in_arg;
5d1634d7 11314
abf874aa
CL
11315 /* Fail if the target section could not be assigned to an output
11316 section. The user should fix his linker script. */
11317 if (stub_entry->target_section != NULL
11318 && stub_entry->target_section->output_section == NULL
11319 && info->non_contiguous_regions)
53215f21
CL
11320 info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
11321 "Retry without --enable-non-contiguous-regions.\n"),
11322 stub_entry->target_section);
abf874aa
CL
11323
11324 /* Same for the group. */
11325 if (stub_entry->group->stub_sec != NULL
11326 && stub_entry->group->stub_sec->output_section == NULL
11327 && info->non_contiguous_regions)
53215f21
CL
11328 info->callbacks->einfo (_("%F%P: Could not assign group %pA target %pA to an "
11329 "output section. Retry without "
11330 "--enable-non-contiguous-regions.\n"),
11331 stub_entry->group->stub_sec,
11332 stub_entry->target_section);
abf874aa 11333
5d1634d7 11334 htab = ppc_hash_table (info);
4dfe6ac6
NC
11335 if (htab == NULL)
11336 return FALSE;
5d1634d7 11337
1aa42141 11338 BFD_ASSERT (stub_entry->stub_offset >= stub_entry->group->stub_sec->size);
6f20ed8a 11339 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
721956f4 11340
4ce794b7 11341 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 11342 switch (stub_entry->stub_type)
5d1634d7 11343 {
721956f4 11344 case ppc_stub_long_branch:
ad8e1ba5 11345 case ppc_stub_long_branch_r2off:
721956f4 11346 /* Branches are relative. This is where we are going to. */
1aa42141 11347 targ = (stub_entry->target_value
6911b7dc
AM
11348 + stub_entry->target_section->output_offset
11349 + stub_entry->target_section->output_section->vma);
1aa42141 11350 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
5d1634d7 11351
721956f4 11352 /* And this is where we are coming from. */
1aa42141
AM
11353 off = (stub_entry->stub_offset
11354 + stub_entry->group->stub_sec->output_offset
11355 + stub_entry->group->stub_sec->output_section->vma);
11356 off = targ - off;
e86ce104 11357
9e390558 11358 p = loc;
ac2df442 11359 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 11360 {
25f53a85 11361 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 11362
a7c49797 11363 if (r2off == (bfd_vma) -1)
aa374f67
AM
11364 {
11365 htab->stub_error = TRUE;
11366 return FALSE;
11367 }
9e390558
AM
11368 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11369 p += 4;
ac2df442
AM
11370 if (PPC_HA (r2off) != 0)
11371 {
e7d1c40c 11372 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11373 ADDIS_R2_R2 | PPC_HA (r2off), p);
11374 p += 4;
a7c49797
AM
11375 }
11376 if (PPC_LO (r2off) != 0)
11377 {
11378 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11379 ADDI_R2_R2 | PPC_LO (r2off), p);
11380 p += 4;
ac2df442 11381 }
9e390558 11382 off -= p - loc;
ad8e1ba5 11383 }
9e390558
AM
11384 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p);
11385 p += 4;
ad8e1ba5 11386
5c3dead3
AM
11387 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11388 {
cf97bcb0
AM
11389 _bfd_error_handler
11390 (_("long branch stub `%s' offset overflow"),
bc30df16 11391 stub_entry->root.string);
5c3dead3
AM
11392 htab->stub_error = TRUE;
11393 return FALSE;
11394 }
ee75fd95
AM
11395
11396 if (info->emitrelocations)
11397 {
6f20ed8a 11398 r = get_relocs (stub_entry->group->stub_sec, 1);
176a0d42
AM
11399 if (r == NULL)
11400 return FALSE;
9e390558 11401 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
ee75fd95 11402 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
1aa42141 11403 r->r_addend = targ;
3d58e1fc
AM
11404 if (stub_entry->h != NULL
11405 && !use_global_in_relocs (htab, stub_entry, r, 1))
11406 return FALSE;
ee75fd95 11407 }
721956f4 11408 break;
e86ce104 11409
721956f4 11410 case ppc_stub_plt_branch:
ad8e1ba5 11411 case ppc_stub_plt_branch_r2off:
721956f4
AM
11412 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11413 stub_entry->root.string + 9,
b34976b6 11414 FALSE, FALSE);
721956f4
AM
11415 if (br_entry == NULL)
11416 {
cf97bcb0
AM
11417 _bfd_error_handler (_("can't find branch stub `%s'"),
11418 stub_entry->root.string);
b34976b6
AM
11419 htab->stub_error = TRUE;
11420 return FALSE;
721956f4
AM
11421 }
11422
1aa42141 11423 targ = (stub_entry->target_value
176a0d42
AM
11424 + stub_entry->target_section->output_offset
11425 + stub_entry->target_section->output_section->vma);
6911b7dc 11426 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
1aa42141 11427 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 11428
1aa42141 11429 bfd_put_64 (htab->brlt->owner, targ,
4ce794b7 11430 htab->brlt->contents + br_entry->offset);
721956f4 11431
f94498ff 11432 if (br_entry->iter == htab->stub_iteration)
721956f4 11433 {
f94498ff 11434 br_entry->iter = 0;
84f5d08e 11435
f94498ff 11436 if (htab->relbrlt != NULL)
84f5d08e 11437 {
f94498ff
AM
11438 /* Create a reloc for the branch lookup table entry. */
11439 Elf_Internal_Rela rela;
11440 bfd_byte *rl;
11441
11442 rela.r_offset = (br_entry->offset
11443 + htab->brlt->output_offset
11444 + htab->brlt->output_section->vma);
11445 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11446 rela.r_addend = targ;
f94498ff
AM
11447
11448 rl = htab->relbrlt->contents;
11449 rl += (htab->relbrlt->reloc_count++
11450 * sizeof (Elf64_External_Rela));
11451 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
11452 }
11453 else if (info->emitrelocations)
11454 {
176a0d42
AM
11455 r = get_relocs (htab->brlt, 1);
11456 if (r == NULL)
11457 return FALSE;
11458 /* brlt, being SEC_LINKER_CREATED does not go through the
11459 normal reloc processing. Symbols and offsets are not
11460 translated from input file to output file form, so
11461 set up the offset per the output file. */
f94498ff
AM
11462 r->r_offset = (br_entry->offset
11463 + htab->brlt->output_offset
11464 + htab->brlt->output_section->vma);
11465 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11466 r->r_addend = targ;
84f5d08e 11467 }
84f5d08e 11468 }
721956f4 11469
1aa42141 11470 targ = (br_entry->offset
176a0d42
AM
11471 + htab->brlt->output_offset
11472 + htab->brlt->output_section->vma);
11473
1aa42141
AM
11474 off = (elf_gp (info->output_bfd)
11475 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11476 off = targ - off;
721956f4 11477
ad8e1ba5 11478 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 11479 {
25f53a85 11480 info->callbacks->einfo
c1c8c1ef 11481 (_("%P: linkage table error against `%pT'\n"),
721956f4 11482 stub_entry->root.string);
5d1634d7 11483 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11484 htab->stub_error = TRUE;
11485 return FALSE;
5d1634d7 11486 }
41bd81ab 11487
176a0d42
AM
11488 if (info->emitrelocations)
11489 {
6f20ed8a 11490 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
176a0d42
AM
11491 if (r == NULL)
11492 return FALSE;
6f20ed8a 11493 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11494 if (bfd_big_endian (info->output_bfd))
11495 r[0].r_offset += 2;
00f412ee 11496 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
176a0d42
AM
11497 r[0].r_offset += 4;
11498 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
1aa42141 11499 r[0].r_addend = targ;
176a0d42
AM
11500 if (PPC_HA (off) != 0)
11501 {
11502 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11503 r[1].r_offset = r[0].r_offset + 4;
11504 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11505 r[1].r_addend = r[0].r_addend;
11506 }
11507 }
11508
9e390558 11509 p = loc;
00f412ee 11510 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ad8e1ba5 11511 {
176a0d42 11512 if (PPC_HA (off) != 0)
ac2df442 11513 {
e7d1c40c 11514 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11515 ADDIS_R12_R2 | PPC_HA (off), p);
11516 p += 4;
e7d1c40c 11517 bfd_put_32 (htab->params->stub_bfd,
9e390558 11518 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11519 }
11520 else
9e390558
AM
11521 bfd_put_32 (htab->params->stub_bfd,
11522 LD_R12_0R2 | PPC_LO (off), p);
ad8e1ba5
AM
11523 }
11524 else
11525 {
25f53a85 11526 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 11527
a7c49797 11528 if (r2off == (bfd_vma) -1)
aa374f67
AM
11529 {
11530 htab->stub_error = TRUE;
11531 return FALSE;
11532 }
ad8e1ba5 11533
9e390558
AM
11534 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11535 p += 4;
176a0d42 11536 if (PPC_HA (off) != 0)
ac2df442 11537 {
e7d1c40c 11538 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11539 ADDIS_R12_R2 | PPC_HA (off), p);
11540 p += 4;
e7d1c40c 11541 bfd_put_32 (htab->params->stub_bfd,
9e390558 11542 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11543 }
11544 else
9e390558 11545 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p);
ac2df442
AM
11546
11547 if (PPC_HA (r2off) != 0)
11548 {
9e390558 11549 p += 4;
e7d1c40c 11550 bfd_put_32 (htab->params->stub_bfd,
9e390558 11551 ADDIS_R2_R2 | PPC_HA (r2off), p);
00f412ee
AM
11552 }
11553 if (PPC_LO (r2off) != 0)
11554 {
9e390558 11555 p += 4;
e7d1c40c 11556 bfd_put_32 (htab->params->stub_bfd,
9e390558 11557 ADDI_R2_R2 | PPC_LO (r2off), p);
ac2df442 11558 }
ad8e1ba5 11559 }
9e390558
AM
11560 p += 4;
11561 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11562 p += 4;
407aa07c
AM
11563 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11564 p += 4;
721956f4 11565 break;
5d1634d7 11566
05d0e962
AM
11567 case ppc_stub_long_branch_notoc:
11568 case ppc_stub_long_branch_both:
11569 case ppc_stub_plt_branch_notoc:
11570 case ppc_stub_plt_branch_both:
11571 case ppc_stub_plt_call_notoc:
11572 case ppc_stub_plt_call_both:
11573 p = loc;
f891966f 11574 off = (stub_entry->stub_offset
05d0e962
AM
11575 + stub_entry->group->stub_sec->output_offset
11576 + stub_entry->group->stub_sec->output_section->vma);
11577 if (stub_entry->stub_type == ppc_stub_long_branch_both
11578 || stub_entry->stub_type == ppc_stub_plt_branch_both
11579 || stub_entry->stub_type == ppc_stub_plt_call_both)
11580 {
11581 off += 4;
11582 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11583 p += 4;
11584 }
11585 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
11586 {
11587 targ = stub_entry->plt_ent->plt.offset & ~1;
11588 if (targ >= (bfd_vma) -2)
11589 abort ();
11590
11591 plt = htab->elf.splt;
11592 if (!htab->elf.dynamic_sections_created
11593 || stub_entry->h == NULL
11594 || stub_entry->h->elf.dynindx == -1)
11595 {
11596 if (stub_entry->symtype == STT_GNU_IFUNC)
11597 plt = htab->elf.iplt;
11598 else
11599 plt = htab->pltlocal;
11600 }
11601 targ += plt->output_offset + plt->output_section->vma;
11602 }
11603 else
11604 targ = (stub_entry->target_value
11605 + stub_entry->target_section->output_offset
11606 + stub_entry->target_section->output_section->vma);
04bdff6a 11607 odd = off & 4;
05d0e962 11608 off = targ - off;
f891966f 11609
3d58e1fc
AM
11610 relp = p;
11611 num_rel = 0;
7c1f4227 11612 if (htab->power10_stubs)
04bdff6a
AM
11613 {
11614 bfd_boolean load = stub_entry->stub_type >= ppc_stub_plt_call_notoc;
7c1f4227 11615 p = build_power10_offset (htab->params->stub_bfd, p, off, odd, load);
04bdff6a
AM
11616 }
11617 else
11618 {
11619 /* The notoc stubs calculate their target (either a PLT entry or
11620 the global entry point of a function) relative to the PC
11621 returned by the "bcl" two instructions past the start of the
11622 sequence emitted by build_offset. The offset is therefore 8
11623 less than calculated from the start of the sequence. */
11624 off -= 8;
11625 p = build_offset (htab->params->stub_bfd, p, off,
11626 stub_entry->stub_type >= ppc_stub_plt_call_notoc);
11627 }
11628
f891966f 11629 if (stub_entry->stub_type <= ppc_stub_long_branch_both)
05d0e962 11630 {
f891966f 11631 bfd_vma from;
3d58e1fc 11632 num_rel = 1;
f891966f
AM
11633 from = (stub_entry->stub_offset
11634 + stub_entry->group->stub_sec->output_offset
11635 + stub_entry->group->stub_sec->output_section->vma
11636 + (p - loc));
05d0e962 11637 bfd_put_32 (htab->params->stub_bfd,
f891966f 11638 B_DOT | ((targ - from) & 0x3fffffc), p);
05d0e962
AM
11639 }
11640 else
11641 {
11642 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11643 p += 4;
11644 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11645 }
11646 p += 4;
df136d64 11647
3d58e1fc
AM
11648 if (info->emitrelocations)
11649 {
04bdff6a 11650 bfd_vma roff = relp - stub_entry->group->stub_sec->contents;
7c1f4227
AM
11651 if (htab->power10_stubs)
11652 num_rel += num_relocs_for_power10_offset (off, odd);
04bdff6a
AM
11653 else
11654 {
11655 num_rel += num_relocs_for_offset (off);
11656 roff += 16;
11657 }
3d58e1fc
AM
11658 r = get_relocs (stub_entry->group->stub_sec, num_rel);
11659 if (r == NULL)
11660 return FALSE;
7c1f4227
AM
11661 if (htab->power10_stubs)
11662 r = emit_relocs_for_power10_offset (info, r, roff, targ, off, odd);
04bdff6a
AM
11663 else
11664 r = emit_relocs_for_offset (info, r, roff, targ, off);
3d58e1fc
AM
11665 if (stub_entry->stub_type == ppc_stub_long_branch_notoc
11666 || stub_entry->stub_type == ppc_stub_long_branch_both)
11667 {
11668 ++r;
11669 roff = p - 4 - stub_entry->group->stub_sec->contents;
11670 r->r_offset = roff;
11671 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
11672 r->r_addend = targ;
11673 if (stub_entry->h != NULL
11674 && !use_global_in_relocs (htab, stub_entry, r, num_rel))
11675 return FALSE;
11676 }
11677 }
11678
7c1f4227 11679 if (!htab->power10_stubs
04bdff6a
AM
11680 && htab->glink_eh_frame != NULL
11681 && htab->glink_eh_frame->size != 0)
df136d64
AM
11682 {
11683 bfd_byte *base, *eh;
11684 unsigned int lr_used, delta;
11685
11686 base = (htab->glink_eh_frame->contents
11687 + stub_entry->group->eh_base + 17);
11688 eh = base + stub_entry->group->eh_size;
11689 lr_used = stub_entry->stub_offset + 8;
11690 if (stub_entry->stub_type == ppc_stub_long_branch_both
11691 || stub_entry->stub_type == ppc_stub_plt_branch_both
11692 || stub_entry->stub_type == ppc_stub_plt_call_both)
11693 lr_used += 4;
11694 delta = lr_used - stub_entry->group->lr_restore;
11695 stub_entry->group->lr_restore = lr_used + 8;
11696 eh = eh_advance (htab->elf.dynobj, eh, delta);
11697 *eh++ = DW_CFA_register;
11698 *eh++ = 65;
11699 *eh++ = 12;
11700 *eh++ = DW_CFA_advance_loc + 2;
11701 *eh++ = DW_CFA_restore_extended;
11702 *eh++ = 65;
11703 stub_entry->group->eh_size = eh - base;
11704 }
05d0e962
AM
11705 break;
11706
721956f4 11707 case ppc_stub_plt_call:
794e51c0 11708 case ppc_stub_plt_call_r2save:
e054468f 11709 if (stub_entry->h != NULL
b31867b6
AM
11710 && stub_entry->h->is_func_descriptor
11711 && stub_entry->h->oh != NULL)
c862ae31 11712 {
b31867b6
AM
11713 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11714
11715 /* If the old-ABI "dot-symbol" is undefined make it weak so
6f20ed8a 11716 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
8c5b4e52
AM
11717 if (fh->elf.root.type == bfd_link_hash_undefined
11718 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11719 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
b31867b6 11720 fh->elf.root.type = bfd_link_hash_undefweak;
c862ae31
AM
11721 }
11722
721956f4 11723 /* Now build the stub. */
1aa42141
AM
11724 targ = stub_entry->plt_ent->plt.offset & ~1;
11725 if (targ >= (bfd_vma) -2)
721956f4
AM
11726 abort ();
11727
33e44f2e 11728 plt = htab->elf.splt;
25f23106
AM
11729 if (!htab->elf.dynamic_sections_created
11730 || stub_entry->h == NULL
11731 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11732 {
11733 if (stub_entry->symtype == STT_GNU_IFUNC)
11734 plt = htab->elf.iplt;
11735 else
11736 plt = htab->pltlocal;
11737 }
1aa42141 11738 targ += plt->output_offset + plt->output_section->vma;
e054468f 11739
1aa42141
AM
11740 off = (elf_gp (info->output_bfd)
11741 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11742 off = targ - off;
721956f4 11743
ad8e1ba5 11744 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 11745 {
25f53a85 11746 info->callbacks->einfo
695344c0 11747 /* xgettext:c-format */
c1c8c1ef 11748 (_("%P: linkage table error against `%pT'\n"),
e054468f
AM
11749 stub_entry->h != NULL
11750 ? stub_entry->h->elf.root.root.string
11751 : "<local sym>");
721956f4 11752 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11753 htab->stub_error = TRUE;
11754 return FALSE;
721956f4
AM
11755 }
11756
176a0d42
AM
11757 r = NULL;
11758 if (info->emitrelocations)
11759 {
6f20ed8a 11760 r = get_relocs (stub_entry->group->stub_sec,
3ba720c7
AM
11761 ((PPC_HA (off) != 0)
11762 + (htab->opd_abi
e7d1c40c 11763 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
11764 && PPC_HA (off + 16) == PPC_HA (off))
11765 : 1)));
176a0d42
AM
11766 if (r == NULL)
11767 return FALSE;
6f20ed8a 11768 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11769 if (bfd_big_endian (info->output_bfd))
11770 r[0].r_offset += 2;
1aa42141 11771 r[0].r_addend = targ;
176a0d42 11772 }
a7f2871e 11773 if (stub_entry->h != NULL
ed7007c1 11774 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 11775 && htab->params->tls_get_addr_opt)
794e51c0 11776 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 11777 else
794e51c0 11778 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
11779 break;
11780
a4b6fadd
AM
11781 case ppc_stub_save_res:
11782 return TRUE;
11783
721956f4
AM
11784 default:
11785 BFD_FAIL ();
b34976b6 11786 return FALSE;
721956f4
AM
11787 }
11788
1aa42141 11789 stub_entry->group->stub_sec->size = stub_entry->stub_offset + (p - loc);
97b639ba 11790
e7d1c40c 11791 if (htab->params->emit_stub_syms)
97b639ba
AM
11792 {
11793 struct elf_link_hash_entry *h;
ee75fd95
AM
11794 size_t len1, len2;
11795 char *name;
11796 const char *const stub_str[] = { "long_branch",
05d0e962
AM
11797 "long_branch",
11798 "long_branch",
3f6ff479
AM
11799 "long_branch",
11800 "plt_branch",
ee75fd95 11801 "plt_branch",
05d0e962
AM
11802 "plt_branch",
11803 "plt_branch",
11804 "plt_call",
11805 "plt_call",
794e51c0 11806 "plt_call",
ee75fd95
AM
11807 "plt_call" };
11808
11809 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11810 len2 = strlen (stub_entry->root.string);
11811 name = bfd_malloc (len1 + len2 + 2);
11812 if (name == NULL)
11813 return FALSE;
11814 memcpy (name, stub_entry->root.string, 9);
11815 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11816 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11817 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
11818 if (h == NULL)
11819 return FALSE;
11820 if (h->root.type == bfd_link_hash_new)
11821 {
11822 h->root.type = bfd_link_hash_defined;
6f20ed8a 11823 h->root.u.def.section = stub_entry->group->stub_sec;
97b639ba 11824 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
11825 h->ref_regular = 1;
11826 h->def_regular = 1;
11827 h->ref_regular_nonweak = 1;
11828 h->forced_local = 1;
11829 h->non_elf = 0;
2ec55de3 11830 h->root.linker_def = 1;
97b639ba
AM
11831 }
11832 }
11833
b34976b6 11834 return TRUE;
721956f4
AM
11835}
11836
11837/* As above, but don't actually build the stub. Just bump offset so
11838 we know stub section sizes, and select plt_branch stubs where
11839 long_branch stubs won't do. */
11840
b34976b6 11841static bfd_boolean
4ce794b7 11842ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
11843{
11844 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 11845 struct bfd_link_info *info;
721956f4 11846 struct ppc_link_hash_table *htab;
f891966f
AM
11847 asection *plt;
11848 bfd_vma targ, off, r2off;
04bdff6a 11849 unsigned int size, extra, lr_used, delta, odd;
721956f4
AM
11850
11851 /* Massage our args to the form they really have. */
11852 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
11853 info = in_arg;
11854
11855 htab = ppc_hash_table (info);
4dfe6ac6
NC
11856 if (htab == NULL)
11857 return FALSE;
721956f4 11858
abf874aa
CL
11859 /* Fail if the target section could not be assigned to an output
11860 section. The user should fix his linker script. */
11861 if (stub_entry->target_section != NULL
11862 && stub_entry->target_section->output_section == NULL
11863 && info->non_contiguous_regions)
53215f21
CL
11864 info->callbacks->einfo (_("%F%P: Could not assign %pA to an output section. "
11865 "Retry without --enable-non-contiguous-regions.\n"),
11866 stub_entry->target_section);
abf874aa
CL
11867
11868 /* Same for the group. */
11869 if (stub_entry->group->stub_sec != NULL
11870 && stub_entry->group->stub_sec->output_section == NULL
11871 && info->non_contiguous_regions)
53215f21
CL
11872 info->callbacks->einfo (_("%F%P: Could not assign group %pA target %pA to an "
11873 "output section. Retry without "
11874 "--enable-non-contiguous-regions.\n"),
11875 stub_entry->group->stub_sec,
11876 stub_entry->target_section);
abf874aa 11877
1aa42141
AM
11878 /* Make a note of the offset within the stubs for this entry. */
11879 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11880
a4b6fadd
AM
11881 if (stub_entry->h != NULL
11882 && stub_entry->h->save_res
11883 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11884 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11885 {
11886 /* Don't make stubs to out-of-line register save/restore
11887 functions. Instead, emit copies of the functions. */
11888 stub_entry->group->needs_save_res = 1;
11889 stub_entry->stub_type = ppc_stub_save_res;
11890 return TRUE;
11891 }
11892
f891966f 11893 switch (stub_entry->stub_type)
721956f4 11894 {
f891966f
AM
11895 case ppc_stub_plt_branch:
11896 case ppc_stub_plt_branch_r2off:
11897 /* Reset the stub type from the plt branch variant in case we now
11898 can reach with a shorter stub. */
11899 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11900 /* Fall through. */
11901 case ppc_stub_long_branch:
11902 case ppc_stub_long_branch_r2off:
1aa42141
AM
11903 targ = (stub_entry->target_value
11904 + stub_entry->target_section->output_offset
11905 + stub_entry->target_section->output_section->vma);
f891966f 11906 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
1aa42141
AM
11907 off = (stub_entry->stub_offset
11908 + stub_entry->group->stub_sec->output_offset
11909 + stub_entry->group->stub_sec->output_section->vma);
721956f4 11910
ad8e1ba5 11911 size = 4;
f891966f 11912 r2off = 0;
ad8e1ba5
AM
11913 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11914 {
25f53a85 11915 r2off = get_r2off (info, stub_entry);
a7c49797 11916 if (r2off == (bfd_vma) -1)
aa374f67
AM
11917 {
11918 htab->stub_error = TRUE;
11919 return FALSE;
11920 }
a7c49797 11921 size = 8;
ac2df442 11922 if (PPC_HA (r2off) != 0)
a7c49797
AM
11923 size += 4;
11924 if (PPC_LO (r2off) != 0)
11925 size += 4;
1aa42141 11926 off += size - 4;
ad8e1ba5 11927 }
1aa42141 11928 off = targ - off;
ad8e1ba5 11929
f891966f
AM
11930 /* If the branch offset is too big, use a ppc_stub_plt_branch.
11931 Do the same for -R objects without function descriptors. */
11932 if ((stub_entry->stub_type == ppc_stub_long_branch_r2off
11933 && r2off == 0
11934 && htab->sec_info[stub_entry->target_section->id].toc_off == 0)
11935 || off + (1 << 25) >= (bfd_vma) (1 << 26))
721956f4 11936 {
f891966f 11937 struct ppc_branch_hash_entry *br_entry;
df136d64 11938
f891966f
AM
11939 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11940 stub_entry->root.string + 9,
11941 TRUE, FALSE);
11942 if (br_entry == NULL)
721956f4 11943 {
f891966f
AM
11944 _bfd_error_handler (_("can't build branch stub `%s'"),
11945 stub_entry->root.string);
11946 htab->stub_error = TRUE;
11947 return FALSE;
721956f4
AM
11948 }
11949
f891966f 11950 if (br_entry->iter != htab->stub_iteration)
721956f4 11951 {
f891966f
AM
11952 br_entry->iter = htab->stub_iteration;
11953 br_entry->offset = htab->brlt->size;
11954 htab->brlt->size += 8;
63bc6f6c 11955
f891966f
AM
11956 if (htab->relbrlt != NULL)
11957 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11958 else if (info->emitrelocations)
84f5d08e 11959 {
f891966f
AM
11960 htab->brlt->reloc_count += 1;
11961 htab->brlt->flags |= SEC_RELOC;
05d0e962 11962 }
f891966f 11963 }
ac2df442 11964
f891966f
AM
11965 targ = (br_entry->offset
11966 + htab->brlt->output_offset
11967 + htab->brlt->output_section->vma);
11968 off = (elf_gp (info->output_bfd)
11969 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11970 off = targ - off;
176a0d42 11971
f891966f
AM
11972 if (info->emitrelocations)
11973 {
11974 stub_entry->group->stub_sec->reloc_count
11975 += 1 + (PPC_HA (off) != 0);
11976 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11977 }
05d0e962 11978
f891966f
AM
11979 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11980 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11981 {
11982 size = 12;
11983 if (PPC_HA (off) != 0)
11984 size = 16;
ac2df442 11985 }
f891966f 11986 else
ac2df442 11987 {
f891966f
AM
11988 size = 16;
11989 if (PPC_HA (off) != 0)
11990 size += 4;
11991
11992 if (PPC_HA (r2off) != 0)
11993 size += 4;
11994 if (PPC_LO (r2off) != 0)
11995 size += 4;
ac2df442 11996 }
721956f4 11997 }
f891966f
AM
11998 else if (info->emitrelocations)
11999 {
12000 stub_entry->group->stub_sec->reloc_count += 1;
12001 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12002 }
12003 break;
12004
12005 case ppc_stub_plt_branch_notoc:
12006 case ppc_stub_plt_branch_both:
12007 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
12008 /* Fall through. */
12009 case ppc_stub_long_branch_notoc:
12010 case ppc_stub_long_branch_both:
12011 off = (stub_entry->stub_offset
12012 + stub_entry->group->stub_sec->output_offset
12013 + stub_entry->group->stub_sec->output_section->vma);
12014 size = 0;
12015 if (stub_entry->stub_type == ppc_stub_long_branch_both)
12016 size = 4;
12017 off += size;
12018 targ = (stub_entry->target_value
12019 + stub_entry->target_section->output_offset
12020 + stub_entry->target_section->output_section->vma);
04bdff6a 12021 odd = off & 4;
f891966f
AM
12022 off = targ - off;
12023
3d58e1fc
AM
12024 if (info->emitrelocations)
12025 {
04bdff6a 12026 unsigned int num_rel;
7c1f4227
AM
12027 if (htab->power10_stubs)
12028 num_rel = num_relocs_for_power10_offset (off, odd);
04bdff6a
AM
12029 else
12030 num_rel = num_relocs_for_offset (off - 8);
12031 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
12032 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12033 }
12034
7c1f4227
AM
12035 if (htab->power10_stubs)
12036 extra = size_power10_offset (off, odd);
04bdff6a
AM
12037 else
12038 extra = size_offset (off - 8);
f891966f
AM
12039 /* Include branch insn plus those in the offset sequence. */
12040 size += 4 + extra;
12041 /* The branch insn is at the end, or "extra" bytes along. So
12042 its offset will be "extra" bytes less that that already
12043 calculated. */
12044 off -= extra;
12045
7c1f4227 12046 if (!htab->power10_stubs)
04bdff6a
AM
12047 {
12048 /* After the bcl, lr has been modified so we need to emit
12049 .eh_frame info saying the return address is in r12. */
12050 lr_used = stub_entry->stub_offset + 8;
12051 if (stub_entry->stub_type == ppc_stub_long_branch_both)
12052 lr_used += 4;
12053 /* The eh_frame info will consist of a DW_CFA_advance_loc or
12054 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
12055 DW_CFA_restore_extended 65. */
12056 delta = lr_used - stub_entry->group->lr_restore;
12057 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12058 stub_entry->group->lr_restore = lr_used + 8;
12059 }
f891966f
AM
12060
12061 /* If the branch can't reach, use a plt_branch. */
12062 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
12063 {
12064 stub_entry->stub_type += (ppc_stub_plt_branch_notoc
12065 - ppc_stub_long_branch_notoc);
12066 size += 4;
12067 }
3d58e1fc
AM
12068 else if (info->emitrelocations)
12069 stub_entry->group->stub_sec->reloc_count +=1;
f891966f
AM
12070 break;
12071
12072 case ppc_stub_plt_call_notoc:
12073 case ppc_stub_plt_call_both:
12074 off = (stub_entry->stub_offset
12075 + stub_entry->group->stub_sec->output_offset
12076 + stub_entry->group->stub_sec->output_section->vma);
12077 if (stub_entry->stub_type == ppc_stub_plt_call_both)
12078 off += 4;
12079 targ = stub_entry->plt_ent->plt.offset & ~1;
12080 if (targ >= (bfd_vma) -2)
12081 abort ();
12082
12083 plt = htab->elf.splt;
12084 if (!htab->elf.dynamic_sections_created
12085 || stub_entry->h == NULL
12086 || stub_entry->h->elf.dynindx == -1)
12087 {
12088 if (stub_entry->symtype == STT_GNU_IFUNC)
12089 plt = htab->elf.iplt;
12090 else
12091 plt = htab->pltlocal;
12092 }
12093 targ += plt->output_offset + plt->output_section->vma;
04bdff6a 12094 odd = off & 4;
f891966f
AM
12095 off = targ - off;
12096
12097 if (htab->params->plt_stub_align != 0)
12098 {
12099 unsigned pad = plt_stub_pad (htab, stub_entry, off);
12100
12101 stub_entry->group->stub_sec->size += pad;
12102 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
12103 off -= pad;
12104 }
12105
3d58e1fc
AM
12106 if (info->emitrelocations)
12107 {
04bdff6a 12108 unsigned int num_rel;
7c1f4227
AM
12109 if (htab->power10_stubs)
12110 num_rel = num_relocs_for_power10_offset (off, odd);
04bdff6a
AM
12111 else
12112 num_rel = num_relocs_for_offset (off - 8);
12113 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
12114 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12115 }
12116
f891966f
AM
12117 size = plt_stub_size (htab, stub_entry, off);
12118
7c1f4227 12119 if (!htab->power10_stubs)
04bdff6a
AM
12120 {
12121 /* After the bcl, lr has been modified so we need to emit
12122 .eh_frame info saying the return address is in r12. */
12123 lr_used = stub_entry->stub_offset + 8;
12124 if (stub_entry->stub_type == ppc_stub_plt_call_both)
12125 lr_used += 4;
12126 /* The eh_frame info will consist of a DW_CFA_advance_loc or
12127 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
12128 DW_CFA_restore_extended 65. */
12129 delta = lr_used - stub_entry->group->lr_restore;
12130 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12131 stub_entry->group->lr_restore = lr_used + 8;
12132 }
f891966f
AM
12133 break;
12134
12135 case ppc_stub_plt_call:
12136 case ppc_stub_plt_call_r2save:
12137 targ = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
12138 if (targ >= (bfd_vma) -2)
12139 abort ();
12140 plt = htab->elf.splt;
12141 if (!htab->elf.dynamic_sections_created
12142 || stub_entry->h == NULL
12143 || stub_entry->h->elf.dynindx == -1)
12144 {
12145 if (stub_entry->symtype == STT_GNU_IFUNC)
12146 plt = htab->elf.iplt;
12147 else
12148 plt = htab->pltlocal;
12149 }
12150 targ += plt->output_offset + plt->output_section->vma;
12151
12152 off = (elf_gp (info->output_bfd)
12153 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
12154 off = targ - off;
12155
12156 if (htab->params->plt_stub_align != 0)
12157 {
12158 unsigned pad = plt_stub_pad (htab, stub_entry, off);
12159
12160 stub_entry->group->stub_sec->size += pad;
12161 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
12162 }
12163
12164 if (info->emitrelocations)
12165 {
12166 stub_entry->group->stub_sec->reloc_count
12167 += ((PPC_HA (off) != 0)
12168 + (htab->opd_abi
12169 ? 2 + (htab->params->plt_static_chain
12170 && PPC_HA (off + 16) == PPC_HA (off))
12171 : 1));
12172 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12173 }
12174
12175 size = plt_stub_size (htab, stub_entry, off);
12176
12177 if (stub_entry->h != NULL
ed7007c1 12178 && is_tls_get_addr (&stub_entry->h->elf, htab)
f891966f
AM
12179 && htab->params->tls_get_addr_opt
12180 && stub_entry->stub_type == ppc_stub_plt_call_r2save)
12181 {
9e7028aa
AM
12182 if (htab->params->no_tls_get_addr_regsave)
12183 {
12184 lr_used = stub_entry->stub_offset + size - 20;
12185 /* The eh_frame info will consist of a DW_CFA_advance_loc
12186 or variant, DW_CFA_offset_externed_sf, 65, -stackoff,
12187 DW_CFA_advance_loc+4, DW_CFA_restore_extended, 65. */
12188 delta = lr_used - stub_entry->group->lr_restore;
12189 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12190 }
12191 else
12192 {
12193 /* Adjustments to r1 need to be described. */
12194 unsigned int cfa_updt = stub_entry->stub_offset + 18 * 4;
12195 delta = cfa_updt - stub_entry->group->lr_restore;
12196 stub_entry->group->eh_size += eh_advance_size (delta);
12197 stub_entry->group->eh_size += htab->opd_abi ? 36 : 35;
12198 }
f891966f
AM
12199 stub_entry->group->lr_restore = size - 4;
12200 }
12201 break;
12202
12203 default:
12204 BFD_FAIL ();
12205 return FALSE;
721956f4
AM
12206 }
12207
6f20ed8a 12208 stub_entry->group->stub_sec->size += size;
b34976b6 12209 return TRUE;
721956f4
AM
12210}
12211
12212/* Set up various things so that we can make a list of input sections
12213 for each output section included in the link. Returns -1 on error,
cedb70c5 12214 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
12215
12216int
e7d1c40c 12217ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4 12218{
6f20ed8a 12219 unsigned int id;
986f0783 12220 size_t amt;
721956f4
AM
12221 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12222
4dfe6ac6
NC
12223 if (htab == NULL)
12224 return -1;
4c52953f 12225
7cf7fcc8 12226 htab->sec_info_arr_size = _bfd_section_id;
6f20ed8a
AM
12227 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
12228 htab->sec_info = bfd_zmalloc (amt);
12229 if (htab->sec_info == NULL)
721956f4
AM
12230 return -1;
12231
3d6f9012
AM
12232 /* Set toc_off for com, und, abs and ind sections. */
12233 for (id = 0; id < 3; id++)
6f20ed8a 12234 htab->sec_info[id].toc_off = TOC_BASE_OFF;
734b6cf9 12235
721956f4
AM
12236 return 1;
12237}
12238
927be08e
AM
12239/* Set up for first pass at multitoc partitioning. */
12240
12241void
12242ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
12243{
12244 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12245
1c865ab2 12246 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
12247 htab->toc_bfd = NULL;
12248 htab->toc_first_sec = NULL;
12249}
12250
e717da7e
AM
12251/* The linker repeatedly calls this function for each TOC input section
12252 and linker generated GOT section. Group input bfds such that the toc
927be08e 12253 within a group is less than 64k in size. */
ad8e1ba5 12254
927be08e 12255bfd_boolean
4ce794b7 12256ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
12257{
12258 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 12259 bfd_vma addr, off, limit;
ad8e1ba5 12260
4dfe6ac6
NC
12261 if (htab == NULL)
12262 return FALSE;
12263
927be08e 12264 if (!htab->second_toc_pass)
4c52953f 12265 {
927be08e 12266 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
12267 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
12268
12269 if (new_bfd)
bf102f86
AM
12270 {
12271 htab->toc_bfd = isec->owner;
12272 htab->toc_first_sec = isec;
12273 }
927be08e 12274
bf102f86
AM
12275 addr = isec->output_offset + isec->output_section->vma;
12276 off = addr - htab->toc_curr;
d77c8a4b
AM
12277 limit = 0x80008000;
12278 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
12279 limit = 0x10000;
12280 if (off + isec->size > limit)
bf102f86
AM
12281 {
12282 addr = (htab->toc_first_sec->output_offset
12283 + htab->toc_first_sec->output_section->vma);
12284 htab->toc_curr = addr;
a27e685f 12285 htab->toc_curr &= -TOC_BASE_ALIGN;
bf102f86 12286 }
99877b66 12287
927be08e
AM
12288 /* toc_curr is the base address of this toc group. Set elf_gp
12289 for the input section to be the offset relative to the
12290 output toc base plus 0x8000. Making the input elf_gp an
12291 offset allows us to move the toc as a whole without
12292 recalculating input elf_gp. */
06bcf541 12293 off = htab->toc_curr - elf_gp (info->output_bfd);
927be08e
AM
12294 off += TOC_BASE_OFF;
12295
12296 /* Die if someone uses a linker script that doesn't keep input
12297 file .toc and .got together. */
a4fd3de5
AM
12298 if (new_bfd
12299 && elf_gp (isec->owner) != 0
927be08e
AM
12300 && elf_gp (isec->owner) != off)
12301 return FALSE;
12302
12303 elf_gp (isec->owner) = off;
12304 return TRUE;
4c52953f 12305 }
927be08e
AM
12306
12307 /* During the second pass toc_first_sec points to the start of
12308 a toc group, and toc_curr is used to track the old elf_gp.
12309 We use toc_bfd to ensure we only look at each bfd once. */
12310 if (htab->toc_bfd == isec->owner)
12311 return TRUE;
12312 htab->toc_bfd = isec->owner;
12313
12314 if (htab->toc_first_sec == NULL
12315 || htab->toc_curr != elf_gp (isec->owner))
12316 {
12317 htab->toc_curr = elf_gp (isec->owner);
12318 htab->toc_first_sec = isec;
12319 }
12320 addr = (htab->toc_first_sec->output_offset
12321 + htab->toc_first_sec->output_section->vma);
06bcf541 12322 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
927be08e
AM
12323 elf_gp (isec->owner) = off;
12324
12325 return TRUE;
ad8e1ba5
AM
12326}
12327
927be08e
AM
12328/* Called via elf_link_hash_traverse to merge GOT entries for global
12329 symbol H. */
12330
12331static bfd_boolean
12332merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12333{
12334 if (h->root.type == bfd_link_hash_indirect)
12335 return TRUE;
12336
927be08e
AM
12337 merge_got_entries (&h->got.glist);
12338
12339 return TRUE;
12340}
12341
12342/* Called via elf_link_hash_traverse to allocate GOT entries for global
12343 symbol H. */
12344
12345static bfd_boolean
12346reallocate_got (struct elf_link_hash_entry *h, void *inf)
12347{
12348 struct got_entry *gent;
12349
12350 if (h->root.type == bfd_link_hash_indirect)
12351 return TRUE;
12352
927be08e
AM
12353 for (gent = h->got.glist; gent != NULL; gent = gent->next)
12354 if (!gent->is_indirect)
12355 allocate_got (h, (struct bfd_link_info *) inf, gent);
12356 return TRUE;
12357}
12358
12359/* Called on the first multitoc pass after the last call to
12360 ppc64_elf_next_toc_section. This function removes duplicate GOT
12361 entries. */
12362
12363bfd_boolean
12364ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
12365{
12366 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
12367 struct bfd *ibfd, *ibfd2;
12368 bfd_boolean done_something;
12369
12370 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 12371
7865406b
AM
12372 if (!htab->do_multi_toc)
12373 return FALSE;
12374
d0fae19d 12375 /* Merge global sym got entries within a toc group. */
927be08e
AM
12376 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
12377
12378 /* And tlsld_got. */
c72f2fb2 12379 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12380 {
12381 struct got_entry *ent, *ent2;
12382
12383 if (!is_ppc64_elf (ibfd))
12384 continue;
12385
12386 ent = ppc64_tlsld_got (ibfd);
12387 if (!ent->is_indirect
12388 && ent->got.offset != (bfd_vma) -1)
12389 {
c72f2fb2 12390 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
12391 {
12392 if (!is_ppc64_elf (ibfd2))
12393 continue;
12394
12395 ent2 = ppc64_tlsld_got (ibfd2);
12396 if (!ent2->is_indirect
12397 && ent2->got.offset != (bfd_vma) -1
12398 && elf_gp (ibfd2) == elf_gp (ibfd))
12399 {
12400 ent2->is_indirect = TRUE;
12401 ent2->got.ent = ent;
12402 }
12403 }
12404 }
12405 }
12406
12407 /* Zap sizes of got sections. */
33e44f2e
AM
12408 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
12409 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
12410 htab->got_reli_size = 0;
12411
c72f2fb2 12412 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12413 {
12414 asection *got, *relgot;
12415
12416 if (!is_ppc64_elf (ibfd))
12417 continue;
12418
12419 got = ppc64_elf_tdata (ibfd)->got;
12420 if (got != NULL)
12421 {
12422 got->rawsize = got->size;
12423 got->size = 0;
12424 relgot = ppc64_elf_tdata (ibfd)->relgot;
12425 relgot->rawsize = relgot->size;
12426 relgot->size = 0;
12427 }
12428 }
12429
12430 /* Now reallocate the got, local syms first. We don't need to
12431 allocate section contents again since we never increase size. */
c72f2fb2 12432 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12433 {
12434 struct got_entry **lgot_ents;
12435 struct got_entry **end_lgot_ents;
12436 struct plt_entry **local_plt;
12437 struct plt_entry **end_local_plt;
f961d9dd 12438 unsigned char *lgot_masks;
927be08e
AM
12439 bfd_size_type locsymcount;
12440 Elf_Internal_Shdr *symtab_hdr;
19e08130 12441 asection *s;
927be08e
AM
12442
12443 if (!is_ppc64_elf (ibfd))
12444 continue;
12445
12446 lgot_ents = elf_local_got_ents (ibfd);
12447 if (!lgot_ents)
12448 continue;
12449
12450 symtab_hdr = &elf_symtab_hdr (ibfd);
12451 locsymcount = symtab_hdr->sh_info;
12452 end_lgot_ents = lgot_ents + locsymcount;
12453 local_plt = (struct plt_entry **) end_lgot_ents;
12454 end_local_plt = local_plt + locsymcount;
f961d9dd 12455 lgot_masks = (unsigned char *) end_local_plt;
927be08e 12456 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
12457 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
12458 {
12459 struct got_entry *ent;
12460
12461 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 12462 {
19e08130
AM
12463 unsigned int ent_size = 8;
12464 unsigned int rel_size = sizeof (Elf64_External_Rela);
12465
d0fae19d
AM
12466 ent->got.offset = s->size;
12467 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 12468 {
19e08130
AM
12469 ent_size *= 2;
12470 rel_size *= 2;
12471 }
12472 s->size += ent_size;
37da22e5 12473 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 12474 {
33e44f2e 12475 htab->elf.irelplt->size += rel_size;
19e08130
AM
12476 htab->got_reli_size += rel_size;
12477 }
6a3858a6 12478 else if (bfd_link_pic (info)
f749f26e 12479 && !(ent->tls_type != 0
6a3858a6 12480 && bfd_link_executable (info)))
19e08130
AM
12481 {
12482 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12483 srel->size += rel_size;
d0fae19d
AM
12484 }
12485 }
927be08e
AM
12486 }
12487 }
12488
12489 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
12490
c72f2fb2 12491 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12492 {
12493 struct got_entry *ent;
12494
12495 if (!is_ppc64_elf (ibfd))
12496 continue;
12497
12498 ent = ppc64_tlsld_got (ibfd);
12499 if (!ent->is_indirect
12500 && ent->got.offset != (bfd_vma) -1)
12501 {
12502 asection *s = ppc64_elf_tdata (ibfd)->got;
12503 ent->got.offset = s->size;
12504 s->size += 16;
f749f26e 12505 if (bfd_link_dll (info))
927be08e
AM
12506 {
12507 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12508 srel->size += sizeof (Elf64_External_Rela);
12509 }
12510 }
12511 }
12512
33e44f2e 12513 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 12514 if (!done_something)
c72f2fb2 12515 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12516 {
12517 asection *got;
12518
12519 if (!is_ppc64_elf (ibfd))
12520 continue;
12521
12522 got = ppc64_elf_tdata (ibfd)->got;
12523 if (got != NULL)
12524 {
12525 done_something = got->rawsize != got->size;
12526 if (done_something)
12527 break;
12528 }
12529 }
12530
12531 if (done_something)
e7d1c40c 12532 (*htab->params->layout_sections_again) ();
927be08e
AM
12533
12534 /* Set up for second pass over toc sections to recalculate elf_gp
12535 on input sections. */
12536 htab->toc_bfd = NULL;
12537 htab->toc_first_sec = NULL;
12538 htab->second_toc_pass = TRUE;
12539 return done_something;
12540}
12541
12542/* Called after second pass of multitoc partitioning. */
12543
12544void
12545ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
12546{
12547 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12548
12549 /* After the second pass, toc_curr tracks the TOC offset used
12550 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 12551 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
12552}
12553
9b5ecbd0
AM
12554/* No toc references were found in ISEC. If the code in ISEC makes no
12555 calls, then there's no need to use toc adjusting stubs when branching
12556 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
12557 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
12558 needed, and 2 if a cyclical call-graph was found but no other reason
12559 for a stub was detected. If called from the top level, a return of
12560 2 means the same as a return of 0. */
9b5ecbd0
AM
12561
12562static int
4ce794b7 12563toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 12564{
9b5ecbd0 12565 int ret;
70cc837d
AM
12566
12567 /* Mark this section as checked. */
12568 isec->call_check_done = 1;
9b5ecbd0 12569
772119ce
AM
12570 /* We know none of our code bearing sections will need toc stubs. */
12571 if ((isec->flags & SEC_LINKER_CREATED) != 0)
12572 return 0;
12573
eea6121a 12574 if (isec->size == 0)
082c50f8
AM
12575 return 0;
12576
4c52953f
AM
12577 if (isec->output_section == NULL)
12578 return 0;
12579
4c52953f 12580 ret = 0;
70cc837d 12581 if (isec->reloc_count != 0)
9b5ecbd0 12582 {
70cc837d
AM
12583 Elf_Internal_Rela *relstart, *rel;
12584 Elf_Internal_Sym *local_syms;
12585 struct ppc_link_hash_table *htab;
2917689a 12586
70cc837d
AM
12587 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
12588 info->keep_memory);
12589 if (relstart == NULL)
12590 return -1;
90aecf7a 12591
70cc837d
AM
12592 /* Look for branches to outside of this section. */
12593 local_syms = NULL;
12594 htab = ppc_hash_table (info);
12595 if (htab == NULL)
12596 return -1;
4c52953f 12597
70cc837d 12598 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 12599 {
70cc837d
AM
12600 enum elf_ppc64_reloc_type r_type;
12601 unsigned long r_symndx;
12602 struct elf_link_hash_entry *h;
12603 struct ppc_link_hash_entry *eh;
12604 Elf_Internal_Sym *sym;
12605 asection *sym_sec;
12606 struct _opd_sec_data *opd;
12607 bfd_vma sym_value;
12608 bfd_vma dest;
12609
12610 r_type = ELF64_R_TYPE (rel->r_info);
12611 if (r_type != R_PPC64_REL24
05d0e962 12612 && r_type != R_PPC64_REL24_NOTOC
70cc837d
AM
12613 && r_type != R_PPC64_REL14
12614 && r_type != R_PPC64_REL14_BRTAKEN
23cedd1d 12615 && r_type != R_PPC64_REL14_BRNTAKEN
5663e321
AM
12616 && r_type != R_PPC64_PLTCALL
12617 && r_type != R_PPC64_PLTCALL_NOTOC)
70cc837d 12618 continue;
4c52953f 12619
70cc837d
AM
12620 r_symndx = ELF64_R_SYM (rel->r_info);
12621 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
12622 isec->owner))
4c52953f 12623 {
70cc837d
AM
12624 ret = -1;
12625 break;
12626 }
4c52953f 12627
70cc837d
AM
12628 /* Calls to dynamic lib functions go through a plt call stub
12629 that uses r2. */
ed7007c1 12630 eh = ppc_elf_hash_entry (h);
70cc837d
AM
12631 if (eh != NULL
12632 && (eh->elf.plt.plist != NULL
12633 || (eh->oh != NULL
12634 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
12635 {
12636 ret = 1;
12637 break;
4c52953f
AM
12638 }
12639
70cc837d
AM
12640 if (sym_sec == NULL)
12641 /* Ignore other undefined symbols. */
4c52953f 12642 continue;
4c52953f 12643
70cc837d
AM
12644 /* Assume branches to other sections not included in the
12645 link need stubs too, to cover -R and absolute syms. */
12646 if (sym_sec->output_section == NULL)
12647 {
12648 ret = 1;
12649 break;
12650 }
4c52953f 12651
70cc837d
AM
12652 if (h == NULL)
12653 sym_value = sym->st_value;
12654 else
12655 {
12656 if (h->root.type != bfd_link_hash_defined
12657 && h->root.type != bfd_link_hash_defweak)
12658 abort ();
12659 sym_value = h->root.u.def.value;
12660 }
12661 sym_value += rel->r_addend;
4c52953f 12662
70cc837d
AM
12663 /* If this branch reloc uses an opd sym, find the code section. */
12664 opd = get_opd_info (sym_sec);
12665 if (opd != NULL)
12666 {
12667 if (h == NULL && opd->adjust != NULL)
12668 {
12669 long adjust;
4c52953f 12670
92a9c616 12671 adjust = opd->adjust[OPD_NDX (sym_value)];
70cc837d
AM
12672 if (adjust == -1)
12673 /* Assume deleted functions won't ever be called. */
12674 continue;
12675 sym_value += adjust;
12676 }
4c52953f 12677
aef36ac1
AM
12678 dest = opd_entry_value (sym_sec, sym_value,
12679 &sym_sec, NULL, FALSE);
70cc837d
AM
12680 if (dest == (bfd_vma) -1)
12681 continue;
12682 }
12683 else
12684 dest = (sym_value
12685 + sym_sec->output_offset
12686 + sym_sec->output_section->vma);
4c52953f 12687
70cc837d
AM
12688 /* Ignore branch to self. */
12689 if (sym_sec == isec)
12690 continue;
4c52953f 12691
70cc837d
AM
12692 /* If the called function uses the toc, we need a stub. */
12693 if (sym_sec->has_toc_reloc
12694 || sym_sec->makes_toc_func_call)
4c52953f 12695 {
70cc837d 12696 ret = 1;
4c52953f
AM
12697 break;
12698 }
70cc837d
AM
12699
12700 /* Assume any branch that needs a long branch stub might in fact
12701 need a plt_branch stub. A plt_branch stub uses r2. */
12702 else if (dest - (isec->output_offset
12703 + isec->output_section->vma
6911b7dc
AM
12704 + rel->r_offset) + (1 << 25)
12705 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
12706 ? h->other
12707 : sym->st_other))
4c52953f 12708 {
70cc837d
AM
12709 ret = 1;
12710 break;
12711 }
12712
12713 /* If calling back to a section in the process of being
12714 tested, we can't say for sure that no toc adjusting stubs
12715 are needed, so don't return zero. */
12716 else if (sym_sec->call_check_in_progress)
12717 ret = 2;
12718
12719 /* Branches to another section that itself doesn't have any TOC
12720 references are OK. Recursively call ourselves to check. */
12721 else if (!sym_sec->call_check_done)
12722 {
12723 int recur;
12724
12725 /* Mark current section as indeterminate, so that other
12726 sections that call back to current won't be marked as
12727 known. */
12728 isec->call_check_in_progress = 1;
12729 recur = toc_adjusting_stub_needed (info, sym_sec);
12730 isec->call_check_in_progress = 0;
12731
4c52953f
AM
12732 if (recur != 0)
12733 {
70cc837d
AM
12734 ret = recur;
12735 if (recur != 2)
12736 break;
4c52953f
AM
12737 }
12738 }
4c52953f 12739 }
70cc837d 12740
c9594989
AM
12741 if (elf_symtab_hdr (isec->owner).contents
12742 != (unsigned char *) local_syms)
70cc837d
AM
12743 free (local_syms);
12744 if (elf_section_data (isec)->relocs != relstart)
12745 free (relstart);
9b5ecbd0
AM
12746 }
12747
70cc837d
AM
12748 if ((ret & 1) == 0
12749 && isec->map_head.s != NULL
12750 && (strcmp (isec->output_section->name, ".init") == 0
12751 || strcmp (isec->output_section->name, ".fini") == 0))
12752 {
12753 if (isec->map_head.s->has_toc_reloc
12754 || isec->map_head.s->makes_toc_func_call)
12755 ret = 1;
12756 else if (!isec->map_head.s->call_check_done)
12757 {
12758 int recur;
12759 isec->call_check_in_progress = 1;
12760 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
12761 isec->call_check_in_progress = 0;
12762 if (recur != 0)
12763 ret = recur;
12764 }
12765 }
12766
12767 if (ret == 1)
12768 isec->makes_toc_func_call = 1;
4c52953f 12769
9b5ecbd0
AM
12770 return ret;
12771}
12772
721956f4
AM
12773/* The linker repeatedly calls this function for each input section,
12774 in the order that input sections are linked into output sections.
12775 Build lists of input sections to determine groupings between which
12776 we may insert linker stubs. */
12777
9b5ecbd0 12778bfd_boolean
4ce794b7 12779ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
12780{
12781 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12782
4dfe6ac6
NC
12783 if (htab == NULL)
12784 return FALSE;
12785
734b6cf9 12786 if ((isec->output_section->flags & SEC_CODE) != 0
6f20ed8a 12787 && isec->output_section->id < htab->sec_info_arr_size)
721956f4 12788 {
3d6f9012
AM
12789 /* This happens to make the list in reverse order,
12790 which is what we want. */
6f20ed8a
AM
12791 htab->sec_info[isec->id].u.list
12792 = htab->sec_info[isec->output_section->id].u.list;
12793 htab->sec_info[isec->output_section->id].u.list = isec;
721956f4 12794 }
ad8e1ba5 12795
4c52953f 12796 if (htab->multi_toc_needed)
9b5ecbd0 12797 {
8b974ba3
AM
12798 /* Analyse sections that aren't already flagged as needing a
12799 valid toc pointer. Exclude .fixup for the linux kernel.
12800 .fixup contains branches, but only back to the function that
12801 hit an exception. */
12802 if (!(isec->has_toc_reloc
12803 || (isec->flags & SEC_CODE) == 0
12804 || strcmp (isec->name, ".fixup") == 0
12805 || isec->call_check_done))
12806 {
12807 if (toc_adjusting_stub_needed (info, isec) < 0)
6683a28d 12808 return FALSE;
8b974ba3
AM
12809 }
12810 /* Make all sections use the TOC assigned for this object file.
12811 This will be wrong for pasted sections; We fix that in
12812 check_pasted_section(). */
12813 if (elf_gp (isec->owner) != 0)
12814 htab->toc_curr = elf_gp (isec->owner);
12815 }
12816
6f20ed8a 12817 htab->sec_info[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 12818 return TRUE;
721956f4
AM
12819}
12820
70cc837d
AM
12821/* Check that all .init and .fini sections use the same toc, if they
12822 have toc relocs. */
12823
12824static bfd_boolean
12825check_pasted_section (struct bfd_link_info *info, const char *name)
12826{
12827 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12828
12829 if (o != NULL)
12830 {
12831 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12832 bfd_vma toc_off = 0;
12833 asection *i;
12834
12835 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12836 if (i->has_toc_reloc)
12837 {
12838 if (toc_off == 0)
6f20ed8a
AM
12839 toc_off = htab->sec_info[i->id].toc_off;
12840 else if (toc_off != htab->sec_info[i->id].toc_off)
70cc837d
AM
12841 return FALSE;
12842 }
6683a28d
AM
12843
12844 if (toc_off == 0)
12845 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12846 if (i->makes_toc_func_call)
12847 {
6f20ed8a 12848 toc_off = htab->sec_info[i->id].toc_off;
6683a28d
AM
12849 break;
12850 }
12851
70cc837d
AM
12852 /* Make sure the whole pasted function uses the same toc offset. */
12853 if (toc_off != 0)
12854 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
6f20ed8a 12855 htab->sec_info[i->id].toc_off = toc_off;
70cc837d
AM
12856 }
12857 return TRUE;
12858}
12859
12860bfd_boolean
12861ppc64_elf_check_init_fini (struct bfd_link_info *info)
12862{
12863 return (check_pasted_section (info, ".init")
12864 & check_pasted_section (info, ".fini"));
12865}
12866
721956f4
AM
12867/* See whether we can group stub sections together. Grouping stub
12868 sections may result in fewer stubs. More importantly, we need to
12869 put all .init* and .fini* stubs at the beginning of the .init or
12870 .fini output sections respectively, because glibc splits the
12871 _init and _fini functions into multiple parts. Putting a stub in
12872 the middle of a function is not a good idea. */
12873
6f20ed8a
AM
12874static bfd_boolean
12875group_sections (struct bfd_link_info *info,
4ce794b7
AM
12876 bfd_size_type stub_group_size,
12877 bfd_boolean stubs_always_before_branch)
721956f4 12878{
6f20ed8a
AM
12879 struct ppc_link_hash_table *htab;
12880 asection *osec;
7c8fe5c4
AM
12881 bfd_boolean suppress_size_errors;
12882
6f20ed8a
AM
12883 htab = ppc_hash_table (info);
12884 if (htab == NULL)
12885 return FALSE;
12886
7c8fe5c4 12887 suppress_size_errors = FALSE;
7c8fe5c4
AM
12888 if (stub_group_size == 1)
12889 {
12890 /* Default values. */
12891 if (stubs_always_before_branch)
09f92717 12892 stub_group_size = 0x1e00000;
7c8fe5c4 12893 else
09f92717 12894 stub_group_size = 0x1c00000;
7c8fe5c4
AM
12895 suppress_size_errors = TRUE;
12896 }
12897
6f20ed8a 12898 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
721956f4 12899 {
6f20ed8a
AM
12900 asection *tail;
12901
12902 if (osec->id >= htab->sec_info_arr_size)
12903 continue;
12904
12905 tail = htab->sec_info[osec->id].u.list;
734b6cf9 12906 while (tail != NULL)
721956f4 12907 {
734b6cf9
AM
12908 asection *curr;
12909 asection *prev;
12910 bfd_size_type total;
12911 bfd_boolean big_sec;
12912 bfd_vma curr_toc;
6f20ed8a 12913 struct map_stub *group;
09f92717 12914 bfd_size_type group_size;
734b6cf9
AM
12915
12916 curr = tail;
eea6121a 12917 total = tail->size;
09f92717
AM
12918 group_size = (ppc64_elf_section_data (tail) != NULL
12919 && ppc64_elf_section_data (tail)->has_14bit_branch
12920 ? stub_group_size >> 10 : stub_group_size);
12921
12922 big_sec = total > group_size;
7c8fe5c4 12923 if (big_sec && !suppress_size_errors)
695344c0 12924 /* xgettext:c-format */
871b3ab2 12925 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
4eca0228 12926 tail->owner, tail);
6f20ed8a 12927 curr_toc = htab->sec_info[tail->id].toc_off;
734b6cf9 12928
6f20ed8a 12929 while ((prev = htab->sec_info[curr->id].u.list) != NULL
734b6cf9 12930 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
12931 < (ppc64_elf_section_data (prev) != NULL
12932 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12933 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12934 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12935 curr = prev;
12936
12937 /* OK, the size from the start of CURR to the end is less
09f92717 12938 than group_size and thus can be handled by one stub
734b6cf9 12939 section. (or the tail section is itself larger than
09f92717
AM
12940 group_size, in which case we may be toast.) We should
12941 really be keeping track of the total size of stubs added
12942 here, as stubs contribute to the final output section
12943 size. That's a little tricky, and this way will only
12944 break if stubs added make the total size more than 2^25,
12945 ie. for the default stub_group_size, if stubs total more
12946 than 2097152 bytes, or nearly 75000 plt call stubs. */
6f20ed8a
AM
12947 group = bfd_alloc (curr->owner, sizeof (*group));
12948 if (group == NULL)
12949 return FALSE;
12950 group->link_sec = curr;
12951 group->stub_sec = NULL;
a4b6fadd 12952 group->needs_save_res = 0;
df136d64
AM
12953 group->lr_restore = 0;
12954 group->eh_size = 0;
12955 group->eh_base = 0;
a4b6fadd
AM
12956 group->next = htab->group;
12957 htab->group = group;
734b6cf9 12958 do
721956f4 12959 {
6f20ed8a 12960 prev = htab->sec_info[tail->id].u.list;
734b6cf9 12961 /* Set up this stub group. */
6f20ed8a 12962 htab->sec_info[tail->id].u.group = group;
721956f4 12963 }
734b6cf9
AM
12964 while (tail != curr && (tail = prev) != NULL);
12965
09f92717 12966 /* But wait, there's more! Input sections up to group_size
734b6cf9
AM
12967 bytes before the stub section can be handled by it too.
12968 Don't do this if we have a really large section after the
12969 stubs, as adding more stubs increases the chance that
12970 branches may not reach into the stub section. */
12971 if (!stubs_always_before_branch && !big_sec)
12972 {
12973 total = 0;
12974 while (prev != NULL
12975 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
12976 < (ppc64_elf_section_data (prev) != NULL
12977 && ppc64_elf_section_data (prev)->has_14bit_branch
2cdcc330
AM
12978 ? (group_size = stub_group_size >> 10)
12979 : group_size))
6f20ed8a 12980 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12981 {
12982 tail = prev;
6f20ed8a
AM
12983 prev = htab->sec_info[tail->id].u.list;
12984 htab->sec_info[tail->id].u.group = group;
734b6cf9
AM
12985 }
12986 }
12987 tail = prev;
721956f4
AM
12988 }
12989 }
6f20ed8a 12990 return TRUE;
721956f4
AM
12991}
12992
58d180e8
AM
12993static const unsigned char glink_eh_frame_cie[] =
12994{
12995 0, 0, 0, 16, /* length. */
12996 0, 0, 0, 0, /* id. */
12997 1, /* CIE version. */
12998 'z', 'R', 0, /* Augmentation string. */
12999 4, /* Code alignment. */
13000 0x78, /* Data alignment. */
13001 65, /* RA reg. */
13002 1, /* Augmentation size. */
13003 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
2e0ce1c8 13004 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
58d180e8
AM
13005};
13006
d969d15f
AM
13007/* Stripping output sections is normally done before dynamic section
13008 symbols have been allocated. This function is called later, and
13009 handles cases like htab->brlt which is mapped to its own output
13010 section. */
13011
13012static void
13013maybe_strip_output (struct bfd_link_info *info, asection *isec)
13014{
13015 if (isec->size == 0
13016 && isec->output_section->size == 0
53d8967a 13017 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
13018 && !bfd_section_removed_from_list (info->output_bfd,
13019 isec->output_section)
13020 && elf_section_data (isec->output_section)->dynindx == 0)
13021 {
13022 isec->output_section->flags |= SEC_EXCLUDE;
13023 bfd_section_list_remove (info->output_bfd, isec->output_section);
13024 info->output_bfd->section_count--;
13025 }
13026}
13027
721956f4
AM
13028/* Determine and set the size of the stub section for a final link.
13029
13030 The basic idea here is to examine all the relocations looking for
13031 PC-relative calls to a target that is unreachable with a "bl"
13032 instruction. */
13033
b34976b6 13034bfd_boolean
e7d1c40c 13035ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
13036{
13037 bfd_size_type stub_group_size;
b34976b6 13038 bfd_boolean stubs_always_before_branch;
721956f4
AM
13039 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13040
4dfe6ac6
NC
13041 if (htab == NULL)
13042 return FALSE;
13043
0e1862bb 13044 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
e7d1c40c 13045 htab->params->plt_thread_safe = 1;
b9e5796b 13046 if (!htab->opd_abi)
e7d1c40c
AM
13047 htab->params->plt_thread_safe = 0;
13048 else if (htab->params->plt_thread_safe == -1)
794e51c0 13049 {
e2458743 13050 static const char *const thread_starter[] =
794e51c0
AM
13051 {
13052 "pthread_create",
13053 /* libstdc++ */
13054 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
13055 /* librt */
13056 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
13057 "mq_notify", "create_timer",
13058 /* libanl */
13059 "getaddrinfo_a",
13060 /* libgomp */
2300b5a1 13061 "GOMP_parallel",
794e51c0 13062 "GOMP_parallel_start",
2300b5a1 13063 "GOMP_parallel_loop_static",
794e51c0 13064 "GOMP_parallel_loop_static_start",
2300b5a1 13065 "GOMP_parallel_loop_dynamic",
794e51c0 13066 "GOMP_parallel_loop_dynamic_start",
2300b5a1 13067 "GOMP_parallel_loop_guided",
794e51c0 13068 "GOMP_parallel_loop_guided_start",
2300b5a1 13069 "GOMP_parallel_loop_runtime",
794e51c0 13070 "GOMP_parallel_loop_runtime_start",
2300b5a1 13071 "GOMP_parallel_sections",
68ffbac6 13072 "GOMP_parallel_sections_start",
f9dffbf0
AM
13073 /* libgo */
13074 "__go_go",
794e51c0
AM
13075 };
13076 unsigned i;
13077
a4b6fadd 13078 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
794e51c0
AM
13079 {
13080 struct elf_link_hash_entry *h;
13081 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
13082 FALSE, FALSE, TRUE);
e7d1c40c
AM
13083 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
13084 if (htab->params->plt_thread_safe)
794e51c0
AM
13085 break;
13086 }
13087 }
e7d1c40c
AM
13088 stubs_always_before_branch = htab->params->group_size < 0;
13089 if (htab->params->group_size < 0)
13090 stub_group_size = -htab->params->group_size;
721956f4 13091 else
e7d1c40c 13092 stub_group_size = htab->params->group_size;
721956f4 13093
6f20ed8a
AM
13094 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
13095 return FALSE;
721956f4 13096
a804e476
AM
13097 htab->tga_group = NULL;
13098 if (!htab->params->no_tls_get_addr_regsave
13099 && htab->tga_desc_fd != NULL
13100 && (htab->tga_desc_fd->elf.root.type == bfd_link_hash_undefined
13101 || htab->tga_desc_fd->elf.root.type == bfd_link_hash_undefweak)
13102 && htab->tls_get_addr_fd != NULL
13103 && is_static_defined (&htab->tls_get_addr_fd->elf))
13104 {
13105 asection *sym_sec, *code_sec, *stub_sec;
13106 bfd_vma sym_value;
13107 struct _opd_sec_data *opd;
13108
13109 sym_sec = htab->tls_get_addr_fd->elf.root.u.def.section;
13110 sym_value = defined_sym_val (&htab->tls_get_addr_fd->elf);
13111 code_sec = sym_sec;
13112 opd = get_opd_info (sym_sec);
13113 if (opd != NULL)
13114 opd_entry_value (sym_sec, sym_value, &code_sec, NULL, FALSE);
13115 htab->tga_group = htab->sec_info[code_sec->id].u.group;
13116 stub_sec = (*htab->params->add_stub_section) (".tga_desc.stub",
13117 htab->tga_group->link_sec);
13118 if (stub_sec == NULL)
13119 return FALSE;
13120 htab->tga_group->stub_sec = stub_sec;
13121
13122 htab->tga_desc_fd->elf.root.type = bfd_link_hash_defined;
13123 htab->tga_desc_fd->elf.root.u.def.section = stub_sec;
13124 htab->tga_desc_fd->elf.root.u.def.value = 0;
13125 htab->tga_desc_fd->elf.type = STT_FUNC;
13126 htab->tga_desc_fd->elf.def_regular = 1;
13127 htab->tga_desc_fd->elf.non_elf = 0;
13128 _bfd_elf_link_hash_hide_symbol (info, &htab->tga_desc_fd->elf, TRUE);
13129 }
13130
c9301e31
AM
13131#define STUB_SHRINK_ITER 20
13132 /* Loop until no stubs added. After iteration 20 of this loop we may
13133 exit on a stub section shrinking. This is to break out of a
13134 pathological case where adding stubs on one iteration decreases
13135 section gaps (perhaps due to alignment), which then requires
13136 fewer or smaller stubs on the next iteration. */
13137
721956f4
AM
13138 while (1)
13139 {
13140 bfd *input_bfd;
13141 unsigned int bfd_indx;
a4b6fadd 13142 struct map_stub *group;
721956f4
AM
13143
13144 htab->stub_iteration += 1;
721956f4
AM
13145
13146 for (input_bfd = info->input_bfds, bfd_indx = 0;
13147 input_bfd != NULL;
c72f2fb2 13148 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
13149 {
13150 Elf_Internal_Shdr *symtab_hdr;
13151 asection *section;
6cdc0ccc 13152 Elf_Internal_Sym *local_syms = NULL;
721956f4 13153
0c8d6e5c 13154 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
13155 continue;
13156
721956f4 13157 /* We'll need the symbol table in a second. */
0ffa91dd 13158 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
13159 if (symtab_hdr->sh_info == 0)
13160 continue;
13161
721956f4
AM
13162 /* Walk over each section attached to the input bfd. */
13163 for (section = input_bfd->sections;
13164 section != NULL;
13165 section = section->next)
13166 {
721956f4 13167 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
13168
13169 /* If there aren't any relocs, then there's nothing more
13170 to do. */
13171 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
13172 || (section->flags & SEC_ALLOC) == 0
13173 || (section->flags & SEC_LOAD) == 0
13174 || (section->flags & SEC_CODE) == 0
721956f4
AM
13175 || section->reloc_count == 0)
13176 continue;
13177
13178 /* If this section is a link-once section that will be
13179 discarded, then don't create any stubs. */
13180 if (section->output_section == NULL
927be08e 13181 || section->output_section->owner != info->output_bfd)
721956f4
AM
13182 continue;
13183
1e2f5b6e
AM
13184 /* Get the relocs. */
13185 internal_relocs
4ce794b7 13186 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 13187 info->keep_memory);
721956f4 13188 if (internal_relocs == NULL)
1e2f5b6e 13189 goto error_ret_free_local;
721956f4
AM
13190
13191 /* Now examine each relocation. */
13192 irela = internal_relocs;
13193 irelaend = irela + section->reloc_count;
13194 for (; irela < irelaend; irela++)
13195 {
4ce794b7
AM
13196 enum elf_ppc64_reloc_type r_type;
13197 unsigned int r_indx;
721956f4
AM
13198 enum ppc_stub_type stub_type;
13199 struct ppc_stub_hash_entry *stub_entry;
8387904d 13200 asection *sym_sec, *code_sec;
e054468f 13201 bfd_vma sym_value, code_value;
721956f4 13202 bfd_vma destination;
6911b7dc 13203 unsigned long local_off;
8843416a 13204 bfd_boolean ok_dest;
721956f4 13205 struct ppc_link_hash_entry *hash;
8387904d 13206 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
13207 struct elf_link_hash_entry *h;
13208 Elf_Internal_Sym *sym;
721956f4
AM
13209 char *stub_name;
13210 const asection *id_sec;
74f0fb50 13211 struct _opd_sec_data *opd;
e054468f 13212 struct plt_entry *plt_ent;
721956f4
AM
13213
13214 r_type = ELF64_R_TYPE (irela->r_info);
13215 r_indx = ELF64_R_SYM (irela->r_info);
13216
4ce794b7 13217 if (r_type >= R_PPC64_max)
721956f4
AM
13218 {
13219 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 13220 goto error_ret_free_internal;
721956f4
AM
13221 }
13222
13223 /* Only look for stubs on branch instructions. */
4ce794b7 13224 if (r_type != R_PPC64_REL24
05d0e962 13225 && r_type != R_PPC64_REL24_NOTOC
4ce794b7
AM
13226 && r_type != R_PPC64_REL14
13227 && r_type != R_PPC64_REL14_BRTAKEN
13228 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
13229 continue;
13230
13231 /* Now determine the call target, its name, value,
13232 section. */
411e1bfb
AM
13233 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
13234 r_indx, input_bfd))
13235 goto error_ret_free_internal;
ed7007c1 13236 hash = ppc_elf_hash_entry (h);
411e1bfb 13237
8843416a 13238 ok_dest = FALSE;
8387904d 13239 fdh = NULL;
7fe2b9a6 13240 sym_value = 0;
411e1bfb 13241 if (hash == NULL)
721956f4 13242 {
411e1bfb 13243 sym_value = sym->st_value;
c27b8c2a
AM
13244 if (sym_sec != NULL
13245 && sym_sec->output_section != NULL)
13246 ok_dest = TRUE;
721956f4 13247 }
7fe2b9a6
AM
13248 else if (hash->elf.root.type == bfd_link_hash_defined
13249 || hash->elf.root.type == bfd_link_hash_defweak)
13250 {
13251 sym_value = hash->elf.root.u.def.value;
13252 if (sym_sec->output_section != NULL)
13253 ok_dest = TRUE;
13254 }
13255 else if (hash->elf.root.type == bfd_link_hash_undefweak
13256 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 13257 {
99877b66 13258 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
13259 use the func descriptor sym instead if it is
13260 defined. */
ceb1f1ef 13261 if (hash->elf.root.root.string[0] == '.'
8c5b4e52 13262 && hash->oh != NULL)
8387904d 13263 {
8c5b4e52 13264 fdh = ppc_follow_link (hash->oh);
8387904d
AM
13265 if (fdh->elf.root.type == bfd_link_hash_defined
13266 || fdh->elf.root.type == bfd_link_hash_defweak)
13267 {
13268 sym_sec = fdh->elf.root.u.def.section;
13269 sym_value = fdh->elf.root.u.def.value;
13270 if (sym_sec->output_section != NULL)
13271 ok_dest = TRUE;
13272 }
99877b66
AM
13273 else
13274 fdh = NULL;
8387904d 13275 }
7fe2b9a6
AM
13276 }
13277 else
13278 {
13279 bfd_set_error (bfd_error_bad_value);
13280 goto error_ret_free_internal;
721956f4
AM
13281 }
13282
8843416a 13283 destination = 0;
6911b7dc 13284 local_off = 0;
8843416a
AM
13285 if (ok_dest)
13286 {
13287 sym_value += irela->r_addend;
13288 destination = (sym_value
13289 + sym_sec->output_offset
13290 + sym_sec->output_section->vma);
6911b7dc
AM
13291 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
13292 ? hash->elf.other
13293 : sym->st_other);
8843416a
AM
13294 }
13295
8387904d 13296 code_sec = sym_sec;
e054468f 13297 code_value = sym_value;
74f0fb50
AM
13298 opd = get_opd_info (sym_sec);
13299 if (opd != NULL)
8387904d
AM
13300 {
13301 bfd_vma dest;
13302
74f0fb50 13303 if (hash == NULL && opd->adjust != NULL)
8387904d 13304 {
51aecdc5 13305 long adjust = opd->adjust[OPD_NDX (sym_value)];
8387904d
AM
13306 if (adjust == -1)
13307 continue;
e054468f 13308 code_value += adjust;
8387904d
AM
13309 sym_value += adjust;
13310 }
13311 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 13312 &code_sec, &code_value, FALSE);
8387904d
AM
13313 if (dest != (bfd_vma) -1)
13314 {
13315 destination = dest;
13316 if (fdh != NULL)
13317 {
13318 /* Fixup old ABI sym to point at code
13319 entry. */
99877b66 13320 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 13321 hash->elf.root.u.def.section = code_sec;
e054468f 13322 hash->elf.root.u.def.value = code_value;
8387904d
AM
13323 }
13324 }
13325 }
13326
721956f4 13327 /* Determine what (if any) linker stub is needed. */
e054468f 13328 plt_ent = NULL;
721956f4 13329 stub_type = ppc_type_of_stub (section, irela, &hash,
6911b7dc
AM
13330 &plt_ent, destination,
13331 local_off);
ad8e1ba5 13332
05d0e962
AM
13333 if (r_type == R_PPC64_REL24_NOTOC)
13334 {
13335 if (stub_type == ppc_stub_plt_call)
13336 stub_type = ppc_stub_plt_call_notoc;
13337 else if (stub_type == ppc_stub_long_branch
13338 || (code_sec != NULL
13339 && code_sec->output_section != NULL
13340 && (((hash ? hash->elf.other : sym->st_other)
13341 & STO_PPC64_LOCAL_MASK)
4a4e7361 13342 > 1 << STO_PPC64_LOCAL_BIT)))
05d0e962
AM
13343 stub_type = ppc_stub_long_branch_notoc;
13344 }
13345 else if (stub_type != ppc_stub_plt_call)
ad8e1ba5
AM
13346 {
13347 /* Check whether we need a TOC adjusting stub.
13348 Since the linker pastes together pieces from
13349 different object files when creating the
13350 _init and _fini functions, it may be that a
13351 call to what looks like a local sym is in
13352 fact a call needing a TOC adjustment. */
33cb30a1
AM
13353 if ((code_sec != NULL
13354 && code_sec->output_section != NULL
13355 && (htab->sec_info[code_sec->id].toc_off
13356 != htab->sec_info[section->id].toc_off)
13357 && (code_sec->has_toc_reloc
13358 || code_sec->makes_toc_func_call))
13359 || (((hash ? hash->elf.other : sym->st_other)
13360 & STO_PPC64_LOCAL_MASK)
13361 == 1 << STO_PPC64_LOCAL_BIT))
ad8e1ba5
AM
13362 stub_type = ppc_stub_long_branch_r2off;
13363 }
13364
721956f4
AM
13365 if (stub_type == ppc_stub_none)
13366 continue;
13367
411e1bfb
AM
13368 /* __tls_get_addr calls might be eliminated. */
13369 if (stub_type != ppc_stub_plt_call
05d0e962 13370 && stub_type != ppc_stub_plt_call_notoc
411e1bfb 13371 && hash != NULL
ed7007c1 13372 && is_tls_get_addr (&hash->elf, htab)
411e1bfb
AM
13373 && section->has_tls_reloc
13374 && irela != internal_relocs)
13375 {
13376 /* Get tls info. */
f961d9dd 13377 unsigned char *tls_mask;
411e1bfb 13378
3a71aa26 13379 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
13380 irela - 1, input_bfd))
13381 goto error_ret_free_internal;
abc489c6
AM
13382 if ((*tls_mask & TLS_TLS) != 0
13383 && (*tls_mask & (TLS_GD | TLS_LD)) == 0)
411e1bfb
AM
13384 continue;
13385 }
13386
f378ab09 13387 if (stub_type == ppc_stub_plt_call)
794e51c0 13388 {
6e1816be
AM
13389 if (!htab->opd_abi
13390 && htab->params->plt_localentry0 != 0
13391 && is_elfv2_localentry0 (&hash->elf))
13392 htab->has_plt_localentry0 = 1;
13393 else if (irela + 1 < irelaend
13394 && irela[1].r_offset == irela->r_offset + 4
13395 && (ELF64_R_TYPE (irela[1].r_info)
13396 == R_PPC64_TOCSAVE))
f378ab09
AM
13397 {
13398 if (!tocsave_find (htab, INSERT,
13399 &local_syms, irela + 1, input_bfd))
13400 goto error_ret_free_internal;
13401 }
f378ab09
AM
13402 else
13403 stub_type = ppc_stub_plt_call_r2save;
794e51c0 13404 }
3b421ab3 13405
721956f4 13406 /* Support for grouping stub sections. */
6f20ed8a 13407 id_sec = htab->sec_info[section->id].u.group->link_sec;
721956f4
AM
13408
13409 /* Get the name of this stub. */
13410 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
13411 if (!stub_name)
13412 goto error_ret_free_internal;
13413
13414 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 13415 stub_name, FALSE, FALSE);
721956f4
AM
13416 if (stub_entry != NULL)
13417 {
05d0e962
AM
13418 enum ppc_stub_type old_type;
13419 /* A stub has already been created, but it may
13420 not be the required type. We shouldn't be
13421 transitioning from plt_call to long_branch
13422 stubs or vice versa, but we might be
13423 upgrading from plt_call to plt_call_r2save or
13424 from long_branch to long_branch_r2off. */
721956f4 13425 free (stub_name);
05d0e962
AM
13426 old_type = stub_entry->stub_type;
13427 switch (old_type)
13428 {
13429 default:
13430 abort ();
13431
13432 case ppc_stub_save_res:
13433 continue;
13434
13435 case ppc_stub_plt_call:
13436 case ppc_stub_plt_call_r2save:
13437 case ppc_stub_plt_call_notoc:
13438 case ppc_stub_plt_call_both:
13439 if (stub_type == ppc_stub_plt_call)
13440 continue;
13441 else if (stub_type == ppc_stub_plt_call_r2save)
13442 {
13443 if (old_type == ppc_stub_plt_call_notoc)
13444 stub_type = ppc_stub_plt_call_both;
13445 }
13446 else if (stub_type == ppc_stub_plt_call_notoc)
13447 {
13448 if (old_type == ppc_stub_plt_call_r2save)
13449 stub_type = ppc_stub_plt_call_both;
13450 }
13451 else
13452 abort ();
13453 break;
13454
13455 case ppc_stub_plt_branch:
13456 case ppc_stub_plt_branch_r2off:
13457 case ppc_stub_plt_branch_notoc:
13458 case ppc_stub_plt_branch_both:
13459 old_type += (ppc_stub_long_branch
13460 - ppc_stub_plt_branch);
13461 /* Fall through. */
13462 case ppc_stub_long_branch:
13463 case ppc_stub_long_branch_r2off:
13464 case ppc_stub_long_branch_notoc:
13465 case ppc_stub_long_branch_both:
13466 if (stub_type == ppc_stub_long_branch)
13467 continue;
13468 else if (stub_type == ppc_stub_long_branch_r2off)
13469 {
13470 if (old_type == ppc_stub_long_branch_notoc)
13471 stub_type = ppc_stub_long_branch_both;
13472 }
13473 else if (stub_type == ppc_stub_long_branch_notoc)
13474 {
13475 if (old_type == ppc_stub_long_branch_r2off)
13476 stub_type = ppc_stub_long_branch_both;
13477 }
13478 else
13479 abort ();
13480 break;
13481 }
13482 if (old_type < stub_type)
794e51c0 13483 stub_entry->stub_type = stub_type;
721956f4
AM
13484 continue;
13485 }
13486
25f53a85 13487 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
13488 if (stub_entry == NULL)
13489 {
13490 free (stub_name);
6cdc0ccc
AM
13491 error_ret_free_internal:
13492 if (elf_section_data (section)->relocs == NULL)
13493 free (internal_relocs);
13494 error_ret_free_local:
c9594989
AM
13495 if (symtab_hdr->contents
13496 != (unsigned char *) local_syms)
6cdc0ccc 13497 free (local_syms);
b34976b6 13498 return FALSE;
721956f4
AM
13499 }
13500
ad8e1ba5 13501 stub_entry->stub_type = stub_type;
05d0e962
AM
13502 if (stub_type >= ppc_stub_plt_call
13503 && stub_type <= ppc_stub_plt_call_both)
e054468f 13504 {
05d0e962
AM
13505 stub_entry->target_value = sym_value;
13506 stub_entry->target_section = sym_sec;
e054468f
AM
13507 }
13508 else
13509 {
05d0e962
AM
13510 stub_entry->target_value = code_value;
13511 stub_entry->target_section = code_sec;
e054468f 13512 }
721956f4 13513 stub_entry->h = hash;
e054468f 13514 stub_entry->plt_ent = plt_ent;
2d7ad24e
AM
13515 stub_entry->symtype
13516 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
6911b7dc 13517 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95 13518
3d58e1fc
AM
13519 if (hash != NULL
13520 && (hash->elf.root.type == bfd_link_hash_defined
13521 || hash->elf.root.type == bfd_link_hash_defweak))
ee75fd95 13522 htab->stub_globals += 1;
721956f4
AM
13523 }
13524
13525 /* We're done with the internal relocs, free them. */
6cdc0ccc 13526 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 13527 free (internal_relocs);
721956f4 13528 }
6cdc0ccc
AM
13529
13530 if (local_syms != NULL
13531 && symtab_hdr->contents != (unsigned char *) local_syms)
13532 {
13533 if (!info->keep_memory)
13534 free (local_syms);
13535 else
13536 symtab_hdr->contents = (unsigned char *) local_syms;
13537 }
721956f4
AM
13538 }
13539
5c3dead3 13540 /* We may have added some stubs. Find out the new size of the
721956f4 13541 stub sections. */
d4aaa2a0 13542 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13543 {
13544 group->lr_restore = 0;
13545 group->eh_size = 0;
13546 if (group->stub_sec != NULL)
13547 {
13548 asection *stub_sec = group->stub_sec;
13549
13550 if (htab->stub_iteration <= STUB_SHRINK_ITER
13551 || stub_sec->rawsize < stub_sec->size)
13552 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
13553 stub_sec->rawsize = stub_sec->size;
13554 stub_sec->size = 0;
13555 stub_sec->reloc_count = 0;
13556 stub_sec->flags &= ~SEC_RELOC;
13557 }
13558 }
a804e476
AM
13559 if (htab->tga_group != NULL)
13560 {
13561 /* See emit_tga_desc and emit_tga_desc_eh_frame. */
13562 htab->tga_group->eh_size
13563 = 1 + 2 + (htab->opd_abi != 0) + 3 + 8 * 2 + 3 + 8 + 3;
13564 htab->tga_group->lr_restore = 23 * 4;
13565 htab->tga_group->stub_sec->size = 24 * 4;
13566 }
eea6121a 13567
ba21f564
AM
13568 if (htab->stub_iteration <= STUB_SHRINK_ITER
13569 || htab->brlt->rawsize < htab->brlt->size)
13570 htab->brlt->rawsize = htab->brlt->size;
eea6121a 13571 htab->brlt->size = 0;
84f5d08e
AM
13572 htab->brlt->reloc_count = 0;
13573 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 13574 if (htab->relbrlt != NULL)
eea6121a 13575 htab->relbrlt->size = 0;
721956f4 13576
63bc6f6c 13577 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 13578
a4b6fadd
AM
13579 for (group = htab->group; group != NULL; group = group->next)
13580 if (group->needs_save_res)
13581 group->stub_sec->size += htab->sfpr->size;
13582
176a0d42
AM
13583 if (info->emitrelocations
13584 && htab->glink != NULL && htab->glink->size != 0)
13585 {
13586 htab->glink->reloc_count = 1;
13587 htab->glink->flags |= SEC_RELOC;
13588 }
13589
58d180e8
AM
13590 if (htab->glink_eh_frame != NULL
13591 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
2d0d44d5 13592 && htab->glink_eh_frame->output_section->size > 8)
58d180e8 13593 {
2e0ce1c8 13594 size_t size = 0, align = 4;
58d180e8 13595
d4aaa2a0 13596 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13597 if (group->eh_size != 0)
13598 size += (group->eh_size + 17 + align - 1) & -align;
58d180e8 13599 if (htab->glink != NULL && htab->glink->size != 0)
2e0ce1c8 13600 size += (24 + align - 1) & -align;
58d180e8 13601 if (size != 0)
2e0ce1c8
AM
13602 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
13603 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
13604 size = (size + align - 1) & -align;
58d180e8
AM
13605 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
13606 htab->glink_eh_frame->size = size;
13607 }
13608
e7d1c40c 13609 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13610 for (group = htab->group; group != NULL; group = group->next)
13611 if (group->stub_sec != NULL)
691d2e9a
AM
13612 {
13613 int align = abs (htab->params->plt_stub_align);
13614 group->stub_sec->size
13615 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
13616 }
d4aaa2a0
AM
13617
13618 for (group = htab->group; group != NULL; group = group->next)
13619 if (group->stub_sec != NULL
13620 && group->stub_sec->rawsize != group->stub_sec->size
c9301e31 13621 && (htab->stub_iteration <= STUB_SHRINK_ITER
d4aaa2a0 13622 || group->stub_sec->rawsize < group->stub_sec->size))
5c3dead3
AM
13623 break;
13624
d4aaa2a0 13625 if (group == NULL
ba21f564
AM
13626 && (htab->brlt->rawsize == htab->brlt->size
13627 || (htab->stub_iteration > STUB_SHRINK_ITER
13628 && htab->brlt->rawsize > htab->brlt->size))
58d180e8 13629 && (htab->glink_eh_frame == NULL
a804e476
AM
13630 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size)
13631 && (htab->tga_group == NULL
13632 || htab->stub_iteration > 1))
5c3dead3
AM
13633 break;
13634
721956f4 13635 /* Ask the linker to do its stuff. */
e7d1c40c 13636 (*htab->params->layout_sections_again) ();
721956f4
AM
13637 }
13638
da44f4e5
AM
13639 if (htab->glink_eh_frame != NULL
13640 && htab->glink_eh_frame->size != 0)
13641 {
13642 bfd_vma val;
13643 bfd_byte *p, *last_fde;
13644 size_t last_fde_len, size, align, pad;
d4aaa2a0 13645 struct map_stub *group;
da44f4e5 13646
df136d64
AM
13647 /* It is necessary to at least have a rough outline of the
13648 linker generated CIEs and FDEs written before
13649 bfd_elf_discard_info is run, in order for these FDEs to be
13650 indexed in .eh_frame_hdr. */
da44f4e5
AM
13651 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
13652 if (p == NULL)
13653 return FALSE;
13654 htab->glink_eh_frame->contents = p;
13655 last_fde = p;
2e0ce1c8 13656 align = 4;
da44f4e5
AM
13657
13658 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
13659 /* CIE length (rewrite in case little-endian). */
2e0ce1c8 13660 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
da44f4e5 13661 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
2e0ce1c8 13662 p += last_fde_len + 4;
da44f4e5 13663
d4aaa2a0 13664 for (group = htab->group; group != NULL; group = group->next)
df136d64 13665 if (group->eh_size != 0)
da44f4e5 13666 {
df136d64 13667 group->eh_base = p - htab->glink_eh_frame->contents;
da44f4e5 13668 last_fde = p;
df136d64 13669 last_fde_len = ((group->eh_size + 17 + align - 1) & -align) - 4;
da44f4e5 13670 /* FDE length. */
2e0ce1c8 13671 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13672 p += 4;
13673 /* CIE pointer. */
13674 val = p - htab->glink_eh_frame->contents;
13675 bfd_put_32 (htab->elf.dynobj, val, p);
13676 p += 4;
13677 /* Offset to stub section, written later. */
13678 p += 4;
13679 /* stub section size. */
d4aaa2a0 13680 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
da44f4e5
AM
13681 p += 4;
13682 /* Augmentation. */
13683 p += 1;
df136d64
AM
13684 /* Make sure we don't have all nops. This is enough for
13685 elf-eh-frame.c to detect the last non-nop opcode. */
13686 p[group->eh_size - 1] = DW_CFA_advance_loc + 1;
d4aaa2a0 13687 p = last_fde + last_fde_len + 4;
da44f4e5
AM
13688 }
13689 if (htab->glink != NULL && htab->glink->size != 0)
13690 {
13691 last_fde = p;
2e0ce1c8 13692 last_fde_len = ((24 + align - 1) & -align) - 4;
da44f4e5 13693 /* FDE length. */
2e0ce1c8 13694 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13695 p += 4;
13696 /* CIE pointer. */
13697 val = p - htab->glink_eh_frame->contents;
13698 bfd_put_32 (htab->elf.dynobj, val, p);
13699 p += 4;
13700 /* Offset to .glink, written later. */
13701 p += 4;
13702 /* .glink size. */
13703 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
13704 p += 4;
13705 /* Augmentation. */
13706 p += 1;
13707
13708 *p++ = DW_CFA_advance_loc + 1;
13709 *p++ = DW_CFA_register;
13710 *p++ = 65;
9f08fa5c 13711 *p++ = htab->opd_abi ? 12 : 0;
15a3a14f 13712 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
da44f4e5
AM
13713 *p++ = DW_CFA_restore_extended;
13714 *p++ = 65;
2e0ce1c8 13715 p += ((24 + align - 1) & -align) - 24;
da44f4e5
AM
13716 }
13717 /* Subsume any padding into the last FDE if user .eh_frame
13718 sections are aligned more than glink_eh_frame. Otherwise any
13719 zero padding will be seen as a terminator. */
2e0ce1c8 13720 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
da44f4e5 13721 size = p - htab->glink_eh_frame->contents;
2e0ce1c8 13722 pad = ((size + align - 1) & -align) - size;
da44f4e5
AM
13723 htab->glink_eh_frame->size = size + pad;
13724 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
13725 }
13726
d969d15f 13727 maybe_strip_output (info, htab->brlt);
2efec98b
AM
13728 if (htab->relbrlt != NULL)
13729 maybe_strip_output (info, htab->relbrlt);
d969d15f
AM
13730 if (htab->glink_eh_frame != NULL)
13731 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 13732
b34976b6 13733 return TRUE;
721956f4
AM
13734}
13735
13736/* Called after we have determined section placement. If sections
805fc799 13737 move, we'll be called again. Provide a value for TOCstart. */
721956f4 13738
805fc799 13739bfd_vma
1c865ab2 13740ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 13741{
805fc799 13742 asection *s;
a27e685f 13743 bfd_vma TOCstart, adjust;
721956f4 13744
43417696
AM
13745 if (info != NULL)
13746 {
13747 struct elf_link_hash_entry *h;
13748 struct elf_link_hash_table *htab = elf_hash_table (info);
13749
13750 if (is_elf_hash_table (htab)
13751 && htab->hgot != NULL)
13752 h = htab->hgot;
13753 else
13754 {
13755 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
13756 if (is_elf_hash_table (htab))
13757 htab->hgot = h;
13758 }
13759 if (h != NULL
13760 && h->root.type == bfd_link_hash_defined
13761 && !h->root.linker_def
13762 && (!is_elf_hash_table (htab)
13763 || h->def_regular))
13764 {
ed7007c1 13765 TOCstart = defined_sym_val (h) - TOC_BASE_OFF;
43417696
AM
13766 _bfd_set_gp_value (obfd, TOCstart);
13767 return TOCstart;
13768 }
13769 }
13770
805fc799
AM
13771 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
13772 order. The TOC starts where the first of these sections starts. */
13773 s = bfd_get_section_by_name (obfd, ".got");
e054468f 13774 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13775 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 13776 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13777 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 13778 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13779 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 13780 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
13781 {
13782 /* This may happen for
13783 o references to TOC base (SYM@toc / TOC[tc0]) without a
13784 .toc directive
13785 o bad linker script
13786 o --gc-sections and empty TOC sections
13787
13788 FIXME: Warn user? */
13789
13790 /* Look for a likely section. We probably won't even be
13791 using TOCstart. */
13792 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13793 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
13794 | 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 13799 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
13800 == (SEC_ALLOC | SEC_SMALL_DATA))
13801 break;
721956f4 13802 if (s == NULL)
805fc799 13803 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13804 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
13805 == SEC_ALLOC)
805fc799 13806 break;
721956f4 13807 if (s == NULL)
805fc799 13808 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13809 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
13810 break;
13811 }
721956f4 13812
805fc799
AM
13813 TOCstart = 0;
13814 if (s != NULL)
13815 TOCstart = s->output_section->vma + s->output_offset;
721956f4 13816
a27e685f
AM
13817 /* Force alignment. */
13818 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
13819 TOCstart -= adjust;
1c865ab2
AM
13820 _bfd_set_gp_value (obfd, TOCstart);
13821
810d4e75 13822 if (info != NULL && s != NULL)
1c865ab2
AM
13823 {
13824 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13825
810d4e75
AM
13826 if (htab != NULL)
13827 {
13828 if (htab->elf.hgot != NULL)
13829 {
a27e685f 13830 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
810d4e75
AM
13831 htab->elf.hgot->root.u.def.section = s;
13832 }
13833 }
13834 else
1c865ab2 13835 {
810d4e75
AM
13836 struct bfd_link_hash_entry *bh = NULL;
13837 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
a27e685f
AM
13838 s, TOC_BASE_OFF - adjust,
13839 NULL, FALSE, FALSE, &bh);
1c865ab2
AM
13840 }
13841 }
805fc799 13842 return TOCstart;
721956f4
AM
13843}
13844
a345bc8d 13845/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
49c09209 13846 write out any global entry stubs, and PLT relocations. */
a345bc8d
AM
13847
13848static bfd_boolean
49c09209 13849build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
a345bc8d
AM
13850{
13851 struct bfd_link_info *info;
13852 struct ppc_link_hash_table *htab;
49c09209 13853 struct plt_entry *ent;
a345bc8d
AM
13854 asection *s;
13855
13856 if (h->root.type == bfd_link_hash_indirect)
13857 return TRUE;
13858
49c09209
AM
13859 info = inf;
13860 htab = ppc_hash_table (info);
13861 if (htab == NULL)
13862 return FALSE;
13863
13864 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13865 if (ent->plt.offset != (bfd_vma) -1)
13866 {
13867 /* This symbol has an entry in the procedure linkage
13868 table. Set it up. */
13869 Elf_Internal_Rela rela;
2d7ad24e 13870 asection *plt, *relplt;
49c09209
AM
13871 bfd_byte *loc;
13872
13873 if (!htab->elf.dynamic_sections_created
13874 || h->dynindx == -1)
13875 {
13876 if (!(h->def_regular
13877 && (h->root.type == bfd_link_hash_defined
13878 || h->root.type == bfd_link_hash_defweak)))
13879 continue;
2d7ad24e
AM
13880 if (h->type == STT_GNU_IFUNC)
13881 {
13882 plt = htab->elf.iplt;
13883 relplt = htab->elf.irelplt;
13884 htab->local_ifunc_resolver = 1;
13885 if (htab->opd_abi)
13886 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13887 else
13888 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13889 }
49c09209 13890 else
2d7ad24e
AM
13891 {
13892 plt = htab->pltlocal;
13893 if (bfd_link_pic (info))
13894 {
13895 relplt = htab->relpltlocal;
13896 if (htab->opd_abi)
13897 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13898 else
13899 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13900 }
13901 else
13902 relplt = NULL;
13903 }
ed7007c1 13904 rela.r_addend = defined_sym_val (h) + ent->addend;
2d7ad24e
AM
13905
13906 if (relplt == NULL)
13907 {
13908 loc = plt->contents + ent->plt.offset;
13909 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
13910 if (htab->opd_abi)
13911 {
13912 bfd_vma toc = elf_gp (info->output_bfd);
13913 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
13914 bfd_put_64 (info->output_bfd, toc, loc + 8);
13915 }
13916 }
13917 else
13918 {
13919 rela.r_offset = (plt->output_section->vma
13920 + plt->output_offset
13921 + ent->plt.offset);
13922 loc = relplt->contents + (relplt->reloc_count++
13923 * sizeof (Elf64_External_Rela));
13924 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13925 }
49c09209
AM
13926 }
13927 else
13928 {
13929 rela.r_offset = (htab->elf.splt->output_section->vma
13930 + htab->elf.splt->output_offset
13931 + ent->plt.offset);
13932 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13933 rela.r_addend = ent->addend;
13934 loc = (htab->elf.srelplt->contents
13935 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
13936 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
13937 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
13938 htab->maybe_local_ifunc_resolver = 1;
2d7ad24e 13939 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
49c09209 13940 }
49c09209
AM
13941 }
13942
a345bc8d
AM
13943 if (!h->pointer_equality_needed)
13944 return TRUE;
13945
13946 if (h->def_regular)
13947 return TRUE;
13948
9e390558 13949 s = htab->global_entry;
49c09209
AM
13950 if (s == NULL || s->size == 0)
13951 return TRUE;
13952
13953 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13954 if (ent->plt.offset != (bfd_vma) -1
13955 && ent->addend == 0)
a345bc8d
AM
13956 {
13957 bfd_byte *p;
13958 asection *plt;
13959 bfd_vma off;
13960
a345bc8d 13961 p = s->contents + h->root.u.def.value;
33e44f2e 13962 plt = htab->elf.splt;
a345bc8d
AM
13963 if (!htab->elf.dynamic_sections_created
13964 || h->dynindx == -1)
2d7ad24e
AM
13965 {
13966 if (h->type == STT_GNU_IFUNC)
13967 plt = htab->elf.iplt;
13968 else
13969 plt = htab->pltlocal;
13970 }
49c09209 13971 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
a345bc8d
AM
13972 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
13973
13974 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
13975 {
13976 info->callbacks->einfo
c1c8c1ef 13977 (_("%P: linkage table error against `%pT'\n"),
a345bc8d
AM
13978 h->root.root.string);
13979 bfd_set_error (bfd_error_bad_value);
13980 htab->stub_error = TRUE;
13981 }
13982
7341d5e2
AM
13983 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13984 if (htab->params->emit_stub_syms)
13985 {
13986 size_t len = strlen (h->root.root.string);
13987 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13988
13989 if (name == NULL)
13990 return FALSE;
13991
13992 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13993 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13994 if (h == NULL)
13995 return FALSE;
13996 if (h->root.type == bfd_link_hash_new)
13997 {
13998 h->root.type = bfd_link_hash_defined;
13999 h->root.u.def.section = s;
14000 h->root.u.def.value = p - s->contents;
14001 h->ref_regular = 1;
14002 h->def_regular = 1;
14003 h->ref_regular_nonweak = 1;
14004 h->forced_local = 1;
14005 h->non_elf = 0;
2ec55de3 14006 h->root.linker_def = 1;
7341d5e2
AM
14007 }
14008 }
14009
a345bc8d
AM
14010 if (PPC_HA (off) != 0)
14011 {
14012 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
14013 p += 4;
14014 }
14015 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
14016 p += 4;
14017 bfd_put_32 (s->owner, MTCTR_R12, p);
14018 p += 4;
407aa07c 14019 bfd_put_32 (s->owner, BCTR, p);
a345bc8d
AM
14020 break;
14021 }
14022 return TRUE;
14023}
14024
49c09209
AM
14025/* Write PLT relocs for locals. */
14026
14027static bfd_boolean
14028write_plt_relocs_for_local_syms (struct bfd_link_info *info)
14029{
14030 struct ppc_link_hash_table *htab = ppc_hash_table (info);
14031 bfd *ibfd;
14032
14033 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
14034 {
14035 struct got_entry **lgot_ents, **end_lgot_ents;
14036 struct plt_entry **local_plt, **lplt, **end_local_plt;
14037 Elf_Internal_Shdr *symtab_hdr;
14038 bfd_size_type locsymcount;
14039 Elf_Internal_Sym *local_syms = NULL;
14040 struct plt_entry *ent;
14041
14042 if (!is_ppc64_elf (ibfd))
14043 continue;
14044
14045 lgot_ents = elf_local_got_ents (ibfd);
14046 if (!lgot_ents)
14047 continue;
14048
14049 symtab_hdr = &elf_symtab_hdr (ibfd);
14050 locsymcount = symtab_hdr->sh_info;
14051 end_lgot_ents = lgot_ents + locsymcount;
14052 local_plt = (struct plt_entry **) end_lgot_ents;
14053 end_local_plt = local_plt + locsymcount;
14054 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
14055 for (ent = *lplt; ent != NULL; ent = ent->next)
14056 if (ent->plt.offset != (bfd_vma) -1)
14057 {
14058 Elf_Internal_Sym *sym;
14059 asection *sym_sec;
14060 asection *plt, *relplt;
14061 bfd_byte *loc;
14062 bfd_vma val;
49c09209
AM
14063
14064 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
14065 lplt - local_plt, ibfd))
14066 {
c9594989 14067 if (symtab_hdr->contents != (unsigned char *) local_syms)
49c09209
AM
14068 free (local_syms);
14069 return FALSE;
14070 }
14071
14072 val = sym->st_value + ent->addend;
ba85c15d
AM
14073 if (ELF_ST_TYPE (sym->st_info) != STT_GNU_IFUNC)
14074 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
49c09209
AM
14075 if (sym_sec != NULL && sym_sec->output_section != NULL)
14076 val += sym_sec->output_offset + sym_sec->output_section->vma;
14077
2d7ad24e
AM
14078 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14079 {
14080 htab->local_ifunc_resolver = 1;
14081 plt = htab->elf.iplt;
14082 relplt = htab->elf.irelplt;
14083 }
14084 else
14085 {
14086 plt = htab->pltlocal;
14087 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
14088 }
49c09209 14089
2d7ad24e
AM
14090 if (relplt == NULL)
14091 {
14092 loc = plt->contents + ent->plt.offset;
14093 bfd_put_64 (info->output_bfd, val, loc);
14094 if (htab->opd_abi)
14095 {
14096 bfd_vma toc = elf_gp (ibfd);
14097 bfd_put_64 (info->output_bfd, toc, loc + 8);
14098 }
14099 }
49c09209 14100 else
2d7ad24e
AM
14101 {
14102 Elf_Internal_Rela rela;
14103 rela.r_offset = (ent->plt.offset
14104 + plt->output_offset
14105 + plt->output_section->vma);
14106 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14107 {
14108 if (htab->opd_abi)
14109 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
14110 else
14111 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14112 }
14113 else
14114 {
14115 if (htab->opd_abi)
14116 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
14117 else
14118 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14119 }
14120 rela.r_addend = val;
14121 loc = relplt->contents + (relplt->reloc_count++
14122 * sizeof (Elf64_External_Rela));
14123 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
14124 }
49c09209
AM
14125 }
14126
14127 if (local_syms != NULL
14128 && symtab_hdr->contents != (unsigned char *) local_syms)
14129 {
14130 if (!info->keep_memory)
14131 free (local_syms);
14132 else
14133 symtab_hdr->contents = (unsigned char *) local_syms;
14134 }
14135 }
14136 return TRUE;
14137}
14138
a804e476
AM
14139/* Emit the static wrapper function preserving registers around a
14140 __tls_get_addr_opt call. */
14141
14142static bfd_boolean
14143emit_tga_desc (struct ppc_link_hash_table *htab)
14144{
14145 asection *stub_sec = htab->tga_group->stub_sec;
14146 unsigned int cfa_updt = 11 * 4;
14147 bfd_byte *p;
14148 bfd_vma to, from, delta;
14149
14150 BFD_ASSERT (htab->tga_desc_fd->elf.root.type == bfd_link_hash_defined
14151 && htab->tga_desc_fd->elf.root.u.def.section == stub_sec
14152 && htab->tga_desc_fd->elf.root.u.def.value == 0);
14153 to = defined_sym_val (&htab->tls_get_addr_fd->elf);
14154 from = defined_sym_val (&htab->tga_desc_fd->elf) + cfa_updt;
14155 delta = to - from;
14156 if (delta + (1 << 25) >= 1 << 26)
14157 {
14158 _bfd_error_handler (_("__tls_get_addr call offset overflow"));
14159 htab->stub_error = TRUE;
14160 return FALSE;
14161 }
14162
14163 p = stub_sec->contents;
14164 p = tls_get_addr_prologue (htab->elf.dynobj, p, htab);
14165 bfd_put_32 (stub_sec->owner, B_DOT | 1 | (delta & 0x3fffffc), p);
14166 p += 4;
14167 p = tls_get_addr_epilogue (htab->elf.dynobj, p, htab);
14168 return stub_sec->size == (bfd_size_type) (p - stub_sec->contents);
14169}
14170
14171/* Emit eh_frame describing the static wrapper function. */
14172
14173static bfd_byte *
14174emit_tga_desc_eh_frame (struct ppc_link_hash_table *htab, bfd_byte *p)
14175{
14176 unsigned int cfa_updt = 11 * 4;
14177 unsigned int i;
14178
14179 *p++ = DW_CFA_advance_loc + cfa_updt / 4;
14180 *p++ = DW_CFA_def_cfa_offset;
14181 if (htab->opd_abi)
14182 {
14183 *p++ = 128;
14184 *p++ = 1;
14185 }
14186 else
14187 *p++ = 96;
14188 *p++ = DW_CFA_offset_extended_sf;
14189 *p++ = 65;
14190 *p++ = (-16 / 8) & 0x7f;
14191 for (i = 4; i < 12; i++)
14192 {
14193 *p++ = DW_CFA_offset + i;
14194 *p++ = (htab->opd_abi ? 13 : 12) - i;
14195 }
14196 *p++ = DW_CFA_advance_loc + 10;
14197 *p++ = DW_CFA_def_cfa_offset;
14198 *p++ = 0;
14199 for (i = 4; i < 12; i++)
14200 *p++ = DW_CFA_restore + i;
14201 *p++ = DW_CFA_advance_loc + 2;
14202 *p++ = DW_CFA_restore_extended;
14203 *p++ = 65;
14204 return p;
14205}
14206
721956f4
AM
14207/* Build all the stubs associated with the current output file.
14208 The stubs are kept in a hash table attached to the main linker
14209 hash table. This function is called via gldelf64ppc_finish. */
14210
b34976b6 14211bfd_boolean
e7d1c40c 14212ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 14213 char **stats)
5d1634d7
AM
14214{
14215 struct ppc_link_hash_table *htab = ppc_hash_table (info);
a4b6fadd 14216 struct map_stub *group;
721956f4 14217 asection *stub_sec;
5d1634d7 14218 bfd_byte *p;
e717da7e 14219 int stub_sec_count = 0;
5d1634d7 14220
4dfe6ac6
NC
14221 if (htab == NULL)
14222 return FALSE;
14223
eea6121a 14224 /* Allocate memory to hold the linker stubs. */
d4aaa2a0 14225 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
14226 {
14227 group->eh_size = 0;
14228 group->lr_restore = 0;
14229 if ((stub_sec = group->stub_sec) != NULL
14230 && stub_sec->size != 0)
14231 {
14232 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd,
14233 stub_sec->size);
14234 if (stub_sec->contents == NULL)
14235 return FALSE;
14236 stub_sec->size = 0;
14237 }
14238 }
5d1634d7 14239
23eb7e01 14240 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 14241 {
9f951329 14242 unsigned int indx;
ad8e1ba5 14243 bfd_vma plt0;
9f951329 14244
721956f4 14245 /* Build the .glink plt call stub. */
e7d1c40c 14246 if (htab->params->emit_stub_syms)
97b639ba
AM
14247 {
14248 struct elf_link_hash_entry *h;
468392fb
AM
14249 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
14250 TRUE, FALSE, FALSE);
97b639ba
AM
14251 if (h == NULL)
14252 return FALSE;
14253 if (h->root.type == bfd_link_hash_new)
14254 {
14255 h->root.type = bfd_link_hash_defined;
14256 h->root.u.def.section = htab->glink;
ee4bf8d2 14257 h->root.u.def.value = 8;
f5385ebf
AM
14258 h->ref_regular = 1;
14259 h->def_regular = 1;
14260 h->ref_regular_nonweak = 1;
14261 h->forced_local = 1;
14262 h->non_elf = 0;
2ec55de3 14263 h->root.linker_def = 1;
97b639ba
AM
14264 }
14265 }
33e44f2e
AM
14266 plt0 = (htab->elf.splt->output_section->vma
14267 + htab->elf.splt->output_offset
14268 - 16);
176a0d42
AM
14269 if (info->emitrelocations)
14270 {
14271 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
14272 if (r == NULL)
14273 return FALSE;
14274 r->r_offset = (htab->glink->output_offset
14275 + htab->glink->output_section->vma);
14276 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
14277 r->r_addend = plt0;
14278 }
4ce794b7 14279 p = htab->glink->contents;
176a0d42 14280 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
14281 bfd_put_64 (htab->glink->owner, plt0, p);
14282 p += 8;
b9e5796b
AM
14283 if (htab->opd_abi)
14284 {
14285 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
14286 p += 4;
14287 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
14288 p += 4;
14289 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
14290 p += 4;
14291 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
14292 p += 4;
14293 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
14294 p += 4;
14295 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
14296 p += 4;
14297 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
14298 p += 4;
14299 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
14300 p += 4;
14301 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
14302 p += 4;
14303 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
14304 p += 4;
14305 }
14306 else
14307 {
14308 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
14309 p += 4;
14310 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
14311 p += 4;
14312 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
14313 p += 4;
f378ab09
AM
14314 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
14315 p += 4;
b9e5796b
AM
14316 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
14317 p += 4;
14318 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
14319 p += 4;
14320 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
14321 p += 4;
14322 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
14323 p += 4;
14324 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
14325 p += 4;
14326 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
14327 p += 4;
14328 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
14329 p += 4;
14330 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
14331 p += 4;
14332 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
14333 p += 4;
14334 }
407aa07c
AM
14335 bfd_put_32 (htab->glink->owner, BCTR, p);
14336 p += 4;
c75bc4f7 14337 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
ad8e1ba5 14338
9f951329
AM
14339 /* Build the .glink lazy link call stubs. */
14340 indx = 0;
9e390558 14341 while (p < htab->glink->contents + htab->glink->size)
9f951329 14342 {
b9e5796b 14343 if (htab->opd_abi)
9f951329 14344 {
b9e5796b
AM
14345 if (indx < 0x8000)
14346 {
14347 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
14348 p += 4;
14349 }
14350 else
14351 {
14352 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
14353 p += 4;
14354 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
14355 p);
14356 p += 4;
14357 }
9f951329 14358 }
4ce794b7 14359 bfd_put_32 (htab->glink->owner,
ee4bf8d2 14360 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 14361 indx++;
9f951329
AM
14362 p += 4;
14363 }
5d1634d7 14364 }
5d1634d7 14365
a804e476
AM
14366 if (htab->tga_group != NULL)
14367 {
14368 htab->tga_group->lr_restore = 23 * 4;
14369 htab->tga_group->stub_sec->size = 24 * 4;
14370 if (!emit_tga_desc (htab))
14371 return FALSE;
14372 if (htab->glink_eh_frame != NULL
14373 && htab->glink_eh_frame->size != 0)
14374 {
14375 size_t align = 4;
14376
14377 p = htab->glink_eh_frame->contents;
14378 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
14379 p += 17;
14380 htab->tga_group->eh_size = emit_tga_desc_eh_frame (htab, p) - p;
14381 }
14382 }
14383
49c09209
AM
14384 /* Build .glink global entry stubs, and PLT relocs for globals. */
14385 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
14386
14387 if (!write_plt_relocs_for_local_syms (info))
14388 return FALSE;
9e390558 14389
7341d5e2 14390 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 14391 {
4ce794b7 14392 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 14393 htab->brlt->size);
4ce794b7 14394 if (htab->brlt->contents == NULL)
b34976b6 14395 return FALSE;
721956f4 14396 }
ee75fd95 14397 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
14398 {
14399 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 14400 htab->relbrlt->size);
63bc6f6c
AM
14401 if (htab->relbrlt->contents == NULL)
14402 return FALSE;
14403 }
5d1634d7 14404
721956f4
AM
14405 /* Build the stubs as directed by the stub hash table. */
14406 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 14407
a4b6fadd
AM
14408 for (group = htab->group; group != NULL; group = group->next)
14409 if (group->needs_save_res)
7dda8d3c 14410 group->stub_sec->size += htab->sfpr->size;
a4b6fadd 14411
aa8a7074
AM
14412 if (htab->relbrlt != NULL)
14413 htab->relbrlt->reloc_count = 0;
14414
e7d1c40c 14415 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
14416 for (group = htab->group; group != NULL; group = group->next)
14417 if ((stub_sec = group->stub_sec) != NULL)
691d2e9a
AM
14418 {
14419 int align = abs (htab->params->plt_stub_align);
14420 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
14421 }
794e51c0 14422
7dda8d3c
AM
14423 for (group = htab->group; group != NULL; group = group->next)
14424 if (group->needs_save_res)
14425 {
14426 stub_sec = group->stub_sec;
14427 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
14428 htab->sfpr->contents, htab->sfpr->size);
14429 if (htab->params->emit_stub_syms)
14430 {
14431 unsigned int i;
14432
14433 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
14434 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
14435 return FALSE;
14436 }
14437 }
14438
df136d64
AM
14439 if (htab->glink_eh_frame != NULL
14440 && htab->glink_eh_frame->size != 0)
14441 {
14442 bfd_vma val;
14443 size_t align = 4;
14444
14445 p = htab->glink_eh_frame->contents;
14446 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
14447
14448 for (group = htab->group; group != NULL; group = group->next)
14449 if (group->eh_size != 0)
14450 {
14451 /* Offset to stub section. */
14452 val = (group->stub_sec->output_section->vma
14453 + group->stub_sec->output_offset);
14454 val -= (htab->glink_eh_frame->output_section->vma
14455 + htab->glink_eh_frame->output_offset
14456 + (p + 8 - htab->glink_eh_frame->contents));
14457 if (val + 0x80000000 > 0xffffffff)
14458 {
14459 _bfd_error_handler
14460 (_("%s offset too large for .eh_frame sdata4 encoding"),
14461 group->stub_sec->name);
14462 return FALSE;
14463 }
14464 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14465 p += (group->eh_size + 17 + 3) & -4;
14466 }
14467 if (htab->glink != NULL && htab->glink->size != 0)
14468 {
14469 /* Offset to .glink. */
14470 val = (htab->glink->output_section->vma
14471 + htab->glink->output_offset
14472 + 8);
14473 val -= (htab->glink_eh_frame->output_section->vma
14474 + htab->glink_eh_frame->output_offset
14475 + (p + 8 - htab->glink_eh_frame->contents));
14476 if (val + 0x80000000 > 0xffffffff)
14477 {
14478 _bfd_error_handler
14479 (_("%s offset too large for .eh_frame sdata4 encoding"),
14480 htab->glink->name);
14481 return FALSE;
14482 }
14483 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14484 p += (24 + align - 1) & -align;
14485 }
14486 }
14487
d4aaa2a0
AM
14488 for (group = htab->group; group != NULL; group = group->next)
14489 if ((stub_sec = group->stub_sec) != NULL)
e717da7e
AM
14490 {
14491 stub_sec_count += 1;
c9301e31
AM
14492 if (stub_sec->rawsize != stub_sec->size
14493 && (htab->stub_iteration <= STUB_SHRINK_ITER
14494 || stub_sec->rawsize < stub_sec->size))
e717da7e
AM
14495 break;
14496 }
5d1634d7 14497
25516cc5 14498 if (group != NULL)
5d1634d7 14499 {
b34976b6 14500 htab->stub_error = TRUE;
cf97bcb0 14501 _bfd_error_handler (_("stubs don't match calculated size"));
5d1634d7 14502 }
721956f4 14503
d2a300cf
AM
14504 if (htab->stub_error)
14505 return FALSE;
14506
14507 if (stats != NULL)
14508 {
988b7300
AM
14509 char *groupmsg;
14510 if (asprintf (&groupmsg,
14511 ngettext ("linker stubs in %u group\n",
14512 "linker stubs in %u groups\n",
14513 stub_sec_count),
14514 stub_sec_count) < 0)
14515 *stats = NULL;
14516 else
14517 {
14518 if (asprintf (stats, _("%s"
14519 " branch %lu\n"
14520 " branch toc adj %lu\n"
14521 " branch notoc %lu\n"
14522 " branch both %lu\n"
14523 " long branch %lu\n"
14524 " long toc adj %lu\n"
14525 " long notoc %lu\n"
14526 " long both %lu\n"
14527 " plt call %lu\n"
14528 " plt call save %lu\n"
14529 " plt call notoc %lu\n"
14530 " plt call both %lu\n"
14531 " global entry %lu"),
14532 groupmsg,
14533 htab->stub_count[ppc_stub_long_branch - 1],
14534 htab->stub_count[ppc_stub_long_branch_r2off - 1],
14535 htab->stub_count[ppc_stub_long_branch_notoc - 1],
14536 htab->stub_count[ppc_stub_long_branch_both - 1],
14537 htab->stub_count[ppc_stub_plt_branch - 1],
14538 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
14539 htab->stub_count[ppc_stub_plt_branch_notoc - 1],
14540 htab->stub_count[ppc_stub_plt_branch_both - 1],
14541 htab->stub_count[ppc_stub_plt_call - 1],
14542 htab->stub_count[ppc_stub_plt_call_r2save - 1],
14543 htab->stub_count[ppc_stub_plt_call_notoc - 1],
14544 htab->stub_count[ppc_stub_plt_call_both - 1],
14545 htab->stub_count[ppc_stub_global_entry - 1]) < 0)
14546 *stats = NULL;
14547 free (groupmsg);
14548 }
d2a300cf
AM
14549 }
14550 return TRUE;
5bd4f169
AM
14551}
14552
60124e18
AM
14553/* What to do when ld finds relocations against symbols defined in
14554 discarded sections. */
14555
14556static unsigned int
14557ppc64_elf_action_discarded (asection *sec)
14558{
14559 if (strcmp (".opd", sec->name) == 0)
14560 return 0;
14561
14562 if (strcmp (".toc", sec->name) == 0)
14563 return 0;
14564
bce50a28
JJ
14565 if (strcmp (".toc1", sec->name) == 0)
14566 return 0;
14567
60124e18
AM
14568 return _bfd_elf_default_action_discarded (sec);
14569}
14570
e59a1001
AM
14571/* These are the dynamic relocations supported by glibc. */
14572
14573static bfd_boolean
14574ppc64_glibc_dynamic_reloc (enum elf_ppc64_reloc_type r_type)
14575{
14576 switch (r_type)
14577 {
14578 case R_PPC64_RELATIVE:
14579 case R_PPC64_NONE:
14580 case R_PPC64_ADDR64:
14581 case R_PPC64_GLOB_DAT:
14582 case R_PPC64_IRELATIVE:
14583 case R_PPC64_JMP_IREL:
14584 case R_PPC64_JMP_SLOT:
14585 case R_PPC64_DTPMOD64:
14586 case R_PPC64_DTPREL64:
14587 case R_PPC64_TPREL64:
14588 case R_PPC64_TPREL16_LO_DS:
14589 case R_PPC64_TPREL16_DS:
14590 case R_PPC64_TPREL16:
14591 case R_PPC64_TPREL16_LO:
14592 case R_PPC64_TPREL16_HI:
14593 case R_PPC64_TPREL16_HIGH:
14594 case R_PPC64_TPREL16_HA:
14595 case R_PPC64_TPREL16_HIGHA:
14596 case R_PPC64_TPREL16_HIGHER:
14597 case R_PPC64_TPREL16_HIGHEST:
14598 case R_PPC64_TPREL16_HIGHERA:
14599 case R_PPC64_TPREL16_HIGHESTA:
14600 case R_PPC64_ADDR16_LO_DS:
14601 case R_PPC64_ADDR16_LO:
14602 case R_PPC64_ADDR16_HI:
14603 case R_PPC64_ADDR16_HIGH:
14604 case R_PPC64_ADDR16_HA:
14605 case R_PPC64_ADDR16_HIGHA:
14606 case R_PPC64_REL30:
14607 case R_PPC64_COPY:
14608 case R_PPC64_UADDR64:
14609 case R_PPC64_UADDR32:
14610 case R_PPC64_ADDR32:
14611 case R_PPC64_ADDR24:
14612 case R_PPC64_ADDR16:
14613 case R_PPC64_UADDR16:
14614 case R_PPC64_ADDR16_DS:
14615 case R_PPC64_ADDR16_HIGHER:
14616 case R_PPC64_ADDR16_HIGHEST:
14617 case R_PPC64_ADDR16_HIGHERA:
14618 case R_PPC64_ADDR16_HIGHESTA:
14619 case R_PPC64_ADDR14:
14620 case R_PPC64_ADDR14_BRTAKEN:
14621 case R_PPC64_ADDR14_BRNTAKEN:
14622 case R_PPC64_REL32:
14623 case R_PPC64_REL64:
14624 return TRUE;
14625
14626 default:
14627 return FALSE;
14628 }
14629}
14630
5bd4f169
AM
14631/* The RELOCATE_SECTION function is called by the ELF backend linker
14632 to handle the relocations for a section.
14633
14634 The relocs are always passed as Rela structures; if the section
14635 actually uses Rel structures, the r_addend field will always be
14636 zero.
14637
14638 This function is responsible for adjust the section contents as
14639 necessary, and (if using Rela relocs and generating a
1049f94e 14640 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
14641 necessary.
14642
14643 This function does not have to worry about setting the reloc
14644 address or the reloc symbol index.
14645
14646 LOCAL_SYMS is a pointer to the swapped in local symbols.
14647
14648 LOCAL_SECTIONS is an array giving the section in the input file
14649 corresponding to the st_shndx field of each local symbol.
14650
14651 The global hash table entry for the global symbols can be found
14652 via elf_sym_hashes (input_bfd).
14653
1049f94e 14654 When generating relocatable output, this function must handle
5bd4f169
AM
14655 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
14656 going to be the section symbol corresponding to the output
14657 section, which means that the addend must be adjusted
14658 accordingly. */
14659
b34976b6 14660static bfd_boolean
4ce794b7
AM
14661ppc64_elf_relocate_section (bfd *output_bfd,
14662 struct bfd_link_info *info,
14663 bfd *input_bfd,
14664 asection *input_section,
14665 bfd_byte *contents,
14666 Elf_Internal_Rela *relocs,
14667 Elf_Internal_Sym *local_syms,
14668 asection **local_sections)
5bd4f169 14669{
65f38f15 14670 struct ppc_link_hash_table *htab;
5bd4f169
AM
14671 Elf_Internal_Shdr *symtab_hdr;
14672 struct elf_link_hash_entry **sym_hashes;
5bd4f169 14673 Elf_Internal_Rela *rel;
c316a17c 14674 Elf_Internal_Rela *wrel;
5bd4f169 14675 Elf_Internal_Rela *relend;
411e1bfb
AM
14676 Elf_Internal_Rela outrel;
14677 bfd_byte *loc;
411e1bfb 14678 struct got_entry **local_got_ents;
5bd4f169 14679 bfd_vma TOCstart;
b34976b6
AM
14680 bfd_boolean ret = TRUE;
14681 bfd_boolean is_opd;
794e51c0
AM
14682 /* Assume 'at' branch hints. */
14683 bfd_boolean is_isa_v2 = TRUE;
e59a1001 14684 bfd_boolean warned_dynamic = FALSE;
95f0d0d2 14685 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
5bd4f169 14686
65f38f15 14687 /* Initialize howto table if needed. */
5bd4f169 14688 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
14689 ppc_howto_init ();
14690
65f38f15 14691 htab = ppc_hash_table (info);
4dfe6ac6
NC
14692 if (htab == NULL)
14693 return FALSE;
ee75fd95
AM
14694
14695 /* Don't relocate stub sections. */
e7d1c40c 14696 if (input_section->owner == htab->params->stub_bfd)
ee75fd95
AM
14697 return TRUE;
14698
7af5d5c4
AM
14699 if (!is_ppc64_elf (input_bfd))
14700 {
14701 bfd_set_error (bfd_error_wrong_format);
14702 return FALSE;
14703 }
0ffa91dd 14704
411e1bfb 14705 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 14706 TOCstart = elf_gp (output_bfd);
0ffa91dd 14707 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 14708 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 14709 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 14710
c316a17c 14711 rel = wrel = relocs;
5bd4f169 14712 relend = relocs + input_section->reloc_count;
c316a17c 14713 for (; rel < relend; wrel++, rel++)
5bd4f169 14714 {
04c9666a 14715 enum elf_ppc64_reloc_type r_type;
31c76678 14716 bfd_vma addend;
5bd4f169
AM
14717 bfd_reloc_status_type r;
14718 Elf_Internal_Sym *sym;
14719 asection *sec;
039b3fef
AM
14720 struct elf_link_hash_entry *h_elf;
14721 struct ppc_link_hash_entry *h;
14722 struct ppc_link_hash_entry *fdh;
5bd4f169 14723 const char *sym_name;
0d4792f7 14724 unsigned long r_symndx, toc_symndx;
3a71aa26 14725 bfd_vma toc_addend;
f961d9dd
AM
14726 unsigned char tls_mask, tls_gd, tls_type;
14727 unsigned char sym_type;
5bd4f169 14728 bfd_vma relocation;
23cedd1d 14729 bfd_boolean unresolved_reloc, save_unresolved_reloc;
b34976b6 14730 bfd_boolean warned;
bc30df16 14731 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 14732 unsigned int insn;
e11840f9 14733 unsigned int mask;
721956f4
AM
14734 struct ppc_stub_hash_entry *stub_entry;
14735 bfd_vma max_br_offset;
14736 bfd_vma from;
c316a17c 14737 Elf_Internal_Rela orig_rel;
b80eed39
AM
14738 reloc_howto_type *howto;
14739 struct reloc_howto_struct alt_howto;
4a421c53
AM
14740 uint64_t pinsn;
14741 bfd_vma offset;
5bd4f169 14742
c316a17c
AM
14743 again:
14744 orig_rel = *rel;
14745
4ce794b7 14746 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 14747 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
14748
14749 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
14750 symbol of the previous ADDR64 reloc. The symbol gives us the
14751 proper TOC base to use. */
14752 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
c316a17c
AM
14753 && wrel != relocs
14754 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
ee87f2da 14755 && is_opd)
c316a17c 14756 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
ee87f2da 14757
4ce794b7
AM
14758 sym = NULL;
14759 sec = NULL;
039b3fef 14760 h_elf = NULL;
4ce794b7 14761 sym_name = NULL;
b34976b6
AM
14762 unresolved_reloc = FALSE;
14763 warned = FALSE;
65f38f15 14764
0b13192e 14765 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
14766 {
14767 /* It's a local symbol. */
74f0fb50 14768 struct _opd_sec_data *opd;
4025353c 14769
5bd4f169
AM
14770 sym = local_syms + r_symndx;
14771 sec = local_sections[r_symndx];
26c61ae5 14772 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 14773 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 14774 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
14775 opd = get_opd_info (sec);
14776 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 14777 {
51aecdc5
AM
14778 long adjust = opd->adjust[OPD_NDX (sym->st_value
14779 + rel->r_addend)];
4025353c
AM
14780 if (adjust == -1)
14781 relocation = 0;
14782 else
4cc603a5
AM
14783 {
14784 /* If this is a relocation against the opd section sym
14785 and we have edited .opd, adjust the reloc addend so
14786 that ld -r and ld --emit-relocs output is correct.
14787 If it is a reloc against some other .opd symbol,
14788 then the symbol value will be adjusted later. */
14789 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
14790 rel->r_addend += adjust;
14791 else
14792 relocation += adjust;
14793 }
1e2f5b6e 14794 }
5bd4f169
AM
14795 }
14796 else
14797 {
62d887d4
L
14798 bfd_boolean ignored;
14799
b2a8e766
AM
14800 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
14801 r_symndx, symtab_hdr, sym_hashes,
039b3fef 14802 h_elf, sec, relocation,
62d887d4 14803 unresolved_reloc, warned, ignored);
039b3fef
AM
14804 sym_name = h_elf->root.root.string;
14805 sym_type = h_elf->type;
b69fdb4e
AM
14806 if (sec != NULL
14807 && sec->owner == output_bfd
14808 && strcmp (sec->name, ".opd") == 0)
14809 {
14810 /* This is a symbol defined in a linker script. All
14811 such are defined in output sections, even those
14812 defined by simple assignment from a symbol defined in
14813 an input section. Transfer the symbol to an
14814 appropriate input .opd section, so that a branch to
14815 this symbol will be mapped to the location specified
14816 by the opd entry. */
14817 struct bfd_link_order *lo;
14818 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
14819 if (lo->type == bfd_indirect_link_order)
14820 {
14821 asection *isec = lo->u.indirect.section;
14822 if (h_elf->root.u.def.value >= isec->output_offset
14823 && h_elf->root.u.def.value < (isec->output_offset
14824 + isec->size))
14825 {
14826 h_elf->root.u.def.value -= isec->output_offset;
14827 h_elf->root.u.def.section = isec;
14828 sec = isec;
14829 break;
14830 }
14831 }
14832 }
5bd4f169 14833 }
ed7007c1 14834 h = ppc_elf_hash_entry (h_elf);
5bd4f169 14835
dbaa2011 14836 if (sec != NULL && discarded_section (sec))
c316a17c
AM
14837 {
14838 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
14839 input_bfd, input_section,
0930cb30 14840 contents, rel->r_offset);
c316a17c
AM
14841 wrel->r_offset = rel->r_offset;
14842 wrel->r_info = 0;
14843 wrel->r_addend = 0;
14844
14845 /* For ld -r, remove relocations in debug sections against
dcd2b8a0 14846 symbols defined in discarded sections. Not done for
c316a17c
AM
14847 non-debug to preserve relocs in .eh_frame which the
14848 eh_frame editing code expects to be present. */
14849 if (bfd_link_relocatable (info)
14850 && (input_section->flags & SEC_DEBUGGING))
14851 wrel--;
14852
14853 continue;
14854 }
ab96bf03 14855
0e1862bb 14856 if (bfd_link_relocatable (info))
c316a17c 14857 goto copy_reloc;
ab96bf03 14858
f40da81b
AM
14859 if (h != NULL && &h->elf == htab->elf.hgot)
14860 {
6f20ed8a 14861 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
f40da81b
AM
14862 sec = bfd_abs_section_ptr;
14863 unresolved_reloc = FALSE;
14864 }
14865
951fd09b
AM
14866 /* TLS optimizations. Replace instruction sequences and relocs
14867 based on information we collected in tls_optimize. We edit
14868 RELOCS so that --emit-relocs will output something sensible
14869 for the final instruction stream. */
14870 tls_mask = 0;
14871 tls_gd = 0;
0d4792f7 14872 toc_symndx = 0;
727fc41e
AM
14873 if (h != NULL)
14874 tls_mask = h->tls_mask;
14875 else if (local_got_ents != NULL)
411e1bfb 14876 {
e054468f
AM
14877 struct plt_entry **local_plt = (struct plt_entry **)
14878 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 14879 unsigned char *lgot_masks = (unsigned char *)
e054468f 14880 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
14881 tls_mask = lgot_masks[r_symndx];
14882 }
37da22e5 14883 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
727fc41e
AM
14884 && (r_type == R_PPC64_TLS
14885 || r_type == R_PPC64_TLSGD
14886 || r_type == R_PPC64_TLSLD))
14887 {
14888 /* Check for toc tls entries. */
f961d9dd 14889 unsigned char *toc_tls;
0d4792f7 14890
727fc41e
AM
14891 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14892 &local_syms, rel, input_bfd))
14893 return FALSE;
0d4792f7 14894
727fc41e
AM
14895 if (toc_tls)
14896 tls_mask = *toc_tls;
0d4792f7
AM
14897 }
14898
14899 /* Check that tls relocs are used with tls syms, and non-tls
14900 relocs are used with non-tls syms. */
cf35638d 14901 if (r_symndx != STN_UNDEF
0d4792f7
AM
14902 && r_type != R_PPC64_NONE
14903 && (h == NULL
039b3fef
AM
14904 || h->elf.root.type == bfd_link_hash_defined
14905 || h->elf.root.type == bfd_link_hash_defweak)
71c4e95a 14906 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
0d4792f7 14907 {
37da22e5 14908 if ((tls_mask & TLS_TLS) != 0
727fc41e
AM
14909 && (r_type == R_PPC64_TLS
14910 || r_type == R_PPC64_TLSGD
14911 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
14912 /* R_PPC64_TLS is OK against a symbol in the TOC. */
14913 ;
14914 else
25f53a85 14915 info->callbacks->einfo
1d483afe 14916 (!IS_PPC64_TLS_RELOC (r_type)
695344c0 14917 /* xgettext:c-format */
c1c8c1ef 14918 ? _("%H: %s used with TLS symbol `%pT'\n")
695344c0 14919 /* xgettext:c-format */
c1c8c1ef 14920 : _("%H: %s used with non-TLS symbol `%pT'\n"),
25f53a85 14921 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
14922 ppc64_elf_howto_table[r_type]->name,
14923 sym_name);
411e1bfb
AM
14924 }
14925
14926 /* Ensure reloc mapping code below stays sane. */
14927 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
14928 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
14929 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
14930 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
14931 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
14932 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
14933 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
14934 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
14935 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
14936 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
14937 abort ();
0d4792f7 14938
411e1bfb
AM
14939 switch (r_type)
14940 {
14941 default:
411e1bfb
AM
14942 break;
14943
ba761f19 14944 case R_PPC64_LO_DS_OPT:
95f0d0d2 14945 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
2365f8d7 14946 if ((insn & (0x3fu << 26)) != 58u << 26)
ba761f19
AM
14947 abort ();
14948 insn += (14u << 26) - (58u << 26);
95f0d0d2 14949 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
ba761f19
AM
14950 r_type = R_PPC64_TOC16_LO;
14951 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14952 break;
14953
411e1bfb
AM
14954 case R_PPC64_TOC16:
14955 case R_PPC64_TOC16_LO:
14956 case R_PPC64_TOC16_DS:
14957 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
14958 {
14959 /* Check for toc tls entries. */
f961d9dd 14960 unsigned char *toc_tls;
951fd09b 14961 int retval;
411e1bfb 14962
3a71aa26
AM
14963 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14964 &local_syms, rel, input_bfd);
951fd09b 14965 if (retval == 0)
411e1bfb
AM
14966 return FALSE;
14967
14968 if (toc_tls)
14969 {
951fd09b 14970 tls_mask = *toc_tls;
411e1bfb
AM
14971 if (r_type == R_PPC64_TOC16_DS
14972 || r_type == R_PPC64_TOC16_LO_DS)
81407a69 14973 {
37da22e5 14974 if ((tls_mask & TLS_TLS) != 0
81407a69
AM
14975 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
14976 goto toctprel;
14977 }
411e1bfb 14978 else
951fd09b
AM
14979 {
14980 /* If we found a GD reloc pair, then we might be
14981 doing a GD->IE transition. */
14982 if (retval == 2)
14983 {
b00a0a86 14984 tls_gd = TLS_GDIE;
37da22e5
AM
14985 if ((tls_mask & TLS_TLS) != 0
14986 && (tls_mask & TLS_GD) == 0)
102890f0 14987 goto tls_ldgd_opt;
951fd09b
AM
14988 }
14989 else if (retval == 3)
14990 {
37da22e5
AM
14991 if ((tls_mask & TLS_TLS) != 0
14992 && (tls_mask & TLS_LD) == 0)
102890f0 14993 goto tls_ldgd_opt;
951fd09b
AM
14994 }
14995 }
411e1bfb
AM
14996 }
14997 }
14998 break;
14999
9d6ded02
AM
15000 case R_PPC64_GOT_TPREL16_HI:
15001 case R_PPC64_GOT_TPREL16_HA:
37da22e5 15002 if ((tls_mask & TLS_TLS) != 0
9d6ded02
AM
15003 && (tls_mask & TLS_TPREL) == 0)
15004 {
15005 rel->r_offset -= d_offset;
95f0d0d2 15006 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
9d6ded02
AM
15007 r_type = R_PPC64_NONE;
15008 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15009 }
15010 break;
15011
411e1bfb
AM
15012 case R_PPC64_GOT_TPREL16_DS:
15013 case R_PPC64_GOT_TPREL16_LO_DS:
37da22e5 15014 if ((tls_mask & TLS_TLS) != 0
951fd09b 15015 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 15016 {
81407a69 15017 toctprel:
95f0d0d2 15018 insn = bfd_get_32 (input_bfd,
c316a17c 15019 contents + rel->r_offset - d_offset);
411e1bfb
AM
15020 insn &= 31 << 21;
15021 insn |= 0x3c0d0000; /* addis 0,13,0 */
95f0d0d2 15022 bfd_put_32 (input_bfd, insn,
c316a17c 15023 contents + rel->r_offset - d_offset);
411e1bfb 15024 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
15025 if (toc_symndx != 0)
15026 {
15027 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 15028 rel->r_addend = toc_addend;
0d4792f7
AM
15029 /* We changed the symbol. Start over in order to
15030 get h, sym, sec etc. right. */
c316a17c 15031 goto again;
0d4792f7
AM
15032 }
15033 else
15034 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
15035 }
15036 break;
15037
87c69f97 15038 case R_PPC64_GOT_TPREL_PCREL34:
c213164a
AM
15039 if ((tls_mask & TLS_TLS) != 0
15040 && (tls_mask & TLS_TPREL) == 0)
15041 {
15042 /* pld ra,sym@got@tprel@pcrel -> paddi ra,r13,sym@tprel */
15043 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15044 pinsn <<= 32;
15045 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15046 pinsn += ((2ULL << 56) + (-1ULL << 52)
15047 + (14ULL << 26) - (57ULL << 26) + (13ULL << 16));
15048 bfd_put_32 (input_bfd, pinsn >> 32,
15049 contents + rel->r_offset);
15050 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
15051 contents + rel->r_offset + 4);
15052 r_type = R_PPC64_TPREL34;
15053 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15054 }
15055 break;
15056
411e1bfb 15057 case R_PPC64_TLS:
37da22e5 15058 if ((tls_mask & TLS_TLS) != 0
951fd09b 15059 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 15060 {
c213164a 15061 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2d0f3896
AM
15062 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
15063 if (insn == 0)
c213164a
AM
15064 break;
15065 if ((rel->r_offset & 3) == 0)
0d4792f7 15066 {
c213164a
AM
15067 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
15068 /* Was PPC64_TLS which sits on insn boundary, now
15069 PPC64_TPREL16_LO which is at low-order half-word. */
15070 rel->r_offset += d_offset;
15071 r_type = R_PPC64_TPREL16_LO;
15072 if (toc_symndx != 0)
15073 {
15074 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
15075 rel->r_addend = toc_addend;
15076 /* We changed the symbol. Start over in order to
15077 get h, sym, sec etc. right. */
15078 goto again;
15079 }
15080 else
15081 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15082 }
15083 else if ((rel->r_offset & 3) == 1)
15084 {
15085 /* For pcrel IE to LE we already have the full
15086 offset and thus don't need an addi here. A nop
15087 or mr will do. */
2365f8d7 15088 if ((insn & (0x3fu << 26)) == 14 << 26)
c213164a
AM
15089 {
15090 /* Extract regs from addi rt,ra,si. */
15091 unsigned int rt = (insn >> 21) & 0x1f;
15092 unsigned int ra = (insn >> 16) & 0x1f;
15093 if (rt == ra)
15094 insn = NOP;
15095 else
15096 {
15097 /* Build or ra,rs,rb with rb==rs, ie. mr ra,rs. */
15098 insn = (rt << 16) | (ra << 21) | (ra << 11);
15099 insn |= (31u << 26) | (444u << 1);
15100 }
15101 }
15102 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - 1);
0d4792f7 15103 }
411e1bfb
AM
15104 }
15105 break;
15106
411e1bfb
AM
15107 case R_PPC64_GOT_TLSGD16_HI:
15108 case R_PPC64_GOT_TLSGD16_HA:
b00a0a86 15109 tls_gd = TLS_GDIE;
37da22e5 15110 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
951fd09b
AM
15111 goto tls_gdld_hi;
15112 break;
15113
411e1bfb
AM
15114 case R_PPC64_GOT_TLSLD16_HI:
15115 case R_PPC64_GOT_TLSLD16_HA:
37da22e5 15116 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 15117 {
951fd09b
AM
15118 tls_gdld_hi:
15119 if ((tls_mask & tls_gd) != 0)
15120 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
15121 + R_PPC64_GOT_TPREL16_DS);
15122 else
411e1bfb 15123 {
4fe5ca5b 15124 rel->r_offset -= d_offset;
95f0d0d2 15125 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
951fd09b 15126 r_type = R_PPC64_NONE;
411e1bfb 15127 }
951fd09b 15128 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
15129 }
15130 break;
15131
951fd09b
AM
15132 case R_PPC64_GOT_TLSGD16:
15133 case R_PPC64_GOT_TLSGD16_LO:
b00a0a86 15134 tls_gd = TLS_GDIE;
37da22e5 15135 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
102890f0 15136 goto tls_ldgd_opt;
951fd09b 15137 break;
411e1bfb 15138
951fd09b
AM
15139 case R_PPC64_GOT_TLSLD16:
15140 case R_PPC64_GOT_TLSLD16_LO:
37da22e5 15141 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
951fd09b 15142 {
b9f04fe0 15143 unsigned int insn1, insn2;
102890f0
AM
15144
15145 tls_ldgd_opt:
727fc41e
AM
15146 offset = (bfd_vma) -1;
15147 /* If not using the newer R_PPC64_TLSGD/LD to mark
15148 __tls_get_addr calls, we must trust that the call
15149 stays with its arg setup insns, ie. that the next
15150 reloc is the __tls_get_addr call associated with
15151 the current reloc. Edit both insns. */
9737e8af 15152 if (input_section->nomark_tls_get_addr
727fc41e
AM
15153 && rel + 1 < relend
15154 && branch_reloc_hash_match (input_bfd, rel + 1,
9e7028aa
AM
15155 htab->tls_get_addr_fd,
15156 htab->tga_desc_fd,
727fc41e 15157 htab->tls_get_addr,
9e7028aa 15158 htab->tga_desc))
727fc41e 15159 offset = rel[1].r_offset;
b86ac8e3
AM
15160 /* We read the low GOT_TLS (or TOC16) insn because we
15161 need to keep the destination reg. It may be
15162 something other than the usual r3, and moved to r3
15163 before the call by intervening code. */
95f0d0d2 15164 insn1 = bfd_get_32 (input_bfd,
b86ac8e3 15165 contents + rel->r_offset - d_offset);
102890f0 15166 if ((tls_mask & tls_gd) != 0)
411e1bfb 15167 {
102890f0 15168 /* IE */
b86ac8e3 15169 insn1 &= (0x1f << 21) | (0x1f << 16);
2365f8d7 15170 insn1 |= 58u << 26; /* ld */
102890f0 15171 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 15172 if (offset != (bfd_vma) -1)
f58d5a2d 15173 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
46e9995a
AM
15174 if (r_type == R_PPC64_TOC16
15175 || r_type == R_PPC64_TOC16_LO)
102890f0 15176 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
46e9995a
AM
15177 else
15178 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 1)) & 1)
15179 + R_PPC64_GOT_TPREL16_DS);
102890f0
AM
15180 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15181 }
15182 else
15183 {
15184 /* LE */
b86ac8e3
AM
15185 insn1 &= 0x1f << 21;
15186 insn1 |= 0x3c0d0000; /* addis r,13,0 */
102890f0
AM
15187 insn2 = 0x38630000; /* addi 3,3,0 */
15188 if (tls_gd == 0)
951fd09b 15189 {
102890f0 15190 /* Was an LD reloc. */
71c4e95a 15191 r_symndx = STN_UNDEF;
102890f0 15192 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
951fd09b 15193 }
102890f0 15194 else if (toc_symndx != 0)
3a71aa26
AM
15195 {
15196 r_symndx = toc_symndx;
15197 rel->r_addend = toc_addend;
15198 }
102890f0
AM
15199 r_type = R_PPC64_TPREL16_HA;
15200 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
15201 if (offset != (bfd_vma) -1)
15202 {
15203 rel[1].r_info = ELF64_R_INFO (r_symndx,
15204 R_PPC64_TPREL16_LO);
15205 rel[1].r_offset = offset + d_offset;
15206 rel[1].r_addend = rel->r_addend;
15207 }
102890f0 15208 }
95f0d0d2 15209 bfd_put_32 (input_bfd, insn1,
3a71aa26 15210 contents + rel->r_offset - d_offset);
727fc41e 15211 if (offset != (bfd_vma) -1)
c96e0573
AM
15212 {
15213 bfd_put_32 (input_bfd, insn2, contents + offset);
15214 if (offset + 8 <= input_section->size)
15215 {
15216 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
15217 if (insn2 == LD_R2_0R1 + STK_TOC (htab))
15218 bfd_put_32 (input_bfd, NOP, contents + offset + 4);
15219 }
15220 }
727fc41e
AM
15221 if ((tls_mask & tls_gd) == 0
15222 && (tls_gd == 0 || toc_symndx != 0))
15223 {
15224 /* We changed the symbol. Start over in order
15225 to get h, sym, sec etc. right. */
c316a17c 15226 goto again;
727fc41e
AM
15227 }
15228 }
15229 break;
15230
87c69f97 15231 case R_PPC64_GOT_TLSGD_PCREL34:
c213164a
AM
15232 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
15233 {
15234 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15235 pinsn <<= 32;
15236 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15237 if ((tls_mask & TLS_GDIE) != 0)
15238 {
15239 /* IE, pla -> pld */
15240 pinsn += (-2ULL << 56) + (57ULL << 26) - (14ULL << 26);
87c69f97 15241 r_type = R_PPC64_GOT_TPREL_PCREL34;
c213164a
AM
15242 }
15243 else
15244 {
15245 /* LE, pla pcrel -> paddi r13 */
15246 pinsn += (-1ULL << 52) + (13ULL << 16);
15247 r_type = R_PPC64_TPREL34;
15248 }
15249 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15250 bfd_put_32 (input_bfd, pinsn >> 32,
15251 contents + rel->r_offset);
15252 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
15253 contents + rel->r_offset + 4);
15254 }
15255 break;
15256
87c69f97 15257 case R_PPC64_GOT_TLSLD_PCREL34:
c213164a
AM
15258 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
15259 {
15260 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15261 pinsn <<= 32;
15262 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15263 pinsn += (-1ULL << 52) + (13ULL << 16);
15264 bfd_put_32 (input_bfd, pinsn >> 32,
15265 contents + rel->r_offset);
15266 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
15267 contents + rel->r_offset + 4);
15268 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
15269 r_symndx = STN_UNDEF;
15270 r_type = R_PPC64_TPREL34;
15271 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15272 goto again;
15273 }
15274 break;
15275
727fc41e 15276 case R_PPC64_TLSGD:
37da22e5 15277 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
675e2809 15278 && rel + 1 < relend)
727fc41e 15279 {
b9f04fe0 15280 unsigned int insn2;
5663e321 15281 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 15282
4a421c53 15283 offset = rel->r_offset;
5663e321 15284 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
15285 {
15286 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
15287 if (r_type1 == R_PPC64_PLT_PCREL34
15288 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
15289 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
15290 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
15291 break;
15292 }
15293
15294 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
15295 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
15296
b00a0a86 15297 if ((tls_mask & TLS_GDIE) != 0)
727fc41e
AM
15298 {
15299 /* IE */
15300 r_type = R_PPC64_NONE;
15301 insn2 = 0x7c636a14; /* add 3,3,13 */
15302 }
15303 else
15304 {
15305 /* LE */
15306 if (toc_symndx != 0)
15307 {
15308 r_symndx = toc_symndx;
15309 rel->r_addend = toc_addend;
15310 }
c213164a
AM
15311 if (r_type1 == R_PPC64_REL24_NOTOC
15312 || r_type1 == R_PPC64_PLTCALL_NOTOC)
15313 {
15314 r_type = R_PPC64_NONE;
15315 insn2 = NOP;
15316 }
15317 else
15318 {
15319 rel->r_offset = offset + d_offset;
15320 r_type = R_PPC64_TPREL16_LO;
15321 insn2 = 0x38630000; /* addi 3,3,0 */
15322 }
727fc41e
AM
15323 }
15324 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15325 /* Zap the reloc on the _tls_get_addr call too. */
15326 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 15327 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 15328 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
15329 if ((tls_mask & TLS_GDIE) == 0
15330 && toc_symndx != 0
15331 && r_type != R_PPC64_NONE)
c316a17c 15332 goto again;
411e1bfb 15333 }
411e1bfb
AM
15334 break;
15335
727fc41e 15336 case R_PPC64_TLSLD:
37da22e5 15337 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
675e2809 15338 && rel + 1 < relend)
727fc41e 15339 {
b9f04fe0 15340 unsigned int insn2;
5663e321 15341 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 15342
4a421c53 15343 offset = rel->r_offset;
5663e321 15344 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
15345 {
15346 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
15347 if (r_type1 == R_PPC64_PLT_PCREL34
15348 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
15349 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
15350 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
15351 break;
15352 }
15353
15354 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
15355 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
15356
c213164a
AM
15357 if (r_type1 == R_PPC64_REL24_NOTOC
15358 || r_type1 == R_PPC64_PLTCALL_NOTOC)
15359 {
15360 r_type = R_PPC64_NONE;
15361 insn2 = NOP;
15362 }
15363 else
15364 {
15365 rel->r_offset = offset + d_offset;
15366 r_symndx = STN_UNDEF;
15367 r_type = R_PPC64_TPREL16_LO;
15368 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
15369 insn2 = 0x38630000; /* addi 3,3,0 */
15370 }
727fc41e 15371 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
15372 /* Zap the reloc on the _tls_get_addr call too. */
15373 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 15374 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 15375 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
15376 if (r_type != R_PPC64_NONE)
15377 goto again;
727fc41e
AM
15378 }
15379 break;
15380
411e1bfb 15381 case R_PPC64_DTPMOD64:
951fd09b
AM
15382 if (rel + 1 < relend
15383 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
15384 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 15385 {
951fd09b
AM
15386 if ((tls_mask & TLS_GD) == 0)
15387 {
15388 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
b00a0a86 15389 if ((tls_mask & TLS_GDIE) != 0)
951fd09b
AM
15390 r_type = R_PPC64_TPREL64;
15391 else
15392 {
4ce794b7 15393 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
15394 r_type = R_PPC64_NONE;
15395 }
15396 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15397 }
15398 }
15399 else
15400 {
15401 if ((tls_mask & TLS_LD) == 0)
411e1bfb 15402 {
4ce794b7 15403 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 15404 r_type = R_PPC64_NONE;
951fd09b 15405 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 15406 }
411e1bfb
AM
15407 }
15408 break;
15409
15410 case R_PPC64_TPREL64:
951fd09b 15411 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
15412 {
15413 r_type = R_PPC64_NONE;
15414 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15415 }
15416 break;
52a82034 15417
006589cf
AM
15418 case R_PPC64_ENTRY:
15419 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
15420 if (!bfd_link_pic (info)
15421 && !info->traditional_format
15422 && relocation + 0x80008000 <= 0xffffffff)
15423 {
15424 unsigned int insn1, insn2;
15425
15426 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15427 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15428 if ((insn1 & ~0xfffc) == LD_R2_0R12
15429 && insn2 == ADD_R2_R2_R12)
15430 {
95f0d0d2 15431 bfd_put_32 (input_bfd,
006589cf
AM
15432 LIS_R2 + PPC_HA (relocation),
15433 contents + rel->r_offset);
95f0d0d2 15434 bfd_put_32 (input_bfd,
006589cf
AM
15435 ADDI_R2_R2 + PPC_LO (relocation),
15436 contents + rel->r_offset + 4);
15437 }
15438 }
15439 else
15440 {
15441 relocation -= (rel->r_offset
15442 + input_section->output_offset
15443 + input_section->output_section->vma);
15444 if (relocation + 0x80008000 <= 0xffffffff)
15445 {
15446 unsigned int insn1, insn2;
15447
15448 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15449 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15450 if ((insn1 & ~0xfffc) == LD_R2_0R12
15451 && insn2 == ADD_R2_R2_R12)
15452 {
95f0d0d2 15453 bfd_put_32 (input_bfd,
006589cf
AM
15454 ADDIS_R2_R12 + PPC_HA (relocation),
15455 contents + rel->r_offset);
95f0d0d2 15456 bfd_put_32 (input_bfd,
006589cf
AM
15457 ADDI_R2_R2 + PPC_LO (relocation),
15458 contents + rel->r_offset + 4);
15459 }
15460 }
15461 }
15462 break;
15463
52a82034
AM
15464 case R_PPC64_REL16_HA:
15465 /* If we are generating a non-PIC executable, edit
15466 . 0: addis 2,12,.TOC.-0b@ha
15467 . addi 2,2,.TOC.-0b@l
15468 used by ELFv2 global entry points to set up r2, to
15469 . lis 2,.TOC.@ha
15470 . addi 2,2,.TOC.@l
15471 if .TOC. is in range. */
0e1862bb 15472 if (!bfd_link_pic (info)
810d4e75 15473 && !info->traditional_format
006589cf 15474 && !htab->opd_abi
4f038ee5 15475 && rel->r_addend == d_offset
52a82034
AM
15476 && h != NULL && &h->elf == htab->elf.hgot
15477 && rel + 1 < relend
15478 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
15479 && rel[1].r_offset == rel->r_offset + 4
15480 && rel[1].r_addend == rel->r_addend + 4
15481 && relocation + 0x80008000 <= 0xffffffff)
15482 {
15483 unsigned int insn1, insn2;
4a421c53 15484 offset = rel->r_offset - d_offset;
95f0d0d2
AM
15485 insn1 = bfd_get_32 (input_bfd, contents + offset);
15486 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
006589cf
AM
15487 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
15488 && (insn2 & 0xffff0000) == ADDI_R2_R2)
52a82034
AM
15489 {
15490 r_type = R_PPC64_ADDR16_HA;
15491 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15492 rel->r_addend -= d_offset;
15493 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
15494 rel[1].r_addend -= d_offset + 4;
95f0d0d2 15495 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
52a82034
AM
15496 }
15497 }
15498 break;
411e1bfb
AM
15499 }
15500
15501 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 15502 insn = 0;
b25116a9
AM
15503 max_br_offset = 1 << 25;
15504 addend = rel->r_addend;
bc30df16 15505 reloc_dest = DEST_NORMAL;
65f38f15 15506 switch (r_type)
5bd4f169
AM
15507 {
15508 default:
65f38f15 15509 break;
5bd4f169 15510
3b421ab3
AM
15511 case R_PPC64_TOCSAVE:
15512 if (relocation + addend == (rel->r_offset
15513 + input_section->output_offset
15514 + input_section->output_section->vma)
15515 && tocsave_find (htab, NO_INSERT,
15516 &local_syms, rel, input_bfd))
15517 {
15518 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15519 if (insn == NOP
15520 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
15521 bfd_put_32 (input_bfd,
15522 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
15523 contents + rel->r_offset);
15524 }
15525 break;
15526
65f38f15
AM
15527 /* Branch taken prediction relocations. */
15528 case R_PPC64_ADDR14_BRTAKEN:
15529 case R_PPC64_REL14_BRTAKEN:
cedb70c5 15530 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
1a0670f3 15531 /* Fall through. */
65f38f15 15532
86c76c7b 15533 /* Branch not taken prediction relocations. */
65f38f15
AM
15534 case R_PPC64_ADDR14_BRNTAKEN:
15535 case R_PPC64_REL14_BRNTAKEN:
95f0d0d2 15536 insn |= bfd_get_32 (input_bfd,
411e1bfb 15537 contents + rel->r_offset) & ~(0x01 << 21);
1a0670f3 15538 /* Fall through. */
86c76c7b 15539
b25116a9
AM
15540 case R_PPC64_REL14:
15541 max_br_offset = 1 << 15;
1a0670f3 15542 /* Fall through. */
5bd4f169 15543
65f38f15 15544 case R_PPC64_REL24:
05d0e962 15545 case R_PPC64_REL24_NOTOC:
23cedd1d 15546 case R_PPC64_PLTCALL:
5663e321 15547 case R_PPC64_PLTCALL_NOTOC:
ad8e1ba5
AM
15548 /* Calls to functions with a different TOC, such as calls to
15549 shared objects, need to alter the TOC pointer. This is
15550 done using a linkage stub. A REL24 branching to these
15551 linkage stubs needs to be followed by a nop, as the nop
15552 will be replaced with an instruction to restore the TOC
15553 base pointer. */
8387904d 15554 fdh = h;
b31867b6
AM
15555 if (h != NULL
15556 && h->oh != NULL
15557 && h->oh->is_func_descriptor)
15558 fdh = ppc_follow_link (h->oh);
31c76678
DK
15559 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
15560 htab);
5663e321
AM
15561 if ((r_type == R_PPC64_PLTCALL
15562 || r_type == R_PPC64_PLTCALL_NOTOC)
23cedd1d 15563 && stub_entry != NULL
05d0e962
AM
15564 && stub_entry->stub_type >= ppc_stub_plt_call
15565 && stub_entry->stub_type <= ppc_stub_plt_call_both)
23cedd1d
AM
15566 stub_entry = NULL;
15567
6abec6bc 15568 if (stub_entry != NULL
d0abeec8
AM
15569 && ((stub_entry->stub_type >= ppc_stub_plt_call
15570 && stub_entry->stub_type <= ppc_stub_plt_call_both)
ad8e1ba5 15571 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
05d0e962
AM
15572 || stub_entry->stub_type == ppc_stub_plt_branch_both
15573 || stub_entry->stub_type == ppc_stub_long_branch_r2off
15574 || stub_entry->stub_type == ppc_stub_long_branch_both))
41bd81ab 15575 {
b25116a9 15576 bfd_boolean can_plt_call = FALSE;
721956f4 15577
6e1816be
AM
15578 if (stub_entry->stub_type == ppc_stub_plt_call
15579 && !htab->opd_abi
15580 && htab->params->plt_localentry0 != 0
15581 && is_elfv2_localentry0 (&h->elf))
15582 {
15583 /* The function doesn't use or change r2. */
15584 can_plt_call = TRUE;
15585 }
05d0e962
AM
15586 else if (r_type == R_PPC64_REL24_NOTOC)
15587 {
15588 /* NOTOC calls don't need to restore r2. */
15589 can_plt_call = TRUE;
15590 }
6e1816be 15591
f378ab09 15592 /* All of these stubs may modify r2, so there must be a
ba8ca3e7
AM
15593 branch and link followed by a nop. The nop is
15594 replaced by an insn to restore r2. */
6e1816be 15595 else if (rel->r_offset + 8 <= input_section->size)
41bd81ab 15596 {
ba8ca3e7
AM
15597 unsigned long br;
15598
15599 br = bfd_get_32 (input_bfd,
15600 contents + rel->r_offset);
15601 if ((br & 1) != 0)
41bd81ab 15602 {
ba8ca3e7
AM
15603 unsigned long nop;
15604
15605 nop = bfd_get_32 (input_bfd,
15606 contents + rel->r_offset + 4);
23cedd1d
AM
15607 if (nop == LD_R2_0R1 + STK_TOC (htab))
15608 can_plt_call = TRUE;
15609 else if (nop == NOP
15610 || nop == CROR_151515
15611 || nop == CROR_313131)
a7f2871e 15612 {
ba8ca3e7 15613 if (h != NULL
ed7007c1 15614 && is_tls_get_addr (&h->elf, htab)
7c9cf415 15615 && htab->params->tls_get_addr_opt)
ba8ca3e7
AM
15616 {
15617 /* Special stub used, leave nop alone. */
15618 }
15619 else
a078d95a
AM
15620 bfd_put_32 (input_bfd,
15621 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7
AM
15622 contents + rel->r_offset + 4);
15623 can_plt_call = TRUE;
a7f2871e 15624 }
41bd81ab 15625 }
5bd4f169 15626 }
721956f4 15627
ba8ca3e7 15628 if (!can_plt_call && h != NULL)
721956f4 15629 {
ba8ca3e7
AM
15630 const char *name = h->elf.root.root.string;
15631
15632 if (*name == '.')
15633 ++name;
15634
15635 if (strncmp (name, "__libc_start_main", 17) == 0
15636 && (name[17] == 0 || name[17] == '@'))
6ab189d5 15637 {
ba8ca3e7
AM
15638 /* Allow crt1 branch to go via a toc adjusting
15639 stub. Other calls that never return could do
15640 the same, if we could detect such. */
b25116a9 15641 can_plt_call = TRUE;
6ab189d5 15642 }
ba8ca3e7
AM
15643 }
15644
15645 if (!can_plt_call)
15646 {
15647 /* g++ as of 20130507 emits self-calls without a
15648 following nop. This is arguably wrong since we
15649 have conflicting information. On the one hand a
15650 global symbol and on the other a local call
15651 sequence, but don't error for this special case.
15652 It isn't possible to cheaply verify we have
15653 exactly such a call. Allow all calls to the same
15654 section. */
15655 asection *code_sec = sec;
15656
15657 if (get_opd_info (sec) != NULL)
ad8e1ba5 15658 {
ba8ca3e7
AM
15659 bfd_vma off = (relocation + addend
15660 - sec->output_section->vma
15661 - sec->output_offset);
bc30df16 15662
ba8ca3e7 15663 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 15664 }
ba8ca3e7
AM
15665 if (code_sec == input_section)
15666 can_plt_call = TRUE;
15667 }
15668
15669 if (!can_plt_call)
15670 {
05d0e962
AM
15671 if (stub_entry->stub_type >= ppc_stub_plt_call
15672 && stub_entry->stub_type <= ppc_stub_plt_call_both)
4805fc55 15673 info->callbacks->einfo
695344c0 15674 /* xgettext:c-format */
c1c8c1ef 15675 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15676 "(plt call stub)\n"),
4805fc55
AM
15677 input_bfd, input_section, rel->r_offset, sym_name);
15678 else
15679 info->callbacks->einfo
695344c0 15680 /* xgettext:c-format */
c1c8c1ef 15681 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15682 "(toc save/adjust stub)\n"),
4805fc55 15683 input_bfd, input_section, rel->r_offset, sym_name);
ba8ca3e7
AM
15684
15685 bfd_set_error (bfd_error_bad_value);
15686 ret = FALSE;
721956f4
AM
15687 }
15688
b25116a9 15689 if (can_plt_call
05d0e962
AM
15690 && stub_entry->stub_type >= ppc_stub_plt_call
15691 && stub_entry->stub_type <= ppc_stub_plt_call_both)
b25116a9
AM
15692 unresolved_reloc = FALSE;
15693 }
15694
6abec6bc
AM
15695 if ((stub_entry == NULL
15696 || stub_entry->stub_type == ppc_stub_long_branch
15697 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
15698 && get_opd_info (sec) != NULL)
15699 {
15700 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
15701 bfd_vma off = (relocation + addend
15702 - sec->output_section->vma
15703 - sec->output_offset);
aef36ac1 15704 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
15705 if (dest != (bfd_vma) -1)
15706 {
15707 relocation = dest;
15708 addend = 0;
bc30df16 15709 reloc_dest = DEST_OPD;
8387904d
AM
15710 }
15711 }
15712
b25116a9
AM
15713 /* If the branch is out of reach we ought to have a long
15714 branch stub. */
15715 from = (rel->r_offset
15716 + input_section->output_offset
15717 + input_section->output_section->vma);
15718
6911b7dc
AM
15719 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
15720 ? fdh->elf.other
15721 : sym->st_other);
15722
6abec6bc
AM
15723 if (stub_entry != NULL
15724 && (stub_entry->stub_type == ppc_stub_long_branch
15725 || stub_entry->stub_type == ppc_stub_plt_branch)
15726 && (r_type == R_PPC64_ADDR14_BRTAKEN
15727 || r_type == R_PPC64_ADDR14_BRNTAKEN
15728 || (relocation + addend - from + max_br_offset
15729 < 2 * max_br_offset)))
15730 /* Don't use the stub if this branch is in range. */
15731 stub_entry = NULL;
b25116a9 15732
05d0e962
AM
15733 if (stub_entry != NULL
15734 && (stub_entry->stub_type == ppc_stub_long_branch_notoc
15735 || stub_entry->stub_type == ppc_stub_long_branch_both
15736 || stub_entry->stub_type == ppc_stub_plt_branch_notoc
15737 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15738 && (r_type != R_PPC64_REL24_NOTOC
15739 || ((fdh ? fdh->elf.other : sym->st_other)
4a4e7361 15740 & STO_PPC64_LOCAL_MASK) <= 1 << STO_PPC64_LOCAL_BIT)
05d0e962
AM
15741 && (relocation + addend - from + max_br_offset
15742 < 2 * max_br_offset))
15743 stub_entry = NULL;
15744
15745 if (stub_entry != NULL
15746 && (stub_entry->stub_type == ppc_stub_long_branch_r2off
15747 || stub_entry->stub_type == ppc_stub_long_branch_both
15748 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
15749 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15750 && r_type == R_PPC64_REL24_NOTOC
15751 && (relocation + addend - from + max_br_offset
15752 < 2 * max_br_offset))
15753 stub_entry = NULL;
15754
b25116a9
AM
15755 if (stub_entry != NULL)
15756 {
15757 /* Munge up the value and addend so that we call the stub
15758 rather than the procedure directly. */
a4b6fadd
AM
15759 asection *stub_sec = stub_entry->group->stub_sec;
15760
15761 if (stub_entry->stub_type == ppc_stub_save_res)
15762 relocation += (stub_sec->output_offset
15763 + stub_sec->output_section->vma
15764 + stub_sec->size - htab->sfpr->size
15765 - htab->sfpr->output_offset
15766 - htab->sfpr->output_section->vma);
15767 else
15768 relocation = (stub_entry->stub_offset
15769 + stub_sec->output_offset
15770 + stub_sec->output_section->vma);
b25116a9 15771 addend = 0;
bc30df16 15772 reloc_dest = DEST_STUB;
3b421ab3 15773
05d0e962
AM
15774 if (((stub_entry->stub_type == ppc_stub_plt_call
15775 && ALWAYS_EMIT_R2SAVE)
15776 || stub_entry->stub_type == ppc_stub_plt_call_r2save
15777 || stub_entry->stub_type == ppc_stub_plt_call_both)
e81b4c93 15778 && !(h != NULL
ed7007c1 15779 && is_tls_get_addr (&h->elf, htab)
e81b4c93 15780 && htab->params->tls_get_addr_opt)
3b421ab3
AM
15781 && rel + 1 < relend
15782 && rel[1].r_offset == rel->r_offset + 4
15783 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
15784 relocation += 4;
05d0e962
AM
15785 else if ((stub_entry->stub_type == ppc_stub_long_branch_both
15786 || stub_entry->stub_type == ppc_stub_plt_branch_both
15787 || stub_entry->stub_type == ppc_stub_plt_call_both)
15788 && r_type == R_PPC64_REL24_NOTOC)
15789 relocation += 4;
5663e321
AM
15790
15791 if (r_type == R_PPC64_REL24_NOTOC
15792 && (stub_entry->stub_type == ppc_stub_plt_call_notoc
15793 || stub_entry->stub_type == ppc_stub_plt_call_both))
15794 htab->notoc_plt = 1;
b25116a9
AM
15795 }
15796
15797 if (insn != 0)
15798 {
794e51c0 15799 if (is_isa_v2)
721956f4 15800 {
b25116a9
AM
15801 /* Set 'a' bit. This is 0b00010 in BO field for branch
15802 on CR(BI) insns (BO == 001at or 011at), and 0b01000
15803 for branch on CTR insns (BO == 1a00t or 1a01t). */
15804 if ((insn & (0x14 << 21)) == (0x04 << 21))
15805 insn |= 0x02 << 21;
15806 else if ((insn & (0x14 << 21)) == (0x10 << 21))
15807 insn |= 0x08 << 21;
15808 else
15809 break;
15810 }
15811 else
15812 {
15813 /* Invert 'y' bit if not the default. */
4cc603a5 15814 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 15815 insn ^= 0x01 << 21;
721956f4 15816 }
b25116a9 15817
95f0d0d2 15818 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
5bd4f169 15819 }
e86ce104 15820
06da1e8e
AM
15821 /* NOP out calls to undefined weak functions.
15822 We can thus call a weak function without first
15823 checking whether the function is defined. */
b25116a9 15824 else if (h != NULL
039b3fef 15825 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 15826 && h->elf.dynindx == -1
05d0e962
AM
15827 && (r_type == R_PPC64_REL24
15828 || r_type == R_PPC64_REL24_NOTOC)
b25116a9 15829 && relocation == 0
4cc603a5 15830 && addend == 0)
e86ce104 15831 {
95f0d0d2 15832 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
c316a17c 15833 goto copy_reloc;
e86ce104 15834 }
65f38f15 15835 break;
066f4018
AM
15836
15837 case R_PPC64_GOT16_DS:
06507dab
AM
15838 if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
15839 break;
066f4018
AM
15840 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15841 if (relocation + addend - from + 0x8000 < 0x10000
15842 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15843 {
15844 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15845 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15846 {
15847 insn += (14u << 26) - (58u << 26);
15848 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15849 r_type = R_PPC64_TOC16;
15850 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15851 }
15852 }
15853 break;
15854
15855 case R_PPC64_GOT16_LO_DS:
15856 case R_PPC64_GOT16_HA:
06507dab
AM
15857 if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
15858 break;
066f4018
AM
15859 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15860 if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
15861 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15862 {
15863 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15864 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15865 {
15866 insn += (14u << 26) - (58u << 26);
15867 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15868 r_type = R_PPC64_TOC16_LO;
15869 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15870 }
2365f8d7 15871 else if ((insn & (0x3fu << 26)) == 15u << 26 /* addis */)
066f4018
AM
15872 {
15873 r_type = R_PPC64_TOC16_HA;
15874 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15875 }
15876 }
15877 break;
4a421c53
AM
15878
15879 case R_PPC64_GOT_PCREL34:
06507dab
AM
15880 if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
15881 break;
4a421c53
AM
15882 from = (rel->r_offset
15883 + input_section->output_section->vma
15884 + input_section->output_offset);
15885 if (relocation - from + (1ULL << 33) < 1ULL << 34
15886 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15887 {
15888 offset = rel->r_offset;
15889 pinsn = bfd_get_32 (input_bfd, contents + offset);
15890 pinsn <<= 32;
15891 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15892 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15893 == ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
15894 {
15895 /* Replace with paddi. */
15896 pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
15897 r_type = R_PPC64_PCREL34;
15898 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15899 bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
15900 bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
15901 goto pcrelopt;
15902 }
15903 }
15904 break;
15905
15906 case R_PPC64_PCREL34:
15907 if (SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15908 {
15909 offset = rel->r_offset;
15910 pinsn = bfd_get_32 (input_bfd, contents + offset);
15911 pinsn <<= 32;
15912 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15913 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15914 == ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
15915 | (14ULL << 26) /* paddi */))
15916 {
15917 pcrelopt:
15918 if (rel + 1 < relend
15919 && rel[1].r_offset == offset
15920 && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT))
15921 {
15922 bfd_vma off2 = rel[1].r_addend;
15923 if (off2 == 0)
15924 /* zero means next insn. */
15925 off2 = 8;
15926 off2 += offset;
15927 if (off2 + 4 <= input_section->size)
15928 {
15929 uint64_t pinsn2;
dd9b12c2 15930 bfd_signed_vma addend_off;
4a421c53
AM
15931 pinsn2 = bfd_get_32 (input_bfd, contents + off2);
15932 pinsn2 <<= 32;
15933 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
77486630
AM
15934 {
15935 if (off2 + 8 > input_section->size)
15936 break;
15937 pinsn2 |= bfd_get_32 (input_bfd,
15938 contents + off2 + 4);
15939 }
dd9b12c2 15940 if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
4a421c53 15941 {
dd9b12c2
AM
15942 addend += addend_off;
15943 rel->r_addend = addend;
4a421c53
AM
15944 bfd_put_32 (input_bfd, pinsn >> 32,
15945 contents + offset);
15946 bfd_put_32 (input_bfd, pinsn,
15947 contents + offset + 4);
15948 bfd_put_32 (input_bfd, pinsn2 >> 32,
15949 contents + off2);
77486630
AM
15950 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
15951 bfd_put_32 (input_bfd, pinsn2,
15952 contents + off2 + 4);
4a421c53
AM
15953 }
15954 }
15955 }
15956 }
15957 }
15958 break;
65f38f15 15959 }
5bd4f169 15960
411e1bfb 15961 tls_type = 0;
23cedd1d 15962 save_unresolved_reloc = unresolved_reloc;
65f38f15
AM
15963 switch (r_type)
15964 {
15965 default:
cf97bcb0
AM
15966 /* xgettext:c-format */
15967 _bfd_error_handler (_("%pB: %s unsupported"),
15968 input_bfd, ppc64_elf_howto_table[r_type]->name);
5bd4f169 15969
65f38f15 15970 bfd_set_error (bfd_error_bad_value);
b34976b6 15971 ret = FALSE;
c316a17c 15972 goto copy_reloc;
5bd4f169 15973
65f38f15 15974 case R_PPC64_NONE:
411e1bfb 15975 case R_PPC64_TLS:
727fc41e
AM
15976 case R_PPC64_TLSGD:
15977 case R_PPC64_TLSLD:
3b421ab3 15978 case R_PPC64_TOCSAVE:
04c9666a
AM
15979 case R_PPC64_GNU_VTINHERIT:
15980 case R_PPC64_GNU_VTENTRY:
006589cf 15981 case R_PPC64_ENTRY:
4a421c53 15982 case R_PPC64_PCREL_OPT:
c316a17c 15983 goto copy_reloc;
5bd4f169
AM
15984
15985 /* GOT16 relocations. Like an ADDR16 using the symbol's
15986 address in the GOT as relocation value instead of the
411e1bfb 15987 symbol's value itself. Also, create a GOT entry for the
5bd4f169 15988 symbol and put the symbol value there. */
411e1bfb
AM
15989 case R_PPC64_GOT_TLSGD16:
15990 case R_PPC64_GOT_TLSGD16_LO:
15991 case R_PPC64_GOT_TLSGD16_HI:
15992 case R_PPC64_GOT_TLSGD16_HA:
87c69f97 15993 case R_PPC64_GOT_TLSGD_PCREL34:
951fd09b 15994 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
15995 goto dogot;
15996
15997 case R_PPC64_GOT_TLSLD16:
15998 case R_PPC64_GOT_TLSLD16_LO:
15999 case R_PPC64_GOT_TLSLD16_HI:
16000 case R_PPC64_GOT_TLSLD16_HA:
87c69f97 16001 case R_PPC64_GOT_TLSLD_PCREL34:
951fd09b 16002 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
16003 goto dogot;
16004
16005 case R_PPC64_GOT_TPREL16_DS:
16006 case R_PPC64_GOT_TPREL16_LO_DS:
16007 case R_PPC64_GOT_TPREL16_HI:
16008 case R_PPC64_GOT_TPREL16_HA:
87c69f97 16009 case R_PPC64_GOT_TPREL_PCREL34:
411e1bfb
AM
16010 tls_type = TLS_TLS | TLS_TPREL;
16011 goto dogot;
16012
16013 case R_PPC64_GOT_DTPREL16_DS:
16014 case R_PPC64_GOT_DTPREL16_LO_DS:
16015 case R_PPC64_GOT_DTPREL16_HI:
16016 case R_PPC64_GOT_DTPREL16_HA:
87c69f97 16017 case R_PPC64_GOT_DTPREL_PCREL34:
411e1bfb
AM
16018 tls_type = TLS_TLS | TLS_DTPREL;
16019 goto dogot;
16020
65f38f15
AM
16021 case R_PPC64_GOT16:
16022 case R_PPC64_GOT16_LO:
16023 case R_PPC64_GOT16_HI:
16024 case R_PPC64_GOT16_HA:
16025 case R_PPC64_GOT16_DS:
16026 case R_PPC64_GOT16_LO_DS:
5663e321 16027 case R_PPC64_GOT_PCREL34:
411e1bfb 16028 dogot:
5bd4f169
AM
16029 {
16030 /* Relocation is to the entry for this symbol in the global
16031 offset table. */
e717da7e 16032 asection *got;
d881513a 16033 bfd_vma *offp;
5bd4f169 16034 bfd_vma off;
d881513a 16035 unsigned long indx = 0;
927be08e 16036 struct got_entry *ent;
65f38f15 16037
d881513a 16038 if (tls_type == (TLS_TLS | TLS_LD)
f749f26e 16039 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
927be08e 16040 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 16041 else
5bd4f169 16042 {
d881513a
AM
16043 if (h != NULL)
16044 {
f0158f44
AM
16045 if (!htab->elf.dynamic_sections_created
16046 || h->elf.dynindx == -1
16047 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
21d68fcd 16048 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
d881513a
AM
16049 /* This is actually a static link, or it is a
16050 -Bsymbolic link and the symbol is defined
16051 locally, or the symbol was forced to be local
16052 because of a version file. */
16053 ;
16054 else
16055 {
039b3fef 16056 indx = h->elf.dynindx;
d881513a
AM
16057 unresolved_reloc = FALSE;
16058 }
039b3fef 16059 ent = h->elf.got.glist;
d881513a 16060 }
411e1bfb 16061 else
5bd4f169 16062 {
d881513a
AM
16063 if (local_got_ents == NULL)
16064 abort ();
16065 ent = local_got_ents[r_symndx];
5bd4f169 16066 }
d881513a
AM
16067
16068 for (; ent != NULL; ent = ent->next)
133a1f60 16069 if (ent->addend == orig_rel.r_addend
e717da7e 16070 && ent->owner == input_bfd
d881513a
AM
16071 && ent->tls_type == tls_type)
16072 break;
5bd4f169 16073 }
411e1bfb 16074
927be08e
AM
16075 if (ent == NULL)
16076 abort ();
16077 if (ent->is_indirect)
16078 ent = ent->got.ent;
16079 offp = &ent->got.offset;
16080 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
16081 if (got == NULL)
16082 abort ();
16083
411e1bfb
AM
16084 /* The offset must always be a multiple of 8. We use the
16085 least significant bit to record whether we have already
16086 processed this entry. */
d881513a 16087 off = *offp;
411e1bfb
AM
16088 if ((off & 1) != 0)
16089 off &= ~1;
5bd4f169
AM
16090 else
16091 {
411e1bfb
AM
16092 /* Generate relocs for the dynamic linker, except in
16093 the case of TLSLD where we'll use one entry per
16094 module. */
25f23106
AM
16095 asection *relgot;
16096 bfd_boolean ifunc;
e717da7e 16097
d881513a 16098 *offp = off | 1;
25f23106
AM
16099 relgot = NULL;
16100 ifunc = (h != NULL
16101 ? h->elf.type == STT_GNU_IFUNC
16102 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 16103 if (ifunc)
82e66161
AM
16104 {
16105 relgot = htab->elf.irelplt;
16106 if (indx == 0)
16107 htab->local_ifunc_resolver = 1;
16108 else if (is_static_defined (&h->elf))
16109 htab->maybe_local_ifunc_resolver = 1;
16110 }
f0158f44
AM
16111 else if (indx != 0
16112 || (bfd_link_pic (info)
16113 && (h == NULL
f749f26e
AM
16114 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
16115 && !(tls_type != 0
f15d0b54
AM
16116 && bfd_link_executable (info)
16117 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
19e08130 16118 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 16119 if (relgot != NULL)
5bd4f169 16120 {
e717da7e
AM
16121 outrel.r_offset = (got->output_section->vma
16122 + got->output_offset
411e1bfb 16123 + off);
133a1f60 16124 outrel.r_addend = orig_rel.r_addend;
d881513a 16125 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 16126 {
411e1bfb 16127 outrel.r_addend = 0;
e515b051 16128 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
16129 if (tls_type == (TLS_TLS | TLS_GD))
16130 {
e717da7e
AM
16131 loc = relgot->contents;
16132 loc += (relgot->reloc_count++
d881513a
AM
16133 * sizeof (Elf64_External_Rela));
16134 bfd_elf64_swap_reloca_out (output_bfd,
16135 &outrel, loc);
e515b051 16136 outrel.r_offset += 8;
133a1f60 16137 outrel.r_addend = orig_rel.r_addend;
d881513a
AM
16138 outrel.r_info
16139 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 16140 }
411e1bfb 16141 }
951fd09b 16142 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 16143 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 16144 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 16145 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
16146 else if (indx != 0)
16147 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
16148 else
81407a69 16149 {
25f23106
AM
16150 if (ifunc)
16151 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
16152 else
16153 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
16154
16155 /* Write the .got section contents for the sake
16156 of prelink. */
e717da7e 16157 loc = got->contents + off;
23fbd6fa
JJ
16158 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
16159 loc);
81407a69 16160 }
81407a69
AM
16161
16162 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
16163 {
16164 outrel.r_addend += relocation;
16165 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
989f9879
AM
16166 {
16167 if (htab->elf.tls_sec == NULL)
16168 outrel.r_addend = 0;
16169 else
16170 outrel.r_addend -= htab->elf.tls_sec->vma;
16171 }
e515b051 16172 }
e717da7e
AM
16173 loc = relgot->contents;
16174 loc += (relgot->reloc_count++
411e1bfb
AM
16175 * sizeof (Elf64_External_Rela));
16176 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
16177 }
16178
ad8e1ba5 16179 /* Init the .got section contents here if we're not
81407a69 16180 emitting a reloc. */
d881513a 16181 else
411e1bfb 16182 {
133a1f60 16183 relocation += orig_rel.r_addend;
f0158f44 16184 if (tls_type != 0)
411e1bfb 16185 {
989f9879
AM
16186 if (htab->elf.tls_sec == NULL)
16187 relocation = 0;
16188 else
16189 {
f0158f44
AM
16190 if (tls_type & TLS_LD)
16191 relocation = 0;
16192 else
16193 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
676ee2b5 16194 if (tls_type & TLS_TPREL)
989f9879
AM
16195 relocation += DTP_OFFSET - TP_OFFSET;
16196 }
5bd4f169 16197
f0158f44 16198 if (tls_type & (TLS_GD | TLS_LD))
7b609f53
AM
16199 {
16200 bfd_put_64 (output_bfd, relocation,
e717da7e 16201 got->contents + off + 8);
676ee2b5 16202 relocation = 1;
7b609f53 16203 }
411e1bfb
AM
16204 }
16205 bfd_put_64 (output_bfd, relocation,
e717da7e 16206 got->contents + off);
5bd4f169
AM
16207 }
16208 }
16209
65f38f15
AM
16210 if (off >= (bfd_vma) -2)
16211 abort ();
16212
bf102f86 16213 relocation = got->output_section->vma + got->output_offset + off;
133a1f60 16214 addend = 0;
c213164a 16215 if (!(r_type == R_PPC64_GOT_PCREL34
87c69f97
AM
16216 || r_type == R_PPC64_GOT_TLSGD_PCREL34
16217 || r_type == R_PPC64_GOT_TLSLD_PCREL34
16218 || r_type == R_PPC64_GOT_TPREL_PCREL34
16219 || r_type == R_PPC64_GOT_DTPREL_PCREL34))
5663e321 16220 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
5bd4f169 16221 }
65f38f15
AM
16222 break;
16223
16224 case R_PPC64_PLT16_HA:
16225 case R_PPC64_PLT16_HI:
16226 case R_PPC64_PLT16_LO:
08be3224 16227 case R_PPC64_PLT16_LO_DS:
5663e321
AM
16228 case R_PPC64_PLT_PCREL34:
16229 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
16230 case R_PPC64_PLT32:
16231 case R_PPC64_PLT64:
23cedd1d 16232 case R_PPC64_PLTSEQ:
5663e321 16233 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d 16234 case R_PPC64_PLTCALL:
5663e321 16235 case R_PPC64_PLTCALL_NOTOC:
65f38f15
AM
16236 /* Relocation is to the entry for this symbol in the
16237 procedure linkage table. */
23cedd1d 16238 unresolved_reloc = TRUE;
cbf95972
AM
16239 {
16240 struct plt_entry **plt_list = NULL;
16241 if (h != NULL)
16242 plt_list = &h->elf.plt.plist;
16243 else if (local_got_ents != NULL)
16244 {
16245 struct plt_entry **local_plt = (struct plt_entry **)
16246 (local_got_ents + symtab_hdr->sh_info);
2d7ad24e 16247 plt_list = local_plt + r_symndx;
cbf95972
AM
16248 }
16249 if (plt_list)
16250 {
16251 struct plt_entry *ent;
65f38f15 16252
cbf95972
AM
16253 for (ent = *plt_list; ent != NULL; ent = ent->next)
16254 if (ent->plt.offset != (bfd_vma) -1
133a1f60 16255 && ent->addend == orig_rel.r_addend)
cbf95972
AM
16256 {
16257 asection *plt;
08be3224 16258 bfd_vma got;
cbf95972
AM
16259
16260 plt = htab->elf.splt;
16261 if (!htab->elf.dynamic_sections_created
16262 || h == NULL
16263 || h->elf.dynindx == -1)
2d7ad24e
AM
16264 {
16265 if (h != NULL
16266 ? h->elf.type == STT_GNU_IFUNC
16267 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
16268 plt = htab->elf.iplt;
16269 else
16270 plt = htab->pltlocal;
16271 }
16272 relocation = (plt->output_section->vma
16273 + plt->output_offset
16274 + ent->plt.offset);
08be3224 16275 if (r_type == R_PPC64_PLT16_HA
2cdcc330
AM
16276 || r_type == R_PPC64_PLT16_HI
16277 || r_type == R_PPC64_PLT16_LO
16278 || r_type == R_PPC64_PLT16_LO_DS)
08be3224
AM
16279 {
16280 got = (elf_gp (output_bfd)
16281 + htab->sec_info[input_section->id].toc_off);
16282 relocation -= got;
16283 }
133a1f60 16284 addend = 0;
cbf95972
AM
16285 unresolved_reloc = FALSE;
16286 break;
16287 }
16288 }
16289 }
65f38f15 16290 break;
5bd4f169 16291
0b13192e
AM
16292 case R_PPC64_TOC:
16293 /* Relocation value is TOC base. */
16294 relocation = TOCstart;
cf35638d 16295 if (r_symndx == STN_UNDEF)
6f20ed8a 16296 relocation += htab->sec_info[input_section->id].toc_off;
8517fae7
AM
16297 else if (unresolved_reloc)
16298 ;
6f20ed8a
AM
16299 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
16300 relocation += htab->sec_info[sec->id].toc_off;
0b13192e
AM
16301 else
16302 unresolved_reloc = TRUE;
ab96bf03 16303 goto dodyn;
0b13192e 16304
5bd4f169
AM
16305 /* TOC16 relocs. We want the offset relative to the TOC base,
16306 which is the address of the start of the TOC plus 0x8000.
16307 The TOC consists of sections .got, .toc, .tocbss, and .plt,
16308 in this order. */
65f38f15
AM
16309 case R_PPC64_TOC16:
16310 case R_PPC64_TOC16_LO:
16311 case R_PPC64_TOC16_HI:
16312 case R_PPC64_TOC16_DS:
16313 case R_PPC64_TOC16_LO_DS:
16314 case R_PPC64_TOC16_HA:
6f20ed8a 16315 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
1bdd8fac
AM
16316 if (h != NULL)
16317 goto dodyn;
5bd4f169
AM
16318 break;
16319
16320 /* Relocate against the beginning of the section. */
65f38f15
AM
16321 case R_PPC64_SECTOFF:
16322 case R_PPC64_SECTOFF_LO:
16323 case R_PPC64_SECTOFF_HI:
16324 case R_PPC64_SECTOFF_DS:
16325 case R_PPC64_SECTOFF_LO_DS:
16326 case R_PPC64_SECTOFF_HA:
4ce794b7 16327 if (sec != NULL)
65f38f15 16328 addend -= sec->output_section->vma;
5bd4f169
AM
16329 break;
16330
25f23106
AM
16331 case R_PPC64_REL16:
16332 case R_PPC64_REL16_LO:
16333 case R_PPC64_REL16_HI:
16334 case R_PPC64_REL16_HA:
4a969973
AM
16335 case R_PPC64_REL16_HIGH:
16336 case R_PPC64_REL16_HIGHA:
16337 case R_PPC64_REL16_HIGHER:
16338 case R_PPC64_REL16_HIGHERA:
16339 case R_PPC64_REL16_HIGHEST:
16340 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
16341 case R_PPC64_REL16_HIGHER34:
16342 case R_PPC64_REL16_HIGHERA34:
16343 case R_PPC64_REL16_HIGHEST34:
16344 case R_PPC64_REL16_HIGHESTA34:
a680de9a 16345 case R_PPC64_REL16DX_HA:
721956f4
AM
16346 case R_PPC64_REL14:
16347 case R_PPC64_REL14_BRNTAKEN:
16348 case R_PPC64_REL14_BRTAKEN:
5d1634d7 16349 case R_PPC64_REL24:
05d0e962 16350 case R_PPC64_REL24_NOTOC:
5663e321
AM
16351 case R_PPC64_PCREL34:
16352 case R_PPC64_PCREL28:
5d1634d7
AM
16353 break;
16354
411e1bfb
AM
16355 case R_PPC64_TPREL16:
16356 case R_PPC64_TPREL16_LO:
16357 case R_PPC64_TPREL16_HI:
16358 case R_PPC64_TPREL16_HA:
16359 case R_PPC64_TPREL16_DS:
16360 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
16361 case R_PPC64_TPREL16_HIGH:
16362 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
16363 case R_PPC64_TPREL16_HIGHER:
16364 case R_PPC64_TPREL16_HIGHERA:
16365 case R_PPC64_TPREL16_HIGHEST:
16366 case R_PPC64_TPREL16_HIGHESTA:
c213164a 16367 case R_PPC64_TPREL34:
766bc656
AM
16368 if (h != NULL
16369 && h->elf.root.type == bfd_link_hash_undefweak
16370 && h->elf.dynindx == -1)
16371 {
16372 /* Make this relocation against an undefined weak symbol
16373 resolve to zero. This is really just a tweak, since
16374 code using weak externs ought to check that they are
16375 defined before using them. */
16376 bfd_byte *p = contents + rel->r_offset - d_offset;
16377
95f0d0d2 16378 insn = bfd_get_32 (input_bfd, p);
766bc656
AM
16379 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
16380 if (insn != 0)
95f0d0d2 16381 bfd_put_32 (input_bfd, insn, p);
766bc656
AM
16382 break;
16383 }
989f9879
AM
16384 if (htab->elf.tls_sec != NULL)
16385 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7c8bbca5
AM
16386 /* The TPREL16 relocs shouldn't really be used in shared
16387 libs or with non-local symbols as that will result in
16388 DT_TEXTREL being set, but support them anyway. */
16389 goto dodyn;
411e1bfb
AM
16390
16391 case R_PPC64_DTPREL16:
16392 case R_PPC64_DTPREL16_LO:
16393 case R_PPC64_DTPREL16_HI:
16394 case R_PPC64_DTPREL16_HA:
16395 case R_PPC64_DTPREL16_DS:
16396 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
16397 case R_PPC64_DTPREL16_HIGH:
16398 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
16399 case R_PPC64_DTPREL16_HIGHER:
16400 case R_PPC64_DTPREL16_HIGHERA:
16401 case R_PPC64_DTPREL16_HIGHEST:
16402 case R_PPC64_DTPREL16_HIGHESTA:
c213164a 16403 case R_PPC64_DTPREL34:
989f9879
AM
16404 if (htab->elf.tls_sec != NULL)
16405 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
16406 break;
16407
45965137
AM
16408 case R_PPC64_ADDR64_LOCAL:
16409 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
16410 ? h->elf.other
16411 : sym->st_other);
16412 break;
16413
e515b051
AM
16414 case R_PPC64_DTPMOD64:
16415 relocation = 1;
16416 addend = 0;
16417 goto dodyn;
16418
411e1bfb 16419 case R_PPC64_TPREL64:
989f9879
AM
16420 if (htab->elf.tls_sec != NULL)
16421 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
16422 goto dodyn;
16423
16424 case R_PPC64_DTPREL64:
989f9879
AM
16425 if (htab->elf.tls_sec != NULL)
16426 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
1a0670f3 16427 /* Fall through. */
411e1bfb 16428
65f38f15
AM
16429 /* Relocations that may need to be propagated if this is a
16430 dynamic object. */
04c9666a 16431 case R_PPC64_REL30:
65f38f15
AM
16432 case R_PPC64_REL32:
16433 case R_PPC64_REL64:
16434 case R_PPC64_ADDR14:
16435 case R_PPC64_ADDR14_BRNTAKEN:
16436 case R_PPC64_ADDR14_BRTAKEN:
16437 case R_PPC64_ADDR16:
16438 case R_PPC64_ADDR16_DS:
16439 case R_PPC64_ADDR16_HA:
16440 case R_PPC64_ADDR16_HI:
f9c6b907
AM
16441 case R_PPC64_ADDR16_HIGH:
16442 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16443 case R_PPC64_ADDR16_HIGHER:
16444 case R_PPC64_ADDR16_HIGHERA:
16445 case R_PPC64_ADDR16_HIGHEST:
16446 case R_PPC64_ADDR16_HIGHESTA:
16447 case R_PPC64_ADDR16_LO:
16448 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
16449 case R_PPC64_ADDR16_HIGHER34:
16450 case R_PPC64_ADDR16_HIGHERA34:
16451 case R_PPC64_ADDR16_HIGHEST34:
16452 case R_PPC64_ADDR16_HIGHESTA34:
65f38f15 16453 case R_PPC64_ADDR24:
65f38f15
AM
16454 case R_PPC64_ADDR32:
16455 case R_PPC64_ADDR64:
16456 case R_PPC64_UADDR16:
16457 case R_PPC64_UADDR32:
16458 case R_PPC64_UADDR64:
5663e321
AM
16459 case R_PPC64_D34:
16460 case R_PPC64_D34_LO:
16461 case R_PPC64_D34_HI30:
16462 case R_PPC64_D34_HA30:
16463 case R_PPC64_D28:
411e1bfb 16464 dodyn:
5d1634d7 16465 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
16466 break;
16467
41bd81ab
AM
16468 if (NO_OPD_RELOCS && is_opd)
16469 break;
16470
8a9e8e72 16471 if (bfd_link_pic (info)
b1b07054 16472 ? ((h == NULL
190eb1dd 16473 || h->elf.dyn_relocs != NULL)
b1b07054
AM
16474 && ((h != NULL && pc_dynrelocs (h))
16475 || must_be_dyn_reloc (info, r_type)))
8a9e8e72 16476 : (h != NULL
190eb1dd 16477 ? h->elf.dyn_relocs != NULL
d311bc8b 16478 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
65f38f15 16479 {
b34976b6 16480 bfd_boolean skip, relocate;
65f38f15 16481 asection *sreloc;
1cf1f670 16482 bfd_vma out_off;
82e66161 16483 long indx = 0;
65f38f15
AM
16484
16485 /* When generating a dynamic object, these relocations
16486 are copied into the output file to be resolved at run
16487 time. */
16488
b34976b6
AM
16489 skip = FALSE;
16490 relocate = FALSE;
65f38f15 16491
1cf1f670
AM
16492 out_off = _bfd_elf_section_offset (output_bfd, info,
16493 input_section, rel->r_offset);
16494 if (out_off == (bfd_vma) -1)
b34976b6 16495 skip = TRUE;
1cf1f670 16496 else if (out_off == (bfd_vma) -2)
b34976b6 16497 skip = TRUE, relocate = TRUE;
1cf1f670
AM
16498 out_off += (input_section->output_section->vma
16499 + input_section->output_offset);
16500 outrel.r_offset = out_off;
411e1bfb 16501 outrel.r_addend = rel->r_addend;
65f38f15 16502
1cf1f670
AM
16503 /* Optimize unaligned reloc use. */
16504 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
16505 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
16506 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
16507 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
16508 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
16509 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
16510 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
16511 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
16512 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
16513
65f38f15 16514 if (skip)
0bb2d96a 16515 memset (&outrel, 0, sizeof outrel);
afe397ea 16516 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
16517 && !is_opd
16518 && r_type != R_PPC64_TOC)
14acf4dc 16519 {
82e66161
AM
16520 indx = h->elf.dynindx;
16521 BFD_ASSERT (indx != -1);
16522 outrel.r_info = ELF64_R_INFO (indx, r_type);
14acf4dc 16523 }
65f38f15
AM
16524 else
16525 {
41bd81ab
AM
16526 /* This symbol is local, or marked to become local,
16527 or this is an opd section reloc which must point
16528 at a local function. */
65f38f15 16529 outrel.r_addend += relocation;
e86ce104 16530 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 16531 {
3fad3c7c 16532 if (is_opd && h != NULL)
afbe61cf
AM
16533 {
16534 /* Lie about opd entries. This case occurs
16535 when building shared libraries and we
16536 reference a function in another shared
3fad3c7c
AM
16537 lib. The same thing happens for a weak
16538 definition in an application that's
16539 overridden by a strong definition in a
16540 shared lib. (I believe this is a generic
16541 bug in binutils handling of weak syms.)
16542 In these cases we won't use the opd
1e2f5b6e 16543 entry in this lib. */
b34976b6 16544 unresolved_reloc = FALSE;
afbe61cf 16545 }
25f23106
AM
16546 if (!is_opd
16547 && r_type == R_PPC64_ADDR64
16548 && (h != NULL
16549 ? h->elf.type == STT_GNU_IFUNC
16550 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
16551 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
16552 else
16553 {
16554 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 16555
25f23106
AM
16556 /* We need to relocate .opd contents for ld.so.
16557 Prelink also wants simple and consistent rules
16558 for relocs. This make all RELATIVE relocs have
16559 *r_offset equal to r_addend. */
16560 relocate = TRUE;
16561 }
65f38f15
AM
16562 }
16563 else
16564 {
25f23106
AM
16565 if (h != NULL
16566 ? h->elf.type == STT_GNU_IFUNC
16567 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
16568 {
25f53a85 16569 info->callbacks->einfo
695344c0 16570 /* xgettext:c-format */
174d0a74 16571 (_("%H: %s for indirect "
c1c8c1ef 16572 "function `%pT' unsupported\n"),
25f53a85 16573 input_bfd, input_section, rel->r_offset,
25f23106
AM
16574 ppc64_elf_howto_table[r_type]->name,
16575 sym_name);
16576 ret = FALSE;
16577 }
cf35638d 16578 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
16579 ;
16580 else if (sec == NULL || sec->owner == NULL)
16581 {
16582 bfd_set_error (bfd_error_bad_value);
b34976b6 16583 return FALSE;
65f38f15
AM
16584 }
16585 else
16586 {
f26a3287 16587 asection *osec = sec->output_section;
65f38f15 16588
f26a3287
AM
16589 if ((osec->flags & SEC_THREAD_LOCAL) != 0)
16590 {
16591 /* TLS symbol values are relative to the
16592 TLS segment. Dynamic relocations for
16593 local TLS symbols therefore can't be
16594 reduced to a relocation against their
16595 section symbol because it holds the
16596 address of the section, not a value
16597 relative to the TLS segment. We could
16598 change the .tdata dynamic section symbol
16599 to be zero value but STN_UNDEF works
16600 and is used elsewhere, eg. for TPREL64
16601 GOT relocs against local TLS symbols. */
16602 osec = htab->elf.tls_sec;
16603 indx = 0;
16604 }
16605 else
74541ad4 16606 {
74541ad4 16607 indx = elf_section_data (osec)->dynindx;
f26a3287
AM
16608 if (indx == 0)
16609 {
16610 if ((osec->flags & SEC_READONLY) == 0
16611 && htab->elf.data_index_section != NULL)
16612 osec = htab->elf.data_index_section;
16613 else
16614 osec = htab->elf.text_index_section;
16615 indx = elf_section_data (osec)->dynindx;
16616 }
16617 BFD_ASSERT (indx != 0);
74541ad4 16618 }
74541ad4 16619
65f38f15
AM
16620 /* We are turning this relocation into one
16621 against a section symbol, so subtract out
16622 the output section's address but not the
16623 offset of the input section in the output
16624 section. */
16625 outrel.r_addend -= osec->vma;
16626 }
16627
16628 outrel.r_info = ELF64_R_INFO (indx, r_type);
16629 }
16630 }
16631
16632 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
16633 if (h != NULL
16634 ? h->elf.type == STT_GNU_IFUNC
16635 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
82e66161
AM
16636 {
16637 sreloc = htab->elf.irelplt;
16638 if (indx == 0)
16639 htab->local_ifunc_resolver = 1;
16640 else if (is_static_defined (&h->elf))
16641 htab->maybe_local_ifunc_resolver = 1;
16642 }
65f38f15
AM
16643 if (sreloc == NULL)
16644 abort ();
16645
dfbb6ac9
AM
16646 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
16647 >= sreloc->size)
16648 abort ();
947216bf
AM
16649 loc = sreloc->contents;
16650 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
16651 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
16652
e59a1001
AM
16653 if (!warned_dynamic
16654 && !ppc64_glibc_dynamic_reloc (ELF64_R_TYPE (outrel.r_info)))
16655 {
16656 info->callbacks->einfo
16657 /* xgettext:c-format */
16658 (_("%X%P: %pB: %s against %pT "
16659 "is not supported by glibc as a dynamic relocation\n"),
16660 input_bfd,
16661 ppc64_elf_howto_table[ELF64_R_TYPE (outrel.r_info)]->name,
16662 sym_name);
16663 warned_dynamic = TRUE;
16664 }
16665
65f38f15
AM
16666 /* If this reloc is against an external symbol, it will
16667 be computed at runtime, so there's no need to do
81407a69
AM
16668 anything now. However, for the sake of prelink ensure
16669 that the section contents are a known value. */
2cdcc330 16670 if (!relocate)
81407a69
AM
16671 {
16672 unresolved_reloc = FALSE;
16673 /* The value chosen here is quite arbitrary as ld.so
16674 ignores section contents except for the special
16675 case of .opd where the contents might be accessed
16676 before relocation. Choose zero, as that won't
16677 cause reloc overflow. */
16678 relocation = 0;
16679 addend = 0;
16680 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
16681 to improve backward compatibility with older
16682 versions of ld. */
16683 if (r_type == R_PPC64_ADDR64)
16684 addend = outrel.r_addend;
16685 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 16686 else if (ppc64_elf_howto_table[r_type]->pc_relative)
f0158f44 16687 addend = outrel.r_offset;
81407a69 16688 }
65f38f15 16689 }
5bd4f169
AM
16690 break;
16691
65f38f15
AM
16692 case R_PPC64_COPY:
16693 case R_PPC64_GLOB_DAT:
16694 case R_PPC64_JMP_SLOT:
25f23106 16695 case R_PPC64_JMP_IREL:
65f38f15
AM
16696 case R_PPC64_RELATIVE:
16697 /* We shouldn't ever see these dynamic relocs in relocatable
16698 files. */
ae9a127f 16699 /* Fall through. */
65f38f15
AM
16700
16701 case R_PPC64_PLTGOT16:
16702 case R_PPC64_PLTGOT16_DS:
16703 case R_PPC64_PLTGOT16_HA:
16704 case R_PPC64_PLTGOT16_HI:
16705 case R_PPC64_PLTGOT16_LO:
16706 case R_PPC64_PLTGOT16_LO_DS:
16707 case R_PPC64_PLTREL32:
16708 case R_PPC64_PLTREL64:
16709 /* These ones haven't been implemented yet. */
16710
25f53a85 16711 info->callbacks->einfo
695344c0 16712 /* xgettext:c-format */
c1c8c1ef 16713 (_("%P: %pB: %s is not supported for `%pT'\n"),
d003868e 16714 input_bfd,
4ce794b7 16715 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
16716
16717 bfd_set_error (bfd_error_invalid_operation);
b34976b6 16718 ret = FALSE;
c316a17c 16719 goto copy_reloc;
65f38f15 16720 }
5bd4f169 16721
67f0cbdb
AM
16722 /* Multi-instruction sequences that access the TOC can be
16723 optimized, eg. addis ra,r2,0; addi rb,ra,x;
07d6d2b8 16724 to nop; addi rb,r2,x; */
67f0cbdb
AM
16725 switch (r_type)
16726 {
16727 default:
16728 break;
16729
16730 case R_PPC64_GOT_TLSLD16_HI:
16731 case R_PPC64_GOT_TLSGD16_HI:
16732 case R_PPC64_GOT_TPREL16_HI:
16733 case R_PPC64_GOT_DTPREL16_HI:
16734 case R_PPC64_GOT16_HI:
16735 case R_PPC64_TOC16_HI:
16736 /* These relocs would only be useful if building up an
16737 offset to later add to r2, perhaps in an indexed
16738 addressing mode instruction. Don't try to optimize.
16739 Unfortunately, the possibility of someone building up an
16740 offset like this or even with the HA relocs, means that
16741 we need to check the high insn when optimizing the low
16742 insn. */
16743 break;
16744
5663e321
AM
16745 case R_PPC64_PLTCALL_NOTOC:
16746 if (!unresolved_reloc)
16747 htab->notoc_plt = 1;
16748 /* Fall through. */
23cedd1d
AM
16749 case R_PPC64_PLTCALL:
16750 if (unresolved_reloc)
16751 {
16752 /* No plt entry. Make this into a direct call. */
16753 bfd_byte *p = contents + rel->r_offset;
16754 insn = bfd_get_32 (input_bfd, p);
16755 insn &= 1;
16756 bfd_put_32 (input_bfd, B_DOT | insn, p);
5663e321
AM
16757 if (r_type == R_PPC64_PLTCALL)
16758 bfd_put_32 (input_bfd, NOP, p + 4);
23cedd1d
AM
16759 unresolved_reloc = save_unresolved_reloc;
16760 r_type = R_PPC64_REL24;
16761 }
16762 break;
16763
5663e321 16764 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d
AM
16765 case R_PPC64_PLTSEQ:
16766 if (unresolved_reloc)
16767 {
16768 unresolved_reloc = FALSE;
16769 goto nop_it;
16770 }
16771 break;
16772
5663e321
AM
16773 case R_PPC64_PLT_PCREL34_NOTOC:
16774 if (!unresolved_reloc)
16775 htab->notoc_plt = 1;
16776 /* Fall through. */
16777 case R_PPC64_PLT_PCREL34:
16778 if (unresolved_reloc)
16779 {
16780 bfd_byte *p = contents + rel->r_offset;
16781 bfd_put_32 (input_bfd, PNOP >> 32, p);
16782 bfd_put_32 (input_bfd, PNOP, p + 4);
16783 unresolved_reloc = FALSE;
16784 goto copy_reloc;
16785 }
16786 break;
16787
23cedd1d
AM
16788 case R_PPC64_PLT16_HA:
16789 if (unresolved_reloc)
16790 {
16791 unresolved_reloc = FALSE;
16792 goto nop_it;
16793 }
16794 /* Fall through. */
67f0cbdb
AM
16795 case R_PPC64_GOT_TLSLD16_HA:
16796 case R_PPC64_GOT_TLSGD16_HA:
16797 case R_PPC64_GOT_TPREL16_HA:
16798 case R_PPC64_GOT_DTPREL16_HA:
16799 case R_PPC64_GOT16_HA:
16800 case R_PPC64_TOC16_HA:
98528052 16801 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16802 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052 16803 {
23cedd1d
AM
16804 bfd_byte *p;
16805 nop_it:
16806 p = contents + (rel->r_offset & ~3);
98528052 16807 bfd_put_32 (input_bfd, NOP, p);
d830549d 16808 goto copy_reloc;
98528052 16809 }
67f0cbdb
AM
16810 break;
16811
23cedd1d
AM
16812 case R_PPC64_PLT16_LO:
16813 case R_PPC64_PLT16_LO_DS:
16814 if (unresolved_reloc)
16815 {
16816 unresolved_reloc = FALSE;
16817 goto nop_it;
16818 }
16819 /* Fall through. */
67f0cbdb
AM
16820 case R_PPC64_GOT_TLSLD16_LO:
16821 case R_PPC64_GOT_TLSGD16_LO:
16822 case R_PPC64_GOT_TPREL16_LO_DS:
16823 case R_PPC64_GOT_DTPREL16_LO_DS:
16824 case R_PPC64_GOT16_LO:
16825 case R_PPC64_GOT16_LO_DS:
16826 case R_PPC64_TOC16_LO:
16827 case R_PPC64_TOC16_LO_DS:
98528052 16828 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16829 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
16830 {
16831 bfd_byte *p = contents + (rel->r_offset & ~3);
16832 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16833 if ((insn & (0x3fu << 26)) == 12u << 26 /* addic */)
560c8763
AM
16834 {
16835 /* Transform addic to addi when we change reg. */
2365f8d7 16836 insn &= ~((0x3fu << 26) | (0x1f << 16));
560c8763
AM
16837 insn |= (14u << 26) | (2 << 16);
16838 }
16839 else
67f0cbdb 16840 {
98528052
AM
16841 insn &= ~(0x1f << 16);
16842 insn |= 2 << 16;
67f0cbdb 16843 }
560c8763 16844 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
16845 }
16846 break;
9a23f96e
AM
16847
16848 case R_PPC64_TPREL16_HA:
16849 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16850 {
16851 bfd_byte *p = contents + (rel->r_offset & ~3);
16852 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16853 if ((insn & ((0x3fu << 26) | 0x1f << 16))
9a23f96e
AM
16854 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */)
16855 /* xgettext:c-format */
16856 info->callbacks->minfo
16857 (_("%H: warning: %s unexpected insn %#x.\n"),
d830549d
AM
16858 input_bfd, input_section, rel->r_offset,
16859 ppc64_elf_howto_table[r_type]->name, insn);
9a23f96e 16860 else
d830549d
AM
16861 {
16862 bfd_put_32 (input_bfd, NOP, p);
16863 goto copy_reloc;
16864 }
9a23f96e
AM
16865 }
16866 break;
16867
16868 case R_PPC64_TPREL16_LO:
16869 case R_PPC64_TPREL16_LO_DS:
16870 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16871 {
16872 bfd_byte *p = contents + (rel->r_offset & ~3);
16873 insn = bfd_get_32 (input_bfd, p);
16874 insn &= ~(0x1f << 16);
16875 insn |= 13 << 16;
16876 bfd_put_32 (input_bfd, insn, p);
16877 }
16878 break;
67f0cbdb
AM
16879 }
16880
65f38f15
AM
16881 /* Do any further special processing. */
16882 switch (r_type)
16883 {
16884 default:
16885 break;
16886
25f23106 16887 case R_PPC64_REL16_HA:
4a969973
AM
16888 case R_PPC64_REL16_HIGHA:
16889 case R_PPC64_REL16_HIGHERA:
16890 case R_PPC64_REL16_HIGHESTA:
a680de9a 16891 case R_PPC64_REL16DX_HA:
f9c6b907
AM
16892 case R_PPC64_ADDR16_HA:
16893 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16894 case R_PPC64_ADDR16_HIGHERA:
16895 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
16896 case R_PPC64_TOC16_HA:
16897 case R_PPC64_SECTOFF_HA:
411e1bfb 16898 case R_PPC64_TPREL16_HA:
f9c6b907 16899 case R_PPC64_TPREL16_HIGHA:
411e1bfb 16900 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 16901 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
16902 case R_PPC64_DTPREL16_HA:
16903 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 16904 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 16905 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
16906 /* It's just possible that this symbol is a weak symbol
16907 that's not actually defined anywhere. In that case,
16908 'sec' would be NULL, and we should leave the symbol
16909 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
16910 if (sec == NULL)
16911 break;
1a0670f3 16912 /* Fall through. */
5c5f6e17
AM
16913
16914 case R_PPC64_GOT16_HA:
16915 case R_PPC64_PLTGOT16_HA:
16916 case R_PPC64_PLT16_HA:
16917 case R_PPC64_GOT_TLSGD16_HA:
16918 case R_PPC64_GOT_TLSLD16_HA:
16919 case R_PPC64_GOT_TPREL16_HA:
16920 case R_PPC64_GOT_DTPREL16_HA:
16921 /* Add 0x10000 if sign bit in 0:15 is set.
16922 Bits 0:15 are not used. */
16923 addend += 0x8000;
65f38f15
AM
16924 break;
16925
5663e321
AM
16926 case R_PPC64_D34_HA30:
16927 case R_PPC64_ADDR16_HIGHERA34:
16928 case R_PPC64_ADDR16_HIGHESTA34:
16929 case R_PPC64_REL16_HIGHERA34:
16930 case R_PPC64_REL16_HIGHESTA34:
16931 if (sec != NULL)
16932 addend += 1ULL << 33;
16933 break;
16934
65f38f15
AM
16935 case R_PPC64_ADDR16_DS:
16936 case R_PPC64_ADDR16_LO_DS:
16937 case R_PPC64_GOT16_DS:
16938 case R_PPC64_GOT16_LO_DS:
16939 case R_PPC64_PLT16_LO_DS:
16940 case R_PPC64_SECTOFF_DS:
16941 case R_PPC64_SECTOFF_LO_DS:
16942 case R_PPC64_TOC16_DS:
16943 case R_PPC64_TOC16_LO_DS:
16944 case R_PPC64_PLTGOT16_DS:
16945 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
16946 case R_PPC64_GOT_TPREL16_DS:
16947 case R_PPC64_GOT_TPREL16_LO_DS:
16948 case R_PPC64_GOT_DTPREL16_DS:
16949 case R_PPC64_GOT_DTPREL16_LO_DS:
16950 case R_PPC64_TPREL16_DS:
16951 case R_PPC64_TPREL16_LO_DS:
16952 case R_PPC64_DTPREL16_DS:
16953 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
16954 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
16955 mask = 3;
a680de9a
PB
16956 /* If this reloc is against an lq, lxv, or stxv insn, then
16957 the value must be a multiple of 16. This is somewhat of
16958 a hack, but the "correct" way to do this by defining _DQ
16959 forms of all the _DS relocs bloats all reloc switches in
16960 this file. It doesn't make much sense to use these
16961 relocs in data, so testing the insn should be safe. */
2365f8d7
AM
16962 if ((insn & (0x3fu << 26)) == (56u << 26)
16963 || ((insn & (0x3fu << 26)) == (61u << 26) && (insn & 3) == 1))
adadcc0c 16964 mask = 15;
a680de9a
PB
16965 relocation += addend;
16966 addend = insn & (mask ^ 3);
16967 if ((relocation & mask) != 0)
65f38f15 16968 {
a680de9a 16969 relocation ^= relocation & mask;
25f53a85 16970 info->callbacks->einfo
695344c0 16971 /* xgettext:c-format */
174d0a74 16972 (_("%H: error: %s not a multiple of %u\n"),
25f53a85 16973 input_bfd, input_section, rel->r_offset,
d830549d 16974 ppc64_elf_howto_table[r_type]->name,
adadcc0c 16975 mask + 1);
65f38f15 16976 bfd_set_error (bfd_error_bad_value);
b34976b6 16977 ret = FALSE;
c316a17c 16978 goto copy_reloc;
65f38f15
AM
16979 }
16980 break;
5bd4f169
AM
16981 }
16982
239e1f3a
AM
16983 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
16984 because such sections are not SEC_ALLOC and thus ld.so will
16985 not process them. */
d830549d 16986 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15 16987 if (unresolved_reloc
239e1f3a 16988 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
16989 && h->elf.def_dynamic)
16990 && _bfd_elf_section_offset (output_bfd, info, input_section,
16991 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 16992 {
25f53a85 16993 info->callbacks->einfo
695344c0 16994 /* xgettext:c-format */
c1c8c1ef 16995 (_("%H: unresolvable %s against `%pT'\n"),
25f53a85 16996 input_bfd, input_section, rel->r_offset,
b80eed39 16997 howto->name,
039b3fef 16998 h->elf.root.root.string);
b34976b6 16999 ret = FALSE;
9c07fe7c 17000 }
5bd4f169 17001
b80eed39
AM
17002 /* 16-bit fields in insns mostly have signed values, but a
17003 few insns have 16-bit unsigned values. Really, we should
17004 have different reloc types. */
17005 if (howto->complain_on_overflow != complain_overflow_dont
17006 && howto->dst_mask == 0xffff
17007 && (input_section->flags & SEC_CODE) != 0)
17008 {
17009 enum complain_overflow complain = complain_overflow_signed;
17010
17011 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 17012 if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */)
a47622ac
AM
17013 complain = complain_overflow_bitfield;
17014 else if (howto->rightshift == 0
2365f8d7
AM
17015 ? ((insn & (0x3fu << 26)) == 28u << 26 /* andi */
17016 || (insn & (0x3fu << 26)) == 24u << 26 /* ori */
17017 || (insn & (0x3fu << 26)) == 26u << 26 /* xori */)
17018 : ((insn & (0x3fu << 26)) == 29u << 26 /* andis */
17019 || (insn & (0x3fu << 26)) == 25u << 26 /* oris */
17020 || (insn & (0x3fu << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
17021 complain = complain_overflow_unsigned;
17022 if (howto->complain_on_overflow != complain)
17023 {
17024 alt_howto = *howto;
17025 alt_howto.complain_on_overflow = complain;
17026 howto = &alt_howto;
17027 }
17028 }
17029
5663e321 17030 switch (r_type)
a680de9a 17031 {
5663e321
AM
17032 /* Split field relocs aren't handled by _bfd_final_link_relocate. */
17033 case R_PPC64_D34:
17034 case R_PPC64_D34_LO:
17035 case R_PPC64_D34_HI30:
17036 case R_PPC64_D34_HA30:
17037 case R_PPC64_PCREL34:
17038 case R_PPC64_GOT_PCREL34:
c213164a
AM
17039 case R_PPC64_TPREL34:
17040 case R_PPC64_DTPREL34:
87c69f97
AM
17041 case R_PPC64_GOT_TLSGD_PCREL34:
17042 case R_PPC64_GOT_TLSLD_PCREL34:
17043 case R_PPC64_GOT_TPREL_PCREL34:
17044 case R_PPC64_GOT_DTPREL_PCREL34:
5663e321
AM
17045 case R_PPC64_PLT_PCREL34:
17046 case R_PPC64_PLT_PCREL34_NOTOC:
17047 case R_PPC64_D28:
17048 case R_PPC64_PCREL28:
17049 if (rel->r_offset + 8 > input_section->size)
17050 r = bfd_reloc_outofrange;
17051 else
17052 {
5663e321
AM
17053 relocation += addend;
17054 if (howto->pc_relative)
17055 relocation -= (rel->r_offset
17056 + input_section->output_offset
17057 + input_section->output_section->vma);
17058 relocation >>= howto->rightshift;
17059
17060 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
17061 pinsn <<= 32;
17062 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
17063
17064 pinsn &= ~howto->dst_mask;
17065 pinsn |= (((relocation << 16) | (relocation & 0xffff))
17066 & howto->dst_mask);
17067 bfd_put_32 (input_bfd, pinsn >> 32, contents + rel->r_offset);
17068 bfd_put_32 (input_bfd, pinsn, contents + rel->r_offset + 4);
17069 r = bfd_reloc_ok;
17070 if (howto->complain_on_overflow == complain_overflow_signed
17071 && (relocation + (1ULL << (howto->bitsize - 1))
17072 >= 1ULL << howto->bitsize))
17073 r = bfd_reloc_overflow;
17074 }
17075 break;
17076
17077 case R_PPC64_REL16DX_HA:
a680de9a
PB
17078 if (rel->r_offset + 4 > input_section->size)
17079 r = bfd_reloc_outofrange;
17080 else
17081 {
17082 relocation += addend;
17083 relocation -= (rel->r_offset
17084 + input_section->output_offset
17085 + input_section->output_section->vma);
3de43e7b 17086 relocation = (bfd_signed_vma) relocation >> 16;
a680de9a
PB
17087 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
17088 insn &= ~0x1fffc1;
3de43e7b 17089 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
a680de9a
PB
17090 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
17091 r = bfd_reloc_ok;
3de43e7b 17092 if (relocation + 0x8000 > 0xffff)
a680de9a
PB
17093 r = bfd_reloc_overflow;
17094 }
5663e321
AM
17095 break;
17096
17097 default:
17098 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
17099 contents, rel->r_offset,
17100 relocation, addend);
a680de9a 17101 }
5bd4f169 17102
ef60b7ff 17103 if (r != bfd_reloc_ok)
5bd4f169 17104 {
bc30df16 17105 char *more_info = NULL;
b80eed39 17106 const char *reloc_name = howto->name;
bc30df16
AM
17107
17108 if (reloc_dest != DEST_NORMAL)
17109 {
17110 more_info = bfd_malloc (strlen (reloc_name) + 8);
17111 if (more_info != NULL)
17112 {
17113 strcpy (more_info, reloc_name);
17114 strcat (more_info, (reloc_dest == DEST_OPD
17115 ? " (OPD)" : " (stub)"));
17116 reloc_name = more_info;
17117 }
17118 }
17119
cd27b276 17120 if (r == bfd_reloc_overflow)
5bd4f169 17121 {
8131c122
AM
17122 /* On code like "if (foo) foo();" don't report overflow
17123 on a branch to zero when foo is undefined. */
17124 if (!warned
17125 && (reloc_dest == DEST_STUB
17126 || !(h != NULL
17127 && (h->elf.root.type == bfd_link_hash_undefweak
17128 || h->elf.root.type == bfd_link_hash_undefined)
17129 && is_branch_reloc (r_type))))
1a72702b
AM
17130 info->callbacks->reloc_overflow (info, &h->elf.root,
17131 sym_name, reloc_name,
17132 orig_rel.r_addend,
17133 input_bfd, input_section,
17134 rel->r_offset);
ef60b7ff
AM
17135 }
17136 else
17137 {
25f53a85 17138 info->callbacks->einfo
695344c0 17139 /* xgettext:c-format */
c1c8c1ef 17140 (_("%H: %s against `%pT': error %d\n"),
25f53a85 17141 input_bfd, input_section, rel->r_offset,
bc30df16 17142 reloc_name, sym_name, (int) r);
b34976b6 17143 ret = FALSE;
ef60b7ff 17144 }
c9594989 17145 free (more_info);
5bd4f169 17146 }
c316a17c
AM
17147 copy_reloc:
17148 if (wrel != rel)
17149 *wrel = *rel;
17150 }
17151
17152 if (wrel != rel)
17153 {
17154 Elf_Internal_Shdr *rel_hdr;
17155 size_t deleted = rel - wrel;
17156
17157 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
17158 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
17159 if (rel_hdr->sh_size == 0)
17160 {
17161 /* It is too late to remove an empty reloc section. Leave
17162 one NONE reloc.
17163 ??? What is wrong with an empty section??? */
17164 rel_hdr->sh_size = rel_hdr->sh_entsize;
17165 deleted -= 1;
17166 }
17167 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
17168 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
17169 input_section->reloc_count -= deleted;
5bd4f169
AM
17170 }
17171
645ea6a9
AM
17172 /* If we're emitting relocations, then shortly after this function
17173 returns, reloc offsets and addends for this section will be
17174 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
17175 file rather than the input. Save a copy of the relocs for
17176 opd_entry_value. */
0e1862bb 17177 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
8860955f
AM
17178 {
17179 bfd_size_type amt;
17180 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
17181 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
17182 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
17183 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
17184 if (rel == NULL)
17185 return FALSE;
17186 memcpy (rel, relocs, amt);
17187 }
5bd4f169
AM
17188 return ret;
17189}
17190
754021d0
AM
17191/* Adjust the value of any local symbols in opd sections. */
17192
6e0b88f1 17193static int
754021d0
AM
17194ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
17195 const char *name ATTRIBUTE_UNUSED,
17196 Elf_Internal_Sym *elfsym,
17197 asection *input_sec,
17198 struct elf_link_hash_entry *h)
17199{
74f0fb50
AM
17200 struct _opd_sec_data *opd;
17201 long adjust;
754021d0
AM
17202 bfd_vma value;
17203
4025353c 17204 if (h != NULL)
6e0b88f1 17205 return 1;
4025353c 17206
74f0fb50
AM
17207 opd = get_opd_info (input_sec);
17208 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 17209 return 1;
754021d0
AM
17210
17211 value = elfsym->st_value - input_sec->output_offset;
0e1862bb 17212 if (!bfd_link_relocatable (info))
754021d0
AM
17213 value -= input_sec->output_section->vma;
17214
51aecdc5 17215 adjust = opd->adjust[OPD_NDX (value)];
4025353c 17216 if (adjust == -1)
6e0b88f1
AM
17217 return 2;
17218
17219 elfsym->st_value += adjust;
17220 return 1;
754021d0
AM
17221}
17222
5bd4f169
AM
17223/* Finish up dynamic symbol handling. We set the contents of various
17224 dynamic sections here. */
17225
b34976b6 17226static bfd_boolean
4ce794b7
AM
17227ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
17228 struct bfd_link_info *info,
17229 struct elf_link_hash_entry *h,
4aef7643 17230 Elf_Internal_Sym *sym)
5bd4f169 17231{
65f38f15 17232 struct ppc_link_hash_table *htab;
8387904d 17233 struct plt_entry *ent;
5bd4f169 17234
65f38f15 17235 htab = ppc_hash_table (info);
4dfe6ac6
NC
17236 if (htab == NULL)
17237 return FALSE;
5bd4f169 17238
49c09209
AM
17239 if (!htab->opd_abi && !h->def_regular)
17240 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
17241 if (ent->plt.offset != (bfd_vma) -1)
17242 {
17243 /* Mark the symbol as undefined, rather than as
17244 defined in glink. Leave the value if there were
17245 any relocations where pointer equality matters
17246 (this is a clue for the dynamic linker, to make
17247 function pointer comparisons work between an
17248 application and shared library), otherwise set it
17249 to zero. */
17250 sym->st_shndx = SHN_UNDEF;
17251 if (!h->pointer_equality_needed)
17252 sym->st_value = 0;
17253 else if (!h->ref_regular_nonweak)
17254 {
17255 /* This breaks function pointer comparisons, but
17256 that is better than breaking tests for a NULL
17257 function pointer. */
17258 sym->st_value = 0;
17259 }
17260 break;
17261 }
5bd4f169 17262
1bdd8fac
AM
17263 if (h->needs_copy
17264 && (h->root.type == bfd_link_hash_defined
17265 || h->root.type == bfd_link_hash_defweak)
17266 && (h->root.u.def.section == htab->elf.sdynbss
17267 || h->root.u.def.section == htab->elf.sdynrelro))
5bd4f169 17268 {
65f38f15 17269 /* This symbol needs a copy reloc. Set it up. */
49c09209 17270 Elf_Internal_Rela rela;
5474d94f 17271 asection *srel;
49c09209 17272 bfd_byte *loc;
5bd4f169 17273
1bdd8fac 17274 if (h->dynindx == -1)
65f38f15 17275 abort ();
5bd4f169 17276
ed7007c1 17277 rela.r_offset = defined_sym_val (h);
5bd4f169
AM
17278 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
17279 rela.r_addend = 0;
afbf7e8e 17280 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
17281 srel = htab->elf.sreldynrelro;
17282 else
17283 srel = htab->elf.srelbss;
17284 loc = srel->contents;
17285 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 17286 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
17287 }
17288
b34976b6 17289 return TRUE;
5bd4f169
AM
17290}
17291
65f38f15
AM
17292/* Used to decide how to sort relocs in an optimal manner for the
17293 dynamic linker, before writing them out. */
17294
17295static enum elf_reloc_type_class
7e612e98
AM
17296ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
17297 const asection *rel_sec,
17298 const Elf_Internal_Rela *rela)
65f38f15 17299{
04c9666a 17300 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
17301 struct ppc_link_hash_table *htab = ppc_hash_table (info);
17302
33e44f2e 17303 if (rel_sec == htab->elf.irelplt)
7e612e98 17304 return reloc_class_ifunc;
a33d1f77 17305
4ce794b7 17306 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 17307 switch (r_type)
65f38f15
AM
17308 {
17309 case R_PPC64_RELATIVE:
17310 return reloc_class_relative;
17311 case R_PPC64_JMP_SLOT:
17312 return reloc_class_plt;
17313 case R_PPC64_COPY:
17314 return reloc_class_copy;
17315 default:
17316 return reloc_class_normal;
17317 }
17318}
17319
5bd4f169
AM
17320/* Finish up the dynamic sections. */
17321
b34976b6 17322static bfd_boolean
4ce794b7
AM
17323ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
17324 struct bfd_link_info *info)
5bd4f169 17325{
65f38f15
AM
17326 struct ppc_link_hash_table *htab;
17327 bfd *dynobj;
5bd4f169 17328 asection *sdyn;
5bd4f169 17329
65f38f15 17330 htab = ppc_hash_table (info);
4dfe6ac6
NC
17331 if (htab == NULL)
17332 return FALSE;
17333
65f38f15 17334 dynobj = htab->elf.dynobj;
3d4d4302 17335 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 17336
65f38f15 17337 if (htab->elf.dynamic_sections_created)
5bd4f169 17338 {
5bd4f169
AM
17339 Elf64_External_Dyn *dyncon, *dynconend;
17340
33e44f2e 17341 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 17342 abort ();
5bd4f169
AM
17343
17344 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 17345 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
17346 for (; dyncon < dynconend; dyncon++)
17347 {
17348 Elf_Internal_Dyn dyn;
19397422 17349 asection *s;
5bd4f169
AM
17350
17351 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
17352
17353 switch (dyn.d_tag)
17354 {
65f38f15
AM
17355 default:
17356 continue;
5bd4f169 17357
5d1634d7 17358 case DT_PPC64_GLINK:
4ce794b7 17359 s = htab->glink;
6348e046 17360 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
17361 /* We stupidly defined DT_PPC64_GLINK to be the start
17362 of glink rather than the first entry point, which is
17363 what ld.so needs, and now have a bigger stub to
17364 support automatic multiple TOCs. */
9e390558 17365 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
5d1634d7
AM
17366 break;
17367
19397422
AM
17368 case DT_PPC64_OPD:
17369 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
17370 if (s == NULL)
17371 continue;
17372 dyn.d_un.d_ptr = s->vma;
19397422
AM
17373 break;
17374
e8910a83 17375 case DT_PPC64_OPT:
5663e321
AM
17376 if ((htab->do_multi_toc && htab->multi_toc_needed)
17377 || htab->notoc_plt)
e8910a83 17378 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
f378ab09
AM
17379 if (htab->has_plt_localentry0)
17380 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
e8910a83
AM
17381 break;
17382
19397422
AM
17383 case DT_PPC64_OPDSZ:
17384 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
17385 if (s == NULL)
17386 continue;
eea6121a 17387 dyn.d_un.d_val = s->size;
19397422
AM
17388 break;
17389
65f38f15 17390 case DT_PLTGOT:
33e44f2e 17391 s = htab->elf.splt;
6348e046 17392 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
17393 break;
17394
17395 case DT_JMPREL:
33e44f2e 17396 s = htab->elf.srelplt;
6348e046 17397 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 17398 break;
5bd4f169 17399
65f38f15 17400 case DT_PLTRELSZ:
33e44f2e 17401 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7 17402 break;
82e66161
AM
17403
17404 case DT_TEXTREL:
17405 if (htab->local_ifunc_resolver)
17406 info->callbacks->einfo
17407 (_("%X%P: text relocations and GNU indirect "
17408 "functions will result in a segfault at runtime\n"));
17409 else if (htab->maybe_local_ifunc_resolver)
17410 info->callbacks->einfo
17411 (_("%P: warning: text relocations and GNU indirect "
17412 "functions may result in a segfault at runtime\n"));
17413 continue;
5bd4f169 17414 }
5bd4f169 17415
65f38f15 17416 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 17417 }
5bd4f169
AM
17418 }
17419
6528b6eb
AM
17420 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
17421 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17422 {
17423 /* Fill in the first entry in the global offset table.
17424 We use it to hold the link-time TOCbase. */
17425 bfd_put_64 (output_bfd,
60ee0d4a 17426 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 17427 htab->elf.sgot->contents);
5d1634d7
AM
17428
17429 /* Set .got entry size. */
2cdcc330
AM
17430 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
17431 = 8;
5d1634d7
AM
17432 }
17433
6528b6eb
AM
17434 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
17435 && htab->elf.splt->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17436 {
17437 /* Set .plt entry size. */
33e44f2e 17438 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 17439 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
17440 }
17441
84f5d08e
AM
17442 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
17443 brlt ourselves if emitrelocations. */
17444 if (htab->brlt != NULL
17445 && htab->brlt->reloc_count != 0
17446 && !_bfd_elf_link_output_relocs (output_bfd,
17447 htab->brlt,
d4730f92 17448 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
17449 elf_section_data (htab->brlt)->relocs,
17450 NULL))
17451 return FALSE;
17452
176a0d42
AM
17453 if (htab->glink != NULL
17454 && htab->glink->reloc_count != 0
17455 && !_bfd_elf_link_output_relocs (output_bfd,
17456 htab->glink,
d4730f92 17457 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
17458 elf_section_data (htab->glink)->relocs,
17459 NULL))
17460 return FALSE;
17461
da44f4e5 17462
df136d64
AM
17463 if (htab->glink_eh_frame != NULL
17464 && htab->glink_eh_frame->size != 0
17465 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
17466 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
17467 htab->glink_eh_frame,
17468 htab->glink_eh_frame->contents))
17469 return FALSE;
58d180e8 17470
e717da7e 17471 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
17472 since we didn't add them to DYNOBJ. We know dynobj is the first
17473 bfd. */
c72f2fb2 17474 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
17475 {
17476 asection *s;
7b53ace3 17477
0c8d6e5c 17478 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
17479 continue;
17480
e717da7e
AM
17481 s = ppc64_elf_tdata (dynobj)->got;
17482 if (s != NULL
eea6121a 17483 && s->size != 0
e717da7e
AM
17484 && s->output_section != bfd_abs_section_ptr
17485 && !bfd_set_section_contents (output_bfd, s->output_section,
17486 s->contents, s->output_offset,
eea6121a 17487 s->size))
e717da7e
AM
17488 return FALSE;
17489 s = ppc64_elf_tdata (dynobj)->relgot;
17490 if (s != NULL
eea6121a 17491 && s->size != 0
e717da7e
AM
17492 && s->output_section != bfd_abs_section_ptr
17493 && !bfd_set_section_contents (output_bfd, s->output_section,
17494 s->contents, s->output_offset,
eea6121a 17495 s->size))
e717da7e
AM
17496 return FALSE;
17497 }
f6c52c13 17498
b34976b6 17499 return TRUE;
5bd4f169
AM
17500}
17501
5bd4f169 17502#include "elf64-target.h"
7b8e7dad
AM
17503
17504/* FreeBSD support */
17505
17506#undef TARGET_LITTLE_SYM
17507#undef TARGET_LITTLE_NAME
17508
17509#undef TARGET_BIG_SYM
6d00b590 17510#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
17511#undef TARGET_BIG_NAME
17512#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
17513
17514#undef ELF_OSABI
17515#define ELF_OSABI ELFOSABI_FREEBSD
17516
17517#undef elf64_bed
17518#define elf64_bed elf64_powerpc_fbsd_bed
17519
17520#include "elf64-target.h"