PowerPC64 ppc_elf_hash_entry, defined_sym_val, is_tls_get_addr
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
b3adc24a 2 Copyright (C) 1999-2020 Free Software Foundation, Inc.
5bd4f169
AM
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
32ca9640 5 Largely rewritten by Alan Modra.
5bd4f169 6
ae9a127f 7 This file is part of BFD, the Binary File Descriptor library.
5bd4f169 8
ae9a127f
NC
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
cd123cb7 11 the Free Software Foundation; either version 3 of the License, or
ae9a127f 12 (at your option) any later version.
5bd4f169 13
ae9a127f
NC
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
5bd4f169 18
4ce794b7
AM
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
3e110533 21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
5bd4f169 22
cd123cb7 23
4ce794b7
AM
24/* The 64-bit PowerPC ELF ABI may be found at
25 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
5bd4f169 27
3db64b00 28#include "sysdep.h"
183e98be 29#include <stdarg.h>
5bd4f169 30#include "bfd.h"
5bd4f169
AM
31#include "bfdlink.h"
32#include "libbfd.h"
33#include "elf-bfd.h"
04c9666a 34#include "elf/ppc64.h"
5d1634d7 35#include "elf64-ppc.h"
58d180e8 36#include "dwarf2.h"
5bd4f169 37
bb294208
AM
38/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */
39#define OCTETS_PER_BYTE(ABFD, SEC) 1
40
805fc799 41static bfd_reloc_status_type ppc64_elf_ha_reloc
4ce794b7 42 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
43static bfd_reloc_status_type ppc64_elf_branch_reloc
44 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 45static bfd_reloc_status_type ppc64_elf_brtaken_reloc
4ce794b7 46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 47static bfd_reloc_status_type ppc64_elf_sectoff_reloc
4ce794b7 48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 49static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
4ce794b7 50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 51static bfd_reloc_status_type ppc64_elf_toc_reloc
4ce794b7 52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 53static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
4ce794b7 54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 55static bfd_reloc_status_type ppc64_elf_toc64_reloc
4ce794b7 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
5663e321
AM
57static bfd_reloc_status_type ppc64_elf_prefix_reloc
58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 59static bfd_reloc_status_type ppc64_elf_unhandled_reloc
4ce794b7 60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016 61static bfd_vma opd_entry_value
aef36ac1 62 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
5bd4f169 63
6d00b590 64#define TARGET_LITTLE_SYM powerpc_elf64_le_vec
ad8e1ba5 65#define TARGET_LITTLE_NAME "elf64-powerpcle"
6d00b590 66#define TARGET_BIG_SYM powerpc_elf64_vec
ad8e1ba5
AM
67#define TARGET_BIG_NAME "elf64-powerpc"
68#define ELF_ARCH bfd_arch_powerpc
ae95ffa6 69#define ELF_TARGET_ID PPC64_ELF_DATA
ad8e1ba5
AM
70#define ELF_MACHINE_CODE EM_PPC64
71#define ELF_MAXPAGESIZE 0x10000
702d1671
AM
72#define ELF_COMMONPAGESIZE 0x1000
73#define ELF_RELROPAGESIZE ELF_MAXPAGESIZE
ad8e1ba5
AM
74#define elf_info_to_howto ppc64_elf_info_to_howto
75
76#define elf_backend_want_got_sym 0
77#define elf_backend_want_plt_sym 0
78#define elf_backend_plt_alignment 3
79#define elf_backend_plt_not_loaded 1
ad8e1ba5 80#define elf_backend_got_header_size 8
5474d94f 81#define elf_backend_want_dynrelro 1
ad8e1ba5
AM
82#define elf_backend_can_gc_sections 1
83#define elf_backend_can_refcount 1
84#define elf_backend_rela_normal 1
64f52338 85#define elf_backend_dtrel_excludes_plt 1
6bfdb61b 86#define elf_backend_default_execstack 0
ad8e1ba5 87
e717da7e 88#define bfd_elf64_mkobject ppc64_elf_mkobject
ad8e1ba5 89#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
aa374f67 90#define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
ee67d69a
AM
91#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
92#define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
ad8e1ba5
AM
93#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
94#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
90e3cdf2 95#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
aa374f67 96#define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
8c5b4e52 97#define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
ad8e1ba5
AM
98
99#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
100#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
101#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
183e98be 102#define elf_backend_write_core_note ppc64_elf_write_core_note
9d19e4fd 103#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
ad8e1ba5 104#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 105#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
f6c7c3e8 106#define elf_backend_check_directives ppc64_elf_before_check_relocs
e5034e59 107#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
8387904d 108#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5 109#define elf_backend_check_relocs ppc64_elf_check_relocs
c0e331c7 110#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
74f0fb50 111#define elf_backend_gc_keep ppc64_elf_gc_keep
64d03ab5 112#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
ad8e1ba5 113#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
ad8e1ba5
AM
114#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
115#define elf_backend_hide_symbol ppc64_elf_hide_symbol
9f296da3 116#define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
ad8e1ba5
AM
117#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
118#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
a345bc8d 119#define elf_backend_hash_symbol ppc64_elf_hash_symbol
74541ad4 120#define elf_backend_init_index_section _bfd_elf_init_2_index_sections
60124e18 121#define elf_backend_action_discarded ppc64_elf_action_discarded
ad8e1ba5
AM
122#define elf_backend_relocate_section ppc64_elf_relocate_section
123#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
124#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
125#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 126#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
29ef7005 127#define elf_backend_special_sections ppc64_elf_special_sections
6911b7dc 128#define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
8c5b4e52 129#define elf_backend_merge_symbol ppc64_elf_merge_symbol
bce964aa 130#define elf_backend_get_reloc_section bfd_get_section_by_name
ad8e1ba5 131
5bd4f169
AM
132/* The name of the dynamic interpreter. This is put in the .interp
133 section. */
134#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
135
136/* The size in bytes of an entry in the procedure linkage table. */
b9e5796b 137#define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
2d7ad24e 138#define LOCAL_PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 16 : 8)
5bd4f169
AM
139
140/* The initial size of the plt reserved for the dynamic linker. */
b9e5796b 141#define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
5bd4f169 142
a078d95a
AM
143/* Offsets to some stack save slots. */
144#define STK_LR 16
145#define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
eb8d7fda 146/* This one is dodgy. ELFv2 does not have a linker word, so use the
a078d95a
AM
147 CR save slot. Used only by optimised __tls_get_addr call stub,
148 relying on __tls_get_addr_opt not saving CR.. */
149#define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
150
5bd4f169 151/* TOC base pointers offset from start of TOC. */
411e1bfb 152#define TOC_BASE_OFF 0x8000
a27e685f
AM
153/* TOC base alignment. */
154#define TOC_BASE_ALIGN 256
411e1bfb
AM
155
156/* Offset of tp and dtp pointers from start of TLS block. */
157#define TP_OFFSET 0x7000
158#define DTP_OFFSET 0x8000
5bd4f169 159
ad8e1ba5
AM
160/* .plt call stub instructions. The normal stub is like this, but
161 sometimes the .plt entry crosses a 64k boundary and we need to
71a39c98 162 insert an addi to adjust r11. */
a078d95a 163#define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
71a39c98
AM
164#define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
165#define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
166#define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
167#define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
168#define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
5d1634d7
AM
169#define BCTR 0x4e800420 /* bctr */
170
07d6d2b8 171#define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
05d0e962
AM
172#define ADDI_R12_R11 0x398b0000 /* addi %r12,%r11,off@l */
173#define ADDI_R12_R12 0x398c0000 /* addi %r12,%r12,off@l */
07d6d2b8
AM
174#define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
175#define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
176
177#define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
178#define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
179#define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
180#define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
181#define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
182#define BNECTR 0x4ca20420 /* bnectr+ */
183#define BNECTR_P4 0x4ce20420 /* bnectr+ */
794e51c0 184
71a39c98 185#define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
ac2df442 186#define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
07d6d2b8 187#define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
ac2df442 188
07d6d2b8
AM
189#define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
190#define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */
191#define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */
ad8e1ba5 192
04bdff6a 193#define LI_R11_0 0x39600000 /* li %r11,0 */
07d6d2b8 194#define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */
04bdff6a 195#define LIS_R11 0x3d600000 /* lis %r11,xxx@ha */
05d0e962 196#define LIS_R12 0x3d800000 /* lis %r12,xxx@ha */
006589cf
AM
197#define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */
198#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
05d0e962 199#define ADDIS_R12_R11 0x3d8b0000 /* addis %r12,%r11,xxx@ha */
a345bc8d 200#define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
05d0e962 201#define ORIS_R12_R12_0 0x658c0000 /* oris %r12,%r12,xxx@hi */
04bdff6a 202#define ORI_R11_R11_0 0x616b0000 /* ori %r11,%r11,xxx@l */
05d0e962 203#define ORI_R12_R12_0 0x618c0000 /* ori %r12,%r12,xxx@l */
07d6d2b8 204#define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
04bdff6a 205#define SLDI_R11_R11_34 0x796b1746 /* sldi %r11,%r11,34 */
05d0e962
AM
206#define SLDI_R12_R12_32 0x799c07c6 /* sldi %r12,%r12,32 */
207#define LDX_R12_R11_R12 0x7d8b602a /* ldx %r12,%r11,%r12 */
208#define ADD_R12_R11_R12 0x7d8b6214 /* add %r12,%r11,%r12 */
04bdff6a
AM
209#define PADDI_R12_PC 0x0610000039800000ULL
210#define PLD_R12_PC 0x04100000e5800000ULL
5663e321 211#define PNOP 0x0700000000000000ULL
a345bc8d 212
9e390558
AM
213/* __glink_PLTresolve stub instructions. We enter with the index in R0. */
214#define GLINK_PLTRESOLVE_SIZE(htab) \
407aa07c 215 (8u + (htab->opd_abi ? 11 * 4 : 14 * 4))
ee4bf8d2
AM
216 /* 0: */
217 /* .quad plt0-1f */
218 /* __glink: */
219#define MFLR_R12 0x7d8802a6 /* mflr %12 */
220#define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
221 /* 1: */
222#define MFLR_R11 0x7d6802a6 /* mflr %11 */
71a39c98 223 /* ld %2,(0b-1b)(%11) */
ee4bf8d2 224#define MTLR_R12 0x7d8803a6 /* mtlr %12 */
71a39c98
AM
225#define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
226 /* ld %12,0(%11) */
227 /* ld %2,8(%11) */
228 /* mtctr %12 */
229 /* ld %11,16(%11) */
ee4bf8d2 230 /* bctr */
b9e5796b
AM
231#define MFLR_R0 0x7c0802a6 /* mflr %r0 */
232#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
233#define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
234#define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
235#define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
5d1634d7
AM
236
237/* Pad with this. */
238#define NOP 0x60000000
239
721956f4
AM
240/* Some other nops. */
241#define CROR_151515 0x4def7b82
242#define CROR_313131 0x4ffffb82
243
cedb70c5 244/* .glink entries for the first 32k functions are two instructions. */
5d1634d7
AM
245#define LI_R0_0 0x38000000 /* li %r0,0 */
246#define B_DOT 0x48000000 /* b . */
247
248/* After that, we need two instructions to load the index, followed by
249 a branch. */
250#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 251#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 252
deb0e272
AM
253/* Instructions used by the save and restore reg functions. */
254#define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
255#define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
256#define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
257#define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
82bd7b59
AM
258#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
259#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
deb0e272
AM
260#define LI_R12_0 0x39800000 /* li %r12,0 */
261#define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
262#define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
263#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
82bd7b59
AM
264#define BLR 0x4e800020 /* blr */
265
41bd81ab
AM
266/* Since .opd is an array of descriptors and each entry will end up
267 with identical R_PPC64_RELATIVE relocs, there is really no need to
268 propagate .opd relocs; The dynamic linker should be taught to
1e2f5b6e 269 relocate .opd without reloc entries. */
41bd81ab
AM
270#ifndef NO_OPD_RELOCS
271#define NO_OPD_RELOCS 0
272#endif
810d4e75 273
a4b6fadd
AM
274#ifndef ARRAY_SIZE
275#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
276#endif
277
810d4e75
AM
278static inline int
279abiversion (bfd *abfd)
280{
281 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
282}
283
284static inline void
285set_abiversion (bfd *abfd, int ver)
286{
287 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
288 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
289}
5bd4f169
AM
290\f
291/* Relocation HOWTO's. */
46807bf4
AM
292/* Like other ELF RELA targets that don't apply multiple
293 field-altering relocations to the same localation, src_mask is
294 always zero and pcrel_offset is the same as pc_relative.
295 PowerPC can always use a zero bitpos, even when the field is not at
296 the LSB. For example, a REL24 could use rightshift=2, bisize=24
297 and bitpos=2 which matches the ABI description, or as we do here,
298 rightshift=0, bitsize=26 and bitpos=0. */
299#define HOW(type, size, bitsize, mask, rightshift, pc_relative, \
300 complain, special_func) \
301 HOWTO (type, rightshift, size, bitsize, pc_relative, 0, \
302 complain_overflow_ ## complain, special_func, \
303 #type, FALSE, 0, mask, pc_relative)
304
04c9666a 305static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
5bd4f169 306
f3185997
NC
307static reloc_howto_type ppc64_elf_howto_raw[] =
308{
5bd4f169 309 /* This reloc does nothing. */
46807bf4
AM
310 HOW (R_PPC64_NONE, 3, 0, 0, 0, FALSE, dont,
311 bfd_elf_generic_reloc),
5bd4f169
AM
312
313 /* A standard 32 bit relocation. */
46807bf4
AM
314 HOW (R_PPC64_ADDR32, 2, 32, 0xffffffff, 0, FALSE, bitfield,
315 bfd_elf_generic_reloc),
5bd4f169
AM
316
317 /* An absolute 26 bit branch; the lower two bits must be zero.
318 FIXME: we don't check that, we just clear them. */
46807bf4
AM
319 HOW (R_PPC64_ADDR24, 2, 26, 0x03fffffc, 0, FALSE, bitfield,
320 bfd_elf_generic_reloc),
5bd4f169
AM
321
322 /* A standard 16 bit relocation. */
46807bf4
AM
323 HOW (R_PPC64_ADDR16, 1, 16, 0xffff, 0, FALSE, bitfield,
324 bfd_elf_generic_reloc),
5bd4f169
AM
325
326 /* A 16 bit relocation without overflow. */
46807bf4
AM
327 HOW (R_PPC64_ADDR16_LO, 1, 16, 0xffff, 0, FALSE, dont,
328 bfd_elf_generic_reloc),
5bd4f169
AM
329
330 /* Bits 16-31 of an address. */
46807bf4
AM
331 HOW (R_PPC64_ADDR16_HI, 1, 16, 0xffff, 16, FALSE, signed,
332 bfd_elf_generic_reloc),
5bd4f169
AM
333
334 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
335 bits, treated as a signed number, is negative. */
46807bf4
AM
336 HOW (R_PPC64_ADDR16_HA, 1, 16, 0xffff, 16, FALSE, signed,
337 ppc64_elf_ha_reloc),
5bd4f169
AM
338
339 /* An absolute 16 bit branch; the lower two bits must be zero.
340 FIXME: we don't check that, we just clear them. */
46807bf4
AM
341 HOW (R_PPC64_ADDR14, 2, 16, 0x0000fffc, 0, FALSE, signed,
342 ppc64_elf_branch_reloc),
5bd4f169
AM
343
344 /* An absolute 16 bit branch, for which bit 10 should be set to
345 indicate that the branch is expected to be taken. The lower two
346 bits must be zero. */
46807bf4
AM
347 HOW (R_PPC64_ADDR14_BRTAKEN, 2, 16, 0x0000fffc, 0, FALSE, signed,
348 ppc64_elf_brtaken_reloc),
5bd4f169
AM
349
350 /* An absolute 16 bit branch, for which bit 10 should be set to
351 indicate that the branch is not expected to be taken. The lower
352 two bits must be zero. */
46807bf4
AM
353 HOW (R_PPC64_ADDR14_BRNTAKEN, 2, 16, 0x0000fffc, 0, FALSE, signed,
354 ppc64_elf_brtaken_reloc),
5bd4f169
AM
355
356 /* A relative 26 bit branch; the lower two bits must be zero. */
46807bf4
AM
357 HOW (R_PPC64_REL24, 2, 26, 0x03fffffc, 0, TRUE, signed,
358 ppc64_elf_branch_reloc),
5bd4f169 359
05d0e962 360 /* A variant of R_PPC64_REL24, used when r2 is not the toc pointer. */
46807bf4
AM
361 HOW (R_PPC64_REL24_NOTOC, 2, 26, 0x03fffffc, 0, TRUE, signed,
362 ppc64_elf_branch_reloc),
05d0e962 363
5bd4f169 364 /* A relative 16 bit branch; the lower two bits must be zero. */
46807bf4
AM
365 HOW (R_PPC64_REL14, 2, 16, 0x0000fffc, 0, TRUE, signed,
366 ppc64_elf_branch_reloc),
5bd4f169
AM
367
368 /* A relative 16 bit branch. Bit 10 should be set to indicate that
369 the branch is expected to be taken. The lower two bits must be
370 zero. */
46807bf4
AM
371 HOW (R_PPC64_REL14_BRTAKEN, 2, 16, 0x0000fffc, 0, TRUE, signed,
372 ppc64_elf_brtaken_reloc),
5bd4f169
AM
373
374 /* A relative 16 bit branch. Bit 10 should be set to indicate that
375 the branch is not expected to be taken. The lower two bits must
376 be zero. */
46807bf4
AM
377 HOW (R_PPC64_REL14_BRNTAKEN, 2, 16, 0x0000fffc, 0, TRUE, signed,
378 ppc64_elf_brtaken_reloc),
5bd4f169
AM
379
380 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
381 symbol. */
46807bf4
AM
382 HOW (R_PPC64_GOT16, 1, 16, 0xffff, 0, FALSE, signed,
383 ppc64_elf_unhandled_reloc),
5bd4f169
AM
384
385 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
386 the symbol. */
46807bf4
AM
387 HOW (R_PPC64_GOT16_LO, 1, 16, 0xffff, 0, FALSE, dont,
388 ppc64_elf_unhandled_reloc),
5bd4f169
AM
389
390 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
391 the symbol. */
46807bf4
AM
392 HOW (R_PPC64_GOT16_HI, 1, 16, 0xffff, 16, FALSE, signed,
393 ppc64_elf_unhandled_reloc),
5bd4f169
AM
394
395 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
396 the symbol. */
46807bf4
AM
397 HOW (R_PPC64_GOT16_HA, 1, 16, 0xffff, 16, FALSE, signed,
398 ppc64_elf_unhandled_reloc),
5bd4f169
AM
399
400 /* This is used only by the dynamic linker. The symbol should exist
401 both in the object being run and in some shared library. The
402 dynamic linker copies the data addressed by the symbol from the
403 shared library into the object, because the object being
404 run has to have the data at some particular address. */
46807bf4
AM
405 HOW (R_PPC64_COPY, 0, 0, 0, 0, FALSE, dont,
406 ppc64_elf_unhandled_reloc),
5bd4f169
AM
407
408 /* Like R_PPC64_ADDR64, but used when setting global offset table
409 entries. */
46807bf4
AM
410 HOW (R_PPC64_GLOB_DAT, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
411 ppc64_elf_unhandled_reloc),
5bd4f169
AM
412
413 /* Created by the link editor. Marks a procedure linkage table
414 entry for a symbol. */
46807bf4
AM
415 HOW (R_PPC64_JMP_SLOT, 0, 0, 0, 0, FALSE, dont,
416 ppc64_elf_unhandled_reloc),
5bd4f169
AM
417
418 /* Used only by the dynamic linker. When the object is run, this
419 doubleword64 is set to the load address of the object, plus the
420 addend. */
46807bf4
AM
421 HOW (R_PPC64_RELATIVE, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
422 bfd_elf_generic_reloc),
5bd4f169
AM
423
424 /* Like R_PPC64_ADDR32, but may be unaligned. */
46807bf4
AM
425 HOW (R_PPC64_UADDR32, 2, 32, 0xffffffff, 0, FALSE, bitfield,
426 bfd_elf_generic_reloc),
5bd4f169
AM
427
428 /* Like R_PPC64_ADDR16, but may be unaligned. */
46807bf4
AM
429 HOW (R_PPC64_UADDR16, 1, 16, 0xffff, 0, FALSE, bitfield,
430 bfd_elf_generic_reloc),
5bd4f169
AM
431
432 /* 32-bit PC relative. */
46807bf4
AM
433 HOW (R_PPC64_REL32, 2, 32, 0xffffffff, 0, TRUE, signed,
434 bfd_elf_generic_reloc),
5bd4f169 435
10ed1bba 436 /* 32-bit relocation to the symbol's procedure linkage table. */
46807bf4
AM
437 HOW (R_PPC64_PLT32, 2, 32, 0xffffffff, 0, FALSE, bitfield,
438 ppc64_elf_unhandled_reloc),
5bd4f169
AM
439
440 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
441 FIXME: R_PPC64_PLTREL32 not supported. */
46807bf4
AM
442 HOW (R_PPC64_PLTREL32, 2, 32, 0xffffffff, 0, TRUE, signed,
443 ppc64_elf_unhandled_reloc),
5bd4f169
AM
444
445 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
446 the symbol. */
46807bf4
AM
447 HOW (R_PPC64_PLT16_LO, 1, 16, 0xffff, 0, FALSE, dont,
448 ppc64_elf_unhandled_reloc),
5bd4f169
AM
449
450 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
451 the symbol. */
46807bf4
AM
452 HOW (R_PPC64_PLT16_HI, 1, 16, 0xffff, 16, FALSE, signed,
453 ppc64_elf_unhandled_reloc),
5bd4f169
AM
454
455 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
456 the symbol. */
46807bf4
AM
457 HOW (R_PPC64_PLT16_HA, 1, 16, 0xffff, 16, FALSE, signed,
458 ppc64_elf_unhandled_reloc),
5bd4f169 459
c061c2d8 460 /* 16-bit section relative relocation. */
46807bf4
AM
461 HOW (R_PPC64_SECTOFF, 1, 16, 0xffff, 0, FALSE, signed,
462 ppc64_elf_sectoff_reloc),
5bd4f169 463
c061c2d8 464 /* Like R_PPC64_SECTOFF, but no overflow warning. */
46807bf4
AM
465 HOW (R_PPC64_SECTOFF_LO, 1, 16, 0xffff, 0, FALSE, dont,
466 ppc64_elf_sectoff_reloc),
5bd4f169
AM
467
468 /* 16-bit upper half section relative relocation. */
46807bf4
AM
469 HOW (R_PPC64_SECTOFF_HI, 1, 16, 0xffff, 16, FALSE, signed,
470 ppc64_elf_sectoff_reloc),
5bd4f169
AM
471
472 /* 16-bit upper half adjusted section relative relocation. */
46807bf4
AM
473 HOW (R_PPC64_SECTOFF_HA, 1, 16, 0xffff, 16, FALSE, signed,
474 ppc64_elf_sectoff_ha_reloc),
5bd4f169 475
04c9666a 476 /* Like R_PPC64_REL24 without touching the two least significant bits. */
46807bf4
AM
477 HOW (R_PPC64_REL30, 2, 30, 0xfffffffc, 2, TRUE, dont,
478 bfd_elf_generic_reloc),
5bd4f169
AM
479
480 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
481
482 /* A standard 64-bit relocation. */
46807bf4
AM
483 HOW (R_PPC64_ADDR64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
484 bfd_elf_generic_reloc),
5bd4f169
AM
485
486 /* The bits 32-47 of an address. */
46807bf4
AM
487 HOW (R_PPC64_ADDR16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont,
488 bfd_elf_generic_reloc),
5bd4f169
AM
489
490 /* The bits 32-47 of an address, plus 1 if the contents of the low
491 16 bits, treated as a signed number, is negative. */
46807bf4
AM
492 HOW (R_PPC64_ADDR16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont,
493 ppc64_elf_ha_reloc),
5bd4f169
AM
494
495 /* The bits 48-63 of an address. */
46807bf4
AM
496 HOW (R_PPC64_ADDR16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont,
497 bfd_elf_generic_reloc),
5bd4f169
AM
498
499 /* The bits 48-63 of an address, plus 1 if the contents of the low
500 16 bits, treated as a signed number, is negative. */
46807bf4
AM
501 HOW (R_PPC64_ADDR16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont,
502 ppc64_elf_ha_reloc),
5bd4f169
AM
503
504 /* Like ADDR64, but may be unaligned. */
46807bf4
AM
505 HOW (R_PPC64_UADDR64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
506 bfd_elf_generic_reloc),
5bd4f169
AM
507
508 /* 64-bit relative relocation. */
46807bf4
AM
509 HOW (R_PPC64_REL64, 4, 64, 0xffffffffffffffffULL, 0, TRUE, dont,
510 bfd_elf_generic_reloc),
5bd4f169 511
cedb70c5 512 /* 64-bit relocation to the symbol's procedure linkage table. */
46807bf4
AM
513 HOW (R_PPC64_PLT64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
514 ppc64_elf_unhandled_reloc),
5bd4f169
AM
515
516 /* 64-bit PC relative relocation to the symbol's procedure linkage
517 table. */
518 /* FIXME: R_PPC64_PLTREL64 not supported. */
46807bf4
AM
519 HOW (R_PPC64_PLTREL64, 4, 64, 0xffffffffffffffffULL, 0, TRUE, dont,
520 ppc64_elf_unhandled_reloc),
5bd4f169
AM
521
522 /* 16 bit TOC-relative relocation. */
5bd4f169 523 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
46807bf4
AM
524 HOW (R_PPC64_TOC16, 1, 16, 0xffff, 0, FALSE, signed,
525 ppc64_elf_toc_reloc),
5bd4f169
AM
526
527 /* 16 bit TOC-relative relocation without overflow. */
5bd4f169 528 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
46807bf4
AM
529 HOW (R_PPC64_TOC16_LO, 1, 16, 0xffff, 0, FALSE, dont,
530 ppc64_elf_toc_reloc),
5bd4f169
AM
531
532 /* 16 bit TOC-relative relocation, high 16 bits. */
5bd4f169 533 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
46807bf4
AM
534 HOW (R_PPC64_TOC16_HI, 1, 16, 0xffff, 16, FALSE, signed,
535 ppc64_elf_toc_reloc),
5bd4f169
AM
536
537 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
538 contents of the low 16 bits, treated as a signed number, is
539 negative. */
5bd4f169 540 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
46807bf4
AM
541 HOW (R_PPC64_TOC16_HA, 1, 16, 0xffff, 16, FALSE, signed,
542 ppc64_elf_toc_ha_reloc),
5bd4f169
AM
543
544 /* 64-bit relocation; insert value of TOC base (.TOC.). */
5bd4f169 545 /* R_PPC64_TOC 51 doubleword64 .TOC. */
46807bf4
AM
546 HOW (R_PPC64_TOC, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
547 ppc64_elf_toc64_reloc),
5bd4f169
AM
548
549 /* Like R_PPC64_GOT16, but also informs the link editor that the
550 value to relocate may (!) refer to a PLT entry which the link
551 editor (a) may replace with the symbol value. If the link editor
552 is unable to fully resolve the symbol, it may (b) create a PLT
553 entry and store the address to the new PLT entry in the GOT.
554 This permits lazy resolution of function symbols at run time.
555 The link editor may also skip all of this and just (c) emit a
556 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
557 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
46807bf4
AM
558 HOW (R_PPC64_PLTGOT16, 1, 16, 0xffff, 0, FALSE,signed,
559 ppc64_elf_unhandled_reloc),
411e1bfb
AM
560
561 /* Like R_PPC64_PLTGOT16, but without overflow. */
562 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
46807bf4
AM
563 HOW (R_PPC64_PLTGOT16_LO, 1, 16, 0xffff, 0, FALSE, dont,
564 ppc64_elf_unhandled_reloc),
411e1bfb
AM
565
566 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
567 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
46807bf4
AM
568 HOW (R_PPC64_PLTGOT16_HI, 1, 16, 0xffff, 16, FALSE, signed,
569 ppc64_elf_unhandled_reloc),
411e1bfb
AM
570
571 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
572 1 if the contents of the low 16 bits, treated as a signed number,
573 is negative. */
574 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
46807bf4
AM
575 HOW (R_PPC64_PLTGOT16_HA, 1, 16, 0xffff, 16, FALSE, signed,
576 ppc64_elf_unhandled_reloc),
411e1bfb
AM
577
578 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
46807bf4
AM
579 HOW (R_PPC64_ADDR16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
580 bfd_elf_generic_reloc),
411e1bfb
AM
581
582 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
46807bf4
AM
583 HOW (R_PPC64_ADDR16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
584 bfd_elf_generic_reloc),
411e1bfb
AM
585
586 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
46807bf4
AM
587 HOW (R_PPC64_GOT16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
588 ppc64_elf_unhandled_reloc),
411e1bfb
AM
589
590 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
46807bf4
AM
591 HOW (R_PPC64_GOT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
592 ppc64_elf_unhandled_reloc),
411e1bfb
AM
593
594 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
46807bf4
AM
595 HOW (R_PPC64_PLT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
596 ppc64_elf_unhandled_reloc),
411e1bfb
AM
597
598 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
46807bf4
AM
599 HOW (R_PPC64_SECTOFF_DS, 1, 16, 0xfffc, 0, FALSE, signed,
600 ppc64_elf_sectoff_reloc),
411e1bfb
AM
601
602 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
46807bf4
AM
603 HOW (R_PPC64_SECTOFF_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
604 ppc64_elf_sectoff_reloc),
411e1bfb
AM
605
606 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
46807bf4
AM
607 HOW (R_PPC64_TOC16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
608 ppc64_elf_toc_reloc),
411e1bfb
AM
609
610 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
46807bf4
AM
611 HOW (R_PPC64_TOC16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
612 ppc64_elf_toc_reloc),
411e1bfb
AM
613
614 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
615 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
46807bf4
AM
616 HOW (R_PPC64_PLTGOT16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
617 ppc64_elf_unhandled_reloc),
411e1bfb
AM
618
619 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
620 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
46807bf4
AM
621 HOW (R_PPC64_PLTGOT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
622 ppc64_elf_unhandled_reloc),
411e1bfb 623
727fc41e 624 /* Marker relocs for TLS. */
46807bf4
AM
625 HOW (R_PPC64_TLS, 2, 32, 0, 0, FALSE, dont,
626 bfd_elf_generic_reloc),
627
628 HOW (R_PPC64_TLSGD, 2, 32, 0, 0, FALSE, dont,
629 bfd_elf_generic_reloc),
630
631 HOW (R_PPC64_TLSLD, 2, 32, 0, 0, FALSE, dont,
632 bfd_elf_generic_reloc),
727fc41e 633
23cedd1d
AM
634 /* Marker reloc for optimizing r2 save in prologue rather than on
635 each plt call stub. */
46807bf4
AM
636 HOW (R_PPC64_TOCSAVE, 2, 32, 0, 0, FALSE, dont,
637 bfd_elf_generic_reloc),
3b421ab3 638
23cedd1d 639 /* Marker relocs on inline plt call instructions. */
46807bf4
AM
640 HOW (R_PPC64_PLTSEQ, 2, 32, 0, 0, FALSE, dont,
641 bfd_elf_generic_reloc),
642
643 HOW (R_PPC64_PLTCALL, 2, 32, 0, 0, FALSE, dont,
644 bfd_elf_generic_reloc),
23cedd1d 645
411e1bfb
AM
646 /* Computes the load module index of the load module that contains the
647 definition of its TLS sym. */
46807bf4
AM
648 HOW (R_PPC64_DTPMOD64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
649 ppc64_elf_unhandled_reloc),
411e1bfb
AM
650
651 /* Computes a dtv-relative displacement, the difference between the value
652 of sym+add and the base address of the thread-local storage block that
653 contains the definition of sym, minus 0x8000. */
46807bf4
AM
654 HOW (R_PPC64_DTPREL64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
655 ppc64_elf_unhandled_reloc),
411e1bfb
AM
656
657 /* A 16 bit dtprel reloc. */
46807bf4
AM
658 HOW (R_PPC64_DTPREL16, 1, 16, 0xffff, 0, FALSE, signed,
659 ppc64_elf_unhandled_reloc),
411e1bfb
AM
660
661 /* Like DTPREL16, but no overflow. */
46807bf4
AM
662 HOW (R_PPC64_DTPREL16_LO, 1, 16, 0xffff, 0, FALSE, dont,
663 ppc64_elf_unhandled_reloc),
411e1bfb
AM
664
665 /* Like DTPREL16_LO, but next higher group of 16 bits. */
46807bf4
AM
666 HOW (R_PPC64_DTPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
667 ppc64_elf_unhandled_reloc),
411e1bfb
AM
668
669 /* Like DTPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
670 HOW (R_PPC64_DTPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
671 ppc64_elf_unhandled_reloc),
411e1bfb
AM
672
673 /* Like DTPREL16_HI, but next higher group of 16 bits. */
46807bf4
AM
674 HOW (R_PPC64_DTPREL16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont,
675 ppc64_elf_unhandled_reloc),
411e1bfb
AM
676
677 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
46807bf4
AM
678 HOW (R_PPC64_DTPREL16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont,
679 ppc64_elf_unhandled_reloc),
411e1bfb
AM
680
681 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
46807bf4
AM
682 HOW (R_PPC64_DTPREL16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont,
683 ppc64_elf_unhandled_reloc),
411e1bfb
AM
684
685 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
46807bf4
AM
686 HOW (R_PPC64_DTPREL16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont,
687 ppc64_elf_unhandled_reloc),
411e1bfb
AM
688
689 /* Like DTPREL16, but for insns with a DS field. */
46807bf4
AM
690 HOW (R_PPC64_DTPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
691 ppc64_elf_unhandled_reloc),
411e1bfb
AM
692
693 /* Like DTPREL16_DS, but no overflow. */
46807bf4
AM
694 HOW (R_PPC64_DTPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
695 ppc64_elf_unhandled_reloc),
411e1bfb
AM
696
697 /* Computes a tp-relative displacement, the difference between the value of
698 sym+add and the value of the thread pointer (r13). */
46807bf4
AM
699 HOW (R_PPC64_TPREL64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
700 ppc64_elf_unhandled_reloc),
411e1bfb
AM
701
702 /* A 16 bit tprel reloc. */
46807bf4
AM
703 HOW (R_PPC64_TPREL16, 1, 16, 0xffff, 0, FALSE, signed,
704 ppc64_elf_unhandled_reloc),
411e1bfb
AM
705
706 /* Like TPREL16, but no overflow. */
46807bf4
AM
707 HOW (R_PPC64_TPREL16_LO, 1, 16, 0xffff, 0, FALSE, dont,
708 ppc64_elf_unhandled_reloc),
411e1bfb
AM
709
710 /* Like TPREL16_LO, but next higher group of 16 bits. */
46807bf4
AM
711 HOW (R_PPC64_TPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
712 ppc64_elf_unhandled_reloc),
411e1bfb
AM
713
714 /* Like TPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
715 HOW (R_PPC64_TPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
716 ppc64_elf_unhandled_reloc),
411e1bfb
AM
717
718 /* Like TPREL16_HI, but next higher group of 16 bits. */
46807bf4
AM
719 HOW (R_PPC64_TPREL16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont,
720 ppc64_elf_unhandled_reloc),
411e1bfb
AM
721
722 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
46807bf4
AM
723 HOW (R_PPC64_TPREL16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont,
724 ppc64_elf_unhandled_reloc),
411e1bfb
AM
725
726 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
46807bf4
AM
727 HOW (R_PPC64_TPREL16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont,
728 ppc64_elf_unhandled_reloc),
411e1bfb
AM
729
730 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
46807bf4
AM
731 HOW (R_PPC64_TPREL16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont,
732 ppc64_elf_unhandled_reloc),
411e1bfb
AM
733
734 /* Like TPREL16, but for insns with a DS field. */
46807bf4
AM
735 HOW (R_PPC64_TPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
736 ppc64_elf_unhandled_reloc),
411e1bfb
AM
737
738 /* Like TPREL16_DS, but no overflow. */
46807bf4
AM
739 HOW (R_PPC64_TPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
740 ppc64_elf_unhandled_reloc),
411e1bfb
AM
741
742 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
743 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
744 to the first entry relative to the TOC base (r2). */
46807bf4
AM
745 HOW (R_PPC64_GOT_TLSGD16, 1, 16, 0xffff, 0, FALSE, signed,
746 ppc64_elf_unhandled_reloc),
5bd4f169 747
411e1bfb 748 /* Like GOT_TLSGD16, but no overflow. */
46807bf4
AM
749 HOW (R_PPC64_GOT_TLSGD16_LO, 1, 16, 0xffff, 0, FALSE, dont,
750 ppc64_elf_unhandled_reloc),
5bd4f169 751
411e1bfb 752 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
46807bf4
AM
753 HOW (R_PPC64_GOT_TLSGD16_HI, 1, 16, 0xffff, 16, FALSE, signed,
754 ppc64_elf_unhandled_reloc),
5bd4f169 755
411e1bfb 756 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
46807bf4
AM
757 HOW (R_PPC64_GOT_TLSGD16_HA, 1, 16, 0xffff, 16, FALSE, signed,
758 ppc64_elf_unhandled_reloc),
5bd4f169 759
411e1bfb
AM
760 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
761 with values (sym+add)@dtpmod and zero, and computes the offset to the
762 first entry relative to the TOC base (r2). */
46807bf4
AM
763 HOW (R_PPC64_GOT_TLSLD16, 1, 16, 0xffff, 0, FALSE, signed,
764 ppc64_elf_unhandled_reloc),
5bd4f169 765
411e1bfb 766 /* Like GOT_TLSLD16, but no overflow. */
46807bf4
AM
767 HOW (R_PPC64_GOT_TLSLD16_LO, 1, 16, 0xffff, 0, FALSE, dont,
768 ppc64_elf_unhandled_reloc),
5bd4f169 769
411e1bfb 770 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
46807bf4
AM
771 HOW (R_PPC64_GOT_TLSLD16_HI, 1, 16, 0xffff, 16, FALSE, signed,
772 ppc64_elf_unhandled_reloc),
5bd4f169 773
411e1bfb 774 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
46807bf4
AM
775 HOW (R_PPC64_GOT_TLSLD16_HA, 1, 16, 0xffff, 16, FALSE, signed,
776 ppc64_elf_unhandled_reloc),
5bd4f169 777
411e1bfb
AM
778 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
779 the offset to the entry relative to the TOC base (r2). */
46807bf4
AM
780 HOW (R_PPC64_GOT_DTPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
781 ppc64_elf_unhandled_reloc),
5bd4f169 782
411e1bfb 783 /* Like GOT_DTPREL16_DS, but no overflow. */
46807bf4
AM
784 HOW (R_PPC64_GOT_DTPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
785 ppc64_elf_unhandled_reloc),
5bd4f169 786
411e1bfb 787 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
46807bf4
AM
788 HOW (R_PPC64_GOT_DTPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
789 ppc64_elf_unhandled_reloc),
5bd4f169 790
411e1bfb 791 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
792 HOW (R_PPC64_GOT_DTPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
793 ppc64_elf_unhandled_reloc),
411e1bfb
AM
794
795 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
796 offset to the entry relative to the TOC base (r2). */
46807bf4
AM
797 HOW (R_PPC64_GOT_TPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
798 ppc64_elf_unhandled_reloc),
5bd4f169 799
411e1bfb 800 /* Like GOT_TPREL16_DS, but no overflow. */
46807bf4
AM
801 HOW (R_PPC64_GOT_TPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
802 ppc64_elf_unhandled_reloc),
5bd4f169 803
411e1bfb 804 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
46807bf4
AM
805 HOW (R_PPC64_GOT_TPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
806 ppc64_elf_unhandled_reloc),
5bd4f169 807
411e1bfb 808 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
809 HOW (R_PPC64_GOT_TPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
810 ppc64_elf_unhandled_reloc),
811
812 HOW (R_PPC64_JMP_IREL, 0, 0, 0, 0, FALSE, dont,
813 ppc64_elf_unhandled_reloc),
814
815 HOW (R_PPC64_IRELATIVE, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
816 bfd_elf_generic_reloc),
e054468f 817
25f23106 818 /* A 16 bit relative relocation. */
46807bf4
AM
819 HOW (R_PPC64_REL16, 1, 16, 0xffff, 0, TRUE, signed,
820 bfd_elf_generic_reloc),
25f23106
AM
821
822 /* A 16 bit relative relocation without overflow. */
46807bf4
AM
823 HOW (R_PPC64_REL16_LO, 1, 16, 0xffff, 0, TRUE, dont,
824 bfd_elf_generic_reloc),
25f23106
AM
825
826 /* The high order 16 bits of a relative address. */
46807bf4
AM
827 HOW (R_PPC64_REL16_HI, 1, 16, 0xffff, 16, TRUE, signed,
828 bfd_elf_generic_reloc),
25f23106
AM
829
830 /* The high order 16 bits of a relative address, plus 1 if the contents of
831 the low 16 bits, treated as a signed number, is negative. */
46807bf4
AM
832 HOW (R_PPC64_REL16_HA, 1, 16, 0xffff, 16, TRUE, signed,
833 ppc64_elf_ha_reloc),
25f23106 834
4a969973
AM
835 HOW (R_PPC64_REL16_HIGH, 1, 16, 0xffff, 16, TRUE, dont,
836 bfd_elf_generic_reloc),
837
838 HOW (R_PPC64_REL16_HIGHA, 1, 16, 0xffff, 16, TRUE, dont,
839 ppc64_elf_ha_reloc),
840
841 HOW (R_PPC64_REL16_HIGHER, 1, 16, 0xffff, 32, TRUE, dont,
842 bfd_elf_generic_reloc),
843
844 HOW (R_PPC64_REL16_HIGHERA, 1, 16, 0xffff, 32, TRUE, dont,
845 ppc64_elf_ha_reloc),
846
847 HOW (R_PPC64_REL16_HIGHEST, 1, 16, 0xffff, 48, TRUE, dont,
848 bfd_elf_generic_reloc),
849
850 HOW (R_PPC64_REL16_HIGHESTA, 1, 16, 0xffff, 48, TRUE, dont,
851 ppc64_elf_ha_reloc),
852
a680de9a 853 /* Like R_PPC64_REL16_HA but for split field in addpcis. */
46807bf4
AM
854 HOW (R_PPC64_REL16DX_HA, 2, 16, 0x1fffc1, 16, TRUE, signed,
855 ppc64_elf_ha_reloc),
a680de9a 856
7ba71655 857 /* A split-field reloc for addpcis, non-relative (gas internal use only). */
46807bf4
AM
858 HOW (R_PPC64_16DX_HA, 2, 16, 0x1fffc1, 16, FALSE, signed,
859 ppc64_elf_ha_reloc),
7ba71655 860
f9c6b907 861 /* Like R_PPC64_ADDR16_HI, but no overflow. */
46807bf4
AM
862 HOW (R_PPC64_ADDR16_HIGH, 1, 16, 0xffff, 16, FALSE, dont,
863 bfd_elf_generic_reloc),
f9c6b907
AM
864
865 /* Like R_PPC64_ADDR16_HA, but no overflow. */
46807bf4
AM
866 HOW (R_PPC64_ADDR16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont,
867 ppc64_elf_ha_reloc),
f9c6b907
AM
868
869 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
46807bf4
AM
870 HOW (R_PPC64_DTPREL16_HIGH, 1, 16, 0xffff, 16, FALSE, dont,
871 ppc64_elf_unhandled_reloc),
f9c6b907
AM
872
873 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
46807bf4
AM
874 HOW (R_PPC64_DTPREL16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont,
875 ppc64_elf_unhandled_reloc),
f9c6b907
AM
876
877 /* Like R_PPC64_TPREL16_HI, but no overflow. */
46807bf4
AM
878 HOW (R_PPC64_TPREL16_HIGH, 1, 16, 0xffff, 16, FALSE, dont,
879 ppc64_elf_unhandled_reloc),
f9c6b907
AM
880
881 /* Like R_PPC64_TPREL16_HA, but no overflow. */
46807bf4
AM
882 HOW (R_PPC64_TPREL16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont,
883 ppc64_elf_unhandled_reloc),
f9c6b907 884
006589cf 885 /* Marker reloc on ELFv2 large-model function entry. */
46807bf4
AM
886 HOW (R_PPC64_ENTRY, 2, 32, 0, 0, FALSE, dont,
887 bfd_elf_generic_reloc),
006589cf 888
45965137 889 /* Like ADDR64, but use local entry point of function. */
46807bf4
AM
890 HOW (R_PPC64_ADDR64_LOCAL, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
891 bfd_elf_generic_reloc),
45965137 892
5663e321
AM
893 HOW (R_PPC64_PLTSEQ_NOTOC, 2, 32, 0, 0, FALSE, dont,
894 bfd_elf_generic_reloc),
895
896 HOW (R_PPC64_PLTCALL_NOTOC, 2, 32, 0, 0, FALSE, dont,
897 bfd_elf_generic_reloc),
898
899 HOW (R_PPC64_PCREL_OPT, 2, 32, 0, 0, FALSE, dont,
900 bfd_elf_generic_reloc),
901
902 HOW (R_PPC64_D34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed,
903 ppc64_elf_prefix_reloc),
904
905 HOW (R_PPC64_D34_LO, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, dont,
906 ppc64_elf_prefix_reloc),
907
908 HOW (R_PPC64_D34_HI30, 4, 34, 0x3ffff0000ffffULL, 34, FALSE, dont,
909 ppc64_elf_prefix_reloc),
910
911 HOW (R_PPC64_D34_HA30, 4, 34, 0x3ffff0000ffffULL, 34, FALSE, dont,
912 ppc64_elf_prefix_reloc),
913
914 HOW (R_PPC64_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
915 ppc64_elf_prefix_reloc),
916
917 HOW (R_PPC64_GOT_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
918 ppc64_elf_unhandled_reloc),
919
920 HOW (R_PPC64_PLT_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
921 ppc64_elf_unhandled_reloc),
922
923 HOW (R_PPC64_PLT_PCREL34_NOTOC, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
924 ppc64_elf_unhandled_reloc),
925
c213164a
AM
926 HOW (R_PPC64_TPREL34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed,
927 ppc64_elf_unhandled_reloc),
928
929 HOW (R_PPC64_DTPREL34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed,
930 ppc64_elf_unhandled_reloc),
931
932 HOW (R_PPC64_GOT_TLSGD34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
933 ppc64_elf_unhandled_reloc),
934
935 HOW (R_PPC64_GOT_TLSLD34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
936 ppc64_elf_unhandled_reloc),
937
938 HOW (R_PPC64_GOT_TPREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
939 ppc64_elf_unhandled_reloc),
940
941 HOW (R_PPC64_GOT_DTPREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
942 ppc64_elf_unhandled_reloc),
943
5663e321
AM
944 HOW (R_PPC64_ADDR16_HIGHER34, 1, 16, 0xffff, 34, FALSE, dont,
945 bfd_elf_generic_reloc),
946
947 HOW (R_PPC64_ADDR16_HIGHERA34, 1, 16, 0xffff, 34, FALSE, dont,
948 ppc64_elf_ha_reloc),
949
950 HOW (R_PPC64_ADDR16_HIGHEST34, 1, 16, 0xffff, 50, FALSE, dont,
951 bfd_elf_generic_reloc),
952
953 HOW (R_PPC64_ADDR16_HIGHESTA34, 1, 16, 0xffff, 50, FALSE, dont,
954 ppc64_elf_ha_reloc),
955
956 HOW (R_PPC64_REL16_HIGHER34, 1, 16, 0xffff, 34, TRUE, dont,
957 bfd_elf_generic_reloc),
958
959 HOW (R_PPC64_REL16_HIGHERA34, 1, 16, 0xffff, 34, TRUE, dont,
960 ppc64_elf_ha_reloc),
961
962 HOW (R_PPC64_REL16_HIGHEST34, 1, 16, 0xffff, 50, TRUE, dont,
963 bfd_elf_generic_reloc),
964
965 HOW (R_PPC64_REL16_HIGHESTA34, 1, 16, 0xffff, 50, TRUE, dont,
966 ppc64_elf_ha_reloc),
967
968 HOW (R_PPC64_D28, 4, 28, 0xfff0000ffffULL, 0, FALSE, signed,
969 ppc64_elf_prefix_reloc),
970
971 HOW (R_PPC64_PCREL28, 4, 28, 0xfff0000ffffULL, 0, TRUE, signed,
972 ppc64_elf_prefix_reloc),
973
5bd4f169 974 /* GNU extension to record C++ vtable hierarchy. */
46807bf4
AM
975 HOW (R_PPC64_GNU_VTINHERIT, 0, 0, 0, 0, FALSE, dont,
976 NULL),
5bd4f169
AM
977
978 /* GNU extension to record C++ vtable member usage. */
46807bf4
AM
979 HOW (R_PPC64_GNU_VTENTRY, 0, 0, 0, 0, FALSE, dont,
980 NULL),
5bd4f169
AM
981};
982
983\f
984/* Initialize the ppc64_elf_howto_table, so that linear accesses can
985 be done. */
986
987static void
4ce794b7 988ppc_howto_init (void)
5bd4f169
AM
989{
990 unsigned int i, type;
991
a4b6fadd 992 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
5bd4f169
AM
993 {
994 type = ppc64_elf_howto_raw[i].type;
a4b6fadd 995 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table));
5bd4f169
AM
996 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
997 }
998}
999
1000static reloc_howto_type *
f3185997 1001ppc64_elf_reloc_type_lookup (bfd *abfd,
4ce794b7 1002 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;
1282 case BFD_RELOC_PPC64_GOT_TLSGD34: r = R_PPC64_GOT_TLSGD34;
1283 break;
1284 case BFD_RELOC_PPC64_GOT_TLSLD34: r = R_PPC64_GOT_TLSLD34;
1285 break;
1286 case BFD_RELOC_PPC64_GOT_TPREL34: r = R_PPC64_GOT_TPREL34;
1287 break;
1288 case BFD_RELOC_PPC64_GOT_DTPREL34: r = R_PPC64_GOT_DTPREL34;
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
AM
1319static reloc_howto_type *
1320ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1321 const char *r_name)
1322{
1323 unsigned int i;
1324
a4b6fadd 1325 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
157090f7
AM
1326 if (ppc64_elf_howto_raw[i].name != NULL
1327 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
1328 return &ppc64_elf_howto_raw[i];
1329
1330 return NULL;
1331}
1332
5bd4f169
AM
1333/* Set the howto pointer for a PowerPC ELF reloc. */
1334
f3185997 1335static bfd_boolean
4aef7643 1336ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
4ce794b7 1337 Elf_Internal_Rela *dst)
5bd4f169 1338{
65f38f15
AM
1339 unsigned int type;
1340
ef60b7ff 1341 /* Initialize howto table if needed. */
5bd4f169 1342 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
1343 ppc_howto_init ();
1344
65f38f15 1345 type = ELF64_R_TYPE (dst->r_info);
a4b6fadd 1346 if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
d0fb9a8d 1347 {
695344c0 1348 /* xgettext:c-format */
0aa13fee 1349 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
cf97bcb0 1350 abfd, type);
f3185997
NC
1351 bfd_set_error (bfd_error_bad_value);
1352 return FALSE;
d0fb9a8d 1353 }
65f38f15 1354 cache_ptr->howto = ppc64_elf_howto_table[type];
f3185997
NC
1355 if (cache_ptr->howto == NULL || cache_ptr->howto->name == NULL)
1356 {
1357 /* xgettext:c-format */
1358 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1359 abfd, type);
1360 bfd_set_error (bfd_error_bad_value);
1361 return FALSE;
1362 }
2cdcc330 1363
f3185997 1364 return TRUE;
5bd4f169
AM
1365}
1366
04c9666a 1367/* Handle the R_PPC64_ADDR16_HA and similar relocs. */
5bd4f169
AM
1368
1369static bfd_reloc_status_type
4ce794b7
AM
1370ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1371 void *data, asection *input_section,
1372 bfd *output_bfd, char **error_message)
5bd4f169 1373{
a680de9a
PB
1374 enum elf_ppc64_reloc_type r_type;
1375 long insn;
1376 bfd_size_type octets;
3de43e7b 1377 bfd_vma value;
a680de9a 1378
805fc799
AM
1379 /* If this is a relocatable link (output_bfd test tells us), just
1380 call the generic function. Any adjustment will be done at final
1381 link time. */
1382 if (output_bfd != NULL)
cedb70c5 1383 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1384 input_section, output_bfd, error_message);
1385
5663e321
AM
1386 /* Adjust the addend for sign extension of the low 16 (or 34) bits.
1387 We won't actually be using the low bits, so trashing them
805fc799 1388 doesn't matter. */
a680de9a 1389 r_type = reloc_entry->howto->type;
5663e321
AM
1390 if (r_type == R_PPC64_ADDR16_HIGHERA34
1391 || r_type == R_PPC64_ADDR16_HIGHESTA34
1392 || r_type == R_PPC64_REL16_HIGHERA34
1393 || r_type == R_PPC64_REL16_HIGHESTA34)
1394 reloc_entry->addend += 1ULL << 33;
1395 else
1396 reloc_entry->addend += 1U << 15;
a680de9a
PB
1397 if (r_type != R_PPC64_REL16DX_HA)
1398 return bfd_reloc_continue;
1399
1400 value = 0;
1401 if (!bfd_is_com_section (symbol->section))
1402 value = symbol->value;
1403 value += (reloc_entry->addend
1404 + symbol->section->output_offset
1405 + symbol->section->output_section->vma);
1406 value -= (reloc_entry->address
1407 + input_section->output_offset
1408 + input_section->output_section->vma);
3de43e7b 1409 value = (bfd_signed_vma) value >> 16;
a680de9a 1410
bb294208 1411 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
a680de9a
PB
1412 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
1413 insn &= ~0x1fffc1;
3de43e7b 1414 insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
a680de9a 1415 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
3de43e7b 1416 if (value + 0x8000 > 0xffff)
a680de9a
PB
1417 return bfd_reloc_overflow;
1418 return bfd_reloc_ok;
805fc799 1419}
5bd4f169 1420
2441e016
AM
1421static bfd_reloc_status_type
1422ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1423 void *data, asection *input_section,
1424 bfd *output_bfd, char **error_message)
1425{
1426 if (output_bfd != NULL)
1427 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1428 input_section, output_bfd, error_message);
1429
699733f6
AM
1430 if (strcmp (symbol->section->name, ".opd") == 0
1431 && (symbol->section->owner->flags & DYNAMIC) == 0)
2441e016
AM
1432 {
1433 bfd_vma dest = opd_entry_value (symbol->section,
1434 symbol->value + reloc_entry->addend,
aef36ac1 1435 NULL, NULL, FALSE);
2441e016
AM
1436 if (dest != (bfd_vma) -1)
1437 reloc_entry->addend = dest - (symbol->value
1438 + symbol->section->output_section->vma
1439 + symbol->section->output_offset);
1440 }
810d4e75
AM
1441 else
1442 {
1443 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
1444
1445 if (symbol->section->owner != abfd
9f284bf9 1446 && symbol->section->owner != NULL
810d4e75
AM
1447 && abiversion (symbol->section->owner) >= 2)
1448 {
1449 unsigned int i;
1450
1451 for (i = 0; i < symbol->section->owner->symcount; ++i)
1452 {
1453 asymbol *symdef = symbol->section->owner->outsymbols[i];
1454
1455 if (strcmp (symdef->name, symbol->name) == 0)
1456 {
1457 elfsym = (elf_symbol_type *) symdef;
1458 break;
1459 }
1460 }
1461 }
1462 reloc_entry->addend
1463 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
1464 }
2441e016
AM
1465 return bfd_reloc_continue;
1466}
1467
805fc799 1468static bfd_reloc_status_type
4ce794b7
AM
1469ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1470 void *data, asection *input_section,
1471 bfd *output_bfd, char **error_message)
805fc799
AM
1472{
1473 long insn;
04c9666a 1474 enum elf_ppc64_reloc_type r_type;
805fc799 1475 bfd_size_type octets;
794e51c0
AM
1476 /* Assume 'at' branch hints. */
1477 bfd_boolean is_isa_v2 = TRUE;
805fc799
AM
1478
1479 /* If this is a relocatable link (output_bfd test tells us), just
1480 call the generic function. Any adjustment will be done at final
1481 link time. */
5bd4f169 1482 if (output_bfd != NULL)
cedb70c5 1483 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1484 input_section, output_bfd, error_message);
1485
bb294208 1486 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
805fc799
AM
1487 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
1488 insn &= ~(0x01 << 21);
4ce794b7 1489 r_type = reloc_entry->howto->type;
805fc799
AM
1490 if (r_type == R_PPC64_ADDR14_BRTAKEN
1491 || r_type == R_PPC64_REL14_BRTAKEN)
cedb70c5 1492 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
805fc799 1493
794e51c0 1494 if (is_isa_v2)
5bd4f169 1495 {
805fc799
AM
1496 /* Set 'a' bit. This is 0b00010 in BO field for branch
1497 on CR(BI) insns (BO == 001at or 011at), and 0b01000
1498 for branch on CTR insns (BO == 1a00t or 1a01t). */
1499 if ((insn & (0x14 << 21)) == (0x04 << 21))
1500 insn |= 0x02 << 21;
1501 else if ((insn & (0x14 << 21)) == (0x10 << 21))
1502 insn |= 0x08 << 21;
1503 else
2441e016 1504 goto out;
5bd4f169 1505 }
805fc799
AM
1506 else
1507 {
1508 bfd_vma target = 0;
1509 bfd_vma from;
5bd4f169 1510
805fc799
AM
1511 if (!bfd_is_com_section (symbol->section))
1512 target = symbol->value;
1513 target += symbol->section->output_section->vma;
1514 target += symbol->section->output_offset;
1515 target += reloc_entry->addend;
5bd4f169 1516
805fc799
AM
1517 from = (reloc_entry->address
1518 + input_section->output_offset
1519 + input_section->output_section->vma);
5bd4f169 1520
805fc799
AM
1521 /* Invert 'y' bit if not the default. */
1522 if ((bfd_signed_vma) (target - from) < 0)
1523 insn ^= 0x01 << 21;
1524 }
4ce794b7 1525 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2441e016
AM
1526 out:
1527 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
1528 input_section, output_bfd, error_message);
805fc799 1529}
5bd4f169 1530
805fc799 1531static bfd_reloc_status_type
4ce794b7
AM
1532ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1533 void *data, asection *input_section,
1534 bfd *output_bfd, char **error_message)
805fc799
AM
1535{
1536 /* If this is a relocatable link (output_bfd test tells us), just
1537 call the generic function. Any adjustment will be done at final
1538 link time. */
1539 if (output_bfd != NULL)
cedb70c5 1540 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799 1541 input_section, output_bfd, error_message);
5bd4f169 1542
805fc799
AM
1543 /* Subtract the symbol section base address. */
1544 reloc_entry->addend -= symbol->section->output_section->vma;
5bd4f169
AM
1545 return bfd_reloc_continue;
1546}
1547
805fc799 1548static bfd_reloc_status_type
4ce794b7
AM
1549ppc64_elf_sectoff_ha_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
AM
1558 input_section, output_bfd, error_message);
1559
1560 /* Subtract the symbol section base address. */
1561 reloc_entry->addend -= symbol->section->output_section->vma;
1562
1563 /* Adjust the addend for sign extension of the low 16 bits. */
1564 reloc_entry->addend += 0x8000;
1565 return bfd_reloc_continue;
1566}
1567
1568static bfd_reloc_status_type
4ce794b7
AM
1569ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1570 void *data, asection *input_section,
1571 bfd *output_bfd, char **error_message)
805fc799
AM
1572{
1573 bfd_vma TOCstart;
1574
1575 /* If this is a relocatable link (output_bfd test tells us), just
1576 call the generic function. Any adjustment will be done at final
1577 link time. */
1578 if (output_bfd != NULL)
cedb70c5 1579 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1580 input_section, output_bfd, error_message);
1581
1582 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1583 if (TOCstart == 0)
1c865ab2 1584 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
1585
1586 /* Subtract the TOC base address. */
1587 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
1588 return bfd_reloc_continue;
1589}
1590
1591static bfd_reloc_status_type
4ce794b7
AM
1592ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1593 void *data, asection *input_section,
1594 bfd *output_bfd, char **error_message)
805fc799
AM
1595{
1596 bfd_vma TOCstart;
1597
1598 /* If this is a relocatable link (output_bfd test tells us), just
1599 call the generic function. Any adjustment will be done at final
1600 link time. */
1601 if (output_bfd != NULL)
cedb70c5 1602 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1603 input_section, output_bfd, error_message);
1604
1605 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1606 if (TOCstart == 0)
1c865ab2 1607 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
1608
1609 /* Subtract the TOC base address. */
1610 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
1611
1612 /* Adjust the addend for sign extension of the low 16 bits. */
1613 reloc_entry->addend += 0x8000;
1614 return bfd_reloc_continue;
1615}
1616
1617static bfd_reloc_status_type
4ce794b7
AM
1618ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1619 void *data, asection *input_section,
1620 bfd *output_bfd, char **error_message)
805fc799
AM
1621{
1622 bfd_vma TOCstart;
1623 bfd_size_type octets;
1624
1625 /* If this is a relocatable link (output_bfd test tells us), just
1626 call the generic function. Any adjustment will be done at final
1627 link time. */
1628 if (output_bfd != NULL)
cedb70c5 1629 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1630 input_section, output_bfd, error_message);
1631
1632 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1633 if (TOCstart == 0)
1c865ab2 1634 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799 1635
bb294208 1636 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
805fc799
AM
1637 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
1638 return bfd_reloc_ok;
1639}
1640
5663e321
AM
1641static bfd_reloc_status_type
1642ppc64_elf_prefix_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1643 void *data, asection *input_section,
1644 bfd *output_bfd, char **error_message)
1645{
1646 uint64_t insn;
1647 bfd_vma targ;
1648
1649 if (output_bfd != NULL)
1650 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1651 input_section, output_bfd, error_message);
1652
1653 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1654 insn <<= 32;
1655 insn |= bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address + 4);
1656
1657 targ = (symbol->section->output_section->vma
1658 + symbol->section->output_offset
1659 + reloc_entry->addend);
1660 if (!bfd_is_com_section (symbol->section))
1661 targ += symbol->value;
1662 if (reloc_entry->howto->type == R_PPC64_D34_HA30)
1663 targ += 1ULL << 33;
1664 if (reloc_entry->howto->pc_relative)
1665 {
1666 bfd_vma from = (reloc_entry->address
1667 + input_section->output_offset
1668 + input_section->output_section->vma);
1669 targ -=from;
1670 }
1671 targ >>= reloc_entry->howto->rightshift;
1672 insn &= ~reloc_entry->howto->dst_mask;
1673 insn |= ((targ << 16) | (targ & 0xffff)) & reloc_entry->howto->dst_mask;
1674 bfd_put_32 (abfd, insn >> 32, (bfd_byte *) data + reloc_entry->address);
1675 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address + 4);
1676 if (reloc_entry->howto->complain_on_overflow == complain_overflow_signed
1677 && (targ + (1ULL << (reloc_entry->howto->bitsize - 1))
1678 >= 1ULL << reloc_entry->howto->bitsize))
1679 return bfd_reloc_overflow;
1680 return bfd_reloc_ok;
1681}
1682
805fc799 1683static bfd_reloc_status_type
4ce794b7
AM
1684ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1685 void *data, asection *input_section,
1686 bfd *output_bfd, char **error_message)
805fc799
AM
1687{
1688 /* If this is a relocatable link (output_bfd test tells us), just
1689 call the generic function. Any adjustment will be done at final
1690 link time. */
1691 if (output_bfd != NULL)
cedb70c5 1692 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1693 input_section, output_bfd, error_message);
1694
1695 if (error_message != NULL)
1696 {
1697 static char buf[60];
1698 sprintf (buf, "generic linker can't handle %s",
1699 reloc_entry->howto->name);
1700 *error_message = buf;
1701 }
1702 return bfd_reloc_dangerous;
1703}
1704
927be08e
AM
1705/* Track GOT entries needed for a given symbol. We might need more
1706 than one got entry per symbol. */
1707struct got_entry
1708{
1709 struct got_entry *next;
1710
1711 /* The symbol addend that we'll be placing in the GOT. */
1712 bfd_vma addend;
1713
1714 /* Unlike other ELF targets, we use separate GOT entries for the same
1715 symbol referenced from different input files. This is to support
1716 automatic multiple TOC/GOT sections, where the TOC base can vary
1717 from one input file to another. After partitioning into TOC groups
1718 we merge entries within the group.
1719
1720 Point to the BFD owning this GOT entry. */
1721 bfd *owner;
1722
1723 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
1724 TLS_TPREL or TLS_DTPREL for tls entries. */
f961d9dd 1725 unsigned char tls_type;
927be08e
AM
1726
1727 /* Non-zero if got.ent points to real entry. */
f961d9dd 1728 unsigned char is_indirect;
927be08e
AM
1729
1730 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
1731 union
2cdcc330
AM
1732 {
1733 bfd_signed_vma refcount;
1734 bfd_vma offset;
1735 struct got_entry *ent;
1736 } got;
927be08e
AM
1737};
1738
1739/* The same for PLT. */
1740struct plt_entry
1741{
1742 struct plt_entry *next;
1743
1744 bfd_vma addend;
1745
1746 union
2cdcc330
AM
1747 {
1748 bfd_signed_vma refcount;
1749 bfd_vma offset;
1750 } plt;
927be08e
AM
1751};
1752
e717da7e
AM
1753struct ppc64_elf_obj_tdata
1754{
1755 struct elf_obj_tdata elf;
1756
1757 /* Shortcuts to dynamic linker sections. */
1758 asection *got;
1759 asection *relgot;
1760
b3fac117
AM
1761 /* Used during garbage collection. We attach global symbols defined
1762 on removed .opd entries to this section so that the sym is removed. */
1763 asection *deleted_section;
81688140 1764
927be08e 1765 /* TLS local dynamic got entry handling. Support for multiple GOT
e717da7e 1766 sections means we potentially need one of these for each input bfd. */
927be08e 1767 struct got_entry tlsld_got;
8860955f 1768
2cdcc330
AM
1769 union
1770 {
729eabd5
AM
1771 /* A copy of relocs before they are modified for --emit-relocs. */
1772 Elf_Internal_Rela *relocs;
1773
1774 /* Section contents. */
1775 bfd_byte *contents;
1776 } opd;
d77c8a4b
AM
1777
1778 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
1779 the reloc to be in the range -32768 to 32767. */
98528052
AM
1780 unsigned int has_small_toc_reloc : 1;
1781
560c8763
AM
1782 /* Set if toc/got ha relocs detected not using r2, or lo reloc
1783 instruction not one we handle. */
1784 unsigned int unexpected_toc_insn : 1;
066f4018 1785
903b777d
AM
1786 /* Set if PLT/GOT/TOC relocs that can be optimised are present in
1787 this file. */
1788 unsigned int has_optrel : 1;
e717da7e
AM
1789};
1790
1791#define ppc64_elf_tdata(bfd) \
1792 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
1793
1794#define ppc64_tlsld_got(bfd) \
1795 (&ppc64_elf_tdata (bfd)->tlsld_got)
1796
0c8d6e5c
AM
1797#define is_ppc64_elf(bfd) \
1798 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
4dfe6ac6 1799 && elf_object_id (bfd) == PPC64_ELF_DATA)
0c8d6e5c 1800
e717da7e
AM
1801/* Override the generic function because we store some extras. */
1802
1803static bfd_boolean
1804ppc64_elf_mkobject (bfd *abfd)
1805{
0ffa91dd 1806 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
4dfe6ac6 1807 PPC64_ELF_DATA);
e717da7e
AM
1808}
1809
feee612b 1810/* Fix bad default arch selected for a 64 bit input bfd when the
14b57c7c 1811 default is 32 bit. Also select arch based on apuinfo. */
feee612b 1812
b34976b6 1813static bfd_boolean
4ce794b7 1814ppc64_elf_object_p (bfd *abfd)
feee612b 1815{
14b57c7c
AM
1816 if (!abfd->arch_info->the_default)
1817 return TRUE;
1818
1819 if (abfd->arch_info->bits_per_word == 32)
feee612b
AM
1820 {
1821 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
1822
1823 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
1824 {
1825 /* Relies on arch after 32 bit default being 64 bit default. */
1826 abfd->arch_info = abfd->arch_info->next;
1827 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
1828 }
1829 }
14b57c7c 1830 return _bfd_elf_ppc_set_arch (abfd);
feee612b
AM
1831}
1832
d37c89e5
AM
1833/* Support for core dump NOTE sections. */
1834
1835static bfd_boolean
1836ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1837{
eea6121a 1838 size_t offset, size;
d37c89e5
AM
1839
1840 if (note->descsz != 504)
1841 return FALSE;
1842
1843 /* pr_cursig */
228e534f 1844 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
d37c89e5
AM
1845
1846 /* pr_pid */
228e534f 1847 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
d37c89e5
AM
1848
1849 /* pr_reg */
1850 offset = 112;
eea6121a 1851 size = 384;
d37c89e5
AM
1852
1853 /* Make a ".reg/999" section. */
1854 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 1855 size, note->descpos + offset);
d37c89e5
AM
1856}
1857
1858static bfd_boolean
1859ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1860{
1861 if (note->descsz != 136)
1862 return FALSE;
1863
228e534f 1864 elf_tdata (abfd)->core->pid
bc989cdc 1865 = bfd_get_32 (abfd, note->descdata + 24);
228e534f 1866 elf_tdata (abfd)->core->program
d37c89e5 1867 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
228e534f 1868 elf_tdata (abfd)->core->command
d37c89e5
AM
1869 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
1870
1871 return TRUE;
1872}
1873
183e98be
AM
1874static char *
1875ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
1876 ...)
1877{
1878 switch (note_type)
1879 {
1880 default:
1881 return NULL;
1882
1883 case NT_PRPSINFO:
1884 {
9ef6d1e3 1885 char data[136] ATTRIBUTE_NONSTRING;
183e98be
AM
1886 va_list ap;
1887
1888 va_start (ap, note_type);
75cd47ed 1889 memset (data, 0, sizeof (data));
183e98be 1890 strncpy (data + 40, va_arg (ap, const char *), 16);
be3e27bb 1891#if GCC_VERSION == 8000 || GCC_VERSION == 8001
95da9854 1892 DIAGNOSTIC_PUSH;
be3e27bb 1893 /* GCC 8.0 and 8.1 warn about 80 equals destination size with
95da9854
L
1894 -Wstringop-truncation:
1895 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
1896 */
95da9854
L
1897 DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
1898#endif
183e98be 1899 strncpy (data + 56, va_arg (ap, const char *), 80);
be3e27bb 1900#if GCC_VERSION == 8000 || GCC_VERSION == 8001
95da9854 1901 DIAGNOSTIC_POP;
fe75810f 1902#endif
183e98be
AM
1903 va_end (ap);
1904 return elfcore_write_note (abfd, buf, bufsiz,
1905 "CORE", note_type, data, sizeof (data));
1906 }
1907
1908 case NT_PRSTATUS:
1909 {
1910 char data[504];
1911 va_list ap;
1912 long pid;
1913 int cursig;
1914 const void *greg;
1915
1916 va_start (ap, note_type);
1917 memset (data, 0, 112);
1918 pid = va_arg (ap, long);
1919 bfd_put_32 (abfd, pid, data + 32);
1920 cursig = va_arg (ap, int);
1921 bfd_put_16 (abfd, cursig, data + 12);
1922 greg = va_arg (ap, const void *);
1923 memcpy (data + 112, greg, 384);
1924 memset (data + 496, 0, 8);
1925 va_end (ap);
1926 return elfcore_write_note (abfd, buf, bufsiz,
1927 "CORE", note_type, data, sizeof (data));
1928 }
1929 }
1930}
1931
5d35169e
AM
1932/* Add extra PPC sections. */
1933
2cdcc330 1934static const struct bfd_elf_special_section ppc64_elf_special_sections[] =
7f4d3958 1935{
07d6d2b8
AM
1936 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
1937 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 1938 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
1939 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
1940 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 1941 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8 1942 { NULL, 0, 0, 0, 0 }
5d35169e
AM
1943};
1944
7c8fe5c4
AM
1945enum _ppc64_sec_type {
1946 sec_normal = 0,
1947 sec_opd = 1,
1948 sec_toc = 2
1949};
1950
f0abc2a1
AM
1951struct _ppc64_elf_section_data
1952{
1953 struct bfd_elf_section_data elf;
411e1bfb 1954
f0abc2a1
AM
1955 union
1956 {
51aecdc5
AM
1957 /* An array with one entry for each opd function descriptor,
1958 and some spares since opd entries may be either 16 or 24 bytes. */
1959#define OPD_NDX(OFF) ((OFF) >> 4)
74f0fb50
AM
1960 struct _opd_sec_data
1961 {
1962 /* Points to the function code section for local opd entries. */
1963 asection **func_sec;
1964
1965 /* After editing .opd, adjust references to opd local syms. */
1966 long *adjust;
1967 } opd;
7c8fe5c4 1968
3a71aa26
AM
1969 /* An array for toc sections, indexed by offset/8. */
1970 struct _toc_sec_data
1971 {
1972 /* Specifies the relocation symbol index used at a given toc offset. */
1973 unsigned *symndx;
1974
1975 /* And the relocation addend. */
1976 bfd_vma *add;
1977 } toc;
7c8fe5c4
AM
1978 } u;
1979
1980 enum _ppc64_sec_type sec_type:2;
411e1bfb 1981
7c8fe5c4
AM
1982 /* Flag set when small branches are detected. Used to
1983 select suitable defaults for the stub group size. */
1984 unsigned int has_14bit_branch:1;
3e04d765
AM
1985
1986 /* Flag set when PLTCALL relocs are detected. */
1987 unsigned int has_pltcall:1;
066f4018 1988
903b777d
AM
1989 /* Flag set when section has PLT/GOT/TOC relocations that can be
1990 optimised. */
1991 unsigned int has_optrel:1;
f0abc2a1
AM
1992};
1993
1994#define ppc64_elf_section_data(sec) \
411e1bfb 1995 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
f0abc2a1
AM
1996
1997static bfd_boolean
4ce794b7 1998ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 1999{
f592407e
AM
2000 if (!sec->used_by_bfd)
2001 {
2002 struct _ppc64_elf_section_data *sdata;
2003 bfd_size_type amt = sizeof (*sdata);
f0abc2a1 2004
f592407e
AM
2005 sdata = bfd_zalloc (abfd, amt);
2006 if (sdata == NULL)
2007 return FALSE;
2008 sec->used_by_bfd = sdata;
2009 }
f0abc2a1
AM
2010
2011 return _bfd_elf_new_section_hook (abfd, sec);
2012}
4025353c 2013
74f0fb50 2014static struct _opd_sec_data *
4025353c
AM
2015get_opd_info (asection * sec)
2016{
2017 if (sec != NULL
2018 && ppc64_elf_section_data (sec) != NULL
7c8fe5c4 2019 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
74f0fb50 2020 return &ppc64_elf_section_data (sec)->u.opd;
4025353c
AM
2021 return NULL;
2022}
90e3cdf2
JJ
2023\f
2024/* Parameters for the qsort hook. */
90e3cdf2 2025static bfd_boolean synthetic_relocatable;
cd285db5 2026static asection *synthetic_opd;
90e3cdf2 2027
699733f6 2028/* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
90e3cdf2
JJ
2029
2030static int
2031compare_symbols (const void *ap, const void *bp)
2032{
2cdcc330
AM
2033 const asymbol *a = *(const asymbol **) ap;
2034 const asymbol *b = *(const asymbol **) bp;
90e3cdf2 2035
699733f6
AM
2036 /* Section symbols first. */
2037 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
90e3cdf2 2038 return -1;
699733f6 2039 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
90e3cdf2
JJ
2040 return 1;
2041
699733f6 2042 /* then .opd symbols. */
cd285db5
AM
2043 if (synthetic_opd != NULL)
2044 {
2045 if (strcmp (a->section->name, ".opd") == 0
2046 && strcmp (b->section->name, ".opd") != 0)
2047 return -1;
2048 if (strcmp (a->section->name, ".opd") != 0
2049 && strcmp (b->section->name, ".opd") == 0)
2050 return 1;
2051 }
90e3cdf2 2052
699733f6 2053 /* then other code symbols. */
2cdcc330
AM
2054 if (((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2055 == (SEC_CODE | SEC_ALLOC))
2056 && ((b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2057 != (SEC_CODE | SEC_ALLOC)))
90e3cdf2
JJ
2058 return -1;
2059
2cdcc330
AM
2060 if (((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2061 != (SEC_CODE | SEC_ALLOC))
2062 && ((b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2063 == (SEC_CODE | SEC_ALLOC)))
90e3cdf2
JJ
2064 return 1;
2065
2066 if (synthetic_relocatable)
2067 {
2068 if (a->section->id < b->section->id)
2069 return -1;
2070
2071 if (a->section->id > b->section->id)
2072 return 1;
2073 }
2074
2075 if (a->value + a->section->vma < b->value + b->section->vma)
2076 return -1;
2077
2078 if (a->value + a->section->vma > b->value + b->section->vma)
2079 return 1;
2080
4d35a0aa
AM
2081 /* For syms with the same value, prefer strong dynamic global function
2082 syms over other syms. */
2083 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
2084 return -1;
2085
2086 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
2087 return 1;
2088
2089 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
2090 return -1;
2091
2092 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
2093 return 1;
2094
2095 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
2096 return -1;
2097
2098 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
2099 return 1;
2100
2101 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
2102 return -1;
2103
2104 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
2105 return 1;
2106
dcea6a95
AM
2107 /* Finally, sort on where the symbol is in memory. The symbols will
2108 be in at most two malloc'd blocks, one for static syms, one for
2109 dynamic syms, and we distinguish the two blocks above by testing
2110 BSF_DYNAMIC. Since we are sorting the symbol pointers which were
2111 originally in the same order as the symbols (and we're not
2112 sorting the symbols themselves), this ensures a stable sort. */
2113 if (a < b)
2114 return -1;
2115 if (a > b)
2116 return 1;
2117 return 0;
90e3cdf2
JJ
2118}
2119
699733f6 2120/* Search SYMS for a symbol of the given VALUE. */
90e3cdf2 2121
699733f6 2122static asymbol *
9ad9b810
AM
2123sym_exists_at (asymbol **syms, size_t lo, size_t hi, unsigned int id,
2124 bfd_vma value)
90e3cdf2 2125{
9ad9b810 2126 size_t mid;
90e3cdf2 2127
7292b3ac 2128 if (id == (unsigned) -1)
699733f6
AM
2129 {
2130 while (lo < hi)
2131 {
2132 mid = (lo + hi) >> 1;
2133 if (syms[mid]->value + syms[mid]->section->vma < value)
2134 lo = mid + 1;
2135 else if (syms[mid]->value + syms[mid]->section->vma > value)
2136 hi = mid;
2137 else
2138 return syms[mid];
2139 }
2140 }
2141 else
2142 {
2143 while (lo < hi)
2144 {
2145 mid = (lo + hi) >> 1;
2146 if (syms[mid]->section->id < id)
2147 lo = mid + 1;
2148 else if (syms[mid]->section->id > id)
2149 hi = mid;
2150 else if (syms[mid]->value < value)
2151 lo = mid + 1;
2152 else if (syms[mid]->value > value)
2153 hi = mid;
2154 else
2155 return syms[mid];
2156 }
2157 }
2158 return NULL;
90e3cdf2
JJ
2159}
2160
468392fb
AM
2161static bfd_boolean
2162section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
2163{
2164 bfd_vma vma = *(bfd_vma *) ptr;
2165 return ((section->flags & SEC_ALLOC) != 0
2166 && section->vma <= vma
2167 && vma < section->vma + section->size);
2168}
2169
699733f6 2170/* Create synthetic symbols, effectively restoring "dot-symbol" function
c4b0b099
AM
2171 entry syms. Also generate @plt symbols for the glink branch table.
2172 Returns count of synthetic symbols in RET or -1 on error. */
90e3cdf2
JJ
2173
2174static long
a7535cf3
AM
2175ppc64_elf_get_synthetic_symtab (bfd *abfd,
2176 long static_count, asymbol **static_syms,
2177 long dyn_count, asymbol **dyn_syms,
c9727e01 2178 asymbol **ret)
90e3cdf2
JJ
2179{
2180 asymbol *s;
0ccf57bd 2181 size_t i, j, count;
90e3cdf2 2182 char *names;
0ccf57bd 2183 size_t symcount, codesecsym, codesecsymend, secsymend, opdsymend;
ee67d69a 2184 asection *opd = NULL;
90e3cdf2 2185 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 2186 asymbol **syms;
ee67d69a 2187 int abi = abiversion (abfd);
90e3cdf2
JJ
2188
2189 *ret = NULL;
2190
ee67d69a
AM
2191 if (abi < 2)
2192 {
2193 opd = bfd_get_section_by_name (abfd, ".opd");
2194 if (opd == NULL && abi == 1)
2195 return 0;
2196 }
90e3cdf2 2197
a5259595
AM
2198 syms = NULL;
2199 codesecsym = 0;
2200 codesecsymend = 0;
2201 secsymend = 0;
2202 opdsymend = 0;
2203 symcount = 0;
2204 if (opd != NULL)
c9727e01 2205 {
a5259595
AM
2206 symcount = static_count;
2207 if (!relocatable)
2208 symcount += dyn_count;
2209 if (symcount == 0)
2210 return 0;
c9727e01 2211
a5259595
AM
2212 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2213 if (syms == NULL)
2214 return -1;
90e3cdf2 2215
a5259595
AM
2216 if (!relocatable && static_count != 0 && dyn_count != 0)
2217 {
2218 /* Use both symbol tables. */
2219 memcpy (syms, static_syms, static_count * sizeof (*syms));
2220 memcpy (syms + static_count, dyn_syms,
2221 (dyn_count + 1) * sizeof (*syms));
2222 }
2223 else if (!relocatable && static_count == 0)
2224 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
2225 else
2226 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
90e3cdf2 2227
0ccf57bd
AM
2228 /* Trim uninteresting symbols. Interesting symbols are section,
2229 function, and notype symbols. */
2230 for (i = 0, j = 0; i < symcount; ++i)
2231 if ((syms[i]->flags & (BSF_FILE | BSF_OBJECT | BSF_THREAD_LOCAL
2232 | BSF_RELC | BSF_SRELC)) == 0)
2233 syms[j++] = syms[i];
2234 symcount = j;
2235
a5259595
AM
2236 synthetic_relocatable = relocatable;
2237 synthetic_opd = opd;
2238 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 2239
a5259595
AM
2240 if (!relocatable && symcount > 1)
2241 {
bfa5bd2a
PA
2242 /* Trim duplicate syms, since we may have merged the normal
2243 and dynamic symbols. Actually, we only care about syms
2244 that have different values, so trim any with the same
2245 value. Don't consider ifunc and ifunc resolver symbols
2246 duplicates however, because GDB wants to know whether a
2247 text symbol is an ifunc resolver. */
a5259595 2248 for (i = 1, j = 1; i < symcount; ++i)
bfa5bd2a
PA
2249 {
2250 const asymbol *s0 = syms[i - 1];
2251 const asymbol *s1 = syms[i];
2252
2253 if ((s0->value + s0->section->vma
2254 != s1->value + s1->section->vma)
2255 || ((s0->flags & BSF_GNU_INDIRECT_FUNCTION)
2256 != (s1->flags & BSF_GNU_INDIRECT_FUNCTION)))
2257 syms[j++] = syms[i];
2258 }
a5259595
AM
2259 symcount = j;
2260 }
699733f6 2261
a5259595
AM
2262 i = 0;
2263 /* Note that here and in compare_symbols we can't compare opd and
2264 sym->section directly. With separate debug info files, the
2265 symbols will be extracted from the debug file while abfd passed
2266 to this function is the real binary. */
0ccf57bd 2267 if (strcmp (syms[i]->section->name, ".opd") == 0)
a5259595
AM
2268 ++i;
2269 codesecsym = i;
2270
2271 for (; i < symcount; ++i)
2272 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC
2273 | SEC_THREAD_LOCAL))
2274 != (SEC_CODE | SEC_ALLOC))
2275 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
2276 break;
2277 codesecsymend = i;
2278
2279 for (; i < symcount; ++i)
2280 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2281 break;
2282 secsymend = i;
2283
2284 for (; i < symcount; ++i)
2285 if (strcmp (syms[i]->section->name, ".opd") != 0)
2286 break;
2287 opdsymend = i;
2288
2289 for (; i < symcount; ++i)
2cdcc330
AM
2290 if (((syms[i]->section->flags
2291 & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL)))
a5259595
AM
2292 != (SEC_CODE | SEC_ALLOC))
2293 break;
2294 symcount = i;
2295 }
c9727e01 2296 count = 0;
90e3cdf2 2297
699733f6 2298 if (relocatable)
90e3cdf2 2299 {
699733f6
AM
2300 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2301 arelent *r;
2302 size_t size;
0ccf57bd 2303 size_t relcount;
90e3cdf2 2304
468392fb
AM
2305 if (opdsymend == secsymend)
2306 goto done;
2307
699733f6 2308 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2 2309 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
7356fed5 2310 if (relcount == 0)
c9727e01 2311 goto done;
90e3cdf2 2312
7356fed5
AM
2313 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
2314 {
2315 count = -1;
2316 goto done;
2317 }
2318
699733f6 2319 size = 0;
595da8c5 2320 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
2321 {
2322 asymbol *sym;
90e3cdf2 2323
595da8c5 2324 while (r < opd->relocation + relcount
699733f6
AM
2325 && r->address < syms[i]->value + opd->vma)
2326 ++r;
90e3cdf2 2327
595da8c5 2328 if (r == opd->relocation + relcount)
699733f6 2329 break;
90e3cdf2 2330
699733f6
AM
2331 if (r->address != syms[i]->value + opd->vma)
2332 continue;
90e3cdf2 2333
699733f6
AM
2334 if (r->howto->type != R_PPC64_ADDR64)
2335 continue;
90e3cdf2 2336
699733f6
AM
2337 sym = *r->sym_ptr_ptr;
2338 if (!sym_exists_at (syms, opdsymend, symcount,
2339 sym->section->id, sym->value + r->addend))
2340 {
2341 ++count;
2342 size += sizeof (asymbol);
2343 size += strlen (syms[i]->name) + 2;
2344 }
2345 }
90e3cdf2 2346
c4b0b099
AM
2347 if (size == 0)
2348 goto done;
699733f6
AM
2349 s = *ret = bfd_malloc (size);
2350 if (s == NULL)
2351 {
7356fed5 2352 count = -1;
c9727e01 2353 goto done;
699733f6 2354 }
90e3cdf2 2355
699733f6 2356 names = (char *) (s + count);
90e3cdf2 2357
595da8c5 2358 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 2359 {
699733f6 2360 asymbol *sym;
90e3cdf2 2361
595da8c5 2362 while (r < opd->relocation + relcount
699733f6
AM
2363 && r->address < syms[i]->value + opd->vma)
2364 ++r;
90e3cdf2 2365
595da8c5 2366 if (r == opd->relocation + relcount)
699733f6
AM
2367 break;
2368
2369 if (r->address != syms[i]->value + opd->vma)
2370 continue;
2371
2372 if (r->howto->type != R_PPC64_ADDR64)
2373 continue;
90e3cdf2 2374
699733f6
AM
2375 sym = *r->sym_ptr_ptr;
2376 if (!sym_exists_at (syms, opdsymend, symcount,
2377 sym->section->id, sym->value + r->addend))
2378 {
2379 size_t len;
2380
2381 *s = *syms[i];
6ba2a415 2382 s->flags |= BSF_SYNTHETIC;
699733f6
AM
2383 s->section = sym->section;
2384 s->value = sym->value + r->addend;
2385 s->name = names;
2386 *names++ = '.';
2387 len = strlen (syms[i]->name);
2388 memcpy (names, syms[i]->name, len + 1);
2389 names += len + 1;
6f610d07
UW
2390 /* Have udata.p point back to the original symbol this
2391 synthetic symbol was derived from. */
2392 s->udata.p = syms[i];
699733f6
AM
2393 s++;
2394 }
2395 }
2396 }
2397 else
90e3cdf2 2398 {
468392fb 2399 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
ee67d69a 2400 bfd_byte *contents = NULL;
699733f6 2401 size_t size;
0ccf57bd 2402 size_t plt_count = 0;
468392fb
AM
2403 bfd_vma glink_vma = 0, resolv_vma = 0;
2404 asection *dynamic, *glink = NULL, *relplt = NULL;
2405 arelent *p;
90e3cdf2 2406
ee67d69a 2407 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
699733f6 2408 {
c4b0b099
AM
2409 free_contents_and_exit_err:
2410 count = -1;
ee67d69a 2411 free_contents_and_exit:
699733f6 2412 if (contents)
ee67d69a 2413 free (contents);
c9727e01 2414 goto done;
699733f6 2415 }
90e3cdf2 2416
699733f6
AM
2417 size = 0;
2418 for (i = secsymend; i < opdsymend; ++i)
2419 {
2420 bfd_vma ent;
90e3cdf2 2421
5ef11c02
AM
2422 /* Ignore bogus symbols. */
2423 if (syms[i]->value > opd->size - 8)
2424 continue;
2425
699733f6
AM
2426 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2427 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2428 {
2429 ++count;
2430 size += sizeof (asymbol);
2431 size += strlen (syms[i]->name) + 2;
2432 }
2433 }
90e3cdf2 2434
468392fb 2435 /* Get start of .glink stubs from DT_PPC64_GLINK. */
066ee829
AM
2436 if (dyn_count != 0
2437 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
468392fb
AM
2438 {
2439 bfd_byte *dynbuf, *extdyn, *extdynend;
2440 size_t extdynsize;
2441 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
2442
2443 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
c4b0b099 2444 goto free_contents_and_exit_err;
468392fb
AM
2445
2446 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
2447 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
2448
2449 extdyn = dynbuf;
2450 extdynend = extdyn + dynamic->size;
2451 for (; extdyn < extdynend; extdyn += extdynsize)
2452 {
2453 Elf_Internal_Dyn dyn;
2454 (*swap_dyn_in) (abfd, extdyn, &dyn);
2455
2456 if (dyn.d_tag == DT_NULL)
2457 break;
2458
2459 if (dyn.d_tag == DT_PPC64_GLINK)
2460 {
9e390558
AM
2461 /* The first glink stub starts at DT_PPC64_GLINK plus 32.
2462 See comment in ppc64_elf_finish_dynamic_sections. */
2463 glink_vma = dyn.d_un.d_val + 8 * 4;
468392fb
AM
2464 /* The .glink section usually does not survive the final
2465 link; search for the section (usually .text) where the
2466 glink stubs now reside. */
2467 glink = bfd_sections_find_if (abfd, section_covers_vma,
2468 &glink_vma);
2469 break;
2470 }
2471 }
2472
2473 free (dynbuf);
2474 }
2475
2476 if (glink != NULL)
2477 {
2478 /* Determine __glink trampoline by reading the relative branch
2479 from the first glink stub. */
2480 bfd_byte buf[4];
b9e5796b
AM
2481 unsigned int off = 0;
2482
2483 while (bfd_get_section_contents (abfd, glink, buf,
2484 glink_vma + off - glink->vma, 4))
468392fb
AM
2485 {
2486 unsigned int insn = bfd_get_32 (abfd, buf);
2487 insn ^= B_DOT;
2488 if ((insn & ~0x3fffffc) == 0)
b9e5796b 2489 {
2cdcc330
AM
2490 resolv_vma
2491 = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
b9e5796b
AM
2492 break;
2493 }
2494 off += 4;
2495 if (off > 4)
2496 break;
468392fb
AM
2497 }
2498
2499 if (resolv_vma)
2500 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
468392fb 2501
066ee829
AM
2502 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2503 if (relplt != NULL)
2504 {
2505 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2cdcc330 2506 if (!(*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
c4b0b099 2507 goto free_contents_and_exit_err;
68ffbac6 2508
066ee829
AM
2509 plt_count = relplt->size / sizeof (Elf64_External_Rela);
2510 size += plt_count * sizeof (asymbol);
468392fb 2511
066ee829
AM
2512 p = relplt->relocation;
2513 for (i = 0; i < plt_count; i++, p++)
e054468f
AM
2514 {
2515 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
2516 if (p->addend != 0)
2517 size += sizeof ("+0x") - 1 + 16;
2518 }
066ee829 2519 }
468392fb
AM
2520 }
2521
c4b0b099
AM
2522 if (size == 0)
2523 goto free_contents_and_exit;
699733f6
AM
2524 s = *ret = bfd_malloc (size);
2525 if (s == NULL)
c4b0b099 2526 goto free_contents_and_exit_err;
90e3cdf2 2527
468392fb 2528 names = (char *) (s + count + plt_count + (resolv_vma != 0));
90e3cdf2 2529
699733f6 2530 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 2531 {
699733f6 2532 bfd_vma ent;
90e3cdf2 2533
5ef11c02
AM
2534 if (syms[i]->value > opd->size - 8)
2535 continue;
2536
699733f6
AM
2537 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2538 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 2539 {
0ccf57bd 2540 size_t lo, hi;
699733f6 2541 size_t len;
c9727e01 2542 asection *sec = abfd->sections;
90e3cdf2 2543
699733f6
AM
2544 *s = *syms[i];
2545 lo = codesecsym;
2546 hi = codesecsymend;
2547 while (lo < hi)
2548 {
0ccf57bd 2549 size_t mid = (lo + hi) >> 1;
699733f6
AM
2550 if (syms[mid]->section->vma < ent)
2551 lo = mid + 1;
2552 else if (syms[mid]->section->vma > ent)
2553 hi = mid;
2554 else
c9727e01
AM
2555 {
2556 sec = syms[mid]->section;
2557 break;
2558 }
699733f6
AM
2559 }
2560
c9727e01 2561 if (lo >= hi && lo > codesecsym)
699733f6 2562 sec = syms[lo - 1]->section;
699733f6
AM
2563
2564 for (; sec != NULL; sec = sec->next)
2565 {
2566 if (sec->vma > ent)
2567 break;
63524580
JK
2568 /* SEC_LOAD may not be set if SEC is from a separate debug
2569 info file. */
2570 if ((sec->flags & SEC_ALLOC) == 0)
699733f6
AM
2571 break;
2572 if ((sec->flags & SEC_CODE) != 0)
2573 s->section = sec;
2574 }
6ba2a415 2575 s->flags |= BSF_SYNTHETIC;
699733f6
AM
2576 s->value = ent - s->section->vma;
2577 s->name = names;
2578 *names++ = '.';
2579 len = strlen (syms[i]->name);
2580 memcpy (names, syms[i]->name, len + 1);
2581 names += len + 1;
6f610d07
UW
2582 /* Have udata.p point back to the original symbol this
2583 synthetic symbol was derived from. */
2584 s->udata.p = syms[i];
699733f6 2585 s++;
90e3cdf2 2586 }
90e3cdf2 2587 }
699733f6 2588 free (contents);
468392fb
AM
2589
2590 if (glink != NULL && relplt != NULL)
2591 {
2592 if (resolv_vma)
2593 {
2594 /* Add a symbol for the main glink trampoline. */
86a4952b 2595 memset (s, 0, sizeof *s);
468392fb 2596 s->the_bfd = abfd;
6ba2a415 2597 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
468392fb
AM
2598 s->section = glink;
2599 s->value = resolv_vma - glink->vma;
2600 s->name = names;
2cdcc330
AM
2601 memcpy (names, "__glink_PLTresolve",
2602 sizeof ("__glink_PLTresolve"));
468392fb
AM
2603 names += sizeof ("__glink_PLTresolve");
2604 s++;
2605 count++;
2606 }
2607
2608 /* FIXME: It would be very much nicer to put sym@plt on the
2609 stub rather than on the glink branch table entry. The
2610 objdump disassembler would then use a sensible symbol
2611 name on plt calls. The difficulty in doing so is
2612 a) finding the stubs, and,
2613 b) matching stubs against plt entries, and,
2614 c) there can be multiple stubs for a given plt entry.
2615
2616 Solving (a) could be done by code scanning, but older
2617 ppc64 binaries used different stubs to current code.
2618 (b) is the tricky one since you need to known the toc
2619 pointer for at least one function that uses a pic stub to
2620 be able to calculate the plt address referenced.
2621 (c) means gdb would need to set multiple breakpoints (or
2622 find the glink branch itself) when setting breakpoints
2623 for pending shared library loads. */
2624 p = relplt->relocation;
2625 for (i = 0; i < plt_count; i++, p++)
2626 {
2627 size_t len;
2628
2629 *s = **p->sym_ptr_ptr;
2630 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
2631 we are defining a symbol, ensure one of them is set. */
2632 if ((s->flags & BSF_LOCAL) == 0)
2633 s->flags |= BSF_GLOBAL;
6ba2a415 2634 s->flags |= BSF_SYNTHETIC;
468392fb
AM
2635 s->section = glink;
2636 s->value = glink_vma - glink->vma;
2637 s->name = names;
2638 s->udata.p = NULL;
2639 len = strlen ((*p->sym_ptr_ptr)->name);
2640 memcpy (names, (*p->sym_ptr_ptr)->name, len);
2641 names += len;
e054468f
AM
2642 if (p->addend != 0)
2643 {
2644 memcpy (names, "+0x", sizeof ("+0x") - 1);
2645 names += sizeof ("+0x") - 1;
2646 bfd_sprintf_vma (abfd, names, p->addend);
2647 names += strlen (names);
2648 }
468392fb
AM
2649 memcpy (names, "@plt", sizeof ("@plt"));
2650 names += sizeof ("@plt");
2651 s++;
b9e5796b
AM
2652 if (abi < 2)
2653 {
2654 glink_vma += 8;
2655 if (i >= 0x8000)
2656 glink_vma += 4;
2657 }
2658 else
468392fb
AM
2659 glink_vma += 4;
2660 }
2661 count += plt_count;
2662 }
90e3cdf2
JJ
2663 }
2664
c9727e01 2665 done:
a7535cf3 2666 free (syms);
90e3cdf2
JJ
2667 return count;
2668}
5bd4f169 2669\f
65f38f15
AM
2670/* The following functions are specific to the ELF linker, while
2671 functions above are used generally. Those named ppc64_elf_* are
2672 called by the main ELF linker code. They appear in this file more
2673 or less in the order in which they are called. eg.
2674 ppc64_elf_check_relocs is called early in the link process,
2675 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
2676 called.
2677
2678 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2679 functions have both a function code symbol and a function descriptor
2680 symbol. A call to foo in a relocatable object file looks like:
2681
2682 . .text
2683 . x:
2684 . bl .foo
2685 . nop
2686
2687 The function definition in another object file might be:
2688
2689 . .section .opd
2690 . foo: .quad .foo
2691 . .quad .TOC.@tocbase
2692 . .quad 0
2693 .
2694 . .text
2695 . .foo: blr
2696
2697 When the linker resolves the call during a static link, the branch
2698 unsurprisingly just goes to .foo and the .opd information is unused.
2699 If the function definition is in a shared library, things are a little
2700 different: The call goes via a plt call stub, the opd information gets
2701 copied to the plt, and the linker patches the nop.
2702
2703 . x:
2704 . bl .foo_stub
2705 . ld 2,40(1)
2706 .
2707 .
2708 . .foo_stub:
71a39c98
AM
2709 . std 2,40(1) # in practice, the call stub
2710 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
2711 . addi 11,11,Lfoo@toc@l # this is the general idea
2712 . ld 12,0(11)
2713 . ld 2,8(11)
2714 . mtctr 12
2715 . ld 11,16(11)
e86ce104
AM
2716 . bctr
2717 .
2718 . .section .plt
2719 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
2720
2721 The "reloc ()" notation is supposed to indicate that the linker emits
2722 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
2723 copying.
2724
2725 What are the difficulties here? Well, firstly, the relocations
2726 examined by the linker in check_relocs are against the function code
2727 sym .foo, while the dynamic relocation in the plt is emitted against
2728 the function descriptor symbol, foo. Somewhere along the line, we need
2729 to carefully copy dynamic link information from one symbol to the other.
2730 Secondly, the generic part of the elf linker will make .foo a dynamic
2731 symbol as is normal for most other backends. We need foo dynamic
2732 instead, at least for an application final link. However, when
2733 creating a shared library containing foo, we need to have both symbols
2734 dynamic so that references to .foo are satisfied during the early
2735 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
2736 definition from some other object, eg. a static library.
2737
2738 Update: As of August 2004, we support a new convention. Function
2739 calls may use the function descriptor symbol, ie. "bl foo". This
2740 behaves exactly as "bl .foo". */
65f38f15 2741
7c8bbca5
AM
2742/* Of those relocs that might be copied as dynamic relocs, this
2743 function selects those that must be copied when linking a shared
2744 library or PIE, even when the symbol is local. */
65f38f15 2745
1d483afe
AM
2746static int
2747must_be_dyn_reloc (struct bfd_link_info *info,
2748 enum elf_ppc64_reloc_type r_type)
2749{
2750 switch (r_type)
2751 {
2752 default:
7c8bbca5
AM
2753 /* Only relative relocs can be resolved when the object load
2754 address isn't fixed. DTPREL64 is excluded because the
2755 dynamic linker needs to differentiate global dynamic from
2756 local dynamic __tls_index pairs when PPC64_OPT_TLS is set. */
1d483afe
AM
2757 return 1;
2758
2759 case R_PPC64_REL32:
2760 case R_PPC64_REL64:
2761 case R_PPC64_REL30:
1bdd8fac
AM
2762 case R_PPC64_TOC16:
2763 case R_PPC64_TOC16_DS:
2764 case R_PPC64_TOC16_LO:
2765 case R_PPC64_TOC16_HI:
2766 case R_PPC64_TOC16_HA:
2767 case R_PPC64_TOC16_LO_DS:
1d483afe
AM
2768 return 0;
2769
2770 case R_PPC64_TPREL16:
2771 case R_PPC64_TPREL16_LO:
2772 case R_PPC64_TPREL16_HI:
2773 case R_PPC64_TPREL16_HA:
2774 case R_PPC64_TPREL16_DS:
2775 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
2776 case R_PPC64_TPREL16_HIGH:
2777 case R_PPC64_TPREL16_HIGHA:
1d483afe
AM
2778 case R_PPC64_TPREL16_HIGHER:
2779 case R_PPC64_TPREL16_HIGHERA:
2780 case R_PPC64_TPREL16_HIGHEST:
2781 case R_PPC64_TPREL16_HIGHESTA:
2782 case R_PPC64_TPREL64:
c213164a 2783 case R_PPC64_TPREL34:
7c8bbca5
AM
2784 /* These relocations are relative but in a shared library the
2785 linker doesn't know the thread pointer base. */
2786 return bfd_link_dll (info);
1d483afe
AM
2787 }
2788}
65f38f15 2789
f4656909 2790/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
e1c6cf61 2791 copying dynamic variables from a shared lib into an app's .dynbss
f4656909 2792 section, and instead use a dynamic relocation to point into the
e1c6cf61
AM
2793 shared lib. With code that gcc generates it is vital that this be
2794 enabled; In the PowerPC64 ELFv1 ABI the address of a function is
2795 actually the address of a function descriptor which resides in the
2796 .opd section. gcc uses the descriptor directly rather than going
2797 via the GOT as some other ABIs do, which means that initialized
2798 function pointers reference the descriptor. Thus, a function
2799 pointer initialized to the address of a function in a shared
2800 library will either require a .dynbss copy and a copy reloc, or a
2801 dynamic reloc. Using a .dynbss copy redefines the function
2802 descriptor symbol to point to the copy. This presents a problem as
2803 a PLT entry for that function is also initialized from the function
2804 descriptor symbol and the copy may not be initialized first. */
a23b6845 2805#define ELIMINATE_COPY_RELOCS 1
f4656909 2806
721956f4 2807/* Section name for stubs is the associated section name plus this
29942be8
NC
2808 string. */
2809#define STUB_SUFFIX ".stub"
721956f4
AM
2810
2811/* Linker stubs.
2812 ppc_stub_long_branch:
2813 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
2814 destination, but a 24 bit branch in a stub section will reach.
2815 . b dest
2816
2817 ppc_stub_plt_branch:
2818 Similar to the above, but a 24 bit branch in the stub section won't
2819 reach its destination.
71a39c98
AM
2820 . addis %r11,%r2,xxx@toc@ha
2821 . ld %r12,xxx@toc@l(%r11)
2822 . mtctr %r12
721956f4
AM
2823 . bctr
2824
2825 ppc_stub_plt_call:
2c66dc6c
AM
2826 Used to call a function in a shared library. If it so happens that
2827 the plt entry referenced crosses a 64k boundary, then an extra
71a39c98 2828 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
05d0e962 2829 ppc_stub_plt_call_r2save starts with "std %r2,40(%r1)".
71a39c98
AM
2830 . addis %r11,%r2,xxx@toc@ha
2831 . ld %r12,xxx+0@toc@l(%r11)
2832 . mtctr %r12
2833 . ld %r2,xxx+8@toc@l(%r11)
2834 . ld %r11,xxx+16@toc@l(%r11)
721956f4 2835 . bctr
ad8e1ba5
AM
2836
2837 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
2838 code to adjust the value and save r2 to support multiple toc sections.
2839 A ppc_stub_long_branch with an r2 offset looks like:
2840 . std %r2,40(%r1)
2841 . addis %r2,%r2,off@ha
2842 . addi %r2,%r2,off@l
2843 . b dest
2844
2845 A ppc_stub_plt_branch with an r2 offset looks like:
2846 . std %r2,40(%r1)
71a39c98
AM
2847 . addis %r11,%r2,xxx@toc@ha
2848 . ld %r12,xxx@toc@l(%r11)
ad8e1ba5
AM
2849 . addis %r2,%r2,off@ha
2850 . addi %r2,%r2,off@l
71a39c98 2851 . mtctr %r12
ad8e1ba5 2852 . bctr
ac2df442 2853
05d0e962
AM
2854 All of the above stubs are shown as their ELFv1 variants. ELFv2
2855 variants exist too, simpler for plt calls since a new toc pointer
2856 and static chain are not loaded by the stub. In addition, ELFv2
2857 has some more complex stubs to handle calls marked with NOTOC
2858 relocs from functions where r2 is not a valid toc pointer. These
2859 come in two flavours, the ones shown below, and _both variants that
2860 start with "std %r2,24(%r1)" to save r2 in the unlikely event that
2861 one call is from a function where r2 is used as the toc pointer but
2862 needs a toc adjusting stub for small-model multi-toc, and another
2863 call is from a function where r2 is not valid.
2864 ppc_stub_long_branch_notoc:
2865 . mflr %r12
2866 . bcl 20,31,1f
2867 . 1:
2868 . mflr %r11
2869 . mtlr %r12
2cdcc330
AM
2870 . addis %r12,%r11,dest-1b@ha
2871 . addi %r12,%r12,dest-1b@l
05d0e962
AM
2872 . b dest
2873
2874 ppc_stub_plt_branch_notoc:
2875 . mflr %r12
2876 . bcl 20,31,1f
2877 . 1:
2878 . mflr %r11
2879 . mtlr %r12
2880 . lis %r12,xxx-1b@highest
f891966f 2881 . ori %r12,%r12,xxx-1b@higher
05d0e962 2882 . sldi %r12,%r12,32
f891966f 2883 . oris %r12,%r12,xxx-1b@high
05d0e962
AM
2884 . ori %r12,%r12,xxx-1b@l
2885 . add %r12,%r11,%r12
2886 . mtctr %r12
2887 . bctr
2888
2889 ppc_stub_plt_call_notoc:
2890 . mflr %r12
2891 . bcl 20,31,1f
2892 . 1:
2893 . mflr %r11
2894 . mtlr %r12
2895 . lis %r12,xxx-1b@highest
f891966f 2896 . ori %r12,%r12,xxx-1b@higher
05d0e962 2897 . sldi %r12,%r12,32
f891966f 2898 . oris %r12,%r12,xxx-1b@high
05d0e962
AM
2899 . ori %r12,%r12,xxx-1b@l
2900 . ldx %r12,%r11,%r12
2901 . mtctr %r12
2902 . bctr
2903
04bdff6a
AM
2904 There are also ELFv1 powerxx variants of these stubs.
2905 ppc_stub_long_branch_notoc:
d4b87b1e 2906 . pla %r12,dest@pcrel
04bdff6a
AM
2907 . b dest
2908 ppc_stub_plt_branch_notoc:
2909 . lis %r11,(dest-1f)@highesta34
2910 . ori %r11,%r11,(dest-1f)@highera34
2911 . sldi %r11,%r11,34
d4b87b1e 2912 . 1: pla %r12,dest@pcrel
04bdff6a
AM
2913 . add %r12,%r11,%r12
2914 . mtctr %r12
2915 . bctr
2916 ppc_stub_plt_call_notoc:
2917 . lis %r11,(xxx-1f)@highesta34
2918 . ori %r11,%r11,(xxx-1f)@highera34
2919 . sldi %r11,%r11,34
d4b87b1e 2920 . 1: pla %r12,xxx@pcrel
04bdff6a
AM
2921 . ldx %r12,%r11,%r12
2922 . mtctr %r12
2923 . bctr
2924
05d0e962
AM
2925 In cases where the high instructions would add zero, they are
2926 omitted and following instructions modified in some cases.
04bdff6a
AM
2927 For example, a powerxx ppc_stub_plt_call_notoc might simplify down
2928 to
2929 . pld %r12,xxx@pcrel
2930 . mtctr %r12
2931 . bctr
05d0e962
AM
2932
2933 For a given stub group (a set of sections all using the same toc
2934 pointer value) there will be just one stub type used for any
2935 particular function symbol. For example, if printf is called from
2936 code with the tocsave optimization (ie. r2 saved in function
2937 prologue) and therefore calls use a ppc_stub_plt_call linkage stub,
2938 and from other code without the tocsave optimization requiring a
2939 ppc_stub_plt_call_r2save linkage stub, a single stub of the latter
2940 type will be created. Calls with the tocsave optimization will
2941 enter this stub after the instruction saving r2. A similar
2942 situation exists when calls are marked with R_PPC64_REL24_NOTOC
2943 relocations. These require a ppc_stub_plt_call_notoc linkage stub
2944 to call an external function like printf. If other calls to printf
2945 require a ppc_stub_plt_call linkage stub then a single
2946 ppc_stub_plt_call_notoc linkage stub will be used for both types of
2947 call. If other calls to printf require a ppc_stub_plt_call_r2save
2948 linkage stub then a single ppc_stub_plt_call_both linkage stub will
2949 be created and calls not requiring r2 to be saved will enter the
2950 stub after the r2 save instruction. There is an analogous
2951 hierarchy of long branch and plt branch stubs for local call
2952 linkage. */
721956f4 2953
2cdcc330
AM
2954enum ppc_stub_type
2955{
721956f4
AM
2956 ppc_stub_none,
2957 ppc_stub_long_branch,
ad8e1ba5 2958 ppc_stub_long_branch_r2off,
05d0e962
AM
2959 ppc_stub_long_branch_notoc,
2960 ppc_stub_long_branch_both, /* r2off and notoc variants both needed. */
721956f4 2961 ppc_stub_plt_branch,
ad8e1ba5 2962 ppc_stub_plt_branch_r2off,
05d0e962
AM
2963 ppc_stub_plt_branch_notoc,
2964 ppc_stub_plt_branch_both,
794e51c0 2965 ppc_stub_plt_call,
7341d5e2 2966 ppc_stub_plt_call_r2save,
05d0e962
AM
2967 ppc_stub_plt_call_notoc,
2968 ppc_stub_plt_call_both,
a4b6fadd
AM
2969 ppc_stub_global_entry,
2970 ppc_stub_save_res
721956f4
AM
2971};
2972
6f20ed8a
AM
2973/* Information on stub grouping. */
2974struct map_stub
2975{
2976 /* The stub section. */
2977 asection *stub_sec;
2978 /* This is the section to which stubs in the group will be attached. */
2979 asection *link_sec;
a4b6fadd
AM
2980 /* Next group. */
2981 struct map_stub *next;
2982 /* Whether to emit a copy of register save/restore functions in this
2983 group. */
2984 int needs_save_res;
df136d64
AM
2985 /* Current offset within stubs after the insn restoring lr in a
2986 _notoc or _both stub using bcl for pc-relative addressing, or
2987 after the insn restoring lr in a __tls_get_addr_opt plt stub. */
2988 unsigned int lr_restore;
2989 /* Accumulated size of EH info emitted to describe return address
2990 if stubs modify lr. Does not include 17 byte FDE header. */
2991 unsigned int eh_size;
2992 /* Offset in glink_eh_frame to the start of EH info for this group. */
2993 unsigned int eh_base;
6f20ed8a
AM
2994};
2995
2cdcc330
AM
2996struct ppc_stub_hash_entry
2997{
721956f4
AM
2998 /* Base hash table entry structure. */
2999 struct bfd_hash_entry root;
3000
ad8e1ba5
AM
3001 enum ppc_stub_type stub_type;
3002
6f20ed8a
AM
3003 /* Group information. */
3004 struct map_stub *group;
721956f4
AM
3005
3006 /* Offset within stub_sec of the beginning of this stub. */
3007 bfd_vma stub_offset;
3008
3009 /* Given the symbol's value and its section we can determine its final
3010 value when building the stubs (so the stub knows where to jump. */
3011 bfd_vma target_value;
3012 asection *target_section;
3013
721956f4
AM
3014 /* The symbol table entry, if any, that this was derived from. */
3015 struct ppc_link_hash_entry *h;
e054468f 3016 struct plt_entry *plt_ent;
721956f4 3017
2d7ad24e
AM
3018 /* Symbol type. */
3019 unsigned char symtype;
3020
6911b7dc
AM
3021 /* Symbol st_other. */
3022 unsigned char other;
721956f4
AM
3023};
3024
2cdcc330
AM
3025struct ppc_branch_hash_entry
3026{
721956f4
AM
3027 /* Base hash table entry structure. */
3028 struct bfd_hash_entry root;
3029
c456f082 3030 /* Offset within branch lookup table. */
721956f4
AM
3031 unsigned int offset;
3032
3033 /* Generation marker. */
3034 unsigned int iter;
3035};
65f38f15 3036
19e08130
AM
3037/* Used to track dynamic relocations for local symbols. */
3038struct ppc_dyn_relocs
3039{
3040 struct ppc_dyn_relocs *next;
3041
3042 /* The input section of the reloc. */
3043 asection *sec;
3044
3045 /* Total number of relocs copied for the input section. */
3046 unsigned int count : 31;
3047
3048 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3049 unsigned int ifunc : 1;
3050};
3051
65f38f15
AM
3052struct ppc_link_hash_entry
3053{
3054 struct elf_link_hash_entry elf;
3055
2cdcc330
AM
3056 union
3057 {
b3fac117
AM
3058 /* A pointer to the most recently used stub hash entry against this
3059 symbol. */
3060 struct ppc_stub_hash_entry *stub_cache;
3061
3062 /* A pointer to the next symbol starting with a '.' */
3063 struct ppc_link_hash_entry *next_dot_sym;
3064 } u;
721956f4 3065
65f38f15 3066 /* Track dynamic relocs copied for this symbol. */
6061a67d 3067 struct elf_dyn_relocs *dyn_relocs;
e86ce104 3068
721956f4 3069 /* Link between function code and descriptor symbols. */
34814b9f 3070 struct ppc_link_hash_entry *oh;
721956f4 3071
e86ce104
AM
3072 /* Flag function code and descriptor symbols. */
3073 unsigned int is_func:1;
3074 unsigned int is_func_descriptor:1;
908b32fc 3075 unsigned int fake:1;
411e1bfb 3076
c5614fa4
AM
3077 /* Whether global opd/toc sym has been adjusted or not.
3078 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3079 should be set for all globals defined in any opd/toc section. */
754021d0
AM
3080 unsigned int adjust_done:1;
3081
a4b6fadd
AM
3082 /* Set if this is an out-of-line register save/restore function,
3083 with non-standard calling convention. */
3084 unsigned int save_res:1;
3085
8b5f1ed8
AM
3086 /* Set if a duplicate symbol with non-zero localentry is detected,
3087 even when the duplicate symbol does not provide a definition. */
3088 unsigned int non_zero_localentry:1;
3089
411e1bfb 3090 /* Contexts in which symbol is used in the GOT (or TOC).
37da22e5
AM
3091 Bits are or'd into the mask as the corresponding relocs are
3092 encountered during check_relocs, with TLS_TLS being set when any
3093 of the other TLS bits are set. tls_optimize clears bits when
3094 optimizing to indicate the corresponding GOT entry type is not
3095 needed. If set, TLS_TLS is never cleared. tls_optimize may also
b00a0a86 3096 set TLS_GDIE when a GD reloc turns into an IE one.
37da22e5
AM
3097 These flags are also kept for local symbols. */
3098#define TLS_TLS 1 /* Any TLS reloc. */
3099#define TLS_GD 2 /* GD reloc. */
3100#define TLS_LD 4 /* LD reloc. */
3101#define TLS_TPREL 8 /* TPREL reloc, => IE. */
3102#define TLS_DTPREL 16 /* DTPREL reloc, => LD. */
3103#define TLS_MARK 32 /* __tls_get_addr call marked. */
b00a0a86 3104#define TLS_GDIE 64 /* GOT TPREL reloc resulting from GD->IE. */
46e9995a 3105#define TLS_EXPLICIT 256 /* TOC section TLS reloc, not stored. */
f961d9dd 3106 unsigned char tls_mask;
37da22e5
AM
3107
3108 /* The above field is also used to mark function symbols. In which
3109 case TLS_TLS will be 0. */
3110#define PLT_IFUNC 2 /* STT_GNU_IFUNC. */
2d7ad24e 3111#define PLT_KEEP 4 /* inline plt call requires plt entry. */
37da22e5 3112#define NON_GOT 256 /* local symbol plt, not stored. */
65f38f15
AM
3113};
3114
ed7007c1
AM
3115static inline struct ppc_link_hash_entry *
3116ppc_elf_hash_entry (struct elf_link_hash_entry *ent)
3117{
3118 return (struct ppc_link_hash_entry *) ent;
3119}
3120
65f38f15
AM
3121/* ppc64 ELF linker hash table. */
3122
3123struct ppc_link_hash_table
3124{
3125 struct elf_link_hash_table elf;
3126
721956f4
AM
3127 /* The stub hash table. */
3128 struct bfd_hash_table stub_hash_table;
3129
3130 /* Another hash table for plt_branch stubs. */
3131 struct bfd_hash_table branch_hash_table;
3132
3b421ab3
AM
3133 /* Hash table for function prologue tocsave. */
3134 htab_t tocsave_htab;
3135
e7d1c40c
AM
3136 /* Various options and other info passed from the linker. */
3137 struct ppc64_elf_params *params;
721956f4 3138
6f20ed8a
AM
3139 /* The size of sec_info below. */
3140 unsigned int sec_info_arr_size;
3141
3142 /* Per-section array of extra section info. Done this way rather
3143 than as part of ppc64_elf_section_data so we have the info for
3144 non-ppc64 sections. */
3145 struct
3146 {
3147 /* Along with elf_gp, specifies the TOC pointer used by this section. */
ad8e1ba5 3148 bfd_vma toc_off;
6f20ed8a
AM
3149
3150 union
3151 {
3152 /* The section group that this section belongs to. */
3153 struct map_stub *group;
3154 /* A temp section list pointer. */
3155 asection *list;
3156 } u;
3157 } *sec_info;
721956f4 3158
a4b6fadd
AM
3159 /* Linked list of groups. */
3160 struct map_stub *group;
3161
ad8e1ba5
AM
3162 /* Temp used when calculating TOC pointers. */
3163 bfd_vma toc_curr;
bf102f86
AM
3164 bfd *toc_bfd;
3165 asection *toc_first_sec;
ad8e1ba5 3166
b3fac117
AM
3167 /* Used when adding symbols. */
3168 struct ppc_link_hash_entry *dot_syms;
3169
33e44f2e 3170 /* Shortcuts to get to dynamic linker sections. */
4ce794b7 3171 asection *glink;
9e390558 3172 asection *global_entry;
82bd7b59 3173 asection *sfpr;
2d7ad24e
AM
3174 asection *pltlocal;
3175 asection *relpltlocal;
4ce794b7
AM
3176 asection *brlt;
3177 asection *relbrlt;
58d180e8 3178 asection *glink_eh_frame;
ec338859 3179
8387904d
AM
3180 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3181 struct ppc_link_hash_entry *tls_get_addr;
3182 struct ppc_link_hash_entry *tls_get_addr_fd;
411e1bfb 3183
927be08e
AM
3184 /* The size of reliplt used by got entry relocs. */
3185 bfd_size_type got_reli_size;
3186
9b5ecbd0 3187 /* Statistics. */
7341d5e2 3188 unsigned long stub_count[ppc_stub_global_entry];
9b5ecbd0 3189
ee75fd95
AM
3190 /* Number of stubs against global syms. */
3191 unsigned long stub_globals;
3192
ee67d69a
AM
3193 /* Set if we're linking code with function descriptors. */
3194 unsigned int opd_abi:1;
3195
4c52953f 3196 /* Support for multiple toc sections. */
33c0ec9d 3197 unsigned int do_multi_toc:1;
4c52953f 3198 unsigned int multi_toc_needed:1;
927be08e 3199 unsigned int second_toc_pass:1;
67f0cbdb 3200 unsigned int do_toc_opt:1;
4c52953f 3201
9a23f96e
AM
3202 /* Set if tls optimization is enabled. */
3203 unsigned int do_tls_opt:1;
3204
3e04d765
AM
3205 /* Set if inline plt calls should be converted to direct calls. */
3206 unsigned int can_convert_all_inline_plt:1;
3207
5d1634d7 3208 /* Set on error. */
99877b66 3209 unsigned int stub_error:1;
721956f4 3210
8c5b4e52
AM
3211 /* Whether func_desc_adjust needs to be run over symbols. */
3212 unsigned int need_func_desc_adj:1;
721956f4 3213
82e66161
AM
3214 /* Whether there exist local gnu indirect function resolvers,
3215 referenced by dynamic relocations. */
3216 unsigned int local_ifunc_resolver:1;
3217 unsigned int maybe_local_ifunc_resolver:1;
3218
f378ab09
AM
3219 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
3220 unsigned int has_plt_localentry0:1;
3221
5663e321
AM
3222 /* Whether calls are made via the PLT from NOTOC functions. */
3223 unsigned int notoc_plt:1;
3224
04bdff6a
AM
3225 /* Whether to use powerxx instructions in linkage stubs. */
3226 unsigned int powerxx_stubs:1;
3227
721956f4
AM
3228 /* Incremented every time we size stubs. */
3229 unsigned int stub_iteration;
5d1634d7 3230
87d72d41
AM
3231 /* Small local sym cache. */
3232 struct sym_cache sym_cache;
65f38f15
AM
3233};
3234
4c52953f
AM
3235/* Rename some of the generic section flags to better document how they
3236 are used here. */
b0dddeec
AM
3237
3238/* Nonzero if this section has TLS related relocations. */
3239#define has_tls_reloc sec_flg0
3240
9737e8af
AM
3241/* Nonzero if this section has a call to __tls_get_addr lacking marker
3242 relocations. */
3243#define nomark_tls_get_addr sec_flg1
b0dddeec
AM
3244
3245/* Nonzero if this section has any toc or got relocs. */
3246#define has_toc_reloc sec_flg2
3247
3248/* Nonzero if this section has a call to another section that uses
3249 the toc or got. */
d77c8a4b 3250#define makes_toc_func_call sec_flg3
b0dddeec
AM
3251
3252/* Recursion protection when determining above flag. */
d77c8a4b 3253#define call_check_in_progress sec_flg4
70cc837d 3254#define call_check_done sec_flg5
4c52953f 3255
65f38f15
AM
3256/* Get the ppc64 ELF linker hash table from a link_info structure. */
3257
3258#define ppc_hash_table(p) \
4dfe6ac6
NC
3259 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3260 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
65f38f15 3261
721956f4
AM
3262#define ppc_stub_hash_lookup(table, string, create, copy) \
3263 ((struct ppc_stub_hash_entry *) \
3264 bfd_hash_lookup ((table), (string), (create), (copy)))
3265
3266#define ppc_branch_hash_lookup(table, string, create, copy) \
3267 ((struct ppc_branch_hash_entry *) \
3268 bfd_hash_lookup ((table), (string), (create), (copy)))
3269
3270/* Create an entry in the stub hash table. */
3271
3272static struct bfd_hash_entry *
4ce794b7
AM
3273stub_hash_newfunc (struct bfd_hash_entry *entry,
3274 struct bfd_hash_table *table,
3275 const char *string)
721956f4
AM
3276{
3277 /* Allocate the structure if it has not already been allocated by a
3278 subclass. */
3279 if (entry == NULL)
3280 {
3281 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3282 if (entry == NULL)
3283 return entry;
3284 }
3285
3286 /* Call the allocation method of the superclass. */
3287 entry = bfd_hash_newfunc (entry, table, string);
3288 if (entry != NULL)
3289 {
3290 struct ppc_stub_hash_entry *eh;
3291
3292 /* Initialize the local fields. */
3293 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 3294 eh->stub_type = ppc_stub_none;
6f20ed8a 3295 eh->group = NULL;
721956f4
AM
3296 eh->stub_offset = 0;
3297 eh->target_value = 0;
3298 eh->target_section = NULL;
721956f4 3299 eh->h = NULL;
6911b7dc 3300 eh->plt_ent = NULL;
6911b7dc 3301 eh->other = 0;
721956f4
AM
3302 }
3303
3304 return entry;
3305}
3306
3307/* Create an entry in the branch hash table. */
3308
3309static struct bfd_hash_entry *
4ce794b7
AM
3310branch_hash_newfunc (struct bfd_hash_entry *entry,
3311 struct bfd_hash_table *table,
3312 const char *string)
721956f4
AM
3313{
3314 /* Allocate the structure if it has not already been allocated by a
3315 subclass. */
3316 if (entry == NULL)
3317 {
3318 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3319 if (entry == NULL)
3320 return entry;
3321 }
3322
3323 /* Call the allocation method of the superclass. */
3324 entry = bfd_hash_newfunc (entry, table, string);
3325 if (entry != NULL)
3326 {
3327 struct ppc_branch_hash_entry *eh;
3328
3329 /* Initialize the local fields. */
3330 eh = (struct ppc_branch_hash_entry *) entry;
3331 eh->offset = 0;
3332 eh->iter = 0;
3333 }
3334
3335 return entry;
3336}
3337
65f38f15
AM
3338/* Create an entry in a ppc64 ELF linker hash table. */
3339
3340static struct bfd_hash_entry *
4ce794b7
AM
3341link_hash_newfunc (struct bfd_hash_entry *entry,
3342 struct bfd_hash_table *table,
3343 const char *string)
65f38f15
AM
3344{
3345 /* Allocate the structure if it has not already been allocated by a
3346 subclass. */
3347 if (entry == NULL)
3348 {
3349 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3350 if (entry == NULL)
3351 return entry;
3352 }
3353
3354 /* Call the allocation method of the superclass. */
3355 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3356 if (entry != NULL)
3357 {
3358 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3359
b3fac117 3360 memset (&eh->u.stub_cache, 0,
908b32fc 3361 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
3362 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3363
3364 /* When making function calls, old ABI code references function entry
3365 points (dot symbols), while new ABI code references the function
3366 descriptor symbol. We need to make any combination of reference and
3367 definition work together, without breaking archive linking.
3368
3369 For a defined function "foo" and an undefined call to "bar":
3370 An old object defines "foo" and ".foo", references ".bar" (possibly
3371 "bar" too).
3372 A new object defines "foo" and references "bar".
3373
3374 A new object thus has no problem with its undefined symbols being
3375 satisfied by definitions in an old object. On the other hand, the
3376 old object won't have ".bar" satisfied by a new object.
3377
3378 Keep a list of newly added dot-symbols. */
3379
3380 if (string[0] == '.')
3381 {
3382 struct ppc_link_hash_table *htab;
3383
3384 htab = (struct ppc_link_hash_table *) table;
3385 eh->u.next_dot_sym = htab->dot_syms;
3386 htab->dot_syms = eh;
3387 }
65f38f15
AM
3388 }
3389
3390 return entry;
3391}
3392
2cdcc330
AM
3393struct tocsave_entry
3394{
3b421ab3
AM
3395 asection *sec;
3396 bfd_vma offset;
3397};
3398
3399static hashval_t
3400tocsave_htab_hash (const void *p)
3401{
3402 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4aef7643 3403 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
3b421ab3
AM
3404}
3405
3406static int
3407tocsave_htab_eq (const void *p1, const void *p2)
3408{
3409 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
3410 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
3411 return e1->sec == e2->sec && e1->offset == e2->offset;
3412}
3413
68faa637
AM
3414/* Destroy a ppc64 ELF linker hash table. */
3415
3416static void
d495ab0d 3417ppc64_elf_link_hash_table_free (bfd *obfd)
68faa637 3418{
d495ab0d 3419 struct ppc_link_hash_table *htab;
68faa637 3420
d495ab0d 3421 htab = (struct ppc_link_hash_table *) obfd->link.hash;
68faa637
AM
3422 if (htab->tocsave_htab)
3423 htab_delete (htab->tocsave_htab);
d495ab0d
AM
3424 bfd_hash_table_free (&htab->branch_hash_table);
3425 bfd_hash_table_free (&htab->stub_hash_table);
3426 _bfd_elf_link_hash_table_free (obfd);
68faa637
AM
3427}
3428
65f38f15
AM
3429/* Create a ppc64 ELF linker hash table. */
3430
3431static struct bfd_link_hash_table *
4ce794b7 3432ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
3433{
3434 struct ppc_link_hash_table *htab;
3435 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3436
4ce794b7 3437 htab = bfd_zmalloc (amt);
65f38f15
AM
3438 if (htab == NULL)
3439 return NULL;
3440
66eb6687 3441 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
3442 sizeof (struct ppc_link_hash_entry),
3443 PPC64_ELF_DATA))
65f38f15 3444 {
e2d34d7d 3445 free (htab);
65f38f15
AM
3446 return NULL;
3447 }
3448
721956f4 3449 /* Init the stub hash table too. */
66eb6687
AM
3450 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
3451 sizeof (struct ppc_stub_hash_entry)))
2915c55b 3452 {
d495ab0d 3453 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3454 return NULL;
3455 }
721956f4
AM
3456
3457 /* And the branch hash table. */
66eb6687
AM
3458 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
3459 sizeof (struct ppc_branch_hash_entry)))
2915c55b
JK
3460 {
3461 bfd_hash_table_free (&htab->stub_hash_table);
d495ab0d 3462 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3463 return NULL;
3464 }
721956f4 3465
3b421ab3
AM
3466 htab->tocsave_htab = htab_try_create (1024,
3467 tocsave_htab_hash,
3468 tocsave_htab_eq,
3469 NULL);
3470 if (htab->tocsave_htab == NULL)
2915c55b 3471 {
d495ab0d 3472 ppc64_elf_link_hash_table_free (abfd);
2915c55b
JK
3473 return NULL;
3474 }
d495ab0d 3475 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
3b421ab3 3476
3254fd24
AM
3477 /* Initializing two fields of the union is just cosmetic. We really
3478 only care about glist, but when compiled on a 32-bit host the
3479 bfd_vma fields are larger. Setting the bfd_vma to zero makes
3480 debugger inspection of these fields look nicer. */
a6aa5195
AM
3481 htab->elf.init_got_refcount.refcount = 0;
3482 htab->elf.init_got_refcount.glist = NULL;
3483 htab->elf.init_plt_refcount.refcount = 0;
3484 htab->elf.init_plt_refcount.glist = NULL;
3485 htab->elf.init_got_offset.offset = 0;
3486 htab->elf.init_got_offset.glist = NULL;
3487 htab->elf.init_plt_offset.offset = 0;
3488 htab->elf.init_plt_offset.glist = NULL;
3254fd24 3489
65f38f15
AM
3490 return &htab->elf.root;
3491}
3492
bfeb4a28
AM
3493/* Create sections for linker generated code. */
3494
3495static bfd_boolean
3496create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3497{
3498 struct ppc_link_hash_table *htab;
3499 flagword flags;
3500
3501 htab = ppc_hash_table (info);
3502
bfeb4a28
AM
3503 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3504 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
b32547cd
AM
3505 if (htab->params->save_restore_funcs)
3506 {
3507 /* Create .sfpr for code to save and restore fp regs. */
3508 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
3509 flags);
3510 if (htab->sfpr == NULL
fd361982 3511 || !bfd_set_section_alignment (htab->sfpr, 2))
b32547cd
AM
3512 return FALSE;
3513 }
3514
3515 if (bfd_link_relocatable (info))
3516 return TRUE;
bfeb4a28
AM
3517
3518 /* Create .glink for lazy dynamic linking support. */
3519 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3520 flags);
3521 if (htab->glink == NULL
fd361982 3522 || !bfd_set_section_alignment (htab->glink, 3))
bfeb4a28
AM
3523 return FALSE;
3524
9e390558
AM
3525 /* The part of .glink used by global entry stubs, separate so that
3526 it can be aligned appropriately without affecting htab->glink. */
3527 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3528 flags);
3529 if (htab->global_entry == NULL
fd361982 3530 || !bfd_set_section_alignment (htab->global_entry, 2))
9e390558
AM
3531 return FALSE;
3532
bfeb4a28
AM
3533 if (!info->no_ld_generated_unwind_info)
3534 {
3535 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
3536 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3537 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
3538 ".eh_frame",
3539 flags);
3540 if (htab->glink_eh_frame == NULL
fd361982 3541 || !bfd_set_section_alignment (htab->glink_eh_frame, 2))
bfeb4a28
AM
3542 return FALSE;
3543 }
3544
3545 flags = SEC_ALLOC | SEC_LINKER_CREATED;
33e44f2e
AM
3546 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
3547 if (htab->elf.iplt == NULL
fd361982 3548 || !bfd_set_section_alignment (htab->elf.iplt, 3))
bfeb4a28
AM
3549 return FALSE;
3550
3551 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3552 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
33e44f2e
AM
3553 htab->elf.irelplt
3554 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
3555 if (htab->elf.irelplt == NULL
fd361982 3556 || !bfd_set_section_alignment (htab->elf.irelplt, 3))
bfeb4a28
AM
3557 return FALSE;
3558
3559 /* Create branch lookup table for plt_branch stubs. */
3560 flags = (SEC_ALLOC | SEC_LOAD
3561 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3562 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3563 flags);
3564 if (htab->brlt == NULL
fd361982 3565 || !bfd_set_section_alignment (htab->brlt, 3))
bfeb4a28
AM
3566 return FALSE;
3567
2d7ad24e
AM
3568 /* Local plt entries, put in .branch_lt but a separate section for
3569 convenience. */
3570 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3571 flags);
3572 if (htab->pltlocal == NULL
fd361982 3573 || !bfd_set_section_alignment (htab->pltlocal, 3))
2d7ad24e
AM
3574 return FALSE;
3575
0e1862bb 3576 if (!bfd_link_pic (info))
bfeb4a28
AM
3577 return TRUE;
3578
3579 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3580 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2d7ad24e
AM
3581 htab->relbrlt
3582 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
bfeb4a28 3583 if (htab->relbrlt == NULL
fd361982 3584 || !bfd_set_section_alignment (htab->relbrlt, 3))
bfeb4a28
AM
3585 return FALSE;
3586
2d7ad24e
AM
3587 htab->relpltlocal
3588 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
3589 if (htab->relpltlocal == NULL
fd361982 3590 || !bfd_set_section_alignment (htab->relpltlocal, 3))
2d7ad24e
AM
3591 return FALSE;
3592
bfeb4a28
AM
3593 return TRUE;
3594}
3595
e717da7e
AM
3596/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
3597
bfeb4a28 3598bfd_boolean
e7d1c40c
AM
3599ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
3600 struct ppc64_elf_params *params)
e717da7e
AM
3601{
3602 struct ppc_link_hash_table *htab;
3603
e7d1c40c 3604 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
e717da7e
AM
3605
3606/* Always hook our dynamic sections into the first bfd, which is the
3607 linker created stub bfd. This ensures that the GOT header is at
3608 the start of the output TOC section. */
3609 htab = ppc_hash_table (info);
e7d1c40c
AM
3610 htab->elf.dynobj = params->stub_bfd;
3611 htab->params = params;
bfeb4a28 3612
bfeb4a28 3613 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
3614}
3615
721956f4
AM
3616/* Build a name for an entry in the stub hash table. */
3617
3618static char *
4ce794b7
AM
3619ppc_stub_name (const asection *input_section,
3620 const asection *sym_sec,
3621 const struct ppc_link_hash_entry *h,
3622 const Elf_Internal_Rela *rel)
721956f4
AM
3623{
3624 char *stub_name;
bcaa2f82 3625 ssize_t len;
721956f4
AM
3626
3627 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3628 offsets from a sym as a branch target? In fact, we could
3629 probably assume the addend is always zero. */
3630 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3631
3632 if (h)
3633 {
3634 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3635 stub_name = bfd_malloc (len);
46de2a7c
AM
3636 if (stub_name == NULL)
3637 return stub_name;
3638
bcaa2f82
AM
3639 len = sprintf (stub_name, "%08x.%s+%x",
3640 input_section->id & 0xffffffff,
3641 h->elf.root.root.string,
3642 (int) rel->r_addend & 0xffffffff);
721956f4
AM
3643 }
3644 else
3645 {
ad8e1ba5 3646 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 3647 stub_name = bfd_malloc (len);
46de2a7c
AM
3648 if (stub_name == NULL)
3649 return stub_name;
3650
bcaa2f82
AM
3651 len = sprintf (stub_name, "%08x.%x:%x+%x",
3652 input_section->id & 0xffffffff,
3653 sym_sec->id & 0xffffffff,
3654 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3655 (int) rel->r_addend & 0xffffffff);
721956f4 3656 }
bcaa2f82 3657 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 3658 stub_name[len - 2] = 0;
721956f4
AM
3659 return stub_name;
3660}
3661
3662/* Look up an entry in the stub hash. Stub entries are cached because
3663 creating the stub name takes a bit of time. */
3664
3665static struct ppc_stub_hash_entry *
4ce794b7
AM
3666ppc_get_stub_entry (const asection *input_section,
3667 const asection *sym_sec,
039b3fef 3668 struct ppc_link_hash_entry *h,
4ce794b7
AM
3669 const Elf_Internal_Rela *rel,
3670 struct ppc_link_hash_table *htab)
721956f4
AM
3671{
3672 struct ppc_stub_hash_entry *stub_entry;
6f20ed8a 3673 struct map_stub *group;
721956f4
AM
3674
3675 /* If this input section is part of a group of sections sharing one
3676 stub section, then use the id of the first section in the group.
3677 Stub names need to include a section id, as there may well be
3678 more than one stub used to reach say, printf, and we need to
3679 distinguish between them. */
6f20ed8a 3680 group = htab->sec_info[input_section->id].u.group;
89d77b8a
AM
3681 if (group == NULL)
3682 return NULL;
721956f4 3683
b3fac117
AM
3684 if (h != NULL && h->u.stub_cache != NULL
3685 && h->u.stub_cache->h == h
6f20ed8a 3686 && h->u.stub_cache->group == group)
721956f4 3687 {
b3fac117 3688 stub_entry = h->u.stub_cache;
721956f4
AM
3689 }
3690 else
3691 {
3692 char *stub_name;
3693
6f20ed8a 3694 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
721956f4
AM
3695 if (stub_name == NULL)
3696 return NULL;
3697
3698 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 3699 stub_name, FALSE, FALSE);
721956f4 3700 if (h != NULL)
b3fac117 3701 h->u.stub_cache = stub_entry;
721956f4
AM
3702
3703 free (stub_name);
3704 }
3705
3706 return stub_entry;
3707}
3708
3709/* Add a new stub entry to the stub hash. Not all fields of the new
3710 stub entry are initialised. */
3711
3712static struct ppc_stub_hash_entry *
4ce794b7
AM
3713ppc_add_stub (const char *stub_name,
3714 asection *section,
25f53a85 3715 struct bfd_link_info *info)
721956f4 3716{
25f53a85 3717 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 3718 struct map_stub *group;
721956f4
AM
3719 asection *link_sec;
3720 asection *stub_sec;
3721 struct ppc_stub_hash_entry *stub_entry;
3722
6f20ed8a
AM
3723 group = htab->sec_info[section->id].u.group;
3724 link_sec = group->link_sec;
3725 stub_sec = group->stub_sec;
721956f4
AM
3726 if (stub_sec == NULL)
3727 {
6f20ed8a
AM
3728 size_t namelen;
3729 bfd_size_type len;
3730 char *s_name;
721956f4 3731
6f20ed8a
AM
3732 namelen = strlen (link_sec->name);
3733 len = namelen + sizeof (STUB_SUFFIX);
3734 s_name = bfd_alloc (htab->params->stub_bfd, len);
3735 if (s_name == NULL)
3736 return NULL;
721956f4 3737
6f20ed8a
AM
3738 memcpy (s_name, link_sec->name, namelen);
3739 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3740 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
3741 if (stub_sec == NULL)
3742 return NULL;
3743 group->stub_sec = stub_sec;
721956f4
AM
3744 }
3745
3746 /* Enter this entry into the linker stub hash table. */
3747 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 3748 TRUE, FALSE);
721956f4
AM
3749 if (stub_entry == NULL)
3750 {
695344c0 3751 /* xgettext:c-format */
cf97bcb0
AM
3752 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
3753 section->owner, stub_name);
721956f4
AM
3754 return NULL;
3755 }
3756
6f20ed8a 3757 stub_entry->group = group;
721956f4 3758 stub_entry->stub_offset = 0;
721956f4
AM
3759 return stub_entry;
3760}
3761
e717da7e
AM
3762/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3763 not already done. */
65f38f15 3764
b34976b6 3765static bfd_boolean
e717da7e 3766create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 3767{
e717da7e
AM
3768 asection *got, *relgot;
3769 flagword flags;
3770 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 3771
0c8d6e5c 3772 if (!is_ppc64_elf (abfd))
0ffa91dd 3773 return FALSE;
4dfe6ac6
NC
3774 if (htab == NULL)
3775 return FALSE;
0ffa91dd 3776
33e44f2e
AM
3777 if (!htab->elf.sgot
3778 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
3779 return FALSE;
e717da7e
AM
3780
3781 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3782 | SEC_LINKER_CREATED);
3783
c456f082 3784 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 3785 if (!got
fd361982 3786 || !bfd_set_section_alignment (got, 3))
e717da7e 3787 return FALSE;
65f38f15 3788
c456f082
AM
3789 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
3790 flags | SEC_READONLY);
e717da7e 3791 if (!relgot
fd361982 3792 || !bfd_set_section_alignment (relgot, 3))
b34976b6 3793 return FALSE;
e717da7e
AM
3794
3795 ppc64_elf_tdata (abfd)->got = got;
3796 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 3797 return TRUE;
65f38f15 3798}
5bd4f169 3799
b31867b6
AM
3800/* Follow indirect and warning symbol links. */
3801
3802static inline struct bfd_link_hash_entry *
3803follow_link (struct bfd_link_hash_entry *h)
3804{
3805 while (h->type == bfd_link_hash_indirect
3806 || h->type == bfd_link_hash_warning)
3807 h = h->u.i.link;
3808 return h;
3809}
3810
3811static inline struct elf_link_hash_entry *
3812elf_follow_link (struct elf_link_hash_entry *h)
3813{
3814 return (struct elf_link_hash_entry *) follow_link (&h->root);
3815}
3816
3817static inline struct ppc_link_hash_entry *
3818ppc_follow_link (struct ppc_link_hash_entry *h)
3819{
ed7007c1 3820 return ppc_elf_hash_entry (elf_follow_link (&h->elf));
b31867b6
AM
3821}
3822
40d16e0b
AM
3823/* Merge PLT info on FROM with that on TO. */
3824
3825static void
3826move_plt_plist (struct ppc_link_hash_entry *from,
3827 struct ppc_link_hash_entry *to)
3828{
3829 if (from->elf.plt.plist != NULL)
3830 {
3831 if (to->elf.plt.plist != NULL)
3832 {
3833 struct plt_entry **entp;
3834 struct plt_entry *ent;
3835
3836 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
3837 {
3838 struct plt_entry *dent;
3839
3840 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
3841 if (dent->addend == ent->addend)
3842 {
3843 dent->plt.refcount += ent->plt.refcount;
3844 *entp = ent->next;
3845 break;
3846 }
3847 if (dent == NULL)
3848 entp = &ent->next;
3849 }
3850 *entp = to->elf.plt.plist;
3851 }
3852
3853 to->elf.plt.plist = from->elf.plt.plist;
3854 from->elf.plt.plist = NULL;
3855 }
3856}
3857
65f38f15
AM
3858/* Copy the extra info we tack onto an elf_link_hash_entry. */
3859
3860static void
fcfa13d2
AM
3861ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
3862 struct elf_link_hash_entry *dir,
3863 struct elf_link_hash_entry *ind)
65f38f15
AM
3864{
3865 struct ppc_link_hash_entry *edir, *eind;
3866
ed7007c1
AM
3867 edir = ppc_elf_hash_entry (dir);
3868 eind = ppc_elf_hash_entry (ind);
65f38f15 3869
c79d6685
AM
3870 edir->is_func |= eind->is_func;
3871 edir->is_func_descriptor |= eind->is_func_descriptor;
3872 edir->tls_mask |= eind->tls_mask;
3873 if (eind->oh != NULL)
3874 edir->oh = ppc_follow_link (eind->oh);
3875
474436e6 3876 if (edir->elf.versioned != versioned_hidden)
e81830c5
AM
3877 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
3878 edir->elf.ref_regular |= eind->elf.ref_regular;
3879 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4a7e5234 3880 edir->elf.non_got_ref |= eind->elf.non_got_ref;
e81830c5
AM
3881 edir->elf.needs_plt |= eind->elf.needs_plt;
3882 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
c79d6685 3883
d311bc8b
AM
3884 /* If we were called to copy over info for a weak sym, don't copy
3885 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
3886 in order to simplify readonly_dynrelocs and save a field in the
3887 symbol hash entry, but that means dyn_relocs can't be used in any
3888 tests about a specific symbol, or affect other symbol flags which
ab2477e1 3889 are then tested. */
d311bc8b 3890 if (eind->elf.root.type != bfd_link_hash_indirect)
ab2477e1 3891 return;
d311bc8b 3892
411e1bfb 3893 /* Copy over any dynamic relocs we may have on the indirect sym. */
bbd7ec4a 3894 if (eind->dyn_relocs != NULL)
65f38f15 3895 {
bbd7ec4a
AM
3896 if (edir->dyn_relocs != NULL)
3897 {
6061a67d
AM
3898 struct elf_dyn_relocs **pp;
3899 struct elf_dyn_relocs *p;
bbd7ec4a 3900
fcfa13d2 3901 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a
AM
3902 list. Merge any entries against the same section. */
3903 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3904 {
6061a67d 3905 struct elf_dyn_relocs *q;
bbd7ec4a
AM
3906
3907 for (q = edir->dyn_relocs; q != NULL; q = q->next)
3908 if (q->sec == p->sec)
3909 {
3910 q->pc_count += p->pc_count;
3911 q->count += p->count;
3912 *pp = p->next;
3913 break;
3914 }
3915 if (q == NULL)
3916 pp = &p->next;
3917 }
3918 *pp = edir->dyn_relocs;
3919 }
3920
65f38f15
AM
3921 edir->dyn_relocs = eind->dyn_relocs;
3922 eind->dyn_relocs = NULL;
3923 }
65f38f15 3924
81848ca0
AM
3925 /* Copy over got entries that we may have already seen to the
3926 symbol which just became indirect. */
411e1bfb
AM
3927 if (eind->elf.got.glist != NULL)
3928 {
3929 if (edir->elf.got.glist != NULL)
3930 {
3931 struct got_entry **entp;
3932 struct got_entry *ent;
3933
3934 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3935 {
3936 struct got_entry *dent;
3937
3938 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3939 if (dent->addend == ent->addend
e717da7e 3940 && dent->owner == ent->owner
411e1bfb
AM
3941 && dent->tls_type == ent->tls_type)
3942 {
3943 dent->got.refcount += ent->got.refcount;
3944 *entp = ent->next;
3945 break;
3946 }
3947 if (dent == NULL)
3948 entp = &ent->next;
3949 }
3950 *entp = edir->elf.got.glist;
3951 }
3952
3953 edir->elf.got.glist = eind->elf.got.glist;
3954 eind->elf.got.glist = NULL;
3955 }
3956
3957 /* And plt entries. */
40d16e0b 3958 move_plt_plist (eind, edir);
411e1bfb 3959
fcfa13d2 3960 if (eind->elf.dynindx != -1)
411e1bfb 3961 {
fcfa13d2
AM
3962 if (edir->elf.dynindx != -1)
3963 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3964 edir->elf.dynstr_index);
411e1bfb
AM
3965 edir->elf.dynindx = eind->elf.dynindx;
3966 edir->elf.dynstr_index = eind->elf.dynstr_index;
3967 eind->elf.dynindx = -1;
3968 eind->elf.dynstr_index = 0;
3969 }
411e1bfb
AM
3970}
3971
8387904d
AM
3972/* Find the function descriptor hash entry from the given function code
3973 hash entry FH. Link the entries via their OH fields. */
3974
3975static struct ppc_link_hash_entry *
b31867b6 3976lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
3977{
3978 struct ppc_link_hash_entry *fdh = fh->oh;
3979
3980 if (fdh == NULL)
3981 {
3982 const char *fd_name = fh->elf.root.root.string + 1;
3983
ed7007c1
AM
3984 fdh = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, fd_name,
3985 FALSE, FALSE, FALSE));
b31867b6
AM
3986 if (fdh == NULL)
3987 return fdh;
3988
3989 fdh->is_func_descriptor = 1;
3990 fdh->oh = fh;
3991 fh->is_func = 1;
3992 fh->oh = fdh;
8387904d
AM
3993 }
3994
8c5b4e52
AM
3995 fdh = ppc_follow_link (fdh);
3996 fdh->is_func_descriptor = 1;
3997 fdh->oh = fh;
3998 return fdh;
8387904d
AM
3999}
4000
8c5b4e52 4001/* Make a fake function descriptor sym for the undefined code sym FH. */
bb700d78
AM
4002
4003static struct ppc_link_hash_entry *
4004make_fdh (struct bfd_link_info *info,
908b32fc 4005 struct ppc_link_hash_entry *fh)
bb700d78 4006{
8c5b4e52
AM
4007 bfd *abfd = fh->elf.root.u.undef.abfd;
4008 struct bfd_link_hash_entry *bh = NULL;
bb700d78 4009 struct ppc_link_hash_entry *fdh;
8c5b4e52
AM
4010 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4011 ? BSF_WEAK
4012 : BSF_GLOBAL);
4013
4014 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4015 fh->elf.root.root.string + 1,
4016 flags, bfd_und_section_ptr, 0,
4017 NULL, FALSE, FALSE, &bh))
bb700d78
AM
4018 return NULL;
4019
4020 fdh = (struct ppc_link_hash_entry *) bh;
4021 fdh->elf.non_elf = 0;
908b32fc
AM
4022 fdh->fake = 1;
4023 fdh->is_func_descriptor = 1;
4024 fdh->oh = fh;
4025 fh->is_func = 1;
4026 fh->oh = fdh;
bb700d78
AM
4027 return fdh;
4028}
4029
8387904d
AM
4030/* Fix function descriptor symbols defined in .opd sections to be
4031 function type. */
555cd476
AM
4032
4033static bfd_boolean
c16153ae 4034ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 4035 struct bfd_link_info *info,
555cd476 4036 Elf_Internal_Sym *isym,
6911b7dc 4037 const char **name,
555cd476
AM
4038 flagword *flags ATTRIBUTE_UNUSED,
4039 asection **sec,
b53dfeb2 4040 bfd_vma *value)
555cd476 4041{
b53dfeb2 4042 if (*sec != NULL
f1885d1e 4043 && strcmp ((*sec)->name, ".opd") == 0)
b53dfeb2
AM
4044 {
4045 asection *code_sec;
4046
4047 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4048 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4049 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4050
4051 /* If the symbol is a function defined in .opd, and the function
4052 code is in a discarded group, let it appear to be undefined. */
0e1862bb 4053 if (!bfd_link_relocatable (info)
b53dfeb2
AM
4054 && (*sec)->reloc_count != 0
4055 && opd_entry_value (*sec, *value, &code_sec, NULL,
4056 FALSE) != (bfd_vma) -1
4057 && discarded_section (code_sec))
4058 {
4059 *sec = bfd_und_section_ptr;
4060 isym->st_shndx = SHN_UNDEF;
4061 }
4062 }
dbd1e97e
AM
4063 else if (*sec != NULL
4064 && strcmp ((*sec)->name, ".toc") == 0
4065 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4066 {
4067 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4068 if (htab != NULL)
4069 htab->params->object_in_toc = 1;
4070 }
433817dd 4071
6911b7dc
AM
4072 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4073 {
4074 if (abiversion (ibfd) == 0)
4075 set_abiversion (ibfd, 2);
4076 else if (abiversion (ibfd) == 1)
4077 {
cf97bcb0
AM
4078 _bfd_error_handler (_("symbol '%s' has invalid st_other"
4079 " for ABI version 1"), *name);
6911b7dc
AM
4080 bfd_set_error (bfd_error_bad_value);
4081 return FALSE;
4082 }
4083 }
4084
555cd476
AM
4085 return TRUE;
4086}
4087
6911b7dc
AM
4088/* Merge non-visibility st_other attributes: local entry point. */
4089
4090static void
4091ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4092 const Elf_Internal_Sym *isym,
4093 bfd_boolean definition,
4094 bfd_boolean dynamic)
4095{
f378ab09 4096 if (definition && (!dynamic || !h->def_regular))
6911b7dc
AM
4097 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4098 | ELF_ST_VISIBILITY (h->other));
4099}
4100
8c5b4e52
AM
4101/* Hook called on merging a symbol. We use this to clear "fake" since
4102 we now have a real symbol. */
4103
4104static bfd_boolean
4105ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
8b5f1ed8 4106 const Elf_Internal_Sym *isym,
8c5b4e52
AM
4107 asection **psec ATTRIBUTE_UNUSED,
4108 bfd_boolean newdef ATTRIBUTE_UNUSED,
4109 bfd_boolean olddef ATTRIBUTE_UNUSED,
4110 bfd *oldbfd ATTRIBUTE_UNUSED,
4111 const asection *oldsec ATTRIBUTE_UNUSED)
4112{
ed7007c1 4113 ppc_elf_hash_entry (h)->fake = 0;
8b5f1ed8 4114 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
ed7007c1 4115 ppc_elf_hash_entry (h)->non_zero_localentry = 1;
8c5b4e52
AM
4116 return TRUE;
4117}
4118
8387904d 4119/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
4120 inclusion of a new ABI object archive that defines "bar".
4121 NAME is a symbol defined in an archive. Return a symbol in the hash
4122 table that might be satisfied by the archive symbols. */
8387904d
AM
4123
4124static struct elf_link_hash_entry *
4125ppc64_elf_archive_symbol_lookup (bfd *abfd,
4126 struct bfd_link_info *info,
4127 const char *name)
4128{
4129 struct elf_link_hash_entry *h;
4130 char *dot_name;
4131 size_t len;
4132
4133 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
4134 if (h != NULL
4135 /* Don't return this sym if it is a fake function descriptor
4136 created by add_symbol_adjust. */
ed7007c1 4137 && !ppc_elf_hash_entry (h)->fake)
8387904d
AM
4138 return h;
4139
4140 if (name[0] == '.')
4141 return h;
4142
4143 len = strlen (name);
4144 dot_name = bfd_alloc (abfd, len + 2);
4145 if (dot_name == NULL)
e99955cd 4146 return (struct elf_link_hash_entry *) -1;
8387904d
AM
4147 dot_name[0] = '.';
4148 memcpy (dot_name + 1, name, len + 1);
4149 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4150 bfd_release (abfd, dot_name);
4151 return h;
4152}
4153
4154/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
4155 new ABI object defines "bar". Well, at least, undefined dot symbols
4156 are made weak. This stops later archive searches from including an
4157 object if we already have a function descriptor definition. It also
35b0ce59
AM
4158 prevents the linker complaining about undefined symbols.
4159 We also check and correct mismatched symbol visibility here. The
4160 most restrictive visibility of the function descriptor and the
4161 function entry symbol is used. */
8387904d
AM
4162
4163static bfd_boolean
b3fac117 4164add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 4165{
8387904d
AM
4166 struct ppc_link_hash_table *htab;
4167 struct ppc_link_hash_entry *fdh;
4168
b3fac117
AM
4169 if (eh->elf.root.type == bfd_link_hash_warning)
4170 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 4171
8400d40d
AM
4172 if (eh->elf.root.type == bfd_link_hash_indirect)
4173 return TRUE;
4174
b3fac117
AM
4175 if (eh->elf.root.root.string[0] != '.')
4176 abort ();
8387904d 4177
b3fac117 4178 htab = ppc_hash_table (info);
4dfe6ac6
NC
4179 if (htab == NULL)
4180 return FALSE;
4181
b31867b6 4182 fdh = lookup_fdh (eh, htab);
8c5b4e52
AM
4183 if (fdh == NULL
4184 && !bfd_link_relocatable (info)
4185 && (eh->elf.root.type == bfd_link_hash_undefined
4186 || eh->elf.root.type == bfd_link_hash_undefweak)
4187 && eh->elf.ref_regular)
4188 {
4189 /* Make an undefined function descriptor sym, in order to
4190 pull in an --as-needed shared lib. Archives are handled
4191 elsewhere. */
4192 fdh = make_fdh (info, eh);
4193 if (fdh == NULL)
4194 return FALSE;
bb700d78 4195 }
8c5b4e52
AM
4196
4197 if (fdh != NULL)
8387904d 4198 {
35b0ce59
AM
4199 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4200 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
8c5b4e52
AM
4201
4202 /* Make both descriptor and entry symbol have the most
4203 constraining visibility of either symbol. */
35b0ce59
AM
4204 if (entry_vis < descr_vis)
4205 fdh->elf.other += entry_vis - descr_vis;
4206 else if (entry_vis > descr_vis)
4207 eh->elf.other += descr_vis - entry_vis;
4208
8c5b4e52
AM
4209 /* Propagate reference flags from entry symbol to function
4210 descriptor symbol. */
bc4e12de 4211 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
4070765b 4212 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
8c5b4e52
AM
4213 fdh->elf.ref_regular |= eh->elf.ref_regular;
4214 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
4215
4216 if (!fdh->elf.forced_local
4217 && fdh->elf.dynindx == -1
4218 && fdh->elf.versioned != versioned_hidden
4219 && (bfd_link_dll (info)
4220 || fdh->elf.def_dynamic
4221 || fdh->elf.ref_dynamic)
4222 && (eh->elf.ref_regular
4223 || eh->elf.def_regular))
4224 {
2cdcc330 4225 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
8c5b4e52 4226 return FALSE;
35b0ce59 4227 }
8387904d 4228 }
99877b66 4229
8387904d
AM
4230 return TRUE;
4231}
4232
f6c7c3e8
AM
4233/* Set up opd section info and abiversion for IBFD, and process list
4234 of dot-symbols we made in link_hash_newfunc. */
b3fac117 4235
8387904d 4236static bfd_boolean
f6c7c3e8 4237ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
8387904d 4238{
99877b66 4239 struct ppc_link_hash_table *htab;
b3fac117 4240 struct ppc_link_hash_entry **p, *eh;
459609d6 4241 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
433817dd 4242
459609d6 4243 if (opd != NULL && opd->size != 0)
b3fac117 4244 {
b9399fcf
AM
4245 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
4246 ppc64_elf_section_data (opd)->sec_type = sec_opd;
4247
459609d6
AM
4248 if (abiversion (ibfd) == 0)
4249 set_abiversion (ibfd, 1);
8a2058b5 4250 else if (abiversion (ibfd) >= 2)
f6c7c3e8 4251 {
695344c0 4252 /* xgettext:c-format */
cf97bcb0
AM
4253 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"),
4254 ibfd, abiversion (ibfd));
459609d6
AM
4255 bfd_set_error (bfd_error_bad_value);
4256 return FALSE;
f6c7c3e8 4257 }
b9399fcf 4258 }
f6c7c3e8 4259
b9399fcf
AM
4260 if (is_ppc64_elf (info->output_bfd))
4261 {
4262 /* For input files without an explicit abiversion in e_flags
4263 we should have flagged any with symbol st_other bits set
4264 as ELFv1 and above flagged those with .opd as ELFv2.
4265 Set the output abiversion if not yet set, and for any input
4266 still ambiguous, take its abiversion from the output.
4267 Differences in ABI are reported later. */
4268 if (abiversion (info->output_bfd) == 0)
4269 set_abiversion (info->output_bfd, abiversion (ibfd));
4270 else if (abiversion (ibfd) == 0)
4271 set_abiversion (ibfd, abiversion (info->output_bfd));
b3fac117
AM
4272 }
4273
459609d6
AM
4274 htab = ppc_hash_table (info);
4275 if (htab == NULL)
b9399fcf 4276 return TRUE;
459609d6 4277
b9399fcf
AM
4278 if (opd != NULL && opd->size != 0
4279 && (ibfd->flags & DYNAMIC) == 0
4280 && (opd->flags & SEC_RELOC) != 0
4281 && opd->reloc_count != 0
4282 && !bfd_is_abs_section (opd->output_section)
4283 && info->gc_sections)
4284 {
4285 /* Garbage collection needs some extra help with .opd sections.
4286 We don't want to necessarily keep everything referenced by
4287 relocs in .opd, as that would keep all functions. Instead,
4288 if we reference an .opd symbol (a function descriptor), we
4289 want to keep the function code symbol's section. This is
4290 easy for global symbols, but for local syms we need to keep
4291 information about the associated function section. */
4292 bfd_size_type amt;
4293 asection **opd_sym_map;
4294 Elf_Internal_Shdr *symtab_hdr;
4295 Elf_Internal_Rela *relocs, *rel_end, *rel;
4296
4297 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
4298 opd_sym_map = bfd_zalloc (ibfd, amt);
4299 if (opd_sym_map == NULL)
4300 return FALSE;
4301 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
4302 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
4303 info->keep_memory);
4304 if (relocs == NULL)
4305 return FALSE;
4306 symtab_hdr = &elf_symtab_hdr (ibfd);
4307 rel_end = relocs + opd->reloc_count - 1;
4308 for (rel = relocs; rel < rel_end; rel++)
4309 {
4310 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
4311 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
4312
4313 if (r_type == R_PPC64_ADDR64
4314 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
4315 && r_symndx < symtab_hdr->sh_info)
4316 {
4317 Elf_Internal_Sym *isym;
4318 asection *s;
4319
4320 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
4321 if (isym == NULL)
4322 {
4323 if (elf_section_data (opd)->relocs != relocs)
4324 free (relocs);
4325 return FALSE;
4326 }
4327
4328 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
4329 if (s != NULL && s != opd)
4330 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
4331 }
4332 }
4333 if (elf_section_data (opd)->relocs != relocs)
4334 free (relocs);
4335 }
459609d6
AM
4336
4337 p = &htab->dot_syms;
4338 while ((eh = *p) != NULL)
4339 {
4340 *p = NULL;
4341 if (&eh->elf == htab->elf.hgot)
4342 ;
4343 else if (htab->elf.hgot == NULL
4344 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4345 htab->elf.hgot = &eh->elf;
8c5b4e52
AM
4346 else if (abiversion (ibfd) <= 1)
4347 {
4348 htab->need_func_desc_adj = 1;
4349 if (!add_symbol_adjust (eh, info))
4350 return FALSE;
4351 }
459609d6
AM
4352 p = &eh->u.next_dot_sym;
4353 }
b3fac117 4354 return TRUE;
8387904d
AM
4355}
4356
97fed1c9
JJ
4357/* Undo hash table changes when an --as-needed input file is determined
4358 not to be needed. */
4359
4360static bfd_boolean
e5034e59
AM
4361ppc64_elf_notice_as_needed (bfd *ibfd,
4362 struct bfd_link_info *info,
4363 enum notice_asneeded_action act)
97fed1c9 4364{
e5034e59
AM
4365 if (act == notice_not_needed)
4366 {
4367 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 4368
e5034e59
AM
4369 if (htab == NULL)
4370 return FALSE;
4dfe6ac6 4371
e5034e59
AM
4372 htab->dot_syms = NULL;
4373 }
4374 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
4375}
4376
aa374f67
AM
4377/* If --just-symbols against a final linked binary, then assume we need
4378 toc adjusting stubs when calling functions defined there. */
4379
4380static void
4381ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4382{
4383 if ((sec->flags & SEC_CODE) != 0
4384 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4385 && is_ppc64_elf (sec->owner))
4386 {
2c3f079f
AM
4387 if (abiversion (sec->owner) >= 2
4388 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
aa374f67
AM
4389 sec->has_toc_reloc = 1;
4390 }
4391 _bfd_elf_link_just_syms (sec, info);
4392}
4393
e054468f 4394static struct plt_entry **
4ce794b7
AM
4395update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4396 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
4397{
4398 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 4399 struct plt_entry **local_plt;
f961d9dd 4400 unsigned char *local_got_tls_masks;
411e1bfb
AM
4401
4402 if (local_got_ents == NULL)
4403 {
4404 bfd_size_type size = symtab_hdr->sh_info;
4405
e054468f
AM
4406 size *= (sizeof (*local_got_ents)
4407 + sizeof (*local_plt)
4408 + sizeof (*local_got_tls_masks));
4ce794b7 4409 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 4410 if (local_got_ents == NULL)
e054468f 4411 return NULL;
411e1bfb
AM
4412 elf_local_got_ents (abfd) = local_got_ents;
4413 }
4414
37da22e5 4415 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0)
411e1bfb
AM
4416 {
4417 struct got_entry *ent;
4418
4419 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
4420 if (ent->addend == r_addend
4421 && ent->owner == abfd
4422 && ent->tls_type == tls_type)
411e1bfb
AM
4423 break;
4424 if (ent == NULL)
4425 {
4426 bfd_size_type amt = sizeof (*ent);
4ce794b7 4427 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4428 if (ent == NULL)
4429 return FALSE;
4430 ent->next = local_got_ents[r_symndx];
4431 ent->addend = r_addend;
e717da7e 4432 ent->owner = abfd;
411e1bfb 4433 ent->tls_type = tls_type;
927be08e 4434 ent->is_indirect = FALSE;
411e1bfb
AM
4435 ent->got.refcount = 0;
4436 local_got_ents[r_symndx] = ent;
4437 }
4438 ent->got.refcount += 1;
4439 }
4440
e054468f 4441 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 4442 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
37da22e5 4443 local_got_tls_masks[r_symndx] |= tls_type & 0xff;
e054468f
AM
4444
4445 return local_plt + r_symndx;
65f38f15
AM
4446}
4447
411e1bfb 4448static bfd_boolean
e054468f 4449update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 4450{
411e1bfb 4451 struct plt_entry *ent;
1e2f5b6e 4452
e054468f 4453 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
4454 if (ent->addend == addend)
4455 break;
4456 if (ent == NULL)
1e2f5b6e 4457 {
411e1bfb 4458 bfd_size_type amt = sizeof (*ent);
4ce794b7 4459 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4460 if (ent == NULL)
4461 return FALSE;
e054468f 4462 ent->next = *plist;
411e1bfb
AM
4463 ent->addend = addend;
4464 ent->plt.refcount = 0;
e054468f 4465 *plist = ent;
1e2f5b6e 4466 }
411e1bfb 4467 ent->plt.refcount += 1;
b34976b6 4468 return TRUE;
1e2f5b6e
AM
4469}
4470
e054468f
AM
4471static bfd_boolean
4472is_branch_reloc (enum elf_ppc64_reloc_type r_type)
4473{
4474 return (r_type == R_PPC64_REL24
05d0e962 4475 || r_type == R_PPC64_REL24_NOTOC
e054468f
AM
4476 || r_type == R_PPC64_REL14
4477 || r_type == R_PPC64_REL14_BRTAKEN
4478 || r_type == R_PPC64_REL14_BRNTAKEN
4479 || r_type == R_PPC64_ADDR24
4480 || r_type == R_PPC64_ADDR14
4481 || r_type == R_PPC64_ADDR14_BRTAKEN
23cedd1d 4482 || r_type == R_PPC64_ADDR14_BRNTAKEN
5663e321
AM
4483 || r_type == R_PPC64_PLTCALL
4484 || r_type == R_PPC64_PLTCALL_NOTOC);
23cedd1d
AM
4485}
4486
4487/* Relocs on inline plt call sequence insns prior to the call. */
4488
4489static bfd_boolean
4490is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type)
4491{
4492 return (r_type == R_PPC64_PLT16_HA
4493 || r_type == R_PPC64_PLT16_HI
4494 || r_type == R_PPC64_PLT16_LO
4495 || r_type == R_PPC64_PLT16_LO_DS
5663e321
AM
4496 || r_type == R_PPC64_PLT_PCREL34
4497 || r_type == R_PPC64_PLT_PCREL34_NOTOC
4498 || r_type == R_PPC64_PLTSEQ
4499 || r_type == R_PPC64_PLTSEQ_NOTOC);
e054468f
AM
4500}
4501
5bd4f169 4502/* Look through the relocs for a section during the first phase, and
65f38f15 4503 calculate needed space in the global offset table, procedure
5d1634d7 4504 linkage table, and dynamic reloc sections. */
5bd4f169 4505
b34976b6 4506static bfd_boolean
4ce794b7
AM
4507ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4508 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 4509{
65f38f15 4510 struct ppc_link_hash_table *htab;
5bd4f169 4511 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 4512 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
4513 const Elf_Internal_Rela *rel;
4514 const Elf_Internal_Rela *rel_end;
5bd4f169 4515 asection *sreloc;
3a71aa26 4516 struct elf_link_hash_entry *tga, *dottga;
b9399fcf 4517 bfd_boolean is_opd;
5bd4f169 4518
0e1862bb 4519 if (bfd_link_relocatable (info))
b34976b6 4520 return TRUE;
5bd4f169 4521
680a3378
AM
4522 /* Don't do anything special with non-loaded, non-alloced sections.
4523 In particular, any relocs in such sections should not affect GOT
4524 and PLT reference counting (ie. we don't allow them to create GOT
4525 or PLT entries), there's no possibility or desire to optimize TLS
4526 relocs, and there's not much point in propagating relocs to shared
4527 libs that the dynamic linker won't relocate. */
4528 if ((sec->flags & SEC_ALLOC) == 0)
4529 return TRUE;
4530
0c8d6e5c 4531 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 4532
65f38f15 4533 htab = ppc_hash_table (info);
4dfe6ac6
NC
4534 if (htab == NULL)
4535 return FALSE;
4536
3a71aa26
AM
4537 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4538 FALSE, FALSE, TRUE);
4539 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
4540 FALSE, FALSE, TRUE);
0ffa91dd 4541 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 4542 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 4543 sreloc = NULL;
b9399fcf 4544 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5bd4f169
AM
4545 rel_end = relocs + sec->reloc_count;
4546 for (rel = relocs; rel < rel_end; rel++)
4547 {
4548 unsigned long r_symndx;
4549 struct elf_link_hash_entry *h;
04c9666a 4550 enum elf_ppc64_reloc_type r_type;
727fc41e 4551 int tls_type;
7c8fe5c4 4552 struct _ppc64_elf_section_data *ppc64_sec;
cbf95972 4553 struct plt_entry **ifunc, **plt_list;
5bd4f169
AM
4554
4555 r_symndx = ELF64_R_SYM (rel->r_info);
4556 if (r_symndx < symtab_hdr->sh_info)
4557 h = NULL;
4558 else
973a3492
L
4559 {
4560 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 4561 h = elf_follow_link (h);
1c865ab2
AM
4562
4563 if (h == htab->elf.hgot)
4564 sec->has_toc_reloc = 1;
973a3492 4565 }
5bd4f169 4566
5663e321
AM
4567 r_type = ELF64_R_TYPE (rel->r_info);
4568 switch (r_type)
4569 {
04bdff6a
AM
4570 case R_PPC64_D34:
4571 case R_PPC64_D34_LO:
4572 case R_PPC64_D34_HI30:
4573 case R_PPC64_D34_HA30:
4574 case R_PPC64_D28:
c213164a
AM
4575 case R_PPC64_TPREL34:
4576 case R_PPC64_DTPREL34:
04bdff6a 4577 case R_PPC64_PCREL34:
5663e321 4578 case R_PPC64_GOT_PCREL34:
c213164a
AM
4579 case R_PPC64_GOT_TLSGD34:
4580 case R_PPC64_GOT_TLSLD34:
4581 case R_PPC64_GOT_TPREL34:
4582 case R_PPC64_GOT_DTPREL34:
5663e321
AM
4583 case R_PPC64_PLT_PCREL34:
4584 case R_PPC64_PLT_PCREL34_NOTOC:
04bdff6a
AM
4585 case R_PPC64_PCREL28:
4586 htab->powerxx_stubs = 1;
133a1f60
AM
4587 break;
4588 default:
5663e321
AM
4589 break;
4590 }
903b777d
AM
4591
4592 switch (r_type)
4593 {
4594 case R_PPC64_PLT16_HA:
4595 case R_PPC64_GOT_TLSLD16_HA:
4596 case R_PPC64_GOT_TLSGD16_HA:
4597 case R_PPC64_GOT_TPREL16_HA:
4598 case R_PPC64_GOT_DTPREL16_HA:
4599 case R_PPC64_GOT16_HA:
4600 case R_PPC64_TOC16_HA:
4601 case R_PPC64_PLT16_LO:
4602 case R_PPC64_PLT16_LO_DS:
4603 case R_PPC64_GOT_TLSLD16_LO:
4604 case R_PPC64_GOT_TLSGD16_LO:
4605 case R_PPC64_GOT_TPREL16_LO_DS:
4606 case R_PPC64_GOT_DTPREL16_LO_DS:
4607 case R_PPC64_GOT16_LO:
4608 case R_PPC64_GOT16_LO_DS:
4609 case R_PPC64_TOC16_LO:
4610 case R_PPC64_TOC16_LO_DS:
4611 case R_PPC64_GOT_PCREL34:
4612 ppc64_elf_tdata (abfd)->has_optrel = 1;
4613 ppc64_elf_section_data (sec)->has_optrel = 1;
4614 break;
4615 default:
4616 break;
4617 }
4618
f749f26e 4619 ifunc = NULL;
25f23106
AM
4620 if (h != NULL)
4621 {
4622 if (h->type == STT_GNU_IFUNC)
4623 {
4624 h->needs_plt = 1;
4625 ifunc = &h->plt.plist;
4626 }
4627 }
4628 else
4629 {
4630 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4631 abfd, r_symndx);
4632 if (isym == NULL)
4633 return FALSE;
4634
4635 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4636 {
4637 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4638 rel->r_addend,
37da22e5 4639 NON_GOT | PLT_IFUNC);
25f23106
AM
4640 if (ifunc == NULL)
4641 return FALSE;
4642 }
4643 }
727fc41e 4644
f749f26e 4645 tls_type = 0;
a33d1f77 4646 switch (r_type)
5bd4f169 4647 {
727fc41e
AM
4648 case R_PPC64_TLSGD:
4649 case R_PPC64_TLSLD:
4650 /* These special tls relocs tie a call to __tls_get_addr with
4651 its parameter symbol. */
37da22e5 4652 if (h != NULL)
ed7007c1 4653 ppc_elf_hash_entry (h)->tls_mask |= TLS_TLS | TLS_MARK;
37da22e5
AM
4654 else
4655 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4656 rel->r_addend,
37da22e5
AM
4657 NON_GOT | TLS_TLS | TLS_MARK))
4658 return FALSE;
4659 sec->has_tls_reloc = 1;
727fc41e
AM
4660 break;
4661
411e1bfb
AM
4662 case R_PPC64_GOT_TLSLD16:
4663 case R_PPC64_GOT_TLSLD16_LO:
4664 case R_PPC64_GOT_TLSLD16_HI:
4665 case R_PPC64_GOT_TLSLD16_HA:
c213164a 4666 case R_PPC64_GOT_TLSLD34:
951fd09b 4667 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
4668 goto dogottls;
4669
4670 case R_PPC64_GOT_TLSGD16:
4671 case R_PPC64_GOT_TLSGD16_LO:
4672 case R_PPC64_GOT_TLSGD16_HI:
4673 case R_PPC64_GOT_TLSGD16_HA:
c213164a 4674 case R_PPC64_GOT_TLSGD34:
951fd09b 4675 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
4676 goto dogottls;
4677
4678 case R_PPC64_GOT_TPREL16_DS:
4679 case R_PPC64_GOT_TPREL16_LO_DS:
4680 case R_PPC64_GOT_TPREL16_HI:
4681 case R_PPC64_GOT_TPREL16_HA:
c213164a 4682 case R_PPC64_GOT_TPREL34:
7c8bbca5 4683 if (bfd_link_dll (info))
411e1bfb
AM
4684 info->flags |= DF_STATIC_TLS;
4685 tls_type = TLS_TLS | TLS_TPREL;
4686 goto dogottls;
4687
4688 case R_PPC64_GOT_DTPREL16_DS:
4689 case R_PPC64_GOT_DTPREL16_LO_DS:
4690 case R_PPC64_GOT_DTPREL16_HI:
4691 case R_PPC64_GOT_DTPREL16_HA:
c213164a 4692 case R_PPC64_GOT_DTPREL34:
411e1bfb
AM
4693 tls_type = TLS_TLS | TLS_DTPREL;
4694 dogottls:
4695 sec->has_tls_reloc = 1;
066f4018 4696 goto dogot;
411e1bfb 4697
903b777d
AM
4698 case R_PPC64_GOT16:
4699 case R_PPC64_GOT16_LO:
4700 case R_PPC64_GOT16_HI:
65f38f15 4701 case R_PPC64_GOT16_HA:
903b777d 4702 case R_PPC64_GOT16_DS:
066f4018 4703 case R_PPC64_GOT16_LO_DS:
4a421c53 4704 case R_PPC64_GOT_PCREL34:
066f4018 4705 dogot:
65f38f15 4706 /* This symbol requires a global offset table entry. */
4c52953f 4707 sec->has_toc_reloc = 1;
33c0ec9d
AM
4708 if (r_type == R_PPC64_GOT_TLSLD16
4709 || r_type == R_PPC64_GOT_TLSGD16
4710 || r_type == R_PPC64_GOT_TPREL16_DS
4711 || r_type == R_PPC64_GOT_DTPREL16_DS
4712 || r_type == R_PPC64_GOT16
4713 || r_type == R_PPC64_GOT16_DS)
4714 {
4715 htab->do_multi_toc = 1;
d77c8a4b 4716 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
4717 }
4718
e717da7e
AM
4719 if (ppc64_elf_tdata (abfd)->got == NULL
4720 && !create_got_section (abfd, info))
b34976b6 4721 return FALSE;
5bd4f169
AM
4722
4723 if (h != NULL)
4724 {
411e1bfb
AM
4725 struct ppc_link_hash_entry *eh;
4726 struct got_entry *ent;
65f38f15 4727
ed7007c1 4728 eh = ppc_elf_hash_entry (h);
411e1bfb 4729 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
133a1f60 4730 if (ent->addend == rel->r_addend
e717da7e 4731 && ent->owner == abfd
411e1bfb
AM
4732 && ent->tls_type == tls_type)
4733 break;
4734 if (ent == NULL)
5bd4f169 4735 {
411e1bfb 4736 bfd_size_type amt = sizeof (*ent);
4ce794b7 4737 ent = bfd_alloc (abfd, amt);
411e1bfb 4738 if (ent == NULL)
b34976b6 4739 return FALSE;
411e1bfb 4740 ent->next = eh->elf.got.glist;
133a1f60 4741 ent->addend = rel->r_addend;
e717da7e 4742 ent->owner = abfd;
411e1bfb 4743 ent->tls_type = tls_type;
927be08e 4744 ent->is_indirect = FALSE;
411e1bfb
AM
4745 ent->got.refcount = 0;
4746 eh->elf.got.glist = ent;
5bd4f169 4747 }
411e1bfb 4748 ent->got.refcount += 1;
e7b938ca 4749 eh->tls_mask |= tls_type;
5bd4f169 4750 }
411e1bfb
AM
4751 else
4752 /* This is a global offset table entry for a local symbol. */
4753 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4754 rel->r_addend, tls_type))
411e1bfb 4755 return FALSE;
a345bc8d
AM
4756
4757 /* We may also need a plt entry if the symbol turns out to be
4758 an ifunc. */
0e1862bb 4759 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
a345bc8d 4760 {
133a1f60 4761 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
a345bc8d
AM
4762 return FALSE;
4763 }
5bd4f169
AM
4764 break;
4765
5bd4f169 4766 case R_PPC64_PLT16_HA:
65f38f15
AM
4767 case R_PPC64_PLT16_HI:
4768 case R_PPC64_PLT16_LO:
08be3224 4769 case R_PPC64_PLT16_LO_DS:
5663e321
AM
4770 case R_PPC64_PLT_PCREL34:
4771 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
4772 case R_PPC64_PLT32:
4773 case R_PPC64_PLT64:
cbf95972
AM
4774 /* This symbol requires a procedure linkage table entry. */
4775 plt_list = ifunc;
4776 if (h != NULL)
e054468f 4777 {
e054468f
AM
4778 h->needs_plt = 1;
4779 if (h->root.root.string[0] == '.'
4780 && h->root.root.string[1] != '\0')
ed7007c1
AM
4781 ppc_elf_hash_entry (h)->is_func = 1;
4782 ppc_elf_hash_entry (h)->tls_mask |= PLT_KEEP;
cbf95972
AM
4783 plt_list = &h->plt.plist;
4784 }
4785 if (plt_list == NULL)
2d7ad24e 4786 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4787 rel->r_addend,
2d7ad24e 4788 NON_GOT | PLT_KEEP);
133a1f60 4789 if (!update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4790 return FALSE;
5bd4f169
AM
4791 break;
4792
4793 /* The following relocations don't need to propagate the
4794 relocation if linking a shared object since they are
4795 section relative. */
4796 case R_PPC64_SECTOFF:
4797 case R_PPC64_SECTOFF_LO:
4798 case R_PPC64_SECTOFF_HI:
4799 case R_PPC64_SECTOFF_HA:
4800 case R_PPC64_SECTOFF_DS:
4801 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
4802 case R_PPC64_DTPREL16:
4803 case R_PPC64_DTPREL16_LO:
4804 case R_PPC64_DTPREL16_HI:
4805 case R_PPC64_DTPREL16_HA:
4806 case R_PPC64_DTPREL16_DS:
4807 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
4808 case R_PPC64_DTPREL16_HIGH:
4809 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
4810 case R_PPC64_DTPREL16_HIGHER:
4811 case R_PPC64_DTPREL16_HIGHERA:
4812 case R_PPC64_DTPREL16_HIGHEST:
4813 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
4814 break;
4815
ad8e1ba5 4816 /* Nor do these. */
25f23106
AM
4817 case R_PPC64_REL16:
4818 case R_PPC64_REL16_LO:
4819 case R_PPC64_REL16_HI:
4820 case R_PPC64_REL16_HA:
4a969973
AM
4821 case R_PPC64_REL16_HIGH:
4822 case R_PPC64_REL16_HIGHA:
4823 case R_PPC64_REL16_HIGHER:
4824 case R_PPC64_REL16_HIGHERA:
4825 case R_PPC64_REL16_HIGHEST:
4826 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
4827 case R_PPC64_REL16_HIGHER34:
4828 case R_PPC64_REL16_HIGHERA34:
4829 case R_PPC64_REL16_HIGHEST34:
4830 case R_PPC64_REL16_HIGHESTA34:
a680de9a 4831 case R_PPC64_REL16DX_HA:
25f23106
AM
4832 break;
4833
45965137
AM
4834 /* Not supported as a dynamic relocation. */
4835 case R_PPC64_ADDR64_LOCAL:
0e1862bb 4836 if (bfd_link_pic (info))
45965137
AM
4837 {
4838 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
4839 ppc_howto_init ();
695344c0 4840 /* xgettext:c-format */
174d0a74 4841 info->callbacks->einfo (_("%H: %s reloc unsupported "
cf97bcb0 4842 "in shared libraries and PIEs\n"),
45965137
AM
4843 abfd, sec, rel->r_offset,
4844 ppc64_elf_howto_table[r_type]->name);
4845 bfd_set_error (bfd_error_bad_value);
4846 return FALSE;
4847 }
4848 break;
4849
ad8e1ba5 4850 case R_PPC64_TOC16:
33c0ec9d
AM
4851 case R_PPC64_TOC16_DS:
4852 htab->do_multi_toc = 1;
d77c8a4b 4853 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
1a0670f3 4854 /* Fall through. */
ad8e1ba5
AM
4855 case R_PPC64_TOC16_LO:
4856 case R_PPC64_TOC16_HI:
4857 case R_PPC64_TOC16_HA:
ad8e1ba5 4858 case R_PPC64_TOC16_LO_DS:
4c52953f 4859 sec->has_toc_reloc = 1;
ec73ddcd 4860 if (h != NULL && bfd_link_executable (info))
1bdd8fac
AM
4861 {
4862 /* We may need a copy reloc. */
4863 h->non_got_ref = 1;
4864 /* Strongly prefer a copy reloc over a dynamic reloc.
4865 glibc ld.so as of 2019-08 will error out if one of
4866 these relocations is emitted. */
4867 h->needs_copy = 1;
4868 goto dodyn;
4869 }
ad8e1ba5
AM
4870 break;
4871
006589cf
AM
4872 /* Marker reloc. */
4873 case R_PPC64_ENTRY:
4874 break;
4875
5bd4f169
AM
4876 /* This relocation describes the C++ object vtable hierarchy.
4877 Reconstruct it for later use during GC. */
4878 case R_PPC64_GNU_VTINHERIT:
c152c796 4879 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 4880 return FALSE;
5bd4f169
AM
4881 break;
4882
4883 /* This relocation describes which C++ vtable entries are actually
4884 used. Record for later use during GC. */
4885 case R_PPC64_GNU_VTENTRY:
a0ea3a14 4886 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 4887 return FALSE;
5bd4f169
AM
4888 break;
4889
721956f4
AM
4890 case R_PPC64_REL14:
4891 case R_PPC64_REL14_BRTAKEN:
4892 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
4893 {
4894 asection *dest = NULL;
4895
4896 /* Heuristic: If jumping outside our section, chances are
4897 we are going to need a stub. */
4898 if (h != NULL)
4899 {
4900 /* If the sym is weak it may be overridden later, so
4901 don't assume we know where a weak sym lives. */
4902 if (h->root.type == bfd_link_hash_defined)
4903 dest = h->root.u.def.section;
4904 }
4905 else
87d72d41
AM
4906 {
4907 Elf_Internal_Sym *isym;
4908
4909 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4910 abfd, r_symndx);
4911 if (isym == NULL)
4912 return FALSE;
4913
4914 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
4915 }
4916
220c76dd 4917 if (dest != sec)
7c8fe5c4 4918 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 4919 }
3e04d765
AM
4920 goto rel24;
4921
4922 case R_PPC64_PLTCALL:
5663e321 4923 case R_PPC64_PLTCALL_NOTOC:
3e04d765 4924 ppc64_elf_section_data (sec)->has_pltcall = 1;
721956f4
AM
4925 /* Fall through. */
4926
5d1634d7 4927 case R_PPC64_REL24:
05d0e962 4928 case R_PPC64_REL24_NOTOC:
3e04d765 4929 rel24:
cbf95972
AM
4930 plt_list = ifunc;
4931 if (h != NULL)
5d1634d7 4932 {
e054468f
AM
4933 h->needs_plt = 1;
4934 if (h->root.root.string[0] == '.'
4935 && h->root.root.string[1] != '\0')
ed7007c1 4936 ppc_elf_hash_entry (h)->is_func = 1;
cbf95972 4937
3a71aa26 4938 if (h == tga || h == dottga)
cbf95972
AM
4939 {
4940 sec->has_tls_reloc = 1;
4941 if (rel != relocs
4942 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
4943 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
4944 /* We have a new-style __tls_get_addr call with
4945 a marker reloc. */
4946 ;
4947 else
4948 /* Mark this section as having an old-style call. */
9737e8af 4949 sec->nomark_tls_get_addr = 1;
cbf95972
AM
4950 }
4951 plt_list = &h->plt.plist;
411e1bfb 4952 }
cbf95972
AM
4953
4954 /* We may need a .plt entry if the function this reloc
4955 refers to is in a shared lib. */
4956 if (plt_list
133a1f60 4957 && !update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4958 return FALSE;
411e1bfb
AM
4959 break;
4960
cbf95972
AM
4961 case R_PPC64_ADDR14:
4962 case R_PPC64_ADDR14_BRNTAKEN:
4963 case R_PPC64_ADDR14_BRTAKEN:
4964 case R_PPC64_ADDR24:
4965 goto dodyn;
4966
411e1bfb
AM
4967 case R_PPC64_TPREL64:
4968 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
7c8bbca5 4969 if (bfd_link_dll (info))
411e1bfb
AM
4970 info->flags |= DF_STATIC_TLS;
4971 goto dotlstoc;
4972
4973 case R_PPC64_DTPMOD64:
4974 if (rel + 1 < rel_end
4975 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4976 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 4977 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 4978 else
951fd09b 4979 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
4980 goto dotlstoc;
4981
4982 case R_PPC64_DTPREL64:
4983 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4984 if (rel != relocs
4985 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4986 && rel[-1].r_offset == rel->r_offset - 8)
4987 /* This is the second reloc of a dtpmod, dtprel pair.
4988 Don't mark with TLS_DTPREL. */
4989 goto dodyn;
4990
4991 dotlstoc:
4992 sec->has_tls_reloc = 1;
4993 if (h != NULL)
ed7007c1 4994 ppc_elf_hash_entry (h)->tls_mask |= tls_type & 0xff;
411e1bfb
AM
4995 else
4996 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4997 rel->r_addend, tls_type))
411e1bfb
AM
4998 return FALSE;
4999
7c8fe5c4
AM
5000 ppc64_sec = ppc64_elf_section_data (sec);
5001 if (ppc64_sec->sec_type != sec_toc)
411e1bfb 5002 {
3a71aa26
AM
5003 bfd_size_type amt;
5004
e7b938ca 5005 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5006 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5007 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5008 if (ppc64_sec->u.toc.symndx == NULL)
5009 return FALSE;
5010 amt = sec->size * sizeof (bfd_vma) / 8;
5011 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5012 if (ppc64_sec->u.toc.add == NULL)
411e1bfb 5013 return FALSE;
7c8fe5c4
AM
5014 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5015 ppc64_sec->sec_type = sec_toc;
411e1bfb
AM
5016 }
5017 BFD_ASSERT (rel->r_offset % 8 == 0);
3a71aa26 5018 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
133a1f60 5019 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5020
5021 /* Mark the second slot of a GD or LD entry.
5022 -1 to indicate GD and -2 to indicate LD. */
5023 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5024 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5025 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5026 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5027 goto dodyn;
5028
5029 case R_PPC64_TPREL16:
5030 case R_PPC64_TPREL16_LO:
5031 case R_PPC64_TPREL16_HI:
5032 case R_PPC64_TPREL16_HA:
5033 case R_PPC64_TPREL16_DS:
5034 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
5035 case R_PPC64_TPREL16_HIGH:
5036 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5037 case R_PPC64_TPREL16_HIGHER:
5038 case R_PPC64_TPREL16_HIGHERA:
5039 case R_PPC64_TPREL16_HIGHEST:
5040 case R_PPC64_TPREL16_HIGHESTA:
c213164a 5041 case R_PPC64_TPREL34:
7c8bbca5
AM
5042 if (bfd_link_dll (info))
5043 info->flags |= DF_STATIC_TLS;
5044 goto dodyn;
5d1634d7 5045
e86ce104 5046 case R_PPC64_ADDR64:
b9399fcf 5047 if (is_opd
1e2f5b6e 5048 && rel + 1 < rel_end
4ce794b7 5049 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 5050 {
8387904d 5051 if (h != NULL)
ed7007c1 5052 ppc_elf_hash_entry (h)->is_func = 1;
1e2f5b6e 5053 }
e86ce104
AM
5054 /* Fall through. */
5055
65f38f15
AM
5056 case R_PPC64_ADDR16:
5057 case R_PPC64_ADDR16_DS:
5058 case R_PPC64_ADDR16_HA:
5059 case R_PPC64_ADDR16_HI:
f9c6b907
AM
5060 case R_PPC64_ADDR16_HIGH:
5061 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
5062 case R_PPC64_ADDR16_HIGHER:
5063 case R_PPC64_ADDR16_HIGHERA:
5064 case R_PPC64_ADDR16_HIGHEST:
5065 case R_PPC64_ADDR16_HIGHESTA:
5066 case R_PPC64_ADDR16_LO:
5067 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
5068 case R_PPC64_D34:
5069 case R_PPC64_D34_LO:
5070 case R_PPC64_D34_HI30:
5071 case R_PPC64_D34_HA30:
5072 case R_PPC64_ADDR16_HIGHER34:
5073 case R_PPC64_ADDR16_HIGHERA34:
5074 case R_PPC64_ADDR16_HIGHEST34:
5075 case R_PPC64_ADDR16_HIGHESTA34:
5076 case R_PPC64_D28:
0e1862bb 5077 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
a345bc8d
AM
5078 && rel->r_addend == 0)
5079 {
5080 /* We may need a .plt entry if this reloc refers to a
5081 function in a shared lib. */
5663e321 5082 if (!update_plt_info (abfd, &h->plt.plist, 0))
a345bc8d
AM
5083 return FALSE;
5084 h->pointer_equality_needed = 1;
5085 }
5086 /* Fall through. */
5087
5088 case R_PPC64_REL30:
5089 case R_PPC64_REL32:
5090 case R_PPC64_REL64:
65f38f15 5091 case R_PPC64_ADDR32:
65f38f15
AM
5092 case R_PPC64_UADDR16:
5093 case R_PPC64_UADDR32:
5094 case R_PPC64_UADDR64:
5bd4f169 5095 case R_PPC64_TOC:
ec73ddcd 5096 if (h != NULL && bfd_link_executable (info))
81848ca0 5097 /* We may need a copy reloc. */
f5385ebf 5098 h->non_got_ref = 1;
81848ca0 5099
41bd81ab 5100 /* Don't propagate .opd relocs. */
b9399fcf 5101 if (NO_OPD_RELOCS && is_opd)
e86ce104 5102 break;
e86ce104 5103
65f38f15
AM
5104 /* If we are creating a shared library, and this is a reloc
5105 against a global symbol, or a non PC relative reloc
5106 against a local symbol, then we need to copy the reloc
5107 into the shared library. However, if we are linking with
5108 -Bsymbolic, we do not need to copy a reloc against a
5109 global symbol which is defined in an object we are
5110 including in the link (i.e., DEF_REGULAR is set). At
5111 this point we have not seen all the input files, so it is
5112 possible that DEF_REGULAR is not set now but will be set
5113 later (it is never cleared). In case of a weak definition,
5114 DEF_REGULAR may be cleared later by a strong definition in
5115 a shared library. We account for that possibility below by
f4656909 5116 storing information in the dyn_relocs field of the hash
65f38f15
AM
5117 table entry. A similar situation occurs when creating
5118 shared libraries and symbol visibility changes render the
5119 symbol local.
5120
5121 If on the other hand, we are creating an executable, we
5122 may need to keep relocations for symbols satisfied by a
5123 dynamic library if we manage to avoid copy relocs for the
5124 symbol. */
411e1bfb 5125 dodyn:
ec73ddcd
AM
5126 if ((h != NULL
5127 && (h->root.type == bfd_link_hash_defweak
5128 || !h->def_regular))
5129 || (h != NULL
5130 && !bfd_link_executable (info)
5131 && !SYMBOLIC_BIND (info, h))
5132 || (bfd_link_pic (info)
5133 && must_be_dyn_reloc (info, r_type))
0e1862bb 5134 || (!bfd_link_pic (info)
25f23106 5135 && ifunc != NULL))
5bd4f169 5136 {
65f38f15
AM
5137 /* We must copy these reloc types into the output file.
5138 Create a reloc section in dynobj and make room for
5139 this reloc. */
5bd4f169
AM
5140 if (sreloc == NULL)
5141 {
83bac4b0
NC
5142 sreloc = _bfd_elf_make_dynamic_reloc_section
5143 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
65f38f15 5144
5bd4f169 5145 if (sreloc == NULL)
83bac4b0 5146 return FALSE;
5bd4f169
AM
5147 }
5148
65f38f15
AM
5149 /* If this is a global symbol, we count the number of
5150 relocations we need for this symbol. */
5151 if (h != NULL)
5152 {
19e08130
AM
5153 struct elf_dyn_relocs *p;
5154 struct elf_dyn_relocs **head;
5155
ed7007c1 5156 head = &ppc_elf_hash_entry (h)->dyn_relocs;
19e08130
AM
5157 p = *head;
5158 if (p == NULL || p->sec != sec)
5159 {
5160 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5161 if (p == NULL)
5162 return FALSE;
5163 p->next = *head;
5164 *head = p;
5165 p->sec = sec;
5166 p->count = 0;
5167 p->pc_count = 0;
5168 }
5169 p->count += 1;
5170 if (!must_be_dyn_reloc (info, r_type))
5171 p->pc_count += 1;
65f38f15
AM
5172 }
5173 else
5174 {
ec338859
AM
5175 /* Track dynamic relocs needed for local syms too.
5176 We really need local syms available to do this
5177 easily. Oh well. */
19e08130
AM
5178 struct ppc_dyn_relocs *p;
5179 struct ppc_dyn_relocs **head;
5180 bfd_boolean is_ifunc;
ec338859 5181 asection *s;
6edfbbad 5182 void *vpp;
87d72d41 5183 Elf_Internal_Sym *isym;
6edfbbad 5184
87d72d41
AM
5185 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5186 abfd, r_symndx);
5187 if (isym == NULL)
b34976b6 5188 return FALSE;
ec338859 5189
87d72d41
AM
5190 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5191 if (s == NULL)
5192 s = sec;
5193
6edfbbad 5194 vpp = &elf_section_data (s)->local_dynrel;
19e08130
AM
5195 head = (struct ppc_dyn_relocs **) vpp;
5196 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5197 p = *head;
5198 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5199 p = p->next;
5200 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5201 {
5202 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5203 if (p == NULL)
5204 return FALSE;
5205 p->next = *head;
5206 *head = p;
5207 p->sec = sec;
5208 p->ifunc = is_ifunc;
5209 p->count = 0;
5210 }
5211 p->count += 1;
ec338859 5212 }
65f38f15 5213 }
5bd4f169 5214 break;
65f38f15
AM
5215
5216 default:
96e0dda4 5217 break;
5bd4f169
AM
5218 }
5219 }
5220
b34976b6 5221 return TRUE;
5bd4f169
AM
5222}
5223
ee67d69a
AM
5224/* Merge backend specific data from an object file to the output
5225 object file when linking. */
5226
5227static bfd_boolean
50e03d47 5228ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
ee67d69a 5229{
50e03d47 5230 bfd *obfd = info->output_bfd;
ee67d69a
AM
5231 unsigned long iflags, oflags;
5232
5233 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5234 return TRUE;
5235
5236 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5237 return TRUE;
5238
50e03d47 5239 if (!_bfd_generic_verify_endian_match (ibfd, info))
ee67d69a
AM
5240 return FALSE;
5241
5242 iflags = elf_elfheader (ibfd)->e_flags;
5243 oflags = elf_elfheader (obfd)->e_flags;
5244
f6c7c3e8 5245 if (iflags & ~EF_PPC64_ABI)
ee67d69a 5246 {
4eca0228 5247 _bfd_error_handler
695344c0 5248 /* xgettext:c-format */
871b3ab2 5249 (_("%pB uses unknown e_flags 0x%lx"), ibfd, iflags);
ee67d69a
AM
5250 bfd_set_error (bfd_error_bad_value);
5251 return FALSE;
5252 }
f6c7c3e8 5253 else if (iflags != oflags && iflags != 0)
ee67d69a 5254 {
4eca0228 5255 _bfd_error_handler
695344c0 5256 /* xgettext:c-format */
871b3ab2 5257 (_("%pB: ABI version %ld is not compatible with ABI version %ld output"),
ee67d69a
AM
5258 ibfd, iflags, oflags);
5259 bfd_set_error (bfd_error_bad_value);
5260 return FALSE;
5261 }
5262
4a91d0ba
AM
5263 if (!_bfd_elf_ppc_merge_fp_attributes (ibfd, info))
5264 return FALSE;
005d79fd 5265
ee67d69a 5266 /* Merge Tag_compatibility attributes and any common GNU ones. */
8d2c8c3d 5267 return _bfd_elf_merge_object_attributes (ibfd, info);
ee67d69a
AM
5268}
5269
5270static bfd_boolean
5271ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5272{
5273 /* Print normal ELF private data. */
5274 _bfd_elf_print_private_bfd_data (abfd, ptr);
5275
5276 if (elf_elfheader (abfd)->e_flags != 0)
5277 {
5278 FILE *file = ptr;
5279
ee67d69a
AM
5280 fprintf (file, _("private flags = 0x%lx:"),
5281 elf_elfheader (abfd)->e_flags);
5282
5283 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5284 fprintf (file, _(" [abiv%ld]"),
5285 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5286 fputc ('\n', file);
5287 }
5288
5289 return TRUE;
5290}
5291
8387904d 5292/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
b53dfeb2
AM
5293 of the code entry point, and its section, which must be in the same
5294 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
8387904d
AM
5295
5296static bfd_vma
5297opd_entry_value (asection *opd_sec,
5298 bfd_vma offset,
5299 asection **code_sec,
aef36ac1
AM
5300 bfd_vma *code_off,
5301 bfd_boolean in_code_sec)
8387904d
AM
5302{
5303 bfd *opd_bfd = opd_sec->owner;
8860955f 5304 Elf_Internal_Rela *relocs;
8387904d 5305 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 5306 bfd_vma val;
8387904d 5307
9f296da3
AM
5308 /* No relocs implies we are linking a --just-symbols object, or looking
5309 at a final linked executable with addr2line or somesuch. */
4b85d634
AM
5310 if (opd_sec->reloc_count == 0)
5311 {
729eabd5 5312 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
3b36f7e6 5313
729eabd5
AM
5314 if (contents == NULL)
5315 {
5316 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5317 return (bfd_vma) -1;
5318 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5319 }
ee1e4ede 5320
dbb3fbbb 5321 /* PR 17512: file: 64b9dfbb. */
451dfd38 5322 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
dbb3fbbb
NC
5323 return (bfd_vma) -1;
5324
729eabd5 5325 val = bfd_get_64 (opd_bfd, contents + offset);
aef36ac1
AM
5326 if (code_sec != NULL)
5327 {
5328 asection *sec, *likely = NULL;
ee1e4ede 5329
aef36ac1 5330 if (in_code_sec)
4b85d634 5331 {
aef36ac1
AM
5332 sec = *code_sec;
5333 if (sec->vma <= val
5334 && val < sec->vma + sec->size)
5335 likely = sec;
5336 else
5337 val = -1;
5338 }
5339 else
5340 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5341 if (sec->vma <= val
5342 && (sec->flags & SEC_LOAD) != 0
5343 && (sec->flags & SEC_ALLOC) != 0)
5344 likely = sec;
5345 if (likely != NULL)
5346 {
5347 *code_sec = likely;
5348 if (code_off != NULL)
5349 *code_off = val - likely->vma;
4b85d634
AM
5350 }
5351 }
aef36ac1 5352 return val;
4b85d634
AM
5353 }
5354
0c8d6e5c 5355 BFD_ASSERT (is_ppc64_elf (opd_bfd));
0ffa91dd 5356
729eabd5 5357 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
8860955f
AM
5358 if (relocs == NULL)
5359 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
877a8638
NC
5360 /* PR 17512: file: df8e1fd6. */
5361 if (relocs == NULL)
5362 return (bfd_vma) -1;
645ea6a9 5363
8387904d 5364 /* Go find the opd reloc at the sym address. */
8860955f 5365 lo = relocs;
8387904d 5366 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 5367 val = (bfd_vma) -1;
8387904d
AM
5368 while (lo < hi)
5369 {
5370 look = lo + (hi - lo) / 2;
5371 if (look->r_offset < offset)
5372 lo = look + 1;
5373 else if (look->r_offset > offset)
5374 hi = look;
5375 else
5376 {
0ffa91dd
NC
5377 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5378
8387904d
AM
5379 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5380 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5381 {
5382 unsigned long symndx = ELF64_R_SYM (look->r_info);
b53dfeb2 5383 asection *sec = NULL;
8387904d 5384
b53dfeb2
AM
5385 if (symndx >= symtab_hdr->sh_info
5386 && elf_sym_hashes (opd_bfd) != NULL)
8387904d
AM
5387 {
5388 struct elf_link_hash_entry **sym_hashes;
5389 struct elf_link_hash_entry *rh;
5390
5391 sym_hashes = elf_sym_hashes (opd_bfd);
5392 rh = sym_hashes[symndx - symtab_hdr->sh_info];
128205bb
AM
5393 if (rh != NULL)
5394 {
5395 rh = elf_follow_link (rh);
bb854a36
AM
5396 if (rh->root.type != bfd_link_hash_defined
5397 && rh->root.type != bfd_link_hash_defweak)
5398 break;
5399 if (rh->root.u.def.section->owner == opd_bfd)
b53dfeb2 5400 {
bb854a36
AM
5401 val = rh->root.u.def.value;
5402 sec = rh->root.u.def.section;
b53dfeb2
AM
5403 }
5404 }
5405 }
5406
5407 if (sec == NULL)
5408 {
5409 Elf_Internal_Sym *sym;
5410
5411 if (symndx < symtab_hdr->sh_info)
5412 {
5413 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5414 if (sym == NULL)
5415 {
5416 size_t symcnt = symtab_hdr->sh_info;
5417 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5418 symcnt, 0,
5419 NULL, NULL, NULL);
5420 if (sym == NULL)
5421 break;
5422 symtab_hdr->contents = (bfd_byte *) sym;
5423 }
5424 sym += symndx;
128205bb
AM
5425 }
5426 else
5427 {
b53dfeb2
AM
5428 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5429 1, symndx,
5430 NULL, NULL, NULL);
128205bb
AM
5431 if (sym == NULL)
5432 break;
128205bb 5433 }
b53dfeb2
AM
5434 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5435 if (sec == NULL)
5436 break;
5437 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5438 val = sym->st_value;
8387904d 5439 }
b53dfeb2 5440
8387904d
AM
5441 val += look->r_addend;
5442 if (code_off != NULL)
5443 *code_off = val;
5444 if (code_sec != NULL)
aef36ac1
AM
5445 {
5446 if (in_code_sec && *code_sec != sec)
5447 return -1;
5448 else
5449 *code_sec = sec;
5450 }
b53dfeb2 5451 if (sec->output_section != NULL)
8387904d 5452 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
5453 }
5454 break;
5455 }
5456 }
645ea6a9 5457
645ea6a9 5458 return val;
8387904d
AM
5459}
5460
aef36ac1
AM
5461/* If the ELF symbol SYM might be a function in SEC, return the
5462 function size and set *CODE_OFF to the function's entry point,
5463 otherwise return zero. */
9f296da3 5464
aef36ac1
AM
5465static bfd_size_type
5466ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
5467 bfd_vma *code_off)
9f296da3 5468{
aef36ac1
AM
5469 bfd_size_type size;
5470
5471 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
5472 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
5473 return 0;
5474
5475 size = 0;
5476 if (!(sym->flags & BSF_SYNTHETIC))
5477 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
5478
5479 if (strcmp (sym->section->name, ".opd") == 0)
9f296da3 5480 {
b07bca4e
AM
5481 struct _opd_sec_data *opd = get_opd_info (sym->section);
5482 bfd_vma symval = sym->value;
5483
5484 if (opd != NULL
5485 && opd->adjust != NULL
5486 && elf_section_data (sym->section)->relocs != NULL)
5487 {
5488 /* opd_entry_value will use cached relocs that have been
5489 adjusted, but with raw symbols. That means both local
5490 and global symbols need adjusting. */
5491 long adjust = opd->adjust[OPD_NDX (symval)];
5492 if (adjust == -1)
5493 return 0;
5494 symval += adjust;
5495 }
5496
5497 if (opd_entry_value (sym->section, symval,
aef36ac1
AM
5498 &sec, code_off, TRUE) == (bfd_vma) -1)
5499 return 0;
5500 /* An old ABI binary with dot-syms has a size of 24 on the .opd
5501 symbol. This size has nothing to do with the code size of the
5502 function, which is what we're supposed to return, but the
5503 code size isn't available without looking up the dot-sym.
5504 However, doing that would be a waste of time particularly
5505 since elf_find_function will look at the dot-sym anyway.
5506 Now, elf_find_function will keep the largest size of any
5507 function sym found at the code address of interest, so return
5508 1 here to avoid it incorrectly caching a larger function size
5509 for a small function. This does mean we return the wrong
5510 size for a new-ABI function of size 24, but all that does is
5511 disable caching for such functions. */
5512 if (size == 24)
5513 size = 1;
9f296da3 5514 }
aef36ac1
AM
5515 else
5516 {
5517 if (sym->section != sec)
5518 return 0;
5519 *code_off = sym->value;
5520 }
5521 if (size == 0)
5522 size = 1;
5523 return size;
9f296da3
AM
5524}
5525
f378ab09
AM
5526/* Return true if symbol is a strong function defined in an ELFv2
5527 object with st_other localentry bits of zero, ie. its local entry
5528 point coincides with its global entry point. */
5529
5530static bfd_boolean
5531is_elfv2_localentry0 (struct elf_link_hash_entry *h)
5532{
5533 return (h != NULL
5534 && h->type == STT_FUNC
5535 && h->root.type == bfd_link_hash_defined
5536 && (STO_PPC64_LOCAL_MASK & h->other) == 0
ed7007c1 5537 && !ppc_elf_hash_entry (h)->non_zero_localentry
f378ab09
AM
5538 && is_ppc64_elf (h->root.u.def.section->owner)
5539 && abiversion (h->root.u.def.section->owner) >= 2);
5540}
5541
854b41e7
AM
5542/* Return true if symbol is defined in a regular object file. */
5543
5544static bfd_boolean
5545is_static_defined (struct elf_link_hash_entry *h)
5546{
5547 return ((h->root.type == bfd_link_hash_defined
5548 || h->root.type == bfd_link_hash_defweak)
5549 && h->root.u.def.section != NULL
5550 && h->root.u.def.section->output_section != NULL);
5551}
5552
b31867b6
AM
5553/* If FDH is a function descriptor symbol, return the associated code
5554 entry symbol if it is defined. Return NULL otherwise. */
5555
5556static struct ppc_link_hash_entry *
5557defined_code_entry (struct ppc_link_hash_entry *fdh)
5558{
5559 if (fdh->is_func_descriptor)
5560 {
5561 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
5562 if (fh->elf.root.type == bfd_link_hash_defined
5563 || fh->elf.root.type == bfd_link_hash_defweak)
5564 return fh;
5565 }
5566 return NULL;
5567}
5568
5569/* If FH is a function code entry symbol, return the associated
5570 function descriptor symbol if it is defined. Return NULL otherwise. */
5571
5572static struct ppc_link_hash_entry *
5573defined_func_desc (struct ppc_link_hash_entry *fh)
5574{
5575 if (fh->oh != NULL
5576 && fh->oh->is_func_descriptor)
5577 {
5578 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
5579 if (fdh->elf.root.type == bfd_link_hash_defined
5580 || fdh->elf.root.type == bfd_link_hash_defweak)
5581 return fdh;
5582 }
5583 return NULL;
5584}
5585
ed7007c1
AM
5586/* Given H is a symbol that satisfies is_static_defined, return the
5587 value in the output file. */
5588
5589static bfd_vma
5590defined_sym_val (struct elf_link_hash_entry *h)
5591{
5592 return (h->root.u.def.section->output_section->vma
5593 + h->root.u.def.section->output_offset
5594 + h->root.u.def.value);
5595}
5596
5597/* Return true if H matches __tls_get_addr or one of its variants. */
5598
5599static bfd_boolean
5600is_tls_get_addr (struct elf_link_hash_entry *h,
5601 struct ppc_link_hash_table *htab)
5602{
5603 return (h == &htab->tls_get_addr_fd->elf
5604 || h == &htab->tls_get_addr->elf);
5605}
5606
8c5b4e52
AM
5607static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
5608
5609/* Garbage collect sections, after first dealing with dot-symbols. */
5610
5611static bfd_boolean
5612ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
5613{
5614 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5615
5616 if (htab != NULL && htab->need_func_desc_adj)
5617 {
5618 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5619 htab->need_func_desc_adj = 0;
5620 }
5621 return bfd_elf_gc_sections (abfd, info);
5622}
5623
74f0fb50
AM
5624/* Mark all our entry sym sections, both opd and code section. */
5625
5626static void
5627ppc64_elf_gc_keep (struct bfd_link_info *info)
5628{
5629 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5630 struct bfd_sym_chain *sym;
5631
4dfe6ac6
NC
5632 if (htab == NULL)
5633 return;
5634
74f0fb50
AM
5635 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5636 {
b31867b6 5637 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
5638 asection *sec;
5639
ed7007c1
AM
5640 eh = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, sym->name,
5641 FALSE, FALSE, TRUE));
74f0fb50
AM
5642 if (eh == NULL)
5643 continue;
5644 if (eh->elf.root.type != bfd_link_hash_defined
5645 && eh->elf.root.type != bfd_link_hash_defweak)
5646 continue;
5647
b31867b6
AM
5648 fh = defined_code_entry (eh);
5649 if (fh != NULL)
74f0fb50 5650 {
b31867b6 5651 sec = fh->elf.root.u.def.section;
74f0fb50
AM
5652 sec->flags |= SEC_KEEP;
5653 }
5654 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5655 && opd_entry_value (eh->elf.root.u.def.section,
5656 eh->elf.root.u.def.value,
aef36ac1 5657 &sec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50
AM
5658 sec->flags |= SEC_KEEP;
5659
5660 sec = eh->elf.root.u.def.section;
5661 sec->flags |= SEC_KEEP;
5662 }
5663}
5664
64d03ab5
AM
5665/* Mark sections containing dynamically referenced symbols. When
5666 building shared libraries, we must assume that any visible symbol is
5667 referenced. */
5668
5669static bfd_boolean
5670ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5671{
5672 struct bfd_link_info *info = (struct bfd_link_info *) inf;
ed7007c1 5673 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
b31867b6 5674 struct ppc_link_hash_entry *fdh;
b407645f 5675 struct bfd_elf_dynamic_list *d = info->dynamic_list;
64d03ab5 5676
64d03ab5 5677 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
5678 fdh = defined_func_desc (eh);
5679 if (fdh != NULL)
5680 eh = fdh;
64d03ab5
AM
5681
5682 if ((eh->elf.root.type == bfd_link_hash_defined
5683 || eh->elf.root.type == bfd_link_hash_defweak)
87e79a65 5684 && ((eh->elf.ref_dynamic && !eh->elf.forced_local)
1c9177d9 5685 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
64d03ab5 5686 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8 5687 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
0e1862bb 5688 && (!bfd_link_executable (info)
e278ae05 5689 || info->gc_keep_exported
b407645f
AM
5690 || info->export_dynamic
5691 || (eh->elf.dynamic
5692 && d != NULL
2cdcc330
AM
5693 && (*d->match) (&d->head, NULL,
5694 eh->elf.root.root.string)))
e278ae05 5695 && (eh->elf.versioned >= versioned
4c58e0d8
AM
5696 || !bfd_hide_sym_by_version (info->version_info,
5697 eh->elf.root.root.string)))))
64d03ab5
AM
5698 {
5699 asection *code_sec;
b31867b6 5700 struct ppc_link_hash_entry *fh;
64d03ab5
AM
5701
5702 eh->elf.root.u.def.section->flags |= SEC_KEEP;
5703
5704 /* Function descriptor syms cause the associated
5705 function code sym section to be marked. */
b31867b6
AM
5706 fh = defined_code_entry (eh);
5707 if (fh != NULL)
5708 {
5709 code_sec = fh->elf.root.u.def.section;
5710 code_sec->flags |= SEC_KEEP;
5711 }
64d03ab5
AM
5712 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5713 && opd_entry_value (eh->elf.root.u.def.section,
5714 eh->elf.root.u.def.value,
aef36ac1 5715 &code_sec, NULL, FALSE) != (bfd_vma) -1)
64d03ab5
AM
5716 code_sec->flags |= SEC_KEEP;
5717 }
5718
5719 return TRUE;
5720}
5721
5bd4f169
AM
5722/* Return the section that should be marked against GC for a given
5723 relocation. */
5724
5725static asection *
4ce794b7 5726ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 5727 struct bfd_link_info *info,
4ce794b7
AM
5728 Elf_Internal_Rela *rel,
5729 struct elf_link_hash_entry *h,
5730 Elf_Internal_Sym *sym)
5bd4f169 5731{
ccfa59ea
AM
5732 asection *rsec;
5733
ccfa59ea
AM
5734 /* Syms return NULL if we're marking .opd, so we avoid marking all
5735 function sections, as all functions are referenced in .opd. */
5736 rsec = NULL;
5737 if (get_opd_info (sec) != NULL)
5738 return rsec;
1e2f5b6e 5739
5bd4f169
AM
5740 if (h != NULL)
5741 {
04c9666a 5742 enum elf_ppc64_reloc_type r_type;
b31867b6 5743 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 5744
4ce794b7 5745 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 5746 switch (r_type)
5bd4f169
AM
5747 {
5748 case R_PPC64_GNU_VTINHERIT:
5749 case R_PPC64_GNU_VTENTRY:
5750 break;
5751
5752 default:
5753 switch (h->root.type)
5754 {
5755 case bfd_link_hash_defined:
5756 case bfd_link_hash_defweak:
ed7007c1 5757 eh = ppc_elf_hash_entry (h);
b31867b6
AM
5758 fdh = defined_func_desc (eh);
5759 if (fdh != NULL)
8c5b4e52
AM
5760 {
5761 /* -mcall-aixdesc code references the dot-symbol on
5762 a call reloc. Mark the function descriptor too
5763 against garbage collection. */
5764 fdh->elf.mark = 1;
60d67dc8
AM
5765 if (fdh->elf.is_weakalias)
5766 weakdef (&fdh->elf)->mark = 1;
8c5b4e52
AM
5767 eh = fdh;
5768 }
1e2f5b6e
AM
5769
5770 /* Function descriptor syms cause the associated
5771 function code sym section to be marked. */
b31867b6
AM
5772 fh = defined_code_entry (eh);
5773 if (fh != NULL)
ccfa59ea
AM
5774 {
5775 /* They also mark their opd section. */
74f0fb50 5776 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5777
b31867b6 5778 rsec = fh->elf.root.u.def.section;
ccfa59ea 5779 }
8387904d
AM
5780 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5781 && opd_entry_value (eh->elf.root.u.def.section,
5782 eh->elf.root.u.def.value,
aef36ac1 5783 &rsec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50 5784 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5785 else
1e2f5b6e
AM
5786 rsec = h->root.u.def.section;
5787 break;
5bd4f169
AM
5788
5789 case bfd_link_hash_common:
1e2f5b6e
AM
5790 rsec = h->root.u.c.p->section;
5791 break;
5bd4f169
AM
5792
5793 default:
fb34365b 5794 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
5795 }
5796 }
5797 }
5798 else
5799 {
74f0fb50 5800 struct _opd_sec_data *opd;
1e2f5b6e
AM
5801
5802 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
5803 opd = get_opd_info (rsec);
5804 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 5805 {
74f0fb50 5806 rsec->gc_mark = 1;
ccfa59ea 5807
51aecdc5 5808 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
ccfa59ea 5809 }
5bd4f169
AM
5810 }
5811
1e2f5b6e 5812 return rsec;
5bd4f169
AM
5813}
5814
deb0e272
AM
5815/* The maximum size of .sfpr. */
5816#define SFPR_MAX (218*4)
5817
5818struct sfpr_def_parms
5819{
699733f6
AM
5820 const char name[12];
5821 unsigned char lo, hi;
2cdcc330
AM
5822 bfd_byte *(*write_ent) (bfd *, bfd_byte *, int);
5823 bfd_byte *(*write_tail) (bfd *, bfd_byte *, int);
deb0e272
AM
5824};
5825
a4b6fadd
AM
5826/* Auto-generate _save*, _rest* functions in .sfpr.
5827 If STUB_SEC is non-null, define alias symbols in STUB_SEC
5828 instead. */
deb0e272 5829
4dfe6ac6 5830static bfd_boolean
a4b6fadd
AM
5831sfpr_define (struct bfd_link_info *info,
5832 const struct sfpr_def_parms *parm,
5833 asection *stub_sec)
deb0e272
AM
5834{
5835 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5836 unsigned int i;
5837 size_t len = strlen (parm->name);
5838 bfd_boolean writing = FALSE;
699733f6 5839 char sym[16];
deb0e272 5840
4dfe6ac6
NC
5841 if (htab == NULL)
5842 return FALSE;
5843
deb0e272
AM
5844 memcpy (sym, parm->name, len);
5845 sym[len + 2] = 0;
5846
5847 for (i = parm->lo; i <= parm->hi; i++)
5848 {
a4b6fadd 5849 struct ppc_link_hash_entry *h;
deb0e272
AM
5850
5851 sym[len + 0] = i / 10 + '0';
5852 sym[len + 1] = i % 10 + '0';
ed7007c1
AM
5853 h = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, sym,
5854 writing, TRUE, TRUE));
a4b6fadd 5855 if (stub_sec != NULL)
deb0e272 5856 {
a4b6fadd
AM
5857 if (h != NULL
5858 && h->elf.root.type == bfd_link_hash_defined
5859 && h->elf.root.u.def.section == htab->sfpr)
5860 {
5861 struct elf_link_hash_entry *s;
5862 char buf[32];
5863 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
5864 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
5865 if (s == NULL)
5866 return FALSE;
779f2ae7 5867 if (s->root.type == bfd_link_hash_new)
a4b6fadd
AM
5868 {
5869 s->root.type = bfd_link_hash_defined;
5870 s->root.u.def.section = stub_sec;
7dda8d3c 5871 s->root.u.def.value = (stub_sec->size - htab->sfpr->size
a4b6fadd
AM
5872 + h->elf.root.u.def.value);
5873 s->ref_regular = 1;
5874 s->def_regular = 1;
5875 s->ref_regular_nonweak = 1;
5876 s->forced_local = 1;
5877 s->non_elf = 0;
5878 s->root.linker_def = 1;
5879 }
5880 }
5881 continue;
5882 }
5883 if (h != NULL)
5884 {
5885 h->save_res = 1;
5886 if (!h->elf.def_regular)
deb0e272 5887 {
a4b6fadd
AM
5888 h->elf.root.type = bfd_link_hash_defined;
5889 h->elf.root.u.def.section = htab->sfpr;
5890 h->elf.root.u.def.value = htab->sfpr->size;
5891 h->elf.type = STT_FUNC;
5892 h->elf.def_regular = 1;
b32547cd 5893 h->elf.non_elf = 0;
a4b6fadd
AM
5894 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
5895 writing = TRUE;
deb0e272 5896 if (htab->sfpr->contents == NULL)
a4b6fadd 5897 {
2cdcc330
AM
5898 htab->sfpr->contents
5899 = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
a4b6fadd
AM
5900 if (htab->sfpr->contents == NULL)
5901 return FALSE;
5902 }
deb0e272
AM
5903 }
5904 }
5905 if (writing)
5906 {
5907 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5908 if (i != parm->hi)
5909 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5910 else
5911 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5912 htab->sfpr->size = p - htab->sfpr->contents;
5913 }
5914 }
5915
5916 return TRUE;
5917}
5918
5919static bfd_byte *
5920savegpr0 (bfd *abfd, bfd_byte *p, int r)
5921{
5922 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5923 return p + 4;
5924}
5925
5926static bfd_byte *
5927savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5928{
5929 p = savegpr0 (abfd, p, r);
a078d95a 5930 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
5931 p = p + 4;
5932 bfd_put_32 (abfd, BLR, p);
5933 return p + 4;
5934}
5935
5936static bfd_byte *
5937restgpr0 (bfd *abfd, bfd_byte *p, int r)
5938{
5939 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5940 return p + 4;
5941}
5942
5943static bfd_byte *
5944restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5945{
a078d95a 5946 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
5947 p = p + 4;
5948 p = restgpr0 (abfd, p, r);
5949 bfd_put_32 (abfd, MTLR_R0, p);
5950 p = p + 4;
5951 if (r == 29)
5952 {
5953 p = restgpr0 (abfd, p, 30);
5954 p = restgpr0 (abfd, p, 31);
5955 }
5956 bfd_put_32 (abfd, BLR, p);
5957 return p + 4;
5958}
5959
5960static bfd_byte *
5961savegpr1 (bfd *abfd, bfd_byte *p, int r)
5962{
5963 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5964 return p + 4;
5965}
5966
5967static bfd_byte *
5968savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5969{
5970 p = savegpr1 (abfd, p, r);
5971 bfd_put_32 (abfd, BLR, p);
5972 return p + 4;
5973}
5974
5975static bfd_byte *
5976restgpr1 (bfd *abfd, bfd_byte *p, int r)
5977{
5978 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5979 return p + 4;
5980}
5981
5982static bfd_byte *
5983restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5984{
5985 p = restgpr1 (abfd, p, r);
5986 bfd_put_32 (abfd, BLR, p);
5987 return p + 4;
5988}
5989
5990static bfd_byte *
5991savefpr (bfd *abfd, bfd_byte *p, int r)
5992{
5993 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5994 return p + 4;
5995}
5996
5997static bfd_byte *
5998savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
5999{
6000 p = savefpr (abfd, p, r);
a078d95a 6001 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6002 p = p + 4;
6003 bfd_put_32 (abfd, BLR, p);
6004 return p + 4;
6005}
6006
6007static bfd_byte *
6008restfpr (bfd *abfd, bfd_byte *p, int r)
6009{
6010 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6011 return p + 4;
6012}
6013
6014static bfd_byte *
6015restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6016{
a078d95a 6017 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6018 p = p + 4;
6019 p = restfpr (abfd, p, r);
6020 bfd_put_32 (abfd, MTLR_R0, p);
6021 p = p + 4;
6022 if (r == 29)
6023 {
6024 p = restfpr (abfd, p, 30);
6025 p = restfpr (abfd, p, 31);
6026 }
6027 bfd_put_32 (abfd, BLR, p);
6028 return p + 4;
6029}
6030
6031static bfd_byte *
6032savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6033{
6034 p = savefpr (abfd, p, r);
6035 bfd_put_32 (abfd, BLR, p);
6036 return p + 4;
6037}
6038
6039static bfd_byte *
6040restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6041{
6042 p = restfpr (abfd, p, r);
6043 bfd_put_32 (abfd, BLR, p);
6044 return p + 4;
6045}
6046
6047static bfd_byte *
6048savevr (bfd *abfd, bfd_byte *p, int r)
6049{
6050 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6051 p = p + 4;
6052 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6053 return p + 4;
6054}
6055
6056static bfd_byte *
6057savevr_tail (bfd *abfd, bfd_byte *p, int r)
6058{
6059 p = savevr (abfd, p, r);
6060 bfd_put_32 (abfd, BLR, p);
6061 return p + 4;
6062}
6063
6064static bfd_byte *
6065restvr (bfd *abfd, bfd_byte *p, int r)
6066{
6067 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6068 p = p + 4;
6069 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6070 return p + 4;
6071}
6072
6073static bfd_byte *
6074restvr_tail (bfd *abfd, bfd_byte *p, int r)
6075{
6076 p = restvr (abfd, p, r);
6077 bfd_put_32 (abfd, BLR, p);
6078 return p + 4;
6079}
6080
e86ce104
AM
6081/* Called via elf_link_hash_traverse to transfer dynamic linking
6082 information on function code symbol entries to their corresponding
6083 function descriptor symbol entries. */
deb0e272 6084
b34976b6 6085static bfd_boolean
4ce794b7 6086func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6087{
e86ce104 6088 struct bfd_link_info *info;
65f38f15 6089 struct ppc_link_hash_table *htab;
50bc7936
AM
6090 struct ppc_link_hash_entry *fh;
6091 struct ppc_link_hash_entry *fdh;
6092 bfd_boolean force_local;
5bd4f169 6093
ed7007c1 6094 fh = ppc_elf_hash_entry (h);
50bc7936 6095 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 6096 return TRUE;
e86ce104 6097
8c5b4e52
AM
6098 if (!fh->is_func)
6099 return TRUE;
6100
6101 if (fh->elf.root.root.string[0] != '.'
6102 || fh->elf.root.root.string[1] == '\0')
6103 return TRUE;
6104
4ce794b7 6105 info = inf;
65f38f15 6106 htab = ppc_hash_table (info);
4dfe6ac6
NC
6107 if (htab == NULL)
6108 return FALSE;
5bd4f169 6109
8c5b4e52
AM
6110 /* Find the corresponding function descriptor symbol. */
6111 fdh = lookup_fdh (fh, htab);
6112
c09bdfe5
AM
6113 /* Resolve undefined references to dot-symbols as the value
6114 in the function descriptor, if we have one in a regular object.
6115 This is to satisfy cases like ".quad .foo". Calls to functions
6116 in dynamic objects are handled elsewhere. */
8c5b4e52
AM
6117 if ((fh->elf.root.type == bfd_link_hash_undefined
6118 || fh->elf.root.type == bfd_link_hash_undefweak)
6119 && (fdh->elf.root.type == bfd_link_hash_defined
6120 || fdh->elf.root.type == bfd_link_hash_defweak)
b31867b6
AM
6121 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6122 && opd_entry_value (fdh->elf.root.u.def.section,
6123 fdh->elf.root.u.def.value,
c09bdfe5 6124 &fh->elf.root.u.def.section,
aef36ac1 6125 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
c09bdfe5 6126 {
b31867b6 6127 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 6128 fh->elf.forced_local = 1;
b31867b6
AM
6129 fh->elf.def_regular = fdh->elf.def_regular;
6130 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
6131 }
6132
8c5b4e52
AM
6133 if (!fh->elf.dynamic)
6134 {
6135 struct plt_entry *ent;
5bd4f169 6136
8c5b4e52
AM
6137 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6138 if (ent->plt.refcount > 0)
6139 break;
6140 if (ent == NULL)
6141 return TRUE;
6142 }
5bd4f169 6143
8c5b4e52 6144 /* Create a descriptor as undefined if necessary. */
50bc7936 6145 if (fdh == NULL
0e1862bb 6146 && !bfd_link_executable (info)
50bc7936
AM
6147 && (fh->elf.root.type == bfd_link_hash_undefined
6148 || fh->elf.root.type == bfd_link_hash_undefweak))
6149 {
908b32fc 6150 fdh = make_fdh (info, fh);
bb700d78
AM
6151 if (fdh == NULL)
6152 return FALSE;
50bc7936 6153 }
648cca2c 6154
8c5b4e52 6155 /* We can't support overriding of symbols on a fake descriptor. */
908b32fc
AM
6156 if (fdh != NULL
6157 && fdh->fake
8c5b4e52
AM
6158 && (fh->elf.root.type == bfd_link_hash_defined
6159 || fh->elf.root.type == bfd_link_hash_defweak))
6160 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
908b32fc 6161
8c5b4e52
AM
6162 /* Transfer dynamic linking information to the function descriptor. */
6163 if (fdh != NULL)
6164 {
f5385ebf
AM
6165 fdh->elf.ref_regular |= fh->elf.ref_regular;
6166 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6167 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6168 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
8c5b4e52
AM
6169 fdh->elf.dynamic |= fh->elf.dynamic;
6170 fdh->elf.needs_plt |= (fh->elf.needs_plt
6171 || fh->elf.type == STT_FUNC
6172 || fh->elf.type == STT_GNU_IFUNC);
6173 move_plt_plist (fh, fdh);
6174
6175 if (!fdh->elf.forced_local
6176 && fh->elf.dynindx != -1)
6177 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6178 return FALSE;
e86ce104
AM
6179 }
6180
50bc7936
AM
6181 /* Now that the info is on the function descriptor, clear the
6182 function code sym info. Any function code syms for which we
6183 don't have a definition in a regular file, we force local.
6184 This prevents a shared library from exporting syms that have
6185 been imported from another library. Function code syms that
6186 are really in the library we must leave global to prevent the
6187 linker dragging in a definition from a static library. */
93f3fa99
AM
6188 force_local = (!fh->elf.def_regular
6189 || fdh == NULL
6190 || !fdh->elf.def_regular
6191 || fdh->elf.forced_local);
50bc7936
AM
6192 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6193
b34976b6 6194 return TRUE;
e86ce104 6195}
40b8271b 6196
a4b6fadd
AM
6197static const struct sfpr_def_parms save_res_funcs[] =
6198 {
6199 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6200 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6201 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6202 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6203 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6204 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6205 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6206 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6207 { "._savef", 14, 31, savefpr, savefpr1_tail },
6208 { "._restf", 14, 31, restfpr, restfpr1_tail },
6209 { "_savevr_", 20, 31, savevr, savevr_tail },
6210 { "_restvr_", 20, 31, restvr, restvr_tail }
6211 };
6212
e86ce104 6213/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
6214 this hook to a) provide some gcc support functions, and b) transfer
6215 dynamic linking information gathered so far on function code symbol
6216 entries, to their corresponding function descriptor symbol entries. */
deb0e272 6217
b34976b6 6218static bfd_boolean
4ce794b7
AM
6219ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6220 struct bfd_link_info *info)
e86ce104
AM
6221{
6222 struct ppc_link_hash_table *htab;
6223
6224 htab = ppc_hash_table (info);
4dfe6ac6
NC
6225 if (htab == NULL)
6226 return FALSE;
6227
b32547cd
AM
6228 /* Provide any missing _save* and _rest* functions. */
6229 if (htab->sfpr != NULL)
6230 {
6231 unsigned int i;
6232
6233 htab->sfpr->size = 0;
6234 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
6235 if (!sfpr_define (info, &save_res_funcs[i], NULL))
6236 return FALSE;
6237 if (htab->sfpr->size == 0)
6238 htab->sfpr->flags |= SEC_EXCLUDE;
6239 }
6240
6241 if (bfd_link_relocatable (info))
6242 return TRUE;
6243
6244 if (htab->elf.hgot != NULL)
dba6fa9b
AM
6245 {
6246 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
6247 /* Make .TOC. defined so as to prevent it being made dynamic.
6248 The wrong value here is fixed later in ppc64_elf_set_toc. */
43417696
AM
6249 if (!htab->elf.hgot->def_regular
6250 || htab->elf.hgot->root.type != bfd_link_hash_defined)
6251 {
6252 htab->elf.hgot->root.type = bfd_link_hash_defined;
6253 htab->elf.hgot->root.u.def.value = 0;
6254 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
6255 htab->elf.hgot->def_regular = 1;
6256 htab->elf.hgot->root.linker_def = 1;
6257 }
dba6fa9b 6258 htab->elf.hgot->type = STT_OBJECT;
2cdcc330
AM
6259 htab->elf.hgot->other
6260 = (htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
dba6fa9b 6261 }
c66bb0ee 6262
8c5b4e52
AM
6263 if (htab->need_func_desc_adj)
6264 {
6265 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6266 htab->need_func_desc_adj = 0;
6267 }
805fc799 6268
b34976b6 6269 return TRUE;
e86ce104
AM
6270}
6271
98bbb1b8 6272/* Find dynamic relocs for H that apply to read-only sections. */
a345bc8d 6273
98bbb1b8 6274static asection *
a345bc8d
AM
6275readonly_dynrelocs (struct elf_link_hash_entry *h)
6276{
ed7007c1 6277 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
a345bc8d
AM
6278 struct elf_dyn_relocs *p;
6279
a345bc8d
AM
6280 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6281 {
6282 asection *s = p->sec->output_section;
6283
6284 if (s != NULL && (s->flags & SEC_READONLY) != 0)
98bbb1b8 6285 return p->sec;
a345bc8d 6286 }
98bbb1b8 6287 return NULL;
a345bc8d
AM
6288}
6289
d311bc8b 6290/* Return true if we have dynamic relocs against H or any of its weak
ab2477e1
AM
6291 aliases, that apply to read-only sections. Cannot be used after
6292 size_dynamic_sections. */
d311bc8b
AM
6293
6294static bfd_boolean
6295alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
6296{
ed7007c1 6297 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
d311bc8b
AM
6298 do
6299 {
6300 if (readonly_dynrelocs (&eh->elf))
6301 return TRUE;
ed7007c1 6302 eh = ppc_elf_hash_entry (eh->elf.u.alias);
2cdcc330
AM
6303 }
6304 while (eh != NULL && &eh->elf != h);
d311bc8b
AM
6305
6306 return FALSE;
6307}
8a2058b5 6308
8a9e8e72
AM
6309/* Return whether EH has pc-relative dynamic relocs. */
6310
6311static bfd_boolean
6312pc_dynrelocs (struct ppc_link_hash_entry *eh)
6313{
6314 struct elf_dyn_relocs *p;
6315
6316 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6317 if (p->pc_count != 0)
6318 return TRUE;
6319 return FALSE;
6320}
6321
8a2058b5
AM
6322/* Return true if a global entry stub will be created for H. Valid
6323 for ELFv2 before plt entries have been allocated. */
6324
6325static bfd_boolean
6326global_entry_stub (struct elf_link_hash_entry *h)
6327{
6328 struct plt_entry *pent;
6329
6330 if (!h->pointer_equality_needed
6331 || h->def_regular)
6332 return FALSE;
6333
6334 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
6335 if (pent->plt.refcount > 0
6336 && pent->addend == 0)
6337 return TRUE;
6338
6339 return FALSE;
6340}
6341
e86ce104
AM
6342/* Adjust a symbol defined by a dynamic object and referenced by a
6343 regular object. The current definition is in some section of the
6344 dynamic object, but we're not including those sections. We have to
6345 change the definition to something the rest of the link can
6346 understand. */
6347
b34976b6 6348static bfd_boolean
4ce794b7
AM
6349ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6350 struct elf_link_hash_entry *h)
e86ce104
AM
6351{
6352 struct ppc_link_hash_table *htab;
5474d94f 6353 asection *s, *srel;
e86ce104
AM
6354
6355 htab = ppc_hash_table (info);
4dfe6ac6
NC
6356 if (htab == NULL)
6357 return FALSE;
e86ce104
AM
6358
6359 /* Deal with function syms. */
6360 if (h->type == STT_FUNC
e054468f 6361 || h->type == STT_GNU_IFUNC
f5385ebf 6362 || h->needs_plt)
e86ce104 6363 {
ed7007c1 6364 bfd_boolean local = (ppc_elf_hash_entry (h)->save_res
529fe20e
AM
6365 || SYMBOL_CALLS_LOCAL (info, h)
6366 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
6367 /* Discard dyn_relocs when non-pic if we've decided that a
6368 function symbol is local and not an ifunc. We keep dynamic
6369 relocs for ifuncs when local rather than always emitting a
6370 plt call stub for them and defining the symbol on the call
6371 stub. We can't do that for ELFv1 anyway (a function symbol
6372 is defined on a descriptor, not code) and it can be faster at
6373 run-time due to not needing to bounce through a stub. The
6374 dyn_relocs for ifuncs will be applied even in a static
6375 executable. */
6376 if (!bfd_link_pic (info)
6377 && h->type != STT_GNU_IFUNC
6378 && local)
ed7007c1 6379 ppc_elf_hash_entry (h)->dyn_relocs = NULL;
529fe20e 6380
e86ce104
AM
6381 /* Clear procedure linkage table information for any symbol that
6382 won't need a .plt entry. */
411e1bfb
AM
6383 struct plt_entry *ent;
6384 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6385 if (ent->plt.refcount > 0)
6386 break;
8387904d 6387 if (ent == NULL
2d7ad24e
AM
6388 || (h->type != STT_GNU_IFUNC
6389 && local
3e04d765 6390 && (htab->can_convert_all_inline_plt
ed7007c1 6391 || (ppc_elf_hash_entry (h)->tls_mask
3e04d765 6392 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
40b8271b 6393 {
411e1bfb 6394 h->plt.plist = NULL;
f5385ebf 6395 h->needs_plt = 0;
d1eca1e4 6396 h->pointer_equality_needed = 0;
40b8271b 6397 }
8a2058b5 6398 else if (abiversion (info->output_bfd) >= 2)
a345bc8d 6399 {
d1eca1e4
AM
6400 /* Taking a function's address in a read/write section
6401 doesn't require us to define the function symbol in the
6402 executable on a global entry stub. A dynamic reloc can
8a2058b5
AM
6403 be used instead. The reason we prefer a few more dynamic
6404 relocs is that calling via a global entry stub costs a
6405 few more instructions, and pointer_equality_needed causes
6406 extra work in ld.so when resolving these symbols. */
529fe20e 6407 if (global_entry_stub (h))
d1eca1e4 6408 {
ab2477e1 6409 if (!readonly_dynrelocs (h))
529fe20e
AM
6410 {
6411 h->pointer_equality_needed = 0;
04383fd1
AM
6412 /* If we haven't seen a branch reloc and the symbol
6413 isn't an ifunc then we don't need a plt entry. */
529fe20e
AM
6414 if (!h->needs_plt)
6415 h->plt.plist = NULL;
6416 }
6417 else if (!bfd_link_pic (info))
6418 /* We are going to be defining the function symbol on the
6419 plt stub, so no dyn_relocs needed when non-pic. */
ed7007c1 6420 ppc_elf_hash_entry (h)->dyn_relocs = NULL;
d1eca1e4
AM
6421 }
6422
3988aed5
AM
6423 /* ELFv2 function symbols can't have copy relocs. */
6424 return TRUE;
6425 }
6426 else if (!h->needs_plt
ab2477e1 6427 && !readonly_dynrelocs (h))
3988aed5 6428 {
04383fd1
AM
6429 /* If we haven't seen a branch reloc and the symbol isn't an
6430 ifunc then we don't need a plt entry. */
3988aed5
AM
6431 h->plt.plist = NULL;
6432 h->pointer_equality_needed = 0;
a345bc8d
AM
6433 return TRUE;
6434 }
5bd4f169 6435 }
bbd7ec4a 6436 else
411e1bfb 6437 h->plt.plist = NULL;
5bd4f169
AM
6438
6439 /* If this is a weak symbol, and there is a real definition, the
6440 processor independent code will have arranged for us to see the
6441 real definition first, and we can just use the same value. */
60d67dc8 6442 if (h->is_weakalias)
5bd4f169 6443 {
60d67dc8
AM
6444 struct elf_link_hash_entry *def = weakdef (h);
6445 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
6446 h->root.u.def.section = def->root.u.def.section;
6447 h->root.u.def.value = def->root.u.def.value;
4a7e5234
AM
6448 if (def->root.u.def.section == htab->elf.sdynbss
6449 || def->root.u.def.section == htab->elf.sdynrelro)
ed7007c1 6450 ppc_elf_hash_entry (h)->dyn_relocs = NULL;
b34976b6 6451 return TRUE;
5bd4f169
AM
6452 }
6453
5bd4f169
AM
6454 /* If we are creating a shared library, we must presume that the
6455 only references to the symbol are via the global offset table.
6456 For such cases we need not do anything here; the relocations will
6457 be handled correctly by relocate_section. */
ec73ddcd 6458 if (!bfd_link_executable (info))
b34976b6 6459 return TRUE;
5bd4f169 6460
65f38f15
AM
6461 /* If there are no references to this symbol that do not use the
6462 GOT, we don't need to generate a copy reloc. */
f5385ebf 6463 if (!h->non_got_ref)
b34976b6 6464 return TRUE;
65f38f15 6465
b186458a 6466 /* Don't generate a copy reloc for symbols defined in the executable. */
d93d1c80 6467 if (!h->def_dynamic || !h->ref_regular || h->def_regular
b186458a 6468
d93d1c80
AM
6469 /* If -z nocopyreloc was given, don't generate them either. */
6470 || info->nocopyreloc
a127494f 6471
dce2246a 6472 /* If we don't find any dynamic relocs in read-only sections, then
d93d1c80 6473 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1bdd8fac
AM
6474 || (ELIMINATE_COPY_RELOCS
6475 && !h->needs_copy
6476 && !alias_readonly_dynrelocs (h))
65f38f15 6477
d93d1c80
AM
6478 /* Protected variables do not work with .dynbss. The copy in
6479 .dynbss won't be used by the shared library with the protected
6480 definition for the variable. Text relocations are preferable
6481 to an incorrect program. */
6482 || h->protected_def)
529fe20e 6483 return TRUE;
a127494f 6484
e1c6cf61
AM
6485 if (h->type == STT_FUNC
6486 || h->type == STT_GNU_IFUNC)
97b639ba 6487 {
e1c6cf61
AM
6488 /* .dynbss copies of function symbols only work if we have
6489 ELFv1 dot-symbols. ELFv1 compilers since 2004 default to not
6490 use dot-symbols and set the function symbol size to the text
6491 size of the function rather than the size of the descriptor.
6492 That's wrong for copying a descriptor. */
ed7007c1 6493 if (ppc_elf_hash_entry (h)->oh == NULL
e1c6cf61
AM
6494 || !(h->size == 24 || h->size == 16))
6495 return TRUE;
6496
6497 /* We should never get here, but unfortunately there are old
6498 versions of gcc (circa gcc-3.2) that improperly for the
6499 ELFv1 ABI put initialized function pointers, vtable refs and
6500 suchlike in read-only sections. Allow them to proceed, but
6501 warn that this might break at runtime. */
25f53a85 6502 info->callbacks->einfo
c1c8c1ef 6503 (_("%P: copy reloc against `%pT' requires lazy plt linking; "
25f53a85 6504 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
6505 h->root.root.string);
6506 }
5d35169e
AM
6507
6508 /* This is a reference to a symbol defined by a dynamic object which
6509 is not a function. */
6510
5bd4f169
AM
6511 /* We must allocate the symbol in our .dynbss section, which will
6512 become part of the .bss section of the executable. There will be
6513 an entry for this symbol in the .dynsym section. The dynamic
6514 object will contain position independent code, so all references
6515 from the dynamic object to this symbol will go through the global
6516 offset table. The dynamic linker will use the .dynsym entry to
6517 determine the address it must put in the global offset table, so
6518 both the dynamic object and the regular object will refer to the
6519 same memory location for the variable. */
5474d94f
AM
6520 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6521 {
6522 s = htab->elf.sdynrelro;
6523 srel = htab->elf.sreldynrelro;
6524 }
6525 else
6526 {
6527 s = htab->elf.sdynbss;
6528 srel = htab->elf.srelbss;
6529 }
1d7e9d18 6530 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 6531 {
4a7e5234
AM
6532 /* We must generate a R_PPC64_COPY reloc to tell the dynamic
6533 linker to copy the initial value out of the dynamic object
6534 and into the runtime process image. */
5474d94f 6535 srel->size += sizeof (Elf64_External_Rela);
f5385ebf 6536 h->needs_copy = 1;
5bd4f169
AM
6537 }
6538
529fe20e 6539 /* We no longer want dyn_relocs. */
ed7007c1 6540 ppc_elf_hash_entry (h)->dyn_relocs = NULL;
6cabe1ea 6541 return _bfd_elf_adjust_dynamic_copy (info, h, s);
5bd4f169
AM
6542}
6543
e86ce104
AM
6544/* If given a function descriptor symbol, hide both the function code
6545 sym and the descriptor. */
6546static void
4ce794b7
AM
6547ppc64_elf_hide_symbol (struct bfd_link_info *info,
6548 struct elf_link_hash_entry *h,
6549 bfd_boolean force_local)
e86ce104 6550{
34814b9f 6551 struct ppc_link_hash_entry *eh;
e86ce104
AM
6552 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6553
87469ba2
AM
6554 if (ppc_hash_table (info) == NULL)
6555 return;
6556
ed7007c1 6557 eh = ppc_elf_hash_entry (h);
34814b9f 6558 if (eh->is_func_descriptor)
e86ce104 6559 {
34814b9f 6560 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 6561
721956f4 6562 if (fh == NULL)
d1329ca3
AM
6563 {
6564 const char *p, *q;
b8ac2841 6565 struct elf_link_hash_table *htab = elf_hash_table (info);
d1329ca3
AM
6566 char save;
6567
6568 /* We aren't supposed to use alloca in BFD because on
6569 systems which do not have alloca the version in libiberty
6570 calls xmalloc, which might cause the program to crash
6571 when it runs out of memory. This function doesn't have a
6572 return status, so there's no way to gracefully return an
6573 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
6574 accessed; It's either a string in an ELF string table,
6575 or allocated in an objalloc structure. */
d1329ca3 6576
34814b9f 6577 p = eh->elf.root.root.string - 1;
d1329ca3
AM
6578 save = *p;
6579 *(char *) p = '.';
ed7007c1
AM
6580 fh = ppc_elf_hash_entry (elf_link_hash_lookup (htab, p, FALSE,
6581 FALSE, FALSE));
d1329ca3
AM
6582 *(char *) p = save;
6583
6584 /* Unfortunately, if it so happens that the string we were
6585 looking for was allocated immediately before this string,
6586 then we overwrote the string terminator. That's the only
6587 reason the lookup should fail. */
6588 if (fh == NULL)
6589 {
34814b9f
AM
6590 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6591 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 6592 --q, --p;
34814b9f 6593 if (q < eh->elf.root.root.string && *p == '.')
ed7007c1
AM
6594 fh = ppc_elf_hash_entry (elf_link_hash_lookup (htab, p, FALSE,
6595 FALSE, FALSE));
d1329ca3
AM
6596 }
6597 if (fh != NULL)
6598 {
34814b9f
AM
6599 eh->oh = fh;
6600 fh->oh = eh;
d1329ca3
AM
6601 }
6602 }
e86ce104 6603 if (fh != NULL)
34814b9f 6604 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
6605 }
6606}
6607
411e1bfb 6608static bfd_boolean
8843416a
AM
6609get_sym_h (struct elf_link_hash_entry **hp,
6610 Elf_Internal_Sym **symp,
6611 asection **symsecp,
f961d9dd 6612 unsigned char **tls_maskp,
8843416a
AM
6613 Elf_Internal_Sym **locsymsp,
6614 unsigned long r_symndx,
6615 bfd *ibfd)
411e1bfb 6616{
0ffa91dd 6617 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
6618
6619 if (r_symndx >= symtab_hdr->sh_info)
6620 {
6621 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6622 struct elf_link_hash_entry *h;
6623
6624 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 6625 h = elf_follow_link (h);
411e1bfb
AM
6626
6627 if (hp != NULL)
6628 *hp = h;
6629
6630 if (symp != NULL)
6631 *symp = NULL;
6632
6633 if (symsecp != NULL)
6634 {
6635 asection *symsec = NULL;
6636 if (h->root.type == bfd_link_hash_defined
6637 || h->root.type == bfd_link_hash_defweak)
6638 symsec = h->root.u.def.section;
6639 *symsecp = symsec;
6640 }
6641
e7b938ca 6642 if (tls_maskp != NULL)
ed7007c1 6643 *tls_maskp = &ppc_elf_hash_entry (h)->tls_mask;
411e1bfb
AM
6644 }
6645 else
6646 {
6647 Elf_Internal_Sym *sym;
6648 Elf_Internal_Sym *locsyms = *locsymsp;
6649
6650 if (locsyms == NULL)
6651 {
6652 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6653 if (locsyms == NULL)
6654 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6655 symtab_hdr->sh_info,
6656 0, NULL, NULL, NULL);
6657 if (locsyms == NULL)
6658 return FALSE;
6659 *locsymsp = locsyms;
6660 }
6661 sym = locsyms + r_symndx;
6662
6663 if (hp != NULL)
6664 *hp = NULL;
6665
6666 if (symp != NULL)
6667 *symp = sym;
6668
6669 if (symsecp != NULL)
cb33740c 6670 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 6671
e7b938ca 6672 if (tls_maskp != NULL)
411e1bfb
AM
6673 {
6674 struct got_entry **lgot_ents;
f961d9dd 6675 unsigned char *tls_mask;
411e1bfb 6676
e7b938ca 6677 tls_mask = NULL;
411e1bfb
AM
6678 lgot_ents = elf_local_got_ents (ibfd);
6679 if (lgot_ents != NULL)
6680 {
e054468f
AM
6681 struct plt_entry **local_plt = (struct plt_entry **)
6682 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 6683 unsigned char *lgot_masks = (unsigned char *)
e054468f 6684 (local_plt + symtab_hdr->sh_info);
e7b938ca 6685 tls_mask = &lgot_masks[r_symndx];
411e1bfb 6686 }
e7b938ca 6687 *tls_maskp = tls_mask;
411e1bfb
AM
6688 }
6689 }
6690 return TRUE;
6691}
6692
e7b938ca 6693/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 6694 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 6695 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
6696
6697static int
f961d9dd 6698get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
6699 unsigned long *toc_symndx,
6700 bfd_vma *toc_addend,
0d4792f7 6701 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
6702 const Elf_Internal_Rela *rel,
6703 bfd *ibfd)
411e1bfb
AM
6704{
6705 unsigned long r_symndx;
0d4792f7 6706 int next_r;
411e1bfb
AM
6707 struct elf_link_hash_entry *h;
6708 Elf_Internal_Sym *sym;
6709 asection *sec;
6710 bfd_vma off;
6711
6712 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 6713 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 6714 return 0;
411e1bfb 6715
37da22e5
AM
6716 if ((*tls_maskp != NULL
6717 && (**tls_maskp & TLS_TLS) != 0
6718 && **tls_maskp != (TLS_TLS | TLS_MARK))
411e1bfb 6719 || sec == NULL
6bee8834 6720 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 6721 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 6722 return 1;
411e1bfb
AM
6723
6724 /* Look inside a TOC section too. */
6725 if (h != NULL)
6726 {
6727 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
6728 off = h->root.u.def.value;
6729 }
6730 else
6731 off = sym->st_value;
6732 off += rel->r_addend;
6733 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
6734 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
6735 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
6736 if (toc_symndx != NULL)
6737 *toc_symndx = r_symndx;
3a71aa26
AM
6738 if (toc_addend != NULL)
6739 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
6740 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6741 return 0;
854b41e7 6742 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
6743 && (next_r == -1 || next_r == -2))
6744 return 1 - next_r;
951fd09b 6745 return 1;
411e1bfb
AM
6746}
6747
3b421ab3
AM
6748/* Find (or create) an entry in the tocsave hash table. */
6749
6750static struct tocsave_entry *
6751tocsave_find (struct ppc_link_hash_table *htab,
6752 enum insert_option insert,
6753 Elf_Internal_Sym **local_syms,
6754 const Elf_Internal_Rela *irela,
6755 bfd *ibfd)
6756{
6757 unsigned long r_indx;
6758 struct elf_link_hash_entry *h;
6759 Elf_Internal_Sym *sym;
6760 struct tocsave_entry ent, *p;
6761 hashval_t hash;
6762 struct tocsave_entry **slot;
6763
6764 r_indx = ELF64_R_SYM (irela->r_info);
6765 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
6766 return NULL;
6767 if (ent.sec == NULL || ent.sec->output_section == NULL)
6768 {
4eca0228 6769 _bfd_error_handler
871b3ab2 6770 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
3b421ab3
AM
6771 return NULL;
6772 }
6773
6774 if (h != NULL)
6775 ent.offset = h->root.u.def.value;
6776 else
6777 ent.offset = sym->st_value;
6778 ent.offset += irela->r_addend;
6779
6780 hash = tocsave_htab_hash (&ent);
6781 slot = ((struct tocsave_entry **)
6782 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
6783 if (slot == NULL)
6784 return NULL;
6785
6786 if (*slot == NULL)
6787 {
6788 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
6789 if (p == NULL)
6790 return NULL;
6791 *p = ent;
6792 *slot = p;
6793 }
6794 return *slot;
6795}
6796
754021d0 6797/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 6798 code for the old ABI, these will already have been done. */
754021d0
AM
6799
6800static bfd_boolean
6801adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
6802{
6803 struct ppc_link_hash_entry *eh;
6804 asection *sym_sec;
74f0fb50 6805 struct _opd_sec_data *opd;
754021d0
AM
6806
6807 if (h->root.type == bfd_link_hash_indirect)
6808 return TRUE;
6809
754021d0
AM
6810 if (h->root.type != bfd_link_hash_defined
6811 && h->root.type != bfd_link_hash_defweak)
6812 return TRUE;
6813
ed7007c1 6814 eh = ppc_elf_hash_entry (h);
754021d0
AM
6815 if (eh->adjust_done)
6816 return TRUE;
6817
6818 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
6819 opd = get_opd_info (sym_sec);
6820 if (opd != NULL && opd->adjust != NULL)
754021d0 6821 {
51aecdc5 6822 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
4025353c
AM
6823 if (adjust == -1)
6824 {
6825 /* This entry has been deleted. */
b3fac117 6826 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
6827 if (dsec == NULL)
6828 {
6829 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 6830 if (discarded_section (dsec))
81688140 6831 {
b3fac117 6832 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
6833 break;
6834 }
6835 }
4025353c 6836 eh->elf.root.u.def.value = 0;
81688140 6837 eh->elf.root.u.def.section = dsec;
4025353c
AM
6838 }
6839 else
6840 eh->elf.root.u.def.value += adjust;
754021d0
AM
6841 eh->adjust_done = 1;
6842 }
6843 return TRUE;
6844}
6845
8c1d1bb8 6846/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 6847 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
6848 have already been determined. */
6849
6850static bfd_boolean
6851dec_dynrel_count (bfd_vma r_info,
6852 asection *sec,
6853 struct bfd_link_info *info,
6854 Elf_Internal_Sym **local_syms,
6855 struct elf_link_hash_entry *h,
19e08130 6856 Elf_Internal_Sym *sym)
8c1d1bb8
AM
6857{
6858 enum elf_ppc64_reloc_type r_type;
19e08130 6859 asection *sym_sec = NULL;
8c1d1bb8
AM
6860
6861 /* Can this reloc be dynamic? This switch, and later tests here
6862 should be kept in sync with the code in check_relocs. */
6863 r_type = ELF64_R_TYPE (r_info);
6864 switch (r_type)
6865 {
6866 default:
6867 return TRUE;
6868
1bdd8fac
AM
6869 case R_PPC64_TOC16:
6870 case R_PPC64_TOC16_DS:
6871 case R_PPC64_TOC16_LO:
6872 case R_PPC64_TOC16_HI:
6873 case R_PPC64_TOC16_HA:
6874 case R_PPC64_TOC16_LO_DS:
6875 if (h == NULL)
6876 return TRUE;
6877 break;
6878
8c1d1bb8
AM
6879 case R_PPC64_TPREL16:
6880 case R_PPC64_TPREL16_LO:
6881 case R_PPC64_TPREL16_HI:
6882 case R_PPC64_TPREL16_HA:
6883 case R_PPC64_TPREL16_DS:
6884 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
6885 case R_PPC64_TPREL16_HIGH:
6886 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
6887 case R_PPC64_TPREL16_HIGHER:
6888 case R_PPC64_TPREL16_HIGHERA:
6889 case R_PPC64_TPREL16_HIGHEST:
6890 case R_PPC64_TPREL16_HIGHESTA:
8c1d1bb8 6891 case R_PPC64_TPREL64:
c213164a 6892 case R_PPC64_TPREL34:
8c1d1bb8
AM
6893 case R_PPC64_DTPMOD64:
6894 case R_PPC64_DTPREL64:
6895 case R_PPC64_ADDR64:
6896 case R_PPC64_REL30:
6897 case R_PPC64_REL32:
6898 case R_PPC64_REL64:
6899 case R_PPC64_ADDR14:
6900 case R_PPC64_ADDR14_BRNTAKEN:
6901 case R_PPC64_ADDR14_BRTAKEN:
6902 case R_PPC64_ADDR16:
6903 case R_PPC64_ADDR16_DS:
6904 case R_PPC64_ADDR16_HA:
6905 case R_PPC64_ADDR16_HI:
f9c6b907
AM
6906 case R_PPC64_ADDR16_HIGH:
6907 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
6908 case R_PPC64_ADDR16_HIGHER:
6909 case R_PPC64_ADDR16_HIGHERA:
6910 case R_PPC64_ADDR16_HIGHEST:
6911 case R_PPC64_ADDR16_HIGHESTA:
6912 case R_PPC64_ADDR16_LO:
6913 case R_PPC64_ADDR16_LO_DS:
6914 case R_PPC64_ADDR24:
6915 case R_PPC64_ADDR32:
6916 case R_PPC64_UADDR16:
6917 case R_PPC64_UADDR32:
6918 case R_PPC64_UADDR64:
6919 case R_PPC64_TOC:
5663e321
AM
6920 case R_PPC64_D34:
6921 case R_PPC64_D34_LO:
6922 case R_PPC64_D34_HI30:
6923 case R_PPC64_D34_HA30:
6924 case R_PPC64_ADDR16_HIGHER34:
6925 case R_PPC64_ADDR16_HIGHERA34:
6926 case R_PPC64_ADDR16_HIGHEST34:
6927 case R_PPC64_ADDR16_HIGHESTA34:
6928 case R_PPC64_D28:
8c1d1bb8
AM
6929 break;
6930 }
6931
6932 if (local_syms != NULL)
6933 {
6934 unsigned long r_symndx;
8c1d1bb8
AM
6935 bfd *ibfd = sec->owner;
6936
6937 r_symndx = ELF64_R_SYM (r_info);
6938 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
6939 return FALSE;
6940 }
6941
ec73ddcd
AM
6942 if ((h != NULL
6943 && (h->root.type == bfd_link_hash_defweak
6944 || !h->def_regular))
6945 || (h != NULL
6946 && !bfd_link_executable (info)
6947 && !SYMBOLIC_BIND (info, h))
6948 || (bfd_link_pic (info)
6949 && must_be_dyn_reloc (info, r_type))
6950 || (!bfd_link_pic (info)
6951 && (h != NULL
6952 ? h->type == STT_GNU_IFUNC
6953 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
8c1d1bb8
AM
6954 ;
6955 else
6956 return TRUE;
6957
6958 if (h != NULL)
6edfbbad 6959 {
19e08130
AM
6960 struct elf_dyn_relocs *p;
6961 struct elf_dyn_relocs **pp;
ed7007c1 6962 pp = &ppc_elf_hash_entry (h)->dyn_relocs;
19e08130
AM
6963
6964 /* elf_gc_sweep may have already removed all dyn relocs associated
6965 with local syms for a given section. Also, symbol flags are
6966 changed by elf_gc_sweep_symbol, confusing the test above. Don't
6967 report a dynreloc miscount. */
6968 if (*pp == NULL && info->gc_sections)
6969 return TRUE;
6970
6971 while ((p = *pp) != NULL)
60124e18 6972 {
19e08130
AM
6973 if (p->sec == sec)
6974 {
6975 if (!must_be_dyn_reloc (info, r_type))
6976 p->pc_count -= 1;
6977 p->count -= 1;
6978 if (p->count == 0)
6979 *pp = p->next;
6980 return TRUE;
6981 }
6982 pp = &p->next;
60124e18 6983 }
6edfbbad 6984 }
19e08130
AM
6985 else
6986 {
6987 struct ppc_dyn_relocs *p;
6988 struct ppc_dyn_relocs **pp;
6989 void *vpp;
6990 bfd_boolean is_ifunc;
8c1d1bb8 6991
19e08130
AM
6992 if (local_syms == NULL)
6993 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6994 if (sym_sec == NULL)
6995 sym_sec = sec;
c57da1a7 6996
19e08130
AM
6997 vpp = &elf_section_data (sym_sec)->local_dynrel;
6998 pp = (struct ppc_dyn_relocs **) vpp;
6999
7000 if (*pp == NULL && info->gc_sections)
7001 return TRUE;
7002
7003 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7004 while ((p = *pp) != NULL)
8c1d1bb8 7005 {
19e08130
AM
7006 if (p->sec == sec && p->ifunc == is_ifunc)
7007 {
7008 p->count -= 1;
7009 if (p->count == 0)
7010 *pp = p->next;
7011 return TRUE;
7012 }
7013 pp = &p->next;
8c1d1bb8 7014 }
8c1d1bb8
AM
7015 }
7016
695344c0 7017 /* xgettext:c-format */
cf97bcb0
AM
7018 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"),
7019 sec->owner, sec);
8c1d1bb8
AM
7020 bfd_set_error (bfd_error_bad_value);
7021 return FALSE;
7022}
7023
754021d0
AM
7024/* Remove unused Official Procedure Descriptor entries. Currently we
7025 only remove those associated with functions in discarded link-once
7026 sections, or weakly defined functions that have been overridden. It
7027 would be possible to remove many more entries for statically linked
7028 applications. */
7029
b34976b6 7030bfd_boolean
e7d1c40c 7031ppc64_elf_edit_opd (struct bfd_link_info *info)
1e2f5b6e
AM
7032{
7033 bfd *ibfd;
754021d0 7034 bfd_boolean some_edited = FALSE;
3f764659 7035 asection *need_pad = NULL;
e7d1c40c
AM
7036 struct ppc_link_hash_table *htab;
7037
7038 htab = ppc_hash_table (info);
7039 if (htab == NULL)
7040 return FALSE;
1e2f5b6e 7041
c72f2fb2 7042 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1e2f5b6e
AM
7043 {
7044 asection *sec;
7045 Elf_Internal_Rela *relstart, *rel, *relend;
7046 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7047 Elf_Internal_Sym *local_syms;
74f0fb50 7048 struct _opd_sec_data *opd;
51aecdc5 7049 bfd_boolean need_edit, add_aux_fields, broken;
3f764659 7050 bfd_size_type cnt_16b = 0;
1e2f5b6e 7051
854b41e7
AM
7052 if (!is_ppc64_elf (ibfd))
7053 continue;
7054
1e2f5b6e 7055 sec = bfd_get_section_by_name (ibfd, ".opd");
46de2a7c 7056 if (sec == NULL || sec->size == 0)
1e2f5b6e
AM
7057 continue;
7058
dbaa2011 7059 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7060 continue;
7061
1e2f5b6e
AM
7062 if (sec->output_section == bfd_abs_section_ptr)
7063 continue;
7064
7065 /* Look through the section relocs. */
7066 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7067 continue;
7068
6cdc0ccc 7069 local_syms = NULL;
0ffa91dd 7070 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7071
7072 /* Read the relocations. */
4ce794b7 7073 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7074 info->keep_memory);
1e2f5b6e 7075 if (relstart == NULL)
b34976b6 7076 return FALSE;
1e2f5b6e
AM
7077
7078 /* First run through the relocs to check they are sane, and to
7079 determine whether we need to edit this opd section. */
b34976b6 7080 need_edit = FALSE;
51aecdc5 7081 broken = FALSE;
3f764659 7082 need_pad = sec;
1e2f5b6e 7083 relend = relstart + sec->reloc_count;
50bc7936 7084 for (rel = relstart; rel < relend; )
1e2f5b6e 7085 {
04c9666a 7086 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7087 unsigned long r_symndx;
7088 asection *sym_sec;
7089 struct elf_link_hash_entry *h;
7090 Elf_Internal_Sym *sym;
51aecdc5 7091 bfd_vma offset;
1e2f5b6e 7092
51aecdc5 7093 /* .opd contains an array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7094 only interested in the reloc pointing to a function entry
7095 point. */
51aecdc5
AM
7096 offset = rel->r_offset;
7097 if (rel + 1 == relend
7098 || rel[1].r_offset != offset + 8)
1e2f5b6e
AM
7099 {
7100 /* If someone messes with .opd alignment then after a
7101 "ld -r" we might have padding in the middle of .opd.
7102 Also, there's nothing to prevent someone putting
7103 something silly in .opd with the assembler. No .opd
b34976b6 7104 optimization for them! */
3f764659 7105 broken_opd:
4eca0228 7106 _bfd_error_handler
871b3ab2 7107 (_("%pB: .opd is not a regular array of opd entries"), ibfd);
51aecdc5 7108 broken = TRUE;
1e2f5b6e
AM
7109 break;
7110 }
7111
50bc7936
AM
7112 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7113 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7114 {
4eca0228 7115 _bfd_error_handler
695344c0 7116 /* xgettext:c-format */
871b3ab2 7117 (_("%pB: unexpected reloc type %u in .opd section"),
d003868e 7118 ibfd, r_type);
51aecdc5 7119 broken = TRUE;
50bc7936
AM
7120 break;
7121 }
7122
1e2f5b6e 7123 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7124 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7125 r_symndx, ibfd))
50bc7936 7126 goto error_ret;
1e2f5b6e
AM
7127
7128 if (sym_sec == NULL || sym_sec->owner == NULL)
7129 {
411e1bfb
AM
7130 const char *sym_name;
7131 if (h != NULL)
7132 sym_name = h->root.root.string;
7133 else
26c61ae5
L
7134 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7135 sym_sec);
411e1bfb 7136
4eca0228 7137 _bfd_error_handler
695344c0 7138 /* xgettext:c-format */
871b3ab2 7139 (_("%pB: undefined sym `%s' in .opd section"),
d003868e 7140 ibfd, sym_name);
51aecdc5 7141 broken = TRUE;
1e2f5b6e
AM
7142 break;
7143 }
7144
51020317
AM
7145 /* opd entries are always for functions defined in the
7146 current input bfd. If the symbol isn't defined in the
7147 input bfd, then we won't be using the function in this
7148 bfd; It must be defined in a linkonce section in another
7149 bfd, or is weak. It's also possible that we are
7150 discarding the function due to a linker script /DISCARD/,
7151 which we test for via the output_section. */
7152 if (sym_sec->owner != ibfd
7153 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 7154 need_edit = TRUE;
1e2f5b6e 7155
50bc7936 7156 rel += 2;
51aecdc5
AM
7157 if (rel + 1 == relend
7158 || (rel + 2 < relend
7159 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
7160 ++rel;
7161
7162 if (rel == relend)
3f764659
JJ
7163 {
7164 if (sec->size == offset + 24)
7165 {
7166 need_pad = NULL;
7167 break;
7168 }
51aecdc5 7169 if (sec->size == offset + 16)
3f764659
JJ
7170 {
7171 cnt_16b++;
7172 break;
7173 }
7174 goto broken_opd;
7175 }
3f764659
JJ
7176 else if (rel + 1 < relend
7177 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7178 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7179 {
51aecdc5
AM
7180 if (rel[0].r_offset == offset + 16)
7181 cnt_16b++;
7182 else if (rel[0].r_offset != offset + 24)
7183 goto broken_opd;
3f764659
JJ
7184 }
7185 else
7186 goto broken_opd;
1e2f5b6e
AM
7187 }
7188
e7d1c40c 7189 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
3f764659 7190
51aecdc5 7191 if (!broken && (need_edit || add_aux_fields))
1e2f5b6e
AM
7192 {
7193 Elf_Internal_Rela *write_rel;
d4730f92 7194 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 7195 bfd_byte *rptr, *wptr;
983bddc8 7196 bfd_byte *new_contents;
74f0fb50
AM
7197 bfd_size_type amt;
7198
983bddc8 7199 new_contents = NULL;
51aecdc5 7200 amt = OPD_NDX (sec->size) * sizeof (long);
74f0fb50 7201 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 7202 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50
AM
7203 if (opd->adjust == NULL)
7204 return FALSE;
1e2f5b6e
AM
7205
7206 /* This seems a waste of time as input .opd sections are all
7207 zeros as generated by gcc, but I suppose there's no reason
7208 this will always be so. We might start putting something in
7209 the third word of .opd entries. */
7210 if ((sec->flags & SEC_IN_MEMORY) == 0)
7211 {
eea6121a
AM
7212 bfd_byte *loc;
7213 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 7214 {
eea6121a
AM
7215 if (loc != NULL)
7216 free (loc);
50bc7936 7217 error_ret:
6cdc0ccc
AM
7218 if (local_syms != NULL
7219 && symtab_hdr->contents != (unsigned char *) local_syms)
7220 free (local_syms);
6cdc0ccc
AM
7221 if (elf_section_data (sec)->relocs != relstart)
7222 free (relstart);
b34976b6 7223 return FALSE;
6cdc0ccc 7224 }
1e2f5b6e
AM
7225 sec->contents = loc;
7226 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7227 }
7228
7229 elf_section_data (sec)->relocs = relstart;
7230
3f764659 7231 new_contents = sec->contents;
3f764659
JJ
7232 if (add_aux_fields)
7233 {
7234 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7235 if (new_contents == NULL)
7236 return FALSE;
51aecdc5 7237 need_pad = NULL;
3f764659 7238 }
b4f4e59f
AM
7239 wptr = new_contents;
7240 rptr = sec->contents;
1e2f5b6e 7241 write_rel = relstart;
51aecdc5 7242 for (rel = relstart; rel < relend; )
1e2f5b6e 7243 {
50bc7936
AM
7244 unsigned long r_symndx;
7245 asection *sym_sec;
7246 struct elf_link_hash_entry *h;
51aecdc5 7247 struct ppc_link_hash_entry *fdh = NULL;
50bc7936 7248 Elf_Internal_Sym *sym;
51aecdc5
AM
7249 long opd_ent_size;
7250 Elf_Internal_Rela *next_rel;
7251 bfd_boolean skip;
50bc7936
AM
7252
7253 r_symndx = ELF64_R_SYM (rel->r_info);
7254 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 7255 r_symndx, ibfd))
50bc7936
AM
7256 goto error_ret;
7257
51aecdc5
AM
7258 next_rel = rel + 2;
7259 if (next_rel + 1 == relend
7260 || (next_rel + 2 < relend
7261 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
7262 ++next_rel;
7263
7264 /* See if the .opd entry is full 24 byte or
7265 16 byte (with fd_aux entry overlapped with next
7266 fd_func). */
7267 opd_ent_size = 24;
7268 if (next_rel == relend)
1e2f5b6e 7269 {
51aecdc5 7270 if (sec->size == rel->r_offset + 16)
3f764659 7271 opd_ent_size = 16;
51aecdc5
AM
7272 }
7273 else if (next_rel->r_offset == rel->r_offset + 16)
7274 opd_ent_size = 16;
3f764659 7275
51aecdc5
AM
7276 if (h != NULL
7277 && h->root.root.string[0] == '.')
7278 {
ed7007c1 7279 fdh = ppc_elf_hash_entry (h)->oh;
8c5b4e52
AM
7280 if (fdh != NULL)
7281 {
7282 fdh = ppc_follow_link (fdh);
7283 if (fdh->elf.root.type != bfd_link_hash_defined
7284 && fdh->elf.root.type != bfd_link_hash_defweak)
7285 fdh = NULL;
7286 }
51aecdc5 7287 }
1e2f5b6e 7288
51aecdc5
AM
7289 skip = (sym_sec->owner != ibfd
7290 || sym_sec->output_section == bfd_abs_section_ptr);
7291 if (skip)
7292 {
7293 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7 7294 {
51aecdc5
AM
7295 /* Arrange for the function descriptor sym
7296 to be dropped. */
7297 fdh->elf.root.u.def.value = 0;
7298 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 7299 }
51aecdc5 7300 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
1e2f5b6e 7301
0e1862bb 7302 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
51aecdc5
AM
7303 rel = next_rel;
7304 else
7305 while (1)
7306 {
7307 if (!dec_dynrel_count (rel->r_info, sec, info,
7308 NULL, h, sym))
7309 goto error_ret;
754021d0 7310
51aecdc5
AM
7311 if (++rel == next_rel)
7312 break;
1e2f5b6e 7313
51aecdc5
AM
7314 r_symndx = ELF64_R_SYM (rel->r_info);
7315 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7316 r_symndx, ibfd))
7317 goto error_ret;
7318 }
50bc7936
AM
7319 }
7320 else
1e2f5b6e 7321 {
51aecdc5
AM
7322 /* We'll be keeping this opd entry. */
7323 long adjust;
7324
7325 if (fdh != NULL)
7326 {
7327 /* Redefine the function descriptor symbol to
7328 this location in the opd section. It is
7329 necessary to update the value here rather
7330 than using an array of adjustments as we do
7331 for local symbols, because various places
7332 in the generic ELF code use the value
7333 stored in u.def.value. */
7334 fdh->elf.root.u.def.value = wptr - new_contents;
7335 fdh->adjust_done = 1;
7336 }
7337
7338 /* Local syms are a bit tricky. We could
7339 tweak them as they can be cached, but
7340 we'd need to look through the local syms
7341 for the function descriptor sym which we
7342 don't have at the moment. So keep an
7343 array of adjustments. */
7344 adjust = (wptr - new_contents) - (rptr - sec->contents);
7345 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
7346
7347 if (wptr != rptr)
7348 memcpy (wptr, rptr, opd_ent_size);
7349 wptr += opd_ent_size;
7350 if (add_aux_fields && opd_ent_size == 16)
7351 {
7352 memset (wptr, '\0', 8);
7353 wptr += 8;
7354 }
7355
50bc7936 7356 /* We need to adjust any reloc offsets to point to the
51aecdc5
AM
7357 new opd entries. */
7358 for ( ; rel != next_rel; ++rel)
7359 {
7360 rel->r_offset += adjust;
7361 if (write_rel != rel)
7362 memcpy (write_rel, rel, sizeof (*rel));
7363 ++write_rel;
7364 }
1e2f5b6e 7365 }
51aecdc5
AM
7366
7367 rptr += opd_ent_size;
1e2f5b6e
AM
7368 }
7369
3f764659 7370 sec->size = wptr - new_contents;
1e2f5b6e 7371 sec->reloc_count = write_rel - relstart;
3f764659
JJ
7372 if (add_aux_fields)
7373 {
7374 free (sec->contents);
7375 sec->contents = new_contents;
7376 }
7377
05bf9422 7378 /* Fudge the header size too, as this is used later in
cdcf6e38 7379 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
7380 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7381 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
754021d0 7382 some_edited = TRUE;
1e2f5b6e 7383 }
6cdc0ccc 7384 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 7385 free (relstart);
6cdc0ccc 7386
411e1bfb
AM
7387 if (local_syms != NULL
7388 && symtab_hdr->contents != (unsigned char *) local_syms)
7389 {
7390 if (!info->keep_memory)
7391 free (local_syms);
7392 else
7393 symtab_hdr->contents = (unsigned char *) local_syms;
7394 }
7395 }
7396
754021d0
AM
7397 if (some_edited)
7398 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7399
3f764659
JJ
7400 /* If we are doing a final link and the last .opd entry is just 16 byte
7401 long, add a 8 byte padding after it. */
0e1862bb 7402 if (need_pad != NULL && !bfd_link_relocatable (info))
3f764659
JJ
7403 {
7404 bfd_byte *p;
7405
7406 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7407 {
7408 BFD_ASSERT (need_pad->size > 0);
7409
7410 p = bfd_malloc (need_pad->size + 8);
7411 if (p == NULL)
7412 return FALSE;
699733f6 7413
2cdcc330
AM
7414 if (!bfd_get_section_contents (need_pad->owner, need_pad,
7415 p, 0, need_pad->size))
3f764659
JJ
7416 return FALSE;
7417
7418 need_pad->contents = p;
7419 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7420 }
7421 else
7422 {
7423 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7424 if (p == NULL)
7425 return FALSE;
7426
7427 need_pad->contents = p;
7428 }
7429
7430 memset (need_pad->contents + need_pad->size, 0, 8);
7431 need_pad->size += 8;
7432 }
7433
411e1bfb
AM
7434 return TRUE;
7435}
7436
3e04d765
AM
7437/* Analyze inline PLT call relocations to see whether calls to locally
7438 defined functions can be converted to direct calls. */
7439
7440bfd_boolean
7441ppc64_elf_inline_plt (struct bfd_link_info *info)
7442{
7443 struct ppc_link_hash_table *htab;
7444 bfd *ibfd;
7445 asection *sec;
7446 bfd_vma low_vma, high_vma, limit;
7447
7448 htab = ppc_hash_table (info);
7449 if (htab == NULL)
7450 return FALSE;
7451
7452 /* A bl insn can reach -0x2000000 to 0x1fffffc. The limit is
7453 reduced somewhat to cater for possible stubs that might be added
7454 between the call and its destination. */
7455 if (htab->params->group_size < 0)
7456 {
7457 limit = -htab->params->group_size;
7458 if (limit == 1)
7459 limit = 0x1e00000;
7460 }
7461 else
7462 {
7463 limit = htab->params->group_size;
7464 if (limit == 1)
7465 limit = 0x1c00000;
7466 }
7467
7468 low_vma = -1;
7469 high_vma = 0;
7470 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
7471 if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
7472 {
7473 if (low_vma > sec->vma)
7474 low_vma = sec->vma;
7475 if (high_vma < sec->vma + sec->size)
7476 high_vma = sec->vma + sec->size;
7477 }
7478
7479 /* If a "bl" can reach anywhere in local code sections, then we can
7480 convert all inline PLT sequences to direct calls when the symbol
7481 is local. */
7482 if (high_vma - low_vma < limit)
7483 {
7484 htab->can_convert_all_inline_plt = 1;
7485 return TRUE;
7486 }
7487
7488 /* Otherwise, go looking through relocs for cases where a direct
7489 call won't reach. Mark the symbol on any such reloc to disable
7490 the optimization and keep the PLT entry as it seems likely that
7491 this will be better than creating trampolines. Note that this
7492 will disable the optimization for all inline PLT calls to a
7493 particular symbol, not just those that won't reach. The
7494 difficulty in doing a more precise optimization is that the
7495 linker needs to make a decision depending on whether a
7496 particular R_PPC64_PLTCALL insn can be turned into a direct
7497 call, for each of the R_PPC64_PLTSEQ and R_PPC64_PLT16* insns in
7498 the sequence, and there is nothing that ties those relocs
7499 together except their symbol. */
7500
7501 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7502 {
7503 Elf_Internal_Shdr *symtab_hdr;
7504 Elf_Internal_Sym *local_syms;
7505
7506 if (!is_ppc64_elf (ibfd))
7507 continue;
7508
7509 local_syms = NULL;
7510 symtab_hdr = &elf_symtab_hdr (ibfd);
7511
7512 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7513 if (ppc64_elf_section_data (sec)->has_pltcall
7514 && !bfd_is_abs_section (sec->output_section))
7515 {
7516 Elf_Internal_Rela *relstart, *rel, *relend;
7517
7518 /* Read the relocations. */
7519 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7520 info->keep_memory);
7521 if (relstart == NULL)
7522 return FALSE;
7523
7524 relend = relstart + sec->reloc_count;
7525 for (rel = relstart; rel < relend; )
7526 {
7527 enum elf_ppc64_reloc_type r_type;
7528 unsigned long r_symndx;
7529 asection *sym_sec;
7530 struct elf_link_hash_entry *h;
7531 Elf_Internal_Sym *sym;
7532 unsigned char *tls_maskp;
7533
7534 r_type = ELF64_R_TYPE (rel->r_info);
5663e321
AM
7535 if (r_type != R_PPC64_PLTCALL
7536 && r_type != R_PPC64_PLTCALL_NOTOC)
3e04d765
AM
7537 continue;
7538
7539 r_symndx = ELF64_R_SYM (rel->r_info);
7540 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
7541 r_symndx, ibfd))
7542 {
7543 if (elf_section_data (sec)->relocs != relstart)
7544 free (relstart);
7545 if (local_syms != NULL
2cdcc330 7546 && symtab_hdr->contents != (bfd_byte *) local_syms)
3e04d765
AM
7547 free (local_syms);
7548 return FALSE;
7549 }
7550
7551 if (sym_sec != NULL && sym_sec->output_section != NULL)
7552 {
7553 bfd_vma from, to;
7554 if (h != NULL)
7555 to = h->root.u.def.value;
7556 else
7557 to = sym->st_value;
7558 to += (rel->r_addend
7559 + sym_sec->output_offset
7560 + sym_sec->output_section->vma);
7561 from = (rel->r_offset
7562 + sec->output_offset
7563 + sec->output_section->vma);
5663e321
AM
7564 if (to - from + limit < 2 * limit
7565 && !(r_type == R_PPC64_PLTCALL_NOTOC
7566 && (((h ? h->other : sym->st_other)
7567 & STO_PPC64_LOCAL_MASK)
4a4e7361 7568 > 1 << STO_PPC64_LOCAL_BIT)))
3e04d765
AM
7569 *tls_maskp &= ~PLT_KEEP;
7570 }
7571 }
7572 if (elf_section_data (sec)->relocs != relstart)
7573 free (relstart);
7574 }
7575
7576 if (local_syms != NULL
7577 && symtab_hdr->contents != (unsigned char *) local_syms)
7578 {
7579 if (!info->keep_memory)
7580 free (local_syms);
7581 else
7582 symtab_hdr->contents = (unsigned char *) local_syms;
7583 }
7584 }
7585
7586 return TRUE;
7587}
7588
e1918d23 7589/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 7590
e1918d23 7591asection *
e7d1c40c 7592ppc64_elf_tls_setup (struct bfd_link_info *info)
411e1bfb 7593{
411e1bfb
AM
7594 struct ppc_link_hash_table *htab;
7595
411e1bfb 7596 htab = ppc_hash_table (info);
4dfe6ac6
NC
7597 if (htab == NULL)
7598 return NULL;
7599
ee67d69a
AM
7600 if (abiversion (info->output_bfd) == 1)
7601 htab->opd_abi = 1;
7602
e7d1c40c 7603 if (htab->params->no_multi_toc)
33c0ec9d
AM
7604 htab->do_multi_toc = 0;
7605 else if (!htab->do_multi_toc)
e7d1c40c 7606 htab->params->no_multi_toc = 1;
33c0ec9d 7607
8b5f1ed8
AM
7608 /* Default to --no-plt-localentry, as this option can cause problems
7609 with symbol interposition. For example, glibc libpthread.so and
7610 libc.so duplicate many pthread symbols, with a fallback
7611 implementation in libc.so. In some cases the fallback does more
7612 work than the pthread implementation. __pthread_condattr_destroy
7613 is one such symbol: the libpthread.so implementation is
7614 localentry:0 while the libc.so implementation is localentry:8.
7615 An app that "cleverly" uses dlopen to only load necessary
7616 libraries at runtime may omit loading libpthread.so when not
7617 running multi-threaded, which then results in the libc.so
7618 fallback symbols being used and ld.so complaining. Now there
7619 are workarounds in ld (see non_zero_localentry) to detect the
7620 pthread situation, but that may not be the only case where
7621 --plt-localentry can cause trouble. */
f378ab09 7622 if (htab->params->plt_localentry0 < 0)
8b5f1ed8 7623 htab->params->plt_localentry0 = 0;
d44c746a
AM
7624 if (htab->params->plt_localentry0
7625 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
7626 FALSE, FALSE, FALSE) == NULL)
cf97bcb0
AM
7627 _bfd_error_handler
7628 (_("warning: --plt-localentry is especially dangerous without "
7629 "ld.so support to detect ABI violations"));
f378ab09 7630
3a71aa26
AM
7631 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7632 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7633 FALSE, FALSE, TRUE));
a7f2871e
AM
7634 /* Move dynamic linking info to the function descriptor sym. */
7635 if (htab->tls_get_addr != NULL)
7636 func_desc_adjust (&htab->tls_get_addr->elf, info);
3a71aa26
AM
7637 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7638 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7639 FALSE, FALSE, TRUE));
7c9cf415 7640 if (htab->params->tls_get_addr_opt)
a7f2871e
AM
7641 {
7642 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
7643
7644 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7645 FALSE, FALSE, TRUE);
7646 if (opt != NULL)
7647 func_desc_adjust (opt, info);
7648 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7649 FALSE, FALSE, TRUE);
7650 if (opt_fd != NULL
7651 && (opt_fd->root.type == bfd_link_hash_defined
7652 || opt_fd->root.type == bfd_link_hash_defweak))
7653 {
7654 /* If glibc supports an optimized __tls_get_addr call stub,
7655 signalled by the presence of __tls_get_addr_opt, and we'll
7656 be calling __tls_get_addr via a plt call stub, then
7657 make __tls_get_addr point to __tls_get_addr_opt. */
7658 tga_fd = &htab->tls_get_addr_fd->elf;
7659 if (htab->elf.dynamic_sections_created
7660 && tga_fd != NULL
7661 && (tga_fd->type == STT_FUNC
7662 || tga_fd->needs_plt)
7663 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
21d68fcd 7664 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd)))
a7f2871e
AM
7665 {
7666 struct plt_entry *ent;
7667
7668 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7669 if (ent->plt.refcount > 0)
7670 break;
7671 if (ent != NULL)
7672 {
7673 tga_fd->root.type = bfd_link_hash_indirect;
7674 tga_fd->root.u.i.link = &opt_fd->root;
7675 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
b531344c 7676 opt_fd->mark = 1;
a7f2871e
AM
7677 if (opt_fd->dynindx != -1)
7678 {
7679 /* Use __tls_get_addr_opt in dynamic relocations. */
7680 opt_fd->dynindx = -1;
7681 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7682 opt_fd->dynstr_index);
7683 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
854b41e7 7684 return NULL;
a7f2871e 7685 }
ed7007c1 7686 htab->tls_get_addr_fd = ppc_elf_hash_entry (opt_fd);
a7f2871e
AM
7687 tga = &htab->tls_get_addr->elf;
7688 if (opt != NULL && tga != NULL)
7689 {
7690 tga->root.type = bfd_link_hash_indirect;
7691 tga->root.u.i.link = &opt->root;
7692 ppc64_elf_copy_indirect_symbol (info, opt, tga);
b531344c 7693 opt->mark = 1;
a7f2871e
AM
7694 _bfd_elf_link_hash_hide_symbol (info, opt,
7695 tga->forced_local);
ed7007c1 7696 htab->tls_get_addr = ppc_elf_hash_entry (opt);
a7f2871e
AM
7697 }
7698 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7699 htab->tls_get_addr_fd->is_func_descriptor = 1;
7700 if (htab->tls_get_addr != NULL)
7701 {
7702 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7703 htab->tls_get_addr->is_func = 1;
7704 }
7705 }
7706 }
7707 }
7c9cf415
AM
7708 else if (htab->params->tls_get_addr_opt < 0)
7709 htab->params->tls_get_addr_opt = 0;
a7f2871e 7710 }
33c0ec9d 7711 return _bfd_elf_tls_setup (info->output_bfd, info);
3a71aa26 7712}
8387904d 7713
3a71aa26
AM
7714/* Return TRUE iff REL is a branch reloc with a global symbol matching
7715 HASH1 or HASH2. */
8387904d 7716
3a71aa26
AM
7717static bfd_boolean
7718branch_reloc_hash_match (const bfd *ibfd,
7719 const Elf_Internal_Rela *rel,
7720 const struct ppc_link_hash_entry *hash1,
7721 const struct ppc_link_hash_entry *hash2)
7722{
7723 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7724 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7725 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7726
e054468f 7727 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 7728 {
3a71aa26
AM
7729 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7730 struct elf_link_hash_entry *h;
8387904d 7731
3a71aa26 7732 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7733 h = elf_follow_link (h);
3a71aa26
AM
7734 if (h == &hash1->elf || h == &hash2->elf)
7735 return TRUE;
a48ebf4d 7736 }
3a71aa26 7737 return FALSE;
951fd09b 7738}
411e1bfb 7739
951fd09b
AM
7740/* Run through all the TLS relocs looking for optimization
7741 opportunities. The linker has been hacked (see ppc64elf.em) to do
7742 a preliminary section layout so that we know the TLS segment
7743 offsets. We can't optimize earlier because some optimizations need
7744 to know the tp offset, and we need to optimize before allocating
7745 dynamic relocations. */
7746
7747bfd_boolean
33c0ec9d 7748ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
7749{
7750 bfd *ibfd;
7751 asection *sec;
7752 struct ppc_link_hash_table *htab;
663a1470 7753 unsigned char *toc_ref;
102890f0 7754 int pass;
951fd09b 7755
3cbc1e5e 7756 if (!bfd_link_executable (info))
411e1bfb
AM
7757 return TRUE;
7758
951fd09b 7759 htab = ppc_hash_table (info);
4dfe6ac6
NC
7760 if (htab == NULL)
7761 return FALSE;
7762
663a1470
AM
7763 /* Make two passes over the relocs. On the first pass, mark toc
7764 entries involved with tls relocs, and check that tls relocs
7765 involved in setting up a tls_get_addr call are indeed followed by
7766 such a call. If they are not, we can't do any tls optimization.
7767 On the second pass twiddle tls_mask flags to notify
7768 relocate_section that optimization can be done, and adjust got
7769 and plt refcounts. */
7770 toc_ref = NULL;
7771 for (pass = 0; pass < 2; ++pass)
c72f2fb2 7772 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
663a1470
AM
7773 {
7774 Elf_Internal_Sym *locsyms = NULL;
7775 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7776
102890f0
AM
7777 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7778 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7779 {
7780 Elf_Internal_Rela *relstart, *rel, *relend;
663a1470 7781 bfd_boolean found_tls_get_addr_arg = 0;
411e1bfb 7782
102890f0
AM
7783 /* Read the relocations. */
7784 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7785 info->keep_memory);
7786 if (relstart == NULL)
2915c55b
JK
7787 {
7788 free (toc_ref);
7789 return FALSE;
7790 }
411e1bfb 7791
102890f0
AM
7792 relend = relstart + sec->reloc_count;
7793 for (rel = relstart; rel < relend; rel++)
7794 {
7795 enum elf_ppc64_reloc_type r_type;
7796 unsigned long r_symndx;
7797 struct elf_link_hash_entry *h;
7798 Elf_Internal_Sym *sym;
7799 asection *sym_sec;
f961d9dd 7800 unsigned char *tls_mask;
46e9995a 7801 unsigned int tls_set, tls_clear, tls_type = 0;
102890f0
AM
7802 bfd_vma value;
7803 bfd_boolean ok_tprel, is_local;
7804 long toc_ref_index = 0;
7805 int expecting_tls_get_addr = 0;
663a1470 7806 bfd_boolean ret = FALSE;
411e1bfb 7807
102890f0
AM
7808 r_symndx = ELF64_R_SYM (rel->r_info);
7809 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
7810 r_symndx, ibfd))
7811 {
7812 err_free_rel:
7813 if (elf_section_data (sec)->relocs != relstart)
7814 free (relstart);
7815 if (toc_ref != NULL)
7816 free (toc_ref);
7817 if (locsyms != NULL
0ffa91dd 7818 && (elf_symtab_hdr (ibfd).contents
102890f0
AM
7819 != (unsigned char *) locsyms))
7820 free (locsyms);
663a1470 7821 return ret;
102890f0 7822 }
411e1bfb 7823
102890f0
AM
7824 if (h != NULL)
7825 {
766bc656
AM
7826 if (h->root.type == bfd_link_hash_defined
7827 || h->root.type == bfd_link_hash_defweak)
7828 value = h->root.u.def.value;
7829 else if (h->root.type == bfd_link_hash_undefweak)
7830 value = 0;
7831 else
663a1470
AM
7832 {
7833 found_tls_get_addr_arg = 0;
7834 continue;
7835 }
102890f0
AM
7836 }
7837 else
7838 /* Symbols referenced by TLS relocs must be of type
7839 STT_TLS. So no need for .opd local sym adjust. */
7840 value = sym->st_value;
7841
7842 ok_tprel = FALSE;
f749f26e
AM
7843 is_local = SYMBOL_REFERENCES_LOCAL (info, h);
7844 if (is_local)
102890f0 7845 {
766bc656
AM
7846 if (h != NULL
7847 && h->root.type == bfd_link_hash_undefweak)
7848 ok_tprel = TRUE;
c27b8c2a
AM
7849 else if (sym_sec != NULL
7850 && sym_sec->output_section != NULL)
766bc656
AM
7851 {
7852 value += sym_sec->output_offset;
7853 value += sym_sec->output_section->vma;
0b147428 7854 value -= htab->elf.tls_sec->vma + TP_OFFSET;
c213164a
AM
7855 /* Note that even though the prefix insns
7856 allow a 1<<33 offset we use the same test
7857 as for addis;addi. There may be a mix of
7858 pcrel and non-pcrel code and the decision
7859 to optimise is per symbol, not per TLS
7860 sequence. */
0b147428 7861 ok_tprel = value + 0x80008000ULL < 1ULL << 32;
766bc656 7862 }
102890f0 7863 }
951fd09b 7864
102890f0 7865 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
7866 /* If this section has old-style __tls_get_addr calls
7867 without marker relocs, then check that each
7868 __tls_get_addr call reloc is preceded by a reloc
7869 that conceivably belongs to the __tls_get_addr arg
7870 setup insn. If we don't find matching arg setup
7871 relocs, don't do any tls optimization. */
7872 if (pass == 0
9737e8af 7873 && sec->nomark_tls_get_addr
663a1470 7874 && h != NULL
ed7007c1 7875 && is_tls_get_addr (h, htab)
663a1470
AM
7876 && !found_tls_get_addr_arg
7877 && is_branch_reloc (r_type))
7878 {
25f53a85 7879 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
7880 "TLS optimization disabled\n"),
7881 ibfd, sec, rel->r_offset);
7882 ret = TRUE;
7883 goto err_free_rel;
7884 }
7885
7886 found_tls_get_addr_arg = 0;
102890f0
AM
7887 switch (r_type)
7888 {
7889 case R_PPC64_GOT_TLSLD16:
7890 case R_PPC64_GOT_TLSLD16_LO:
c213164a 7891 case R_PPC64_GOT_TLSLD34:
102890f0 7892 expecting_tls_get_addr = 1;
663a1470 7893 found_tls_get_addr_arg = 1;
1a0670f3 7894 /* Fall through. */
102890f0
AM
7895
7896 case R_PPC64_GOT_TLSLD16_HI:
7897 case R_PPC64_GOT_TLSLD16_HA:
7898 /* These relocs should never be against a symbol
7899 defined in a shared lib. Leave them alone if
7900 that turns out to be the case. */
7901 if (!is_local)
7902 continue;
411e1bfb 7903
102890f0 7904 /* LD -> LE */
411e1bfb 7905 tls_set = 0;
102890f0
AM
7906 tls_clear = TLS_LD;
7907 tls_type = TLS_TLS | TLS_LD;
7908 break;
411e1bfb 7909
102890f0
AM
7910 case R_PPC64_GOT_TLSGD16:
7911 case R_PPC64_GOT_TLSGD16_LO:
c213164a 7912 case R_PPC64_GOT_TLSGD34:
102890f0 7913 expecting_tls_get_addr = 1;
663a1470 7914 found_tls_get_addr_arg = 1;
1a0670f3 7915 /* Fall through. */
102890f0
AM
7916
7917 case R_PPC64_GOT_TLSGD16_HI:
7918 case R_PPC64_GOT_TLSGD16_HA:
7919 if (ok_tprel)
7920 /* GD -> LE */
411e1bfb 7921 tls_set = 0;
102890f0
AM
7922 else
7923 /* GD -> IE */
b00a0a86 7924 tls_set = TLS_TLS | TLS_GDIE;
102890f0
AM
7925 tls_clear = TLS_GD;
7926 tls_type = TLS_TLS | TLS_GD;
7927 break;
7928
c213164a 7929 case R_PPC64_GOT_TPREL34:
102890f0
AM
7930 case R_PPC64_GOT_TPREL16_DS:
7931 case R_PPC64_GOT_TPREL16_LO_DS:
7932 case R_PPC64_GOT_TPREL16_HI:
7933 case R_PPC64_GOT_TPREL16_HA:
7934 if (ok_tprel)
7935 {
7936 /* IE -> LE */
7937 tls_set = 0;
7938 tls_clear = TLS_TPREL;
7939 tls_type = TLS_TLS | TLS_TPREL;
7940 break;
7941 }
411e1bfb
AM
7942 continue;
7943
727fc41e 7944 case R_PPC64_TLSLD:
7d04a20a
AM
7945 if (!is_local)
7946 continue;
7947 /* Fall through. */
7948 case R_PPC64_TLSGD:
23cedd1d
AM
7949 if (rel + 1 < relend
7950 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
7951 {
7952 if (pass != 0
2cdcc330 7953 && (ELF64_R_TYPE (rel[1].r_info)
5663e321
AM
7954 != R_PPC64_PLTSEQ)
7955 && (ELF64_R_TYPE (rel[1].r_info)
7956 != R_PPC64_PLTSEQ_NOTOC))
23cedd1d
AM
7957 {
7958 r_symndx = ELF64_R_SYM (rel[1].r_info);
7959 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms,
2cdcc330 7960 r_symndx, ibfd))
23cedd1d
AM
7961 goto err_free_rel;
7962 if (h != NULL)
7963 {
7964 struct plt_entry *ent = NULL;
7965
7966 for (ent = h->plt.plist;
7967 ent != NULL;
7968 ent = ent->next)
7969 if (ent->addend == rel[1].r_addend)
7970 break;
7971
7972 if (ent != NULL
7973 && ent->plt.refcount > 0)
7974 ent->plt.refcount -= 1;
7975 }
7976 }
7977 continue;
7978 }
663a1470 7979 found_tls_get_addr_arg = 1;
1a0670f3 7980 /* Fall through. */
663a1470
AM
7981
7982 case R_PPC64_TLS:
7983 case R_PPC64_TOC16:
7984 case R_PPC64_TOC16_LO:
102890f0
AM
7985 if (sym_sec == NULL || sym_sec != toc)
7986 continue;
7987
7988 /* Mark this toc entry as referenced by a TLS
7989 code sequence. We can do that now in the
7990 case of R_PPC64_TLS, and after checking for
7991 tls_get_addr for the TOC16 relocs. */
7992 if (toc_ref == NULL)
2cdcc330
AM
7993 toc_ref
7994 = bfd_zmalloc (toc->output_section->rawsize / 8);
663a1470
AM
7995 if (toc_ref == NULL)
7996 goto err_free_rel;
7997
102890f0
AM
7998 if (h != NULL)
7999 value = h->root.u.def.value;
8000 else
8001 value = sym->st_value;
8002 value += rel->r_addend;
73242275
AM
8003 if (value % 8 != 0)
8004 continue;
8005 BFD_ASSERT (value < toc->size
8006 && toc->output_offset % 8 == 0);
663a1470 8007 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
8008 if (r_type == R_PPC64_TLS
8009 || r_type == R_PPC64_TLSGD
8010 || r_type == R_PPC64_TLSLD)
102890f0
AM
8011 {
8012 toc_ref[toc_ref_index] = 1;
8013 continue;
8014 }
8015
8016 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8017 continue;
8018
8019 tls_set = 0;
8020 tls_clear = 0;
8021 expecting_tls_get_addr = 2;
8022 break;
8023
8024 case R_PPC64_TPREL64:
8025 if (pass == 0
8026 || sec != toc
8027 || toc_ref == NULL
663a1470 8028 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8029 continue;
8030 if (ok_tprel)
8031 {
8032 /* IE -> LE */
8033 tls_set = TLS_EXPLICIT;
8034 tls_clear = TLS_TPREL;
8035 break;
8036 }
8037 continue;
8038
8039 case R_PPC64_DTPMOD64:
8040 if (pass == 0
8041 || sec != toc
8042 || toc_ref == NULL
663a1470 8043 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8044 continue;
8045 if (rel + 1 < relend
8046 && (rel[1].r_info
8047 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8048 && rel[1].r_offset == rel->r_offset + 8)
8049 {
8050 if (ok_tprel)
8051 /* GD -> LE */
8052 tls_set = TLS_EXPLICIT | TLS_GD;
8053 else
8054 /* GD -> IE */
b00a0a86 8055 tls_set = TLS_EXPLICIT | TLS_GD | TLS_GDIE;
102890f0
AM
8056 tls_clear = TLS_GD;
8057 }
8058 else
8059 {
8060 if (!is_local)
8061 continue;
8062
8063 /* LD -> LE */
8064 tls_set = TLS_EXPLICIT;
8065 tls_clear = TLS_LD;
8066 }
8067 break;
8068
8069 default:
8070 continue;
8071 }
8072
8073 if (pass == 0)
8074 {
727fc41e 8075 if (!expecting_tls_get_addr
9737e8af 8076 || !sec->nomark_tls_get_addr)
102890f0
AM
8077 continue;
8078
3a71aa26
AM
8079 if (rel + 1 < relend
8080 && branch_reloc_hash_match (ibfd, rel + 1,
8081 htab->tls_get_addr,
8082 htab->tls_get_addr_fd))
102890f0 8083 {
3a71aa26 8084 if (expecting_tls_get_addr == 2)
102890f0 8085 {
3a71aa26 8086 /* Check for toc tls entries. */
f961d9dd 8087 unsigned char *toc_tls;
3a71aa26
AM
8088 int retval;
8089
8090 retval = get_tls_mask (&toc_tls, NULL, NULL,
8091 &locsyms,
8092 rel, ibfd);
8093 if (retval == 0)
8094 goto err_free_rel;
663a1470
AM
8095 if (toc_tls != NULL)
8096 {
37da22e5
AM
8097 if ((*toc_tls & TLS_TLS) != 0
8098 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0))
663a1470
AM
8099 found_tls_get_addr_arg = 1;
8100 if (retval > 1)
8101 toc_ref[toc_ref_index] = 1;
8102 }
102890f0 8103 }
3a71aa26 8104 continue;
102890f0
AM
8105 }
8106
102890f0
AM
8107 /* Uh oh, we didn't find the expected call. We
8108 could just mark this symbol to exclude it
8109 from tls optimization but it's safer to skip
663a1470 8110 the entire optimization. */
695344c0 8111 /* xgettext:c-format */
25f53a85 8112 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8113 "TLS optimization disabled\n"),
8114 ibfd, sec, rel->r_offset);
8115 ret = TRUE;
8116 goto err_free_rel;
102890f0
AM
8117 }
8118
37da22e5
AM
8119 /* If we don't have old-style __tls_get_addr calls
8120 without TLSGD/TLSLD marker relocs, and we haven't
8121 found a new-style __tls_get_addr call with a
8122 marker for this symbol, then we either have a
8123 broken object file or an -mlongcall style
8124 indirect call to __tls_get_addr without a marker.
8125 Disable optimization in this case. */
8126 if ((tls_clear & (TLS_GD | TLS_LD)) != 0
8127 && (tls_set & TLS_EXPLICIT) == 0
9737e8af 8128 && !sec->nomark_tls_get_addr
37da22e5
AM
8129 && ((*tls_mask & (TLS_TLS | TLS_MARK))
8130 != (TLS_TLS | TLS_MARK)))
8131 continue;
8132
7d04a20a 8133 if (expecting_tls_get_addr == 1 + !sec->nomark_tls_get_addr)
102890f0 8134 {
23cedd1d
AM
8135 struct plt_entry *ent = NULL;
8136
8137 if (htab->tls_get_addr != NULL)
8138 for (ent = htab->tls_get_addr->elf.plt.plist;
8139 ent != NULL;
8140 ent = ent->next)
8141 if (ent->addend == 0)
102890f0 8142 break;
411e1bfb 8143
23cedd1d
AM
8144 if (ent == NULL && htab->tls_get_addr_fd != NULL)
8145 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8146 ent != NULL;
8147 ent = ent->next)
8148 if (ent->addend == 0)
102890f0 8149 break;
23cedd1d
AM
8150
8151 if (ent != NULL
8152 && ent->plt.refcount > 0)
8153 ent->plt.refcount -= 1;
102890f0 8154 }
411e1bfb 8155
102890f0 8156 if (tls_clear == 0)
30038c59
AM
8157 continue;
8158
102890f0
AM
8159 if ((tls_set & TLS_EXPLICIT) == 0)
8160 {
8161 struct got_entry *ent;
411e1bfb 8162
102890f0
AM
8163 /* Adjust got entry for this reloc. */
8164 if (h != NULL)
8165 ent = h->got.glist;
8166 else
8167 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 8168
102890f0
AM
8169 for (; ent != NULL; ent = ent->next)
8170 if (ent->addend == rel->r_addend
8171 && ent->owner == ibfd
8172 && ent->tls_type == tls_type)
8173 break;
8174 if (ent == NULL)
8175 abort ();
411e1bfb 8176
102890f0
AM
8177 if (tls_set == 0)
8178 {
8179 /* We managed to get rid of a got entry. */
8180 if (ent->got.refcount > 0)
8181 ent->got.refcount -= 1;
8182 }
8183 }
8184 else
8185 {
8186 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8187 we'll lose one or two dyn relocs. */
8188 if (!dec_dynrel_count (rel->r_info, sec, info,
19e08130 8189 NULL, h, sym))
102890f0 8190 return FALSE;
411e1bfb 8191
102890f0
AM
8192 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8193 {
8194 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
19e08130 8195 NULL, h, sym))
102890f0
AM
8196 return FALSE;
8197 }
8198 }
411e1bfb 8199
46e9995a 8200 *tls_mask |= tls_set & 0xff;
102890f0
AM
8201 *tls_mask &= ~tls_clear;
8202 }
8c1d1bb8 8203
102890f0
AM
8204 if (elf_section_data (sec)->relocs != relstart)
8205 free (relstart);
8206 }
411e1bfb 8207
663a1470
AM
8208 if (locsyms != NULL
8209 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8210 {
8211 if (!info->keep_memory)
8212 free (locsyms);
8213 else
8214 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8215 }
8216 }
411e1bfb 8217
663a1470
AM
8218 if (toc_ref != NULL)
8219 free (toc_ref);
9a23f96e 8220 htab->do_tls_opt = 1;
b34976b6 8221 return TRUE;
1e2f5b6e 8222}
b34976b6 8223
c5614fa4
AM
8224/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8225 the values of any global symbols in a toc section that has been
8226 edited. Globals in toc sections should be a rarity, so this function
8227 sets a flag if any are found in toc sections other than the one just
de194d85 8228 edited, so that further hash table traversals can be avoided. */
c5614fa4
AM
8229
8230struct adjust_toc_info
8231{
8232 asection *toc;
8233 unsigned long *skip;
8234 bfd_boolean global_toc_syms;
8235};
8236
ba761f19
AM
8237enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8238
c5614fa4
AM
8239static bfd_boolean
8240adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8241{
8242 struct ppc_link_hash_entry *eh;
8243 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 8244 unsigned long i;
c5614fa4 8245
c5614fa4
AM
8246 if (h->root.type != bfd_link_hash_defined
8247 && h->root.type != bfd_link_hash_defweak)
8248 return TRUE;
8249
ed7007c1 8250 eh = ppc_elf_hash_entry (h);
c5614fa4
AM
8251 if (eh->adjust_done)
8252 return TRUE;
8253
8254 if (eh->elf.root.u.def.section == toc_inf->toc)
8255 {
854b41e7
AM
8256 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8257 i = toc_inf->toc->rawsize >> 3;
c5614fa4 8258 else
854b41e7
AM
8259 i = eh->elf.root.u.def.value >> 3;
8260
ba761f19 8261 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4 8262 {
4eca0228 8263 _bfd_error_handler
854b41e7
AM
8264 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8265 do
8266 ++i;
ba761f19 8267 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 8268 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 8269 }
854b41e7
AM
8270
8271 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
8272 eh->adjust_done = 1;
8273 }
8274 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8275 toc_inf->global_toc_syms = TRUE;
8276
8277 return TRUE;
8278}
8279
39eeab25
AM
8280/* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8281 on a _LO variety toc/got reloc. */
560c8763
AM
8282
8283static bfd_boolean
39eeab25 8284ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
560c8763 8285{
2365f8d7
AM
8286 return ((insn & (0x3fu << 26)) == 12u << 26 /* addic */
8287 || (insn & (0x3fu << 26)) == 14u << 26 /* addi */
8288 || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */
8289 || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */
8290 || (insn & (0x3fu << 26)) == 36u << 26 /* stw */
8291 || (insn & (0x3fu << 26)) == 38u << 26 /* stb */
8292 || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */
8293 || (insn & (0x3fu << 26)) == 42u << 26 /* lha */
8294 || (insn & (0x3fu << 26)) == 44u << 26 /* sth */
8295 || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */
8296 || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */
8297 || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */
8298 || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */
8299 || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */
8300 || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */
8301 || (insn & (0x3fu << 26)) == 56u << 26 /* lq,lfq */
8302 || ((insn & (0x3fu << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
39eeab25
AM
8303 /* Exclude lfqu by testing reloc. If relocs are ever
8304 defined for the reduced D field in psq_lu then those
8305 will need testing too. */
8306 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8307 || ((insn & (0x3fu << 26)) == 58u << 26 /* ld,lwa */
39eeab25 8308 && (insn & 1) == 0)
2365f8d7
AM
8309 || (insn & (0x3fu << 26)) == 60u << 26 /* stfq */
8310 || ((insn & (0x3fu << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
39eeab25
AM
8311 /* Exclude stfqu. psq_stu as above for psq_lu. */
8312 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8313 || ((insn & (0x3fu << 26)) == 62u << 26 /* std,stq */
39eeab25 8314 && (insn & 1) == 0));
560c8763
AM
8315}
8316
4a421c53
AM
8317/* PCREL_OPT in one instance flags to the linker that a pair of insns:
8318 pld ra,symbol@got@pcrel
dd9b12c2 8319 load/store rt,off(ra)
4a421c53 8320 or
d4b87b1e 8321 pla ra,symbol@pcrel
dd9b12c2 8322 load/store rt,off(ra)
4a421c53 8323 may be translated to
dd9b12c2 8324 pload/pstore rt,symbol+off@pcrel
4a421c53
AM
8325 nop.
8326 This function returns true if the optimization is possible, placing
dd9b12c2 8327 the prefix insn in *PINSN1, a NOP in *PINSN2 and the offset in *POFF.
4a421c53
AM
8328
8329 On entry to this function, the linker has already determined that
d4b87b1e 8330 the pld can be replaced with pla: *PINSN1 is that pla insn,
4a421c53
AM
8331 while *PINSN2 is the second instruction. */
8332
8333static bfd_boolean
dd9b12c2 8334xlate_pcrel_opt (uint64_t *pinsn1, uint64_t *pinsn2, bfd_signed_vma *poff)
4a421c53 8335{
77486630
AM
8336 uint64_t insn1 = *pinsn1;
8337 uint64_t insn2 = *pinsn2;
dd9b12c2 8338 bfd_signed_vma off;
4a421c53 8339
77486630
AM
8340 if ((insn2 & (63ULL << 58)) == 1ULL << 58)
8341 {
8342 /* Check that regs match. */
8343 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
8344 return FALSE;
8345
8346 /* P8LS or PMLS form, non-pcrel. */
8347 if ((insn2 & (-1ULL << 50) & ~(1ULL << 56)) != (1ULL << 58))
8348 return FALSE;
8349
8350 *pinsn1 = (insn2 & ~(31 << 16) & ~0x3ffff0000ffffULL) | (1ULL << 52);
8351 *pinsn2 = PNOP;
8352 off = ((insn2 >> 16) & 0x3ffff0000ULL) | (insn2 & 0xffff);
8353 *poff = (off ^ 0x200000000ULL) - 0x200000000ULL;
8354 return TRUE;
8355 }
8356
8357 insn2 >>= 32;
8358
4a421c53 8359 /* Check that regs match. */
77486630 8360 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
4a421c53
AM
8361 return FALSE;
8362
8363 switch ((insn2 >> 26) & 63)
8364 {
8365 default:
8366 return FALSE;
8367
8368 case 32: /* lwz */
8369 case 34: /* lbz */
8370 case 36: /* stw */
8371 case 38: /* stb */
8372 case 40: /* lhz */
8373 case 42: /* lha */
8374 case 44: /* sth */
8375 case 48: /* lfs */
8376 case 50: /* lfd */
8377 case 52: /* stfs */
8378 case 54: /* stfd */
8379 /* These are the PMLS cases, where we just need to tack a prefix
dd9b12c2 8380 on the insn. */
77486630 8381 insn1 = ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
4a421c53 8382 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8383 off = insn2 & 0xffff;
4a421c53
AM
8384 break;
8385
8386 case 58: /* lwa, ld */
dd9b12c2 8387 if ((insn2 & 1) != 0)
4a421c53 8388 return FALSE;
77486630 8389 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8390 | (insn2 & 2 ? 41ULL << 26 : 57ULL << 26)
8391 | (insn2 & (31ULL << 21)));
dd9b12c2 8392 off = insn2 & 0xfffc;
4a421c53
AM
8393 break;
8394
8395 case 57: /* lxsd, lxssp */
dd9b12c2 8396 if ((insn2 & 3) < 2)
4a421c53 8397 return FALSE;
77486630 8398 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8399 | ((40ULL | (insn2 & 3)) << 26)
8400 | (insn2 & (31ULL << 21)));
dd9b12c2 8401 off = insn2 & 0xfffc;
4a421c53
AM
8402 break;
8403
8404 case 61: /* stxsd, stxssp, lxv, stxv */
8405 if ((insn2 & 3) == 0)
8406 return FALSE;
8407 else if ((insn2 & 3) >= 2)
8408 {
77486630 8409 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8410 | ((44ULL | (insn2 & 3)) << 26)
8411 | (insn2 & (31ULL << 21)));
dd9b12c2 8412 off = insn2 & 0xfffc;
4a421c53
AM
8413 }
8414 else
8415 {
77486630 8416 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8417 | ((50ULL | (insn2 & 4) | ((insn2 & 8) >> 3)) << 26)
8418 | (insn2 & (31ULL << 21)));
dd9b12c2 8419 off = insn2 & 0xfff0;
4a421c53
AM
8420 }
8421 break;
8422
8423 case 56: /* lq */
77486630 8424 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53 8425 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8426 off = insn2 & 0xffff;
4a421c53
AM
8427 break;
8428
8429 case 62: /* std, stq */
dd9b12c2 8430 if ((insn2 & 1) != 0)
4a421c53 8431 return FALSE;
77486630 8432 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8433 | ((insn2 & 2) == 0 ? 61ULL << 26 : 60ULL << 26)
8434 | (insn2 & (31ULL << 21)));
dd9b12c2 8435 off = insn2 & 0xfffc;
4a421c53
AM
8436 break;
8437 }
8438
77486630 8439 *pinsn1 = insn1;
4a421c53 8440 *pinsn2 = (uint64_t) NOP << 32;
dd9b12c2 8441 *poff = (off ^ 0x8000) - 0x8000;
4a421c53
AM
8442 return TRUE;
8443}
8444
c5614fa4
AM
8445/* Examine all relocs referencing .toc sections in order to remove
8446 unused .toc entries. */
8447
8448bfd_boolean
33c0ec9d 8449ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
8450{
8451 bfd *ibfd;
8452 struct adjust_toc_info toc_inf;
67f0cbdb 8453 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 8454
67f0cbdb 8455 htab->do_toc_opt = 1;
c5614fa4 8456 toc_inf.global_toc_syms = TRUE;
c72f2fb2 8457 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
c5614fa4
AM
8458 {
8459 asection *toc, *sec;
8460 Elf_Internal_Shdr *symtab_hdr;
8461 Elf_Internal_Sym *local_syms;
425b145b 8462 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
8463 unsigned long *skip, *drop;
8464 unsigned char *used;
8465 unsigned char *keep, last, some_unused;
8466
854b41e7
AM
8467 if (!is_ppc64_elf (ibfd))
8468 continue;
8469
c5614fa4
AM
8470 toc = bfd_get_section_by_name (ibfd, ".toc");
8471 if (toc == NULL
92b7a70f 8472 || toc->size == 0
dbaa2011
AM
8473 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8474 || discarded_section (toc))
c5614fa4
AM
8475 continue;
8476
425b145b 8477 toc_relocs = NULL;
c5614fa4 8478 local_syms = NULL;
0ffa91dd 8479 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
8480
8481 /* Look at sections dropped from the final link. */
8482 skip = NULL;
8483 relstart = NULL;
8484 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8485 {
8486 if (sec->reloc_count == 0
dbaa2011 8487 || !discarded_section (sec)
c5614fa4
AM
8488 || get_opd_info (sec)
8489 || (sec->flags & SEC_ALLOC) == 0
8490 || (sec->flags & SEC_DEBUGGING) != 0)
8491 continue;
8492
8493 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8494 if (relstart == NULL)
8495 goto error_ret;
8496
8497 /* Run through the relocs to see which toc entries might be
8498 unused. */
8499 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8500 {
8501 enum elf_ppc64_reloc_type r_type;
8502 unsigned long r_symndx;
8503 asection *sym_sec;
8504 struct elf_link_hash_entry *h;
8505 Elf_Internal_Sym *sym;
8506 bfd_vma val;
8507
8508 r_type = ELF64_R_TYPE (rel->r_info);
8509 switch (r_type)
8510 {
8511 default:
8512 continue;
8513
8514 case R_PPC64_TOC16:
8515 case R_PPC64_TOC16_LO:
8516 case R_PPC64_TOC16_HI:
8517 case R_PPC64_TOC16_HA:
8518 case R_PPC64_TOC16_DS:
8519 case R_PPC64_TOC16_LO_DS:
8520 break;
8521 }
8522
8523 r_symndx = ELF64_R_SYM (rel->r_info);
8524 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8525 r_symndx, ibfd))
8526 goto error_ret;
8527
8528 if (sym_sec != toc)
8529 continue;
8530
8531 if (h != NULL)
8532 val = h->root.u.def.value;
8533 else
8534 val = sym->st_value;
8535 val += rel->r_addend;
8536
8537 if (val >= toc->size)
8538 continue;
8539
8540 /* Anything in the toc ought to be aligned to 8 bytes.
8541 If not, don't mark as unused. */
8542 if (val & 7)
8543 continue;
8544
8545 if (skip == NULL)
8546 {
854b41e7 8547 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
8548 if (skip == NULL)
8549 goto error_ret;
8550 }
8551
ba761f19 8552 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
8553 }
8554
8555 if (elf_section_data (sec)->relocs != relstart)
8556 free (relstart);
8557 }
8558
ba761f19
AM
8559 /* For largetoc loads of address constants, we can convert
8560 . addis rx,2,addr@got@ha
8561 . ld ry,addr@got@l(rx)
8562 to
8563 . addis rx,2,addr@toc@ha
8564 . addi ry,rx,addr@toc@l
8565 when addr is within 2G of the toc pointer. This then means
8566 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 8567
ba761f19
AM
8568 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8569 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8570 && toc->reloc_count != 0)
8571 {
8572 /* Read toc relocs. */
425b145b
AM
8573 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8574 info->keep_memory);
8575 if (toc_relocs == NULL)
ba761f19
AM
8576 goto error_ret;
8577
425b145b 8578 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
8579 {
8580 enum elf_ppc64_reloc_type r_type;
8581 unsigned long r_symndx;
8582 asection *sym_sec;
8583 struct elf_link_hash_entry *h;
8584 Elf_Internal_Sym *sym;
8585 bfd_vma val, addr;
8586
8587 r_type = ELF64_R_TYPE (rel->r_info);
8588 if (r_type != R_PPC64_ADDR64)
8589 continue;
8590
8591 r_symndx = ELF64_R_SYM (rel->r_info);
8592 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8593 r_symndx, ibfd))
8594 goto error_ret;
8595
425b145b 8596 if (sym_sec == NULL
c27b8c2a 8597 || sym_sec->output_section == NULL
dbaa2011 8598 || discarded_section (sym_sec))
425b145b
AM
8599 continue;
8600
afe397ea 8601 if (!SYMBOL_REFERENCES_LOCAL (info, h))
ba761f19
AM
8602 continue;
8603
8604 if (h != NULL)
bddc25c9
AM
8605 {
8606 if (h->type == STT_GNU_IFUNC)
8607 continue;
8608 val = h->root.u.def.value;
8609 }
ba761f19 8610 else
bddc25c9
AM
8611 {
8612 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8613 continue;
8614 val = sym->st_value;
8615 }
ba761f19
AM
8616 val += rel->r_addend;
8617 val += sym_sec->output_section->vma + sym_sec->output_offset;
8618
8619 /* We don't yet know the exact toc pointer value, but we
8620 know it will be somewhere in the toc section. Don't
8621 optimize if the difference from any possible toc
8622 pointer is outside [ff..f80008000, 7fff7fff]. */
8623 addr = toc->output_section->vma + TOC_BASE_OFF;
8624 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8625 continue;
8626
8627 addr = toc->output_section->vma + toc->output_section->rawsize;
8628 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8629 continue;
8630
8631 if (skip == NULL)
8632 {
8633 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8634 if (skip == NULL)
8635 goto error_ret;
8636 }
8637
8638 skip[rel->r_offset >> 3]
425b145b 8639 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 8640 }
ba761f19
AM
8641 }
8642
c5614fa4
AM
8643 if (skip == NULL)
8644 continue;
8645
8646 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8647 if (used == NULL)
8648 {
8649 error_ret:
8650 if (local_syms != NULL
8651 && symtab_hdr->contents != (unsigned char *) local_syms)
8652 free (local_syms);
8653 if (sec != NULL
8654 && relstart != NULL
8655 && elf_section_data (sec)->relocs != relstart)
8656 free (relstart);
425b145b
AM
8657 if (toc_relocs != NULL
8658 && elf_section_data (toc)->relocs != toc_relocs)
8659 free (toc_relocs);
c5614fa4
AM
8660 if (skip != NULL)
8661 free (skip);
8662 return FALSE;
8663 }
8664
30038c59
AM
8665 /* Now check all kept sections that might reference the toc.
8666 Check the toc itself last. */
8667 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8668 : ibfd->sections);
c5614fa4 8669 sec != NULL;
c5614fa4 8670 sec = (sec == toc ? NULL
c5614fa4 8671 : sec->next == NULL ? toc
30038c59 8672 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
8673 : sec->next))
8674 {
8675 int repeat;
8676
8677 if (sec->reloc_count == 0
dbaa2011 8678 || discarded_section (sec)
c5614fa4
AM
8679 || get_opd_info (sec)
8680 || (sec->flags & SEC_ALLOC) == 0
8681 || (sec->flags & SEC_DEBUGGING) != 0)
8682 continue;
8683
854b41e7
AM
8684 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8685 info->keep_memory);
c5614fa4 8686 if (relstart == NULL)
2915c55b
JK
8687 {
8688 free (used);
8689 goto error_ret;
8690 }
c5614fa4
AM
8691
8692 /* Mark toc entries referenced as used. */
c5614fa4 8693 do
d4f1ee75
AM
8694 {
8695 repeat = 0;
8696 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8697 {
8698 enum elf_ppc64_reloc_type r_type;
8699 unsigned long r_symndx;
8700 asection *sym_sec;
8701 struct elf_link_hash_entry *h;
8702 Elf_Internal_Sym *sym;
8703 bfd_vma val;
98528052 8704
d4f1ee75 8705 r_type = ELF64_R_TYPE (rel->r_info);
d4f1ee75
AM
8706 switch (r_type)
8707 {
8708 case R_PPC64_TOC16:
8709 case R_PPC64_TOC16_LO:
8710 case R_PPC64_TOC16_HI:
8711 case R_PPC64_TOC16_HA:
8712 case R_PPC64_TOC16_DS:
8713 case R_PPC64_TOC16_LO_DS:
8714 /* In case we're taking addresses of toc entries. */
8715 case R_PPC64_ADDR64:
8716 break;
c5614fa4 8717
d4f1ee75
AM
8718 default:
8719 continue;
8720 }
c5614fa4 8721
d4f1ee75
AM
8722 r_symndx = ELF64_R_SYM (rel->r_info);
8723 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8724 r_symndx, ibfd))
8725 {
8726 free (used);
8727 goto error_ret;
8728 }
c5614fa4 8729
d4f1ee75
AM
8730 if (sym_sec != toc)
8731 continue;
c5614fa4 8732
d4f1ee75
AM
8733 if (h != NULL)
8734 val = h->root.u.def.value;
8735 else
8736 val = sym->st_value;
8737 val += rel->r_addend;
ba761f19 8738
d4f1ee75
AM
8739 if (val >= toc->size)
8740 continue;
ba761f19 8741
d4f1ee75
AM
8742 if ((skip[val >> 3] & can_optimize) != 0)
8743 {
8744 bfd_vma off;
8745 unsigned char opc;
8746
8747 switch (r_type)
8748 {
8749 case R_PPC64_TOC16_HA:
ba761f19 8750 break;
ba761f19 8751
d4f1ee75
AM
8752 case R_PPC64_TOC16_LO_DS:
8753 off = rel->r_offset;
8754 off += (bfd_big_endian (ibfd) ? -2 : 3);
8755 if (!bfd_get_section_contents (ibfd, sec, &opc,
8756 off, 1))
8757 {
8758 free (used);
8759 goto error_ret;
8760 }
8761 if ((opc & (0x3f << 2)) == (58u << 2))
8762 break;
1a0670f3 8763 /* Fall through. */
ba761f19 8764
d4f1ee75
AM
8765 default:
8766 /* Wrong sort of reloc, or not a ld. We may
8767 as well clear ref_from_discarded too. */
8768 skip[val >> 3] = 0;
8769 }
8770 }
8771
8772 if (sec != toc)
8773 used[val >> 3] = 1;
8774 /* For the toc section, we only mark as used if this
8775 entry itself isn't unused. */
8776 else if ((used[rel->r_offset >> 3]
8777 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
8778 && !used[val >> 3])
8779 {
8780 /* Do all the relocs again, to catch reference
8781 chains. */
8782 repeat = 1;
8783 used[val >> 3] = 1;
8784 }
8785 }
8786 }
c5614fa4 8787 while (repeat);
854b41e7
AM
8788
8789 if (elf_section_data (sec)->relocs != relstart)
8790 free (relstart);
c5614fa4
AM
8791 }
8792
8793 /* Merge the used and skip arrays. Assume that TOC
8794 doublewords not appearing as either used or unused belong
de194d85 8795 to an entry more than one doubleword in size. */
c5614fa4
AM
8796 for (drop = skip, keep = used, last = 0, some_unused = 0;
8797 drop < skip + (toc->size + 7) / 8;
8798 ++drop, ++keep)
8799 {
8800 if (*keep)
8801 {
ba761f19
AM
8802 *drop &= ~ref_from_discarded;
8803 if ((*drop & can_optimize) != 0)
8804 some_unused = 1;
c5614fa4
AM
8805 last = 0;
8806 }
b140b010 8807 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
8808 {
8809 some_unused = 1;
ba761f19 8810 last = ref_from_discarded;
c5614fa4
AM
8811 }
8812 else
8813 *drop = last;
8814 }
8815
8816 free (used);
8817
8818 if (some_unused)
8819 {
8820 bfd_byte *contents, *src;
8821 unsigned long off;
d62b3684 8822 Elf_Internal_Sym *sym;
ba761f19 8823 bfd_boolean local_toc_syms = FALSE;
c5614fa4
AM
8824
8825 /* Shuffle the toc contents, and at the same time convert the
8826 skip array from booleans into offsets. */
8827 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8828 goto error_ret;
8829
8830 elf_section_data (toc)->this_hdr.contents = contents;
8831
8832 for (src = contents, off = 0, drop = skip;
8833 src < contents + toc->size;
8834 src += 8, ++drop)
8835 {
ba761f19
AM
8836 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
8837 off += 8;
c5614fa4
AM
8838 else if (off != 0)
8839 {
8840 *drop = off;
8841 memcpy (src - off, src, 8);
8842 }
8843 }
854b41e7 8844 *drop = off;
c5614fa4
AM
8845 toc->rawsize = toc->size;
8846 toc->size = src - contents - off;
8847
ba761f19
AM
8848 /* Adjust addends for relocs against the toc section sym,
8849 and optimize any accesses we can. */
c5614fa4
AM
8850 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8851 {
8852 if (sec->reloc_count == 0
dbaa2011 8853 || discarded_section (sec))
c5614fa4
AM
8854 continue;
8855
8856 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 8857 info->keep_memory);
c5614fa4
AM
8858 if (relstart == NULL)
8859 goto error_ret;
8860
8861 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8862 {
8863 enum elf_ppc64_reloc_type r_type;
8864 unsigned long r_symndx;
8865 asection *sym_sec;
8866 struct elf_link_hash_entry *h;
854b41e7 8867 bfd_vma val;
c5614fa4
AM
8868
8869 r_type = ELF64_R_TYPE (rel->r_info);
8870 switch (r_type)
8871 {
8872 default:
8873 continue;
8874
8875 case R_PPC64_TOC16:
8876 case R_PPC64_TOC16_LO:
8877 case R_PPC64_TOC16_HI:
8878 case R_PPC64_TOC16_HA:
8879 case R_PPC64_TOC16_DS:
8880 case R_PPC64_TOC16_LO_DS:
8881 case R_PPC64_ADDR64:
8882 break;
8883 }
8884
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 goto error_ret;
8889
ba761f19 8890 if (sym_sec != toc)
c5614fa4
AM
8891 continue;
8892
ba761f19
AM
8893 if (h != NULL)
8894 val = h->root.u.def.value;
8895 else
8896 {
8897 val = sym->st_value;
8898 if (val != 0)
8899 local_toc_syms = TRUE;
8900 }
8901
8902 val += rel->r_addend;
854b41e7
AM
8903
8904 if (val > toc->rawsize)
8905 val = toc->rawsize;
ba761f19
AM
8906 else if ((skip[val >> 3] & ref_from_discarded) != 0)
8907 continue;
8908 else if ((skip[val >> 3] & can_optimize) != 0)
8909 {
8910 Elf_Internal_Rela *tocrel
425b145b 8911 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
8912 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
8913
8914 switch (r_type)
8915 {
8916 case R_PPC64_TOC16_HA:
8917 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
8918 break;
8919
8920 case R_PPC64_TOC16_LO_DS:
8921 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
8922 break;
8923
8924 default:
28942f62
AM
8925 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
8926 ppc_howto_init ();
b140b010 8927 info->callbacks->einfo
695344c0 8928 /* xgettext:c-format */
174d0a74 8929 (_("%H: %s references "
b140b010
AM
8930 "optimized away TOC entry\n"),
8931 ibfd, sec, rel->r_offset,
8932 ppc64_elf_howto_table[r_type]->name);
8933 bfd_set_error (bfd_error_bad_value);
8934 goto error_ret;
ba761f19
AM
8935 }
8936 rel->r_addend = tocrel->r_addend;
8937 elf_section_data (sec)->relocs = relstart;
8938 continue;
8939 }
8940
8941 if (h != NULL || sym->st_value != 0)
8942 continue;
854b41e7
AM
8943
8944 rel->r_addend -= skip[val >> 3];
8945 elf_section_data (sec)->relocs = relstart;
c5614fa4 8946 }
854b41e7
AM
8947
8948 if (elf_section_data (sec)->relocs != relstart)
8949 free (relstart);
c5614fa4
AM
8950 }
8951
8952 /* We shouldn't have local or global symbols defined in the TOC,
8953 but handle them anyway. */
df22d223
AM
8954 if (local_syms != NULL)
8955 for (sym = local_syms;
8956 sym < local_syms + symtab_hdr->sh_info;
8957 ++sym)
8958 if (sym->st_value != 0
8959 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
8960 {
8961 unsigned long i;
854b41e7 8962
df22d223
AM
8963 if (sym->st_value > toc->rawsize)
8964 i = toc->rawsize >> 3;
8965 else
8966 i = sym->st_value >> 3;
854b41e7 8967
df22d223
AM
8968 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
8969 {
8970 if (local_toc_syms)
4eca0228 8971 _bfd_error_handler
df22d223
AM
8972 (_("%s defined on removed toc entry"),
8973 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
8974 do
8975 ++i;
8976 while ((skip[i] & (ref_from_discarded | can_optimize)));
8977 sym->st_value = (bfd_vma) i << 3;
8978 }
d62b3684 8979
df22d223
AM
8980 sym->st_value -= skip[i];
8981 symtab_hdr->contents = (unsigned char *) local_syms;
8982 }
c5614fa4 8983
854b41e7 8984 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
8985 if (toc_inf.global_toc_syms)
8986 {
8987 toc_inf.toc = toc;
8988 toc_inf.skip = skip;
8989 toc_inf.global_toc_syms = FALSE;
8990 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
8991 &toc_inf);
8992 }
854b41e7
AM
8993
8994 if (toc->reloc_count != 0)
8995 {
d4730f92 8996 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
8997 Elf_Internal_Rela *wrel;
8998 bfd_size_type sz;
8999
854b41e7 9000 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
9001 if (toc_relocs == NULL)
9002 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9003 info->keep_memory);
9004 if (toc_relocs == NULL)
9005 goto error_ret;
9006
425b145b
AM
9007 wrel = toc_relocs;
9008 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9009 if ((skip[rel->r_offset >> 3]
9010 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
9011 {
9012 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9013 wrel->r_info = rel->r_info;
9014 wrel->r_addend = rel->r_addend;
9015 ++wrel;
9016 }
9017 else if (!dec_dynrel_count (rel->r_info, toc, info,
9018 &local_syms, NULL, NULL))
9019 goto error_ret;
9020
425b145b
AM
9021 elf_section_data (toc)->relocs = toc_relocs;
9022 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
9023 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9024 sz = rel_hdr->sh_entsize;
9025 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9026 }
c5614fa4 9027 }
28be611c
AM
9028 else if (toc_relocs != NULL
9029 && elf_section_data (toc)->relocs != toc_relocs)
425b145b 9030 free (toc_relocs);
c5614fa4
AM
9031
9032 if (local_syms != NULL
9033 && symtab_hdr->contents != (unsigned char *) local_syms)
9034 {
9035 if (!info->keep_memory)
9036 free (local_syms);
9037 else
9038 symtab_hdr->contents = (unsigned char *) local_syms;
9039 }
9040 free (skip);
9041 }
9042
066f4018 9043 /* Look for cases where we can change an indirect GOT access to
4a421c53
AM
9044 a GOT relative or PC relative access, possibly reducing the
9045 number of GOT entries. */
066f4018
AM
9046 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9047 {
9048 asection *sec;
9049 Elf_Internal_Shdr *symtab_hdr;
9050 Elf_Internal_Sym *local_syms;
9051 Elf_Internal_Rela *relstart, *rel;
9052 bfd_vma got;
9053
9054 if (!is_ppc64_elf (ibfd))
9055 continue;
9056
903b777d 9057 if (!ppc64_elf_tdata (ibfd)->has_optrel)
066f4018
AM
9058 continue;
9059
9060 sec = ppc64_elf_tdata (ibfd)->got;
903b777d
AM
9061 got = 0;
9062 if (sec != NULL)
9063 got = sec->output_section->vma + sec->output_offset + 0x8000;
066f4018
AM
9064
9065 local_syms = NULL;
9066 symtab_hdr = &elf_symtab_hdr (ibfd);
9067
9068 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9069 {
9070 if (sec->reloc_count == 0
903b777d 9071 || !ppc64_elf_section_data (sec)->has_optrel
066f4018
AM
9072 || discarded_section (sec))
9073 continue;
9074
9075 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9076 info->keep_memory);
9077 if (relstart == NULL)
9078 {
9079 got_error_ret:
9080 if (local_syms != NULL
9081 && symtab_hdr->contents != (unsigned char *) local_syms)
9082 free (local_syms);
9083 if (sec != NULL
9084 && relstart != NULL
9085 && elf_section_data (sec)->relocs != relstart)
9086 free (relstart);
9087 return FALSE;
9088 }
9089
9090 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9091 {
9092 enum elf_ppc64_reloc_type r_type;
9093 unsigned long r_symndx;
9094 Elf_Internal_Sym *sym;
9095 asection *sym_sec;
9096 struct elf_link_hash_entry *h;
9097 struct got_entry *ent;
133a1f60 9098 bfd_vma val, pc;
4a421c53 9099 unsigned char buf[8];
066f4018 9100 unsigned int insn;
903b777d 9101 enum {no_check, check_lo, check_ha} insn_check;
066f4018
AM
9102
9103 r_type = ELF64_R_TYPE (rel->r_info);
903b777d
AM
9104 switch (r_type)
9105 {
9106 default:
9107 insn_check = no_check;
9108 break;
9109
9110 case R_PPC64_PLT16_HA:
9111 case R_PPC64_GOT_TLSLD16_HA:
9112 case R_PPC64_GOT_TLSGD16_HA:
9113 case R_PPC64_GOT_TPREL16_HA:
9114 case R_PPC64_GOT_DTPREL16_HA:
9115 case R_PPC64_GOT16_HA:
9116 case R_PPC64_TOC16_HA:
9117 insn_check = check_ha;
9118 break;
9119
9120 case R_PPC64_PLT16_LO:
9121 case R_PPC64_PLT16_LO_DS:
9122 case R_PPC64_GOT_TLSLD16_LO:
9123 case R_PPC64_GOT_TLSGD16_LO:
9124 case R_PPC64_GOT_TPREL16_LO_DS:
9125 case R_PPC64_GOT_DTPREL16_LO_DS:
9126 case R_PPC64_GOT16_LO:
9127 case R_PPC64_GOT16_LO_DS:
9128 case R_PPC64_TOC16_LO:
9129 case R_PPC64_TOC16_LO_DS:
9130 insn_check = check_lo;
9131 break;
9132 }
9133
9134 if (insn_check != no_check)
9135 {
9136 bfd_vma off = rel->r_offset & ~3;
9137
9138 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9139 goto got_error_ret;
9140
9141 insn = bfd_get_32 (ibfd, buf);
9142 if (insn_check == check_lo
9143 ? !ok_lo_toc_insn (insn, r_type)
2365f8d7 9144 : ((insn & ((0x3fu << 26) | 0x1f << 16))
903b777d
AM
9145 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9146 {
9147 char str[12];
9148
9149 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9150 sprintf (str, "%#08x", insn);
9151 info->callbacks->einfo
9152 /* xgettext:c-format */
9153 (_("%H: got/toc optimization is not supported for"
9154 " %s instruction\n"),
9155 ibfd, sec, rel->r_offset & ~3, str);
9156 continue;
9157 }
9158 }
9159
066f4018
AM
9160 switch (r_type)
9161 {
bb22a418
AM
9162 /* Note that we don't delete GOT entries for
9163 R_PPC64_GOT16_DS since we'd need a lot more
9164 analysis. For starters, the preliminary layout is
9165 before the GOT, PLT, dynamic sections and stubs are
9166 laid out. Then we'd need to allow for changes in
9167 distance between sections caused by alignment. */
066f4018
AM
9168 default:
9169 continue;
9170
066f4018
AM
9171 case R_PPC64_GOT16_HA:
9172 case R_PPC64_GOT16_LO_DS:
4a421c53 9173 case R_PPC64_GOT_PCREL34:
066f4018
AM
9174 break;
9175 }
9176
9177 r_symndx = ELF64_R_SYM (rel->r_info);
9178 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9179 r_symndx, ibfd))
9180 goto got_error_ret;
9181
6d5554a6
AM
9182 if (sym_sec == NULL
9183 || sym_sec->output_section == NULL
9184 || discarded_section (sym_sec))
9185 continue;
9186
066f4018
AM
9187 if (!SYMBOL_REFERENCES_LOCAL (info, h))
9188 continue;
9189
9190 if (h != NULL)
9191 val = h->root.u.def.value;
9192 else
9193 val = sym->st_value;
133a1f60 9194 val += rel->r_addend;
066f4018
AM
9195 val += sym_sec->output_section->vma + sym_sec->output_offset;
9196
bb22a418
AM
9197/* Fudge factor to allow for the fact that the preliminary layout
9198 isn't exact. Reduce limits by this factor. */
9199#define LIMIT_ADJUST(LIMIT) ((LIMIT) - (LIMIT) / 16)
9200
066f4018
AM
9201 switch (r_type)
9202 {
9203 default:
9204 continue;
9205
066f4018 9206 case R_PPC64_GOT16_HA:
bb22a418
AM
9207 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9208 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9209 continue;
9210
9211 if (!bfd_get_section_contents (ibfd, sec, buf,
9212 rel->r_offset & ~3, 4))
9213 goto got_error_ret;
9214 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9215 if (((insn & ((0x3fu << 26) | 0x1f << 16))
066f4018
AM
9216 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9217 continue;
9218 break;
9219
9220 case R_PPC64_GOT16_LO_DS:
bb22a418
AM
9221 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9222 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9223 continue;
9224 if (!bfd_get_section_contents (ibfd, sec, buf,
9225 rel->r_offset & ~3, 4))
9226 goto got_error_ret;
9227 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9228 if ((insn & (0x3fu << 26 | 0x3)) != 58u << 26 /* ld */)
066f4018
AM
9229 continue;
9230 break;
4a421c53
AM
9231
9232 case R_PPC64_GOT_PCREL34:
9233 pc = rel->r_offset;
9234 pc += sec->output_section->vma + sec->output_offset;
bb22a418
AM
9235 if (val - pc + LIMIT_ADJUST (1ULL << 33)
9236 >= LIMIT_ADJUST (1ULL << 34))
4a421c53
AM
9237 continue;
9238 if (!bfd_get_section_contents (ibfd, sec, buf,
9239 rel->r_offset & ~3, 8))
9240 goto got_error_ret;
9241 insn = bfd_get_32 (ibfd, buf);
9242 if ((insn & (-1u << 18)) != ((1u << 26) | (1u << 20)))
9243 continue;
9244 insn = bfd_get_32 (ibfd, buf + 4);
2365f8d7 9245 if ((insn & (0x3fu << 26)) != 57u << 26)
4a421c53
AM
9246 continue;
9247 break;
066f4018 9248 }
bb22a418 9249#undef LIMIT_ADJUST
066f4018
AM
9250
9251 if (h != NULL)
9252 ent = h->got.glist;
9253 else
9254 {
9255 struct got_entry **local_got_ents = elf_local_got_ents (ibfd);
9256 ent = local_got_ents[r_symndx];
9257 }
9258 for (; ent != NULL; ent = ent->next)
133a1f60 9259 if (ent->addend == rel->r_addend
066f4018
AM
9260 && ent->owner == ibfd
9261 && ent->tls_type == 0)
9262 break;
9263 BFD_ASSERT (ent && ent->got.refcount > 0);
9264 ent->got.refcount -= 1;
9265 }
9266
9267 if (elf_section_data (sec)->relocs != relstart)
9268 free (relstart);
9269 }
9270
9271 if (local_syms != NULL
9272 && symtab_hdr->contents != (unsigned char *) local_syms)
9273 {
9274 if (!info->keep_memory)
9275 free (local_syms);
9276 else
9277 symtab_hdr->contents = (unsigned char *) local_syms;
9278 }
9279 }
9280
c5614fa4
AM
9281 return TRUE;
9282}
9283
1bbe0902
AM
9284/* Return true iff input section I references the TOC using
9285 instructions limited to +/-32k offsets. */
9286
9287bfd_boolean
9288ppc64_elf_has_small_toc_reloc (asection *i)
9289{
9290 return (is_ppc64_elf (i->owner)
9291 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9292}
9293
927be08e
AM
9294/* Allocate space for one GOT entry. */
9295
9296static void
9297allocate_got (struct elf_link_hash_entry *h,
9298 struct bfd_link_info *info,
9299 struct got_entry *gent)
9300{
9301 struct ppc_link_hash_table *htab = ppc_hash_table (info);
ed7007c1 9302 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
927be08e
AM
9303 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9304 ? 16 : 8);
9305 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9306 ? 2 : 1) * sizeof (Elf64_External_Rela);
9307 asection *got = ppc64_elf_tdata (gent->owner)->got;
9308
9309 gent->got.offset = got->size;
9310 got->size += entsize;
9311
19e08130 9312 if (h->type == STT_GNU_IFUNC)
927be08e 9313 {
33e44f2e 9314 htab->elf.irelplt->size += rentsize;
19e08130 9315 htab->got_reli_size += rentsize;
927be08e 9316 }
f15d0b54 9317 else if (((bfd_link_pic (info)
f749f26e 9318 && !(gent->tls_type != 0
f15d0b54
AM
9319 && bfd_link_executable (info)
9320 && SYMBOL_REFERENCES_LOCAL (info, h)))
f0158f44
AM
9321 || (htab->elf.dynamic_sections_created
9322 && h->dynindx != -1
9323 && !SYMBOL_REFERENCES_LOCAL (info, h)))
21d68fcd 9324 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
927be08e 9325 {
19e08130 9326 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9327 relgot->size += rentsize;
927be08e
AM
9328 }
9329}
9330
7865406b
AM
9331/* This function merges got entries in the same toc group. */
9332
9333static void
9334merge_got_entries (struct got_entry **pent)
9335{
9336 struct got_entry *ent, *ent2;
9337
9338 for (ent = *pent; ent != NULL; ent = ent->next)
9339 if (!ent->is_indirect)
9340 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9341 if (!ent2->is_indirect
9342 && ent2->addend == ent->addend
9343 && ent2->tls_type == ent->tls_type
9344 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9345 {
9346 ent2->is_indirect = TRUE;
9347 ent2->got.ent = ent;
9348 }
9349}
9350
46434633 9351/* If H is undefined, make it dynamic if that makes sense. */
f0158f44
AM
9352
9353static bfd_boolean
46434633
AM
9354ensure_undef_dynamic (struct bfd_link_info *info,
9355 struct elf_link_hash_entry *h)
f0158f44
AM
9356{
9357 struct elf_link_hash_table *htab = elf_hash_table (info);
9358
9359 if (htab->dynamic_sections_created
46434633
AM
9360 && ((info->dynamic_undefined_weak != 0
9361 && h->root.type == bfd_link_hash_undefweak)
9362 || h->root.type == bfd_link_hash_undefined)
f0158f44
AM
9363 && h->dynindx == -1
9364 && !h->forced_local
9365 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9366 return bfd_elf_link_record_dynamic_symbol (info, h);
9367 return TRUE;
9368}
9369
65f38f15
AM
9370/* Allocate space in .plt, .got and associated reloc sections for
9371 dynamic relocs. */
5bd4f169 9372
b34976b6 9373static bfd_boolean
4ce794b7 9374allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9375{
65f38f15
AM
9376 struct bfd_link_info *info;
9377 struct ppc_link_hash_table *htab;
5bd4f169 9378 asection *s;
65f38f15 9379 struct ppc_link_hash_entry *eh;
0b8bcf0d 9380 struct got_entry **pgent, *gent;
5bd4f169 9381
e92d460e 9382 if (h->root.type == bfd_link_hash_indirect)
b34976b6 9383 return TRUE;
5bd4f169 9384
65f38f15
AM
9385 info = (struct bfd_link_info *) inf;
9386 htab = ppc_hash_table (info);
4dfe6ac6
NC
9387 if (htab == NULL)
9388 return FALSE;
5bd4f169 9389
ed7007c1 9390 eh = ppc_elf_hash_entry (h);
951fd09b
AM
9391 /* Run through the TLS GD got entries first if we're changing them
9392 to TPREL. */
b00a0a86 9393 if ((eh->tls_mask & (TLS_TLS | TLS_GDIE)) == (TLS_TLS | TLS_GDIE))
951fd09b
AM
9394 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9395 if (gent->got.refcount > 0
9396 && (gent->tls_type & TLS_GD) != 0)
9397 {
9398 /* This was a GD entry that has been converted to TPREL. If
9399 there happens to be a TPREL entry we can use that one. */
9400 struct got_entry *ent;
9401 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9402 if (ent->got.refcount > 0
9403 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9404 && ent->addend == gent->addend
9405 && ent->owner == gent->owner)
951fd09b
AM
9406 {
9407 gent->got.refcount = 0;
9408 break;
9409 }
9410
9411 /* If not, then we'll be using our own TPREL entry. */
9412 if (gent->got.refcount != 0)
9413 gent->tls_type = TLS_TLS | TLS_TPREL;
9414 }
9415
7865406b
AM
9416 /* Remove any list entry that won't generate a word in the GOT before
9417 we call merge_got_entries. Otherwise we risk merging to empty
9418 entries. */
0b8bcf0d
AM
9419 pgent = &h->got.glist;
9420 while ((gent = *pgent) != NULL)
411e1bfb 9421 if (gent->got.refcount > 0)
7865406b
AM
9422 {
9423 if ((gent->tls_type & TLS_LD) != 0
f749f26e 9424 && SYMBOL_REFERENCES_LOCAL (info, h))
7865406b
AM
9425 {
9426 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9427 *pgent = gent->next;
9428 }
9429 else
9430 pgent = &gent->next;
9431 }
9432 else
9433 *pgent = gent->next;
9434
9435 if (!htab->do_multi_toc)
9436 merge_got_entries (&h->got.glist);
9437
9438 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9439 if (!gent->is_indirect)
411e1bfb 9440 {
ec73ddcd
AM
9441 /* Ensure we catch all the cases where this symbol should
9442 be made dynamic. */
46434633 9443 if (!ensure_undef_dynamic (info, h))
f0158f44 9444 return FALSE;
65f38f15 9445
0c8d6e5c 9446 if (!is_ppc64_elf (gent->owner))
927be08e 9447 abort ();
0ffa91dd 9448
927be08e 9449 allocate_got (h, info, gent);
411e1bfb 9450 }
65f38f15 9451
954b63d4
AM
9452 /* If no dynamic sections we can't have dynamic relocs, except for
9453 IFUNCs which are handled even in static executables. */
8a2058b5
AM
9454 if (!htab->elf.dynamic_sections_created
9455 && h->type != STT_GNU_IFUNC)
9456 eh->dyn_relocs = NULL;
9457
529fe20e
AM
9458 /* Discard relocs on undefined symbols that must be local. */
9459 else if (h->root.type == bfd_link_hash_undefined
9460 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9461 eh->dyn_relocs = NULL;
9462
954b63d4
AM
9463 /* Also discard relocs on undefined weak syms with non-default
9464 visibility, or when dynamic_undefined_weak says so. */
21d68fcd 9465 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
954b63d4
AM
9466 eh->dyn_relocs = NULL;
9467
8a2058b5 9468 if (eh->dyn_relocs != NULL)
65f38f15 9469 {
8a2058b5
AM
9470 struct elf_dyn_relocs *p, **pp;
9471
57e7d118
AM
9472 /* In the shared -Bsymbolic case, discard space allocated for
9473 dynamic pc-relative relocs against symbols which turn out to
9474 be defined in regular objects. For the normal shared case,
9475 discard space for relocs that have become local due to symbol
9476 visibility changes. */
57e7d118 9477 if (bfd_link_pic (info))
65f38f15 9478 {
57e7d118
AM
9479 /* Relocs that use pc_count are those that appear on a call
9480 insn, or certain REL relocs (see must_be_dyn_reloc) that
9481 can be generated via assembly. We want calls to
9482 protected symbols to resolve directly to the function
9483 rather than going via the plt. If people want function
9484 pointer comparisons to work as expected then they should
9485 avoid writing weird assembly. */
9486 if (SYMBOL_CALLS_LOCAL (info, h))
9487 {
57e7d118
AM
9488 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9489 {
9490 p->count -= p->pc_count;
9491 p->pc_count = 0;
9492 if (p->count == 0)
9493 *pp = p->next;
9494 else
9495 pp = &p->next;
9496 }
9497 }
65f38f15 9498
954b63d4 9499 if (eh->dyn_relocs != NULL)
5bd4f169 9500 {
ec73ddcd
AM
9501 /* Ensure we catch all the cases where this symbol
9502 should be made dynamic. */
46434633 9503 if (!ensure_undef_dynamic (info, h))
f0158f44 9504 return FALSE;
5bd4f169 9505 }
65f38f15 9506 }
ec73ddcd
AM
9507
9508 /* For a fixed position executable, discard space for
9509 relocs against symbols which are not dynamic. */
9510 else if (h->type != STT_GNU_IFUNC)
57e7d118 9511 {
529fe20e
AM
9512 if (h->dynamic_adjusted
9513 && !h->def_regular
9514 && !ELF_COMMON_DEF_P (h))
f0158f44 9515 {
ec73ddcd
AM
9516 /* Ensure we catch all the cases where this symbol
9517 should be made dynamic. */
46434633 9518 if (!ensure_undef_dynamic (info, h))
f0158f44 9519 return FALSE;
dfbb6ac9 9520
ec73ddcd 9521 /* But if that didn't work out, discard dynamic relocs. */
f0158f44
AM
9522 if (h->dynindx == -1)
9523 eh->dyn_relocs = NULL;
9524 }
9525 else
8a2058b5 9526 eh->dyn_relocs = NULL;
57e7d118
AM
9527 }
9528
9529 /* Finally, allocate space. */
9530 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9531 {
9532 asection *sreloc = elf_section_data (p->sec)->sreloc;
9533 if (eh->elf.type == STT_GNU_IFUNC)
9534 sreloc = htab->elf.irelplt;
9535 sreloc->size += p->count * sizeof (Elf64_External_Rela);
dfbb6ac9 9536 }
65f38f15 9537 }
57e7d118 9538
2d7ad24e
AM
9539 /* We might need a PLT entry when the symbol
9540 a) is dynamic, or
9541 b) is an ifunc, or
9542 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
9543 d) has plt16 relocs and we are linking statically. */
9544 if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
9545 || h->type == STT_GNU_IFUNC
9546 || (h->needs_plt && h->dynamic_adjusted)
9547 || (h->needs_plt
9548 && h->def_regular
9549 && !htab->elf.dynamic_sections_created
3e04d765 9550 && !htab->can_convert_all_inline_plt
ed7007c1 9551 && (ppc_elf_hash_entry (h)->tls_mask
2d7ad24e 9552 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
65f38f15 9553 {
57e7d118
AM
9554 struct plt_entry *pent;
9555 bfd_boolean doneone = FALSE;
9556 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9557 if (pent->plt.refcount > 0)
9558 {
9559 if (!htab->elf.dynamic_sections_created
9560 || h->dynindx == -1)
9561 {
2d7ad24e
AM
9562 if (h->type == STT_GNU_IFUNC)
9563 {
9564 s = htab->elf.iplt;
9565 pent->plt.offset = s->size;
9566 s->size += PLT_ENTRY_SIZE (htab);
9567 s = htab->elf.irelplt;
9568 }
9569 else
9570 {
9571 s = htab->pltlocal;
9572 pent->plt.offset = s->size;
9573 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
9574 s = bfd_link_pic (info) ? htab->relpltlocal : NULL;
9575 }
57e7d118
AM
9576 }
9577 else
9578 {
9579 /* If this is the first .plt entry, make room for the special
9580 first entry. */
9581 s = htab->elf.splt;
9582 if (s->size == 0)
9583 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
65f38f15 9584
57e7d118 9585 pent->plt.offset = s->size;
65f38f15 9586
57e7d118
AM
9587 /* Make room for this entry. */
9588 s->size += PLT_ENTRY_SIZE (htab);
65f38f15 9589
57e7d118
AM
9590 /* Make room for the .glink code. */
9591 s = htab->glink;
9592 if (s->size == 0)
9e390558 9593 s->size += GLINK_PLTRESOLVE_SIZE (htab);
57e7d118
AM
9594 if (htab->opd_abi)
9595 {
9596 /* We need bigger stubs past index 32767. */
9e390558 9597 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4)
57e7d118
AM
9598 s->size += 4;
9599 s->size += 2*4;
9600 }
9601 else
9602 s->size += 4;
65f38f15 9603
57e7d118
AM
9604 /* We also need to make an entry in the .rela.plt section. */
9605 s = htab->elf.srelplt;
9606 }
2d7ad24e
AM
9607 if (s != NULL)
9608 s->size += sizeof (Elf64_External_Rela);
57e7d118
AM
9609 doneone = TRUE;
9610 }
9611 else
9612 pent->plt.offset = (bfd_vma) -1;
9613 if (!doneone)
9614 {
9615 h->plt.plist = NULL;
9616 h->needs_plt = 0;
9617 }
65f38f15 9618 }
57e7d118 9619 else
65f38f15 9620 {
57e7d118
AM
9621 h->plt.plist = NULL;
9622 h->needs_plt = 0;
65f38f15
AM
9623 }
9624
b34976b6 9625 return TRUE;
65f38f15
AM
9626}
9627
9e390558
AM
9628#define PPC_LO(v) ((v) & 0xffff)
9629#define PPC_HI(v) (((v) >> 16) & 0xffff)
9630#define PPC_HA(v) PPC_HI ((v) + 0x8000)
04bdff6a
AM
9631#define D34(v) \
9632 ((((v) & 0x3ffff0000ULL) << 16) | (v & 0xffff))
9633#define HA34(v) ((v + (1ULL << 33)) >> 34)
9e390558 9634
a345bc8d
AM
9635/* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9636 to set up space for global entry stubs. These are put in glink,
9637 after the branch table. */
65f38f15 9638
b34976b6 9639static bfd_boolean
a345bc8d 9640size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
65f38f15 9641{
a345bc8d
AM
9642 struct bfd_link_info *info;
9643 struct ppc_link_hash_table *htab;
9644 struct plt_entry *pent;
9e390558 9645 asection *s, *plt;
65f38f15 9646
a345bc8d
AM
9647 if (h->root.type == bfd_link_hash_indirect)
9648 return TRUE;
65f38f15 9649
a345bc8d
AM
9650 if (!h->pointer_equality_needed)
9651 return TRUE;
65f38f15 9652
a345bc8d
AM
9653 if (h->def_regular)
9654 return TRUE;
65f38f15 9655
a345bc8d
AM
9656 info = inf;
9657 htab = ppc_hash_table (info);
9658 if (htab == NULL)
9659 return FALSE;
9660
9e390558
AM
9661 s = htab->global_entry;
9662 plt = htab->elf.splt;
a345bc8d
AM
9663 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9664 if (pent->plt.offset != (bfd_vma) -1
9665 && pent->addend == 0)
9666 {
afe397ea
AM
9667 /* For ELFv2, if this symbol is not defined in a regular file
9668 and we are not generating a shared library or pie, then we
9669 need to define the symbol in the executable on a call stub.
9670 This is to avoid text relocations. */
9e390558
AM
9671 bfd_vma off, stub_align, stub_off, stub_size;
9672 unsigned int align_power;
9673
9674 stub_size = 16;
9675 stub_off = s->size;
9676 if (htab->params->plt_stub_align >= 0)
9677 align_power = htab->params->plt_stub_align;
9678 else
9679 align_power = -htab->params->plt_stub_align;
9680 /* Setting section alignment is delayed until we know it is
9681 non-empty. Otherwise the .text output section will be
9682 aligned at least to plt_stub_align even when no global
9683 entry stubs are needed. */
9684 if (s->alignment_power < align_power)
9685 s->alignment_power = align_power;
9686 stub_align = (bfd_vma) 1 << align_power;
9687 if (htab->params->plt_stub_align >= 0
9688 || ((((stub_off + stub_size - 1) & -stub_align)
9689 - (stub_off & -stub_align))
9690 > ((stub_size - 1) & -stub_align)))
9691 stub_off = (stub_off + stub_align - 1) & -stub_align;
9692 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
9693 off -= stub_off + s->output_offset + s->output_section->vma;
9694 /* Note that for --plt-stub-align negative we have a possible
9695 dependency between stub offset and size. Break that
9696 dependency by assuming the max stub size when calculating
9697 the stub offset. */
9698 if (PPC_HA (off) == 0)
9699 stub_size -= 4;
8a2058b5 9700 h->root.type = bfd_link_hash_defined;
afe397ea 9701 h->root.u.def.section = s;
9e390558
AM
9702 h->root.u.def.value = stub_off;
9703 s->size = stub_off + stub_size;
a345bc8d
AM
9704 break;
9705 }
9706 return TRUE;
9707}
9708
9709/* Set DF_TEXTREL if we find any dynamic relocs that apply to
9710 read-only sections. */
9711
9712static bfd_boolean
98bbb1b8 9713maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
a345bc8d 9714{
98bbb1b8
AM
9715 asection *sec;
9716
a345bc8d
AM
9717 if (h->root.type == bfd_link_hash_indirect)
9718 return TRUE;
9719
98bbb1b8
AM
9720 sec = readonly_dynrelocs (h);
9721 if (sec != NULL)
a345bc8d 9722 {
98bbb1b8
AM
9723 struct bfd_link_info *info = (struct bfd_link_info *) inf;
9724
9725 info->flags |= DF_TEXTREL;
2cdcc330
AM
9726 info->callbacks->minfo (_("%pB: dynamic relocation against `%pT'"
9727 " in read-only section `%pA'\n"),
9728 sec->owner, h->root.root.string, sec);
a345bc8d
AM
9729
9730 /* Not an error, just cut short the traversal. */
9731 return FALSE;
65f38f15 9732 }
b34976b6 9733 return TRUE;
65f38f15
AM
9734}
9735
9736/* Set the sizes of the dynamic sections. */
9737
b34976b6 9738static bfd_boolean
ee67d69a 9739ppc64_elf_size_dynamic_sections (bfd *output_bfd,
4ce794b7 9740 struct bfd_link_info *info)
65f38f15
AM
9741{
9742 struct ppc_link_hash_table *htab;
9743 bfd *dynobj;
9744 asection *s;
b34976b6 9745 bfd_boolean relocs;
65f38f15 9746 bfd *ibfd;
7865406b 9747 struct got_entry *first_tlsld;
65f38f15
AM
9748
9749 htab = ppc_hash_table (info);
4dfe6ac6
NC
9750 if (htab == NULL)
9751 return FALSE;
9752
65f38f15
AM
9753 dynobj = htab->elf.dynobj;
9754 if (dynobj == NULL)
9755 abort ();
9756
9757 if (htab->elf.dynamic_sections_created)
9758 {
9759 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 9760 if (bfd_link_executable (info) && !info->nointerp)
65f38f15 9761 {
3d4d4302 9762 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
9763 if (s == NULL)
9764 abort ();
eea6121a 9765 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
9766 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9767 }
9768 }
9769
9770 /* Set up .got offsets for local syms, and space for local dynamic
9771 relocs. */
c72f2fb2 9772 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
65f38f15 9773 {
411e1bfb
AM
9774 struct got_entry **lgot_ents;
9775 struct got_entry **end_lgot_ents;
e054468f
AM
9776 struct plt_entry **local_plt;
9777 struct plt_entry **end_local_plt;
f961d9dd 9778 unsigned char *lgot_masks;
65f38f15
AM
9779 bfd_size_type locsymcount;
9780 Elf_Internal_Shdr *symtab_hdr;
65f38f15 9781
0c8d6e5c 9782 if (!is_ppc64_elf (ibfd))
65f38f15
AM
9783 continue;
9784
9785 for (s = ibfd->sections; s != NULL; s = s->next)
9786 {
19e08130 9787 struct ppc_dyn_relocs *p;
65f38f15 9788
6edfbbad 9789 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 9790 {
ec338859
AM
9791 if (!bfd_is_abs_section (p->sec)
9792 && bfd_is_abs_section (p->sec->output_section))
9793 {
9794 /* Input section has been discarded, either because
9795 it is a copy of a linkonce section or due to
9796 linker script /DISCARD/, so we'll be discarding
9797 the relocs too. */
9798 }
248866a8 9799 else if (p->count != 0)
ec338859 9800 {
19e08130
AM
9801 asection *srel = elf_section_data (p->sec)->sreloc;
9802 if (p->ifunc)
33e44f2e 9803 srel = htab->elf.irelplt;
eea6121a 9804 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
9805 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9806 info->flags |= DF_TEXTREL;
ec338859 9807 }
65f38f15
AM
9808 }
9809 }
9810
411e1bfb
AM
9811 lgot_ents = elf_local_got_ents (ibfd);
9812 if (!lgot_ents)
65f38f15
AM
9813 continue;
9814
0ffa91dd 9815 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 9816 locsymcount = symtab_hdr->sh_info;
411e1bfb 9817 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
9818 local_plt = (struct plt_entry **) end_lgot_ents;
9819 end_local_plt = local_plt + locsymcount;
f961d9dd 9820 lgot_masks = (unsigned char *) end_local_plt;
e717da7e 9821 s = ppc64_elf_tdata (ibfd)->got;
e7b938ca 9822 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 9823 {
0b8bcf0d 9824 struct got_entry **pent, *ent;
411e1bfb 9825
0b8bcf0d
AM
9826 pent = lgot_ents;
9827 while ((ent = *pent) != NULL)
411e1bfb
AM
9828 if (ent->got.refcount > 0)
9829 {
e7b938ca 9830 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 9831 {
927be08e 9832 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 9833 *pent = ent->next;
411e1bfb
AM
9834 }
9835 else
9836 {
19e08130
AM
9837 unsigned int ent_size = 8;
9838 unsigned int rel_size = sizeof (Elf64_External_Rela);
9839
eea6121a 9840 ent->got.offset = s->size;
e7b938ca 9841 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 9842 {
19e08130
AM
9843 ent_size *= 2;
9844 rel_size *= 2;
9845 }
9846 s->size += ent_size;
37da22e5 9847 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 9848 {
33e44f2e 9849 htab->elf.irelplt->size += rel_size;
19e08130
AM
9850 htab->got_reli_size += rel_size;
9851 }
93370e8e
AM
9852 else if (bfd_link_pic (info)
9853 && !(ent->tls_type != 0
9854 && bfd_link_executable (info)))
19e08130
AM
9855 {
9856 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9857 srel->size += rel_size;
927be08e 9858 }
0b8bcf0d 9859 pent = &ent->next;
411e1bfb
AM
9860 }
9861 }
9862 else
0b8bcf0d 9863 *pent = ent->next;
65f38f15 9864 }
e054468f 9865
2d7ad24e
AM
9866 /* Allocate space for plt calls to local syms. */
9867 lgot_masks = (unsigned char *) end_local_plt;
9868 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
e054468f
AM
9869 {
9870 struct plt_entry *ent;
9871
9872 for (ent = *local_plt; ent != NULL; ent = ent->next)
9873 if (ent->plt.refcount > 0)
9874 {
2d7ad24e
AM
9875 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
9876 {
9877 s = htab->elf.iplt;
9878 ent->plt.offset = s->size;
9879 s->size += PLT_ENTRY_SIZE (htab);
9880 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
9881 }
3e04d765
AM
9882 else if (htab->can_convert_all_inline_plt
9883 || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
2d7ad24e
AM
9884 ent->plt.offset = (bfd_vma) -1;
9885 else
9886 {
9887 s = htab->pltlocal;
9888 ent->plt.offset = s->size;
9889 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
9890 if (bfd_link_pic (info))
9891 htab->relpltlocal->size += sizeof (Elf64_External_Rela);
9892 }
e054468f
AM
9893 }
9894 else
9895 ent->plt.offset = (bfd_vma) -1;
9896 }
65f38f15
AM
9897 }
9898
9899 /* Allocate global sym .plt and .got entries, and space for global
9900 sym dynamic relocs. */
4ce794b7 9901 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
a345bc8d 9902
0e1862bb 9903 if (!htab->opd_abi && !bfd_link_pic (info))
a345bc8d 9904 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
65f38f15 9905
7865406b 9906 first_tlsld = NULL;
c72f2fb2 9907 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
102890f0 9908 {
7865406b
AM
9909 struct got_entry *ent;
9910
0c8d6e5c 9911 if (!is_ppc64_elf (ibfd))
102890f0
AM
9912 continue;
9913
7865406b
AM
9914 ent = ppc64_tlsld_got (ibfd);
9915 if (ent->got.refcount > 0)
102890f0 9916 {
7865406b 9917 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 9918 {
7865406b
AM
9919 ent->is_indirect = TRUE;
9920 ent->got.ent = first_tlsld;
9921 }
9922 else
9923 {
9924 if (first_tlsld == NULL)
9925 first_tlsld = ent;
9926 s = ppc64_elf_tdata (ibfd)->got;
9927 ent->got.offset = s->size;
9928 ent->owner = ibfd;
9929 s->size += 16;
f749f26e 9930 if (bfd_link_dll (info))
7865406b
AM
9931 {
9932 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9933 srel->size += sizeof (Elf64_External_Rela);
9934 }
102890f0
AM
9935 }
9936 }
9937 else
7865406b 9938 ent->got.offset = (bfd_vma) -1;
102890f0
AM
9939 }
9940
65f38f15
AM
9941 /* We now have determined the sizes of the various dynamic sections.
9942 Allocate memory for them. */
b34976b6 9943 relocs = FALSE;
65f38f15
AM
9944 for (s = dynobj->sections; s != NULL; s = s->next)
9945 {
9946 if ((s->flags & SEC_LINKER_CREATED) == 0)
9947 continue;
9948
4ce794b7 9949 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
9950 /* These haven't been allocated yet; don't strip. */
9951 continue;
33e44f2e
AM
9952 else if (s == htab->elf.sgot
9953 || s == htab->elf.splt
9954 || s == htab->elf.iplt
2d7ad24e 9955 || s == htab->pltlocal
c456f082 9956 || s == htab->glink
9e390558 9957 || s == htab->global_entry
5474d94f
AM
9958 || s == htab->elf.sdynbss
9959 || s == htab->elf.sdynrelro)
65f38f15
AM
9960 {
9961 /* Strip this section if we don't need it; see the
9962 comment below. */
5bd4f169 9963 }
58d180e8
AM
9964 else if (s == htab->glink_eh_frame)
9965 {
9966 if (!bfd_is_abs_section (s->output_section))
9967 /* Not sized yet. */
9968 continue;
9969 }
70cc837d 9970 else if (CONST_STRNEQ (s->name, ".rela"))
5bd4f169 9971 {
c456f082 9972 if (s->size != 0)
5bd4f169 9973 {
33e44f2e 9974 if (s != htab->elf.srelplt)
b34976b6 9975 relocs = TRUE;
5bd4f169
AM
9976
9977 /* We use the reloc_count field as a counter if we need
9978 to copy relocs into the output file. */
9979 s->reloc_count = 0;
9980 }
9981 }
65f38f15 9982 else
5bd4f169
AM
9983 {
9984 /* It's not one of our sections, so don't allocate space. */
9985 continue;
9986 }
9987
eea6121a 9988 if (s->size == 0)
5bd4f169 9989 {
c456f082
AM
9990 /* If we don't need this section, strip it from the
9991 output file. This is mostly to handle .rela.bss and
9992 .rela.plt. We must create both sections in
9993 create_dynamic_sections, because they must be created
9994 before the linker maps input sections to output
9995 sections. The linker does that before
9996 adjust_dynamic_symbol is called, and it is that
9997 function which decides whether anything needs to go
9998 into these sections. */
8423293d 9999 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
10000 continue;
10001 }
10002
06bcf541
AM
10003 if (bfd_is_abs_section (s->output_section))
10004 _bfd_error_handler (_("warning: discarding dynamic section %s"),
10005 s->name);
10006
c456f082 10007 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
10008 continue;
10009
65f38f15
AM
10010 /* Allocate memory for the section contents. We use bfd_zalloc
10011 here in case unused entries are not reclaimed before the
10012 section's contents are written out. This should not happen,
411e1bfb
AM
10013 but this way if it does we get a R_PPC64_NONE reloc in .rela
10014 sections instead of garbage.
10015 We also rely on the section contents being zero when writing
5474d94f 10016 the GOT and .dynrelro. */
eea6121a 10017 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 10018 if (s->contents == NULL)
b34976b6 10019 return FALSE;
5bd4f169
AM
10020 }
10021
c72f2fb2 10022 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
e717da7e 10023 {
0c8d6e5c 10024 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
10025 continue;
10026
e717da7e 10027 s = ppc64_elf_tdata (ibfd)->got;
33e44f2e 10028 if (s != NULL && s != htab->elf.sgot)
e717da7e 10029 {
eea6121a 10030 if (s->size == 0)
8423293d 10031 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10032 else
10033 {
eea6121a 10034 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10035 if (s->contents == NULL)
10036 return FALSE;
10037 }
10038 }
10039 s = ppc64_elf_tdata (ibfd)->relgot;
10040 if (s != NULL)
10041 {
eea6121a 10042 if (s->size == 0)
8423293d 10043 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10044 else
10045 {
eea6121a 10046 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10047 if (s->contents == NULL)
10048 return FALSE;
10049 relocs = TRUE;
10050 s->reloc_count = 0;
10051 }
10052 }
10053 }
10054
e86ce104 10055 if (htab->elf.dynamic_sections_created)
5bd4f169 10056 {
e8910a83
AM
10057 bfd_boolean tls_opt;
10058
5bd4f169
AM
10059 /* Add some entries to the .dynamic section. We fill in the
10060 values later, in ppc64_elf_finish_dynamic_sections, but we
10061 must add the entries now so that we get the correct size for
10062 the .dynamic section. The DT_DEBUG entry is filled in by the
10063 dynamic linker and used by the debugger. */
dc810e39 10064#define add_dynamic_entry(TAG, VAL) \
5a580b3a 10065 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 10066
0e1862bb 10067 if (bfd_link_executable (info))
5bd4f169 10068 {
dc810e39 10069 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 10070 return FALSE;
5bd4f169
AM
10071 }
10072
33e44f2e 10073 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5bd4f169 10074 {
dc810e39
AM
10075 if (!add_dynamic_entry (DT_PLTGOT, 0)
10076 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10077 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
10078 || !add_dynamic_entry (DT_JMPREL, 0)
10079 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 10080 return FALSE;
5bd4f169
AM
10081 }
10082
ee67d69a 10083 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
10084 {
10085 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10086 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 10087 return FALSE;
19397422
AM
10088 }
10089
7c9cf415 10090 tls_opt = (htab->params->tls_get_addr_opt
e8910a83
AM
10091 && htab->tls_get_addr_fd != NULL
10092 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
10093 if (tls_opt || !htab->opd_abi)
10094 {
10095 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10096 return FALSE;
10097 }
a7f2871e 10098
5bd4f169
AM
10099 if (relocs)
10100 {
dc810e39
AM
10101 if (!add_dynamic_entry (DT_RELA, 0)
10102 || !add_dynamic_entry (DT_RELASZ, 0)
10103 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 10104 return FALSE;
5bd4f169 10105
65f38f15
AM
10106 /* If any dynamic relocs apply to a read-only section,
10107 then we need a DT_TEXTREL entry. */
248866a8 10108 if ((info->flags & DF_TEXTREL) == 0)
a345bc8d 10109 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
5bd4f169 10110
65f38f15 10111 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 10112 {
65f38f15 10113 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 10114 return FALSE;
5bd4f169 10115 }
5bd4f169 10116 }
5bd4f169 10117 }
65f38f15 10118#undef add_dynamic_entry
5bd4f169 10119
b34976b6 10120 return TRUE;
5bd4f169
AM
10121}
10122
a345bc8d
AM
10123/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10124
10125static bfd_boolean
10126ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10127{
10128 if (h->plt.plist != NULL
10129 && !h->def_regular
10130 && !h->pointer_equality_needed)
10131 return FALSE;
10132
10133 return _bfd_elf_hash_symbol (h);
10134}
10135
721956f4 10136/* Determine the type of stub needed, if any, for a call. */
5bd4f169 10137
4ce794b7
AM
10138static inline enum ppc_stub_type
10139ppc_type_of_stub (asection *input_sec,
10140 const Elf_Internal_Rela *rel,
10141 struct ppc_link_hash_entry **hash,
e054468f 10142 struct plt_entry **plt_ent,
6911b7dc
AM
10143 bfd_vma destination,
10144 unsigned long local_off)
5bd4f169 10145{
721956f4
AM
10146 struct ppc_link_hash_entry *h = *hash;
10147 bfd_vma location;
10148 bfd_vma branch_offset;
10149 bfd_vma max_branch_offset;
4ce794b7 10150 enum elf_ppc64_reloc_type r_type;
5bd4f169 10151
721956f4
AM
10152 if (h != NULL)
10153 {
e054468f 10154 struct plt_entry *ent;
7fe2b9a6 10155 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
10156 if (h->oh != NULL
10157 && h->oh->is_func_descriptor)
7b8f6675
AM
10158 {
10159 fdh = ppc_follow_link (h->oh);
10160 *hash = fdh;
10161 }
8387904d 10162
e054468f
AM
10163 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10164 if (ent->addend == rel->r_addend
10165 && ent->plt.offset != (bfd_vma) -1)
10166 {
e054468f
AM
10167 *plt_ent = ent;
10168 return ppc_stub_plt_call;
10169 }
5bd4f169 10170
7fe2b9a6
AM
10171 /* Here, we know we don't have a plt entry. If we don't have a
10172 either a defined function descriptor or a defined entry symbol
10173 in a regular object file, then it is pointless trying to make
10174 any other type of stub. */
854b41e7
AM
10175 if (!is_static_defined (&fdh->elf)
10176 && !is_static_defined (&h->elf))
721956f4 10177 return ppc_stub_none;
5d1634d7 10178 }
e054468f
AM
10179 else if (elf_local_got_ents (input_sec->owner) != NULL)
10180 {
10181 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10182 struct plt_entry **local_plt = (struct plt_entry **)
10183 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10184 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10185
10186 if (local_plt[r_symndx] != NULL)
10187 {
10188 struct plt_entry *ent;
10189
10190 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10191 if (ent->addend == rel->r_addend
10192 && ent->plt.offset != (bfd_vma) -1)
10193 {
10194 *plt_ent = ent;
10195 return ppc_stub_plt_call;
10196 }
10197 }
10198 }
5d1634d7 10199
721956f4
AM
10200 /* Determine where the call point is. */
10201 location = (input_sec->output_offset
10202 + input_sec->output_section->vma
10203 + rel->r_offset);
5d1634d7 10204
721956f4
AM
10205 branch_offset = destination - location;
10206 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 10207
721956f4
AM
10208 /* Determine if a long branch stub is needed. */
10209 max_branch_offset = 1 << 25;
23cedd1d
AM
10210 if (r_type == R_PPC64_REL14
10211 || r_type == R_PPC64_REL14_BRTAKEN
10212 || r_type == R_PPC64_REL14_BRNTAKEN)
721956f4 10213 max_branch_offset = 1 << 15;
5d1634d7 10214
6911b7dc 10215 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
721956f4
AM
10216 /* We need a stub. Figure out whether a long_branch or plt_branch
10217 is needed later. */
10218 return ppc_stub_long_branch;
5d1634d7 10219
721956f4 10220 return ppc_stub_none;
5d1634d7
AM
10221}
10222
f891966f
AM
10223/* Gets the address of a label (1:) in r11 and builds an offset in r12,
10224 then adds it to r11 (LOAD false) or loads r12 from r11+r12 (LOAD true).
10225 . mflr %r12
10226 . bcl 20,31,1f
10227 .1: mflr %r11
10228 . mtlr %r12
05d0e962 10229 . lis %r12,xxx-1b@highest
f891966f 10230 . ori %r12,%r12,xxx-1b@higher
05d0e962 10231 . sldi %r12,%r12,32
f891966f 10232 . oris %r12,%r12,xxx-1b@high
05d0e962 10233 . ori %r12,%r12,xxx-1b@l
f891966f 10234 . add/ldx %r12,%r11,%r12 */
05d0e962
AM
10235
10236static bfd_byte *
10237build_offset (bfd *abfd, bfd_byte *p, bfd_vma off, bfd_boolean load)
10238{
f891966f
AM
10239 bfd_put_32 (abfd, MFLR_R12, p);
10240 p += 4;
10241 bfd_put_32 (abfd, BCL_20_31, p);
10242 p += 4;
10243 bfd_put_32 (abfd, MFLR_R11, p);
10244 p += 4;
10245 bfd_put_32 (abfd, MTLR_R12, p);
10246 p += 4;
05d0e962
AM
10247 if (off + 0x8000 < 0x10000)
10248 {
10249 if (load)
10250 bfd_put_32 (abfd, LD_R12_0R11 + PPC_LO (off), p);
10251 else
10252 bfd_put_32 (abfd, ADDI_R12_R11 + PPC_LO (off), p);
10253 p += 4;
10254 }
10255 else if (off + 0x80008000ULL < 0x100000000ULL)
10256 {
10257 bfd_put_32 (abfd, ADDIS_R12_R11 + PPC_HA (off), p);
10258 p += 4;
10259 if (load)
10260 bfd_put_32 (abfd, LD_R12_0R12 + PPC_LO (off), p);
10261 else
10262 bfd_put_32 (abfd, ADDI_R12_R12 + PPC_LO (off), p);
10263 p += 4;
10264 }
10265 else
10266 {
10267 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10268 {
10269 bfd_put_32 (abfd, LI_R12_0 + ((off >> 32) & 0xffff), p);
10270 p += 4;
10271 }
10272 else
10273 {
10274 bfd_put_32 (abfd, LIS_R12 + ((off >> 48) & 0xffff), p);
10275 p += 4;
10276 if (((off >> 32) & 0xffff) != 0)
10277 {
10278 bfd_put_32 (abfd, ORI_R12_R12_0 + ((off >> 32) & 0xffff), p);
10279 p += 4;
10280 }
10281 }
10282 if (((off >> 32) & 0xffffffffULL) != 0)
10283 {
10284 bfd_put_32 (abfd, SLDI_R12_R12_32, p);
10285 p += 4;
10286 }
10287 if (PPC_HI (off) != 0)
10288 {
10289 bfd_put_32 (abfd, ORIS_R12_R12_0 + PPC_HI (off), p);
10290 p += 4;
10291 }
10292 if (PPC_LO (off) != 0)
10293 {
10294 bfd_put_32 (abfd, ORI_R12_R12_0 + PPC_LO (off), p);
10295 p += 4;
10296 }
10297 if (load)
10298 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10299 else
10300 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10301 p += 4;
10302 }
10303 return p;
10304}
10305
10306static unsigned int
10307size_offset (bfd_vma off)
10308{
10309 unsigned int size;
10310 if (off + 0x8000 < 0x10000)
10311 size = 4;
10312 else if (off + 0x80008000ULL < 0x100000000ULL)
10313 size = 8;
10314 else
10315 {
10316 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10317 size = 4;
10318 else
10319 {
10320 size = 4;
10321 if (((off >> 32) & 0xffff) != 0)
10322 size += 4;
10323 }
10324 if (((off >> 32) & 0xffffffffULL) != 0)
10325 size += 4;
10326 if (PPC_HI (off) != 0)
10327 size += 4;
10328 if (PPC_LO (off) != 0)
10329 size += 4;
10330 size += 4;
10331 }
f891966f 10332 return size + 16;
05d0e962
AM
10333}
10334
3d58e1fc
AM
10335static unsigned int
10336num_relocs_for_offset (bfd_vma off)
10337{
10338 unsigned int num_rel;
10339 if (off + 0x8000 < 0x10000)
10340 num_rel = 1;
10341 else if (off + 0x80008000ULL < 0x100000000ULL)
10342 num_rel = 2;
10343 else
10344 {
10345 num_rel = 1;
10346 if (off + 0x800000000000ULL >= 0x1000000000000ULL
10347 && ((off >> 32) & 0xffff) != 0)
10348 num_rel += 1;
10349 if (PPC_HI (off) != 0)
10350 num_rel += 1;
10351 if (PPC_LO (off) != 0)
10352 num_rel += 1;
10353 }
10354 return num_rel;
10355}
10356
10357static Elf_Internal_Rela *
10358emit_relocs_for_offset (struct bfd_link_info *info, Elf_Internal_Rela *r,
10359 bfd_vma roff, bfd_vma targ, bfd_vma off)
10360{
10361 bfd_vma relative_targ = targ - (roff - 8);
10362 if (bfd_big_endian (info->output_bfd))
10363 roff += 2;
10364 r->r_offset = roff;
10365 r->r_addend = relative_targ + roff;
10366 if (off + 0x8000 < 0x10000)
10367 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16);
10368 else if (off + 0x80008000ULL < 0x100000000ULL)
10369 {
10370 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HA);
10371 ++r;
10372 roff += 4;
10373 r->r_offset = roff;
10374 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10375 r->r_addend = relative_targ + roff;
10376 }
10377 else
10378 {
10379 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10380 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10381 else
10382 {
10383 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHEST);
10384 if (((off >> 32) & 0xffff) != 0)
10385 {
10386 ++r;
10387 roff += 4;
10388 r->r_offset = roff;
10389 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10390 r->r_addend = relative_targ + roff;
10391 }
10392 }
10393 if (((off >> 32) & 0xffffffffULL) != 0)
10394 roff += 4;
10395 if (PPC_HI (off) != 0)
10396 {
10397 ++r;
10398 roff += 4;
10399 r->r_offset = roff;
10400 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGH);
10401 r->r_addend = relative_targ + roff;
10402 }
10403 if (PPC_LO (off) != 0)
10404 {
10405 ++r;
10406 roff += 4;
10407 r->r_offset = roff;
10408 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10409 r->r_addend = relative_targ + roff;
10410 }
10411 }
10412 return r;
10413}
10414
04bdff6a
AM
10415static bfd_byte *
10416build_powerxx_offset (bfd *abfd, bfd_byte *p, bfd_vma off, int odd,
10417 bfd_boolean load)
10418{
10419 uint64_t insn;
10420 if (off - odd + (1ULL << 33) < 1ULL << 34)
10421 {
10422 off -= odd;
10423 if (odd)
10424 {
10425 bfd_put_32 (abfd, NOP, p);
10426 p += 4;
10427 }
10428 if (load)
10429 insn = PLD_R12_PC;
10430 else
10431 insn = PADDI_R12_PC;
10432 insn |= D34 (off);
10433 bfd_put_32 (abfd, insn >> 32, p);
10434 p += 4;
10435 bfd_put_32 (abfd, insn, p);
10436 }
10437 /* The minimum value for paddi is -0x200000000. The minimum value
10438 for li is -0x8000, which when shifted by 34 and added gives a
10439 minimum value of -0x2000200000000. The maximum value is
10440 0x1ffffffff+0x7fff<<34 which is 0x2000200000000-1. */
10441 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10442 {
10443 off -= 8 - odd;
10444 bfd_put_32 (abfd, LI_R11_0 | (HA34 (off) & 0xffff), p);
10445 p += 4;
10446 if (!odd)
10447 {
10448 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10449 p += 4;
10450 }
10451 insn = PADDI_R12_PC | D34 (off);
10452 bfd_put_32 (abfd, insn >> 32, p);
10453 p += 4;
10454 bfd_put_32 (abfd, insn, p);
10455 p += 4;
10456 if (odd)
10457 {
10458 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10459 p += 4;
10460 }
10461 if (load)
10462 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10463 else
10464 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10465 }
10466 else
10467 {
10468 off -= odd + 8;
10469 bfd_put_32 (abfd, LIS_R11 | ((HA34 (off) >> 16) & 0x3fff), p);
10470 p += 4;
10471 bfd_put_32 (abfd, ORI_R11_R11_0 | (HA34 (off) & 0xffff), p);
10472 p += 4;
10473 if (odd)
10474 {
10475 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10476 p += 4;
10477 }
10478 insn = PADDI_R12_PC | D34 (off);
10479 bfd_put_32 (abfd, insn >> 32, p);
10480 p += 4;
10481 bfd_put_32 (abfd, insn, p);
10482 p += 4;
10483 if (!odd)
10484 {
10485 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10486 p += 4;
10487 }
10488 if (load)
10489 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10490 else
10491 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10492 }
10493 p += 4;
10494 return p;
10495}
10496
10497static unsigned int
10498size_powerxx_offset (bfd_vma off, int odd)
10499{
10500 if (off - odd + (1ULL << 33) < 1ULL << 34)
10501 return odd + 8;
10502 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10503 return 20;
10504 else
10505 return 24;
10506}
10507
10508static unsigned int
10509num_relocs_for_powerxx_offset (bfd_vma off, int odd)
10510{
10511 if (off - odd + (1ULL << 33) < 1ULL << 34)
10512 return 1;
10513 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10514 return 2;
10515 else
10516 return 3;
10517}
10518
10519static Elf_Internal_Rela *
10520emit_relocs_for_powerxx_offset (struct bfd_link_info *info,
10521 Elf_Internal_Rela *r, bfd_vma roff,
10522 bfd_vma targ, bfd_vma off, int odd)
10523{
10524 if (off - odd + (1ULL << 33) < 1ULL << 34)
10525 roff += odd;
10526 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10527 {
10528 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10529 r->r_offset = roff + d_offset;
10530 r->r_addend = targ + 8 - odd - d_offset;
10531 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10532 ++r;
10533 roff += 8 - odd;
10534 }
10535 else
10536 {
10537 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10538 r->r_offset = roff + d_offset;
10539 r->r_addend = targ + 8 + odd - d_offset;
10540 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHESTA34);
10541 ++r;
10542 roff += 4;
10543 r->r_offset = roff + d_offset;
10544 r->r_addend = targ + 4 + odd - d_offset;
10545 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10546 ++r;
10547 roff += 4 + odd;
10548 }
10549 r->r_offset = roff;
10550 r->r_addend = targ;
10551 r->r_info = ELF64_R_INFO (0, R_PPC64_PCREL34);
10552 return r;
10553}
10554
df136d64
AM
10555/* Emit .eh_frame opcode to advance pc by DELTA. */
10556
10557static bfd_byte *
10558eh_advance (bfd *abfd, bfd_byte *eh, unsigned int delta)
10559{
10560 delta /= 4;
10561 if (delta < 64)
10562 *eh++ = DW_CFA_advance_loc + delta;
10563 else if (delta < 256)
10564 {
10565 *eh++ = DW_CFA_advance_loc1;
10566 *eh++ = delta;
10567 }
10568 else if (delta < 65536)
10569 {
10570 *eh++ = DW_CFA_advance_loc2;
10571 bfd_put_16 (abfd, delta, eh);
10572 eh += 2;
10573 }
10574 else
10575 {
10576 *eh++ = DW_CFA_advance_loc4;
10577 bfd_put_32 (abfd, delta, eh);
10578 eh += 4;
10579 }
10580 return eh;
10581}
10582
10583/* Size of required .eh_frame opcode to advance pc by DELTA. */
10584
10585static unsigned int
10586eh_advance_size (unsigned int delta)
10587{
10588 if (delta < 64 * 4)
10589 /* DW_CFA_advance_loc+[1..63]. */
10590 return 1;
10591 if (delta < 256 * 4)
10592 /* DW_CFA_advance_loc1, byte. */
10593 return 2;
10594 if (delta < 65536 * 4)
10595 /* DW_CFA_advance_loc2, 2 bytes. */
10596 return 3;
10597 /* DW_CFA_advance_loc4, 4 bytes. */
10598 return 5;
10599}
10600
794e51c0
AM
10601/* With power7 weakly ordered memory model, it is possible for ld.so
10602 to update a plt entry in one thread and have another thread see a
10603 stale zero toc entry. To avoid this we need some sort of acquire
10604 barrier in the call stub. One solution is to make the load of the
10605 toc word seem to appear to depend on the load of the function entry
10606 word. Another solution is to test for r2 being zero, and branch to
10607 the appropriate glink entry if so.
10608
10609 . fake dep barrier compare
71a39c98
AM
10610 . ld 12,xxx(2) ld 12,xxx(2)
10611 . mtctr 12 mtctr 12
10612 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
10613 . add 2,2,11 cmpldi 2,0
10614 . ld 2,xxx+8(2) bnectr+
10615 . bctr b <glink_entry>
10616
10617 The solution involving the compare turns out to be faster, so
10618 that's what we use unless the branch won't reach. */
10619
10620#define ALWAYS_USE_FAKE_DEP 0
10621#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 10622
794e51c0
AM
10623static inline unsigned int
10624plt_stub_size (struct ppc_link_hash_table *htab,
10625 struct ppc_stub_hash_entry *stub_entry,
10626 bfd_vma off)
10627{
05d0e962 10628 unsigned size;
b9e5796b 10629
05d0e962
AM
10630 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
10631 {
04bdff6a
AM
10632 if (htab->powerxx_stubs)
10633 {
10634 bfd_vma start = (stub_entry->stub_offset
10635 + stub_entry->group->stub_sec->output_offset
10636 + stub_entry->group->stub_sec->output_section->vma);
10637 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10638 start += 4;
10639 size = 8 + size_powerxx_offset (off, start & 4);
10640 }
10641 else
10642 size = 8 + size_offset (off - 8);
05d0e962
AM
10643 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10644 size += 4;
10645 return size;
10646 }
10647
10648 size = 12;
b9e5796b
AM
10649 if (ALWAYS_EMIT_R2SAVE
10650 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10651 size += 4;
10652 if (PPC_HA (off) != 0)
794e51c0 10653 size += 4;
b9e5796b
AM
10654 if (htab->opd_abi)
10655 {
10656 size += 4;
e7d1c40c 10657 if (htab->params->plt_static_chain)
b9e5796b 10658 size += 4;
bd4d2eaa
AM
10659 if (htab->params->plt_thread_safe
10660 && htab->elf.dynamic_sections_created
10661 && stub_entry->h != NULL
10662 && stub_entry->h->elf.dynindx != -1)
b9e5796b 10663 size += 8;
e7d1c40c 10664 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
b9e5796b
AM
10665 size += 4;
10666 }
794e51c0 10667 if (stub_entry->h != NULL
ed7007c1 10668 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 10669 && htab->params->tls_get_addr_opt)
f378ab09
AM
10670 {
10671 size += 7 * 4;
e81b4c93 10672 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
407aa07c 10673 size += 6 * 4;
f378ab09 10674 }
794e51c0
AM
10675 return size;
10676}
10677
2420fff6
AM
10678/* Depending on the sign of plt_stub_align:
10679 If positive, return the padding to align to a 2**plt_stub_align
10680 boundary.
10681 If negative, if this stub would cross fewer 2**plt_stub_align
10682 boundaries if we align, then return the padding needed to do so. */
10683
794e51c0
AM
10684static inline unsigned int
10685plt_stub_pad (struct ppc_link_hash_table *htab,
10686 struct ppc_stub_hash_entry *stub_entry,
10687 bfd_vma plt_off)
10688{
2420fff6 10689 int stub_align;
1aa42141 10690 unsigned stub_size;
6f20ed8a 10691 bfd_vma stub_off = stub_entry->group->stub_sec->size;
794e51c0 10692
2420fff6
AM
10693 if (htab->params->plt_stub_align >= 0)
10694 {
10695 stub_align = 1 << htab->params->plt_stub_align;
10696 if ((stub_off & (stub_align - 1)) != 0)
10697 return stub_align - (stub_off & (stub_align - 1));
10698 return 0;
10699 }
10700
10701 stub_align = 1 << -htab->params->plt_stub_align;
1aa42141 10702 stub_size = plt_stub_size (htab, stub_entry, plt_off);
794e51c0 10703 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
e05fa0ba 10704 > ((stub_size - 1) & -stub_align))
794e51c0
AM
10705 return stub_align - (stub_off & (stub_align - 1));
10706 return 0;
10707}
10708
10709/* Build a .plt call stub. */
10710
10711static inline bfd_byte *
10712build_plt_stub (struct ppc_link_hash_table *htab,
10713 struct ppc_stub_hash_entry *stub_entry,
10714 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10715{
e7d1c40c 10716 bfd *obfd = htab->params->stub_bfd;
b9e5796b 10717 bfd_boolean plt_load_toc = htab->opd_abi;
e7d1c40c 10718 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
bd4d2eaa
AM
10719 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10720 && htab->elf.dynamic_sections_created
10721 && stub_entry->h != NULL
10722 && stub_entry->h->elf.dynindx != -1);
794e51c0
AM
10723 bfd_boolean use_fake_dep = plt_thread_safe;
10724 bfd_vma cmp_branch_off = 0;
10725
10726 if (!ALWAYS_USE_FAKE_DEP
b9e5796b 10727 && plt_load_toc
794e51c0 10728 && plt_thread_safe
ed7007c1 10729 && !(is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 10730 && htab->params->tls_get_addr_opt))
794e51c0
AM
10731 {
10732 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
b9e5796b
AM
10733 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10734 / PLT_ENTRY_SIZE (htab));
9e390558 10735 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8;
794e51c0
AM
10736 bfd_vma to, from;
10737
68d62958
AM
10738 if (pltindex > 32768)
10739 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
10740 to = (glinkoff
10741 + htab->glink->output_offset
10742 + htab->glink->output_section->vma);
6f20ed8a 10743 from = (p - stub_entry->group->stub_sec->contents
794e51c0
AM
10744 + 4 * (ALWAYS_EMIT_R2SAVE
10745 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10746 + 4 * (PPC_HA (offset) != 0)
10747 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10748 != PPC_HA (offset))
10749 + 4 * (plt_static_chain != 0)
10750 + 20
6f20ed8a
AM
10751 + stub_entry->group->stub_sec->output_offset
10752 + stub_entry->group->stub_sec->output_section->vma);
794e51c0
AM
10753 cmp_branch_off = to - from;
10754 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10755 }
10756
ac2df442
AM
10757 if (PPC_HA (offset) != 0)
10758 {
176a0d42
AM
10759 if (r != NULL)
10760 {
794e51c0
AM
10761 if (ALWAYS_EMIT_R2SAVE
10762 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10763 r[0].r_offset += 4;
176a0d42 10764 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 10765 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
10766 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10767 r[1].r_addend = r[0].r_addend;
b9e5796b 10768 if (plt_load_toc)
176a0d42 10769 {
b9e5796b 10770 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10771 {
b9e5796b
AM
10772 r[2].r_offset = r[1].r_offset + 4;
10773 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10774 r[2].r_addend = r[0].r_addend;
10775 }
10776 else
10777 {
10778 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10779 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10780 r[2].r_addend = r[0].r_addend + 8;
10781 if (plt_static_chain)
10782 {
10783 r[3].r_offset = r[2].r_offset + 4;
10784 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10785 r[3].r_addend = r[0].r_addend + 16;
10786 }
c7131b65 10787 }
176a0d42
AM
10788 }
10789 }
794e51c0
AM
10790 if (ALWAYS_EMIT_R2SAVE
10791 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10792 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
397998fc
AM
10793 if (plt_load_toc)
10794 {
10795 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10796 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10797 }
10798 else
10799 {
10800 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10801 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10802 }
b9e5796b
AM
10803 if (plt_load_toc
10804 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 10805 {
71a39c98 10806 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
10807 offset = 0;
10808 }
71a39c98 10809 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10810 if (plt_load_toc)
794e51c0 10811 {
b9e5796b
AM
10812 if (use_fake_dep)
10813 {
10814 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10815 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10816 }
10817 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10818 if (plt_static_chain)
10819 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
794e51c0 10820 }
ac2df442
AM
10821 }
10822 else
10823 {
176a0d42
AM
10824 if (r != NULL)
10825 {
794e51c0
AM
10826 if (ALWAYS_EMIT_R2SAVE
10827 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10828 r[0].r_offset += 4;
176a0d42 10829 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
b9e5796b 10830 if (plt_load_toc)
176a0d42 10831 {
b9e5796b 10832 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10833 {
b9e5796b
AM
10834 r[1].r_offset = r[0].r_offset + 4;
10835 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10836 r[1].r_addend = r[0].r_addend;
10837 }
10838 else
10839 {
10840 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10841 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10842 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10843 if (plt_static_chain)
10844 {
10845 r[2].r_offset = r[1].r_offset + 4;
10846 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10847 r[2].r_addend = r[0].r_addend + 8;
10848 }
c7131b65 10849 }
176a0d42
AM
10850 }
10851 }
794e51c0
AM
10852 if (ALWAYS_EMIT_R2SAVE
10853 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10854 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
71a39c98 10855 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
b9e5796b
AM
10856 if (plt_load_toc
10857 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
10858 {
10859 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10860 offset = 0;
10861 }
71a39c98 10862 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10863 if (plt_load_toc)
794e51c0 10864 {
b9e5796b
AM
10865 if (use_fake_dep)
10866 {
10867 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10868 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10869 }
10870 if (plt_static_chain)
10871 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10872 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
794e51c0 10873 }
ac2df442 10874 }
b9e5796b 10875 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
794e51c0
AM
10876 {
10877 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10878 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 10879 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
10880 }
10881 else
407aa07c 10882 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
10883 return p;
10884}
10885
a7f2871e
AM
10886/* Build a special .plt call stub for __tls_get_addr. */
10887
10888#define LD_R11_0R3 0xe9630000
10889#define LD_R12_0R3 0xe9830000
10890#define MR_R0_R3 0x7c601b78
10891#define CMPDI_R11_0 0x2c2b0000
10892#define ADD_R3_R12_R13 0x7c6c6a14
10893#define BEQLR 0x4d820020
10894#define MR_R3_R0 0x7c030378
a7f2871e
AM
10895#define STD_R11_0R1 0xf9610000
10896#define BCTRL 0x4e800421
10897#define LD_R11_0R1 0xe9610000
a7f2871e
AM
10898#define MTLR_R11 0x7d6803a6
10899
10900static inline bfd_byte *
794e51c0
AM
10901build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10902 struct ppc_stub_hash_entry *stub_entry,
10903 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 10904{
e7d1c40c 10905 bfd *obfd = htab->params->stub_bfd;
df136d64 10906 bfd_byte *loc = p;
794e51c0 10907
a7f2871e
AM
10908 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10909 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10910 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10911 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10912 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10913 bfd_put_32 (obfd, BEQLR, p), p += 4;
10914 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
f378ab09
AM
10915 if (r != NULL)
10916 r[0].r_offset += 7 * 4;
e81b4c93 10917 if (stub_entry->stub_type != ppc_stub_plt_call_r2save)
f378ab09
AM
10918 return build_plt_stub (htab, stub_entry, p, offset, r);
10919
a7f2871e 10920 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
a078d95a 10921 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
10922
10923 if (r != NULL)
f378ab09 10924 r[0].r_offset += 2 * 4;
794e51c0 10925 p = build_plt_stub (htab, stub_entry, p, offset, r);
407aa07c 10926 bfd_put_32 (obfd, BCTRL, p - 4);
a7f2871e 10927
a078d95a 10928 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
bd4d2eaa 10929 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
10930 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10931 bfd_put_32 (obfd, BLR, p), p += 4;
10932
df136d64
AM
10933 if (htab->glink_eh_frame != NULL
10934 && htab->glink_eh_frame->size != 0)
10935 {
10936 bfd_byte *base, *eh;
10937 unsigned int lr_used, delta;
10938
10939 base = htab->glink_eh_frame->contents + stub_entry->group->eh_base + 17;
10940 eh = base + stub_entry->group->eh_size;
10941 lr_used = stub_entry->stub_offset + (p - 20 - loc);
10942 delta = lr_used - stub_entry->group->lr_restore;
10943 stub_entry->group->lr_restore = lr_used + 16;
10944 eh = eh_advance (htab->elf.dynobj, eh, delta);
10945 *eh++ = DW_CFA_offset_extended_sf;
10946 *eh++ = 65;
10947 *eh++ = -(STK_LINKER (htab) / 8) & 0x7f;
10948 *eh++ = DW_CFA_advance_loc + 4;
10949 *eh++ = DW_CFA_restore_extended;
10950 *eh++ = 65;
10951 stub_entry->group->eh_size = eh - base;
10952 }
a7f2871e
AM
10953 return p;
10954}
10955
176a0d42
AM
10956static Elf_Internal_Rela *
10957get_relocs (asection *sec, int count)
10958{
10959 Elf_Internal_Rela *relocs;
10960 struct bfd_elf_section_data *elfsec_data;
10961
10962 elfsec_data = elf_section_data (sec);
10963 relocs = elfsec_data->relocs;
10964 if (relocs == NULL)
10965 {
10966 bfd_size_type relsize;
10967 relsize = sec->reloc_count * sizeof (*relocs);
10968 relocs = bfd_alloc (sec->owner, relsize);
10969 if (relocs == NULL)
10970 return NULL;
10971 elfsec_data->relocs = relocs;
d4730f92
BS
10972 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10973 sizeof (Elf_Internal_Shdr));
10974 if (elfsec_data->rela.hdr == NULL)
10975 return NULL;
10976 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10977 * sizeof (Elf64_External_Rela));
10978 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
10979 sec->reloc_count = 0;
10980 }
10981 relocs += sec->reloc_count;
10982 sec->reloc_count += count;
10983 return relocs;
10984}
10985
3d58e1fc
AM
10986/* Convert the relocs R[0] thru R[-NUM_REL+1], which are all no-symbol
10987 forms, to the equivalent relocs against the global symbol given by
10988 STUB_ENTRY->H. */
10989
10990static bfd_boolean
10991use_global_in_relocs (struct ppc_link_hash_table *htab,
10992 struct ppc_stub_hash_entry *stub_entry,
10993 Elf_Internal_Rela *r, unsigned int num_rel)
10994{
10995 struct elf_link_hash_entry **hashes;
10996 unsigned long symndx;
10997 struct ppc_link_hash_entry *h;
10998 bfd_vma symval;
10999
11000 /* Relocs are always against symbols in their own object file. Fake
11001 up global sym hashes for the stub bfd (which has no symbols). */
11002 hashes = elf_sym_hashes (htab->params->stub_bfd);
11003 if (hashes == NULL)
11004 {
11005 bfd_size_type hsize;
11006
11007 /* When called the first time, stub_globals will contain the
11008 total number of symbols seen during stub sizing. After
11009 allocating, stub_globals is used as an index to fill the
11010 hashes array. */
11011 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
11012 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
11013 if (hashes == NULL)
11014 return FALSE;
11015 elf_sym_hashes (htab->params->stub_bfd) = hashes;
11016 htab->stub_globals = 1;
11017 }
11018 symndx = htab->stub_globals++;
11019 h = stub_entry->h;
11020 hashes[symndx] = &h->elf;
11021 if (h->oh != NULL && h->oh->is_func)
11022 h = ppc_follow_link (h->oh);
11023 BFD_ASSERT (h->elf.root.type == bfd_link_hash_defined
11024 || h->elf.root.type == bfd_link_hash_defweak);
ed7007c1 11025 symval = defined_sym_val (&h->elf);
3d58e1fc
AM
11026 while (num_rel-- != 0)
11027 {
11028 r->r_info = ELF64_R_INFO (symndx, ELF64_R_TYPE (r->r_info));
11029 if (h->elf.root.u.def.section != stub_entry->target_section)
11030 {
11031 /* H is an opd symbol. The addend must be zero, and the
11032 branch reloc is the only one we can convert. */
11033 r->r_addend = 0;
11034 break;
11035 }
11036 else
11037 r->r_addend -= symval;
11038 --r;
11039 }
11040 return TRUE;
11041}
11042
aa374f67 11043static bfd_vma
25f53a85 11044get_r2off (struct bfd_link_info *info,
aa374f67
AM
11045 struct ppc_stub_hash_entry *stub_entry)
11046{
25f53a85 11047 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 11048 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
aa374f67
AM
11049
11050 if (r2off == 0)
11051 {
11052 /* Support linking -R objects. Get the toc pointer from the
11053 opd entry. */
11054 char buf[8];
b9e5796b
AM
11055 if (!htab->opd_abi)
11056 return r2off;
aa374f67
AM
11057 asection *opd = stub_entry->h->elf.root.u.def.section;
11058 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
11059
11060 if (strcmp (opd->name, ".opd") != 0
11061 || opd->reloc_count != 0)
11062 {
2cdcc330
AM
11063 info->callbacks->einfo
11064 (_("%P: cannot find opd entry toc for `%pT'\n"),
11065 stub_entry->h->elf.root.root.string);
aa374f67 11066 bfd_set_error (bfd_error_bad_value);
a7c49797 11067 return (bfd_vma) -1;
aa374f67
AM
11068 }
11069 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
a7c49797 11070 return (bfd_vma) -1;
aa374f67 11071 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 11072 r2off -= elf_gp (info->output_bfd);
aa374f67 11073 }
6f20ed8a 11074 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
aa374f67
AM
11075 return r2off;
11076}
11077
b34976b6 11078static bfd_boolean
4ce794b7 11079ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 11080{
721956f4
AM
11081 struct ppc_stub_hash_entry *stub_entry;
11082 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
11083 struct bfd_link_info *info;
11084 struct ppc_link_hash_table *htab;
721956f4 11085 bfd_byte *loc;
3d58e1fc 11086 bfd_byte *p, *relp;
1aa42141 11087 bfd_vma targ, off;
176a0d42 11088 Elf_Internal_Rela *r;
e054468f 11089 asection *plt;
3d58e1fc 11090 int num_rel;
04bdff6a 11091 int odd;
5d1634d7 11092
721956f4
AM
11093 /* Massage our args to the form they really have. */
11094 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 11095 info = in_arg;
5d1634d7 11096
5d1634d7 11097 htab = ppc_hash_table (info);
4dfe6ac6
NC
11098 if (htab == NULL)
11099 return FALSE;
5d1634d7 11100
1aa42141 11101 BFD_ASSERT (stub_entry->stub_offset >= stub_entry->group->stub_sec->size);
6f20ed8a 11102 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
721956f4 11103
4ce794b7 11104 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 11105 switch (stub_entry->stub_type)
5d1634d7 11106 {
721956f4 11107 case ppc_stub_long_branch:
ad8e1ba5 11108 case ppc_stub_long_branch_r2off:
721956f4 11109 /* Branches are relative. This is where we are going to. */
1aa42141 11110 targ = (stub_entry->target_value
6911b7dc
AM
11111 + stub_entry->target_section->output_offset
11112 + stub_entry->target_section->output_section->vma);
1aa42141 11113 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
5d1634d7 11114
721956f4 11115 /* And this is where we are coming from. */
1aa42141
AM
11116 off = (stub_entry->stub_offset
11117 + stub_entry->group->stub_sec->output_offset
11118 + stub_entry->group->stub_sec->output_section->vma);
11119 off = targ - off;
e86ce104 11120
9e390558 11121 p = loc;
ac2df442 11122 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 11123 {
25f53a85 11124 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 11125
a7c49797 11126 if (r2off == (bfd_vma) -1)
aa374f67
AM
11127 {
11128 htab->stub_error = TRUE;
11129 return FALSE;
11130 }
9e390558
AM
11131 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11132 p += 4;
ac2df442
AM
11133 if (PPC_HA (r2off) != 0)
11134 {
e7d1c40c 11135 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11136 ADDIS_R2_R2 | PPC_HA (r2off), p);
11137 p += 4;
a7c49797
AM
11138 }
11139 if (PPC_LO (r2off) != 0)
11140 {
11141 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11142 ADDI_R2_R2 | PPC_LO (r2off), p);
11143 p += 4;
ac2df442 11144 }
9e390558 11145 off -= p - loc;
ad8e1ba5 11146 }
9e390558
AM
11147 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p);
11148 p += 4;
ad8e1ba5 11149
5c3dead3
AM
11150 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11151 {
cf97bcb0
AM
11152 _bfd_error_handler
11153 (_("long branch stub `%s' offset overflow"),
bc30df16 11154 stub_entry->root.string);
5c3dead3
AM
11155 htab->stub_error = TRUE;
11156 return FALSE;
11157 }
ee75fd95
AM
11158
11159 if (info->emitrelocations)
11160 {
6f20ed8a 11161 r = get_relocs (stub_entry->group->stub_sec, 1);
176a0d42
AM
11162 if (r == NULL)
11163 return FALSE;
9e390558 11164 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
ee75fd95 11165 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
1aa42141 11166 r->r_addend = targ;
3d58e1fc
AM
11167 if (stub_entry->h != NULL
11168 && !use_global_in_relocs (htab, stub_entry, r, 1))
11169 return FALSE;
ee75fd95 11170 }
721956f4 11171 break;
e86ce104 11172
721956f4 11173 case ppc_stub_plt_branch:
ad8e1ba5 11174 case ppc_stub_plt_branch_r2off:
721956f4
AM
11175 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11176 stub_entry->root.string + 9,
b34976b6 11177 FALSE, FALSE);
721956f4
AM
11178 if (br_entry == NULL)
11179 {
cf97bcb0
AM
11180 _bfd_error_handler (_("can't find branch stub `%s'"),
11181 stub_entry->root.string);
b34976b6
AM
11182 htab->stub_error = TRUE;
11183 return FALSE;
721956f4
AM
11184 }
11185
1aa42141 11186 targ = (stub_entry->target_value
176a0d42
AM
11187 + stub_entry->target_section->output_offset
11188 + stub_entry->target_section->output_section->vma);
6911b7dc 11189 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
1aa42141 11190 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 11191
1aa42141 11192 bfd_put_64 (htab->brlt->owner, targ,
4ce794b7 11193 htab->brlt->contents + br_entry->offset);
721956f4 11194
f94498ff 11195 if (br_entry->iter == htab->stub_iteration)
721956f4 11196 {
f94498ff 11197 br_entry->iter = 0;
84f5d08e 11198
f94498ff 11199 if (htab->relbrlt != NULL)
84f5d08e 11200 {
f94498ff
AM
11201 /* Create a reloc for the branch lookup table entry. */
11202 Elf_Internal_Rela rela;
11203 bfd_byte *rl;
11204
11205 rela.r_offset = (br_entry->offset
11206 + htab->brlt->output_offset
11207 + htab->brlt->output_section->vma);
11208 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11209 rela.r_addend = targ;
f94498ff
AM
11210
11211 rl = htab->relbrlt->contents;
11212 rl += (htab->relbrlt->reloc_count++
11213 * sizeof (Elf64_External_Rela));
11214 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
11215 }
11216 else if (info->emitrelocations)
11217 {
176a0d42
AM
11218 r = get_relocs (htab->brlt, 1);
11219 if (r == NULL)
11220 return FALSE;
11221 /* brlt, being SEC_LINKER_CREATED does not go through the
11222 normal reloc processing. Symbols and offsets are not
11223 translated from input file to output file form, so
11224 set up the offset per the output file. */
f94498ff
AM
11225 r->r_offset = (br_entry->offset
11226 + htab->brlt->output_offset
11227 + htab->brlt->output_section->vma);
11228 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11229 r->r_addend = targ;
84f5d08e 11230 }
84f5d08e 11231 }
721956f4 11232
1aa42141 11233 targ = (br_entry->offset
176a0d42
AM
11234 + htab->brlt->output_offset
11235 + htab->brlt->output_section->vma);
11236
1aa42141
AM
11237 off = (elf_gp (info->output_bfd)
11238 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11239 off = targ - off;
721956f4 11240
ad8e1ba5 11241 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 11242 {
25f53a85 11243 info->callbacks->einfo
c1c8c1ef 11244 (_("%P: linkage table error against `%pT'\n"),
721956f4 11245 stub_entry->root.string);
5d1634d7 11246 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11247 htab->stub_error = TRUE;
11248 return FALSE;
5d1634d7 11249 }
41bd81ab 11250
176a0d42
AM
11251 if (info->emitrelocations)
11252 {
6f20ed8a 11253 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
176a0d42
AM
11254 if (r == NULL)
11255 return FALSE;
6f20ed8a 11256 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11257 if (bfd_big_endian (info->output_bfd))
11258 r[0].r_offset += 2;
00f412ee 11259 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
176a0d42
AM
11260 r[0].r_offset += 4;
11261 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
1aa42141 11262 r[0].r_addend = targ;
176a0d42
AM
11263 if (PPC_HA (off) != 0)
11264 {
11265 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11266 r[1].r_offset = r[0].r_offset + 4;
11267 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11268 r[1].r_addend = r[0].r_addend;
11269 }
11270 }
11271
9e390558 11272 p = loc;
00f412ee 11273 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ad8e1ba5 11274 {
176a0d42 11275 if (PPC_HA (off) != 0)
ac2df442 11276 {
e7d1c40c 11277 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11278 ADDIS_R12_R2 | PPC_HA (off), p);
11279 p += 4;
e7d1c40c 11280 bfd_put_32 (htab->params->stub_bfd,
9e390558 11281 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11282 }
11283 else
9e390558
AM
11284 bfd_put_32 (htab->params->stub_bfd,
11285 LD_R12_0R2 | PPC_LO (off), p);
ad8e1ba5
AM
11286 }
11287 else
11288 {
25f53a85 11289 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 11290
a7c49797 11291 if (r2off == (bfd_vma) -1)
aa374f67
AM
11292 {
11293 htab->stub_error = TRUE;
11294 return FALSE;
11295 }
ad8e1ba5 11296
9e390558
AM
11297 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11298 p += 4;
176a0d42 11299 if (PPC_HA (off) != 0)
ac2df442 11300 {
e7d1c40c 11301 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11302 ADDIS_R12_R2 | PPC_HA (off), p);
11303 p += 4;
e7d1c40c 11304 bfd_put_32 (htab->params->stub_bfd,
9e390558 11305 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11306 }
11307 else
9e390558 11308 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p);
ac2df442
AM
11309
11310 if (PPC_HA (r2off) != 0)
11311 {
9e390558 11312 p += 4;
e7d1c40c 11313 bfd_put_32 (htab->params->stub_bfd,
9e390558 11314 ADDIS_R2_R2 | PPC_HA (r2off), p);
00f412ee
AM
11315 }
11316 if (PPC_LO (r2off) != 0)
11317 {
9e390558 11318 p += 4;
e7d1c40c 11319 bfd_put_32 (htab->params->stub_bfd,
9e390558 11320 ADDI_R2_R2 | PPC_LO (r2off), p);
ac2df442 11321 }
ad8e1ba5 11322 }
9e390558
AM
11323 p += 4;
11324 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11325 p += 4;
407aa07c
AM
11326 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11327 p += 4;
721956f4 11328 break;
5d1634d7 11329
05d0e962
AM
11330 case ppc_stub_long_branch_notoc:
11331 case ppc_stub_long_branch_both:
11332 case ppc_stub_plt_branch_notoc:
11333 case ppc_stub_plt_branch_both:
11334 case ppc_stub_plt_call_notoc:
11335 case ppc_stub_plt_call_both:
11336 p = loc;
f891966f 11337 off = (stub_entry->stub_offset
05d0e962
AM
11338 + stub_entry->group->stub_sec->output_offset
11339 + stub_entry->group->stub_sec->output_section->vma);
11340 if (stub_entry->stub_type == ppc_stub_long_branch_both
11341 || stub_entry->stub_type == ppc_stub_plt_branch_both
11342 || stub_entry->stub_type == ppc_stub_plt_call_both)
11343 {
11344 off += 4;
11345 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11346 p += 4;
11347 }
11348 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
11349 {
11350 targ = stub_entry->plt_ent->plt.offset & ~1;
11351 if (targ >= (bfd_vma) -2)
11352 abort ();
11353
11354 plt = htab->elf.splt;
11355 if (!htab->elf.dynamic_sections_created
11356 || stub_entry->h == NULL
11357 || stub_entry->h->elf.dynindx == -1)
11358 {
11359 if (stub_entry->symtype == STT_GNU_IFUNC)
11360 plt = htab->elf.iplt;
11361 else
11362 plt = htab->pltlocal;
11363 }
11364 targ += plt->output_offset + plt->output_section->vma;
11365 }
11366 else
11367 targ = (stub_entry->target_value
11368 + stub_entry->target_section->output_offset
11369 + stub_entry->target_section->output_section->vma);
04bdff6a 11370 odd = off & 4;
05d0e962 11371 off = targ - off;
f891966f 11372
3d58e1fc
AM
11373 relp = p;
11374 num_rel = 0;
04bdff6a
AM
11375 if (htab->powerxx_stubs)
11376 {
11377 bfd_boolean load = stub_entry->stub_type >= ppc_stub_plt_call_notoc;
11378 p = build_powerxx_offset (htab->params->stub_bfd, p, off, odd, load);
11379 }
11380 else
11381 {
11382 /* The notoc stubs calculate their target (either a PLT entry or
11383 the global entry point of a function) relative to the PC
11384 returned by the "bcl" two instructions past the start of the
11385 sequence emitted by build_offset. The offset is therefore 8
11386 less than calculated from the start of the sequence. */
11387 off -= 8;
11388 p = build_offset (htab->params->stub_bfd, p, off,
11389 stub_entry->stub_type >= ppc_stub_plt_call_notoc);
11390 }
11391
f891966f 11392 if (stub_entry->stub_type <= ppc_stub_long_branch_both)
05d0e962 11393 {
f891966f 11394 bfd_vma from;
3d58e1fc 11395 num_rel = 1;
f891966f
AM
11396 from = (stub_entry->stub_offset
11397 + stub_entry->group->stub_sec->output_offset
11398 + stub_entry->group->stub_sec->output_section->vma
11399 + (p - loc));
05d0e962 11400 bfd_put_32 (htab->params->stub_bfd,
f891966f 11401 B_DOT | ((targ - from) & 0x3fffffc), p);
05d0e962
AM
11402 }
11403 else
11404 {
11405 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11406 p += 4;
11407 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11408 }
11409 p += 4;
df136d64 11410
3d58e1fc
AM
11411 if (info->emitrelocations)
11412 {
04bdff6a
AM
11413 bfd_vma roff = relp - stub_entry->group->stub_sec->contents;
11414 if (htab->powerxx_stubs)
11415 num_rel += num_relocs_for_powerxx_offset (off, odd);
11416 else
11417 {
11418 num_rel += num_relocs_for_offset (off);
11419 roff += 16;
11420 }
3d58e1fc
AM
11421 r = get_relocs (stub_entry->group->stub_sec, num_rel);
11422 if (r == NULL)
11423 return FALSE;
04bdff6a
AM
11424 if (htab->powerxx_stubs)
11425 r = emit_relocs_for_powerxx_offset (info, r, roff, targ, off, odd);
11426 else
11427 r = emit_relocs_for_offset (info, r, roff, targ, off);
3d58e1fc
AM
11428 if (stub_entry->stub_type == ppc_stub_long_branch_notoc
11429 || stub_entry->stub_type == ppc_stub_long_branch_both)
11430 {
11431 ++r;
11432 roff = p - 4 - stub_entry->group->stub_sec->contents;
11433 r->r_offset = roff;
11434 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
11435 r->r_addend = targ;
11436 if (stub_entry->h != NULL
11437 && !use_global_in_relocs (htab, stub_entry, r, num_rel))
11438 return FALSE;
11439 }
11440 }
11441
04bdff6a
AM
11442 if (!htab->powerxx_stubs
11443 && htab->glink_eh_frame != NULL
11444 && htab->glink_eh_frame->size != 0)
df136d64
AM
11445 {
11446 bfd_byte *base, *eh;
11447 unsigned int lr_used, delta;
11448
11449 base = (htab->glink_eh_frame->contents
11450 + stub_entry->group->eh_base + 17);
11451 eh = base + stub_entry->group->eh_size;
11452 lr_used = stub_entry->stub_offset + 8;
11453 if (stub_entry->stub_type == ppc_stub_long_branch_both
11454 || stub_entry->stub_type == ppc_stub_plt_branch_both
11455 || stub_entry->stub_type == ppc_stub_plt_call_both)
11456 lr_used += 4;
11457 delta = lr_used - stub_entry->group->lr_restore;
11458 stub_entry->group->lr_restore = lr_used + 8;
11459 eh = eh_advance (htab->elf.dynobj, eh, delta);
11460 *eh++ = DW_CFA_register;
11461 *eh++ = 65;
11462 *eh++ = 12;
11463 *eh++ = DW_CFA_advance_loc + 2;
11464 *eh++ = DW_CFA_restore_extended;
11465 *eh++ = 65;
11466 stub_entry->group->eh_size = eh - base;
11467 }
05d0e962
AM
11468 break;
11469
721956f4 11470 case ppc_stub_plt_call:
794e51c0 11471 case ppc_stub_plt_call_r2save:
e054468f 11472 if (stub_entry->h != NULL
b31867b6
AM
11473 && stub_entry->h->is_func_descriptor
11474 && stub_entry->h->oh != NULL)
c862ae31 11475 {
b31867b6
AM
11476 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11477
11478 /* If the old-ABI "dot-symbol" is undefined make it weak so
6f20ed8a 11479 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
8c5b4e52
AM
11480 if (fh->elf.root.type == bfd_link_hash_undefined
11481 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11482 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
b31867b6 11483 fh->elf.root.type = bfd_link_hash_undefweak;
c862ae31
AM
11484 }
11485
721956f4 11486 /* Now build the stub. */
1aa42141
AM
11487 targ = stub_entry->plt_ent->plt.offset & ~1;
11488 if (targ >= (bfd_vma) -2)
721956f4
AM
11489 abort ();
11490
33e44f2e 11491 plt = htab->elf.splt;
25f23106
AM
11492 if (!htab->elf.dynamic_sections_created
11493 || stub_entry->h == NULL
11494 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11495 {
11496 if (stub_entry->symtype == STT_GNU_IFUNC)
11497 plt = htab->elf.iplt;
11498 else
11499 plt = htab->pltlocal;
11500 }
1aa42141 11501 targ += plt->output_offset + plt->output_section->vma;
e054468f 11502
1aa42141
AM
11503 off = (elf_gp (info->output_bfd)
11504 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11505 off = targ - off;
721956f4 11506
ad8e1ba5 11507 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 11508 {
25f53a85 11509 info->callbacks->einfo
695344c0 11510 /* xgettext:c-format */
c1c8c1ef 11511 (_("%P: linkage table error against `%pT'\n"),
e054468f
AM
11512 stub_entry->h != NULL
11513 ? stub_entry->h->elf.root.root.string
11514 : "<local sym>");
721956f4 11515 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11516 htab->stub_error = TRUE;
11517 return FALSE;
721956f4
AM
11518 }
11519
176a0d42
AM
11520 r = NULL;
11521 if (info->emitrelocations)
11522 {
6f20ed8a 11523 r = get_relocs (stub_entry->group->stub_sec,
3ba720c7
AM
11524 ((PPC_HA (off) != 0)
11525 + (htab->opd_abi
e7d1c40c 11526 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
11527 && PPC_HA (off + 16) == PPC_HA (off))
11528 : 1)));
176a0d42
AM
11529 if (r == NULL)
11530 return FALSE;
6f20ed8a 11531 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11532 if (bfd_big_endian (info->output_bfd))
11533 r[0].r_offset += 2;
1aa42141 11534 r[0].r_addend = targ;
176a0d42 11535 }
a7f2871e 11536 if (stub_entry->h != NULL
ed7007c1 11537 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 11538 && htab->params->tls_get_addr_opt)
794e51c0 11539 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 11540 else
794e51c0 11541 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
11542 break;
11543
a4b6fadd
AM
11544 case ppc_stub_save_res:
11545 return TRUE;
11546
721956f4
AM
11547 default:
11548 BFD_FAIL ();
b34976b6 11549 return FALSE;
721956f4
AM
11550 }
11551
1aa42141 11552 stub_entry->group->stub_sec->size = stub_entry->stub_offset + (p - loc);
97b639ba 11553
e7d1c40c 11554 if (htab->params->emit_stub_syms)
97b639ba
AM
11555 {
11556 struct elf_link_hash_entry *h;
ee75fd95
AM
11557 size_t len1, len2;
11558 char *name;
11559 const char *const stub_str[] = { "long_branch",
05d0e962
AM
11560 "long_branch",
11561 "long_branch",
3f6ff479
AM
11562 "long_branch",
11563 "plt_branch",
ee75fd95 11564 "plt_branch",
05d0e962
AM
11565 "plt_branch",
11566 "plt_branch",
11567 "plt_call",
11568 "plt_call",
794e51c0 11569 "plt_call",
ee75fd95
AM
11570 "plt_call" };
11571
11572 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11573 len2 = strlen (stub_entry->root.string);
11574 name = bfd_malloc (len1 + len2 + 2);
11575 if (name == NULL)
11576 return FALSE;
11577 memcpy (name, stub_entry->root.string, 9);
11578 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11579 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11580 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
11581 if (h == NULL)
11582 return FALSE;
11583 if (h->root.type == bfd_link_hash_new)
11584 {
11585 h->root.type = bfd_link_hash_defined;
6f20ed8a 11586 h->root.u.def.section = stub_entry->group->stub_sec;
97b639ba 11587 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
11588 h->ref_regular = 1;
11589 h->def_regular = 1;
11590 h->ref_regular_nonweak = 1;
11591 h->forced_local = 1;
11592 h->non_elf = 0;
2ec55de3 11593 h->root.linker_def = 1;
97b639ba
AM
11594 }
11595 }
11596
b34976b6 11597 return TRUE;
721956f4
AM
11598}
11599
11600/* As above, but don't actually build the stub. Just bump offset so
11601 we know stub section sizes, and select plt_branch stubs where
11602 long_branch stubs won't do. */
11603
b34976b6 11604static bfd_boolean
4ce794b7 11605ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
11606{
11607 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 11608 struct bfd_link_info *info;
721956f4 11609 struct ppc_link_hash_table *htab;
f891966f
AM
11610 asection *plt;
11611 bfd_vma targ, off, r2off;
04bdff6a 11612 unsigned int size, extra, lr_used, delta, odd;
721956f4
AM
11613
11614 /* Massage our args to the form they really have. */
11615 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
11616 info = in_arg;
11617
11618 htab = ppc_hash_table (info);
4dfe6ac6
NC
11619 if (htab == NULL)
11620 return FALSE;
721956f4 11621
1aa42141
AM
11622 /* Make a note of the offset within the stubs for this entry. */
11623 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11624
a4b6fadd
AM
11625 if (stub_entry->h != NULL
11626 && stub_entry->h->save_res
11627 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11628 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11629 {
11630 /* Don't make stubs to out-of-line register save/restore
11631 functions. Instead, emit copies of the functions. */
11632 stub_entry->group->needs_save_res = 1;
11633 stub_entry->stub_type = ppc_stub_save_res;
11634 return TRUE;
11635 }
11636
f891966f 11637 switch (stub_entry->stub_type)
721956f4 11638 {
f891966f
AM
11639 case ppc_stub_plt_branch:
11640 case ppc_stub_plt_branch_r2off:
11641 /* Reset the stub type from the plt branch variant in case we now
11642 can reach with a shorter stub. */
11643 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11644 /* Fall through. */
11645 case ppc_stub_long_branch:
11646 case ppc_stub_long_branch_r2off:
1aa42141
AM
11647 targ = (stub_entry->target_value
11648 + stub_entry->target_section->output_offset
11649 + stub_entry->target_section->output_section->vma);
f891966f 11650 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
1aa42141
AM
11651 off = (stub_entry->stub_offset
11652 + stub_entry->group->stub_sec->output_offset
11653 + stub_entry->group->stub_sec->output_section->vma);
721956f4 11654
ad8e1ba5 11655 size = 4;
f891966f 11656 r2off = 0;
ad8e1ba5
AM
11657 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11658 {
25f53a85 11659 r2off = get_r2off (info, stub_entry);
a7c49797 11660 if (r2off == (bfd_vma) -1)
aa374f67
AM
11661 {
11662 htab->stub_error = TRUE;
11663 return FALSE;
11664 }
a7c49797 11665 size = 8;
ac2df442 11666 if (PPC_HA (r2off) != 0)
a7c49797
AM
11667 size += 4;
11668 if (PPC_LO (r2off) != 0)
11669 size += 4;
1aa42141 11670 off += size - 4;
ad8e1ba5 11671 }
1aa42141 11672 off = targ - off;
ad8e1ba5 11673
f891966f
AM
11674 /* If the branch offset is too big, use a ppc_stub_plt_branch.
11675 Do the same for -R objects without function descriptors. */
11676 if ((stub_entry->stub_type == ppc_stub_long_branch_r2off
11677 && r2off == 0
11678 && htab->sec_info[stub_entry->target_section->id].toc_off == 0)
11679 || off + (1 << 25) >= (bfd_vma) (1 << 26))
721956f4 11680 {
f891966f 11681 struct ppc_branch_hash_entry *br_entry;
df136d64 11682
f891966f
AM
11683 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11684 stub_entry->root.string + 9,
11685 TRUE, FALSE);
11686 if (br_entry == NULL)
721956f4 11687 {
f891966f
AM
11688 _bfd_error_handler (_("can't build branch stub `%s'"),
11689 stub_entry->root.string);
11690 htab->stub_error = TRUE;
11691 return FALSE;
721956f4
AM
11692 }
11693
f891966f 11694 if (br_entry->iter != htab->stub_iteration)
721956f4 11695 {
f891966f
AM
11696 br_entry->iter = htab->stub_iteration;
11697 br_entry->offset = htab->brlt->size;
11698 htab->brlt->size += 8;
63bc6f6c 11699
f891966f
AM
11700 if (htab->relbrlt != NULL)
11701 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11702 else if (info->emitrelocations)
84f5d08e 11703 {
f891966f
AM
11704 htab->brlt->reloc_count += 1;
11705 htab->brlt->flags |= SEC_RELOC;
05d0e962 11706 }
f891966f 11707 }
ac2df442 11708
f891966f
AM
11709 targ = (br_entry->offset
11710 + htab->brlt->output_offset
11711 + htab->brlt->output_section->vma);
11712 off = (elf_gp (info->output_bfd)
11713 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11714 off = targ - off;
176a0d42 11715
f891966f
AM
11716 if (info->emitrelocations)
11717 {
11718 stub_entry->group->stub_sec->reloc_count
11719 += 1 + (PPC_HA (off) != 0);
11720 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11721 }
05d0e962 11722
f891966f
AM
11723 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11724 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11725 {
11726 size = 12;
11727 if (PPC_HA (off) != 0)
11728 size = 16;
ac2df442 11729 }
f891966f 11730 else
ac2df442 11731 {
f891966f
AM
11732 size = 16;
11733 if (PPC_HA (off) != 0)
11734 size += 4;
11735
11736 if (PPC_HA (r2off) != 0)
11737 size += 4;
11738 if (PPC_LO (r2off) != 0)
11739 size += 4;
ac2df442 11740 }
721956f4 11741 }
f891966f
AM
11742 else if (info->emitrelocations)
11743 {
11744 stub_entry->group->stub_sec->reloc_count += 1;
11745 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11746 }
11747 break;
11748
11749 case ppc_stub_plt_branch_notoc:
11750 case ppc_stub_plt_branch_both:
11751 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11752 /* Fall through. */
11753 case ppc_stub_long_branch_notoc:
11754 case ppc_stub_long_branch_both:
11755 off = (stub_entry->stub_offset
11756 + stub_entry->group->stub_sec->output_offset
11757 + stub_entry->group->stub_sec->output_section->vma);
11758 size = 0;
11759 if (stub_entry->stub_type == ppc_stub_long_branch_both)
11760 size = 4;
11761 off += size;
11762 targ = (stub_entry->target_value
11763 + stub_entry->target_section->output_offset
11764 + stub_entry->target_section->output_section->vma);
04bdff6a 11765 odd = off & 4;
f891966f
AM
11766 off = targ - off;
11767
3d58e1fc
AM
11768 if (info->emitrelocations)
11769 {
04bdff6a
AM
11770 unsigned int num_rel;
11771 if (htab->powerxx_stubs)
11772 num_rel = num_relocs_for_powerxx_offset (off, odd);
11773 else
11774 num_rel = num_relocs_for_offset (off - 8);
11775 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
11776 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11777 }
11778
04bdff6a
AM
11779 if (htab->powerxx_stubs)
11780 extra = size_powerxx_offset (off, odd);
11781 else
11782 extra = size_offset (off - 8);
f891966f
AM
11783 /* Include branch insn plus those in the offset sequence. */
11784 size += 4 + extra;
11785 /* The branch insn is at the end, or "extra" bytes along. So
11786 its offset will be "extra" bytes less that that already
11787 calculated. */
11788 off -= extra;
11789
04bdff6a
AM
11790 if (!htab->powerxx_stubs)
11791 {
11792 /* After the bcl, lr has been modified so we need to emit
11793 .eh_frame info saying the return address is in r12. */
11794 lr_used = stub_entry->stub_offset + 8;
11795 if (stub_entry->stub_type == ppc_stub_long_branch_both)
11796 lr_used += 4;
11797 /* The eh_frame info will consist of a DW_CFA_advance_loc or
11798 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
11799 DW_CFA_restore_extended 65. */
11800 delta = lr_used - stub_entry->group->lr_restore;
11801 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11802 stub_entry->group->lr_restore = lr_used + 8;
11803 }
f891966f
AM
11804
11805 /* If the branch can't reach, use a plt_branch. */
11806 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11807 {
11808 stub_entry->stub_type += (ppc_stub_plt_branch_notoc
11809 - ppc_stub_long_branch_notoc);
11810 size += 4;
11811 }
3d58e1fc
AM
11812 else if (info->emitrelocations)
11813 stub_entry->group->stub_sec->reloc_count +=1;
f891966f
AM
11814 break;
11815
11816 case ppc_stub_plt_call_notoc:
11817 case ppc_stub_plt_call_both:
11818 off = (stub_entry->stub_offset
11819 + stub_entry->group->stub_sec->output_offset
11820 + stub_entry->group->stub_sec->output_section->vma);
11821 if (stub_entry->stub_type == ppc_stub_plt_call_both)
11822 off += 4;
11823 targ = stub_entry->plt_ent->plt.offset & ~1;
11824 if (targ >= (bfd_vma) -2)
11825 abort ();
11826
11827 plt = htab->elf.splt;
11828 if (!htab->elf.dynamic_sections_created
11829 || stub_entry->h == NULL
11830 || stub_entry->h->elf.dynindx == -1)
11831 {
11832 if (stub_entry->symtype == STT_GNU_IFUNC)
11833 plt = htab->elf.iplt;
11834 else
11835 plt = htab->pltlocal;
11836 }
11837 targ += plt->output_offset + plt->output_section->vma;
04bdff6a 11838 odd = off & 4;
f891966f
AM
11839 off = targ - off;
11840
11841 if (htab->params->plt_stub_align != 0)
11842 {
11843 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11844
11845 stub_entry->group->stub_sec->size += pad;
11846 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11847 off -= pad;
11848 }
11849
3d58e1fc
AM
11850 if (info->emitrelocations)
11851 {
04bdff6a
AM
11852 unsigned int num_rel;
11853 if (htab->powerxx_stubs)
11854 num_rel = num_relocs_for_powerxx_offset (off, odd);
11855 else
11856 num_rel = num_relocs_for_offset (off - 8);
11857 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
11858 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11859 }
11860
f891966f
AM
11861 size = plt_stub_size (htab, stub_entry, off);
11862
04bdff6a
AM
11863 if (!htab->powerxx_stubs)
11864 {
11865 /* After the bcl, lr has been modified so we need to emit
11866 .eh_frame info saying the return address is in r12. */
11867 lr_used = stub_entry->stub_offset + 8;
11868 if (stub_entry->stub_type == ppc_stub_plt_call_both)
11869 lr_used += 4;
11870 /* The eh_frame info will consist of a DW_CFA_advance_loc or
11871 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
11872 DW_CFA_restore_extended 65. */
11873 delta = lr_used - stub_entry->group->lr_restore;
11874 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11875 stub_entry->group->lr_restore = lr_used + 8;
11876 }
f891966f
AM
11877 break;
11878
11879 case ppc_stub_plt_call:
11880 case ppc_stub_plt_call_r2save:
11881 targ = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
11882 if (targ >= (bfd_vma) -2)
11883 abort ();
11884 plt = htab->elf.splt;
11885 if (!htab->elf.dynamic_sections_created
11886 || stub_entry->h == NULL
11887 || stub_entry->h->elf.dynindx == -1)
11888 {
11889 if (stub_entry->symtype == STT_GNU_IFUNC)
11890 plt = htab->elf.iplt;
11891 else
11892 plt = htab->pltlocal;
11893 }
11894 targ += plt->output_offset + plt->output_section->vma;
11895
11896 off = (elf_gp (info->output_bfd)
11897 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11898 off = targ - off;
11899
11900 if (htab->params->plt_stub_align != 0)
11901 {
11902 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11903
11904 stub_entry->group->stub_sec->size += pad;
11905 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11906 }
11907
11908 if (info->emitrelocations)
11909 {
11910 stub_entry->group->stub_sec->reloc_count
11911 += ((PPC_HA (off) != 0)
11912 + (htab->opd_abi
11913 ? 2 + (htab->params->plt_static_chain
11914 && PPC_HA (off + 16) == PPC_HA (off))
11915 : 1));
11916 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11917 }
11918
11919 size = plt_stub_size (htab, stub_entry, off);
11920
11921 if (stub_entry->h != NULL
ed7007c1 11922 && is_tls_get_addr (&stub_entry->h->elf, htab)
f891966f
AM
11923 && htab->params->tls_get_addr_opt
11924 && stub_entry->stub_type == ppc_stub_plt_call_r2save)
11925 {
11926 /* After the bctrl, lr has been modified so we need to
11927 emit .eh_frame info saying the return address is
11928 on the stack. In fact we put the EH info specifying
11929 that the return address is on the stack *at* the
11930 call rather than after it, because the EH info for a
11931 call needs to be specified by that point.
11932 See libgcc/unwind-dw2.c execute_cfa_program. */
11933 lr_used = stub_entry->stub_offset + size - 20;
11934 /* The eh_frame info will consist of a DW_CFA_advance_loc
11935 or variant, DW_CFA_offset_externed_sf, 65, -stackoff,
11936 DW_CFA_advance_loc+4, DW_CFA_restore_extended, 65. */
11937 delta = lr_used - stub_entry->group->lr_restore;
11938 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11939 stub_entry->group->lr_restore = size - 4;
11940 }
11941 break;
11942
11943 default:
11944 BFD_FAIL ();
11945 return FALSE;
721956f4
AM
11946 }
11947
6f20ed8a 11948 stub_entry->group->stub_sec->size += size;
b34976b6 11949 return TRUE;
721956f4
AM
11950}
11951
11952/* Set up various things so that we can make a list of input sections
11953 for each output section included in the link. Returns -1 on error,
cedb70c5 11954 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
11955
11956int
e7d1c40c 11957ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4 11958{
6f20ed8a 11959 unsigned int id;
721956f4
AM
11960 bfd_size_type amt;
11961 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11962
4dfe6ac6
NC
11963 if (htab == NULL)
11964 return -1;
4c52953f 11965
7cf7fcc8 11966 htab->sec_info_arr_size = _bfd_section_id;
6f20ed8a
AM
11967 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
11968 htab->sec_info = bfd_zmalloc (amt);
11969 if (htab->sec_info == NULL)
721956f4
AM
11970 return -1;
11971
3d6f9012
AM
11972 /* Set toc_off for com, und, abs and ind sections. */
11973 for (id = 0; id < 3; id++)
6f20ed8a 11974 htab->sec_info[id].toc_off = TOC_BASE_OFF;
734b6cf9 11975
721956f4
AM
11976 return 1;
11977}
11978
927be08e
AM
11979/* Set up for first pass at multitoc partitioning. */
11980
11981void
11982ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11983{
11984 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11985
1c865ab2 11986 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
11987 htab->toc_bfd = NULL;
11988 htab->toc_first_sec = NULL;
11989}
11990
e717da7e
AM
11991/* The linker repeatedly calls this function for each TOC input section
11992 and linker generated GOT section. Group input bfds such that the toc
927be08e 11993 within a group is less than 64k in size. */
ad8e1ba5 11994
927be08e 11995bfd_boolean
4ce794b7 11996ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
11997{
11998 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 11999 bfd_vma addr, off, limit;
ad8e1ba5 12000
4dfe6ac6
NC
12001 if (htab == NULL)
12002 return FALSE;
12003
927be08e 12004 if (!htab->second_toc_pass)
4c52953f 12005 {
927be08e 12006 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
12007 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
12008
12009 if (new_bfd)
bf102f86
AM
12010 {
12011 htab->toc_bfd = isec->owner;
12012 htab->toc_first_sec = isec;
12013 }
927be08e 12014
bf102f86
AM
12015 addr = isec->output_offset + isec->output_section->vma;
12016 off = addr - htab->toc_curr;
d77c8a4b
AM
12017 limit = 0x80008000;
12018 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
12019 limit = 0x10000;
12020 if (off + isec->size > limit)
bf102f86
AM
12021 {
12022 addr = (htab->toc_first_sec->output_offset
12023 + htab->toc_first_sec->output_section->vma);
12024 htab->toc_curr = addr;
a27e685f 12025 htab->toc_curr &= -TOC_BASE_ALIGN;
bf102f86 12026 }
99877b66 12027
927be08e
AM
12028 /* toc_curr is the base address of this toc group. Set elf_gp
12029 for the input section to be the offset relative to the
12030 output toc base plus 0x8000. Making the input elf_gp an
12031 offset allows us to move the toc as a whole without
12032 recalculating input elf_gp. */
06bcf541 12033 off = htab->toc_curr - elf_gp (info->output_bfd);
927be08e
AM
12034 off += TOC_BASE_OFF;
12035
12036 /* Die if someone uses a linker script that doesn't keep input
12037 file .toc and .got together. */
a4fd3de5
AM
12038 if (new_bfd
12039 && elf_gp (isec->owner) != 0
927be08e
AM
12040 && elf_gp (isec->owner) != off)
12041 return FALSE;
12042
12043 elf_gp (isec->owner) = off;
12044 return TRUE;
4c52953f 12045 }
927be08e
AM
12046
12047 /* During the second pass toc_first_sec points to the start of
12048 a toc group, and toc_curr is used to track the old elf_gp.
12049 We use toc_bfd to ensure we only look at each bfd once. */
12050 if (htab->toc_bfd == isec->owner)
12051 return TRUE;
12052 htab->toc_bfd = isec->owner;
12053
12054 if (htab->toc_first_sec == NULL
12055 || htab->toc_curr != elf_gp (isec->owner))
12056 {
12057 htab->toc_curr = elf_gp (isec->owner);
12058 htab->toc_first_sec = isec;
12059 }
12060 addr = (htab->toc_first_sec->output_offset
12061 + htab->toc_first_sec->output_section->vma);
06bcf541 12062 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
927be08e
AM
12063 elf_gp (isec->owner) = off;
12064
12065 return TRUE;
ad8e1ba5
AM
12066}
12067
927be08e
AM
12068/* Called via elf_link_hash_traverse to merge GOT entries for global
12069 symbol H. */
12070
12071static bfd_boolean
12072merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12073{
12074 if (h->root.type == bfd_link_hash_indirect)
12075 return TRUE;
12076
927be08e
AM
12077 merge_got_entries (&h->got.glist);
12078
12079 return TRUE;
12080}
12081
12082/* Called via elf_link_hash_traverse to allocate GOT entries for global
12083 symbol H. */
12084
12085static bfd_boolean
12086reallocate_got (struct elf_link_hash_entry *h, void *inf)
12087{
12088 struct got_entry *gent;
12089
12090 if (h->root.type == bfd_link_hash_indirect)
12091 return TRUE;
12092
927be08e
AM
12093 for (gent = h->got.glist; gent != NULL; gent = gent->next)
12094 if (!gent->is_indirect)
12095 allocate_got (h, (struct bfd_link_info *) inf, gent);
12096 return TRUE;
12097}
12098
12099/* Called on the first multitoc pass after the last call to
12100 ppc64_elf_next_toc_section. This function removes duplicate GOT
12101 entries. */
12102
12103bfd_boolean
12104ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
12105{
12106 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
12107 struct bfd *ibfd, *ibfd2;
12108 bfd_boolean done_something;
12109
12110 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 12111
7865406b
AM
12112 if (!htab->do_multi_toc)
12113 return FALSE;
12114
d0fae19d 12115 /* Merge global sym got entries within a toc group. */
927be08e
AM
12116 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
12117
12118 /* And tlsld_got. */
c72f2fb2 12119 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12120 {
12121 struct got_entry *ent, *ent2;
12122
12123 if (!is_ppc64_elf (ibfd))
12124 continue;
12125
12126 ent = ppc64_tlsld_got (ibfd);
12127 if (!ent->is_indirect
12128 && ent->got.offset != (bfd_vma) -1)
12129 {
c72f2fb2 12130 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
12131 {
12132 if (!is_ppc64_elf (ibfd2))
12133 continue;
12134
12135 ent2 = ppc64_tlsld_got (ibfd2);
12136 if (!ent2->is_indirect
12137 && ent2->got.offset != (bfd_vma) -1
12138 && elf_gp (ibfd2) == elf_gp (ibfd))
12139 {
12140 ent2->is_indirect = TRUE;
12141 ent2->got.ent = ent;
12142 }
12143 }
12144 }
12145 }
12146
12147 /* Zap sizes of got sections. */
33e44f2e
AM
12148 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
12149 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
12150 htab->got_reli_size = 0;
12151
c72f2fb2 12152 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12153 {
12154 asection *got, *relgot;
12155
12156 if (!is_ppc64_elf (ibfd))
12157 continue;
12158
12159 got = ppc64_elf_tdata (ibfd)->got;
12160 if (got != NULL)
12161 {
12162 got->rawsize = got->size;
12163 got->size = 0;
12164 relgot = ppc64_elf_tdata (ibfd)->relgot;
12165 relgot->rawsize = relgot->size;
12166 relgot->size = 0;
12167 }
12168 }
12169
12170 /* Now reallocate the got, local syms first. We don't need to
12171 allocate section contents again since we never increase size. */
c72f2fb2 12172 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12173 {
12174 struct got_entry **lgot_ents;
12175 struct got_entry **end_lgot_ents;
12176 struct plt_entry **local_plt;
12177 struct plt_entry **end_local_plt;
f961d9dd 12178 unsigned char *lgot_masks;
927be08e
AM
12179 bfd_size_type locsymcount;
12180 Elf_Internal_Shdr *symtab_hdr;
19e08130 12181 asection *s;
927be08e
AM
12182
12183 if (!is_ppc64_elf (ibfd))
12184 continue;
12185
12186 lgot_ents = elf_local_got_ents (ibfd);
12187 if (!lgot_ents)
12188 continue;
12189
12190 symtab_hdr = &elf_symtab_hdr (ibfd);
12191 locsymcount = symtab_hdr->sh_info;
12192 end_lgot_ents = lgot_ents + locsymcount;
12193 local_plt = (struct plt_entry **) end_lgot_ents;
12194 end_local_plt = local_plt + locsymcount;
f961d9dd 12195 lgot_masks = (unsigned char *) end_local_plt;
927be08e 12196 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
12197 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
12198 {
12199 struct got_entry *ent;
12200
12201 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 12202 {
19e08130
AM
12203 unsigned int ent_size = 8;
12204 unsigned int rel_size = sizeof (Elf64_External_Rela);
12205
d0fae19d
AM
12206 ent->got.offset = s->size;
12207 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 12208 {
19e08130
AM
12209 ent_size *= 2;
12210 rel_size *= 2;
12211 }
12212 s->size += ent_size;
37da22e5 12213 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 12214 {
33e44f2e 12215 htab->elf.irelplt->size += rel_size;
19e08130
AM
12216 htab->got_reli_size += rel_size;
12217 }
6a3858a6 12218 else if (bfd_link_pic (info)
f749f26e 12219 && !(ent->tls_type != 0
6a3858a6 12220 && bfd_link_executable (info)))
19e08130
AM
12221 {
12222 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12223 srel->size += rel_size;
d0fae19d
AM
12224 }
12225 }
927be08e
AM
12226 }
12227 }
12228
12229 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
12230
c72f2fb2 12231 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12232 {
12233 struct got_entry *ent;
12234
12235 if (!is_ppc64_elf (ibfd))
12236 continue;
12237
12238 ent = ppc64_tlsld_got (ibfd);
12239 if (!ent->is_indirect
12240 && ent->got.offset != (bfd_vma) -1)
12241 {
12242 asection *s = ppc64_elf_tdata (ibfd)->got;
12243 ent->got.offset = s->size;
12244 s->size += 16;
f749f26e 12245 if (bfd_link_dll (info))
927be08e
AM
12246 {
12247 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12248 srel->size += sizeof (Elf64_External_Rela);
12249 }
12250 }
12251 }
12252
33e44f2e 12253 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 12254 if (!done_something)
c72f2fb2 12255 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12256 {
12257 asection *got;
12258
12259 if (!is_ppc64_elf (ibfd))
12260 continue;
12261
12262 got = ppc64_elf_tdata (ibfd)->got;
12263 if (got != NULL)
12264 {
12265 done_something = got->rawsize != got->size;
12266 if (done_something)
12267 break;
12268 }
12269 }
12270
12271 if (done_something)
e7d1c40c 12272 (*htab->params->layout_sections_again) ();
927be08e
AM
12273
12274 /* Set up for second pass over toc sections to recalculate elf_gp
12275 on input sections. */
12276 htab->toc_bfd = NULL;
12277 htab->toc_first_sec = NULL;
12278 htab->second_toc_pass = TRUE;
12279 return done_something;
12280}
12281
12282/* Called after second pass of multitoc partitioning. */
12283
12284void
12285ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
12286{
12287 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12288
12289 /* After the second pass, toc_curr tracks the TOC offset used
12290 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 12291 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
12292}
12293
9b5ecbd0
AM
12294/* No toc references were found in ISEC. If the code in ISEC makes no
12295 calls, then there's no need to use toc adjusting stubs when branching
12296 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
12297 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
12298 needed, and 2 if a cyclical call-graph was found but no other reason
12299 for a stub was detected. If called from the top level, a return of
12300 2 means the same as a return of 0. */
9b5ecbd0
AM
12301
12302static int
4ce794b7 12303toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 12304{
9b5ecbd0 12305 int ret;
70cc837d
AM
12306
12307 /* Mark this section as checked. */
12308 isec->call_check_done = 1;
9b5ecbd0 12309
772119ce
AM
12310 /* We know none of our code bearing sections will need toc stubs. */
12311 if ((isec->flags & SEC_LINKER_CREATED) != 0)
12312 return 0;
12313
eea6121a 12314 if (isec->size == 0)
082c50f8
AM
12315 return 0;
12316
4c52953f
AM
12317 if (isec->output_section == NULL)
12318 return 0;
12319
4c52953f 12320 ret = 0;
70cc837d 12321 if (isec->reloc_count != 0)
9b5ecbd0 12322 {
70cc837d
AM
12323 Elf_Internal_Rela *relstart, *rel;
12324 Elf_Internal_Sym *local_syms;
12325 struct ppc_link_hash_table *htab;
2917689a 12326
70cc837d
AM
12327 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
12328 info->keep_memory);
12329 if (relstart == NULL)
12330 return -1;
90aecf7a 12331
70cc837d
AM
12332 /* Look for branches to outside of this section. */
12333 local_syms = NULL;
12334 htab = ppc_hash_table (info);
12335 if (htab == NULL)
12336 return -1;
4c52953f 12337
70cc837d 12338 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 12339 {
70cc837d
AM
12340 enum elf_ppc64_reloc_type r_type;
12341 unsigned long r_symndx;
12342 struct elf_link_hash_entry *h;
12343 struct ppc_link_hash_entry *eh;
12344 Elf_Internal_Sym *sym;
12345 asection *sym_sec;
12346 struct _opd_sec_data *opd;
12347 bfd_vma sym_value;
12348 bfd_vma dest;
12349
12350 r_type = ELF64_R_TYPE (rel->r_info);
12351 if (r_type != R_PPC64_REL24
05d0e962 12352 && r_type != R_PPC64_REL24_NOTOC
70cc837d
AM
12353 && r_type != R_PPC64_REL14
12354 && r_type != R_PPC64_REL14_BRTAKEN
23cedd1d 12355 && r_type != R_PPC64_REL14_BRNTAKEN
5663e321
AM
12356 && r_type != R_PPC64_PLTCALL
12357 && r_type != R_PPC64_PLTCALL_NOTOC)
70cc837d 12358 continue;
4c52953f 12359
70cc837d
AM
12360 r_symndx = ELF64_R_SYM (rel->r_info);
12361 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
12362 isec->owner))
4c52953f 12363 {
70cc837d
AM
12364 ret = -1;
12365 break;
12366 }
4c52953f 12367
70cc837d
AM
12368 /* Calls to dynamic lib functions go through a plt call stub
12369 that uses r2. */
ed7007c1 12370 eh = ppc_elf_hash_entry (h);
70cc837d
AM
12371 if (eh != NULL
12372 && (eh->elf.plt.plist != NULL
12373 || (eh->oh != NULL
12374 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
12375 {
12376 ret = 1;
12377 break;
4c52953f
AM
12378 }
12379
70cc837d
AM
12380 if (sym_sec == NULL)
12381 /* Ignore other undefined symbols. */
4c52953f 12382 continue;
4c52953f 12383
70cc837d
AM
12384 /* Assume branches to other sections not included in the
12385 link need stubs too, to cover -R and absolute syms. */
12386 if (sym_sec->output_section == NULL)
12387 {
12388 ret = 1;
12389 break;
12390 }
4c52953f 12391
70cc837d
AM
12392 if (h == NULL)
12393 sym_value = sym->st_value;
12394 else
12395 {
12396 if (h->root.type != bfd_link_hash_defined
12397 && h->root.type != bfd_link_hash_defweak)
12398 abort ();
12399 sym_value = h->root.u.def.value;
12400 }
12401 sym_value += rel->r_addend;
4c52953f 12402
70cc837d
AM
12403 /* If this branch reloc uses an opd sym, find the code section. */
12404 opd = get_opd_info (sym_sec);
12405 if (opd != NULL)
12406 {
12407 if (h == NULL && opd->adjust != NULL)
12408 {
12409 long adjust;
4c52953f 12410
92a9c616 12411 adjust = opd->adjust[OPD_NDX (sym_value)];
70cc837d
AM
12412 if (adjust == -1)
12413 /* Assume deleted functions won't ever be called. */
12414 continue;
12415 sym_value += adjust;
12416 }
4c52953f 12417
aef36ac1
AM
12418 dest = opd_entry_value (sym_sec, sym_value,
12419 &sym_sec, NULL, FALSE);
70cc837d
AM
12420 if (dest == (bfd_vma) -1)
12421 continue;
12422 }
12423 else
12424 dest = (sym_value
12425 + sym_sec->output_offset
12426 + sym_sec->output_section->vma);
4c52953f 12427
70cc837d
AM
12428 /* Ignore branch to self. */
12429 if (sym_sec == isec)
12430 continue;
4c52953f 12431
70cc837d
AM
12432 /* If the called function uses the toc, we need a stub. */
12433 if (sym_sec->has_toc_reloc
12434 || sym_sec->makes_toc_func_call)
4c52953f 12435 {
70cc837d 12436 ret = 1;
4c52953f
AM
12437 break;
12438 }
70cc837d
AM
12439
12440 /* Assume any branch that needs a long branch stub might in fact
12441 need a plt_branch stub. A plt_branch stub uses r2. */
12442 else if (dest - (isec->output_offset
12443 + isec->output_section->vma
6911b7dc
AM
12444 + rel->r_offset) + (1 << 25)
12445 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
12446 ? h->other
12447 : sym->st_other))
4c52953f 12448 {
70cc837d
AM
12449 ret = 1;
12450 break;
12451 }
12452
12453 /* If calling back to a section in the process of being
12454 tested, we can't say for sure that no toc adjusting stubs
12455 are needed, so don't return zero. */
12456 else if (sym_sec->call_check_in_progress)
12457 ret = 2;
12458
12459 /* Branches to another section that itself doesn't have any TOC
12460 references are OK. Recursively call ourselves to check. */
12461 else if (!sym_sec->call_check_done)
12462 {
12463 int recur;
12464
12465 /* Mark current section as indeterminate, so that other
12466 sections that call back to current won't be marked as
12467 known. */
12468 isec->call_check_in_progress = 1;
12469 recur = toc_adjusting_stub_needed (info, sym_sec);
12470 isec->call_check_in_progress = 0;
12471
4c52953f
AM
12472 if (recur != 0)
12473 {
70cc837d
AM
12474 ret = recur;
12475 if (recur != 2)
12476 break;
4c52953f
AM
12477 }
12478 }
4c52953f 12479 }
70cc837d
AM
12480
12481 if (local_syms != NULL
12482 && (elf_symtab_hdr (isec->owner).contents
12483 != (unsigned char *) local_syms))
12484 free (local_syms);
12485 if (elf_section_data (isec)->relocs != relstart)
12486 free (relstart);
9b5ecbd0
AM
12487 }
12488
70cc837d
AM
12489 if ((ret & 1) == 0
12490 && isec->map_head.s != NULL
12491 && (strcmp (isec->output_section->name, ".init") == 0
12492 || strcmp (isec->output_section->name, ".fini") == 0))
12493 {
12494 if (isec->map_head.s->has_toc_reloc
12495 || isec->map_head.s->makes_toc_func_call)
12496 ret = 1;
12497 else if (!isec->map_head.s->call_check_done)
12498 {
12499 int recur;
12500 isec->call_check_in_progress = 1;
12501 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
12502 isec->call_check_in_progress = 0;
12503 if (recur != 0)
12504 ret = recur;
12505 }
12506 }
12507
12508 if (ret == 1)
12509 isec->makes_toc_func_call = 1;
4c52953f 12510
9b5ecbd0
AM
12511 return ret;
12512}
12513
721956f4
AM
12514/* The linker repeatedly calls this function for each input section,
12515 in the order that input sections are linked into output sections.
12516 Build lists of input sections to determine groupings between which
12517 we may insert linker stubs. */
12518
9b5ecbd0 12519bfd_boolean
4ce794b7 12520ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
12521{
12522 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12523
4dfe6ac6
NC
12524 if (htab == NULL)
12525 return FALSE;
12526
734b6cf9 12527 if ((isec->output_section->flags & SEC_CODE) != 0
6f20ed8a 12528 && isec->output_section->id < htab->sec_info_arr_size)
721956f4 12529 {
3d6f9012
AM
12530 /* This happens to make the list in reverse order,
12531 which is what we want. */
6f20ed8a
AM
12532 htab->sec_info[isec->id].u.list
12533 = htab->sec_info[isec->output_section->id].u.list;
12534 htab->sec_info[isec->output_section->id].u.list = isec;
721956f4 12535 }
ad8e1ba5 12536
4c52953f 12537 if (htab->multi_toc_needed)
9b5ecbd0 12538 {
8b974ba3
AM
12539 /* Analyse sections that aren't already flagged as needing a
12540 valid toc pointer. Exclude .fixup for the linux kernel.
12541 .fixup contains branches, but only back to the function that
12542 hit an exception. */
12543 if (!(isec->has_toc_reloc
12544 || (isec->flags & SEC_CODE) == 0
12545 || strcmp (isec->name, ".fixup") == 0
12546 || isec->call_check_done))
12547 {
12548 if (toc_adjusting_stub_needed (info, isec) < 0)
6683a28d 12549 return FALSE;
8b974ba3
AM
12550 }
12551 /* Make all sections use the TOC assigned for this object file.
12552 This will be wrong for pasted sections; We fix that in
12553 check_pasted_section(). */
12554 if (elf_gp (isec->owner) != 0)
12555 htab->toc_curr = elf_gp (isec->owner);
12556 }
12557
6f20ed8a 12558 htab->sec_info[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 12559 return TRUE;
721956f4
AM
12560}
12561
70cc837d
AM
12562/* Check that all .init and .fini sections use the same toc, if they
12563 have toc relocs. */
12564
12565static bfd_boolean
12566check_pasted_section (struct bfd_link_info *info, const char *name)
12567{
12568 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12569
12570 if (o != NULL)
12571 {
12572 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12573 bfd_vma toc_off = 0;
12574 asection *i;
12575
12576 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12577 if (i->has_toc_reloc)
12578 {
12579 if (toc_off == 0)
6f20ed8a
AM
12580 toc_off = htab->sec_info[i->id].toc_off;
12581 else if (toc_off != htab->sec_info[i->id].toc_off)
70cc837d
AM
12582 return FALSE;
12583 }
6683a28d
AM
12584
12585 if (toc_off == 0)
12586 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12587 if (i->makes_toc_func_call)
12588 {
6f20ed8a 12589 toc_off = htab->sec_info[i->id].toc_off;
6683a28d
AM
12590 break;
12591 }
12592
70cc837d
AM
12593 /* Make sure the whole pasted function uses the same toc offset. */
12594 if (toc_off != 0)
12595 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
6f20ed8a 12596 htab->sec_info[i->id].toc_off = toc_off;
70cc837d
AM
12597 }
12598 return TRUE;
12599}
12600
12601bfd_boolean
12602ppc64_elf_check_init_fini (struct bfd_link_info *info)
12603{
12604 return (check_pasted_section (info, ".init")
12605 & check_pasted_section (info, ".fini"));
12606}
12607
721956f4
AM
12608/* See whether we can group stub sections together. Grouping stub
12609 sections may result in fewer stubs. More importantly, we need to
12610 put all .init* and .fini* stubs at the beginning of the .init or
12611 .fini output sections respectively, because glibc splits the
12612 _init and _fini functions into multiple parts. Putting a stub in
12613 the middle of a function is not a good idea. */
12614
6f20ed8a
AM
12615static bfd_boolean
12616group_sections (struct bfd_link_info *info,
4ce794b7
AM
12617 bfd_size_type stub_group_size,
12618 bfd_boolean stubs_always_before_branch)
721956f4 12619{
6f20ed8a
AM
12620 struct ppc_link_hash_table *htab;
12621 asection *osec;
7c8fe5c4
AM
12622 bfd_boolean suppress_size_errors;
12623
6f20ed8a
AM
12624 htab = ppc_hash_table (info);
12625 if (htab == NULL)
12626 return FALSE;
12627
7c8fe5c4 12628 suppress_size_errors = FALSE;
7c8fe5c4
AM
12629 if (stub_group_size == 1)
12630 {
12631 /* Default values. */
12632 if (stubs_always_before_branch)
09f92717 12633 stub_group_size = 0x1e00000;
7c8fe5c4 12634 else
09f92717 12635 stub_group_size = 0x1c00000;
7c8fe5c4
AM
12636 suppress_size_errors = TRUE;
12637 }
12638
6f20ed8a 12639 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
721956f4 12640 {
6f20ed8a
AM
12641 asection *tail;
12642
12643 if (osec->id >= htab->sec_info_arr_size)
12644 continue;
12645
12646 tail = htab->sec_info[osec->id].u.list;
734b6cf9 12647 while (tail != NULL)
721956f4 12648 {
734b6cf9
AM
12649 asection *curr;
12650 asection *prev;
12651 bfd_size_type total;
12652 bfd_boolean big_sec;
12653 bfd_vma curr_toc;
6f20ed8a 12654 struct map_stub *group;
09f92717 12655 bfd_size_type group_size;
734b6cf9
AM
12656
12657 curr = tail;
eea6121a 12658 total = tail->size;
09f92717
AM
12659 group_size = (ppc64_elf_section_data (tail) != NULL
12660 && ppc64_elf_section_data (tail)->has_14bit_branch
12661 ? stub_group_size >> 10 : stub_group_size);
12662
12663 big_sec = total > group_size;
7c8fe5c4 12664 if (big_sec && !suppress_size_errors)
695344c0 12665 /* xgettext:c-format */
871b3ab2 12666 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
4eca0228 12667 tail->owner, tail);
6f20ed8a 12668 curr_toc = htab->sec_info[tail->id].toc_off;
734b6cf9 12669
6f20ed8a 12670 while ((prev = htab->sec_info[curr->id].u.list) != NULL
734b6cf9 12671 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
12672 < (ppc64_elf_section_data (prev) != NULL
12673 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12674 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12675 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12676 curr = prev;
12677
12678 /* OK, the size from the start of CURR to the end is less
09f92717 12679 than group_size and thus can be handled by one stub
734b6cf9 12680 section. (or the tail section is itself larger than
09f92717
AM
12681 group_size, in which case we may be toast.) We should
12682 really be keeping track of the total size of stubs added
12683 here, as stubs contribute to the final output section
12684 size. That's a little tricky, and this way will only
12685 break if stubs added make the total size more than 2^25,
12686 ie. for the default stub_group_size, if stubs total more
12687 than 2097152 bytes, or nearly 75000 plt call stubs. */
6f20ed8a
AM
12688 group = bfd_alloc (curr->owner, sizeof (*group));
12689 if (group == NULL)
12690 return FALSE;
12691 group->link_sec = curr;
12692 group->stub_sec = NULL;
a4b6fadd 12693 group->needs_save_res = 0;
df136d64
AM
12694 group->lr_restore = 0;
12695 group->eh_size = 0;
12696 group->eh_base = 0;
a4b6fadd
AM
12697 group->next = htab->group;
12698 htab->group = group;
734b6cf9 12699 do
721956f4 12700 {
6f20ed8a 12701 prev = htab->sec_info[tail->id].u.list;
734b6cf9 12702 /* Set up this stub group. */
6f20ed8a 12703 htab->sec_info[tail->id].u.group = group;
721956f4 12704 }
734b6cf9
AM
12705 while (tail != curr && (tail = prev) != NULL);
12706
09f92717 12707 /* But wait, there's more! Input sections up to group_size
734b6cf9
AM
12708 bytes before the stub section can be handled by it too.
12709 Don't do this if we have a really large section after the
12710 stubs, as adding more stubs increases the chance that
12711 branches may not reach into the stub section. */
12712 if (!stubs_always_before_branch && !big_sec)
12713 {
12714 total = 0;
12715 while (prev != NULL
12716 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
12717 < (ppc64_elf_section_data (prev) != NULL
12718 && ppc64_elf_section_data (prev)->has_14bit_branch
2cdcc330
AM
12719 ? (group_size = stub_group_size >> 10)
12720 : group_size))
6f20ed8a 12721 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12722 {
12723 tail = prev;
6f20ed8a
AM
12724 prev = htab->sec_info[tail->id].u.list;
12725 htab->sec_info[tail->id].u.group = group;
734b6cf9
AM
12726 }
12727 }
12728 tail = prev;
721956f4
AM
12729 }
12730 }
6f20ed8a 12731 return TRUE;
721956f4
AM
12732}
12733
58d180e8
AM
12734static const unsigned char glink_eh_frame_cie[] =
12735{
12736 0, 0, 0, 16, /* length. */
12737 0, 0, 0, 0, /* id. */
12738 1, /* CIE version. */
12739 'z', 'R', 0, /* Augmentation string. */
12740 4, /* Code alignment. */
12741 0x78, /* Data alignment. */
12742 65, /* RA reg. */
12743 1, /* Augmentation size. */
12744 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
2e0ce1c8 12745 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
58d180e8
AM
12746};
12747
d969d15f
AM
12748/* Stripping output sections is normally done before dynamic section
12749 symbols have been allocated. This function is called later, and
12750 handles cases like htab->brlt which is mapped to its own output
12751 section. */
12752
12753static void
12754maybe_strip_output (struct bfd_link_info *info, asection *isec)
12755{
12756 if (isec->size == 0
12757 && isec->output_section->size == 0
53d8967a 12758 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
12759 && !bfd_section_removed_from_list (info->output_bfd,
12760 isec->output_section)
12761 && elf_section_data (isec->output_section)->dynindx == 0)
12762 {
12763 isec->output_section->flags |= SEC_EXCLUDE;
12764 bfd_section_list_remove (info->output_bfd, isec->output_section);
12765 info->output_bfd->section_count--;
12766 }
12767}
12768
721956f4
AM
12769/* Determine and set the size of the stub section for a final link.
12770
12771 The basic idea here is to examine all the relocations looking for
12772 PC-relative calls to a target that is unreachable with a "bl"
12773 instruction. */
12774
b34976b6 12775bfd_boolean
e7d1c40c 12776ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
12777{
12778 bfd_size_type stub_group_size;
b34976b6 12779 bfd_boolean stubs_always_before_branch;
721956f4
AM
12780 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12781
4dfe6ac6
NC
12782 if (htab == NULL)
12783 return FALSE;
12784
0e1862bb 12785 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
e7d1c40c 12786 htab->params->plt_thread_safe = 1;
b9e5796b 12787 if (!htab->opd_abi)
e7d1c40c
AM
12788 htab->params->plt_thread_safe = 0;
12789 else if (htab->params->plt_thread_safe == -1)
794e51c0 12790 {
e2458743 12791 static const char *const thread_starter[] =
794e51c0
AM
12792 {
12793 "pthread_create",
12794 /* libstdc++ */
12795 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12796 /* librt */
12797 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12798 "mq_notify", "create_timer",
12799 /* libanl */
12800 "getaddrinfo_a",
12801 /* libgomp */
2300b5a1 12802 "GOMP_parallel",
794e51c0 12803 "GOMP_parallel_start",
2300b5a1 12804 "GOMP_parallel_loop_static",
794e51c0 12805 "GOMP_parallel_loop_static_start",
2300b5a1 12806 "GOMP_parallel_loop_dynamic",
794e51c0 12807 "GOMP_parallel_loop_dynamic_start",
2300b5a1 12808 "GOMP_parallel_loop_guided",
794e51c0 12809 "GOMP_parallel_loop_guided_start",
2300b5a1 12810 "GOMP_parallel_loop_runtime",
794e51c0 12811 "GOMP_parallel_loop_runtime_start",
2300b5a1 12812 "GOMP_parallel_sections",
68ffbac6 12813 "GOMP_parallel_sections_start",
f9dffbf0
AM
12814 /* libgo */
12815 "__go_go",
794e51c0
AM
12816 };
12817 unsigned i;
12818
a4b6fadd 12819 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
794e51c0
AM
12820 {
12821 struct elf_link_hash_entry *h;
12822 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12823 FALSE, FALSE, TRUE);
e7d1c40c
AM
12824 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12825 if (htab->params->plt_thread_safe)
794e51c0
AM
12826 break;
12827 }
12828 }
e7d1c40c
AM
12829 stubs_always_before_branch = htab->params->group_size < 0;
12830 if (htab->params->group_size < 0)
12831 stub_group_size = -htab->params->group_size;
721956f4 12832 else
e7d1c40c 12833 stub_group_size = htab->params->group_size;
721956f4 12834
6f20ed8a
AM
12835 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12836 return FALSE;
721956f4 12837
c9301e31
AM
12838#define STUB_SHRINK_ITER 20
12839 /* Loop until no stubs added. After iteration 20 of this loop we may
12840 exit on a stub section shrinking. This is to break out of a
12841 pathological case where adding stubs on one iteration decreases
12842 section gaps (perhaps due to alignment), which then requires
12843 fewer or smaller stubs on the next iteration. */
12844
721956f4
AM
12845 while (1)
12846 {
12847 bfd *input_bfd;
12848 unsigned int bfd_indx;
a4b6fadd 12849 struct map_stub *group;
721956f4
AM
12850
12851 htab->stub_iteration += 1;
721956f4
AM
12852
12853 for (input_bfd = info->input_bfds, bfd_indx = 0;
12854 input_bfd != NULL;
c72f2fb2 12855 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
12856 {
12857 Elf_Internal_Shdr *symtab_hdr;
12858 asection *section;
6cdc0ccc 12859 Elf_Internal_Sym *local_syms = NULL;
721956f4 12860
0c8d6e5c 12861 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
12862 continue;
12863
721956f4 12864 /* We'll need the symbol table in a second. */
0ffa91dd 12865 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
12866 if (symtab_hdr->sh_info == 0)
12867 continue;
12868
721956f4
AM
12869 /* Walk over each section attached to the input bfd. */
12870 for (section = input_bfd->sections;
12871 section != NULL;
12872 section = section->next)
12873 {
721956f4 12874 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
12875
12876 /* If there aren't any relocs, then there's nothing more
12877 to do. */
12878 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
12879 || (section->flags & SEC_ALLOC) == 0
12880 || (section->flags & SEC_LOAD) == 0
12881 || (section->flags & SEC_CODE) == 0
721956f4
AM
12882 || section->reloc_count == 0)
12883 continue;
12884
12885 /* If this section is a link-once section that will be
12886 discarded, then don't create any stubs. */
12887 if (section->output_section == NULL
927be08e 12888 || section->output_section->owner != info->output_bfd)
721956f4
AM
12889 continue;
12890
1e2f5b6e
AM
12891 /* Get the relocs. */
12892 internal_relocs
4ce794b7 12893 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 12894 info->keep_memory);
721956f4 12895 if (internal_relocs == NULL)
1e2f5b6e 12896 goto error_ret_free_local;
721956f4
AM
12897
12898 /* Now examine each relocation. */
12899 irela = internal_relocs;
12900 irelaend = irela + section->reloc_count;
12901 for (; irela < irelaend; irela++)
12902 {
4ce794b7
AM
12903 enum elf_ppc64_reloc_type r_type;
12904 unsigned int r_indx;
721956f4
AM
12905 enum ppc_stub_type stub_type;
12906 struct ppc_stub_hash_entry *stub_entry;
8387904d 12907 asection *sym_sec, *code_sec;
e054468f 12908 bfd_vma sym_value, code_value;
721956f4 12909 bfd_vma destination;
6911b7dc 12910 unsigned long local_off;
8843416a 12911 bfd_boolean ok_dest;
721956f4 12912 struct ppc_link_hash_entry *hash;
8387904d 12913 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
12914 struct elf_link_hash_entry *h;
12915 Elf_Internal_Sym *sym;
721956f4
AM
12916 char *stub_name;
12917 const asection *id_sec;
74f0fb50 12918 struct _opd_sec_data *opd;
e054468f 12919 struct plt_entry *plt_ent;
721956f4
AM
12920
12921 r_type = ELF64_R_TYPE (irela->r_info);
12922 r_indx = ELF64_R_SYM (irela->r_info);
12923
4ce794b7 12924 if (r_type >= R_PPC64_max)
721956f4
AM
12925 {
12926 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 12927 goto error_ret_free_internal;
721956f4
AM
12928 }
12929
12930 /* Only look for stubs on branch instructions. */
4ce794b7 12931 if (r_type != R_PPC64_REL24
05d0e962 12932 && r_type != R_PPC64_REL24_NOTOC
4ce794b7
AM
12933 && r_type != R_PPC64_REL14
12934 && r_type != R_PPC64_REL14_BRTAKEN
12935 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
12936 continue;
12937
12938 /* Now determine the call target, its name, value,
12939 section. */
411e1bfb
AM
12940 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12941 r_indx, input_bfd))
12942 goto error_ret_free_internal;
ed7007c1 12943 hash = ppc_elf_hash_entry (h);
411e1bfb 12944
8843416a 12945 ok_dest = FALSE;
8387904d 12946 fdh = NULL;
7fe2b9a6 12947 sym_value = 0;
411e1bfb 12948 if (hash == NULL)
721956f4 12949 {
411e1bfb 12950 sym_value = sym->st_value;
c27b8c2a
AM
12951 if (sym_sec != NULL
12952 && sym_sec->output_section != NULL)
12953 ok_dest = TRUE;
721956f4 12954 }
7fe2b9a6
AM
12955 else if (hash->elf.root.type == bfd_link_hash_defined
12956 || hash->elf.root.type == bfd_link_hash_defweak)
12957 {
12958 sym_value = hash->elf.root.u.def.value;
12959 if (sym_sec->output_section != NULL)
12960 ok_dest = TRUE;
12961 }
12962 else if (hash->elf.root.type == bfd_link_hash_undefweak
12963 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 12964 {
99877b66 12965 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
12966 use the func descriptor sym instead if it is
12967 defined. */
ceb1f1ef 12968 if (hash->elf.root.root.string[0] == '.'
8c5b4e52 12969 && hash->oh != NULL)
8387904d 12970 {
8c5b4e52 12971 fdh = ppc_follow_link (hash->oh);
8387904d
AM
12972 if (fdh->elf.root.type == bfd_link_hash_defined
12973 || fdh->elf.root.type == bfd_link_hash_defweak)
12974 {
12975 sym_sec = fdh->elf.root.u.def.section;
12976 sym_value = fdh->elf.root.u.def.value;
12977 if (sym_sec->output_section != NULL)
12978 ok_dest = TRUE;
12979 }
99877b66
AM
12980 else
12981 fdh = NULL;
8387904d 12982 }
7fe2b9a6
AM
12983 }
12984 else
12985 {
12986 bfd_set_error (bfd_error_bad_value);
12987 goto error_ret_free_internal;
721956f4
AM
12988 }
12989
8843416a 12990 destination = 0;
6911b7dc 12991 local_off = 0;
8843416a
AM
12992 if (ok_dest)
12993 {
12994 sym_value += irela->r_addend;
12995 destination = (sym_value
12996 + sym_sec->output_offset
12997 + sym_sec->output_section->vma);
6911b7dc
AM
12998 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12999 ? hash->elf.other
13000 : sym->st_other);
8843416a
AM
13001 }
13002
8387904d 13003 code_sec = sym_sec;
e054468f 13004 code_value = sym_value;
74f0fb50
AM
13005 opd = get_opd_info (sym_sec);
13006 if (opd != NULL)
8387904d
AM
13007 {
13008 bfd_vma dest;
13009
74f0fb50 13010 if (hash == NULL && opd->adjust != NULL)
8387904d 13011 {
51aecdc5 13012 long adjust = opd->adjust[OPD_NDX (sym_value)];
8387904d
AM
13013 if (adjust == -1)
13014 continue;
e054468f 13015 code_value += adjust;
8387904d
AM
13016 sym_value += adjust;
13017 }
13018 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 13019 &code_sec, &code_value, FALSE);
8387904d
AM
13020 if (dest != (bfd_vma) -1)
13021 {
13022 destination = dest;
13023 if (fdh != NULL)
13024 {
13025 /* Fixup old ABI sym to point at code
13026 entry. */
99877b66 13027 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 13028 hash->elf.root.u.def.section = code_sec;
e054468f 13029 hash->elf.root.u.def.value = code_value;
8387904d
AM
13030 }
13031 }
13032 }
13033
721956f4 13034 /* Determine what (if any) linker stub is needed. */
e054468f 13035 plt_ent = NULL;
721956f4 13036 stub_type = ppc_type_of_stub (section, irela, &hash,
6911b7dc
AM
13037 &plt_ent, destination,
13038 local_off);
ad8e1ba5 13039
05d0e962
AM
13040 if (r_type == R_PPC64_REL24_NOTOC)
13041 {
13042 if (stub_type == ppc_stub_plt_call)
13043 stub_type = ppc_stub_plt_call_notoc;
13044 else if (stub_type == ppc_stub_long_branch
13045 || (code_sec != NULL
13046 && code_sec->output_section != NULL
13047 && (((hash ? hash->elf.other : sym->st_other)
13048 & STO_PPC64_LOCAL_MASK)
4a4e7361 13049 > 1 << STO_PPC64_LOCAL_BIT)))
05d0e962
AM
13050 stub_type = ppc_stub_long_branch_notoc;
13051 }
13052 else if (stub_type != ppc_stub_plt_call)
ad8e1ba5
AM
13053 {
13054 /* Check whether we need a TOC adjusting stub.
13055 Since the linker pastes together pieces from
13056 different object files when creating the
13057 _init and _fini functions, it may be that a
13058 call to what looks like a local sym is in
13059 fact a call needing a TOC adjustment. */
33cb30a1
AM
13060 if ((code_sec != NULL
13061 && code_sec->output_section != NULL
13062 && (htab->sec_info[code_sec->id].toc_off
13063 != htab->sec_info[section->id].toc_off)
13064 && (code_sec->has_toc_reloc
13065 || code_sec->makes_toc_func_call))
13066 || (((hash ? hash->elf.other : sym->st_other)
13067 & STO_PPC64_LOCAL_MASK)
13068 == 1 << STO_PPC64_LOCAL_BIT))
ad8e1ba5
AM
13069 stub_type = ppc_stub_long_branch_r2off;
13070 }
13071
721956f4
AM
13072 if (stub_type == ppc_stub_none)
13073 continue;
13074
411e1bfb
AM
13075 /* __tls_get_addr calls might be eliminated. */
13076 if (stub_type != ppc_stub_plt_call
05d0e962 13077 && stub_type != ppc_stub_plt_call_notoc
411e1bfb 13078 && hash != NULL
ed7007c1 13079 && is_tls_get_addr (&hash->elf, htab)
411e1bfb
AM
13080 && section->has_tls_reloc
13081 && irela != internal_relocs)
13082 {
13083 /* Get tls info. */
f961d9dd 13084 unsigned char *tls_mask;
411e1bfb 13085
3a71aa26 13086 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
13087 irela - 1, input_bfd))
13088 goto error_ret_free_internal;
37da22e5 13089 if ((*tls_mask & TLS_TLS) != 0)
411e1bfb
AM
13090 continue;
13091 }
13092
f378ab09 13093 if (stub_type == ppc_stub_plt_call)
794e51c0 13094 {
6e1816be
AM
13095 if (!htab->opd_abi
13096 && htab->params->plt_localentry0 != 0
13097 && is_elfv2_localentry0 (&hash->elf))
13098 htab->has_plt_localentry0 = 1;
13099 else if (irela + 1 < irelaend
13100 && irela[1].r_offset == irela->r_offset + 4
13101 && (ELF64_R_TYPE (irela[1].r_info)
13102 == R_PPC64_TOCSAVE))
f378ab09
AM
13103 {
13104 if (!tocsave_find (htab, INSERT,
13105 &local_syms, irela + 1, input_bfd))
13106 goto error_ret_free_internal;
13107 }
f378ab09
AM
13108 else
13109 stub_type = ppc_stub_plt_call_r2save;
794e51c0 13110 }
3b421ab3 13111
721956f4 13112 /* Support for grouping stub sections. */
6f20ed8a 13113 id_sec = htab->sec_info[section->id].u.group->link_sec;
721956f4
AM
13114
13115 /* Get the name of this stub. */
13116 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
13117 if (!stub_name)
13118 goto error_ret_free_internal;
13119
13120 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 13121 stub_name, FALSE, FALSE);
721956f4
AM
13122 if (stub_entry != NULL)
13123 {
05d0e962
AM
13124 enum ppc_stub_type old_type;
13125 /* A stub has already been created, but it may
13126 not be the required type. We shouldn't be
13127 transitioning from plt_call to long_branch
13128 stubs or vice versa, but we might be
13129 upgrading from plt_call to plt_call_r2save or
13130 from long_branch to long_branch_r2off. */
721956f4 13131 free (stub_name);
05d0e962
AM
13132 old_type = stub_entry->stub_type;
13133 switch (old_type)
13134 {
13135 default:
13136 abort ();
13137
13138 case ppc_stub_save_res:
13139 continue;
13140
13141 case ppc_stub_plt_call:
13142 case ppc_stub_plt_call_r2save:
13143 case ppc_stub_plt_call_notoc:
13144 case ppc_stub_plt_call_both:
13145 if (stub_type == ppc_stub_plt_call)
13146 continue;
13147 else if (stub_type == ppc_stub_plt_call_r2save)
13148 {
13149 if (old_type == ppc_stub_plt_call_notoc)
13150 stub_type = ppc_stub_plt_call_both;
13151 }
13152 else if (stub_type == ppc_stub_plt_call_notoc)
13153 {
13154 if (old_type == ppc_stub_plt_call_r2save)
13155 stub_type = ppc_stub_plt_call_both;
13156 }
13157 else
13158 abort ();
13159 break;
13160
13161 case ppc_stub_plt_branch:
13162 case ppc_stub_plt_branch_r2off:
13163 case ppc_stub_plt_branch_notoc:
13164 case ppc_stub_plt_branch_both:
13165 old_type += (ppc_stub_long_branch
13166 - ppc_stub_plt_branch);
13167 /* Fall through. */
13168 case ppc_stub_long_branch:
13169 case ppc_stub_long_branch_r2off:
13170 case ppc_stub_long_branch_notoc:
13171 case ppc_stub_long_branch_both:
13172 if (stub_type == ppc_stub_long_branch)
13173 continue;
13174 else if (stub_type == ppc_stub_long_branch_r2off)
13175 {
13176 if (old_type == ppc_stub_long_branch_notoc)
13177 stub_type = ppc_stub_long_branch_both;
13178 }
13179 else if (stub_type == ppc_stub_long_branch_notoc)
13180 {
13181 if (old_type == ppc_stub_long_branch_r2off)
13182 stub_type = ppc_stub_long_branch_both;
13183 }
13184 else
13185 abort ();
13186 break;
13187 }
13188 if (old_type < stub_type)
794e51c0 13189 stub_entry->stub_type = stub_type;
721956f4
AM
13190 continue;
13191 }
13192
25f53a85 13193 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
13194 if (stub_entry == NULL)
13195 {
13196 free (stub_name);
6cdc0ccc
AM
13197 error_ret_free_internal:
13198 if (elf_section_data (section)->relocs == NULL)
13199 free (internal_relocs);
13200 error_ret_free_local:
13201 if (local_syms != NULL
13202 && (symtab_hdr->contents
13203 != (unsigned char *) local_syms))
13204 free (local_syms);
b34976b6 13205 return FALSE;
721956f4
AM
13206 }
13207
ad8e1ba5 13208 stub_entry->stub_type = stub_type;
05d0e962
AM
13209 if (stub_type >= ppc_stub_plt_call
13210 && stub_type <= ppc_stub_plt_call_both)
e054468f 13211 {
05d0e962
AM
13212 stub_entry->target_value = sym_value;
13213 stub_entry->target_section = sym_sec;
e054468f
AM
13214 }
13215 else
13216 {
05d0e962
AM
13217 stub_entry->target_value = code_value;
13218 stub_entry->target_section = code_sec;
e054468f 13219 }
721956f4 13220 stub_entry->h = hash;
e054468f 13221 stub_entry->plt_ent = plt_ent;
2d7ad24e
AM
13222 stub_entry->symtype
13223 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
6911b7dc 13224 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95 13225
3d58e1fc
AM
13226 if (hash != NULL
13227 && (hash->elf.root.type == bfd_link_hash_defined
13228 || hash->elf.root.type == bfd_link_hash_defweak))
ee75fd95 13229 htab->stub_globals += 1;
721956f4
AM
13230 }
13231
13232 /* We're done with the internal relocs, free them. */
6cdc0ccc 13233 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 13234 free (internal_relocs);
721956f4 13235 }
6cdc0ccc
AM
13236
13237 if (local_syms != NULL
13238 && symtab_hdr->contents != (unsigned char *) local_syms)
13239 {
13240 if (!info->keep_memory)
13241 free (local_syms);
13242 else
13243 symtab_hdr->contents = (unsigned char *) local_syms;
13244 }
721956f4
AM
13245 }
13246
5c3dead3 13247 /* We may have added some stubs. Find out the new size of the
721956f4 13248 stub sections. */
d4aaa2a0 13249 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13250 {
13251 group->lr_restore = 0;
13252 group->eh_size = 0;
13253 if (group->stub_sec != NULL)
13254 {
13255 asection *stub_sec = group->stub_sec;
13256
13257 if (htab->stub_iteration <= STUB_SHRINK_ITER
13258 || stub_sec->rawsize < stub_sec->size)
13259 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
13260 stub_sec->rawsize = stub_sec->size;
13261 stub_sec->size = 0;
13262 stub_sec->reloc_count = 0;
13263 stub_sec->flags &= ~SEC_RELOC;
13264 }
13265 }
eea6121a 13266
ba21f564
AM
13267 if (htab->stub_iteration <= STUB_SHRINK_ITER
13268 || htab->brlt->rawsize < htab->brlt->size)
13269 htab->brlt->rawsize = htab->brlt->size;
eea6121a 13270 htab->brlt->size = 0;
84f5d08e
AM
13271 htab->brlt->reloc_count = 0;
13272 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 13273 if (htab->relbrlt != NULL)
eea6121a 13274 htab->relbrlt->size = 0;
721956f4 13275
63bc6f6c 13276 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 13277
a4b6fadd
AM
13278 for (group = htab->group; group != NULL; group = group->next)
13279 if (group->needs_save_res)
13280 group->stub_sec->size += htab->sfpr->size;
13281
176a0d42
AM
13282 if (info->emitrelocations
13283 && htab->glink != NULL && htab->glink->size != 0)
13284 {
13285 htab->glink->reloc_count = 1;
13286 htab->glink->flags |= SEC_RELOC;
13287 }
13288
58d180e8
AM
13289 if (htab->glink_eh_frame != NULL
13290 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
2d0d44d5 13291 && htab->glink_eh_frame->output_section->size > 8)
58d180e8 13292 {
2e0ce1c8 13293 size_t size = 0, align = 4;
58d180e8 13294
d4aaa2a0 13295 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13296 if (group->eh_size != 0)
13297 size += (group->eh_size + 17 + align - 1) & -align;
58d180e8 13298 if (htab->glink != NULL && htab->glink->size != 0)
2e0ce1c8 13299 size += (24 + align - 1) & -align;
58d180e8 13300 if (size != 0)
2e0ce1c8
AM
13301 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
13302 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
13303 size = (size + align - 1) & -align;
58d180e8
AM
13304 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
13305 htab->glink_eh_frame->size = size;
13306 }
13307
e7d1c40c 13308 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13309 for (group = htab->group; group != NULL; group = group->next)
13310 if (group->stub_sec != NULL)
691d2e9a
AM
13311 {
13312 int align = abs (htab->params->plt_stub_align);
13313 group->stub_sec->size
13314 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
13315 }
d4aaa2a0
AM
13316
13317 for (group = htab->group; group != NULL; group = group->next)
13318 if (group->stub_sec != NULL
13319 && group->stub_sec->rawsize != group->stub_sec->size
c9301e31 13320 && (htab->stub_iteration <= STUB_SHRINK_ITER
d4aaa2a0 13321 || group->stub_sec->rawsize < group->stub_sec->size))
5c3dead3
AM
13322 break;
13323
d4aaa2a0 13324 if (group == NULL
ba21f564
AM
13325 && (htab->brlt->rawsize == htab->brlt->size
13326 || (htab->stub_iteration > STUB_SHRINK_ITER
13327 && htab->brlt->rawsize > htab->brlt->size))
58d180e8
AM
13328 && (htab->glink_eh_frame == NULL
13329 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
5c3dead3
AM
13330 break;
13331
721956f4 13332 /* Ask the linker to do its stuff. */
e7d1c40c 13333 (*htab->params->layout_sections_again) ();
721956f4
AM
13334 }
13335
da44f4e5
AM
13336 if (htab->glink_eh_frame != NULL
13337 && htab->glink_eh_frame->size != 0)
13338 {
13339 bfd_vma val;
13340 bfd_byte *p, *last_fde;
13341 size_t last_fde_len, size, align, pad;
d4aaa2a0 13342 struct map_stub *group;
da44f4e5 13343
df136d64
AM
13344 /* It is necessary to at least have a rough outline of the
13345 linker generated CIEs and FDEs written before
13346 bfd_elf_discard_info is run, in order for these FDEs to be
13347 indexed in .eh_frame_hdr. */
da44f4e5
AM
13348 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
13349 if (p == NULL)
13350 return FALSE;
13351 htab->glink_eh_frame->contents = p;
13352 last_fde = p;
2e0ce1c8 13353 align = 4;
da44f4e5
AM
13354
13355 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
13356 /* CIE length (rewrite in case little-endian). */
2e0ce1c8 13357 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
da44f4e5 13358 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
2e0ce1c8 13359 p += last_fde_len + 4;
da44f4e5 13360
d4aaa2a0 13361 for (group = htab->group; group != NULL; group = group->next)
df136d64 13362 if (group->eh_size != 0)
da44f4e5 13363 {
df136d64 13364 group->eh_base = p - htab->glink_eh_frame->contents;
da44f4e5 13365 last_fde = p;
df136d64 13366 last_fde_len = ((group->eh_size + 17 + align - 1) & -align) - 4;
da44f4e5 13367 /* FDE length. */
2e0ce1c8 13368 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13369 p += 4;
13370 /* CIE pointer. */
13371 val = p - htab->glink_eh_frame->contents;
13372 bfd_put_32 (htab->elf.dynobj, val, p);
13373 p += 4;
13374 /* Offset to stub section, written later. */
13375 p += 4;
13376 /* stub section size. */
d4aaa2a0 13377 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
da44f4e5
AM
13378 p += 4;
13379 /* Augmentation. */
13380 p += 1;
df136d64
AM
13381 /* Make sure we don't have all nops. This is enough for
13382 elf-eh-frame.c to detect the last non-nop opcode. */
13383 p[group->eh_size - 1] = DW_CFA_advance_loc + 1;
d4aaa2a0 13384 p = last_fde + last_fde_len + 4;
da44f4e5
AM
13385 }
13386 if (htab->glink != NULL && htab->glink->size != 0)
13387 {
13388 last_fde = p;
2e0ce1c8 13389 last_fde_len = ((24 + align - 1) & -align) - 4;
da44f4e5 13390 /* FDE length. */
2e0ce1c8 13391 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13392 p += 4;
13393 /* CIE pointer. */
13394 val = p - htab->glink_eh_frame->contents;
13395 bfd_put_32 (htab->elf.dynobj, val, p);
13396 p += 4;
13397 /* Offset to .glink, written later. */
13398 p += 4;
13399 /* .glink size. */
13400 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
13401 p += 4;
13402 /* Augmentation. */
13403 p += 1;
13404
13405 *p++ = DW_CFA_advance_loc + 1;
13406 *p++ = DW_CFA_register;
13407 *p++ = 65;
9f08fa5c 13408 *p++ = htab->opd_abi ? 12 : 0;
15a3a14f 13409 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
da44f4e5
AM
13410 *p++ = DW_CFA_restore_extended;
13411 *p++ = 65;
2e0ce1c8 13412 p += ((24 + align - 1) & -align) - 24;
da44f4e5
AM
13413 }
13414 /* Subsume any padding into the last FDE if user .eh_frame
13415 sections are aligned more than glink_eh_frame. Otherwise any
13416 zero padding will be seen as a terminator. */
2e0ce1c8 13417 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
da44f4e5 13418 size = p - htab->glink_eh_frame->contents;
2e0ce1c8 13419 pad = ((size + align - 1) & -align) - size;
da44f4e5
AM
13420 htab->glink_eh_frame->size = size + pad;
13421 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
13422 }
13423
d969d15f
AM
13424 maybe_strip_output (info, htab->brlt);
13425 if (htab->glink_eh_frame != NULL)
13426 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 13427
b34976b6 13428 return TRUE;
721956f4
AM
13429}
13430
13431/* Called after we have determined section placement. If sections
805fc799 13432 move, we'll be called again. Provide a value for TOCstart. */
721956f4 13433
805fc799 13434bfd_vma
1c865ab2 13435ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 13436{
805fc799 13437 asection *s;
a27e685f 13438 bfd_vma TOCstart, adjust;
721956f4 13439
43417696
AM
13440 if (info != NULL)
13441 {
13442 struct elf_link_hash_entry *h;
13443 struct elf_link_hash_table *htab = elf_hash_table (info);
13444
13445 if (is_elf_hash_table (htab)
13446 && htab->hgot != NULL)
13447 h = htab->hgot;
13448 else
13449 {
13450 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
13451 if (is_elf_hash_table (htab))
13452 htab->hgot = h;
13453 }
13454 if (h != NULL
13455 && h->root.type == bfd_link_hash_defined
13456 && !h->root.linker_def
13457 && (!is_elf_hash_table (htab)
13458 || h->def_regular))
13459 {
ed7007c1 13460 TOCstart = defined_sym_val (h) - TOC_BASE_OFF;
43417696
AM
13461 _bfd_set_gp_value (obfd, TOCstart);
13462 return TOCstart;
13463 }
13464 }
13465
805fc799
AM
13466 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
13467 order. The TOC starts where the first of these sections starts. */
13468 s = bfd_get_section_by_name (obfd, ".got");
e054468f 13469 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13470 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 13471 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13472 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 13473 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13474 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 13475 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
13476 {
13477 /* This may happen for
13478 o references to TOC base (SYM@toc / TOC[tc0]) without a
13479 .toc directive
13480 o bad linker script
13481 o --gc-sections and empty TOC sections
13482
13483 FIXME: Warn user? */
13484
13485 /* Look for a likely section. We probably won't even be
13486 using TOCstart. */
13487 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13488 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
13489 | SEC_EXCLUDE))
805fc799
AM
13490 == (SEC_ALLOC | SEC_SMALL_DATA))
13491 break;
721956f4 13492 if (s == NULL)
805fc799 13493 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13494 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
13495 == (SEC_ALLOC | SEC_SMALL_DATA))
13496 break;
721956f4 13497 if (s == NULL)
805fc799 13498 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13499 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
13500 == SEC_ALLOC)
805fc799 13501 break;
721956f4 13502 if (s == NULL)
805fc799 13503 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13504 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
13505 break;
13506 }
721956f4 13507
805fc799
AM
13508 TOCstart = 0;
13509 if (s != NULL)
13510 TOCstart = s->output_section->vma + s->output_offset;
721956f4 13511
a27e685f
AM
13512 /* Force alignment. */
13513 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
13514 TOCstart -= adjust;
1c865ab2
AM
13515 _bfd_set_gp_value (obfd, TOCstart);
13516
810d4e75 13517 if (info != NULL && s != NULL)
1c865ab2
AM
13518 {
13519 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13520
810d4e75
AM
13521 if (htab != NULL)
13522 {
13523 if (htab->elf.hgot != NULL)
13524 {
a27e685f 13525 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
810d4e75
AM
13526 htab->elf.hgot->root.u.def.section = s;
13527 }
13528 }
13529 else
1c865ab2 13530 {
810d4e75
AM
13531 struct bfd_link_hash_entry *bh = NULL;
13532 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
a27e685f
AM
13533 s, TOC_BASE_OFF - adjust,
13534 NULL, FALSE, FALSE, &bh);
1c865ab2
AM
13535 }
13536 }
805fc799 13537 return TOCstart;
721956f4
AM
13538}
13539
a345bc8d 13540/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
49c09209 13541 write out any global entry stubs, and PLT relocations. */
a345bc8d
AM
13542
13543static bfd_boolean
49c09209 13544build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
a345bc8d
AM
13545{
13546 struct bfd_link_info *info;
13547 struct ppc_link_hash_table *htab;
49c09209 13548 struct plt_entry *ent;
a345bc8d
AM
13549 asection *s;
13550
13551 if (h->root.type == bfd_link_hash_indirect)
13552 return TRUE;
13553
49c09209
AM
13554 info = inf;
13555 htab = ppc_hash_table (info);
13556 if (htab == NULL)
13557 return FALSE;
13558
13559 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13560 if (ent->plt.offset != (bfd_vma) -1)
13561 {
13562 /* This symbol has an entry in the procedure linkage
13563 table. Set it up. */
13564 Elf_Internal_Rela rela;
2d7ad24e 13565 asection *plt, *relplt;
49c09209
AM
13566 bfd_byte *loc;
13567
13568 if (!htab->elf.dynamic_sections_created
13569 || h->dynindx == -1)
13570 {
13571 if (!(h->def_regular
13572 && (h->root.type == bfd_link_hash_defined
13573 || h->root.type == bfd_link_hash_defweak)))
13574 continue;
2d7ad24e
AM
13575 if (h->type == STT_GNU_IFUNC)
13576 {
13577 plt = htab->elf.iplt;
13578 relplt = htab->elf.irelplt;
13579 htab->local_ifunc_resolver = 1;
13580 if (htab->opd_abi)
13581 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13582 else
13583 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13584 }
49c09209 13585 else
2d7ad24e
AM
13586 {
13587 plt = htab->pltlocal;
13588 if (bfd_link_pic (info))
13589 {
13590 relplt = htab->relpltlocal;
13591 if (htab->opd_abi)
13592 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13593 else
13594 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13595 }
13596 else
13597 relplt = NULL;
13598 }
ed7007c1 13599 rela.r_addend = defined_sym_val (h) + ent->addend;
2d7ad24e
AM
13600
13601 if (relplt == NULL)
13602 {
13603 loc = plt->contents + ent->plt.offset;
13604 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
13605 if (htab->opd_abi)
13606 {
13607 bfd_vma toc = elf_gp (info->output_bfd);
13608 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
13609 bfd_put_64 (info->output_bfd, toc, loc + 8);
13610 }
13611 }
13612 else
13613 {
13614 rela.r_offset = (plt->output_section->vma
13615 + plt->output_offset
13616 + ent->plt.offset);
13617 loc = relplt->contents + (relplt->reloc_count++
13618 * sizeof (Elf64_External_Rela));
13619 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13620 }
49c09209
AM
13621 }
13622 else
13623 {
13624 rela.r_offset = (htab->elf.splt->output_section->vma
13625 + htab->elf.splt->output_offset
13626 + ent->plt.offset);
13627 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13628 rela.r_addend = ent->addend;
13629 loc = (htab->elf.srelplt->contents
13630 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
13631 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
13632 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
13633 htab->maybe_local_ifunc_resolver = 1;
2d7ad24e 13634 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
49c09209 13635 }
49c09209
AM
13636 }
13637
a345bc8d
AM
13638 if (!h->pointer_equality_needed)
13639 return TRUE;
13640
13641 if (h->def_regular)
13642 return TRUE;
13643
9e390558 13644 s = htab->global_entry;
49c09209
AM
13645 if (s == NULL || s->size == 0)
13646 return TRUE;
13647
13648 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13649 if (ent->plt.offset != (bfd_vma) -1
13650 && ent->addend == 0)
a345bc8d
AM
13651 {
13652 bfd_byte *p;
13653 asection *plt;
13654 bfd_vma off;
13655
a345bc8d 13656 p = s->contents + h->root.u.def.value;
33e44f2e 13657 plt = htab->elf.splt;
a345bc8d
AM
13658 if (!htab->elf.dynamic_sections_created
13659 || h->dynindx == -1)
2d7ad24e
AM
13660 {
13661 if (h->type == STT_GNU_IFUNC)
13662 plt = htab->elf.iplt;
13663 else
13664 plt = htab->pltlocal;
13665 }
49c09209 13666 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
a345bc8d
AM
13667 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
13668
13669 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
13670 {
13671 info->callbacks->einfo
c1c8c1ef 13672 (_("%P: linkage table error against `%pT'\n"),
a345bc8d
AM
13673 h->root.root.string);
13674 bfd_set_error (bfd_error_bad_value);
13675 htab->stub_error = TRUE;
13676 }
13677
7341d5e2
AM
13678 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13679 if (htab->params->emit_stub_syms)
13680 {
13681 size_t len = strlen (h->root.root.string);
13682 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13683
13684 if (name == NULL)
13685 return FALSE;
13686
13687 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13688 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13689 if (h == NULL)
13690 return FALSE;
13691 if (h->root.type == bfd_link_hash_new)
13692 {
13693 h->root.type = bfd_link_hash_defined;
13694 h->root.u.def.section = s;
13695 h->root.u.def.value = p - s->contents;
13696 h->ref_regular = 1;
13697 h->def_regular = 1;
13698 h->ref_regular_nonweak = 1;
13699 h->forced_local = 1;
13700 h->non_elf = 0;
2ec55de3 13701 h->root.linker_def = 1;
7341d5e2
AM
13702 }
13703 }
13704
a345bc8d
AM
13705 if (PPC_HA (off) != 0)
13706 {
13707 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
13708 p += 4;
13709 }
13710 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
13711 p += 4;
13712 bfd_put_32 (s->owner, MTCTR_R12, p);
13713 p += 4;
407aa07c 13714 bfd_put_32 (s->owner, BCTR, p);
a345bc8d
AM
13715 break;
13716 }
13717 return TRUE;
13718}
13719
49c09209
AM
13720/* Write PLT relocs for locals. */
13721
13722static bfd_boolean
13723write_plt_relocs_for_local_syms (struct bfd_link_info *info)
13724{
13725 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13726 bfd *ibfd;
13727
13728 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
13729 {
13730 struct got_entry **lgot_ents, **end_lgot_ents;
13731 struct plt_entry **local_plt, **lplt, **end_local_plt;
13732 Elf_Internal_Shdr *symtab_hdr;
13733 bfd_size_type locsymcount;
13734 Elf_Internal_Sym *local_syms = NULL;
13735 struct plt_entry *ent;
13736
13737 if (!is_ppc64_elf (ibfd))
13738 continue;
13739
13740 lgot_ents = elf_local_got_ents (ibfd);
13741 if (!lgot_ents)
13742 continue;
13743
13744 symtab_hdr = &elf_symtab_hdr (ibfd);
13745 locsymcount = symtab_hdr->sh_info;
13746 end_lgot_ents = lgot_ents + locsymcount;
13747 local_plt = (struct plt_entry **) end_lgot_ents;
13748 end_local_plt = local_plt + locsymcount;
13749 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
13750 for (ent = *lplt; ent != NULL; ent = ent->next)
13751 if (ent->plt.offset != (bfd_vma) -1)
13752 {
13753 Elf_Internal_Sym *sym;
13754 asection *sym_sec;
13755 asection *plt, *relplt;
13756 bfd_byte *loc;
13757 bfd_vma val;
49c09209
AM
13758
13759 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
13760 lplt - local_plt, ibfd))
13761 {
13762 if (local_syms != NULL
13763 && symtab_hdr->contents != (unsigned char *) local_syms)
13764 free (local_syms);
13765 return FALSE;
13766 }
13767
13768 val = sym->st_value + ent->addend;
ba85c15d
AM
13769 if (ELF_ST_TYPE (sym->st_info) != STT_GNU_IFUNC)
13770 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
49c09209
AM
13771 if (sym_sec != NULL && sym_sec->output_section != NULL)
13772 val += sym_sec->output_offset + sym_sec->output_section->vma;
13773
2d7ad24e
AM
13774 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13775 {
13776 htab->local_ifunc_resolver = 1;
13777 plt = htab->elf.iplt;
13778 relplt = htab->elf.irelplt;
13779 }
13780 else
13781 {
13782 plt = htab->pltlocal;
13783 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
13784 }
49c09209 13785
2d7ad24e
AM
13786 if (relplt == NULL)
13787 {
13788 loc = plt->contents + ent->plt.offset;
13789 bfd_put_64 (info->output_bfd, val, loc);
13790 if (htab->opd_abi)
13791 {
13792 bfd_vma toc = elf_gp (ibfd);
13793 bfd_put_64 (info->output_bfd, toc, loc + 8);
13794 }
13795 }
49c09209 13796 else
2d7ad24e
AM
13797 {
13798 Elf_Internal_Rela rela;
13799 rela.r_offset = (ent->plt.offset
13800 + plt->output_offset
13801 + plt->output_section->vma);
13802 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13803 {
13804 if (htab->opd_abi)
13805 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13806 else
13807 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13808 }
13809 else
13810 {
13811 if (htab->opd_abi)
13812 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13813 else
13814 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13815 }
13816 rela.r_addend = val;
13817 loc = relplt->contents + (relplt->reloc_count++
13818 * sizeof (Elf64_External_Rela));
13819 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13820 }
49c09209
AM
13821 }
13822
13823 if (local_syms != NULL
13824 && symtab_hdr->contents != (unsigned char *) local_syms)
13825 {
13826 if (!info->keep_memory)
13827 free (local_syms);
13828 else
13829 symtab_hdr->contents = (unsigned char *) local_syms;
13830 }
13831 }
13832 return TRUE;
13833}
13834
721956f4
AM
13835/* Build all the stubs associated with the current output file.
13836 The stubs are kept in a hash table attached to the main linker
13837 hash table. This function is called via gldelf64ppc_finish. */
13838
b34976b6 13839bfd_boolean
e7d1c40c 13840ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 13841 char **stats)
5d1634d7
AM
13842{
13843 struct ppc_link_hash_table *htab = ppc_hash_table (info);
a4b6fadd 13844 struct map_stub *group;
721956f4 13845 asection *stub_sec;
5d1634d7 13846 bfd_byte *p;
e717da7e 13847 int stub_sec_count = 0;
5d1634d7 13848
4dfe6ac6
NC
13849 if (htab == NULL)
13850 return FALSE;
13851
eea6121a 13852 /* Allocate memory to hold the linker stubs. */
d4aaa2a0 13853 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13854 {
13855 group->eh_size = 0;
13856 group->lr_restore = 0;
13857 if ((stub_sec = group->stub_sec) != NULL
13858 && stub_sec->size != 0)
13859 {
13860 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd,
13861 stub_sec->size);
13862 if (stub_sec->contents == NULL)
13863 return FALSE;
13864 stub_sec->size = 0;
13865 }
13866 }
5d1634d7 13867
23eb7e01 13868 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 13869 {
9f951329 13870 unsigned int indx;
ad8e1ba5 13871 bfd_vma plt0;
9f951329 13872
721956f4 13873 /* Build the .glink plt call stub. */
e7d1c40c 13874 if (htab->params->emit_stub_syms)
97b639ba
AM
13875 {
13876 struct elf_link_hash_entry *h;
468392fb
AM
13877 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
13878 TRUE, FALSE, FALSE);
97b639ba
AM
13879 if (h == NULL)
13880 return FALSE;
13881 if (h->root.type == bfd_link_hash_new)
13882 {
13883 h->root.type = bfd_link_hash_defined;
13884 h->root.u.def.section = htab->glink;
ee4bf8d2 13885 h->root.u.def.value = 8;
f5385ebf
AM
13886 h->ref_regular = 1;
13887 h->def_regular = 1;
13888 h->ref_regular_nonweak = 1;
13889 h->forced_local = 1;
13890 h->non_elf = 0;
2ec55de3 13891 h->root.linker_def = 1;
97b639ba
AM
13892 }
13893 }
33e44f2e
AM
13894 plt0 = (htab->elf.splt->output_section->vma
13895 + htab->elf.splt->output_offset
13896 - 16);
176a0d42
AM
13897 if (info->emitrelocations)
13898 {
13899 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
13900 if (r == NULL)
13901 return FALSE;
13902 r->r_offset = (htab->glink->output_offset
13903 + htab->glink->output_section->vma);
13904 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
13905 r->r_addend = plt0;
13906 }
4ce794b7 13907 p = htab->glink->contents;
176a0d42 13908 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
13909 bfd_put_64 (htab->glink->owner, plt0, p);
13910 p += 8;
b9e5796b
AM
13911 if (htab->opd_abi)
13912 {
13913 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
13914 p += 4;
13915 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13916 p += 4;
13917 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13918 p += 4;
13919 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13920 p += 4;
13921 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
13922 p += 4;
13923 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13924 p += 4;
13925 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13926 p += 4;
13927 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
13928 p += 4;
13929 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13930 p += 4;
13931 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
13932 p += 4;
13933 }
13934 else
13935 {
13936 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
13937 p += 4;
13938 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13939 p += 4;
13940 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13941 p += 4;
f378ab09
AM
13942 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
13943 p += 4;
b9e5796b
AM
13944 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13945 p += 4;
13946 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
13947 p += 4;
13948 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
13949 p += 4;
13950 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13951 p += 4;
13952 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
13953 p += 4;
13954 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13955 p += 4;
13956 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
13957 p += 4;
13958 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13959 p += 4;
13960 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
13961 p += 4;
13962 }
407aa07c
AM
13963 bfd_put_32 (htab->glink->owner, BCTR, p);
13964 p += 4;
c75bc4f7 13965 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
ad8e1ba5 13966
9f951329
AM
13967 /* Build the .glink lazy link call stubs. */
13968 indx = 0;
9e390558 13969 while (p < htab->glink->contents + htab->glink->size)
9f951329 13970 {
b9e5796b 13971 if (htab->opd_abi)
9f951329 13972 {
b9e5796b
AM
13973 if (indx < 0x8000)
13974 {
13975 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
13976 p += 4;
13977 }
13978 else
13979 {
13980 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
13981 p += 4;
13982 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
13983 p);
13984 p += 4;
13985 }
9f951329 13986 }
4ce794b7 13987 bfd_put_32 (htab->glink->owner,
ee4bf8d2 13988 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 13989 indx++;
9f951329
AM
13990 p += 4;
13991 }
5d1634d7 13992 }
5d1634d7 13993
49c09209
AM
13994 /* Build .glink global entry stubs, and PLT relocs for globals. */
13995 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
13996
13997 if (!write_plt_relocs_for_local_syms (info))
13998 return FALSE;
9e390558 13999
7341d5e2 14000 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 14001 {
4ce794b7 14002 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 14003 htab->brlt->size);
4ce794b7 14004 if (htab->brlt->contents == NULL)
b34976b6 14005 return FALSE;
721956f4 14006 }
ee75fd95 14007 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
14008 {
14009 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 14010 htab->relbrlt->size);
63bc6f6c
AM
14011 if (htab->relbrlt->contents == NULL)
14012 return FALSE;
14013 }
5d1634d7 14014
721956f4
AM
14015 /* Build the stubs as directed by the stub hash table. */
14016 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 14017
a4b6fadd
AM
14018 for (group = htab->group; group != NULL; group = group->next)
14019 if (group->needs_save_res)
7dda8d3c 14020 group->stub_sec->size += htab->sfpr->size;
a4b6fadd 14021
aa8a7074
AM
14022 if (htab->relbrlt != NULL)
14023 htab->relbrlt->reloc_count = 0;
14024
e7d1c40c 14025 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
14026 for (group = htab->group; group != NULL; group = group->next)
14027 if ((stub_sec = group->stub_sec) != NULL)
691d2e9a
AM
14028 {
14029 int align = abs (htab->params->plt_stub_align);
14030 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
14031 }
794e51c0 14032
7dda8d3c
AM
14033 for (group = htab->group; group != NULL; group = group->next)
14034 if (group->needs_save_res)
14035 {
14036 stub_sec = group->stub_sec;
14037 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
14038 htab->sfpr->contents, htab->sfpr->size);
14039 if (htab->params->emit_stub_syms)
14040 {
14041 unsigned int i;
14042
14043 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
14044 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
14045 return FALSE;
14046 }
14047 }
14048
df136d64
AM
14049 if (htab->glink_eh_frame != NULL
14050 && htab->glink_eh_frame->size != 0)
14051 {
14052 bfd_vma val;
14053 size_t align = 4;
14054
14055 p = htab->glink_eh_frame->contents;
14056 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
14057
14058 for (group = htab->group; group != NULL; group = group->next)
14059 if (group->eh_size != 0)
14060 {
14061 /* Offset to stub section. */
14062 val = (group->stub_sec->output_section->vma
14063 + group->stub_sec->output_offset);
14064 val -= (htab->glink_eh_frame->output_section->vma
14065 + htab->glink_eh_frame->output_offset
14066 + (p + 8 - htab->glink_eh_frame->contents));
14067 if (val + 0x80000000 > 0xffffffff)
14068 {
14069 _bfd_error_handler
14070 (_("%s offset too large for .eh_frame sdata4 encoding"),
14071 group->stub_sec->name);
14072 return FALSE;
14073 }
14074 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14075 p += (group->eh_size + 17 + 3) & -4;
14076 }
14077 if (htab->glink != NULL && htab->glink->size != 0)
14078 {
14079 /* Offset to .glink. */
14080 val = (htab->glink->output_section->vma
14081 + htab->glink->output_offset
14082 + 8);
14083 val -= (htab->glink_eh_frame->output_section->vma
14084 + htab->glink_eh_frame->output_offset
14085 + (p + 8 - htab->glink_eh_frame->contents));
14086 if (val + 0x80000000 > 0xffffffff)
14087 {
14088 _bfd_error_handler
14089 (_("%s offset too large for .eh_frame sdata4 encoding"),
14090 htab->glink->name);
14091 return FALSE;
14092 }
14093 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14094 p += (24 + align - 1) & -align;
14095 }
14096 }
14097
d4aaa2a0
AM
14098 for (group = htab->group; group != NULL; group = group->next)
14099 if ((stub_sec = group->stub_sec) != NULL)
e717da7e
AM
14100 {
14101 stub_sec_count += 1;
c9301e31
AM
14102 if (stub_sec->rawsize != stub_sec->size
14103 && (htab->stub_iteration <= STUB_SHRINK_ITER
14104 || stub_sec->rawsize < stub_sec->size))
e717da7e
AM
14105 break;
14106 }
5d1634d7 14107
25516cc5 14108 if (group != NULL)
5d1634d7 14109 {
b34976b6 14110 htab->stub_error = TRUE;
cf97bcb0 14111 _bfd_error_handler (_("stubs don't match calculated size"));
5d1634d7 14112 }
721956f4 14113
d2a300cf
AM
14114 if (htab->stub_error)
14115 return FALSE;
14116
14117 if (stats != NULL)
14118 {
db84fff3 14119 size_t len;
d2a300cf
AM
14120 *stats = bfd_malloc (500);
14121 if (*stats == NULL)
14122 return FALSE;
14123
db84fff3
AM
14124 len = sprintf (*stats,
14125 ngettext ("linker stubs in %u group\n",
14126 "linker stubs in %u groups\n",
14127 stub_sec_count),
14128 stub_sec_count);
05d0e962
AM
14129 sprintf (*stats + len, _(" branch %lu\n"
14130 " branch toc adj %lu\n"
14131 " branch notoc %lu\n"
14132 " branch both %lu\n"
14133 " long branch %lu\n"
14134 " long toc adj %lu\n"
14135 " long notoc %lu\n"
14136 " long both %lu\n"
14137 " plt call %lu\n"
14138 " plt call save %lu\n"
14139 " plt call notoc %lu\n"
14140 " plt call both %lu\n"
14141 " global entry %lu"),
4ce794b7
AM
14142 htab->stub_count[ppc_stub_long_branch - 1],
14143 htab->stub_count[ppc_stub_long_branch_r2off - 1],
05d0e962
AM
14144 htab->stub_count[ppc_stub_long_branch_notoc - 1],
14145 htab->stub_count[ppc_stub_long_branch_both - 1],
4ce794b7
AM
14146 htab->stub_count[ppc_stub_plt_branch - 1],
14147 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
05d0e962
AM
14148 htab->stub_count[ppc_stub_plt_branch_notoc - 1],
14149 htab->stub_count[ppc_stub_plt_branch_both - 1],
794e51c0 14150 htab->stub_count[ppc_stub_plt_call - 1],
7341d5e2 14151 htab->stub_count[ppc_stub_plt_call_r2save - 1],
05d0e962
AM
14152 htab->stub_count[ppc_stub_plt_call_notoc - 1],
14153 htab->stub_count[ppc_stub_plt_call_both - 1],
7341d5e2 14154 htab->stub_count[ppc_stub_global_entry - 1]);
d2a300cf
AM
14155 }
14156 return TRUE;
5bd4f169
AM
14157}
14158
60124e18
AM
14159/* What to do when ld finds relocations against symbols defined in
14160 discarded sections. */
14161
14162static unsigned int
14163ppc64_elf_action_discarded (asection *sec)
14164{
14165 if (strcmp (".opd", sec->name) == 0)
14166 return 0;
14167
14168 if (strcmp (".toc", sec->name) == 0)
14169 return 0;
14170
bce50a28
JJ
14171 if (strcmp (".toc1", sec->name) == 0)
14172 return 0;
14173
60124e18
AM
14174 return _bfd_elf_default_action_discarded (sec);
14175}
14176
e59a1001
AM
14177/* These are the dynamic relocations supported by glibc. */
14178
14179static bfd_boolean
14180ppc64_glibc_dynamic_reloc (enum elf_ppc64_reloc_type r_type)
14181{
14182 switch (r_type)
14183 {
14184 case R_PPC64_RELATIVE:
14185 case R_PPC64_NONE:
14186 case R_PPC64_ADDR64:
14187 case R_PPC64_GLOB_DAT:
14188 case R_PPC64_IRELATIVE:
14189 case R_PPC64_JMP_IREL:
14190 case R_PPC64_JMP_SLOT:
14191 case R_PPC64_DTPMOD64:
14192 case R_PPC64_DTPREL64:
14193 case R_PPC64_TPREL64:
14194 case R_PPC64_TPREL16_LO_DS:
14195 case R_PPC64_TPREL16_DS:
14196 case R_PPC64_TPREL16:
14197 case R_PPC64_TPREL16_LO:
14198 case R_PPC64_TPREL16_HI:
14199 case R_PPC64_TPREL16_HIGH:
14200 case R_PPC64_TPREL16_HA:
14201 case R_PPC64_TPREL16_HIGHA:
14202 case R_PPC64_TPREL16_HIGHER:
14203 case R_PPC64_TPREL16_HIGHEST:
14204 case R_PPC64_TPREL16_HIGHERA:
14205 case R_PPC64_TPREL16_HIGHESTA:
14206 case R_PPC64_ADDR16_LO_DS:
14207 case R_PPC64_ADDR16_LO:
14208 case R_PPC64_ADDR16_HI:
14209 case R_PPC64_ADDR16_HIGH:
14210 case R_PPC64_ADDR16_HA:
14211 case R_PPC64_ADDR16_HIGHA:
14212 case R_PPC64_REL30:
14213 case R_PPC64_COPY:
14214 case R_PPC64_UADDR64:
14215 case R_PPC64_UADDR32:
14216 case R_PPC64_ADDR32:
14217 case R_PPC64_ADDR24:
14218 case R_PPC64_ADDR16:
14219 case R_PPC64_UADDR16:
14220 case R_PPC64_ADDR16_DS:
14221 case R_PPC64_ADDR16_HIGHER:
14222 case R_PPC64_ADDR16_HIGHEST:
14223 case R_PPC64_ADDR16_HIGHERA:
14224 case R_PPC64_ADDR16_HIGHESTA:
14225 case R_PPC64_ADDR14:
14226 case R_PPC64_ADDR14_BRTAKEN:
14227 case R_PPC64_ADDR14_BRNTAKEN:
14228 case R_PPC64_REL32:
14229 case R_PPC64_REL64:
14230 return TRUE;
14231
14232 default:
14233 return FALSE;
14234 }
14235}
14236
5bd4f169
AM
14237/* The RELOCATE_SECTION function is called by the ELF backend linker
14238 to handle the relocations for a section.
14239
14240 The relocs are always passed as Rela structures; if the section
14241 actually uses Rel structures, the r_addend field will always be
14242 zero.
14243
14244 This function is responsible for adjust the section contents as
14245 necessary, and (if using Rela relocs and generating a
1049f94e 14246 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
14247 necessary.
14248
14249 This function does not have to worry about setting the reloc
14250 address or the reloc symbol index.
14251
14252 LOCAL_SYMS is a pointer to the swapped in local symbols.
14253
14254 LOCAL_SECTIONS is an array giving the section in the input file
14255 corresponding to the st_shndx field of each local symbol.
14256
14257 The global hash table entry for the global symbols can be found
14258 via elf_sym_hashes (input_bfd).
14259
1049f94e 14260 When generating relocatable output, this function must handle
5bd4f169
AM
14261 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
14262 going to be the section symbol corresponding to the output
14263 section, which means that the addend must be adjusted
14264 accordingly. */
14265
b34976b6 14266static bfd_boolean
4ce794b7
AM
14267ppc64_elf_relocate_section (bfd *output_bfd,
14268 struct bfd_link_info *info,
14269 bfd *input_bfd,
14270 asection *input_section,
14271 bfd_byte *contents,
14272 Elf_Internal_Rela *relocs,
14273 Elf_Internal_Sym *local_syms,
14274 asection **local_sections)
5bd4f169 14275{
65f38f15 14276 struct ppc_link_hash_table *htab;
5bd4f169
AM
14277 Elf_Internal_Shdr *symtab_hdr;
14278 struct elf_link_hash_entry **sym_hashes;
5bd4f169 14279 Elf_Internal_Rela *rel;
c316a17c 14280 Elf_Internal_Rela *wrel;
5bd4f169 14281 Elf_Internal_Rela *relend;
411e1bfb
AM
14282 Elf_Internal_Rela outrel;
14283 bfd_byte *loc;
411e1bfb 14284 struct got_entry **local_got_ents;
5bd4f169 14285 bfd_vma TOCstart;
b34976b6
AM
14286 bfd_boolean ret = TRUE;
14287 bfd_boolean is_opd;
794e51c0
AM
14288 /* Assume 'at' branch hints. */
14289 bfd_boolean is_isa_v2 = TRUE;
e59a1001 14290 bfd_boolean warned_dynamic = FALSE;
95f0d0d2 14291 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
5bd4f169 14292
65f38f15 14293 /* Initialize howto table if needed. */
5bd4f169 14294 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
14295 ppc_howto_init ();
14296
65f38f15 14297 htab = ppc_hash_table (info);
4dfe6ac6
NC
14298 if (htab == NULL)
14299 return FALSE;
ee75fd95
AM
14300
14301 /* Don't relocate stub sections. */
e7d1c40c 14302 if (input_section->owner == htab->params->stub_bfd)
ee75fd95
AM
14303 return TRUE;
14304
7af5d5c4
AM
14305 if (!is_ppc64_elf (input_bfd))
14306 {
14307 bfd_set_error (bfd_error_wrong_format);
14308 return FALSE;
14309 }
0ffa91dd 14310
411e1bfb 14311 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 14312 TOCstart = elf_gp (output_bfd);
0ffa91dd 14313 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 14314 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 14315 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 14316
c316a17c 14317 rel = wrel = relocs;
5bd4f169 14318 relend = relocs + input_section->reloc_count;
c316a17c 14319 for (; rel < relend; wrel++, rel++)
5bd4f169 14320 {
04c9666a 14321 enum elf_ppc64_reloc_type r_type;
31c76678 14322 bfd_vma addend;
5bd4f169
AM
14323 bfd_reloc_status_type r;
14324 Elf_Internal_Sym *sym;
14325 asection *sec;
039b3fef
AM
14326 struct elf_link_hash_entry *h_elf;
14327 struct ppc_link_hash_entry *h;
14328 struct ppc_link_hash_entry *fdh;
5bd4f169 14329 const char *sym_name;
0d4792f7 14330 unsigned long r_symndx, toc_symndx;
3a71aa26 14331 bfd_vma toc_addend;
f961d9dd
AM
14332 unsigned char tls_mask, tls_gd, tls_type;
14333 unsigned char sym_type;
5bd4f169 14334 bfd_vma relocation;
23cedd1d 14335 bfd_boolean unresolved_reloc, save_unresolved_reloc;
b34976b6 14336 bfd_boolean warned;
bc30df16 14337 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 14338 unsigned int insn;
e11840f9 14339 unsigned int mask;
721956f4
AM
14340 struct ppc_stub_hash_entry *stub_entry;
14341 bfd_vma max_br_offset;
14342 bfd_vma from;
c316a17c 14343 Elf_Internal_Rela orig_rel;
b80eed39
AM
14344 reloc_howto_type *howto;
14345 struct reloc_howto_struct alt_howto;
4a421c53
AM
14346 uint64_t pinsn;
14347 bfd_vma offset;
5bd4f169 14348
c316a17c
AM
14349 again:
14350 orig_rel = *rel;
14351
4ce794b7 14352 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 14353 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
14354
14355 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
14356 symbol of the previous ADDR64 reloc. The symbol gives us the
14357 proper TOC base to use. */
14358 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
c316a17c
AM
14359 && wrel != relocs
14360 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
ee87f2da 14361 && is_opd)
c316a17c 14362 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
ee87f2da 14363
4ce794b7
AM
14364 sym = NULL;
14365 sec = NULL;
039b3fef 14366 h_elf = NULL;
4ce794b7 14367 sym_name = NULL;
b34976b6
AM
14368 unresolved_reloc = FALSE;
14369 warned = FALSE;
65f38f15 14370
0b13192e 14371 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
14372 {
14373 /* It's a local symbol. */
74f0fb50 14374 struct _opd_sec_data *opd;
4025353c 14375
5bd4f169
AM
14376 sym = local_syms + r_symndx;
14377 sec = local_sections[r_symndx];
26c61ae5 14378 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 14379 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 14380 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
14381 opd = get_opd_info (sec);
14382 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 14383 {
51aecdc5
AM
14384 long adjust = opd->adjust[OPD_NDX (sym->st_value
14385 + rel->r_addend)];
4025353c
AM
14386 if (adjust == -1)
14387 relocation = 0;
14388 else
4cc603a5
AM
14389 {
14390 /* If this is a relocation against the opd section sym
14391 and we have edited .opd, adjust the reloc addend so
14392 that ld -r and ld --emit-relocs output is correct.
14393 If it is a reloc against some other .opd symbol,
14394 then the symbol value will be adjusted later. */
14395 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
14396 rel->r_addend += adjust;
14397 else
14398 relocation += adjust;
14399 }
1e2f5b6e 14400 }
5bd4f169
AM
14401 }
14402 else
14403 {
62d887d4
L
14404 bfd_boolean ignored;
14405
b2a8e766
AM
14406 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
14407 r_symndx, symtab_hdr, sym_hashes,
039b3fef 14408 h_elf, sec, relocation,
62d887d4 14409 unresolved_reloc, warned, ignored);
039b3fef
AM
14410 sym_name = h_elf->root.root.string;
14411 sym_type = h_elf->type;
b69fdb4e
AM
14412 if (sec != NULL
14413 && sec->owner == output_bfd
14414 && strcmp (sec->name, ".opd") == 0)
14415 {
14416 /* This is a symbol defined in a linker script. All
14417 such are defined in output sections, even those
14418 defined by simple assignment from a symbol defined in
14419 an input section. Transfer the symbol to an
14420 appropriate input .opd section, so that a branch to
14421 this symbol will be mapped to the location specified
14422 by the opd entry. */
14423 struct bfd_link_order *lo;
14424 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
14425 if (lo->type == bfd_indirect_link_order)
14426 {
14427 asection *isec = lo->u.indirect.section;
14428 if (h_elf->root.u.def.value >= isec->output_offset
14429 && h_elf->root.u.def.value < (isec->output_offset
14430 + isec->size))
14431 {
14432 h_elf->root.u.def.value -= isec->output_offset;
14433 h_elf->root.u.def.section = isec;
14434 sec = isec;
14435 break;
14436 }
14437 }
14438 }
5bd4f169 14439 }
ed7007c1 14440 h = ppc_elf_hash_entry (h_elf);
5bd4f169 14441
dbaa2011 14442 if (sec != NULL && discarded_section (sec))
c316a17c
AM
14443 {
14444 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
14445 input_bfd, input_section,
0930cb30 14446 contents, rel->r_offset);
c316a17c
AM
14447 wrel->r_offset = rel->r_offset;
14448 wrel->r_info = 0;
14449 wrel->r_addend = 0;
14450
14451 /* For ld -r, remove relocations in debug sections against
dcd2b8a0 14452 symbols defined in discarded sections. Not done for
c316a17c
AM
14453 non-debug to preserve relocs in .eh_frame which the
14454 eh_frame editing code expects to be present. */
14455 if (bfd_link_relocatable (info)
14456 && (input_section->flags & SEC_DEBUGGING))
14457 wrel--;
14458
14459 continue;
14460 }
ab96bf03 14461
0e1862bb 14462 if (bfd_link_relocatable (info))
c316a17c 14463 goto copy_reloc;
ab96bf03 14464
f40da81b
AM
14465 if (h != NULL && &h->elf == htab->elf.hgot)
14466 {
6f20ed8a 14467 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
f40da81b
AM
14468 sec = bfd_abs_section_ptr;
14469 unresolved_reloc = FALSE;
14470 }
14471
951fd09b
AM
14472 /* TLS optimizations. Replace instruction sequences and relocs
14473 based on information we collected in tls_optimize. We edit
14474 RELOCS so that --emit-relocs will output something sensible
14475 for the final instruction stream. */
14476 tls_mask = 0;
14477 tls_gd = 0;
0d4792f7 14478 toc_symndx = 0;
727fc41e
AM
14479 if (h != NULL)
14480 tls_mask = h->tls_mask;
14481 else if (local_got_ents != NULL)
411e1bfb 14482 {
e054468f
AM
14483 struct plt_entry **local_plt = (struct plt_entry **)
14484 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 14485 unsigned char *lgot_masks = (unsigned char *)
e054468f 14486 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
14487 tls_mask = lgot_masks[r_symndx];
14488 }
37da22e5 14489 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
727fc41e
AM
14490 && (r_type == R_PPC64_TLS
14491 || r_type == R_PPC64_TLSGD
14492 || r_type == R_PPC64_TLSLD))
14493 {
14494 /* Check for toc tls entries. */
f961d9dd 14495 unsigned char *toc_tls;
0d4792f7 14496
727fc41e
AM
14497 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14498 &local_syms, rel, input_bfd))
14499 return FALSE;
0d4792f7 14500
727fc41e
AM
14501 if (toc_tls)
14502 tls_mask = *toc_tls;
0d4792f7
AM
14503 }
14504
14505 /* Check that tls relocs are used with tls syms, and non-tls
14506 relocs are used with non-tls syms. */
cf35638d 14507 if (r_symndx != STN_UNDEF
0d4792f7
AM
14508 && r_type != R_PPC64_NONE
14509 && (h == NULL
039b3fef
AM
14510 || h->elf.root.type == bfd_link_hash_defined
14511 || h->elf.root.type == bfd_link_hash_defweak)
71c4e95a 14512 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
0d4792f7 14513 {
37da22e5 14514 if ((tls_mask & TLS_TLS) != 0
727fc41e
AM
14515 && (r_type == R_PPC64_TLS
14516 || r_type == R_PPC64_TLSGD
14517 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
14518 /* R_PPC64_TLS is OK against a symbol in the TOC. */
14519 ;
14520 else
25f53a85 14521 info->callbacks->einfo
1d483afe 14522 (!IS_PPC64_TLS_RELOC (r_type)
695344c0 14523 /* xgettext:c-format */
c1c8c1ef 14524 ? _("%H: %s used with TLS symbol `%pT'\n")
695344c0 14525 /* xgettext:c-format */
c1c8c1ef 14526 : _("%H: %s used with non-TLS symbol `%pT'\n"),
25f53a85 14527 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
14528 ppc64_elf_howto_table[r_type]->name,
14529 sym_name);
411e1bfb
AM
14530 }
14531
14532 /* Ensure reloc mapping code below stays sane. */
14533 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
14534 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
14535 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
14536 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
14537 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
14538 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
14539 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
14540 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
14541 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
14542 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
14543 abort ();
0d4792f7 14544
411e1bfb
AM
14545 switch (r_type)
14546 {
14547 default:
411e1bfb
AM
14548 break;
14549
ba761f19 14550 case R_PPC64_LO_DS_OPT:
95f0d0d2 14551 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
2365f8d7 14552 if ((insn & (0x3fu << 26)) != 58u << 26)
ba761f19
AM
14553 abort ();
14554 insn += (14u << 26) - (58u << 26);
95f0d0d2 14555 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
ba761f19
AM
14556 r_type = R_PPC64_TOC16_LO;
14557 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14558 break;
14559
411e1bfb
AM
14560 case R_PPC64_TOC16:
14561 case R_PPC64_TOC16_LO:
14562 case R_PPC64_TOC16_DS:
14563 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
14564 {
14565 /* Check for toc tls entries. */
f961d9dd 14566 unsigned char *toc_tls;
951fd09b 14567 int retval;
411e1bfb 14568
3a71aa26
AM
14569 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14570 &local_syms, rel, input_bfd);
951fd09b 14571 if (retval == 0)
411e1bfb
AM
14572 return FALSE;
14573
14574 if (toc_tls)
14575 {
951fd09b 14576 tls_mask = *toc_tls;
411e1bfb
AM
14577 if (r_type == R_PPC64_TOC16_DS
14578 || r_type == R_PPC64_TOC16_LO_DS)
81407a69 14579 {
37da22e5 14580 if ((tls_mask & TLS_TLS) != 0
81407a69
AM
14581 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
14582 goto toctprel;
14583 }
411e1bfb 14584 else
951fd09b
AM
14585 {
14586 /* If we found a GD reloc pair, then we might be
14587 doing a GD->IE transition. */
14588 if (retval == 2)
14589 {
b00a0a86 14590 tls_gd = TLS_GDIE;
37da22e5
AM
14591 if ((tls_mask & TLS_TLS) != 0
14592 && (tls_mask & TLS_GD) == 0)
102890f0 14593 goto tls_ldgd_opt;
951fd09b
AM
14594 }
14595 else if (retval == 3)
14596 {
37da22e5
AM
14597 if ((tls_mask & TLS_TLS) != 0
14598 && (tls_mask & TLS_LD) == 0)
102890f0 14599 goto tls_ldgd_opt;
951fd09b
AM
14600 }
14601 }
411e1bfb
AM
14602 }
14603 }
14604 break;
14605
9d6ded02
AM
14606 case R_PPC64_GOT_TPREL16_HI:
14607 case R_PPC64_GOT_TPREL16_HA:
37da22e5 14608 if ((tls_mask & TLS_TLS) != 0
9d6ded02
AM
14609 && (tls_mask & TLS_TPREL) == 0)
14610 {
14611 rel->r_offset -= d_offset;
95f0d0d2 14612 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
9d6ded02
AM
14613 r_type = R_PPC64_NONE;
14614 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14615 }
14616 break;
14617
411e1bfb
AM
14618 case R_PPC64_GOT_TPREL16_DS:
14619 case R_PPC64_GOT_TPREL16_LO_DS:
37da22e5 14620 if ((tls_mask & TLS_TLS) != 0
951fd09b 14621 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14622 {
81407a69 14623 toctprel:
95f0d0d2 14624 insn = bfd_get_32 (input_bfd,
c316a17c 14625 contents + rel->r_offset - d_offset);
411e1bfb
AM
14626 insn &= 31 << 21;
14627 insn |= 0x3c0d0000; /* addis 0,13,0 */
95f0d0d2 14628 bfd_put_32 (input_bfd, insn,
c316a17c 14629 contents + rel->r_offset - d_offset);
411e1bfb 14630 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
14631 if (toc_symndx != 0)
14632 {
14633 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 14634 rel->r_addend = toc_addend;
0d4792f7
AM
14635 /* We changed the symbol. Start over in order to
14636 get h, sym, sec etc. right. */
c316a17c 14637 goto again;
0d4792f7
AM
14638 }
14639 else
14640 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14641 }
14642 break;
14643
c213164a
AM
14644 case R_PPC64_GOT_TPREL34:
14645 if ((tls_mask & TLS_TLS) != 0
14646 && (tls_mask & TLS_TPREL) == 0)
14647 {
14648 /* pld ra,sym@got@tprel@pcrel -> paddi ra,r13,sym@tprel */
14649 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14650 pinsn <<= 32;
14651 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14652 pinsn += ((2ULL << 56) + (-1ULL << 52)
14653 + (14ULL << 26) - (57ULL << 26) + (13ULL << 16));
14654 bfd_put_32 (input_bfd, pinsn >> 32,
14655 contents + rel->r_offset);
14656 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14657 contents + rel->r_offset + 4);
14658 r_type = R_PPC64_TPREL34;
14659 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14660 }
14661 break;
14662
411e1bfb 14663 case R_PPC64_TLS:
37da22e5 14664 if ((tls_mask & TLS_TLS) != 0
951fd09b 14665 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14666 {
c213164a 14667 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2d0f3896
AM
14668 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
14669 if (insn == 0)
c213164a
AM
14670 break;
14671 if ((rel->r_offset & 3) == 0)
0d4792f7 14672 {
c213164a
AM
14673 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
14674 /* Was PPC64_TLS which sits on insn boundary, now
14675 PPC64_TPREL16_LO which is at low-order half-word. */
14676 rel->r_offset += d_offset;
14677 r_type = R_PPC64_TPREL16_LO;
14678 if (toc_symndx != 0)
14679 {
14680 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
14681 rel->r_addend = toc_addend;
14682 /* We changed the symbol. Start over in order to
14683 get h, sym, sec etc. right. */
14684 goto again;
14685 }
14686 else
14687 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14688 }
14689 else if ((rel->r_offset & 3) == 1)
14690 {
14691 /* For pcrel IE to LE we already have the full
14692 offset and thus don't need an addi here. A nop
14693 or mr will do. */
2365f8d7 14694 if ((insn & (0x3fu << 26)) == 14 << 26)
c213164a
AM
14695 {
14696 /* Extract regs from addi rt,ra,si. */
14697 unsigned int rt = (insn >> 21) & 0x1f;
14698 unsigned int ra = (insn >> 16) & 0x1f;
14699 if (rt == ra)
14700 insn = NOP;
14701 else
14702 {
14703 /* Build or ra,rs,rb with rb==rs, ie. mr ra,rs. */
14704 insn = (rt << 16) | (ra << 21) | (ra << 11);
14705 insn |= (31u << 26) | (444u << 1);
14706 }
14707 }
14708 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - 1);
0d4792f7 14709 }
411e1bfb
AM
14710 }
14711 break;
14712
411e1bfb
AM
14713 case R_PPC64_GOT_TLSGD16_HI:
14714 case R_PPC64_GOT_TLSGD16_HA:
b00a0a86 14715 tls_gd = TLS_GDIE;
37da22e5 14716 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
951fd09b
AM
14717 goto tls_gdld_hi;
14718 break;
14719
411e1bfb
AM
14720 case R_PPC64_GOT_TLSLD16_HI:
14721 case R_PPC64_GOT_TLSLD16_HA:
37da22e5 14722 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 14723 {
951fd09b
AM
14724 tls_gdld_hi:
14725 if ((tls_mask & tls_gd) != 0)
14726 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14727 + R_PPC64_GOT_TPREL16_DS);
14728 else
411e1bfb 14729 {
4fe5ca5b 14730 rel->r_offset -= d_offset;
95f0d0d2 14731 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
951fd09b 14732 r_type = R_PPC64_NONE;
411e1bfb 14733 }
951fd09b 14734 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14735 }
14736 break;
14737
951fd09b
AM
14738 case R_PPC64_GOT_TLSGD16:
14739 case R_PPC64_GOT_TLSGD16_LO:
b00a0a86 14740 tls_gd = TLS_GDIE;
37da22e5 14741 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
102890f0 14742 goto tls_ldgd_opt;
951fd09b 14743 break;
411e1bfb 14744
951fd09b
AM
14745 case R_PPC64_GOT_TLSLD16:
14746 case R_PPC64_GOT_TLSLD16_LO:
37da22e5 14747 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
951fd09b 14748 {
b9f04fe0 14749 unsigned int insn1, insn2;
102890f0
AM
14750
14751 tls_ldgd_opt:
727fc41e
AM
14752 offset = (bfd_vma) -1;
14753 /* If not using the newer R_PPC64_TLSGD/LD to mark
14754 __tls_get_addr calls, we must trust that the call
14755 stays with its arg setup insns, ie. that the next
14756 reloc is the __tls_get_addr call associated with
14757 the current reloc. Edit both insns. */
9737e8af 14758 if (input_section->nomark_tls_get_addr
727fc41e
AM
14759 && rel + 1 < relend
14760 && branch_reloc_hash_match (input_bfd, rel + 1,
14761 htab->tls_get_addr,
14762 htab->tls_get_addr_fd))
14763 offset = rel[1].r_offset;
b86ac8e3
AM
14764 /* We read the low GOT_TLS (or TOC16) insn because we
14765 need to keep the destination reg. It may be
14766 something other than the usual r3, and moved to r3
14767 before the call by intervening code. */
95f0d0d2 14768 insn1 = bfd_get_32 (input_bfd,
b86ac8e3 14769 contents + rel->r_offset - d_offset);
102890f0 14770 if ((tls_mask & tls_gd) != 0)
411e1bfb 14771 {
102890f0 14772 /* IE */
b86ac8e3 14773 insn1 &= (0x1f << 21) | (0x1f << 16);
2365f8d7 14774 insn1 |= 58u << 26; /* ld */
102890f0 14775 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 14776 if (offset != (bfd_vma) -1)
f58d5a2d 14777 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
46e9995a
AM
14778 if (r_type == R_PPC64_TOC16
14779 || r_type == R_PPC64_TOC16_LO)
102890f0 14780 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
46e9995a
AM
14781 else
14782 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 1)) & 1)
14783 + R_PPC64_GOT_TPREL16_DS);
102890f0
AM
14784 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14785 }
14786 else
14787 {
14788 /* LE */
b86ac8e3
AM
14789 insn1 &= 0x1f << 21;
14790 insn1 |= 0x3c0d0000; /* addis r,13,0 */
102890f0
AM
14791 insn2 = 0x38630000; /* addi 3,3,0 */
14792 if (tls_gd == 0)
951fd09b 14793 {
102890f0 14794 /* Was an LD reloc. */
71c4e95a 14795 r_symndx = STN_UNDEF;
102890f0 14796 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
951fd09b 14797 }
102890f0 14798 else if (toc_symndx != 0)
3a71aa26
AM
14799 {
14800 r_symndx = toc_symndx;
14801 rel->r_addend = toc_addend;
14802 }
102890f0
AM
14803 r_type = R_PPC64_TPREL16_HA;
14804 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
14805 if (offset != (bfd_vma) -1)
14806 {
14807 rel[1].r_info = ELF64_R_INFO (r_symndx,
14808 R_PPC64_TPREL16_LO);
14809 rel[1].r_offset = offset + d_offset;
14810 rel[1].r_addend = rel->r_addend;
14811 }
102890f0 14812 }
95f0d0d2 14813 bfd_put_32 (input_bfd, insn1,
3a71aa26 14814 contents + rel->r_offset - d_offset);
727fc41e 14815 if (offset != (bfd_vma) -1)
c96e0573
AM
14816 {
14817 bfd_put_32 (input_bfd, insn2, contents + offset);
14818 if (offset + 8 <= input_section->size)
14819 {
14820 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
14821 if (insn2 == LD_R2_0R1 + STK_TOC (htab))
14822 bfd_put_32 (input_bfd, NOP, contents + offset + 4);
14823 }
14824 }
727fc41e
AM
14825 if ((tls_mask & tls_gd) == 0
14826 && (tls_gd == 0 || toc_symndx != 0))
14827 {
14828 /* We changed the symbol. Start over in order
14829 to get h, sym, sec etc. right. */
c316a17c 14830 goto again;
727fc41e
AM
14831 }
14832 }
14833 break;
14834
c213164a
AM
14835 case R_PPC64_GOT_TLSGD34:
14836 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
14837 {
14838 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14839 pinsn <<= 32;
14840 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14841 if ((tls_mask & TLS_GDIE) != 0)
14842 {
14843 /* IE, pla -> pld */
14844 pinsn += (-2ULL << 56) + (57ULL << 26) - (14ULL << 26);
14845 r_type = R_PPC64_GOT_TPREL34;
14846 }
14847 else
14848 {
14849 /* LE, pla pcrel -> paddi r13 */
14850 pinsn += (-1ULL << 52) + (13ULL << 16);
14851 r_type = R_PPC64_TPREL34;
14852 }
14853 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14854 bfd_put_32 (input_bfd, pinsn >> 32,
14855 contents + rel->r_offset);
14856 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14857 contents + rel->r_offset + 4);
14858 }
14859 break;
14860
14861 case R_PPC64_GOT_TLSLD34:
14862 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
14863 {
14864 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14865 pinsn <<= 32;
14866 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14867 pinsn += (-1ULL << 52) + (13ULL << 16);
14868 bfd_put_32 (input_bfd, pinsn >> 32,
14869 contents + rel->r_offset);
14870 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14871 contents + rel->r_offset + 4);
14872 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
14873 r_symndx = STN_UNDEF;
14874 r_type = R_PPC64_TPREL34;
14875 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14876 goto again;
14877 }
14878 break;
14879
727fc41e 14880 case R_PPC64_TLSGD:
37da22e5 14881 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
675e2809 14882 && rel + 1 < relend)
727fc41e 14883 {
b9f04fe0 14884 unsigned int insn2;
5663e321 14885 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 14886
4a421c53 14887 offset = rel->r_offset;
5663e321 14888 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
14889 {
14890 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
14891 if (r_type1 == R_PPC64_PLT_PCREL34
14892 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
14893 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
14894 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14895 break;
14896 }
14897
14898 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14899 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14900
b00a0a86 14901 if ((tls_mask & TLS_GDIE) != 0)
727fc41e
AM
14902 {
14903 /* IE */
14904 r_type = R_PPC64_NONE;
14905 insn2 = 0x7c636a14; /* add 3,3,13 */
14906 }
14907 else
14908 {
14909 /* LE */
14910 if (toc_symndx != 0)
14911 {
14912 r_symndx = toc_symndx;
14913 rel->r_addend = toc_addend;
14914 }
c213164a
AM
14915 if (r_type1 == R_PPC64_REL24_NOTOC
14916 || r_type1 == R_PPC64_PLTCALL_NOTOC)
14917 {
14918 r_type = R_PPC64_NONE;
14919 insn2 = NOP;
14920 }
14921 else
14922 {
14923 rel->r_offset = offset + d_offset;
14924 r_type = R_PPC64_TPREL16_LO;
14925 insn2 = 0x38630000; /* addi 3,3,0 */
14926 }
727fc41e
AM
14927 }
14928 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14929 /* Zap the reloc on the _tls_get_addr call too. */
14930 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14931 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 14932 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
14933 if ((tls_mask & TLS_GDIE) == 0
14934 && toc_symndx != 0
14935 && r_type != R_PPC64_NONE)
c316a17c 14936 goto again;
411e1bfb 14937 }
411e1bfb
AM
14938 break;
14939
727fc41e 14940 case R_PPC64_TLSLD:
37da22e5 14941 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
675e2809 14942 && rel + 1 < relend)
727fc41e 14943 {
b9f04fe0 14944 unsigned int insn2;
5663e321 14945 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 14946
4a421c53 14947 offset = rel->r_offset;
5663e321 14948 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
14949 {
14950 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
14951 if (r_type1 == R_PPC64_PLT_PCREL34
14952 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
14953 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
14954 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14955 break;
14956 }
14957
14958 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14959 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14960
c213164a
AM
14961 if (r_type1 == R_PPC64_REL24_NOTOC
14962 || r_type1 == R_PPC64_PLTCALL_NOTOC)
14963 {
14964 r_type = R_PPC64_NONE;
14965 insn2 = NOP;
14966 }
14967 else
14968 {
14969 rel->r_offset = offset + d_offset;
14970 r_symndx = STN_UNDEF;
14971 r_type = R_PPC64_TPREL16_LO;
14972 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
14973 insn2 = 0x38630000; /* addi 3,3,0 */
14974 }
727fc41e 14975 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
14976 /* Zap the reloc on the _tls_get_addr call too. */
14977 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14978 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 14979 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
14980 if (r_type != R_PPC64_NONE)
14981 goto again;
727fc41e
AM
14982 }
14983 break;
14984
411e1bfb 14985 case R_PPC64_DTPMOD64:
951fd09b
AM
14986 if (rel + 1 < relend
14987 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
14988 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 14989 {
951fd09b
AM
14990 if ((tls_mask & TLS_GD) == 0)
14991 {
14992 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
b00a0a86 14993 if ((tls_mask & TLS_GDIE) != 0)
951fd09b
AM
14994 r_type = R_PPC64_TPREL64;
14995 else
14996 {
4ce794b7 14997 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
14998 r_type = R_PPC64_NONE;
14999 }
15000 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15001 }
15002 }
15003 else
15004 {
15005 if ((tls_mask & TLS_LD) == 0)
411e1bfb 15006 {
4ce794b7 15007 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 15008 r_type = R_PPC64_NONE;
951fd09b 15009 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 15010 }
411e1bfb
AM
15011 }
15012 break;
15013
15014 case R_PPC64_TPREL64:
951fd09b 15015 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
15016 {
15017 r_type = R_PPC64_NONE;
15018 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15019 }
15020 break;
52a82034 15021
006589cf
AM
15022 case R_PPC64_ENTRY:
15023 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
15024 if (!bfd_link_pic (info)
15025 && !info->traditional_format
15026 && relocation + 0x80008000 <= 0xffffffff)
15027 {
15028 unsigned int insn1, insn2;
15029
15030 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15031 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15032 if ((insn1 & ~0xfffc) == LD_R2_0R12
15033 && insn2 == ADD_R2_R2_R12)
15034 {
95f0d0d2 15035 bfd_put_32 (input_bfd,
006589cf
AM
15036 LIS_R2 + PPC_HA (relocation),
15037 contents + rel->r_offset);
95f0d0d2 15038 bfd_put_32 (input_bfd,
006589cf
AM
15039 ADDI_R2_R2 + PPC_LO (relocation),
15040 contents + rel->r_offset + 4);
15041 }
15042 }
15043 else
15044 {
15045 relocation -= (rel->r_offset
15046 + input_section->output_offset
15047 + input_section->output_section->vma);
15048 if (relocation + 0x80008000 <= 0xffffffff)
15049 {
15050 unsigned int insn1, insn2;
15051
15052 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15053 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15054 if ((insn1 & ~0xfffc) == LD_R2_0R12
15055 && insn2 == ADD_R2_R2_R12)
15056 {
95f0d0d2 15057 bfd_put_32 (input_bfd,
006589cf
AM
15058 ADDIS_R2_R12 + PPC_HA (relocation),
15059 contents + rel->r_offset);
95f0d0d2 15060 bfd_put_32 (input_bfd,
006589cf
AM
15061 ADDI_R2_R2 + PPC_LO (relocation),
15062 contents + rel->r_offset + 4);
15063 }
15064 }
15065 }
15066 break;
15067
52a82034
AM
15068 case R_PPC64_REL16_HA:
15069 /* If we are generating a non-PIC executable, edit
15070 . 0: addis 2,12,.TOC.-0b@ha
15071 . addi 2,2,.TOC.-0b@l
15072 used by ELFv2 global entry points to set up r2, to
15073 . lis 2,.TOC.@ha
15074 . addi 2,2,.TOC.@l
15075 if .TOC. is in range. */
0e1862bb 15076 if (!bfd_link_pic (info)
810d4e75 15077 && !info->traditional_format
006589cf 15078 && !htab->opd_abi
4f038ee5 15079 && rel->r_addend == d_offset
52a82034
AM
15080 && h != NULL && &h->elf == htab->elf.hgot
15081 && rel + 1 < relend
15082 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
15083 && rel[1].r_offset == rel->r_offset + 4
15084 && rel[1].r_addend == rel->r_addend + 4
15085 && relocation + 0x80008000 <= 0xffffffff)
15086 {
15087 unsigned int insn1, insn2;
4a421c53 15088 offset = rel->r_offset - d_offset;
95f0d0d2
AM
15089 insn1 = bfd_get_32 (input_bfd, contents + offset);
15090 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
006589cf
AM
15091 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
15092 && (insn2 & 0xffff0000) == ADDI_R2_R2)
52a82034
AM
15093 {
15094 r_type = R_PPC64_ADDR16_HA;
15095 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15096 rel->r_addend -= d_offset;
15097 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
15098 rel[1].r_addend -= d_offset + 4;
95f0d0d2 15099 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
52a82034
AM
15100 }
15101 }
15102 break;
411e1bfb
AM
15103 }
15104
15105 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 15106 insn = 0;
b25116a9
AM
15107 max_br_offset = 1 << 25;
15108 addend = rel->r_addend;
bc30df16 15109 reloc_dest = DEST_NORMAL;
65f38f15 15110 switch (r_type)
5bd4f169
AM
15111 {
15112 default:
65f38f15 15113 break;
5bd4f169 15114
3b421ab3
AM
15115 case R_PPC64_TOCSAVE:
15116 if (relocation + addend == (rel->r_offset
15117 + input_section->output_offset
15118 + input_section->output_section->vma)
15119 && tocsave_find (htab, NO_INSERT,
15120 &local_syms, rel, input_bfd))
15121 {
15122 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15123 if (insn == NOP
15124 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
15125 bfd_put_32 (input_bfd,
15126 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
15127 contents + rel->r_offset);
15128 }
15129 break;
15130
65f38f15
AM
15131 /* Branch taken prediction relocations. */
15132 case R_PPC64_ADDR14_BRTAKEN:
15133 case R_PPC64_REL14_BRTAKEN:
cedb70c5 15134 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
1a0670f3 15135 /* Fall through. */
65f38f15 15136
86c76c7b 15137 /* Branch not taken prediction relocations. */
65f38f15
AM
15138 case R_PPC64_ADDR14_BRNTAKEN:
15139 case R_PPC64_REL14_BRNTAKEN:
95f0d0d2 15140 insn |= bfd_get_32 (input_bfd,
411e1bfb 15141 contents + rel->r_offset) & ~(0x01 << 21);
1a0670f3 15142 /* Fall through. */
86c76c7b 15143
b25116a9
AM
15144 case R_PPC64_REL14:
15145 max_br_offset = 1 << 15;
1a0670f3 15146 /* Fall through. */
5bd4f169 15147
65f38f15 15148 case R_PPC64_REL24:
05d0e962 15149 case R_PPC64_REL24_NOTOC:
23cedd1d 15150 case R_PPC64_PLTCALL:
5663e321 15151 case R_PPC64_PLTCALL_NOTOC:
ad8e1ba5
AM
15152 /* Calls to functions with a different TOC, such as calls to
15153 shared objects, need to alter the TOC pointer. This is
15154 done using a linkage stub. A REL24 branching to these
15155 linkage stubs needs to be followed by a nop, as the nop
15156 will be replaced with an instruction to restore the TOC
15157 base pointer. */
8387904d 15158 fdh = h;
b31867b6
AM
15159 if (h != NULL
15160 && h->oh != NULL
15161 && h->oh->is_func_descriptor)
15162 fdh = ppc_follow_link (h->oh);
31c76678
DK
15163 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
15164 htab);
5663e321
AM
15165 if ((r_type == R_PPC64_PLTCALL
15166 || r_type == R_PPC64_PLTCALL_NOTOC)
23cedd1d 15167 && stub_entry != NULL
05d0e962
AM
15168 && stub_entry->stub_type >= ppc_stub_plt_call
15169 && stub_entry->stub_type <= ppc_stub_plt_call_both)
23cedd1d
AM
15170 stub_entry = NULL;
15171
6abec6bc 15172 if (stub_entry != NULL
d0abeec8
AM
15173 && ((stub_entry->stub_type >= ppc_stub_plt_call
15174 && stub_entry->stub_type <= ppc_stub_plt_call_both)
ad8e1ba5 15175 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
05d0e962
AM
15176 || stub_entry->stub_type == ppc_stub_plt_branch_both
15177 || stub_entry->stub_type == ppc_stub_long_branch_r2off
15178 || stub_entry->stub_type == ppc_stub_long_branch_both))
41bd81ab 15179 {
b25116a9 15180 bfd_boolean can_plt_call = FALSE;
721956f4 15181
6e1816be
AM
15182 if (stub_entry->stub_type == ppc_stub_plt_call
15183 && !htab->opd_abi
15184 && htab->params->plt_localentry0 != 0
15185 && is_elfv2_localentry0 (&h->elf))
15186 {
15187 /* The function doesn't use or change r2. */
15188 can_plt_call = TRUE;
15189 }
05d0e962
AM
15190 else if (r_type == R_PPC64_REL24_NOTOC)
15191 {
15192 /* NOTOC calls don't need to restore r2. */
15193 can_plt_call = TRUE;
15194 }
6e1816be 15195
f378ab09 15196 /* All of these stubs may modify r2, so there must be a
ba8ca3e7
AM
15197 branch and link followed by a nop. The nop is
15198 replaced by an insn to restore r2. */
6e1816be 15199 else if (rel->r_offset + 8 <= input_section->size)
41bd81ab 15200 {
ba8ca3e7
AM
15201 unsigned long br;
15202
15203 br = bfd_get_32 (input_bfd,
15204 contents + rel->r_offset);
15205 if ((br & 1) != 0)
41bd81ab 15206 {
ba8ca3e7
AM
15207 unsigned long nop;
15208
15209 nop = bfd_get_32 (input_bfd,
15210 contents + rel->r_offset + 4);
23cedd1d
AM
15211 if (nop == LD_R2_0R1 + STK_TOC (htab))
15212 can_plt_call = TRUE;
15213 else if (nop == NOP
15214 || nop == CROR_151515
15215 || nop == CROR_313131)
a7f2871e 15216 {
ba8ca3e7 15217 if (h != NULL
ed7007c1 15218 && is_tls_get_addr (&h->elf, htab)
7c9cf415 15219 && htab->params->tls_get_addr_opt)
ba8ca3e7
AM
15220 {
15221 /* Special stub used, leave nop alone. */
15222 }
15223 else
a078d95a
AM
15224 bfd_put_32 (input_bfd,
15225 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7
AM
15226 contents + rel->r_offset + 4);
15227 can_plt_call = TRUE;
a7f2871e 15228 }
41bd81ab 15229 }
5bd4f169 15230 }
721956f4 15231
ba8ca3e7 15232 if (!can_plt_call && h != NULL)
721956f4 15233 {
ba8ca3e7
AM
15234 const char *name = h->elf.root.root.string;
15235
15236 if (*name == '.')
15237 ++name;
15238
15239 if (strncmp (name, "__libc_start_main", 17) == 0
15240 && (name[17] == 0 || name[17] == '@'))
6ab189d5 15241 {
ba8ca3e7
AM
15242 /* Allow crt1 branch to go via a toc adjusting
15243 stub. Other calls that never return could do
15244 the same, if we could detect such. */
b25116a9 15245 can_plt_call = TRUE;
6ab189d5 15246 }
ba8ca3e7
AM
15247 }
15248
15249 if (!can_plt_call)
15250 {
15251 /* g++ as of 20130507 emits self-calls without a
15252 following nop. This is arguably wrong since we
15253 have conflicting information. On the one hand a
15254 global symbol and on the other a local call
15255 sequence, but don't error for this special case.
15256 It isn't possible to cheaply verify we have
15257 exactly such a call. Allow all calls to the same
15258 section. */
15259 asection *code_sec = sec;
15260
15261 if (get_opd_info (sec) != NULL)
ad8e1ba5 15262 {
ba8ca3e7
AM
15263 bfd_vma off = (relocation + addend
15264 - sec->output_section->vma
15265 - sec->output_offset);
bc30df16 15266
ba8ca3e7 15267 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 15268 }
ba8ca3e7
AM
15269 if (code_sec == input_section)
15270 can_plt_call = TRUE;
15271 }
15272
15273 if (!can_plt_call)
15274 {
05d0e962
AM
15275 if (stub_entry->stub_type >= ppc_stub_plt_call
15276 && stub_entry->stub_type <= ppc_stub_plt_call_both)
4805fc55 15277 info->callbacks->einfo
695344c0 15278 /* xgettext:c-format */
c1c8c1ef 15279 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15280 "(plt call stub)\n"),
4805fc55
AM
15281 input_bfd, input_section, rel->r_offset, sym_name);
15282 else
15283 info->callbacks->einfo
695344c0 15284 /* xgettext:c-format */
c1c8c1ef 15285 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15286 "(toc save/adjust stub)\n"),
4805fc55 15287 input_bfd, input_section, rel->r_offset, sym_name);
ba8ca3e7
AM
15288
15289 bfd_set_error (bfd_error_bad_value);
15290 ret = FALSE;
721956f4
AM
15291 }
15292
b25116a9 15293 if (can_plt_call
05d0e962
AM
15294 && stub_entry->stub_type >= ppc_stub_plt_call
15295 && stub_entry->stub_type <= ppc_stub_plt_call_both)
b25116a9
AM
15296 unresolved_reloc = FALSE;
15297 }
15298
6abec6bc
AM
15299 if ((stub_entry == NULL
15300 || stub_entry->stub_type == ppc_stub_long_branch
15301 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
15302 && get_opd_info (sec) != NULL)
15303 {
15304 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
15305 bfd_vma off = (relocation + addend
15306 - sec->output_section->vma
15307 - sec->output_offset);
aef36ac1 15308 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
15309 if (dest != (bfd_vma) -1)
15310 {
15311 relocation = dest;
15312 addend = 0;
bc30df16 15313 reloc_dest = DEST_OPD;
8387904d
AM
15314 }
15315 }
15316
b25116a9
AM
15317 /* If the branch is out of reach we ought to have a long
15318 branch stub. */
15319 from = (rel->r_offset
15320 + input_section->output_offset
15321 + input_section->output_section->vma);
15322
6911b7dc
AM
15323 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
15324 ? fdh->elf.other
15325 : sym->st_other);
15326
6abec6bc
AM
15327 if (stub_entry != NULL
15328 && (stub_entry->stub_type == ppc_stub_long_branch
15329 || stub_entry->stub_type == ppc_stub_plt_branch)
15330 && (r_type == R_PPC64_ADDR14_BRTAKEN
15331 || r_type == R_PPC64_ADDR14_BRNTAKEN
15332 || (relocation + addend - from + max_br_offset
15333 < 2 * max_br_offset)))
15334 /* Don't use the stub if this branch is in range. */
15335 stub_entry = NULL;
b25116a9 15336
05d0e962
AM
15337 if (stub_entry != NULL
15338 && (stub_entry->stub_type == ppc_stub_long_branch_notoc
15339 || stub_entry->stub_type == ppc_stub_long_branch_both
15340 || stub_entry->stub_type == ppc_stub_plt_branch_notoc
15341 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15342 && (r_type != R_PPC64_REL24_NOTOC
15343 || ((fdh ? fdh->elf.other : sym->st_other)
4a4e7361 15344 & STO_PPC64_LOCAL_MASK) <= 1 << STO_PPC64_LOCAL_BIT)
05d0e962
AM
15345 && (relocation + addend - from + max_br_offset
15346 < 2 * max_br_offset))
15347 stub_entry = NULL;
15348
15349 if (stub_entry != NULL
15350 && (stub_entry->stub_type == ppc_stub_long_branch_r2off
15351 || stub_entry->stub_type == ppc_stub_long_branch_both
15352 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
15353 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15354 && r_type == R_PPC64_REL24_NOTOC
15355 && (relocation + addend - from + max_br_offset
15356 < 2 * max_br_offset))
15357 stub_entry = NULL;
15358
b25116a9
AM
15359 if (stub_entry != NULL)
15360 {
15361 /* Munge up the value and addend so that we call the stub
15362 rather than the procedure directly. */
a4b6fadd
AM
15363 asection *stub_sec = stub_entry->group->stub_sec;
15364
15365 if (stub_entry->stub_type == ppc_stub_save_res)
15366 relocation += (stub_sec->output_offset
15367 + stub_sec->output_section->vma
15368 + stub_sec->size - htab->sfpr->size
15369 - htab->sfpr->output_offset
15370 - htab->sfpr->output_section->vma);
15371 else
15372 relocation = (stub_entry->stub_offset
15373 + stub_sec->output_offset
15374 + stub_sec->output_section->vma);
b25116a9 15375 addend = 0;
bc30df16 15376 reloc_dest = DEST_STUB;
3b421ab3 15377
05d0e962
AM
15378 if (((stub_entry->stub_type == ppc_stub_plt_call
15379 && ALWAYS_EMIT_R2SAVE)
15380 || stub_entry->stub_type == ppc_stub_plt_call_r2save
15381 || stub_entry->stub_type == ppc_stub_plt_call_both)
e81b4c93 15382 && !(h != NULL
ed7007c1 15383 && is_tls_get_addr (&h->elf, htab)
e81b4c93 15384 && htab->params->tls_get_addr_opt)
3b421ab3
AM
15385 && rel + 1 < relend
15386 && rel[1].r_offset == rel->r_offset + 4
15387 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
15388 relocation += 4;
05d0e962
AM
15389 else if ((stub_entry->stub_type == ppc_stub_long_branch_both
15390 || stub_entry->stub_type == ppc_stub_plt_branch_both
15391 || stub_entry->stub_type == ppc_stub_plt_call_both)
15392 && r_type == R_PPC64_REL24_NOTOC)
15393 relocation += 4;
5663e321
AM
15394
15395 if (r_type == R_PPC64_REL24_NOTOC
15396 && (stub_entry->stub_type == ppc_stub_plt_call_notoc
15397 || stub_entry->stub_type == ppc_stub_plt_call_both))
15398 htab->notoc_plt = 1;
b25116a9
AM
15399 }
15400
15401 if (insn != 0)
15402 {
794e51c0 15403 if (is_isa_v2)
721956f4 15404 {
b25116a9
AM
15405 /* Set 'a' bit. This is 0b00010 in BO field for branch
15406 on CR(BI) insns (BO == 001at or 011at), and 0b01000
15407 for branch on CTR insns (BO == 1a00t or 1a01t). */
15408 if ((insn & (0x14 << 21)) == (0x04 << 21))
15409 insn |= 0x02 << 21;
15410 else if ((insn & (0x14 << 21)) == (0x10 << 21))
15411 insn |= 0x08 << 21;
15412 else
15413 break;
15414 }
15415 else
15416 {
15417 /* Invert 'y' bit if not the default. */
4cc603a5 15418 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 15419 insn ^= 0x01 << 21;
721956f4 15420 }
b25116a9 15421
95f0d0d2 15422 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
5bd4f169 15423 }
e86ce104 15424
06da1e8e
AM
15425 /* NOP out calls to undefined weak functions.
15426 We can thus call a weak function without first
15427 checking whether the function is defined. */
b25116a9 15428 else if (h != NULL
039b3fef 15429 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 15430 && h->elf.dynindx == -1
05d0e962
AM
15431 && (r_type == R_PPC64_REL24
15432 || r_type == R_PPC64_REL24_NOTOC)
b25116a9 15433 && relocation == 0
4cc603a5 15434 && addend == 0)
e86ce104 15435 {
95f0d0d2 15436 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
c316a17c 15437 goto copy_reloc;
e86ce104 15438 }
65f38f15 15439 break;
066f4018
AM
15440
15441 case R_PPC64_GOT16_DS:
15442 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15443 if (relocation + addend - from + 0x8000 < 0x10000
15444 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15445 {
15446 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15447 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15448 {
15449 insn += (14u << 26) - (58u << 26);
15450 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15451 r_type = R_PPC64_TOC16;
15452 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15453 }
15454 }
15455 break;
15456
15457 case R_PPC64_GOT16_LO_DS:
15458 case R_PPC64_GOT16_HA:
15459 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15460 if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
15461 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15462 {
15463 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15464 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15465 {
15466 insn += (14u << 26) - (58u << 26);
15467 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15468 r_type = R_PPC64_TOC16_LO;
15469 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15470 }
2365f8d7 15471 else if ((insn & (0x3fu << 26)) == 15u << 26 /* addis */)
066f4018
AM
15472 {
15473 r_type = R_PPC64_TOC16_HA;
15474 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15475 }
15476 }
15477 break;
4a421c53
AM
15478
15479 case R_PPC64_GOT_PCREL34:
15480 from = (rel->r_offset
15481 + input_section->output_section->vma
15482 + input_section->output_offset);
15483 if (relocation - from + (1ULL << 33) < 1ULL << 34
15484 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15485 {
15486 offset = rel->r_offset;
15487 pinsn = bfd_get_32 (input_bfd, contents + offset);
15488 pinsn <<= 32;
15489 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15490 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15491 == ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
15492 {
15493 /* Replace with paddi. */
15494 pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
15495 r_type = R_PPC64_PCREL34;
15496 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15497 bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
15498 bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
15499 goto pcrelopt;
15500 }
15501 }
15502 break;
15503
15504 case R_PPC64_PCREL34:
15505 if (SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15506 {
15507 offset = rel->r_offset;
15508 pinsn = bfd_get_32 (input_bfd, contents + offset);
15509 pinsn <<= 32;
15510 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15511 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15512 == ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
15513 | (14ULL << 26) /* paddi */))
15514 {
15515 pcrelopt:
15516 if (rel + 1 < relend
15517 && rel[1].r_offset == offset
15518 && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT))
15519 {
15520 bfd_vma off2 = rel[1].r_addend;
15521 if (off2 == 0)
15522 /* zero means next insn. */
15523 off2 = 8;
15524 off2 += offset;
15525 if (off2 + 4 <= input_section->size)
15526 {
15527 uint64_t pinsn2;
dd9b12c2 15528 bfd_signed_vma addend_off;
4a421c53
AM
15529 pinsn2 = bfd_get_32 (input_bfd, contents + off2);
15530 pinsn2 <<= 32;
15531 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
77486630
AM
15532 {
15533 if (off2 + 8 > input_section->size)
15534 break;
15535 pinsn2 |= bfd_get_32 (input_bfd,
15536 contents + off2 + 4);
15537 }
dd9b12c2 15538 if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
4a421c53 15539 {
dd9b12c2
AM
15540 addend += addend_off;
15541 rel->r_addend = addend;
4a421c53
AM
15542 bfd_put_32 (input_bfd, pinsn >> 32,
15543 contents + offset);
15544 bfd_put_32 (input_bfd, pinsn,
15545 contents + offset + 4);
15546 bfd_put_32 (input_bfd, pinsn2 >> 32,
15547 contents + off2);
77486630
AM
15548 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
15549 bfd_put_32 (input_bfd, pinsn2,
15550 contents + off2 + 4);
4a421c53
AM
15551 }
15552 }
15553 }
15554 }
15555 }
15556 break;
65f38f15 15557 }
5bd4f169 15558
411e1bfb 15559 tls_type = 0;
23cedd1d 15560 save_unresolved_reloc = unresolved_reloc;
65f38f15
AM
15561 switch (r_type)
15562 {
15563 default:
cf97bcb0
AM
15564 /* xgettext:c-format */
15565 _bfd_error_handler (_("%pB: %s unsupported"),
15566 input_bfd, ppc64_elf_howto_table[r_type]->name);
5bd4f169 15567
65f38f15 15568 bfd_set_error (bfd_error_bad_value);
b34976b6 15569 ret = FALSE;
c316a17c 15570 goto copy_reloc;
5bd4f169 15571
65f38f15 15572 case R_PPC64_NONE:
411e1bfb 15573 case R_PPC64_TLS:
727fc41e
AM
15574 case R_PPC64_TLSGD:
15575 case R_PPC64_TLSLD:
3b421ab3 15576 case R_PPC64_TOCSAVE:
04c9666a
AM
15577 case R_PPC64_GNU_VTINHERIT:
15578 case R_PPC64_GNU_VTENTRY:
006589cf 15579 case R_PPC64_ENTRY:
4a421c53 15580 case R_PPC64_PCREL_OPT:
c316a17c 15581 goto copy_reloc;
5bd4f169
AM
15582
15583 /* GOT16 relocations. Like an ADDR16 using the symbol's
15584 address in the GOT as relocation value instead of the
411e1bfb 15585 symbol's value itself. Also, create a GOT entry for the
5bd4f169 15586 symbol and put the symbol value there. */
411e1bfb
AM
15587 case R_PPC64_GOT_TLSGD16:
15588 case R_PPC64_GOT_TLSGD16_LO:
15589 case R_PPC64_GOT_TLSGD16_HI:
15590 case R_PPC64_GOT_TLSGD16_HA:
c213164a 15591 case R_PPC64_GOT_TLSGD34:
951fd09b 15592 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
15593 goto dogot;
15594
15595 case R_PPC64_GOT_TLSLD16:
15596 case R_PPC64_GOT_TLSLD16_LO:
15597 case R_PPC64_GOT_TLSLD16_HI:
15598 case R_PPC64_GOT_TLSLD16_HA:
c213164a 15599 case R_PPC64_GOT_TLSLD34:
951fd09b 15600 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
15601 goto dogot;
15602
15603 case R_PPC64_GOT_TPREL16_DS:
15604 case R_PPC64_GOT_TPREL16_LO_DS:
15605 case R_PPC64_GOT_TPREL16_HI:
15606 case R_PPC64_GOT_TPREL16_HA:
c213164a 15607 case R_PPC64_GOT_TPREL34:
411e1bfb
AM
15608 tls_type = TLS_TLS | TLS_TPREL;
15609 goto dogot;
15610
15611 case R_PPC64_GOT_DTPREL16_DS:
15612 case R_PPC64_GOT_DTPREL16_LO_DS:
15613 case R_PPC64_GOT_DTPREL16_HI:
15614 case R_PPC64_GOT_DTPREL16_HA:
c213164a 15615 case R_PPC64_GOT_DTPREL34:
411e1bfb
AM
15616 tls_type = TLS_TLS | TLS_DTPREL;
15617 goto dogot;
15618
65f38f15
AM
15619 case R_PPC64_GOT16:
15620 case R_PPC64_GOT16_LO:
15621 case R_PPC64_GOT16_HI:
15622 case R_PPC64_GOT16_HA:
15623 case R_PPC64_GOT16_DS:
15624 case R_PPC64_GOT16_LO_DS:
5663e321 15625 case R_PPC64_GOT_PCREL34:
411e1bfb 15626 dogot:
5bd4f169
AM
15627 {
15628 /* Relocation is to the entry for this symbol in the global
15629 offset table. */
e717da7e 15630 asection *got;
d881513a 15631 bfd_vma *offp;
5bd4f169 15632 bfd_vma off;
d881513a 15633 unsigned long indx = 0;
927be08e 15634 struct got_entry *ent;
65f38f15 15635
d881513a 15636 if (tls_type == (TLS_TLS | TLS_LD)
f749f26e 15637 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
927be08e 15638 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 15639 else
5bd4f169 15640 {
d881513a
AM
15641 if (h != NULL)
15642 {
f0158f44
AM
15643 if (!htab->elf.dynamic_sections_created
15644 || h->elf.dynindx == -1
15645 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
21d68fcd 15646 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
d881513a
AM
15647 /* This is actually a static link, or it is a
15648 -Bsymbolic link and the symbol is defined
15649 locally, or the symbol was forced to be local
15650 because of a version file. */
15651 ;
15652 else
15653 {
039b3fef 15654 indx = h->elf.dynindx;
d881513a
AM
15655 unresolved_reloc = FALSE;
15656 }
039b3fef 15657 ent = h->elf.got.glist;
d881513a 15658 }
411e1bfb 15659 else
5bd4f169 15660 {
d881513a
AM
15661 if (local_got_ents == NULL)
15662 abort ();
15663 ent = local_got_ents[r_symndx];
5bd4f169 15664 }
d881513a
AM
15665
15666 for (; ent != NULL; ent = ent->next)
133a1f60 15667 if (ent->addend == orig_rel.r_addend
e717da7e 15668 && ent->owner == input_bfd
d881513a
AM
15669 && ent->tls_type == tls_type)
15670 break;
5bd4f169 15671 }
411e1bfb 15672
927be08e
AM
15673 if (ent == NULL)
15674 abort ();
15675 if (ent->is_indirect)
15676 ent = ent->got.ent;
15677 offp = &ent->got.offset;
15678 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
15679 if (got == NULL)
15680 abort ();
15681
411e1bfb
AM
15682 /* The offset must always be a multiple of 8. We use the
15683 least significant bit to record whether we have already
15684 processed this entry. */
d881513a 15685 off = *offp;
411e1bfb
AM
15686 if ((off & 1) != 0)
15687 off &= ~1;
5bd4f169
AM
15688 else
15689 {
411e1bfb
AM
15690 /* Generate relocs for the dynamic linker, except in
15691 the case of TLSLD where we'll use one entry per
15692 module. */
25f23106
AM
15693 asection *relgot;
15694 bfd_boolean ifunc;
e717da7e 15695
d881513a 15696 *offp = off | 1;
25f23106
AM
15697 relgot = NULL;
15698 ifunc = (h != NULL
15699 ? h->elf.type == STT_GNU_IFUNC
15700 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 15701 if (ifunc)
82e66161
AM
15702 {
15703 relgot = htab->elf.irelplt;
15704 if (indx == 0)
15705 htab->local_ifunc_resolver = 1;
15706 else if (is_static_defined (&h->elf))
15707 htab->maybe_local_ifunc_resolver = 1;
15708 }
f0158f44
AM
15709 else if (indx != 0
15710 || (bfd_link_pic (info)
15711 && (h == NULL
f749f26e
AM
15712 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
15713 && !(tls_type != 0
f15d0b54
AM
15714 && bfd_link_executable (info)
15715 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
19e08130 15716 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 15717 if (relgot != NULL)
5bd4f169 15718 {
e717da7e
AM
15719 outrel.r_offset = (got->output_section->vma
15720 + got->output_offset
411e1bfb 15721 + off);
133a1f60 15722 outrel.r_addend = orig_rel.r_addend;
d881513a 15723 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 15724 {
411e1bfb 15725 outrel.r_addend = 0;
e515b051 15726 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
15727 if (tls_type == (TLS_TLS | TLS_GD))
15728 {
e717da7e
AM
15729 loc = relgot->contents;
15730 loc += (relgot->reloc_count++
d881513a
AM
15731 * sizeof (Elf64_External_Rela));
15732 bfd_elf64_swap_reloca_out (output_bfd,
15733 &outrel, loc);
e515b051 15734 outrel.r_offset += 8;
133a1f60 15735 outrel.r_addend = orig_rel.r_addend;
d881513a
AM
15736 outrel.r_info
15737 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 15738 }
411e1bfb 15739 }
951fd09b 15740 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 15741 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 15742 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 15743 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
15744 else if (indx != 0)
15745 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
15746 else
81407a69 15747 {
25f23106
AM
15748 if (ifunc)
15749 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15750 else
15751 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
15752
15753 /* Write the .got section contents for the sake
15754 of prelink. */
e717da7e 15755 loc = got->contents + off;
23fbd6fa
JJ
15756 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
15757 loc);
81407a69 15758 }
81407a69
AM
15759
15760 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
15761 {
15762 outrel.r_addend += relocation;
15763 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
989f9879
AM
15764 {
15765 if (htab->elf.tls_sec == NULL)
15766 outrel.r_addend = 0;
15767 else
15768 outrel.r_addend -= htab->elf.tls_sec->vma;
15769 }
e515b051 15770 }
e717da7e
AM
15771 loc = relgot->contents;
15772 loc += (relgot->reloc_count++
411e1bfb
AM
15773 * sizeof (Elf64_External_Rela));
15774 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
15775 }
15776
ad8e1ba5 15777 /* Init the .got section contents here if we're not
81407a69 15778 emitting a reloc. */
d881513a 15779 else
411e1bfb 15780 {
133a1f60 15781 relocation += orig_rel.r_addend;
f0158f44 15782 if (tls_type != 0)
411e1bfb 15783 {
989f9879
AM
15784 if (htab->elf.tls_sec == NULL)
15785 relocation = 0;
15786 else
15787 {
f0158f44
AM
15788 if (tls_type & TLS_LD)
15789 relocation = 0;
15790 else
15791 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
676ee2b5 15792 if (tls_type & TLS_TPREL)
989f9879
AM
15793 relocation += DTP_OFFSET - TP_OFFSET;
15794 }
5bd4f169 15795
f0158f44 15796 if (tls_type & (TLS_GD | TLS_LD))
7b609f53
AM
15797 {
15798 bfd_put_64 (output_bfd, relocation,
e717da7e 15799 got->contents + off + 8);
676ee2b5 15800 relocation = 1;
7b609f53 15801 }
411e1bfb
AM
15802 }
15803 bfd_put_64 (output_bfd, relocation,
e717da7e 15804 got->contents + off);
5bd4f169
AM
15805 }
15806 }
15807
65f38f15
AM
15808 if (off >= (bfd_vma) -2)
15809 abort ();
15810
bf102f86 15811 relocation = got->output_section->vma + got->output_offset + off;
133a1f60 15812 addend = 0;
c213164a
AM
15813 if (!(r_type == R_PPC64_GOT_PCREL34
15814 || r_type == R_PPC64_GOT_TLSGD34
15815 || r_type == R_PPC64_GOT_TLSLD34
15816 || r_type == R_PPC64_GOT_TPREL34
15817 || r_type == R_PPC64_GOT_DTPREL34))
5663e321 15818 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
5bd4f169 15819 }
65f38f15
AM
15820 break;
15821
15822 case R_PPC64_PLT16_HA:
15823 case R_PPC64_PLT16_HI:
15824 case R_PPC64_PLT16_LO:
08be3224 15825 case R_PPC64_PLT16_LO_DS:
5663e321
AM
15826 case R_PPC64_PLT_PCREL34:
15827 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
15828 case R_PPC64_PLT32:
15829 case R_PPC64_PLT64:
23cedd1d 15830 case R_PPC64_PLTSEQ:
5663e321 15831 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d 15832 case R_PPC64_PLTCALL:
5663e321 15833 case R_PPC64_PLTCALL_NOTOC:
65f38f15
AM
15834 /* Relocation is to the entry for this symbol in the
15835 procedure linkage table. */
23cedd1d 15836 unresolved_reloc = TRUE;
cbf95972
AM
15837 {
15838 struct plt_entry **plt_list = NULL;
15839 if (h != NULL)
15840 plt_list = &h->elf.plt.plist;
15841 else if (local_got_ents != NULL)
15842 {
15843 struct plt_entry **local_plt = (struct plt_entry **)
15844 (local_got_ents + symtab_hdr->sh_info);
2d7ad24e 15845 plt_list = local_plt + r_symndx;
cbf95972
AM
15846 }
15847 if (plt_list)
15848 {
15849 struct plt_entry *ent;
65f38f15 15850
cbf95972
AM
15851 for (ent = *plt_list; ent != NULL; ent = ent->next)
15852 if (ent->plt.offset != (bfd_vma) -1
133a1f60 15853 && ent->addend == orig_rel.r_addend)
cbf95972
AM
15854 {
15855 asection *plt;
08be3224 15856 bfd_vma got;
cbf95972
AM
15857
15858 plt = htab->elf.splt;
15859 if (!htab->elf.dynamic_sections_created
15860 || h == NULL
15861 || h->elf.dynindx == -1)
2d7ad24e
AM
15862 {
15863 if (h != NULL
15864 ? h->elf.type == STT_GNU_IFUNC
15865 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15866 plt = htab->elf.iplt;
15867 else
15868 plt = htab->pltlocal;
15869 }
15870 relocation = (plt->output_section->vma
15871 + plt->output_offset
15872 + ent->plt.offset);
08be3224 15873 if (r_type == R_PPC64_PLT16_HA
2cdcc330
AM
15874 || r_type == R_PPC64_PLT16_HI
15875 || r_type == R_PPC64_PLT16_LO
15876 || r_type == R_PPC64_PLT16_LO_DS)
08be3224
AM
15877 {
15878 got = (elf_gp (output_bfd)
15879 + htab->sec_info[input_section->id].toc_off);
15880 relocation -= got;
15881 }
133a1f60 15882 addend = 0;
cbf95972
AM
15883 unresolved_reloc = FALSE;
15884 break;
15885 }
15886 }
15887 }
65f38f15 15888 break;
5bd4f169 15889
0b13192e
AM
15890 case R_PPC64_TOC:
15891 /* Relocation value is TOC base. */
15892 relocation = TOCstart;
cf35638d 15893 if (r_symndx == STN_UNDEF)
6f20ed8a 15894 relocation += htab->sec_info[input_section->id].toc_off;
8517fae7
AM
15895 else if (unresolved_reloc)
15896 ;
6f20ed8a
AM
15897 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
15898 relocation += htab->sec_info[sec->id].toc_off;
0b13192e
AM
15899 else
15900 unresolved_reloc = TRUE;
ab96bf03 15901 goto dodyn;
0b13192e 15902
5bd4f169
AM
15903 /* TOC16 relocs. We want the offset relative to the TOC base,
15904 which is the address of the start of the TOC plus 0x8000.
15905 The TOC consists of sections .got, .toc, .tocbss, and .plt,
15906 in this order. */
65f38f15
AM
15907 case R_PPC64_TOC16:
15908 case R_PPC64_TOC16_LO:
15909 case R_PPC64_TOC16_HI:
15910 case R_PPC64_TOC16_DS:
15911 case R_PPC64_TOC16_LO_DS:
15912 case R_PPC64_TOC16_HA:
6f20ed8a 15913 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
1bdd8fac
AM
15914 if (h != NULL)
15915 goto dodyn;
5bd4f169
AM
15916 break;
15917
15918 /* Relocate against the beginning of the section. */
65f38f15
AM
15919 case R_PPC64_SECTOFF:
15920 case R_PPC64_SECTOFF_LO:
15921 case R_PPC64_SECTOFF_HI:
15922 case R_PPC64_SECTOFF_DS:
15923 case R_PPC64_SECTOFF_LO_DS:
15924 case R_PPC64_SECTOFF_HA:
4ce794b7 15925 if (sec != NULL)
65f38f15 15926 addend -= sec->output_section->vma;
5bd4f169
AM
15927 break;
15928
25f23106
AM
15929 case R_PPC64_REL16:
15930 case R_PPC64_REL16_LO:
15931 case R_PPC64_REL16_HI:
15932 case R_PPC64_REL16_HA:
4a969973
AM
15933 case R_PPC64_REL16_HIGH:
15934 case R_PPC64_REL16_HIGHA:
15935 case R_PPC64_REL16_HIGHER:
15936 case R_PPC64_REL16_HIGHERA:
15937 case R_PPC64_REL16_HIGHEST:
15938 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
15939 case R_PPC64_REL16_HIGHER34:
15940 case R_PPC64_REL16_HIGHERA34:
15941 case R_PPC64_REL16_HIGHEST34:
15942 case R_PPC64_REL16_HIGHESTA34:
a680de9a 15943 case R_PPC64_REL16DX_HA:
721956f4
AM
15944 case R_PPC64_REL14:
15945 case R_PPC64_REL14_BRNTAKEN:
15946 case R_PPC64_REL14_BRTAKEN:
5d1634d7 15947 case R_PPC64_REL24:
05d0e962 15948 case R_PPC64_REL24_NOTOC:
5663e321
AM
15949 case R_PPC64_PCREL34:
15950 case R_PPC64_PCREL28:
5d1634d7
AM
15951 break;
15952
411e1bfb
AM
15953 case R_PPC64_TPREL16:
15954 case R_PPC64_TPREL16_LO:
15955 case R_PPC64_TPREL16_HI:
15956 case R_PPC64_TPREL16_HA:
15957 case R_PPC64_TPREL16_DS:
15958 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
15959 case R_PPC64_TPREL16_HIGH:
15960 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
15961 case R_PPC64_TPREL16_HIGHER:
15962 case R_PPC64_TPREL16_HIGHERA:
15963 case R_PPC64_TPREL16_HIGHEST:
15964 case R_PPC64_TPREL16_HIGHESTA:
c213164a 15965 case R_PPC64_TPREL34:
766bc656
AM
15966 if (h != NULL
15967 && h->elf.root.type == bfd_link_hash_undefweak
15968 && h->elf.dynindx == -1)
15969 {
15970 /* Make this relocation against an undefined weak symbol
15971 resolve to zero. This is really just a tweak, since
15972 code using weak externs ought to check that they are
15973 defined before using them. */
15974 bfd_byte *p = contents + rel->r_offset - d_offset;
15975
95f0d0d2 15976 insn = bfd_get_32 (input_bfd, p);
766bc656
AM
15977 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
15978 if (insn != 0)
95f0d0d2 15979 bfd_put_32 (input_bfd, insn, p);
766bc656
AM
15980 break;
15981 }
989f9879
AM
15982 if (htab->elf.tls_sec != NULL)
15983 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7c8bbca5
AM
15984 /* The TPREL16 relocs shouldn't really be used in shared
15985 libs or with non-local symbols as that will result in
15986 DT_TEXTREL being set, but support them anyway. */
15987 goto dodyn;
411e1bfb
AM
15988
15989 case R_PPC64_DTPREL16:
15990 case R_PPC64_DTPREL16_LO:
15991 case R_PPC64_DTPREL16_HI:
15992 case R_PPC64_DTPREL16_HA:
15993 case R_PPC64_DTPREL16_DS:
15994 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
15995 case R_PPC64_DTPREL16_HIGH:
15996 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
15997 case R_PPC64_DTPREL16_HIGHER:
15998 case R_PPC64_DTPREL16_HIGHERA:
15999 case R_PPC64_DTPREL16_HIGHEST:
16000 case R_PPC64_DTPREL16_HIGHESTA:
c213164a 16001 case R_PPC64_DTPREL34:
989f9879
AM
16002 if (htab->elf.tls_sec != NULL)
16003 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
16004 break;
16005
45965137
AM
16006 case R_PPC64_ADDR64_LOCAL:
16007 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
16008 ? h->elf.other
16009 : sym->st_other);
16010 break;
16011
e515b051
AM
16012 case R_PPC64_DTPMOD64:
16013 relocation = 1;
16014 addend = 0;
16015 goto dodyn;
16016
411e1bfb 16017 case R_PPC64_TPREL64:
989f9879
AM
16018 if (htab->elf.tls_sec != NULL)
16019 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
16020 goto dodyn;
16021
16022 case R_PPC64_DTPREL64:
989f9879
AM
16023 if (htab->elf.tls_sec != NULL)
16024 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
1a0670f3 16025 /* Fall through. */
411e1bfb 16026
65f38f15
AM
16027 /* Relocations that may need to be propagated if this is a
16028 dynamic object. */
04c9666a 16029 case R_PPC64_REL30:
65f38f15
AM
16030 case R_PPC64_REL32:
16031 case R_PPC64_REL64:
16032 case R_PPC64_ADDR14:
16033 case R_PPC64_ADDR14_BRNTAKEN:
16034 case R_PPC64_ADDR14_BRTAKEN:
16035 case R_PPC64_ADDR16:
16036 case R_PPC64_ADDR16_DS:
16037 case R_PPC64_ADDR16_HA:
16038 case R_PPC64_ADDR16_HI:
f9c6b907
AM
16039 case R_PPC64_ADDR16_HIGH:
16040 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16041 case R_PPC64_ADDR16_HIGHER:
16042 case R_PPC64_ADDR16_HIGHERA:
16043 case R_PPC64_ADDR16_HIGHEST:
16044 case R_PPC64_ADDR16_HIGHESTA:
16045 case R_PPC64_ADDR16_LO:
16046 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
16047 case R_PPC64_ADDR16_HIGHER34:
16048 case R_PPC64_ADDR16_HIGHERA34:
16049 case R_PPC64_ADDR16_HIGHEST34:
16050 case R_PPC64_ADDR16_HIGHESTA34:
65f38f15 16051 case R_PPC64_ADDR24:
65f38f15
AM
16052 case R_PPC64_ADDR32:
16053 case R_PPC64_ADDR64:
16054 case R_PPC64_UADDR16:
16055 case R_PPC64_UADDR32:
16056 case R_PPC64_UADDR64:
5663e321
AM
16057 case R_PPC64_D34:
16058 case R_PPC64_D34_LO:
16059 case R_PPC64_D34_HI30:
16060 case R_PPC64_D34_HA30:
16061 case R_PPC64_D28:
411e1bfb 16062 dodyn:
5d1634d7 16063 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
16064 break;
16065
41bd81ab
AM
16066 if (NO_OPD_RELOCS && is_opd)
16067 break;
16068
8a9e8e72 16069 if (bfd_link_pic (info)
b1b07054
AM
16070 ? ((h == NULL
16071 || h->dyn_relocs != NULL)
16072 && ((h != NULL && pc_dynrelocs (h))
16073 || must_be_dyn_reloc (info, r_type)))
8a9e8e72
AM
16074 : (h != NULL
16075 ? h->dyn_relocs != NULL
d311bc8b 16076 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
65f38f15 16077 {
b34976b6 16078 bfd_boolean skip, relocate;
65f38f15 16079 asection *sreloc;
1cf1f670 16080 bfd_vma out_off;
82e66161 16081 long indx = 0;
65f38f15
AM
16082
16083 /* When generating a dynamic object, these relocations
16084 are copied into the output file to be resolved at run
16085 time. */
16086
b34976b6
AM
16087 skip = FALSE;
16088 relocate = FALSE;
65f38f15 16089
1cf1f670
AM
16090 out_off = _bfd_elf_section_offset (output_bfd, info,
16091 input_section, rel->r_offset);
16092 if (out_off == (bfd_vma) -1)
b34976b6 16093 skip = TRUE;
1cf1f670 16094 else if (out_off == (bfd_vma) -2)
b34976b6 16095 skip = TRUE, relocate = TRUE;
1cf1f670
AM
16096 out_off += (input_section->output_section->vma
16097 + input_section->output_offset);
16098 outrel.r_offset = out_off;
411e1bfb 16099 outrel.r_addend = rel->r_addend;
65f38f15 16100
1cf1f670
AM
16101 /* Optimize unaligned reloc use. */
16102 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
16103 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
16104 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
16105 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
16106 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
16107 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
16108 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
16109 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
16110 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
16111
65f38f15 16112 if (skip)
0bb2d96a 16113 memset (&outrel, 0, sizeof outrel);
afe397ea 16114 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
16115 && !is_opd
16116 && r_type != R_PPC64_TOC)
14acf4dc 16117 {
82e66161
AM
16118 indx = h->elf.dynindx;
16119 BFD_ASSERT (indx != -1);
16120 outrel.r_info = ELF64_R_INFO (indx, r_type);
14acf4dc 16121 }
65f38f15
AM
16122 else
16123 {
41bd81ab
AM
16124 /* This symbol is local, or marked to become local,
16125 or this is an opd section reloc which must point
16126 at a local function. */
65f38f15 16127 outrel.r_addend += relocation;
e86ce104 16128 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 16129 {
3fad3c7c 16130 if (is_opd && h != NULL)
afbe61cf
AM
16131 {
16132 /* Lie about opd entries. This case occurs
16133 when building shared libraries and we
16134 reference a function in another shared
3fad3c7c
AM
16135 lib. The same thing happens for a weak
16136 definition in an application that's
16137 overridden by a strong definition in a
16138 shared lib. (I believe this is a generic
16139 bug in binutils handling of weak syms.)
16140 In these cases we won't use the opd
1e2f5b6e 16141 entry in this lib. */
b34976b6 16142 unresolved_reloc = FALSE;
afbe61cf 16143 }
25f23106
AM
16144 if (!is_opd
16145 && r_type == R_PPC64_ADDR64
16146 && (h != NULL
16147 ? h->elf.type == STT_GNU_IFUNC
16148 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
16149 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
16150 else
16151 {
16152 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 16153
25f23106
AM
16154 /* We need to relocate .opd contents for ld.so.
16155 Prelink also wants simple and consistent rules
16156 for relocs. This make all RELATIVE relocs have
16157 *r_offset equal to r_addend. */
16158 relocate = TRUE;
16159 }
65f38f15
AM
16160 }
16161 else
16162 {
25f23106
AM
16163 if (h != NULL
16164 ? h->elf.type == STT_GNU_IFUNC
16165 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
16166 {
25f53a85 16167 info->callbacks->einfo
695344c0 16168 /* xgettext:c-format */
174d0a74 16169 (_("%H: %s for indirect "
c1c8c1ef 16170 "function `%pT' unsupported\n"),
25f53a85 16171 input_bfd, input_section, rel->r_offset,
25f23106
AM
16172 ppc64_elf_howto_table[r_type]->name,
16173 sym_name);
16174 ret = FALSE;
16175 }
cf35638d 16176 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
16177 ;
16178 else if (sec == NULL || sec->owner == NULL)
16179 {
16180 bfd_set_error (bfd_error_bad_value);
b34976b6 16181 return FALSE;
65f38f15
AM
16182 }
16183 else
16184 {
f26a3287 16185 asection *osec = sec->output_section;
65f38f15 16186
f26a3287
AM
16187 if ((osec->flags & SEC_THREAD_LOCAL) != 0)
16188 {
16189 /* TLS symbol values are relative to the
16190 TLS segment. Dynamic relocations for
16191 local TLS symbols therefore can't be
16192 reduced to a relocation against their
16193 section symbol because it holds the
16194 address of the section, not a value
16195 relative to the TLS segment. We could
16196 change the .tdata dynamic section symbol
16197 to be zero value but STN_UNDEF works
16198 and is used elsewhere, eg. for TPREL64
16199 GOT relocs against local TLS symbols. */
16200 osec = htab->elf.tls_sec;
16201 indx = 0;
16202 }
16203 else
74541ad4 16204 {
74541ad4 16205 indx = elf_section_data (osec)->dynindx;
f26a3287
AM
16206 if (indx == 0)
16207 {
16208 if ((osec->flags & SEC_READONLY) == 0
16209 && htab->elf.data_index_section != NULL)
16210 osec = htab->elf.data_index_section;
16211 else
16212 osec = htab->elf.text_index_section;
16213 indx = elf_section_data (osec)->dynindx;
16214 }
16215 BFD_ASSERT (indx != 0);
74541ad4 16216 }
74541ad4 16217
65f38f15
AM
16218 /* We are turning this relocation into one
16219 against a section symbol, so subtract out
16220 the output section's address but not the
16221 offset of the input section in the output
16222 section. */
16223 outrel.r_addend -= osec->vma;
16224 }
16225
16226 outrel.r_info = ELF64_R_INFO (indx, r_type);
16227 }
16228 }
16229
16230 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
16231 if (h != NULL
16232 ? h->elf.type == STT_GNU_IFUNC
16233 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
82e66161
AM
16234 {
16235 sreloc = htab->elf.irelplt;
16236 if (indx == 0)
16237 htab->local_ifunc_resolver = 1;
16238 else if (is_static_defined (&h->elf))
16239 htab->maybe_local_ifunc_resolver = 1;
16240 }
65f38f15
AM
16241 if (sreloc == NULL)
16242 abort ();
16243
dfbb6ac9
AM
16244 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
16245 >= sreloc->size)
16246 abort ();
947216bf
AM
16247 loc = sreloc->contents;
16248 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
16249 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
16250
e59a1001
AM
16251 if (!warned_dynamic
16252 && !ppc64_glibc_dynamic_reloc (ELF64_R_TYPE (outrel.r_info)))
16253 {
16254 info->callbacks->einfo
16255 /* xgettext:c-format */
16256 (_("%X%P: %pB: %s against %pT "
16257 "is not supported by glibc as a dynamic relocation\n"),
16258 input_bfd,
16259 ppc64_elf_howto_table[ELF64_R_TYPE (outrel.r_info)]->name,
16260 sym_name);
16261 warned_dynamic = TRUE;
16262 }
16263
65f38f15
AM
16264 /* If this reloc is against an external symbol, it will
16265 be computed at runtime, so there's no need to do
81407a69
AM
16266 anything now. However, for the sake of prelink ensure
16267 that the section contents are a known value. */
2cdcc330 16268 if (!relocate)
81407a69
AM
16269 {
16270 unresolved_reloc = FALSE;
16271 /* The value chosen here is quite arbitrary as ld.so
16272 ignores section contents except for the special
16273 case of .opd where the contents might be accessed
16274 before relocation. Choose zero, as that won't
16275 cause reloc overflow. */
16276 relocation = 0;
16277 addend = 0;
16278 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
16279 to improve backward compatibility with older
16280 versions of ld. */
16281 if (r_type == R_PPC64_ADDR64)
16282 addend = outrel.r_addend;
16283 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 16284 else if (ppc64_elf_howto_table[r_type]->pc_relative)
f0158f44 16285 addend = outrel.r_offset;
81407a69 16286 }
65f38f15 16287 }
5bd4f169
AM
16288 break;
16289
65f38f15
AM
16290 case R_PPC64_COPY:
16291 case R_PPC64_GLOB_DAT:
16292 case R_PPC64_JMP_SLOT:
25f23106 16293 case R_PPC64_JMP_IREL:
65f38f15
AM
16294 case R_PPC64_RELATIVE:
16295 /* We shouldn't ever see these dynamic relocs in relocatable
16296 files. */
ae9a127f 16297 /* Fall through. */
65f38f15
AM
16298
16299 case R_PPC64_PLTGOT16:
16300 case R_PPC64_PLTGOT16_DS:
16301 case R_PPC64_PLTGOT16_HA:
16302 case R_PPC64_PLTGOT16_HI:
16303 case R_PPC64_PLTGOT16_LO:
16304 case R_PPC64_PLTGOT16_LO_DS:
16305 case R_PPC64_PLTREL32:
16306 case R_PPC64_PLTREL64:
16307 /* These ones haven't been implemented yet. */
16308
25f53a85 16309 info->callbacks->einfo
695344c0 16310 /* xgettext:c-format */
c1c8c1ef 16311 (_("%P: %pB: %s is not supported for `%pT'\n"),
d003868e 16312 input_bfd,
4ce794b7 16313 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
16314
16315 bfd_set_error (bfd_error_invalid_operation);
b34976b6 16316 ret = FALSE;
c316a17c 16317 goto copy_reloc;
65f38f15 16318 }
5bd4f169 16319
67f0cbdb
AM
16320 /* Multi-instruction sequences that access the TOC can be
16321 optimized, eg. addis ra,r2,0; addi rb,ra,x;
07d6d2b8 16322 to nop; addi rb,r2,x; */
67f0cbdb
AM
16323 switch (r_type)
16324 {
16325 default:
16326 break;
16327
16328 case R_PPC64_GOT_TLSLD16_HI:
16329 case R_PPC64_GOT_TLSGD16_HI:
16330 case R_PPC64_GOT_TPREL16_HI:
16331 case R_PPC64_GOT_DTPREL16_HI:
16332 case R_PPC64_GOT16_HI:
16333 case R_PPC64_TOC16_HI:
16334 /* These relocs would only be useful if building up an
16335 offset to later add to r2, perhaps in an indexed
16336 addressing mode instruction. Don't try to optimize.
16337 Unfortunately, the possibility of someone building up an
16338 offset like this or even with the HA relocs, means that
16339 we need to check the high insn when optimizing the low
16340 insn. */
16341 break;
16342
5663e321
AM
16343 case R_PPC64_PLTCALL_NOTOC:
16344 if (!unresolved_reloc)
16345 htab->notoc_plt = 1;
16346 /* Fall through. */
23cedd1d
AM
16347 case R_PPC64_PLTCALL:
16348 if (unresolved_reloc)
16349 {
16350 /* No plt entry. Make this into a direct call. */
16351 bfd_byte *p = contents + rel->r_offset;
16352 insn = bfd_get_32 (input_bfd, p);
16353 insn &= 1;
16354 bfd_put_32 (input_bfd, B_DOT | insn, p);
5663e321
AM
16355 if (r_type == R_PPC64_PLTCALL)
16356 bfd_put_32 (input_bfd, NOP, p + 4);
23cedd1d
AM
16357 unresolved_reloc = save_unresolved_reloc;
16358 r_type = R_PPC64_REL24;
16359 }
16360 break;
16361
5663e321 16362 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d
AM
16363 case R_PPC64_PLTSEQ:
16364 if (unresolved_reloc)
16365 {
16366 unresolved_reloc = FALSE;
16367 goto nop_it;
16368 }
16369 break;
16370
5663e321
AM
16371 case R_PPC64_PLT_PCREL34_NOTOC:
16372 if (!unresolved_reloc)
16373 htab->notoc_plt = 1;
16374 /* Fall through. */
16375 case R_PPC64_PLT_PCREL34:
16376 if (unresolved_reloc)
16377 {
16378 bfd_byte *p = contents + rel->r_offset;
16379 bfd_put_32 (input_bfd, PNOP >> 32, p);
16380 bfd_put_32 (input_bfd, PNOP, p + 4);
16381 unresolved_reloc = FALSE;
16382 goto copy_reloc;
16383 }
16384 break;
16385
23cedd1d
AM
16386 case R_PPC64_PLT16_HA:
16387 if (unresolved_reloc)
16388 {
16389 unresolved_reloc = FALSE;
16390 goto nop_it;
16391 }
16392 /* Fall through. */
67f0cbdb
AM
16393 case R_PPC64_GOT_TLSLD16_HA:
16394 case R_PPC64_GOT_TLSGD16_HA:
16395 case R_PPC64_GOT_TPREL16_HA:
16396 case R_PPC64_GOT_DTPREL16_HA:
16397 case R_PPC64_GOT16_HA:
16398 case R_PPC64_TOC16_HA:
98528052 16399 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16400 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052 16401 {
23cedd1d
AM
16402 bfd_byte *p;
16403 nop_it:
16404 p = contents + (rel->r_offset & ~3);
98528052 16405 bfd_put_32 (input_bfd, NOP, p);
d830549d 16406 goto copy_reloc;
98528052 16407 }
67f0cbdb
AM
16408 break;
16409
23cedd1d
AM
16410 case R_PPC64_PLT16_LO:
16411 case R_PPC64_PLT16_LO_DS:
16412 if (unresolved_reloc)
16413 {
16414 unresolved_reloc = FALSE;
16415 goto nop_it;
16416 }
16417 /* Fall through. */
67f0cbdb
AM
16418 case R_PPC64_GOT_TLSLD16_LO:
16419 case R_PPC64_GOT_TLSGD16_LO:
16420 case R_PPC64_GOT_TPREL16_LO_DS:
16421 case R_PPC64_GOT_DTPREL16_LO_DS:
16422 case R_PPC64_GOT16_LO:
16423 case R_PPC64_GOT16_LO_DS:
16424 case R_PPC64_TOC16_LO:
16425 case R_PPC64_TOC16_LO_DS:
98528052 16426 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16427 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
16428 {
16429 bfd_byte *p = contents + (rel->r_offset & ~3);
16430 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16431 if ((insn & (0x3fu << 26)) == 12u << 26 /* addic */)
560c8763
AM
16432 {
16433 /* Transform addic to addi when we change reg. */
2365f8d7 16434 insn &= ~((0x3fu << 26) | (0x1f << 16));
560c8763
AM
16435 insn |= (14u << 26) | (2 << 16);
16436 }
16437 else
67f0cbdb 16438 {
98528052
AM
16439 insn &= ~(0x1f << 16);
16440 insn |= 2 << 16;
67f0cbdb 16441 }
560c8763 16442 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
16443 }
16444 break;
9a23f96e
AM
16445
16446 case R_PPC64_TPREL16_HA:
16447 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16448 {
16449 bfd_byte *p = contents + (rel->r_offset & ~3);
16450 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16451 if ((insn & ((0x3fu << 26) | 0x1f << 16))
9a23f96e
AM
16452 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */)
16453 /* xgettext:c-format */
16454 info->callbacks->minfo
16455 (_("%H: warning: %s unexpected insn %#x.\n"),
d830549d
AM
16456 input_bfd, input_section, rel->r_offset,
16457 ppc64_elf_howto_table[r_type]->name, insn);
9a23f96e 16458 else
d830549d
AM
16459 {
16460 bfd_put_32 (input_bfd, NOP, p);
16461 goto copy_reloc;
16462 }
9a23f96e
AM
16463 }
16464 break;
16465
16466 case R_PPC64_TPREL16_LO:
16467 case R_PPC64_TPREL16_LO_DS:
16468 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16469 {
16470 bfd_byte *p = contents + (rel->r_offset & ~3);
16471 insn = bfd_get_32 (input_bfd, p);
16472 insn &= ~(0x1f << 16);
16473 insn |= 13 << 16;
16474 bfd_put_32 (input_bfd, insn, p);
16475 }
16476 break;
67f0cbdb
AM
16477 }
16478
65f38f15
AM
16479 /* Do any further special processing. */
16480 switch (r_type)
16481 {
16482 default:
16483 break;
16484
25f23106 16485 case R_PPC64_REL16_HA:
4a969973
AM
16486 case R_PPC64_REL16_HIGHA:
16487 case R_PPC64_REL16_HIGHERA:
16488 case R_PPC64_REL16_HIGHESTA:
a680de9a 16489 case R_PPC64_REL16DX_HA:
f9c6b907
AM
16490 case R_PPC64_ADDR16_HA:
16491 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16492 case R_PPC64_ADDR16_HIGHERA:
16493 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
16494 case R_PPC64_TOC16_HA:
16495 case R_PPC64_SECTOFF_HA:
411e1bfb 16496 case R_PPC64_TPREL16_HA:
f9c6b907 16497 case R_PPC64_TPREL16_HIGHA:
411e1bfb 16498 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 16499 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
16500 case R_PPC64_DTPREL16_HA:
16501 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 16502 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 16503 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
16504 /* It's just possible that this symbol is a weak symbol
16505 that's not actually defined anywhere. In that case,
16506 'sec' would be NULL, and we should leave the symbol
16507 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
16508 if (sec == NULL)
16509 break;
1a0670f3 16510 /* Fall through. */
5c5f6e17
AM
16511
16512 case R_PPC64_GOT16_HA:
16513 case R_PPC64_PLTGOT16_HA:
16514 case R_PPC64_PLT16_HA:
16515 case R_PPC64_GOT_TLSGD16_HA:
16516 case R_PPC64_GOT_TLSLD16_HA:
16517 case R_PPC64_GOT_TPREL16_HA:
16518 case R_PPC64_GOT_DTPREL16_HA:
16519 /* Add 0x10000 if sign bit in 0:15 is set.
16520 Bits 0:15 are not used. */
16521 addend += 0x8000;
65f38f15
AM
16522 break;
16523
5663e321
AM
16524 case R_PPC64_D34_HA30:
16525 case R_PPC64_ADDR16_HIGHERA34:
16526 case R_PPC64_ADDR16_HIGHESTA34:
16527 case R_PPC64_REL16_HIGHERA34:
16528 case R_PPC64_REL16_HIGHESTA34:
16529 if (sec != NULL)
16530 addend += 1ULL << 33;
16531 break;
16532
65f38f15
AM
16533 case R_PPC64_ADDR16_DS:
16534 case R_PPC64_ADDR16_LO_DS:
16535 case R_PPC64_GOT16_DS:
16536 case R_PPC64_GOT16_LO_DS:
16537 case R_PPC64_PLT16_LO_DS:
16538 case R_PPC64_SECTOFF_DS:
16539 case R_PPC64_SECTOFF_LO_DS:
16540 case R_PPC64_TOC16_DS:
16541 case R_PPC64_TOC16_LO_DS:
16542 case R_PPC64_PLTGOT16_DS:
16543 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
16544 case R_PPC64_GOT_TPREL16_DS:
16545 case R_PPC64_GOT_TPREL16_LO_DS:
16546 case R_PPC64_GOT_DTPREL16_DS:
16547 case R_PPC64_GOT_DTPREL16_LO_DS:
16548 case R_PPC64_TPREL16_DS:
16549 case R_PPC64_TPREL16_LO_DS:
16550 case R_PPC64_DTPREL16_DS:
16551 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
16552 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
16553 mask = 3;
a680de9a
PB
16554 /* If this reloc is against an lq, lxv, or stxv insn, then
16555 the value must be a multiple of 16. This is somewhat of
16556 a hack, but the "correct" way to do this by defining _DQ
16557 forms of all the _DS relocs bloats all reloc switches in
16558 this file. It doesn't make much sense to use these
16559 relocs in data, so testing the insn should be safe. */
2365f8d7
AM
16560 if ((insn & (0x3fu << 26)) == (56u << 26)
16561 || ((insn & (0x3fu << 26)) == (61u << 26) && (insn & 3) == 1))
adadcc0c 16562 mask = 15;
a680de9a
PB
16563 relocation += addend;
16564 addend = insn & (mask ^ 3);
16565 if ((relocation & mask) != 0)
65f38f15 16566 {
a680de9a 16567 relocation ^= relocation & mask;
25f53a85 16568 info->callbacks->einfo
695344c0 16569 /* xgettext:c-format */
174d0a74 16570 (_("%H: error: %s not a multiple of %u\n"),
25f53a85 16571 input_bfd, input_section, rel->r_offset,
d830549d 16572 ppc64_elf_howto_table[r_type]->name,
adadcc0c 16573 mask + 1);
65f38f15 16574 bfd_set_error (bfd_error_bad_value);
b34976b6 16575 ret = FALSE;
c316a17c 16576 goto copy_reloc;
65f38f15
AM
16577 }
16578 break;
5bd4f169
AM
16579 }
16580
239e1f3a
AM
16581 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
16582 because such sections are not SEC_ALLOC and thus ld.so will
16583 not process them. */
d830549d 16584 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15 16585 if (unresolved_reloc
239e1f3a 16586 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
16587 && h->elf.def_dynamic)
16588 && _bfd_elf_section_offset (output_bfd, info, input_section,
16589 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 16590 {
25f53a85 16591 info->callbacks->einfo
695344c0 16592 /* xgettext:c-format */
c1c8c1ef 16593 (_("%H: unresolvable %s against `%pT'\n"),
25f53a85 16594 input_bfd, input_section, rel->r_offset,
b80eed39 16595 howto->name,
039b3fef 16596 h->elf.root.root.string);
b34976b6 16597 ret = FALSE;
9c07fe7c 16598 }
5bd4f169 16599
b80eed39
AM
16600 /* 16-bit fields in insns mostly have signed values, but a
16601 few insns have 16-bit unsigned values. Really, we should
16602 have different reloc types. */
16603 if (howto->complain_on_overflow != complain_overflow_dont
16604 && howto->dst_mask == 0xffff
16605 && (input_section->flags & SEC_CODE) != 0)
16606 {
16607 enum complain_overflow complain = complain_overflow_signed;
16608
16609 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 16610 if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */)
a47622ac
AM
16611 complain = complain_overflow_bitfield;
16612 else if (howto->rightshift == 0
2365f8d7
AM
16613 ? ((insn & (0x3fu << 26)) == 28u << 26 /* andi */
16614 || (insn & (0x3fu << 26)) == 24u << 26 /* ori */
16615 || (insn & (0x3fu << 26)) == 26u << 26 /* xori */)
16616 : ((insn & (0x3fu << 26)) == 29u << 26 /* andis */
16617 || (insn & (0x3fu << 26)) == 25u << 26 /* oris */
16618 || (insn & (0x3fu << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
16619 complain = complain_overflow_unsigned;
16620 if (howto->complain_on_overflow != complain)
16621 {
16622 alt_howto = *howto;
16623 alt_howto.complain_on_overflow = complain;
16624 howto = &alt_howto;
16625 }
16626 }
16627
5663e321 16628 switch (r_type)
a680de9a 16629 {
5663e321
AM
16630 /* Split field relocs aren't handled by _bfd_final_link_relocate. */
16631 case R_PPC64_D34:
16632 case R_PPC64_D34_LO:
16633 case R_PPC64_D34_HI30:
16634 case R_PPC64_D34_HA30:
16635 case R_PPC64_PCREL34:
16636 case R_PPC64_GOT_PCREL34:
c213164a
AM
16637 case R_PPC64_TPREL34:
16638 case R_PPC64_DTPREL34:
16639 case R_PPC64_GOT_TLSGD34:
16640 case R_PPC64_GOT_TLSLD34:
16641 case R_PPC64_GOT_TPREL34:
16642 case R_PPC64_GOT_DTPREL34:
5663e321
AM
16643 case R_PPC64_PLT_PCREL34:
16644 case R_PPC64_PLT_PCREL34_NOTOC:
16645 case R_PPC64_D28:
16646 case R_PPC64_PCREL28:
16647 if (rel->r_offset + 8 > input_section->size)
16648 r = bfd_reloc_outofrange;
16649 else
16650 {
5663e321
AM
16651 relocation += addend;
16652 if (howto->pc_relative)
16653 relocation -= (rel->r_offset
16654 + input_section->output_offset
16655 + input_section->output_section->vma);
16656 relocation >>= howto->rightshift;
16657
16658 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16659 pinsn <<= 32;
16660 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
16661
16662 pinsn &= ~howto->dst_mask;
16663 pinsn |= (((relocation << 16) | (relocation & 0xffff))
16664 & howto->dst_mask);
16665 bfd_put_32 (input_bfd, pinsn >> 32, contents + rel->r_offset);
16666 bfd_put_32 (input_bfd, pinsn, contents + rel->r_offset + 4);
16667 r = bfd_reloc_ok;
16668 if (howto->complain_on_overflow == complain_overflow_signed
16669 && (relocation + (1ULL << (howto->bitsize - 1))
16670 >= 1ULL << howto->bitsize))
16671 r = bfd_reloc_overflow;
16672 }
16673 break;
16674
16675 case R_PPC64_REL16DX_HA:
a680de9a
PB
16676 if (rel->r_offset + 4 > input_section->size)
16677 r = bfd_reloc_outofrange;
16678 else
16679 {
16680 relocation += addend;
16681 relocation -= (rel->r_offset
16682 + input_section->output_offset
16683 + input_section->output_section->vma);
3de43e7b 16684 relocation = (bfd_signed_vma) relocation >> 16;
a680de9a
PB
16685 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16686 insn &= ~0x1fffc1;
3de43e7b 16687 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
a680de9a
PB
16688 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
16689 r = bfd_reloc_ok;
3de43e7b 16690 if (relocation + 0x8000 > 0xffff)
a680de9a
PB
16691 r = bfd_reloc_overflow;
16692 }
5663e321
AM
16693 break;
16694
16695 default:
16696 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
16697 contents, rel->r_offset,
16698 relocation, addend);
a680de9a 16699 }
5bd4f169 16700
ef60b7ff 16701 if (r != bfd_reloc_ok)
5bd4f169 16702 {
bc30df16 16703 char *more_info = NULL;
b80eed39 16704 const char *reloc_name = howto->name;
bc30df16
AM
16705
16706 if (reloc_dest != DEST_NORMAL)
16707 {
16708 more_info = bfd_malloc (strlen (reloc_name) + 8);
16709 if (more_info != NULL)
16710 {
16711 strcpy (more_info, reloc_name);
16712 strcat (more_info, (reloc_dest == DEST_OPD
16713 ? " (OPD)" : " (stub)"));
16714 reloc_name = more_info;
16715 }
16716 }
16717
cd27b276 16718 if (r == bfd_reloc_overflow)
5bd4f169 16719 {
8131c122
AM
16720 /* On code like "if (foo) foo();" don't report overflow
16721 on a branch to zero when foo is undefined. */
16722 if (!warned
16723 && (reloc_dest == DEST_STUB
16724 || !(h != NULL
16725 && (h->elf.root.type == bfd_link_hash_undefweak
16726 || h->elf.root.type == bfd_link_hash_undefined)
16727 && is_branch_reloc (r_type))))
1a72702b
AM
16728 info->callbacks->reloc_overflow (info, &h->elf.root,
16729 sym_name, reloc_name,
16730 orig_rel.r_addend,
16731 input_bfd, input_section,
16732 rel->r_offset);
ef60b7ff
AM
16733 }
16734 else
16735 {
25f53a85 16736 info->callbacks->einfo
695344c0 16737 /* xgettext:c-format */
c1c8c1ef 16738 (_("%H: %s against `%pT': error %d\n"),
25f53a85 16739 input_bfd, input_section, rel->r_offset,
bc30df16 16740 reloc_name, sym_name, (int) r);
b34976b6 16741 ret = FALSE;
ef60b7ff 16742 }
bc30df16
AM
16743 if (more_info != NULL)
16744 free (more_info);
5bd4f169 16745 }
c316a17c
AM
16746 copy_reloc:
16747 if (wrel != rel)
16748 *wrel = *rel;
16749 }
16750
16751 if (wrel != rel)
16752 {
16753 Elf_Internal_Shdr *rel_hdr;
16754 size_t deleted = rel - wrel;
16755
16756 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
16757 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
16758 if (rel_hdr->sh_size == 0)
16759 {
16760 /* It is too late to remove an empty reloc section. Leave
16761 one NONE reloc.
16762 ??? What is wrong with an empty section??? */
16763 rel_hdr->sh_size = rel_hdr->sh_entsize;
16764 deleted -= 1;
16765 }
16766 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
16767 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
16768 input_section->reloc_count -= deleted;
5bd4f169
AM
16769 }
16770
645ea6a9
AM
16771 /* If we're emitting relocations, then shortly after this function
16772 returns, reloc offsets and addends for this section will be
16773 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
16774 file rather than the input. Save a copy of the relocs for
16775 opd_entry_value. */
0e1862bb 16776 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
8860955f
AM
16777 {
16778 bfd_size_type amt;
16779 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
16780 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
16781 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
16782 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
16783 if (rel == NULL)
16784 return FALSE;
16785 memcpy (rel, relocs, amt);
16786 }
5bd4f169
AM
16787 return ret;
16788}
16789
754021d0
AM
16790/* Adjust the value of any local symbols in opd sections. */
16791
6e0b88f1 16792static int
754021d0
AM
16793ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
16794 const char *name ATTRIBUTE_UNUSED,
16795 Elf_Internal_Sym *elfsym,
16796 asection *input_sec,
16797 struct elf_link_hash_entry *h)
16798{
74f0fb50
AM
16799 struct _opd_sec_data *opd;
16800 long adjust;
754021d0
AM
16801 bfd_vma value;
16802
4025353c 16803 if (h != NULL)
6e0b88f1 16804 return 1;
4025353c 16805
74f0fb50
AM
16806 opd = get_opd_info (input_sec);
16807 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 16808 return 1;
754021d0
AM
16809
16810 value = elfsym->st_value - input_sec->output_offset;
0e1862bb 16811 if (!bfd_link_relocatable (info))
754021d0
AM
16812 value -= input_sec->output_section->vma;
16813
51aecdc5 16814 adjust = opd->adjust[OPD_NDX (value)];
4025353c 16815 if (adjust == -1)
6e0b88f1
AM
16816 return 2;
16817
16818 elfsym->st_value += adjust;
16819 return 1;
754021d0
AM
16820}
16821
5bd4f169
AM
16822/* Finish up dynamic symbol handling. We set the contents of various
16823 dynamic sections here. */
16824
b34976b6 16825static bfd_boolean
4ce794b7
AM
16826ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
16827 struct bfd_link_info *info,
16828 struct elf_link_hash_entry *h,
4aef7643 16829 Elf_Internal_Sym *sym)
5bd4f169 16830{
65f38f15 16831 struct ppc_link_hash_table *htab;
8387904d 16832 struct plt_entry *ent;
5bd4f169 16833
65f38f15 16834 htab = ppc_hash_table (info);
4dfe6ac6
NC
16835 if (htab == NULL)
16836 return FALSE;
5bd4f169 16837
49c09209
AM
16838 if (!htab->opd_abi && !h->def_regular)
16839 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
16840 if (ent->plt.offset != (bfd_vma) -1)
16841 {
16842 /* Mark the symbol as undefined, rather than as
16843 defined in glink. Leave the value if there were
16844 any relocations where pointer equality matters
16845 (this is a clue for the dynamic linker, to make
16846 function pointer comparisons work between an
16847 application and shared library), otherwise set it
16848 to zero. */
16849 sym->st_shndx = SHN_UNDEF;
16850 if (!h->pointer_equality_needed)
16851 sym->st_value = 0;
16852 else if (!h->ref_regular_nonweak)
16853 {
16854 /* This breaks function pointer comparisons, but
16855 that is better than breaking tests for a NULL
16856 function pointer. */
16857 sym->st_value = 0;
16858 }
16859 break;
16860 }
5bd4f169 16861
1bdd8fac
AM
16862 if (h->needs_copy
16863 && (h->root.type == bfd_link_hash_defined
16864 || h->root.type == bfd_link_hash_defweak)
16865 && (h->root.u.def.section == htab->elf.sdynbss
16866 || h->root.u.def.section == htab->elf.sdynrelro))
5bd4f169 16867 {
65f38f15 16868 /* This symbol needs a copy reloc. Set it up. */
49c09209 16869 Elf_Internal_Rela rela;
5474d94f 16870 asection *srel;
49c09209 16871 bfd_byte *loc;
5bd4f169 16872
1bdd8fac 16873 if (h->dynindx == -1)
65f38f15 16874 abort ();
5bd4f169 16875
ed7007c1 16876 rela.r_offset = defined_sym_val (h);
5bd4f169
AM
16877 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
16878 rela.r_addend = 0;
afbf7e8e 16879 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
16880 srel = htab->elf.sreldynrelro;
16881 else
16882 srel = htab->elf.srelbss;
16883 loc = srel->contents;
16884 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 16885 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
16886 }
16887
b34976b6 16888 return TRUE;
5bd4f169
AM
16889}
16890
65f38f15
AM
16891/* Used to decide how to sort relocs in an optimal manner for the
16892 dynamic linker, before writing them out. */
16893
16894static enum elf_reloc_type_class
7e612e98
AM
16895ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
16896 const asection *rel_sec,
16897 const Elf_Internal_Rela *rela)
65f38f15 16898{
04c9666a 16899 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
16900 struct ppc_link_hash_table *htab = ppc_hash_table (info);
16901
33e44f2e 16902 if (rel_sec == htab->elf.irelplt)
7e612e98 16903 return reloc_class_ifunc;
a33d1f77 16904
4ce794b7 16905 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 16906 switch (r_type)
65f38f15
AM
16907 {
16908 case R_PPC64_RELATIVE:
16909 return reloc_class_relative;
16910 case R_PPC64_JMP_SLOT:
16911 return reloc_class_plt;
16912 case R_PPC64_COPY:
16913 return reloc_class_copy;
16914 default:
16915 return reloc_class_normal;
16916 }
16917}
16918
5bd4f169
AM
16919/* Finish up the dynamic sections. */
16920
b34976b6 16921static bfd_boolean
4ce794b7
AM
16922ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
16923 struct bfd_link_info *info)
5bd4f169 16924{
65f38f15
AM
16925 struct ppc_link_hash_table *htab;
16926 bfd *dynobj;
5bd4f169 16927 asection *sdyn;
5bd4f169 16928
65f38f15 16929 htab = ppc_hash_table (info);
4dfe6ac6
NC
16930 if (htab == NULL)
16931 return FALSE;
16932
65f38f15 16933 dynobj = htab->elf.dynobj;
3d4d4302 16934 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 16935
65f38f15 16936 if (htab->elf.dynamic_sections_created)
5bd4f169 16937 {
5bd4f169
AM
16938 Elf64_External_Dyn *dyncon, *dynconend;
16939
33e44f2e 16940 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 16941 abort ();
5bd4f169
AM
16942
16943 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 16944 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
16945 for (; dyncon < dynconend; dyncon++)
16946 {
16947 Elf_Internal_Dyn dyn;
19397422 16948 asection *s;
5bd4f169
AM
16949
16950 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
16951
16952 switch (dyn.d_tag)
16953 {
65f38f15
AM
16954 default:
16955 continue;
5bd4f169 16956
5d1634d7 16957 case DT_PPC64_GLINK:
4ce794b7 16958 s = htab->glink;
6348e046 16959 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
16960 /* We stupidly defined DT_PPC64_GLINK to be the start
16961 of glink rather than the first entry point, which is
16962 what ld.so needs, and now have a bigger stub to
16963 support automatic multiple TOCs. */
9e390558 16964 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
5d1634d7
AM
16965 break;
16966
19397422
AM
16967 case DT_PPC64_OPD:
16968 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
16969 if (s == NULL)
16970 continue;
16971 dyn.d_un.d_ptr = s->vma;
19397422
AM
16972 break;
16973
e8910a83 16974 case DT_PPC64_OPT:
5663e321
AM
16975 if ((htab->do_multi_toc && htab->multi_toc_needed)
16976 || htab->notoc_plt)
e8910a83 16977 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
f378ab09
AM
16978 if (htab->has_plt_localentry0)
16979 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
e8910a83
AM
16980 break;
16981
19397422
AM
16982 case DT_PPC64_OPDSZ:
16983 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
16984 if (s == NULL)
16985 continue;
eea6121a 16986 dyn.d_un.d_val = s->size;
19397422
AM
16987 break;
16988
65f38f15 16989 case DT_PLTGOT:
33e44f2e 16990 s = htab->elf.splt;
6348e046 16991 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
16992 break;
16993
16994 case DT_JMPREL:
33e44f2e 16995 s = htab->elf.srelplt;
6348e046 16996 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 16997 break;
5bd4f169 16998
65f38f15 16999 case DT_PLTRELSZ:
33e44f2e 17000 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7 17001 break;
82e66161
AM
17002
17003 case DT_TEXTREL:
17004 if (htab->local_ifunc_resolver)
17005 info->callbacks->einfo
17006 (_("%X%P: text relocations and GNU indirect "
17007 "functions will result in a segfault at runtime\n"));
17008 else if (htab->maybe_local_ifunc_resolver)
17009 info->callbacks->einfo
17010 (_("%P: warning: text relocations and GNU indirect "
17011 "functions may result in a segfault at runtime\n"));
17012 continue;
5bd4f169 17013 }
5bd4f169 17014
65f38f15 17015 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 17016 }
5bd4f169
AM
17017 }
17018
6528b6eb
AM
17019 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
17020 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17021 {
17022 /* Fill in the first entry in the global offset table.
17023 We use it to hold the link-time TOCbase. */
17024 bfd_put_64 (output_bfd,
60ee0d4a 17025 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 17026 htab->elf.sgot->contents);
5d1634d7
AM
17027
17028 /* Set .got entry size. */
2cdcc330
AM
17029 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
17030 = 8;
5d1634d7
AM
17031 }
17032
6528b6eb
AM
17033 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
17034 && htab->elf.splt->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17035 {
17036 /* Set .plt entry size. */
33e44f2e 17037 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 17038 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
17039 }
17040
84f5d08e
AM
17041 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
17042 brlt ourselves if emitrelocations. */
17043 if (htab->brlt != NULL
17044 && htab->brlt->reloc_count != 0
17045 && !_bfd_elf_link_output_relocs (output_bfd,
17046 htab->brlt,
d4730f92 17047 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
17048 elf_section_data (htab->brlt)->relocs,
17049 NULL))
17050 return FALSE;
17051
176a0d42
AM
17052 if (htab->glink != NULL
17053 && htab->glink->reloc_count != 0
17054 && !_bfd_elf_link_output_relocs (output_bfd,
17055 htab->glink,
d4730f92 17056 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
17057 elf_section_data (htab->glink)->relocs,
17058 NULL))
17059 return FALSE;
17060
da44f4e5 17061
df136d64
AM
17062 if (htab->glink_eh_frame != NULL
17063 && htab->glink_eh_frame->size != 0
17064 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
17065 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
17066 htab->glink_eh_frame,
17067 htab->glink_eh_frame->contents))
17068 return FALSE;
58d180e8 17069
e717da7e 17070 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
17071 since we didn't add them to DYNOBJ. We know dynobj is the first
17072 bfd. */
c72f2fb2 17073 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
17074 {
17075 asection *s;
7b53ace3 17076
0c8d6e5c 17077 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
17078 continue;
17079
e717da7e
AM
17080 s = ppc64_elf_tdata (dynobj)->got;
17081 if (s != NULL
eea6121a 17082 && s->size != 0
e717da7e
AM
17083 && s->output_section != bfd_abs_section_ptr
17084 && !bfd_set_section_contents (output_bfd, s->output_section,
17085 s->contents, s->output_offset,
eea6121a 17086 s->size))
e717da7e
AM
17087 return FALSE;
17088 s = ppc64_elf_tdata (dynobj)->relgot;
17089 if (s != NULL
eea6121a 17090 && s->size != 0
e717da7e
AM
17091 && s->output_section != bfd_abs_section_ptr
17092 && !bfd_set_section_contents (output_bfd, s->output_section,
17093 s->contents, s->output_offset,
eea6121a 17094 s->size))
e717da7e
AM
17095 return FALSE;
17096 }
f6c52c13 17097
b34976b6 17098 return TRUE;
5bd4f169
AM
17099}
17100
5bd4f169 17101#include "elf64-target.h"
7b8e7dad
AM
17102
17103/* FreeBSD support */
17104
17105#undef TARGET_LITTLE_SYM
17106#undef TARGET_LITTLE_NAME
17107
17108#undef TARGET_BIG_SYM
6d00b590 17109#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
17110#undef TARGET_BIG_NAME
17111#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
17112
17113#undef ELF_OSABI
17114#define ELF_OSABI ELFOSABI_FREEBSD
17115
17116#undef elf64_bed
17117#define elf64_bed elf64_powerpc_fbsd_bed
17118
17119#include "elf64-target.h"
This page took 2.813319 seconds and 4 git commands to generate.