PowerPC64 TLS optimization fix
[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
b9ca1af6 10888#define LD_R0_0R3 0xe8030000
a7f2871e
AM
10889#define LD_R12_0R3 0xe9830000
10890#define MR_R0_R3 0x7c601b78
b9ca1af6 10891#define CMPDI_R0_0 0x2c200000
a7f2871e
AM
10892#define ADD_R3_R12_R13 0x7c6c6a14
10893#define BEQLR 0x4d820020
10894#define MR_R3_R0 0x7c030378
a7f2871e 10895#define BCTRL 0x4e800421
a7f2871e
AM
10896
10897static inline bfd_byte *
794e51c0
AM
10898build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10899 struct ppc_stub_hash_entry *stub_entry,
10900 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 10901{
e7d1c40c 10902 bfd *obfd = htab->params->stub_bfd;
df136d64 10903 bfd_byte *loc = p;
794e51c0 10904
b9ca1af6 10905 bfd_put_32 (obfd, LD_R0_0R3 + 0, p), p += 4;
a7f2871e 10906 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
b9ca1af6 10907 bfd_put_32 (obfd, CMPDI_R0_0, p), p += 4;
a7f2871e 10908 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
a7f2871e
AM
10909 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10910 bfd_put_32 (obfd, BEQLR, p), p += 4;
10911 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
f378ab09
AM
10912 if (r != NULL)
10913 r[0].r_offset += 7 * 4;
e81b4c93 10914 if (stub_entry->stub_type != ppc_stub_plt_call_r2save)
f378ab09
AM
10915 return build_plt_stub (htab, stub_entry, p, offset, r);
10916
b9ca1af6
AM
10917 bfd_put_32 (obfd, MFLR_R0, p), p += 4;
10918 bfd_put_32 (obfd, STD_R0_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
10919
10920 if (r != NULL)
f378ab09 10921 r[0].r_offset += 2 * 4;
794e51c0 10922 p = build_plt_stub (htab, stub_entry, p, offset, r);
407aa07c 10923 bfd_put_32 (obfd, BCTRL, p - 4);
a7f2871e 10924
a078d95a 10925 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
b9ca1af6
AM
10926 bfd_put_32 (obfd, LD_R0_0R1 + STK_LINKER (htab), p), p += 4;
10927 bfd_put_32 (obfd, MTLR_R0, p), p += 4;
a7f2871e
AM
10928 bfd_put_32 (obfd, BLR, p), p += 4;
10929
df136d64
AM
10930 if (htab->glink_eh_frame != NULL
10931 && htab->glink_eh_frame->size != 0)
10932 {
10933 bfd_byte *base, *eh;
10934 unsigned int lr_used, delta;
10935
10936 base = htab->glink_eh_frame->contents + stub_entry->group->eh_base + 17;
10937 eh = base + stub_entry->group->eh_size;
10938 lr_used = stub_entry->stub_offset + (p - 20 - loc);
10939 delta = lr_used - stub_entry->group->lr_restore;
10940 stub_entry->group->lr_restore = lr_used + 16;
10941 eh = eh_advance (htab->elf.dynobj, eh, delta);
10942 *eh++ = DW_CFA_offset_extended_sf;
10943 *eh++ = 65;
10944 *eh++ = -(STK_LINKER (htab) / 8) & 0x7f;
10945 *eh++ = DW_CFA_advance_loc + 4;
10946 *eh++ = DW_CFA_restore_extended;
10947 *eh++ = 65;
10948 stub_entry->group->eh_size = eh - base;
10949 }
a7f2871e
AM
10950 return p;
10951}
10952
176a0d42
AM
10953static Elf_Internal_Rela *
10954get_relocs (asection *sec, int count)
10955{
10956 Elf_Internal_Rela *relocs;
10957 struct bfd_elf_section_data *elfsec_data;
10958
10959 elfsec_data = elf_section_data (sec);
10960 relocs = elfsec_data->relocs;
10961 if (relocs == NULL)
10962 {
10963 bfd_size_type relsize;
10964 relsize = sec->reloc_count * sizeof (*relocs);
10965 relocs = bfd_alloc (sec->owner, relsize);
10966 if (relocs == NULL)
10967 return NULL;
10968 elfsec_data->relocs = relocs;
d4730f92
BS
10969 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10970 sizeof (Elf_Internal_Shdr));
10971 if (elfsec_data->rela.hdr == NULL)
10972 return NULL;
10973 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10974 * sizeof (Elf64_External_Rela));
10975 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
10976 sec->reloc_count = 0;
10977 }
10978 relocs += sec->reloc_count;
10979 sec->reloc_count += count;
10980 return relocs;
10981}
10982
3d58e1fc
AM
10983/* Convert the relocs R[0] thru R[-NUM_REL+1], which are all no-symbol
10984 forms, to the equivalent relocs against the global symbol given by
10985 STUB_ENTRY->H. */
10986
10987static bfd_boolean
10988use_global_in_relocs (struct ppc_link_hash_table *htab,
10989 struct ppc_stub_hash_entry *stub_entry,
10990 Elf_Internal_Rela *r, unsigned int num_rel)
10991{
10992 struct elf_link_hash_entry **hashes;
10993 unsigned long symndx;
10994 struct ppc_link_hash_entry *h;
10995 bfd_vma symval;
10996
10997 /* Relocs are always against symbols in their own object file. Fake
10998 up global sym hashes for the stub bfd (which has no symbols). */
10999 hashes = elf_sym_hashes (htab->params->stub_bfd);
11000 if (hashes == NULL)
11001 {
11002 bfd_size_type hsize;
11003
11004 /* When called the first time, stub_globals will contain the
11005 total number of symbols seen during stub sizing. After
11006 allocating, stub_globals is used as an index to fill the
11007 hashes array. */
11008 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
11009 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
11010 if (hashes == NULL)
11011 return FALSE;
11012 elf_sym_hashes (htab->params->stub_bfd) = hashes;
11013 htab->stub_globals = 1;
11014 }
11015 symndx = htab->stub_globals++;
11016 h = stub_entry->h;
11017 hashes[symndx] = &h->elf;
11018 if (h->oh != NULL && h->oh->is_func)
11019 h = ppc_follow_link (h->oh);
11020 BFD_ASSERT (h->elf.root.type == bfd_link_hash_defined
11021 || h->elf.root.type == bfd_link_hash_defweak);
ed7007c1 11022 symval = defined_sym_val (&h->elf);
3d58e1fc
AM
11023 while (num_rel-- != 0)
11024 {
11025 r->r_info = ELF64_R_INFO (symndx, ELF64_R_TYPE (r->r_info));
11026 if (h->elf.root.u.def.section != stub_entry->target_section)
11027 {
11028 /* H is an opd symbol. The addend must be zero, and the
11029 branch reloc is the only one we can convert. */
11030 r->r_addend = 0;
11031 break;
11032 }
11033 else
11034 r->r_addend -= symval;
11035 --r;
11036 }
11037 return TRUE;
11038}
11039
aa374f67 11040static bfd_vma
25f53a85 11041get_r2off (struct bfd_link_info *info,
aa374f67
AM
11042 struct ppc_stub_hash_entry *stub_entry)
11043{
25f53a85 11044 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 11045 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
aa374f67
AM
11046
11047 if (r2off == 0)
11048 {
11049 /* Support linking -R objects. Get the toc pointer from the
11050 opd entry. */
11051 char buf[8];
b9e5796b
AM
11052 if (!htab->opd_abi)
11053 return r2off;
aa374f67
AM
11054 asection *opd = stub_entry->h->elf.root.u.def.section;
11055 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
11056
11057 if (strcmp (opd->name, ".opd") != 0
11058 || opd->reloc_count != 0)
11059 {
2cdcc330
AM
11060 info->callbacks->einfo
11061 (_("%P: cannot find opd entry toc for `%pT'\n"),
11062 stub_entry->h->elf.root.root.string);
aa374f67 11063 bfd_set_error (bfd_error_bad_value);
a7c49797 11064 return (bfd_vma) -1;
aa374f67
AM
11065 }
11066 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
a7c49797 11067 return (bfd_vma) -1;
aa374f67 11068 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 11069 r2off -= elf_gp (info->output_bfd);
aa374f67 11070 }
6f20ed8a 11071 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
aa374f67
AM
11072 return r2off;
11073}
11074
b34976b6 11075static bfd_boolean
4ce794b7 11076ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 11077{
721956f4
AM
11078 struct ppc_stub_hash_entry *stub_entry;
11079 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
11080 struct bfd_link_info *info;
11081 struct ppc_link_hash_table *htab;
721956f4 11082 bfd_byte *loc;
3d58e1fc 11083 bfd_byte *p, *relp;
1aa42141 11084 bfd_vma targ, off;
176a0d42 11085 Elf_Internal_Rela *r;
e054468f 11086 asection *plt;
3d58e1fc 11087 int num_rel;
04bdff6a 11088 int odd;
5d1634d7 11089
721956f4
AM
11090 /* Massage our args to the form they really have. */
11091 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 11092 info = in_arg;
5d1634d7 11093
5d1634d7 11094 htab = ppc_hash_table (info);
4dfe6ac6
NC
11095 if (htab == NULL)
11096 return FALSE;
5d1634d7 11097
1aa42141 11098 BFD_ASSERT (stub_entry->stub_offset >= stub_entry->group->stub_sec->size);
6f20ed8a 11099 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
721956f4 11100
4ce794b7 11101 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 11102 switch (stub_entry->stub_type)
5d1634d7 11103 {
721956f4 11104 case ppc_stub_long_branch:
ad8e1ba5 11105 case ppc_stub_long_branch_r2off:
721956f4 11106 /* Branches are relative. This is where we are going to. */
1aa42141 11107 targ = (stub_entry->target_value
6911b7dc
AM
11108 + stub_entry->target_section->output_offset
11109 + stub_entry->target_section->output_section->vma);
1aa42141 11110 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
5d1634d7 11111
721956f4 11112 /* And this is where we are coming from. */
1aa42141
AM
11113 off = (stub_entry->stub_offset
11114 + stub_entry->group->stub_sec->output_offset
11115 + stub_entry->group->stub_sec->output_section->vma);
11116 off = targ - off;
e86ce104 11117
9e390558 11118 p = loc;
ac2df442 11119 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 11120 {
25f53a85 11121 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 11122
a7c49797 11123 if (r2off == (bfd_vma) -1)
aa374f67
AM
11124 {
11125 htab->stub_error = TRUE;
11126 return FALSE;
11127 }
9e390558
AM
11128 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11129 p += 4;
ac2df442
AM
11130 if (PPC_HA (r2off) != 0)
11131 {
e7d1c40c 11132 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11133 ADDIS_R2_R2 | PPC_HA (r2off), p);
11134 p += 4;
a7c49797
AM
11135 }
11136 if (PPC_LO (r2off) != 0)
11137 {
11138 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11139 ADDI_R2_R2 | PPC_LO (r2off), p);
11140 p += 4;
ac2df442 11141 }
9e390558 11142 off -= p - loc;
ad8e1ba5 11143 }
9e390558
AM
11144 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p);
11145 p += 4;
ad8e1ba5 11146
5c3dead3
AM
11147 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11148 {
cf97bcb0
AM
11149 _bfd_error_handler
11150 (_("long branch stub `%s' offset overflow"),
bc30df16 11151 stub_entry->root.string);
5c3dead3
AM
11152 htab->stub_error = TRUE;
11153 return FALSE;
11154 }
ee75fd95
AM
11155
11156 if (info->emitrelocations)
11157 {
6f20ed8a 11158 r = get_relocs (stub_entry->group->stub_sec, 1);
176a0d42
AM
11159 if (r == NULL)
11160 return FALSE;
9e390558 11161 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
ee75fd95 11162 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
1aa42141 11163 r->r_addend = targ;
3d58e1fc
AM
11164 if (stub_entry->h != NULL
11165 && !use_global_in_relocs (htab, stub_entry, r, 1))
11166 return FALSE;
ee75fd95 11167 }
721956f4 11168 break;
e86ce104 11169
721956f4 11170 case ppc_stub_plt_branch:
ad8e1ba5 11171 case ppc_stub_plt_branch_r2off:
721956f4
AM
11172 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11173 stub_entry->root.string + 9,
b34976b6 11174 FALSE, FALSE);
721956f4
AM
11175 if (br_entry == NULL)
11176 {
cf97bcb0
AM
11177 _bfd_error_handler (_("can't find branch stub `%s'"),
11178 stub_entry->root.string);
b34976b6
AM
11179 htab->stub_error = TRUE;
11180 return FALSE;
721956f4
AM
11181 }
11182
1aa42141 11183 targ = (stub_entry->target_value
176a0d42
AM
11184 + stub_entry->target_section->output_offset
11185 + stub_entry->target_section->output_section->vma);
6911b7dc 11186 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
1aa42141 11187 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 11188
1aa42141 11189 bfd_put_64 (htab->brlt->owner, targ,
4ce794b7 11190 htab->brlt->contents + br_entry->offset);
721956f4 11191
f94498ff 11192 if (br_entry->iter == htab->stub_iteration)
721956f4 11193 {
f94498ff 11194 br_entry->iter = 0;
84f5d08e 11195
f94498ff 11196 if (htab->relbrlt != NULL)
84f5d08e 11197 {
f94498ff
AM
11198 /* Create a reloc for the branch lookup table entry. */
11199 Elf_Internal_Rela rela;
11200 bfd_byte *rl;
11201
11202 rela.r_offset = (br_entry->offset
11203 + htab->brlt->output_offset
11204 + htab->brlt->output_section->vma);
11205 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11206 rela.r_addend = targ;
f94498ff
AM
11207
11208 rl = htab->relbrlt->contents;
11209 rl += (htab->relbrlt->reloc_count++
11210 * sizeof (Elf64_External_Rela));
11211 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
11212 }
11213 else if (info->emitrelocations)
11214 {
176a0d42
AM
11215 r = get_relocs (htab->brlt, 1);
11216 if (r == NULL)
11217 return FALSE;
11218 /* brlt, being SEC_LINKER_CREATED does not go through the
11219 normal reloc processing. Symbols and offsets are not
11220 translated from input file to output file form, so
11221 set up the offset per the output file. */
f94498ff
AM
11222 r->r_offset = (br_entry->offset
11223 + htab->brlt->output_offset
11224 + htab->brlt->output_section->vma);
11225 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11226 r->r_addend = targ;
84f5d08e 11227 }
84f5d08e 11228 }
721956f4 11229
1aa42141 11230 targ = (br_entry->offset
176a0d42
AM
11231 + htab->brlt->output_offset
11232 + htab->brlt->output_section->vma);
11233
1aa42141
AM
11234 off = (elf_gp (info->output_bfd)
11235 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11236 off = targ - off;
721956f4 11237
ad8e1ba5 11238 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 11239 {
25f53a85 11240 info->callbacks->einfo
c1c8c1ef 11241 (_("%P: linkage table error against `%pT'\n"),
721956f4 11242 stub_entry->root.string);
5d1634d7 11243 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11244 htab->stub_error = TRUE;
11245 return FALSE;
5d1634d7 11246 }
41bd81ab 11247
176a0d42
AM
11248 if (info->emitrelocations)
11249 {
6f20ed8a 11250 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
176a0d42
AM
11251 if (r == NULL)
11252 return FALSE;
6f20ed8a 11253 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11254 if (bfd_big_endian (info->output_bfd))
11255 r[0].r_offset += 2;
00f412ee 11256 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
176a0d42
AM
11257 r[0].r_offset += 4;
11258 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
1aa42141 11259 r[0].r_addend = targ;
176a0d42
AM
11260 if (PPC_HA (off) != 0)
11261 {
11262 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11263 r[1].r_offset = r[0].r_offset + 4;
11264 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11265 r[1].r_addend = r[0].r_addend;
11266 }
11267 }
11268
9e390558 11269 p = loc;
00f412ee 11270 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ad8e1ba5 11271 {
176a0d42 11272 if (PPC_HA (off) != 0)
ac2df442 11273 {
e7d1c40c 11274 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11275 ADDIS_R12_R2 | PPC_HA (off), p);
11276 p += 4;
e7d1c40c 11277 bfd_put_32 (htab->params->stub_bfd,
9e390558 11278 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11279 }
11280 else
9e390558
AM
11281 bfd_put_32 (htab->params->stub_bfd,
11282 LD_R12_0R2 | PPC_LO (off), p);
ad8e1ba5
AM
11283 }
11284 else
11285 {
25f53a85 11286 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 11287
a7c49797 11288 if (r2off == (bfd_vma) -1)
aa374f67
AM
11289 {
11290 htab->stub_error = TRUE;
11291 return FALSE;
11292 }
ad8e1ba5 11293
9e390558
AM
11294 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11295 p += 4;
176a0d42 11296 if (PPC_HA (off) != 0)
ac2df442 11297 {
e7d1c40c 11298 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11299 ADDIS_R12_R2 | PPC_HA (off), p);
11300 p += 4;
e7d1c40c 11301 bfd_put_32 (htab->params->stub_bfd,
9e390558 11302 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11303 }
11304 else
9e390558 11305 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p);
ac2df442
AM
11306
11307 if (PPC_HA (r2off) != 0)
11308 {
9e390558 11309 p += 4;
e7d1c40c 11310 bfd_put_32 (htab->params->stub_bfd,
9e390558 11311 ADDIS_R2_R2 | PPC_HA (r2off), p);
00f412ee
AM
11312 }
11313 if (PPC_LO (r2off) != 0)
11314 {
9e390558 11315 p += 4;
e7d1c40c 11316 bfd_put_32 (htab->params->stub_bfd,
9e390558 11317 ADDI_R2_R2 | PPC_LO (r2off), p);
ac2df442 11318 }
ad8e1ba5 11319 }
9e390558
AM
11320 p += 4;
11321 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11322 p += 4;
407aa07c
AM
11323 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11324 p += 4;
721956f4 11325 break;
5d1634d7 11326
05d0e962
AM
11327 case ppc_stub_long_branch_notoc:
11328 case ppc_stub_long_branch_both:
11329 case ppc_stub_plt_branch_notoc:
11330 case ppc_stub_plt_branch_both:
11331 case ppc_stub_plt_call_notoc:
11332 case ppc_stub_plt_call_both:
11333 p = loc;
f891966f 11334 off = (stub_entry->stub_offset
05d0e962
AM
11335 + stub_entry->group->stub_sec->output_offset
11336 + stub_entry->group->stub_sec->output_section->vma);
11337 if (stub_entry->stub_type == ppc_stub_long_branch_both
11338 || stub_entry->stub_type == ppc_stub_plt_branch_both
11339 || stub_entry->stub_type == ppc_stub_plt_call_both)
11340 {
11341 off += 4;
11342 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11343 p += 4;
11344 }
11345 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
11346 {
11347 targ = stub_entry->plt_ent->plt.offset & ~1;
11348 if (targ >= (bfd_vma) -2)
11349 abort ();
11350
11351 plt = htab->elf.splt;
11352 if (!htab->elf.dynamic_sections_created
11353 || stub_entry->h == NULL
11354 || stub_entry->h->elf.dynindx == -1)
11355 {
11356 if (stub_entry->symtype == STT_GNU_IFUNC)
11357 plt = htab->elf.iplt;
11358 else
11359 plt = htab->pltlocal;
11360 }
11361 targ += plt->output_offset + plt->output_section->vma;
11362 }
11363 else
11364 targ = (stub_entry->target_value
11365 + stub_entry->target_section->output_offset
11366 + stub_entry->target_section->output_section->vma);
04bdff6a 11367 odd = off & 4;
05d0e962 11368 off = targ - off;
f891966f 11369
3d58e1fc
AM
11370 relp = p;
11371 num_rel = 0;
04bdff6a
AM
11372 if (htab->powerxx_stubs)
11373 {
11374 bfd_boolean load = stub_entry->stub_type >= ppc_stub_plt_call_notoc;
11375 p = build_powerxx_offset (htab->params->stub_bfd, p, off, odd, load);
11376 }
11377 else
11378 {
11379 /* The notoc stubs calculate their target (either a PLT entry or
11380 the global entry point of a function) relative to the PC
11381 returned by the "bcl" two instructions past the start of the
11382 sequence emitted by build_offset. The offset is therefore 8
11383 less than calculated from the start of the sequence. */
11384 off -= 8;
11385 p = build_offset (htab->params->stub_bfd, p, off,
11386 stub_entry->stub_type >= ppc_stub_plt_call_notoc);
11387 }
11388
f891966f 11389 if (stub_entry->stub_type <= ppc_stub_long_branch_both)
05d0e962 11390 {
f891966f 11391 bfd_vma from;
3d58e1fc 11392 num_rel = 1;
f891966f
AM
11393 from = (stub_entry->stub_offset
11394 + stub_entry->group->stub_sec->output_offset
11395 + stub_entry->group->stub_sec->output_section->vma
11396 + (p - loc));
05d0e962 11397 bfd_put_32 (htab->params->stub_bfd,
f891966f 11398 B_DOT | ((targ - from) & 0x3fffffc), p);
05d0e962
AM
11399 }
11400 else
11401 {
11402 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11403 p += 4;
11404 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11405 }
11406 p += 4;
df136d64 11407
3d58e1fc
AM
11408 if (info->emitrelocations)
11409 {
04bdff6a
AM
11410 bfd_vma roff = relp - stub_entry->group->stub_sec->contents;
11411 if (htab->powerxx_stubs)
11412 num_rel += num_relocs_for_powerxx_offset (off, odd);
11413 else
11414 {
11415 num_rel += num_relocs_for_offset (off);
11416 roff += 16;
11417 }
3d58e1fc
AM
11418 r = get_relocs (stub_entry->group->stub_sec, num_rel);
11419 if (r == NULL)
11420 return FALSE;
04bdff6a
AM
11421 if (htab->powerxx_stubs)
11422 r = emit_relocs_for_powerxx_offset (info, r, roff, targ, off, odd);
11423 else
11424 r = emit_relocs_for_offset (info, r, roff, targ, off);
3d58e1fc
AM
11425 if (stub_entry->stub_type == ppc_stub_long_branch_notoc
11426 || stub_entry->stub_type == ppc_stub_long_branch_both)
11427 {
11428 ++r;
11429 roff = p - 4 - stub_entry->group->stub_sec->contents;
11430 r->r_offset = roff;
11431 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
11432 r->r_addend = targ;
11433 if (stub_entry->h != NULL
11434 && !use_global_in_relocs (htab, stub_entry, r, num_rel))
11435 return FALSE;
11436 }
11437 }
11438
04bdff6a
AM
11439 if (!htab->powerxx_stubs
11440 && htab->glink_eh_frame != NULL
11441 && htab->glink_eh_frame->size != 0)
df136d64
AM
11442 {
11443 bfd_byte *base, *eh;
11444 unsigned int lr_used, delta;
11445
11446 base = (htab->glink_eh_frame->contents
11447 + stub_entry->group->eh_base + 17);
11448 eh = base + stub_entry->group->eh_size;
11449 lr_used = stub_entry->stub_offset + 8;
11450 if (stub_entry->stub_type == ppc_stub_long_branch_both
11451 || stub_entry->stub_type == ppc_stub_plt_branch_both
11452 || stub_entry->stub_type == ppc_stub_plt_call_both)
11453 lr_used += 4;
11454 delta = lr_used - stub_entry->group->lr_restore;
11455 stub_entry->group->lr_restore = lr_used + 8;
11456 eh = eh_advance (htab->elf.dynobj, eh, delta);
11457 *eh++ = DW_CFA_register;
11458 *eh++ = 65;
11459 *eh++ = 12;
11460 *eh++ = DW_CFA_advance_loc + 2;
11461 *eh++ = DW_CFA_restore_extended;
11462 *eh++ = 65;
11463 stub_entry->group->eh_size = eh - base;
11464 }
05d0e962
AM
11465 break;
11466
721956f4 11467 case ppc_stub_plt_call:
794e51c0 11468 case ppc_stub_plt_call_r2save:
e054468f 11469 if (stub_entry->h != NULL
b31867b6
AM
11470 && stub_entry->h->is_func_descriptor
11471 && stub_entry->h->oh != NULL)
c862ae31 11472 {
b31867b6
AM
11473 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11474
11475 /* If the old-ABI "dot-symbol" is undefined make it weak so
6f20ed8a 11476 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
8c5b4e52
AM
11477 if (fh->elf.root.type == bfd_link_hash_undefined
11478 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11479 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
b31867b6 11480 fh->elf.root.type = bfd_link_hash_undefweak;
c862ae31
AM
11481 }
11482
721956f4 11483 /* Now build the stub. */
1aa42141
AM
11484 targ = stub_entry->plt_ent->plt.offset & ~1;
11485 if (targ >= (bfd_vma) -2)
721956f4
AM
11486 abort ();
11487
33e44f2e 11488 plt = htab->elf.splt;
25f23106
AM
11489 if (!htab->elf.dynamic_sections_created
11490 || stub_entry->h == NULL
11491 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11492 {
11493 if (stub_entry->symtype == STT_GNU_IFUNC)
11494 plt = htab->elf.iplt;
11495 else
11496 plt = htab->pltlocal;
11497 }
1aa42141 11498 targ += plt->output_offset + plt->output_section->vma;
e054468f 11499
1aa42141
AM
11500 off = (elf_gp (info->output_bfd)
11501 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11502 off = targ - off;
721956f4 11503
ad8e1ba5 11504 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 11505 {
25f53a85 11506 info->callbacks->einfo
695344c0 11507 /* xgettext:c-format */
c1c8c1ef 11508 (_("%P: linkage table error against `%pT'\n"),
e054468f
AM
11509 stub_entry->h != NULL
11510 ? stub_entry->h->elf.root.root.string
11511 : "<local sym>");
721956f4 11512 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11513 htab->stub_error = TRUE;
11514 return FALSE;
721956f4
AM
11515 }
11516
176a0d42
AM
11517 r = NULL;
11518 if (info->emitrelocations)
11519 {
6f20ed8a 11520 r = get_relocs (stub_entry->group->stub_sec,
3ba720c7
AM
11521 ((PPC_HA (off) != 0)
11522 + (htab->opd_abi
e7d1c40c 11523 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
11524 && PPC_HA (off + 16) == PPC_HA (off))
11525 : 1)));
176a0d42
AM
11526 if (r == NULL)
11527 return FALSE;
6f20ed8a 11528 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11529 if (bfd_big_endian (info->output_bfd))
11530 r[0].r_offset += 2;
1aa42141 11531 r[0].r_addend = targ;
176a0d42 11532 }
a7f2871e 11533 if (stub_entry->h != NULL
ed7007c1 11534 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 11535 && htab->params->tls_get_addr_opt)
794e51c0 11536 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 11537 else
794e51c0 11538 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
11539 break;
11540
a4b6fadd
AM
11541 case ppc_stub_save_res:
11542 return TRUE;
11543
721956f4
AM
11544 default:
11545 BFD_FAIL ();
b34976b6 11546 return FALSE;
721956f4
AM
11547 }
11548
1aa42141 11549 stub_entry->group->stub_sec->size = stub_entry->stub_offset + (p - loc);
97b639ba 11550
e7d1c40c 11551 if (htab->params->emit_stub_syms)
97b639ba
AM
11552 {
11553 struct elf_link_hash_entry *h;
ee75fd95
AM
11554 size_t len1, len2;
11555 char *name;
11556 const char *const stub_str[] = { "long_branch",
05d0e962
AM
11557 "long_branch",
11558 "long_branch",
3f6ff479
AM
11559 "long_branch",
11560 "plt_branch",
ee75fd95 11561 "plt_branch",
05d0e962
AM
11562 "plt_branch",
11563 "plt_branch",
11564 "plt_call",
11565 "plt_call",
794e51c0 11566 "plt_call",
ee75fd95
AM
11567 "plt_call" };
11568
11569 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11570 len2 = strlen (stub_entry->root.string);
11571 name = bfd_malloc (len1 + len2 + 2);
11572 if (name == NULL)
11573 return FALSE;
11574 memcpy (name, stub_entry->root.string, 9);
11575 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11576 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11577 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
11578 if (h == NULL)
11579 return FALSE;
11580 if (h->root.type == bfd_link_hash_new)
11581 {
11582 h->root.type = bfd_link_hash_defined;
6f20ed8a 11583 h->root.u.def.section = stub_entry->group->stub_sec;
97b639ba 11584 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
11585 h->ref_regular = 1;
11586 h->def_regular = 1;
11587 h->ref_regular_nonweak = 1;
11588 h->forced_local = 1;
11589 h->non_elf = 0;
2ec55de3 11590 h->root.linker_def = 1;
97b639ba
AM
11591 }
11592 }
11593
b34976b6 11594 return TRUE;
721956f4
AM
11595}
11596
11597/* As above, but don't actually build the stub. Just bump offset so
11598 we know stub section sizes, and select plt_branch stubs where
11599 long_branch stubs won't do. */
11600
b34976b6 11601static bfd_boolean
4ce794b7 11602ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
11603{
11604 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 11605 struct bfd_link_info *info;
721956f4 11606 struct ppc_link_hash_table *htab;
f891966f
AM
11607 asection *plt;
11608 bfd_vma targ, off, r2off;
04bdff6a 11609 unsigned int size, extra, lr_used, delta, odd;
721956f4
AM
11610
11611 /* Massage our args to the form they really have. */
11612 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
11613 info = in_arg;
11614
11615 htab = ppc_hash_table (info);
4dfe6ac6
NC
11616 if (htab == NULL)
11617 return FALSE;
721956f4 11618
1aa42141
AM
11619 /* Make a note of the offset within the stubs for this entry. */
11620 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11621
a4b6fadd
AM
11622 if (stub_entry->h != NULL
11623 && stub_entry->h->save_res
11624 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11625 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11626 {
11627 /* Don't make stubs to out-of-line register save/restore
11628 functions. Instead, emit copies of the functions. */
11629 stub_entry->group->needs_save_res = 1;
11630 stub_entry->stub_type = ppc_stub_save_res;
11631 return TRUE;
11632 }
11633
f891966f 11634 switch (stub_entry->stub_type)
721956f4 11635 {
f891966f
AM
11636 case ppc_stub_plt_branch:
11637 case ppc_stub_plt_branch_r2off:
11638 /* Reset the stub type from the plt branch variant in case we now
11639 can reach with a shorter stub. */
11640 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11641 /* Fall through. */
11642 case ppc_stub_long_branch:
11643 case ppc_stub_long_branch_r2off:
1aa42141
AM
11644 targ = (stub_entry->target_value
11645 + stub_entry->target_section->output_offset
11646 + stub_entry->target_section->output_section->vma);
f891966f 11647 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
1aa42141
AM
11648 off = (stub_entry->stub_offset
11649 + stub_entry->group->stub_sec->output_offset
11650 + stub_entry->group->stub_sec->output_section->vma);
721956f4 11651
ad8e1ba5 11652 size = 4;
f891966f 11653 r2off = 0;
ad8e1ba5
AM
11654 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11655 {
25f53a85 11656 r2off = get_r2off (info, stub_entry);
a7c49797 11657 if (r2off == (bfd_vma) -1)
aa374f67
AM
11658 {
11659 htab->stub_error = TRUE;
11660 return FALSE;
11661 }
a7c49797 11662 size = 8;
ac2df442 11663 if (PPC_HA (r2off) != 0)
a7c49797
AM
11664 size += 4;
11665 if (PPC_LO (r2off) != 0)
11666 size += 4;
1aa42141 11667 off += size - 4;
ad8e1ba5 11668 }
1aa42141 11669 off = targ - off;
ad8e1ba5 11670
f891966f
AM
11671 /* If the branch offset is too big, use a ppc_stub_plt_branch.
11672 Do the same for -R objects without function descriptors. */
11673 if ((stub_entry->stub_type == ppc_stub_long_branch_r2off
11674 && r2off == 0
11675 && htab->sec_info[stub_entry->target_section->id].toc_off == 0)
11676 || off + (1 << 25) >= (bfd_vma) (1 << 26))
721956f4 11677 {
f891966f 11678 struct ppc_branch_hash_entry *br_entry;
df136d64 11679
f891966f
AM
11680 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11681 stub_entry->root.string + 9,
11682 TRUE, FALSE);
11683 if (br_entry == NULL)
721956f4 11684 {
f891966f
AM
11685 _bfd_error_handler (_("can't build branch stub `%s'"),
11686 stub_entry->root.string);
11687 htab->stub_error = TRUE;
11688 return FALSE;
721956f4
AM
11689 }
11690
f891966f 11691 if (br_entry->iter != htab->stub_iteration)
721956f4 11692 {
f891966f
AM
11693 br_entry->iter = htab->stub_iteration;
11694 br_entry->offset = htab->brlt->size;
11695 htab->brlt->size += 8;
63bc6f6c 11696
f891966f
AM
11697 if (htab->relbrlt != NULL)
11698 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11699 else if (info->emitrelocations)
84f5d08e 11700 {
f891966f
AM
11701 htab->brlt->reloc_count += 1;
11702 htab->brlt->flags |= SEC_RELOC;
05d0e962 11703 }
f891966f 11704 }
ac2df442 11705
f891966f
AM
11706 targ = (br_entry->offset
11707 + htab->brlt->output_offset
11708 + htab->brlt->output_section->vma);
11709 off = (elf_gp (info->output_bfd)
11710 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11711 off = targ - off;
176a0d42 11712
f891966f
AM
11713 if (info->emitrelocations)
11714 {
11715 stub_entry->group->stub_sec->reloc_count
11716 += 1 + (PPC_HA (off) != 0);
11717 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11718 }
05d0e962 11719
f891966f
AM
11720 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11721 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11722 {
11723 size = 12;
11724 if (PPC_HA (off) != 0)
11725 size = 16;
ac2df442 11726 }
f891966f 11727 else
ac2df442 11728 {
f891966f
AM
11729 size = 16;
11730 if (PPC_HA (off) != 0)
11731 size += 4;
11732
11733 if (PPC_HA (r2off) != 0)
11734 size += 4;
11735 if (PPC_LO (r2off) != 0)
11736 size += 4;
ac2df442 11737 }
721956f4 11738 }
f891966f
AM
11739 else if (info->emitrelocations)
11740 {
11741 stub_entry->group->stub_sec->reloc_count += 1;
11742 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11743 }
11744 break;
11745
11746 case ppc_stub_plt_branch_notoc:
11747 case ppc_stub_plt_branch_both:
11748 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11749 /* Fall through. */
11750 case ppc_stub_long_branch_notoc:
11751 case ppc_stub_long_branch_both:
11752 off = (stub_entry->stub_offset
11753 + stub_entry->group->stub_sec->output_offset
11754 + stub_entry->group->stub_sec->output_section->vma);
11755 size = 0;
11756 if (stub_entry->stub_type == ppc_stub_long_branch_both)
11757 size = 4;
11758 off += size;
11759 targ = (stub_entry->target_value
11760 + stub_entry->target_section->output_offset
11761 + stub_entry->target_section->output_section->vma);
04bdff6a 11762 odd = off & 4;
f891966f
AM
11763 off = targ - off;
11764
3d58e1fc
AM
11765 if (info->emitrelocations)
11766 {
04bdff6a
AM
11767 unsigned int num_rel;
11768 if (htab->powerxx_stubs)
11769 num_rel = num_relocs_for_powerxx_offset (off, odd);
11770 else
11771 num_rel = num_relocs_for_offset (off - 8);
11772 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
11773 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11774 }
11775
04bdff6a
AM
11776 if (htab->powerxx_stubs)
11777 extra = size_powerxx_offset (off, odd);
11778 else
11779 extra = size_offset (off - 8);
f891966f
AM
11780 /* Include branch insn plus those in the offset sequence. */
11781 size += 4 + extra;
11782 /* The branch insn is at the end, or "extra" bytes along. So
11783 its offset will be "extra" bytes less that that already
11784 calculated. */
11785 off -= extra;
11786
04bdff6a
AM
11787 if (!htab->powerxx_stubs)
11788 {
11789 /* After the bcl, lr has been modified so we need to emit
11790 .eh_frame info saying the return address is in r12. */
11791 lr_used = stub_entry->stub_offset + 8;
11792 if (stub_entry->stub_type == ppc_stub_long_branch_both)
11793 lr_used += 4;
11794 /* The eh_frame info will consist of a DW_CFA_advance_loc or
11795 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
11796 DW_CFA_restore_extended 65. */
11797 delta = lr_used - stub_entry->group->lr_restore;
11798 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11799 stub_entry->group->lr_restore = lr_used + 8;
11800 }
f891966f
AM
11801
11802 /* If the branch can't reach, use a plt_branch. */
11803 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11804 {
11805 stub_entry->stub_type += (ppc_stub_plt_branch_notoc
11806 - ppc_stub_long_branch_notoc);
11807 size += 4;
11808 }
3d58e1fc
AM
11809 else if (info->emitrelocations)
11810 stub_entry->group->stub_sec->reloc_count +=1;
f891966f
AM
11811 break;
11812
11813 case ppc_stub_plt_call_notoc:
11814 case ppc_stub_plt_call_both:
11815 off = (stub_entry->stub_offset
11816 + stub_entry->group->stub_sec->output_offset
11817 + stub_entry->group->stub_sec->output_section->vma);
11818 if (stub_entry->stub_type == ppc_stub_plt_call_both)
11819 off += 4;
11820 targ = stub_entry->plt_ent->plt.offset & ~1;
11821 if (targ >= (bfd_vma) -2)
11822 abort ();
11823
11824 plt = htab->elf.splt;
11825 if (!htab->elf.dynamic_sections_created
11826 || stub_entry->h == NULL
11827 || stub_entry->h->elf.dynindx == -1)
11828 {
11829 if (stub_entry->symtype == STT_GNU_IFUNC)
11830 plt = htab->elf.iplt;
11831 else
11832 plt = htab->pltlocal;
11833 }
11834 targ += plt->output_offset + plt->output_section->vma;
04bdff6a 11835 odd = off & 4;
f891966f
AM
11836 off = targ - off;
11837
11838 if (htab->params->plt_stub_align != 0)
11839 {
11840 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11841
11842 stub_entry->group->stub_sec->size += pad;
11843 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11844 off -= pad;
11845 }
11846
3d58e1fc
AM
11847 if (info->emitrelocations)
11848 {
04bdff6a
AM
11849 unsigned int num_rel;
11850 if (htab->powerxx_stubs)
11851 num_rel = num_relocs_for_powerxx_offset (off, odd);
11852 else
11853 num_rel = num_relocs_for_offset (off - 8);
11854 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
11855 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11856 }
11857
f891966f
AM
11858 size = plt_stub_size (htab, stub_entry, off);
11859
04bdff6a
AM
11860 if (!htab->powerxx_stubs)
11861 {
11862 /* After the bcl, lr has been modified so we need to emit
11863 .eh_frame info saying the return address is in r12. */
11864 lr_used = stub_entry->stub_offset + 8;
11865 if (stub_entry->stub_type == ppc_stub_plt_call_both)
11866 lr_used += 4;
11867 /* The eh_frame info will consist of a DW_CFA_advance_loc or
11868 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
11869 DW_CFA_restore_extended 65. */
11870 delta = lr_used - stub_entry->group->lr_restore;
11871 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11872 stub_entry->group->lr_restore = lr_used + 8;
11873 }
f891966f
AM
11874 break;
11875
11876 case ppc_stub_plt_call:
11877 case ppc_stub_plt_call_r2save:
11878 targ = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
11879 if (targ >= (bfd_vma) -2)
11880 abort ();
11881 plt = htab->elf.splt;
11882 if (!htab->elf.dynamic_sections_created
11883 || stub_entry->h == NULL
11884 || stub_entry->h->elf.dynindx == -1)
11885 {
11886 if (stub_entry->symtype == STT_GNU_IFUNC)
11887 plt = htab->elf.iplt;
11888 else
11889 plt = htab->pltlocal;
11890 }
11891 targ += plt->output_offset + plt->output_section->vma;
11892
11893 off = (elf_gp (info->output_bfd)
11894 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11895 off = targ - off;
11896
11897 if (htab->params->plt_stub_align != 0)
11898 {
11899 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11900
11901 stub_entry->group->stub_sec->size += pad;
11902 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11903 }
11904
11905 if (info->emitrelocations)
11906 {
11907 stub_entry->group->stub_sec->reloc_count
11908 += ((PPC_HA (off) != 0)
11909 + (htab->opd_abi
11910 ? 2 + (htab->params->plt_static_chain
11911 && PPC_HA (off + 16) == PPC_HA (off))
11912 : 1));
11913 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11914 }
11915
11916 size = plt_stub_size (htab, stub_entry, off);
11917
11918 if (stub_entry->h != NULL
ed7007c1 11919 && is_tls_get_addr (&stub_entry->h->elf, htab)
f891966f
AM
11920 && htab->params->tls_get_addr_opt
11921 && stub_entry->stub_type == ppc_stub_plt_call_r2save)
11922 {
11923 /* After the bctrl, lr has been modified so we need to
11924 emit .eh_frame info saying the return address is
11925 on the stack. In fact we put the EH info specifying
11926 that the return address is on the stack *at* the
11927 call rather than after it, because the EH info for a
11928 call needs to be specified by that point.
11929 See libgcc/unwind-dw2.c execute_cfa_program. */
11930 lr_used = stub_entry->stub_offset + size - 20;
11931 /* The eh_frame info will consist of a DW_CFA_advance_loc
11932 or variant, DW_CFA_offset_externed_sf, 65, -stackoff,
11933 DW_CFA_advance_loc+4, DW_CFA_restore_extended, 65. */
11934 delta = lr_used - stub_entry->group->lr_restore;
11935 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11936 stub_entry->group->lr_restore = size - 4;
11937 }
11938 break;
11939
11940 default:
11941 BFD_FAIL ();
11942 return FALSE;
721956f4
AM
11943 }
11944
6f20ed8a 11945 stub_entry->group->stub_sec->size += size;
b34976b6 11946 return TRUE;
721956f4
AM
11947}
11948
11949/* Set up various things so that we can make a list of input sections
11950 for each output section included in the link. Returns -1 on error,
cedb70c5 11951 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
11952
11953int
e7d1c40c 11954ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4 11955{
6f20ed8a 11956 unsigned int id;
721956f4
AM
11957 bfd_size_type amt;
11958 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11959
4dfe6ac6
NC
11960 if (htab == NULL)
11961 return -1;
4c52953f 11962
7cf7fcc8 11963 htab->sec_info_arr_size = _bfd_section_id;
6f20ed8a
AM
11964 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
11965 htab->sec_info = bfd_zmalloc (amt);
11966 if (htab->sec_info == NULL)
721956f4
AM
11967 return -1;
11968
3d6f9012
AM
11969 /* Set toc_off for com, und, abs and ind sections. */
11970 for (id = 0; id < 3; id++)
6f20ed8a 11971 htab->sec_info[id].toc_off = TOC_BASE_OFF;
734b6cf9 11972
721956f4
AM
11973 return 1;
11974}
11975
927be08e
AM
11976/* Set up for first pass at multitoc partitioning. */
11977
11978void
11979ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11980{
11981 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11982
1c865ab2 11983 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
11984 htab->toc_bfd = NULL;
11985 htab->toc_first_sec = NULL;
11986}
11987
e717da7e
AM
11988/* The linker repeatedly calls this function for each TOC input section
11989 and linker generated GOT section. Group input bfds such that the toc
927be08e 11990 within a group is less than 64k in size. */
ad8e1ba5 11991
927be08e 11992bfd_boolean
4ce794b7 11993ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
11994{
11995 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 11996 bfd_vma addr, off, limit;
ad8e1ba5 11997
4dfe6ac6
NC
11998 if (htab == NULL)
11999 return FALSE;
12000
927be08e 12001 if (!htab->second_toc_pass)
4c52953f 12002 {
927be08e 12003 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
12004 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
12005
12006 if (new_bfd)
bf102f86
AM
12007 {
12008 htab->toc_bfd = isec->owner;
12009 htab->toc_first_sec = isec;
12010 }
927be08e 12011
bf102f86
AM
12012 addr = isec->output_offset + isec->output_section->vma;
12013 off = addr - htab->toc_curr;
d77c8a4b
AM
12014 limit = 0x80008000;
12015 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
12016 limit = 0x10000;
12017 if (off + isec->size > limit)
bf102f86
AM
12018 {
12019 addr = (htab->toc_first_sec->output_offset
12020 + htab->toc_first_sec->output_section->vma);
12021 htab->toc_curr = addr;
a27e685f 12022 htab->toc_curr &= -TOC_BASE_ALIGN;
bf102f86 12023 }
99877b66 12024
927be08e
AM
12025 /* toc_curr is the base address of this toc group. Set elf_gp
12026 for the input section to be the offset relative to the
12027 output toc base plus 0x8000. Making the input elf_gp an
12028 offset allows us to move the toc as a whole without
12029 recalculating input elf_gp. */
06bcf541 12030 off = htab->toc_curr - elf_gp (info->output_bfd);
927be08e
AM
12031 off += TOC_BASE_OFF;
12032
12033 /* Die if someone uses a linker script that doesn't keep input
12034 file .toc and .got together. */
a4fd3de5
AM
12035 if (new_bfd
12036 && elf_gp (isec->owner) != 0
927be08e
AM
12037 && elf_gp (isec->owner) != off)
12038 return FALSE;
12039
12040 elf_gp (isec->owner) = off;
12041 return TRUE;
4c52953f 12042 }
927be08e
AM
12043
12044 /* During the second pass toc_first_sec points to the start of
12045 a toc group, and toc_curr is used to track the old elf_gp.
12046 We use toc_bfd to ensure we only look at each bfd once. */
12047 if (htab->toc_bfd == isec->owner)
12048 return TRUE;
12049 htab->toc_bfd = isec->owner;
12050
12051 if (htab->toc_first_sec == NULL
12052 || htab->toc_curr != elf_gp (isec->owner))
12053 {
12054 htab->toc_curr = elf_gp (isec->owner);
12055 htab->toc_first_sec = isec;
12056 }
12057 addr = (htab->toc_first_sec->output_offset
12058 + htab->toc_first_sec->output_section->vma);
06bcf541 12059 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
927be08e
AM
12060 elf_gp (isec->owner) = off;
12061
12062 return TRUE;
ad8e1ba5
AM
12063}
12064
927be08e
AM
12065/* Called via elf_link_hash_traverse to merge GOT entries for global
12066 symbol H. */
12067
12068static bfd_boolean
12069merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12070{
12071 if (h->root.type == bfd_link_hash_indirect)
12072 return TRUE;
12073
927be08e
AM
12074 merge_got_entries (&h->got.glist);
12075
12076 return TRUE;
12077}
12078
12079/* Called via elf_link_hash_traverse to allocate GOT entries for global
12080 symbol H. */
12081
12082static bfd_boolean
12083reallocate_got (struct elf_link_hash_entry *h, void *inf)
12084{
12085 struct got_entry *gent;
12086
12087 if (h->root.type == bfd_link_hash_indirect)
12088 return TRUE;
12089
927be08e
AM
12090 for (gent = h->got.glist; gent != NULL; gent = gent->next)
12091 if (!gent->is_indirect)
12092 allocate_got (h, (struct bfd_link_info *) inf, gent);
12093 return TRUE;
12094}
12095
12096/* Called on the first multitoc pass after the last call to
12097 ppc64_elf_next_toc_section. This function removes duplicate GOT
12098 entries. */
12099
12100bfd_boolean
12101ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
12102{
12103 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
12104 struct bfd *ibfd, *ibfd2;
12105 bfd_boolean done_something;
12106
12107 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 12108
7865406b
AM
12109 if (!htab->do_multi_toc)
12110 return FALSE;
12111
d0fae19d 12112 /* Merge global sym got entries within a toc group. */
927be08e
AM
12113 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
12114
12115 /* And tlsld_got. */
c72f2fb2 12116 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12117 {
12118 struct got_entry *ent, *ent2;
12119
12120 if (!is_ppc64_elf (ibfd))
12121 continue;
12122
12123 ent = ppc64_tlsld_got (ibfd);
12124 if (!ent->is_indirect
12125 && ent->got.offset != (bfd_vma) -1)
12126 {
c72f2fb2 12127 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
12128 {
12129 if (!is_ppc64_elf (ibfd2))
12130 continue;
12131
12132 ent2 = ppc64_tlsld_got (ibfd2);
12133 if (!ent2->is_indirect
12134 && ent2->got.offset != (bfd_vma) -1
12135 && elf_gp (ibfd2) == elf_gp (ibfd))
12136 {
12137 ent2->is_indirect = TRUE;
12138 ent2->got.ent = ent;
12139 }
12140 }
12141 }
12142 }
12143
12144 /* Zap sizes of got sections. */
33e44f2e
AM
12145 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
12146 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
12147 htab->got_reli_size = 0;
12148
c72f2fb2 12149 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12150 {
12151 asection *got, *relgot;
12152
12153 if (!is_ppc64_elf (ibfd))
12154 continue;
12155
12156 got = ppc64_elf_tdata (ibfd)->got;
12157 if (got != NULL)
12158 {
12159 got->rawsize = got->size;
12160 got->size = 0;
12161 relgot = ppc64_elf_tdata (ibfd)->relgot;
12162 relgot->rawsize = relgot->size;
12163 relgot->size = 0;
12164 }
12165 }
12166
12167 /* Now reallocate the got, local syms first. We don't need to
12168 allocate section contents again since we never increase size. */
c72f2fb2 12169 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12170 {
12171 struct got_entry **lgot_ents;
12172 struct got_entry **end_lgot_ents;
12173 struct plt_entry **local_plt;
12174 struct plt_entry **end_local_plt;
f961d9dd 12175 unsigned char *lgot_masks;
927be08e
AM
12176 bfd_size_type locsymcount;
12177 Elf_Internal_Shdr *symtab_hdr;
19e08130 12178 asection *s;
927be08e
AM
12179
12180 if (!is_ppc64_elf (ibfd))
12181 continue;
12182
12183 lgot_ents = elf_local_got_ents (ibfd);
12184 if (!lgot_ents)
12185 continue;
12186
12187 symtab_hdr = &elf_symtab_hdr (ibfd);
12188 locsymcount = symtab_hdr->sh_info;
12189 end_lgot_ents = lgot_ents + locsymcount;
12190 local_plt = (struct plt_entry **) end_lgot_ents;
12191 end_local_plt = local_plt + locsymcount;
f961d9dd 12192 lgot_masks = (unsigned char *) end_local_plt;
927be08e 12193 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
12194 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
12195 {
12196 struct got_entry *ent;
12197
12198 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 12199 {
19e08130
AM
12200 unsigned int ent_size = 8;
12201 unsigned int rel_size = sizeof (Elf64_External_Rela);
12202
d0fae19d
AM
12203 ent->got.offset = s->size;
12204 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 12205 {
19e08130
AM
12206 ent_size *= 2;
12207 rel_size *= 2;
12208 }
12209 s->size += ent_size;
37da22e5 12210 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 12211 {
33e44f2e 12212 htab->elf.irelplt->size += rel_size;
19e08130
AM
12213 htab->got_reli_size += rel_size;
12214 }
6a3858a6 12215 else if (bfd_link_pic (info)
f749f26e 12216 && !(ent->tls_type != 0
6a3858a6 12217 && bfd_link_executable (info)))
19e08130
AM
12218 {
12219 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12220 srel->size += rel_size;
d0fae19d
AM
12221 }
12222 }
927be08e
AM
12223 }
12224 }
12225
12226 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
12227
c72f2fb2 12228 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12229 {
12230 struct got_entry *ent;
12231
12232 if (!is_ppc64_elf (ibfd))
12233 continue;
12234
12235 ent = ppc64_tlsld_got (ibfd);
12236 if (!ent->is_indirect
12237 && ent->got.offset != (bfd_vma) -1)
12238 {
12239 asection *s = ppc64_elf_tdata (ibfd)->got;
12240 ent->got.offset = s->size;
12241 s->size += 16;
f749f26e 12242 if (bfd_link_dll (info))
927be08e
AM
12243 {
12244 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12245 srel->size += sizeof (Elf64_External_Rela);
12246 }
12247 }
12248 }
12249
33e44f2e 12250 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 12251 if (!done_something)
c72f2fb2 12252 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12253 {
12254 asection *got;
12255
12256 if (!is_ppc64_elf (ibfd))
12257 continue;
12258
12259 got = ppc64_elf_tdata (ibfd)->got;
12260 if (got != NULL)
12261 {
12262 done_something = got->rawsize != got->size;
12263 if (done_something)
12264 break;
12265 }
12266 }
12267
12268 if (done_something)
e7d1c40c 12269 (*htab->params->layout_sections_again) ();
927be08e
AM
12270
12271 /* Set up for second pass over toc sections to recalculate elf_gp
12272 on input sections. */
12273 htab->toc_bfd = NULL;
12274 htab->toc_first_sec = NULL;
12275 htab->second_toc_pass = TRUE;
12276 return done_something;
12277}
12278
12279/* Called after second pass of multitoc partitioning. */
12280
12281void
12282ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
12283{
12284 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12285
12286 /* After the second pass, toc_curr tracks the TOC offset used
12287 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 12288 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
12289}
12290
9b5ecbd0
AM
12291/* No toc references were found in ISEC. If the code in ISEC makes no
12292 calls, then there's no need to use toc adjusting stubs when branching
12293 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
12294 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
12295 needed, and 2 if a cyclical call-graph was found but no other reason
12296 for a stub was detected. If called from the top level, a return of
12297 2 means the same as a return of 0. */
9b5ecbd0
AM
12298
12299static int
4ce794b7 12300toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 12301{
9b5ecbd0 12302 int ret;
70cc837d
AM
12303
12304 /* Mark this section as checked. */
12305 isec->call_check_done = 1;
9b5ecbd0 12306
772119ce
AM
12307 /* We know none of our code bearing sections will need toc stubs. */
12308 if ((isec->flags & SEC_LINKER_CREATED) != 0)
12309 return 0;
12310
eea6121a 12311 if (isec->size == 0)
082c50f8
AM
12312 return 0;
12313
4c52953f
AM
12314 if (isec->output_section == NULL)
12315 return 0;
12316
4c52953f 12317 ret = 0;
70cc837d 12318 if (isec->reloc_count != 0)
9b5ecbd0 12319 {
70cc837d
AM
12320 Elf_Internal_Rela *relstart, *rel;
12321 Elf_Internal_Sym *local_syms;
12322 struct ppc_link_hash_table *htab;
2917689a 12323
70cc837d
AM
12324 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
12325 info->keep_memory);
12326 if (relstart == NULL)
12327 return -1;
90aecf7a 12328
70cc837d
AM
12329 /* Look for branches to outside of this section. */
12330 local_syms = NULL;
12331 htab = ppc_hash_table (info);
12332 if (htab == NULL)
12333 return -1;
4c52953f 12334
70cc837d 12335 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 12336 {
70cc837d
AM
12337 enum elf_ppc64_reloc_type r_type;
12338 unsigned long r_symndx;
12339 struct elf_link_hash_entry *h;
12340 struct ppc_link_hash_entry *eh;
12341 Elf_Internal_Sym *sym;
12342 asection *sym_sec;
12343 struct _opd_sec_data *opd;
12344 bfd_vma sym_value;
12345 bfd_vma dest;
12346
12347 r_type = ELF64_R_TYPE (rel->r_info);
12348 if (r_type != R_PPC64_REL24
05d0e962 12349 && r_type != R_PPC64_REL24_NOTOC
70cc837d
AM
12350 && r_type != R_PPC64_REL14
12351 && r_type != R_PPC64_REL14_BRTAKEN
23cedd1d 12352 && r_type != R_PPC64_REL14_BRNTAKEN
5663e321
AM
12353 && r_type != R_PPC64_PLTCALL
12354 && r_type != R_PPC64_PLTCALL_NOTOC)
70cc837d 12355 continue;
4c52953f 12356
70cc837d
AM
12357 r_symndx = ELF64_R_SYM (rel->r_info);
12358 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
12359 isec->owner))
4c52953f 12360 {
70cc837d
AM
12361 ret = -1;
12362 break;
12363 }
4c52953f 12364
70cc837d
AM
12365 /* Calls to dynamic lib functions go through a plt call stub
12366 that uses r2. */
ed7007c1 12367 eh = ppc_elf_hash_entry (h);
70cc837d
AM
12368 if (eh != NULL
12369 && (eh->elf.plt.plist != NULL
12370 || (eh->oh != NULL
12371 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
12372 {
12373 ret = 1;
12374 break;
4c52953f
AM
12375 }
12376
70cc837d
AM
12377 if (sym_sec == NULL)
12378 /* Ignore other undefined symbols. */
4c52953f 12379 continue;
4c52953f 12380
70cc837d
AM
12381 /* Assume branches to other sections not included in the
12382 link need stubs too, to cover -R and absolute syms. */
12383 if (sym_sec->output_section == NULL)
12384 {
12385 ret = 1;
12386 break;
12387 }
4c52953f 12388
70cc837d
AM
12389 if (h == NULL)
12390 sym_value = sym->st_value;
12391 else
12392 {
12393 if (h->root.type != bfd_link_hash_defined
12394 && h->root.type != bfd_link_hash_defweak)
12395 abort ();
12396 sym_value = h->root.u.def.value;
12397 }
12398 sym_value += rel->r_addend;
4c52953f 12399
70cc837d
AM
12400 /* If this branch reloc uses an opd sym, find the code section. */
12401 opd = get_opd_info (sym_sec);
12402 if (opd != NULL)
12403 {
12404 if (h == NULL && opd->adjust != NULL)
12405 {
12406 long adjust;
4c52953f 12407
92a9c616 12408 adjust = opd->adjust[OPD_NDX (sym_value)];
70cc837d
AM
12409 if (adjust == -1)
12410 /* Assume deleted functions won't ever be called. */
12411 continue;
12412 sym_value += adjust;
12413 }
4c52953f 12414
aef36ac1
AM
12415 dest = opd_entry_value (sym_sec, sym_value,
12416 &sym_sec, NULL, FALSE);
70cc837d
AM
12417 if (dest == (bfd_vma) -1)
12418 continue;
12419 }
12420 else
12421 dest = (sym_value
12422 + sym_sec->output_offset
12423 + sym_sec->output_section->vma);
4c52953f 12424
70cc837d
AM
12425 /* Ignore branch to self. */
12426 if (sym_sec == isec)
12427 continue;
4c52953f 12428
70cc837d
AM
12429 /* If the called function uses the toc, we need a stub. */
12430 if (sym_sec->has_toc_reloc
12431 || sym_sec->makes_toc_func_call)
4c52953f 12432 {
70cc837d 12433 ret = 1;
4c52953f
AM
12434 break;
12435 }
70cc837d
AM
12436
12437 /* Assume any branch that needs a long branch stub might in fact
12438 need a plt_branch stub. A plt_branch stub uses r2. */
12439 else if (dest - (isec->output_offset
12440 + isec->output_section->vma
6911b7dc
AM
12441 + rel->r_offset) + (1 << 25)
12442 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
12443 ? h->other
12444 : sym->st_other))
4c52953f 12445 {
70cc837d
AM
12446 ret = 1;
12447 break;
12448 }
12449
12450 /* If calling back to a section in the process of being
12451 tested, we can't say for sure that no toc adjusting stubs
12452 are needed, so don't return zero. */
12453 else if (sym_sec->call_check_in_progress)
12454 ret = 2;
12455
12456 /* Branches to another section that itself doesn't have any TOC
12457 references are OK. Recursively call ourselves to check. */
12458 else if (!sym_sec->call_check_done)
12459 {
12460 int recur;
12461
12462 /* Mark current section as indeterminate, so that other
12463 sections that call back to current won't be marked as
12464 known. */
12465 isec->call_check_in_progress = 1;
12466 recur = toc_adjusting_stub_needed (info, sym_sec);
12467 isec->call_check_in_progress = 0;
12468
4c52953f
AM
12469 if (recur != 0)
12470 {
70cc837d
AM
12471 ret = recur;
12472 if (recur != 2)
12473 break;
4c52953f
AM
12474 }
12475 }
4c52953f 12476 }
70cc837d
AM
12477
12478 if (local_syms != NULL
12479 && (elf_symtab_hdr (isec->owner).contents
12480 != (unsigned char *) local_syms))
12481 free (local_syms);
12482 if (elf_section_data (isec)->relocs != relstart)
12483 free (relstart);
9b5ecbd0
AM
12484 }
12485
70cc837d
AM
12486 if ((ret & 1) == 0
12487 && isec->map_head.s != NULL
12488 && (strcmp (isec->output_section->name, ".init") == 0
12489 || strcmp (isec->output_section->name, ".fini") == 0))
12490 {
12491 if (isec->map_head.s->has_toc_reloc
12492 || isec->map_head.s->makes_toc_func_call)
12493 ret = 1;
12494 else if (!isec->map_head.s->call_check_done)
12495 {
12496 int recur;
12497 isec->call_check_in_progress = 1;
12498 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
12499 isec->call_check_in_progress = 0;
12500 if (recur != 0)
12501 ret = recur;
12502 }
12503 }
12504
12505 if (ret == 1)
12506 isec->makes_toc_func_call = 1;
4c52953f 12507
9b5ecbd0
AM
12508 return ret;
12509}
12510
721956f4
AM
12511/* The linker repeatedly calls this function for each input section,
12512 in the order that input sections are linked into output sections.
12513 Build lists of input sections to determine groupings between which
12514 we may insert linker stubs. */
12515
9b5ecbd0 12516bfd_boolean
4ce794b7 12517ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
12518{
12519 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12520
4dfe6ac6
NC
12521 if (htab == NULL)
12522 return FALSE;
12523
734b6cf9 12524 if ((isec->output_section->flags & SEC_CODE) != 0
6f20ed8a 12525 && isec->output_section->id < htab->sec_info_arr_size)
721956f4 12526 {
3d6f9012
AM
12527 /* This happens to make the list in reverse order,
12528 which is what we want. */
6f20ed8a
AM
12529 htab->sec_info[isec->id].u.list
12530 = htab->sec_info[isec->output_section->id].u.list;
12531 htab->sec_info[isec->output_section->id].u.list = isec;
721956f4 12532 }
ad8e1ba5 12533
4c52953f 12534 if (htab->multi_toc_needed)
9b5ecbd0 12535 {
8b974ba3
AM
12536 /* Analyse sections that aren't already flagged as needing a
12537 valid toc pointer. Exclude .fixup for the linux kernel.
12538 .fixup contains branches, but only back to the function that
12539 hit an exception. */
12540 if (!(isec->has_toc_reloc
12541 || (isec->flags & SEC_CODE) == 0
12542 || strcmp (isec->name, ".fixup") == 0
12543 || isec->call_check_done))
12544 {
12545 if (toc_adjusting_stub_needed (info, isec) < 0)
6683a28d 12546 return FALSE;
8b974ba3
AM
12547 }
12548 /* Make all sections use the TOC assigned for this object file.
12549 This will be wrong for pasted sections; We fix that in
12550 check_pasted_section(). */
12551 if (elf_gp (isec->owner) != 0)
12552 htab->toc_curr = elf_gp (isec->owner);
12553 }
12554
6f20ed8a 12555 htab->sec_info[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 12556 return TRUE;
721956f4
AM
12557}
12558
70cc837d
AM
12559/* Check that all .init and .fini sections use the same toc, if they
12560 have toc relocs. */
12561
12562static bfd_boolean
12563check_pasted_section (struct bfd_link_info *info, const char *name)
12564{
12565 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12566
12567 if (o != NULL)
12568 {
12569 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12570 bfd_vma toc_off = 0;
12571 asection *i;
12572
12573 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12574 if (i->has_toc_reloc)
12575 {
12576 if (toc_off == 0)
6f20ed8a
AM
12577 toc_off = htab->sec_info[i->id].toc_off;
12578 else if (toc_off != htab->sec_info[i->id].toc_off)
70cc837d
AM
12579 return FALSE;
12580 }
6683a28d
AM
12581
12582 if (toc_off == 0)
12583 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12584 if (i->makes_toc_func_call)
12585 {
6f20ed8a 12586 toc_off = htab->sec_info[i->id].toc_off;
6683a28d
AM
12587 break;
12588 }
12589
70cc837d
AM
12590 /* Make sure the whole pasted function uses the same toc offset. */
12591 if (toc_off != 0)
12592 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
6f20ed8a 12593 htab->sec_info[i->id].toc_off = toc_off;
70cc837d
AM
12594 }
12595 return TRUE;
12596}
12597
12598bfd_boolean
12599ppc64_elf_check_init_fini (struct bfd_link_info *info)
12600{
12601 return (check_pasted_section (info, ".init")
12602 & check_pasted_section (info, ".fini"));
12603}
12604
721956f4
AM
12605/* See whether we can group stub sections together. Grouping stub
12606 sections may result in fewer stubs. More importantly, we need to
12607 put all .init* and .fini* stubs at the beginning of the .init or
12608 .fini output sections respectively, because glibc splits the
12609 _init and _fini functions into multiple parts. Putting a stub in
12610 the middle of a function is not a good idea. */
12611
6f20ed8a
AM
12612static bfd_boolean
12613group_sections (struct bfd_link_info *info,
4ce794b7
AM
12614 bfd_size_type stub_group_size,
12615 bfd_boolean stubs_always_before_branch)
721956f4 12616{
6f20ed8a
AM
12617 struct ppc_link_hash_table *htab;
12618 asection *osec;
7c8fe5c4
AM
12619 bfd_boolean suppress_size_errors;
12620
6f20ed8a
AM
12621 htab = ppc_hash_table (info);
12622 if (htab == NULL)
12623 return FALSE;
12624
7c8fe5c4 12625 suppress_size_errors = FALSE;
7c8fe5c4
AM
12626 if (stub_group_size == 1)
12627 {
12628 /* Default values. */
12629 if (stubs_always_before_branch)
09f92717 12630 stub_group_size = 0x1e00000;
7c8fe5c4 12631 else
09f92717 12632 stub_group_size = 0x1c00000;
7c8fe5c4
AM
12633 suppress_size_errors = TRUE;
12634 }
12635
6f20ed8a 12636 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
721956f4 12637 {
6f20ed8a
AM
12638 asection *tail;
12639
12640 if (osec->id >= htab->sec_info_arr_size)
12641 continue;
12642
12643 tail = htab->sec_info[osec->id].u.list;
734b6cf9 12644 while (tail != NULL)
721956f4 12645 {
734b6cf9
AM
12646 asection *curr;
12647 asection *prev;
12648 bfd_size_type total;
12649 bfd_boolean big_sec;
12650 bfd_vma curr_toc;
6f20ed8a 12651 struct map_stub *group;
09f92717 12652 bfd_size_type group_size;
734b6cf9
AM
12653
12654 curr = tail;
eea6121a 12655 total = tail->size;
09f92717
AM
12656 group_size = (ppc64_elf_section_data (tail) != NULL
12657 && ppc64_elf_section_data (tail)->has_14bit_branch
12658 ? stub_group_size >> 10 : stub_group_size);
12659
12660 big_sec = total > group_size;
7c8fe5c4 12661 if (big_sec && !suppress_size_errors)
695344c0 12662 /* xgettext:c-format */
871b3ab2 12663 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
4eca0228 12664 tail->owner, tail);
6f20ed8a 12665 curr_toc = htab->sec_info[tail->id].toc_off;
734b6cf9 12666
6f20ed8a 12667 while ((prev = htab->sec_info[curr->id].u.list) != NULL
734b6cf9 12668 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
12669 < (ppc64_elf_section_data (prev) != NULL
12670 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12671 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12672 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12673 curr = prev;
12674
12675 /* OK, the size from the start of CURR to the end is less
09f92717 12676 than group_size and thus can be handled by one stub
734b6cf9 12677 section. (or the tail section is itself larger than
09f92717
AM
12678 group_size, in which case we may be toast.) We should
12679 really be keeping track of the total size of stubs added
12680 here, as stubs contribute to the final output section
12681 size. That's a little tricky, and this way will only
12682 break if stubs added make the total size more than 2^25,
12683 ie. for the default stub_group_size, if stubs total more
12684 than 2097152 bytes, or nearly 75000 plt call stubs. */
6f20ed8a
AM
12685 group = bfd_alloc (curr->owner, sizeof (*group));
12686 if (group == NULL)
12687 return FALSE;
12688 group->link_sec = curr;
12689 group->stub_sec = NULL;
a4b6fadd 12690 group->needs_save_res = 0;
df136d64
AM
12691 group->lr_restore = 0;
12692 group->eh_size = 0;
12693 group->eh_base = 0;
a4b6fadd
AM
12694 group->next = htab->group;
12695 htab->group = group;
734b6cf9 12696 do
721956f4 12697 {
6f20ed8a 12698 prev = htab->sec_info[tail->id].u.list;
734b6cf9 12699 /* Set up this stub group. */
6f20ed8a 12700 htab->sec_info[tail->id].u.group = group;
721956f4 12701 }
734b6cf9
AM
12702 while (tail != curr && (tail = prev) != NULL);
12703
09f92717 12704 /* But wait, there's more! Input sections up to group_size
734b6cf9
AM
12705 bytes before the stub section can be handled by it too.
12706 Don't do this if we have a really large section after the
12707 stubs, as adding more stubs increases the chance that
12708 branches may not reach into the stub section. */
12709 if (!stubs_always_before_branch && !big_sec)
12710 {
12711 total = 0;
12712 while (prev != NULL
12713 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
12714 < (ppc64_elf_section_data (prev) != NULL
12715 && ppc64_elf_section_data (prev)->has_14bit_branch
2cdcc330
AM
12716 ? (group_size = stub_group_size >> 10)
12717 : group_size))
6f20ed8a 12718 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12719 {
12720 tail = prev;
6f20ed8a
AM
12721 prev = htab->sec_info[tail->id].u.list;
12722 htab->sec_info[tail->id].u.group = group;
734b6cf9
AM
12723 }
12724 }
12725 tail = prev;
721956f4
AM
12726 }
12727 }
6f20ed8a 12728 return TRUE;
721956f4
AM
12729}
12730
58d180e8
AM
12731static const unsigned char glink_eh_frame_cie[] =
12732{
12733 0, 0, 0, 16, /* length. */
12734 0, 0, 0, 0, /* id. */
12735 1, /* CIE version. */
12736 'z', 'R', 0, /* Augmentation string. */
12737 4, /* Code alignment. */
12738 0x78, /* Data alignment. */
12739 65, /* RA reg. */
12740 1, /* Augmentation size. */
12741 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
2e0ce1c8 12742 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
58d180e8
AM
12743};
12744
d969d15f
AM
12745/* Stripping output sections is normally done before dynamic section
12746 symbols have been allocated. This function is called later, and
12747 handles cases like htab->brlt which is mapped to its own output
12748 section. */
12749
12750static void
12751maybe_strip_output (struct bfd_link_info *info, asection *isec)
12752{
12753 if (isec->size == 0
12754 && isec->output_section->size == 0
53d8967a 12755 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
12756 && !bfd_section_removed_from_list (info->output_bfd,
12757 isec->output_section)
12758 && elf_section_data (isec->output_section)->dynindx == 0)
12759 {
12760 isec->output_section->flags |= SEC_EXCLUDE;
12761 bfd_section_list_remove (info->output_bfd, isec->output_section);
12762 info->output_bfd->section_count--;
12763 }
12764}
12765
721956f4
AM
12766/* Determine and set the size of the stub section for a final link.
12767
12768 The basic idea here is to examine all the relocations looking for
12769 PC-relative calls to a target that is unreachable with a "bl"
12770 instruction. */
12771
b34976b6 12772bfd_boolean
e7d1c40c 12773ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
12774{
12775 bfd_size_type stub_group_size;
b34976b6 12776 bfd_boolean stubs_always_before_branch;
721956f4
AM
12777 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12778
4dfe6ac6
NC
12779 if (htab == NULL)
12780 return FALSE;
12781
0e1862bb 12782 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
e7d1c40c 12783 htab->params->plt_thread_safe = 1;
b9e5796b 12784 if (!htab->opd_abi)
e7d1c40c
AM
12785 htab->params->plt_thread_safe = 0;
12786 else if (htab->params->plt_thread_safe == -1)
794e51c0 12787 {
e2458743 12788 static const char *const thread_starter[] =
794e51c0
AM
12789 {
12790 "pthread_create",
12791 /* libstdc++ */
12792 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12793 /* librt */
12794 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12795 "mq_notify", "create_timer",
12796 /* libanl */
12797 "getaddrinfo_a",
12798 /* libgomp */
2300b5a1 12799 "GOMP_parallel",
794e51c0 12800 "GOMP_parallel_start",
2300b5a1 12801 "GOMP_parallel_loop_static",
794e51c0 12802 "GOMP_parallel_loop_static_start",
2300b5a1 12803 "GOMP_parallel_loop_dynamic",
794e51c0 12804 "GOMP_parallel_loop_dynamic_start",
2300b5a1 12805 "GOMP_parallel_loop_guided",
794e51c0 12806 "GOMP_parallel_loop_guided_start",
2300b5a1 12807 "GOMP_parallel_loop_runtime",
794e51c0 12808 "GOMP_parallel_loop_runtime_start",
2300b5a1 12809 "GOMP_parallel_sections",
68ffbac6 12810 "GOMP_parallel_sections_start",
f9dffbf0
AM
12811 /* libgo */
12812 "__go_go",
794e51c0
AM
12813 };
12814 unsigned i;
12815
a4b6fadd 12816 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
794e51c0
AM
12817 {
12818 struct elf_link_hash_entry *h;
12819 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12820 FALSE, FALSE, TRUE);
e7d1c40c
AM
12821 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12822 if (htab->params->plt_thread_safe)
794e51c0
AM
12823 break;
12824 }
12825 }
e7d1c40c
AM
12826 stubs_always_before_branch = htab->params->group_size < 0;
12827 if (htab->params->group_size < 0)
12828 stub_group_size = -htab->params->group_size;
721956f4 12829 else
e7d1c40c 12830 stub_group_size = htab->params->group_size;
721956f4 12831
6f20ed8a
AM
12832 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12833 return FALSE;
721956f4 12834
c9301e31
AM
12835#define STUB_SHRINK_ITER 20
12836 /* Loop until no stubs added. After iteration 20 of this loop we may
12837 exit on a stub section shrinking. This is to break out of a
12838 pathological case where adding stubs on one iteration decreases
12839 section gaps (perhaps due to alignment), which then requires
12840 fewer or smaller stubs on the next iteration. */
12841
721956f4
AM
12842 while (1)
12843 {
12844 bfd *input_bfd;
12845 unsigned int bfd_indx;
a4b6fadd 12846 struct map_stub *group;
721956f4
AM
12847
12848 htab->stub_iteration += 1;
721956f4
AM
12849
12850 for (input_bfd = info->input_bfds, bfd_indx = 0;
12851 input_bfd != NULL;
c72f2fb2 12852 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
12853 {
12854 Elf_Internal_Shdr *symtab_hdr;
12855 asection *section;
6cdc0ccc 12856 Elf_Internal_Sym *local_syms = NULL;
721956f4 12857
0c8d6e5c 12858 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
12859 continue;
12860
721956f4 12861 /* We'll need the symbol table in a second. */
0ffa91dd 12862 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
12863 if (symtab_hdr->sh_info == 0)
12864 continue;
12865
721956f4
AM
12866 /* Walk over each section attached to the input bfd. */
12867 for (section = input_bfd->sections;
12868 section != NULL;
12869 section = section->next)
12870 {
721956f4 12871 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
12872
12873 /* If there aren't any relocs, then there's nothing more
12874 to do. */
12875 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
12876 || (section->flags & SEC_ALLOC) == 0
12877 || (section->flags & SEC_LOAD) == 0
12878 || (section->flags & SEC_CODE) == 0
721956f4
AM
12879 || section->reloc_count == 0)
12880 continue;
12881
12882 /* If this section is a link-once section that will be
12883 discarded, then don't create any stubs. */
12884 if (section->output_section == NULL
927be08e 12885 || section->output_section->owner != info->output_bfd)
721956f4
AM
12886 continue;
12887
1e2f5b6e
AM
12888 /* Get the relocs. */
12889 internal_relocs
4ce794b7 12890 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 12891 info->keep_memory);
721956f4 12892 if (internal_relocs == NULL)
1e2f5b6e 12893 goto error_ret_free_local;
721956f4
AM
12894
12895 /* Now examine each relocation. */
12896 irela = internal_relocs;
12897 irelaend = irela + section->reloc_count;
12898 for (; irela < irelaend; irela++)
12899 {
4ce794b7
AM
12900 enum elf_ppc64_reloc_type r_type;
12901 unsigned int r_indx;
721956f4
AM
12902 enum ppc_stub_type stub_type;
12903 struct ppc_stub_hash_entry *stub_entry;
8387904d 12904 asection *sym_sec, *code_sec;
e054468f 12905 bfd_vma sym_value, code_value;
721956f4 12906 bfd_vma destination;
6911b7dc 12907 unsigned long local_off;
8843416a 12908 bfd_boolean ok_dest;
721956f4 12909 struct ppc_link_hash_entry *hash;
8387904d 12910 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
12911 struct elf_link_hash_entry *h;
12912 Elf_Internal_Sym *sym;
721956f4
AM
12913 char *stub_name;
12914 const asection *id_sec;
74f0fb50 12915 struct _opd_sec_data *opd;
e054468f 12916 struct plt_entry *plt_ent;
721956f4
AM
12917
12918 r_type = ELF64_R_TYPE (irela->r_info);
12919 r_indx = ELF64_R_SYM (irela->r_info);
12920
4ce794b7 12921 if (r_type >= R_PPC64_max)
721956f4
AM
12922 {
12923 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 12924 goto error_ret_free_internal;
721956f4
AM
12925 }
12926
12927 /* Only look for stubs on branch instructions. */
4ce794b7 12928 if (r_type != R_PPC64_REL24
05d0e962 12929 && r_type != R_PPC64_REL24_NOTOC
4ce794b7
AM
12930 && r_type != R_PPC64_REL14
12931 && r_type != R_PPC64_REL14_BRTAKEN
12932 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
12933 continue;
12934
12935 /* Now determine the call target, its name, value,
12936 section. */
411e1bfb
AM
12937 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12938 r_indx, input_bfd))
12939 goto error_ret_free_internal;
ed7007c1 12940 hash = ppc_elf_hash_entry (h);
411e1bfb 12941
8843416a 12942 ok_dest = FALSE;
8387904d 12943 fdh = NULL;
7fe2b9a6 12944 sym_value = 0;
411e1bfb 12945 if (hash == NULL)
721956f4 12946 {
411e1bfb 12947 sym_value = sym->st_value;
c27b8c2a
AM
12948 if (sym_sec != NULL
12949 && sym_sec->output_section != NULL)
12950 ok_dest = TRUE;
721956f4 12951 }
7fe2b9a6
AM
12952 else if (hash->elf.root.type == bfd_link_hash_defined
12953 || hash->elf.root.type == bfd_link_hash_defweak)
12954 {
12955 sym_value = hash->elf.root.u.def.value;
12956 if (sym_sec->output_section != NULL)
12957 ok_dest = TRUE;
12958 }
12959 else if (hash->elf.root.type == bfd_link_hash_undefweak
12960 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 12961 {
99877b66 12962 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
12963 use the func descriptor sym instead if it is
12964 defined. */
ceb1f1ef 12965 if (hash->elf.root.root.string[0] == '.'
8c5b4e52 12966 && hash->oh != NULL)
8387904d 12967 {
8c5b4e52 12968 fdh = ppc_follow_link (hash->oh);
8387904d
AM
12969 if (fdh->elf.root.type == bfd_link_hash_defined
12970 || fdh->elf.root.type == bfd_link_hash_defweak)
12971 {
12972 sym_sec = fdh->elf.root.u.def.section;
12973 sym_value = fdh->elf.root.u.def.value;
12974 if (sym_sec->output_section != NULL)
12975 ok_dest = TRUE;
12976 }
99877b66
AM
12977 else
12978 fdh = NULL;
8387904d 12979 }
7fe2b9a6
AM
12980 }
12981 else
12982 {
12983 bfd_set_error (bfd_error_bad_value);
12984 goto error_ret_free_internal;
721956f4
AM
12985 }
12986
8843416a 12987 destination = 0;
6911b7dc 12988 local_off = 0;
8843416a
AM
12989 if (ok_dest)
12990 {
12991 sym_value += irela->r_addend;
12992 destination = (sym_value
12993 + sym_sec->output_offset
12994 + sym_sec->output_section->vma);
6911b7dc
AM
12995 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12996 ? hash->elf.other
12997 : sym->st_other);
8843416a
AM
12998 }
12999
8387904d 13000 code_sec = sym_sec;
e054468f 13001 code_value = sym_value;
74f0fb50
AM
13002 opd = get_opd_info (sym_sec);
13003 if (opd != NULL)
8387904d
AM
13004 {
13005 bfd_vma dest;
13006
74f0fb50 13007 if (hash == NULL && opd->adjust != NULL)
8387904d 13008 {
51aecdc5 13009 long adjust = opd->adjust[OPD_NDX (sym_value)];
8387904d
AM
13010 if (adjust == -1)
13011 continue;
e054468f 13012 code_value += adjust;
8387904d
AM
13013 sym_value += adjust;
13014 }
13015 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 13016 &code_sec, &code_value, FALSE);
8387904d
AM
13017 if (dest != (bfd_vma) -1)
13018 {
13019 destination = dest;
13020 if (fdh != NULL)
13021 {
13022 /* Fixup old ABI sym to point at code
13023 entry. */
99877b66 13024 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 13025 hash->elf.root.u.def.section = code_sec;
e054468f 13026 hash->elf.root.u.def.value = code_value;
8387904d
AM
13027 }
13028 }
13029 }
13030
721956f4 13031 /* Determine what (if any) linker stub is needed. */
e054468f 13032 plt_ent = NULL;
721956f4 13033 stub_type = ppc_type_of_stub (section, irela, &hash,
6911b7dc
AM
13034 &plt_ent, destination,
13035 local_off);
ad8e1ba5 13036
05d0e962
AM
13037 if (r_type == R_PPC64_REL24_NOTOC)
13038 {
13039 if (stub_type == ppc_stub_plt_call)
13040 stub_type = ppc_stub_plt_call_notoc;
13041 else if (stub_type == ppc_stub_long_branch
13042 || (code_sec != NULL
13043 && code_sec->output_section != NULL
13044 && (((hash ? hash->elf.other : sym->st_other)
13045 & STO_PPC64_LOCAL_MASK)
4a4e7361 13046 > 1 << STO_PPC64_LOCAL_BIT)))
05d0e962
AM
13047 stub_type = ppc_stub_long_branch_notoc;
13048 }
13049 else if (stub_type != ppc_stub_plt_call)
ad8e1ba5
AM
13050 {
13051 /* Check whether we need a TOC adjusting stub.
13052 Since the linker pastes together pieces from
13053 different object files when creating the
13054 _init and _fini functions, it may be that a
13055 call to what looks like a local sym is in
13056 fact a call needing a TOC adjustment. */
33cb30a1
AM
13057 if ((code_sec != NULL
13058 && code_sec->output_section != NULL
13059 && (htab->sec_info[code_sec->id].toc_off
13060 != htab->sec_info[section->id].toc_off)
13061 && (code_sec->has_toc_reloc
13062 || code_sec->makes_toc_func_call))
13063 || (((hash ? hash->elf.other : sym->st_other)
13064 & STO_PPC64_LOCAL_MASK)
13065 == 1 << STO_PPC64_LOCAL_BIT))
ad8e1ba5
AM
13066 stub_type = ppc_stub_long_branch_r2off;
13067 }
13068
721956f4
AM
13069 if (stub_type == ppc_stub_none)
13070 continue;
13071
411e1bfb
AM
13072 /* __tls_get_addr calls might be eliminated. */
13073 if (stub_type != ppc_stub_plt_call
05d0e962 13074 && stub_type != ppc_stub_plt_call_notoc
411e1bfb 13075 && hash != NULL
ed7007c1 13076 && is_tls_get_addr (&hash->elf, htab)
411e1bfb
AM
13077 && section->has_tls_reloc
13078 && irela != internal_relocs)
13079 {
13080 /* Get tls info. */
f961d9dd 13081 unsigned char *tls_mask;
411e1bfb 13082
3a71aa26 13083 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
13084 irela - 1, input_bfd))
13085 goto error_ret_free_internal;
abc489c6
AM
13086 if ((*tls_mask & TLS_TLS) != 0
13087 && (*tls_mask & (TLS_GD | TLS_LD)) == 0)
411e1bfb
AM
13088 continue;
13089 }
13090
f378ab09 13091 if (stub_type == ppc_stub_plt_call)
794e51c0 13092 {
6e1816be
AM
13093 if (!htab->opd_abi
13094 && htab->params->plt_localentry0 != 0
13095 && is_elfv2_localentry0 (&hash->elf))
13096 htab->has_plt_localentry0 = 1;
13097 else if (irela + 1 < irelaend
13098 && irela[1].r_offset == irela->r_offset + 4
13099 && (ELF64_R_TYPE (irela[1].r_info)
13100 == R_PPC64_TOCSAVE))
f378ab09
AM
13101 {
13102 if (!tocsave_find (htab, INSERT,
13103 &local_syms, irela + 1, input_bfd))
13104 goto error_ret_free_internal;
13105 }
f378ab09
AM
13106 else
13107 stub_type = ppc_stub_plt_call_r2save;
794e51c0 13108 }
3b421ab3 13109
721956f4 13110 /* Support for grouping stub sections. */
6f20ed8a 13111 id_sec = htab->sec_info[section->id].u.group->link_sec;
721956f4
AM
13112
13113 /* Get the name of this stub. */
13114 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
13115 if (!stub_name)
13116 goto error_ret_free_internal;
13117
13118 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 13119 stub_name, FALSE, FALSE);
721956f4
AM
13120 if (stub_entry != NULL)
13121 {
05d0e962
AM
13122 enum ppc_stub_type old_type;
13123 /* A stub has already been created, but it may
13124 not be the required type. We shouldn't be
13125 transitioning from plt_call to long_branch
13126 stubs or vice versa, but we might be
13127 upgrading from plt_call to plt_call_r2save or
13128 from long_branch to long_branch_r2off. */
721956f4 13129 free (stub_name);
05d0e962
AM
13130 old_type = stub_entry->stub_type;
13131 switch (old_type)
13132 {
13133 default:
13134 abort ();
13135
13136 case ppc_stub_save_res:
13137 continue;
13138
13139 case ppc_stub_plt_call:
13140 case ppc_stub_plt_call_r2save:
13141 case ppc_stub_plt_call_notoc:
13142 case ppc_stub_plt_call_both:
13143 if (stub_type == ppc_stub_plt_call)
13144 continue;
13145 else if (stub_type == ppc_stub_plt_call_r2save)
13146 {
13147 if (old_type == ppc_stub_plt_call_notoc)
13148 stub_type = ppc_stub_plt_call_both;
13149 }
13150 else if (stub_type == ppc_stub_plt_call_notoc)
13151 {
13152 if (old_type == ppc_stub_plt_call_r2save)
13153 stub_type = ppc_stub_plt_call_both;
13154 }
13155 else
13156 abort ();
13157 break;
13158
13159 case ppc_stub_plt_branch:
13160 case ppc_stub_plt_branch_r2off:
13161 case ppc_stub_plt_branch_notoc:
13162 case ppc_stub_plt_branch_both:
13163 old_type += (ppc_stub_long_branch
13164 - ppc_stub_plt_branch);
13165 /* Fall through. */
13166 case ppc_stub_long_branch:
13167 case ppc_stub_long_branch_r2off:
13168 case ppc_stub_long_branch_notoc:
13169 case ppc_stub_long_branch_both:
13170 if (stub_type == ppc_stub_long_branch)
13171 continue;
13172 else if (stub_type == ppc_stub_long_branch_r2off)
13173 {
13174 if (old_type == ppc_stub_long_branch_notoc)
13175 stub_type = ppc_stub_long_branch_both;
13176 }
13177 else if (stub_type == ppc_stub_long_branch_notoc)
13178 {
13179 if (old_type == ppc_stub_long_branch_r2off)
13180 stub_type = ppc_stub_long_branch_both;
13181 }
13182 else
13183 abort ();
13184 break;
13185 }
13186 if (old_type < stub_type)
794e51c0 13187 stub_entry->stub_type = stub_type;
721956f4
AM
13188 continue;
13189 }
13190
25f53a85 13191 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
13192 if (stub_entry == NULL)
13193 {
13194 free (stub_name);
6cdc0ccc
AM
13195 error_ret_free_internal:
13196 if (elf_section_data (section)->relocs == NULL)
13197 free (internal_relocs);
13198 error_ret_free_local:
13199 if (local_syms != NULL
13200 && (symtab_hdr->contents
13201 != (unsigned char *) local_syms))
13202 free (local_syms);
b34976b6 13203 return FALSE;
721956f4
AM
13204 }
13205
ad8e1ba5 13206 stub_entry->stub_type = stub_type;
05d0e962
AM
13207 if (stub_type >= ppc_stub_plt_call
13208 && stub_type <= ppc_stub_plt_call_both)
e054468f 13209 {
05d0e962
AM
13210 stub_entry->target_value = sym_value;
13211 stub_entry->target_section = sym_sec;
e054468f
AM
13212 }
13213 else
13214 {
05d0e962
AM
13215 stub_entry->target_value = code_value;
13216 stub_entry->target_section = code_sec;
e054468f 13217 }
721956f4 13218 stub_entry->h = hash;
e054468f 13219 stub_entry->plt_ent = plt_ent;
2d7ad24e
AM
13220 stub_entry->symtype
13221 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
6911b7dc 13222 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95 13223
3d58e1fc
AM
13224 if (hash != NULL
13225 && (hash->elf.root.type == bfd_link_hash_defined
13226 || hash->elf.root.type == bfd_link_hash_defweak))
ee75fd95 13227 htab->stub_globals += 1;
721956f4
AM
13228 }
13229
13230 /* We're done with the internal relocs, free them. */
6cdc0ccc 13231 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 13232 free (internal_relocs);
721956f4 13233 }
6cdc0ccc
AM
13234
13235 if (local_syms != NULL
13236 && symtab_hdr->contents != (unsigned char *) local_syms)
13237 {
13238 if (!info->keep_memory)
13239 free (local_syms);
13240 else
13241 symtab_hdr->contents = (unsigned char *) local_syms;
13242 }
721956f4
AM
13243 }
13244
5c3dead3 13245 /* We may have added some stubs. Find out the new size of the
721956f4 13246 stub sections. */
d4aaa2a0 13247 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13248 {
13249 group->lr_restore = 0;
13250 group->eh_size = 0;
13251 if (group->stub_sec != NULL)
13252 {
13253 asection *stub_sec = group->stub_sec;
13254
13255 if (htab->stub_iteration <= STUB_SHRINK_ITER
13256 || stub_sec->rawsize < stub_sec->size)
13257 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
13258 stub_sec->rawsize = stub_sec->size;
13259 stub_sec->size = 0;
13260 stub_sec->reloc_count = 0;
13261 stub_sec->flags &= ~SEC_RELOC;
13262 }
13263 }
eea6121a 13264
ba21f564
AM
13265 if (htab->stub_iteration <= STUB_SHRINK_ITER
13266 || htab->brlt->rawsize < htab->brlt->size)
13267 htab->brlt->rawsize = htab->brlt->size;
eea6121a 13268 htab->brlt->size = 0;
84f5d08e
AM
13269 htab->brlt->reloc_count = 0;
13270 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 13271 if (htab->relbrlt != NULL)
eea6121a 13272 htab->relbrlt->size = 0;
721956f4 13273
63bc6f6c 13274 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 13275
a4b6fadd
AM
13276 for (group = htab->group; group != NULL; group = group->next)
13277 if (group->needs_save_res)
13278 group->stub_sec->size += htab->sfpr->size;
13279
176a0d42
AM
13280 if (info->emitrelocations
13281 && htab->glink != NULL && htab->glink->size != 0)
13282 {
13283 htab->glink->reloc_count = 1;
13284 htab->glink->flags |= SEC_RELOC;
13285 }
13286
58d180e8
AM
13287 if (htab->glink_eh_frame != NULL
13288 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
2d0d44d5 13289 && htab->glink_eh_frame->output_section->size > 8)
58d180e8 13290 {
2e0ce1c8 13291 size_t size = 0, align = 4;
58d180e8 13292
d4aaa2a0 13293 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13294 if (group->eh_size != 0)
13295 size += (group->eh_size + 17 + align - 1) & -align;
58d180e8 13296 if (htab->glink != NULL && htab->glink->size != 0)
2e0ce1c8 13297 size += (24 + align - 1) & -align;
58d180e8 13298 if (size != 0)
2e0ce1c8
AM
13299 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
13300 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
13301 size = (size + align - 1) & -align;
58d180e8
AM
13302 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
13303 htab->glink_eh_frame->size = size;
13304 }
13305
e7d1c40c 13306 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13307 for (group = htab->group; group != NULL; group = group->next)
13308 if (group->stub_sec != NULL)
691d2e9a
AM
13309 {
13310 int align = abs (htab->params->plt_stub_align);
13311 group->stub_sec->size
13312 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
13313 }
d4aaa2a0
AM
13314
13315 for (group = htab->group; group != NULL; group = group->next)
13316 if (group->stub_sec != NULL
13317 && group->stub_sec->rawsize != group->stub_sec->size
c9301e31 13318 && (htab->stub_iteration <= STUB_SHRINK_ITER
d4aaa2a0 13319 || group->stub_sec->rawsize < group->stub_sec->size))
5c3dead3
AM
13320 break;
13321
d4aaa2a0 13322 if (group == NULL
ba21f564
AM
13323 && (htab->brlt->rawsize == htab->brlt->size
13324 || (htab->stub_iteration > STUB_SHRINK_ITER
13325 && htab->brlt->rawsize > htab->brlt->size))
58d180e8
AM
13326 && (htab->glink_eh_frame == NULL
13327 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
5c3dead3
AM
13328 break;
13329
721956f4 13330 /* Ask the linker to do its stuff. */
e7d1c40c 13331 (*htab->params->layout_sections_again) ();
721956f4
AM
13332 }
13333
da44f4e5
AM
13334 if (htab->glink_eh_frame != NULL
13335 && htab->glink_eh_frame->size != 0)
13336 {
13337 bfd_vma val;
13338 bfd_byte *p, *last_fde;
13339 size_t last_fde_len, size, align, pad;
d4aaa2a0 13340 struct map_stub *group;
da44f4e5 13341
df136d64
AM
13342 /* It is necessary to at least have a rough outline of the
13343 linker generated CIEs and FDEs written before
13344 bfd_elf_discard_info is run, in order for these FDEs to be
13345 indexed in .eh_frame_hdr. */
da44f4e5
AM
13346 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
13347 if (p == NULL)
13348 return FALSE;
13349 htab->glink_eh_frame->contents = p;
13350 last_fde = p;
2e0ce1c8 13351 align = 4;
da44f4e5
AM
13352
13353 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
13354 /* CIE length (rewrite in case little-endian). */
2e0ce1c8 13355 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
da44f4e5 13356 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
2e0ce1c8 13357 p += last_fde_len + 4;
da44f4e5 13358
d4aaa2a0 13359 for (group = htab->group; group != NULL; group = group->next)
df136d64 13360 if (group->eh_size != 0)
da44f4e5 13361 {
df136d64 13362 group->eh_base = p - htab->glink_eh_frame->contents;
da44f4e5 13363 last_fde = p;
df136d64 13364 last_fde_len = ((group->eh_size + 17 + align - 1) & -align) - 4;
da44f4e5 13365 /* FDE length. */
2e0ce1c8 13366 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13367 p += 4;
13368 /* CIE pointer. */
13369 val = p - htab->glink_eh_frame->contents;
13370 bfd_put_32 (htab->elf.dynobj, val, p);
13371 p += 4;
13372 /* Offset to stub section, written later. */
13373 p += 4;
13374 /* stub section size. */
d4aaa2a0 13375 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
da44f4e5
AM
13376 p += 4;
13377 /* Augmentation. */
13378 p += 1;
df136d64
AM
13379 /* Make sure we don't have all nops. This is enough for
13380 elf-eh-frame.c to detect the last non-nop opcode. */
13381 p[group->eh_size - 1] = DW_CFA_advance_loc + 1;
d4aaa2a0 13382 p = last_fde + last_fde_len + 4;
da44f4e5
AM
13383 }
13384 if (htab->glink != NULL && htab->glink->size != 0)
13385 {
13386 last_fde = p;
2e0ce1c8 13387 last_fde_len = ((24 + align - 1) & -align) - 4;
da44f4e5 13388 /* FDE length. */
2e0ce1c8 13389 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13390 p += 4;
13391 /* CIE pointer. */
13392 val = p - htab->glink_eh_frame->contents;
13393 bfd_put_32 (htab->elf.dynobj, val, p);
13394 p += 4;
13395 /* Offset to .glink, written later. */
13396 p += 4;
13397 /* .glink size. */
13398 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
13399 p += 4;
13400 /* Augmentation. */
13401 p += 1;
13402
13403 *p++ = DW_CFA_advance_loc + 1;
13404 *p++ = DW_CFA_register;
13405 *p++ = 65;
9f08fa5c 13406 *p++ = htab->opd_abi ? 12 : 0;
15a3a14f 13407 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
da44f4e5
AM
13408 *p++ = DW_CFA_restore_extended;
13409 *p++ = 65;
2e0ce1c8 13410 p += ((24 + align - 1) & -align) - 24;
da44f4e5
AM
13411 }
13412 /* Subsume any padding into the last FDE if user .eh_frame
13413 sections are aligned more than glink_eh_frame. Otherwise any
13414 zero padding will be seen as a terminator. */
2e0ce1c8 13415 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
da44f4e5 13416 size = p - htab->glink_eh_frame->contents;
2e0ce1c8 13417 pad = ((size + align - 1) & -align) - size;
da44f4e5
AM
13418 htab->glink_eh_frame->size = size + pad;
13419 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
13420 }
13421
d969d15f
AM
13422 maybe_strip_output (info, htab->brlt);
13423 if (htab->glink_eh_frame != NULL)
13424 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 13425
b34976b6 13426 return TRUE;
721956f4
AM
13427}
13428
13429/* Called after we have determined section placement. If sections
805fc799 13430 move, we'll be called again. Provide a value for TOCstart. */
721956f4 13431
805fc799 13432bfd_vma
1c865ab2 13433ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 13434{
805fc799 13435 asection *s;
a27e685f 13436 bfd_vma TOCstart, adjust;
721956f4 13437
43417696
AM
13438 if (info != NULL)
13439 {
13440 struct elf_link_hash_entry *h;
13441 struct elf_link_hash_table *htab = elf_hash_table (info);
13442
13443 if (is_elf_hash_table (htab)
13444 && htab->hgot != NULL)
13445 h = htab->hgot;
13446 else
13447 {
13448 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
13449 if (is_elf_hash_table (htab))
13450 htab->hgot = h;
13451 }
13452 if (h != NULL
13453 && h->root.type == bfd_link_hash_defined
13454 && !h->root.linker_def
13455 && (!is_elf_hash_table (htab)
13456 || h->def_regular))
13457 {
ed7007c1 13458 TOCstart = defined_sym_val (h) - TOC_BASE_OFF;
43417696
AM
13459 _bfd_set_gp_value (obfd, TOCstart);
13460 return TOCstart;
13461 }
13462 }
13463
805fc799
AM
13464 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
13465 order. The TOC starts where the first of these sections starts. */
13466 s = bfd_get_section_by_name (obfd, ".got");
e054468f 13467 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13468 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 13469 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13470 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 13471 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13472 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 13473 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
13474 {
13475 /* This may happen for
13476 o references to TOC base (SYM@toc / TOC[tc0]) without a
13477 .toc directive
13478 o bad linker script
13479 o --gc-sections and empty TOC sections
13480
13481 FIXME: Warn user? */
13482
13483 /* Look for a likely section. We probably won't even be
13484 using TOCstart. */
13485 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13486 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
13487 | SEC_EXCLUDE))
805fc799
AM
13488 == (SEC_ALLOC | SEC_SMALL_DATA))
13489 break;
721956f4 13490 if (s == NULL)
805fc799 13491 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13492 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
13493 == (SEC_ALLOC | SEC_SMALL_DATA))
13494 break;
721956f4 13495 if (s == NULL)
805fc799 13496 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13497 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
13498 == SEC_ALLOC)
805fc799 13499 break;
721956f4 13500 if (s == NULL)
805fc799 13501 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13502 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
13503 break;
13504 }
721956f4 13505
805fc799
AM
13506 TOCstart = 0;
13507 if (s != NULL)
13508 TOCstart = s->output_section->vma + s->output_offset;
721956f4 13509
a27e685f
AM
13510 /* Force alignment. */
13511 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
13512 TOCstart -= adjust;
1c865ab2
AM
13513 _bfd_set_gp_value (obfd, TOCstart);
13514
810d4e75 13515 if (info != NULL && s != NULL)
1c865ab2
AM
13516 {
13517 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13518
810d4e75
AM
13519 if (htab != NULL)
13520 {
13521 if (htab->elf.hgot != NULL)
13522 {
a27e685f 13523 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
810d4e75
AM
13524 htab->elf.hgot->root.u.def.section = s;
13525 }
13526 }
13527 else
1c865ab2 13528 {
810d4e75
AM
13529 struct bfd_link_hash_entry *bh = NULL;
13530 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
a27e685f
AM
13531 s, TOC_BASE_OFF - adjust,
13532 NULL, FALSE, FALSE, &bh);
1c865ab2
AM
13533 }
13534 }
805fc799 13535 return TOCstart;
721956f4
AM
13536}
13537
a345bc8d 13538/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
49c09209 13539 write out any global entry stubs, and PLT relocations. */
a345bc8d
AM
13540
13541static bfd_boolean
49c09209 13542build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
a345bc8d
AM
13543{
13544 struct bfd_link_info *info;
13545 struct ppc_link_hash_table *htab;
49c09209 13546 struct plt_entry *ent;
a345bc8d
AM
13547 asection *s;
13548
13549 if (h->root.type == bfd_link_hash_indirect)
13550 return TRUE;
13551
49c09209
AM
13552 info = inf;
13553 htab = ppc_hash_table (info);
13554 if (htab == NULL)
13555 return FALSE;
13556
13557 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13558 if (ent->plt.offset != (bfd_vma) -1)
13559 {
13560 /* This symbol has an entry in the procedure linkage
13561 table. Set it up. */
13562 Elf_Internal_Rela rela;
2d7ad24e 13563 asection *plt, *relplt;
49c09209
AM
13564 bfd_byte *loc;
13565
13566 if (!htab->elf.dynamic_sections_created
13567 || h->dynindx == -1)
13568 {
13569 if (!(h->def_regular
13570 && (h->root.type == bfd_link_hash_defined
13571 || h->root.type == bfd_link_hash_defweak)))
13572 continue;
2d7ad24e
AM
13573 if (h->type == STT_GNU_IFUNC)
13574 {
13575 plt = htab->elf.iplt;
13576 relplt = htab->elf.irelplt;
13577 htab->local_ifunc_resolver = 1;
13578 if (htab->opd_abi)
13579 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13580 else
13581 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13582 }
49c09209 13583 else
2d7ad24e
AM
13584 {
13585 plt = htab->pltlocal;
13586 if (bfd_link_pic (info))
13587 {
13588 relplt = htab->relpltlocal;
13589 if (htab->opd_abi)
13590 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13591 else
13592 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13593 }
13594 else
13595 relplt = NULL;
13596 }
ed7007c1 13597 rela.r_addend = defined_sym_val (h) + ent->addend;
2d7ad24e
AM
13598
13599 if (relplt == NULL)
13600 {
13601 loc = plt->contents + ent->plt.offset;
13602 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
13603 if (htab->opd_abi)
13604 {
13605 bfd_vma toc = elf_gp (info->output_bfd);
13606 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
13607 bfd_put_64 (info->output_bfd, toc, loc + 8);
13608 }
13609 }
13610 else
13611 {
13612 rela.r_offset = (plt->output_section->vma
13613 + plt->output_offset
13614 + ent->plt.offset);
13615 loc = relplt->contents + (relplt->reloc_count++
13616 * sizeof (Elf64_External_Rela));
13617 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13618 }
49c09209
AM
13619 }
13620 else
13621 {
13622 rela.r_offset = (htab->elf.splt->output_section->vma
13623 + htab->elf.splt->output_offset
13624 + ent->plt.offset);
13625 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13626 rela.r_addend = ent->addend;
13627 loc = (htab->elf.srelplt->contents
13628 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
13629 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
13630 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
13631 htab->maybe_local_ifunc_resolver = 1;
2d7ad24e 13632 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
49c09209 13633 }
49c09209
AM
13634 }
13635
a345bc8d
AM
13636 if (!h->pointer_equality_needed)
13637 return TRUE;
13638
13639 if (h->def_regular)
13640 return TRUE;
13641
9e390558 13642 s = htab->global_entry;
49c09209
AM
13643 if (s == NULL || s->size == 0)
13644 return TRUE;
13645
13646 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13647 if (ent->plt.offset != (bfd_vma) -1
13648 && ent->addend == 0)
a345bc8d
AM
13649 {
13650 bfd_byte *p;
13651 asection *plt;
13652 bfd_vma off;
13653
a345bc8d 13654 p = s->contents + h->root.u.def.value;
33e44f2e 13655 plt = htab->elf.splt;
a345bc8d
AM
13656 if (!htab->elf.dynamic_sections_created
13657 || h->dynindx == -1)
2d7ad24e
AM
13658 {
13659 if (h->type == STT_GNU_IFUNC)
13660 plt = htab->elf.iplt;
13661 else
13662 plt = htab->pltlocal;
13663 }
49c09209 13664 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
a345bc8d
AM
13665 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
13666
13667 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
13668 {
13669 info->callbacks->einfo
c1c8c1ef 13670 (_("%P: linkage table error against `%pT'\n"),
a345bc8d
AM
13671 h->root.root.string);
13672 bfd_set_error (bfd_error_bad_value);
13673 htab->stub_error = TRUE;
13674 }
13675
7341d5e2
AM
13676 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13677 if (htab->params->emit_stub_syms)
13678 {
13679 size_t len = strlen (h->root.root.string);
13680 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13681
13682 if (name == NULL)
13683 return FALSE;
13684
13685 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13686 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13687 if (h == NULL)
13688 return FALSE;
13689 if (h->root.type == bfd_link_hash_new)
13690 {
13691 h->root.type = bfd_link_hash_defined;
13692 h->root.u.def.section = s;
13693 h->root.u.def.value = p - s->contents;
13694 h->ref_regular = 1;
13695 h->def_regular = 1;
13696 h->ref_regular_nonweak = 1;
13697 h->forced_local = 1;
13698 h->non_elf = 0;
2ec55de3 13699 h->root.linker_def = 1;
7341d5e2
AM
13700 }
13701 }
13702
a345bc8d
AM
13703 if (PPC_HA (off) != 0)
13704 {
13705 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
13706 p += 4;
13707 }
13708 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
13709 p += 4;
13710 bfd_put_32 (s->owner, MTCTR_R12, p);
13711 p += 4;
407aa07c 13712 bfd_put_32 (s->owner, BCTR, p);
a345bc8d
AM
13713 break;
13714 }
13715 return TRUE;
13716}
13717
49c09209
AM
13718/* Write PLT relocs for locals. */
13719
13720static bfd_boolean
13721write_plt_relocs_for_local_syms (struct bfd_link_info *info)
13722{
13723 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13724 bfd *ibfd;
13725
13726 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
13727 {
13728 struct got_entry **lgot_ents, **end_lgot_ents;
13729 struct plt_entry **local_plt, **lplt, **end_local_plt;
13730 Elf_Internal_Shdr *symtab_hdr;
13731 bfd_size_type locsymcount;
13732 Elf_Internal_Sym *local_syms = NULL;
13733 struct plt_entry *ent;
13734
13735 if (!is_ppc64_elf (ibfd))
13736 continue;
13737
13738 lgot_ents = elf_local_got_ents (ibfd);
13739 if (!lgot_ents)
13740 continue;
13741
13742 symtab_hdr = &elf_symtab_hdr (ibfd);
13743 locsymcount = symtab_hdr->sh_info;
13744 end_lgot_ents = lgot_ents + locsymcount;
13745 local_plt = (struct plt_entry **) end_lgot_ents;
13746 end_local_plt = local_plt + locsymcount;
13747 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
13748 for (ent = *lplt; ent != NULL; ent = ent->next)
13749 if (ent->plt.offset != (bfd_vma) -1)
13750 {
13751 Elf_Internal_Sym *sym;
13752 asection *sym_sec;
13753 asection *plt, *relplt;
13754 bfd_byte *loc;
13755 bfd_vma val;
49c09209
AM
13756
13757 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
13758 lplt - local_plt, ibfd))
13759 {
13760 if (local_syms != NULL
13761 && symtab_hdr->contents != (unsigned char *) local_syms)
13762 free (local_syms);
13763 return FALSE;
13764 }
13765
13766 val = sym->st_value + ent->addend;
ba85c15d
AM
13767 if (ELF_ST_TYPE (sym->st_info) != STT_GNU_IFUNC)
13768 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
49c09209
AM
13769 if (sym_sec != NULL && sym_sec->output_section != NULL)
13770 val += sym_sec->output_offset + sym_sec->output_section->vma;
13771
2d7ad24e
AM
13772 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13773 {
13774 htab->local_ifunc_resolver = 1;
13775 plt = htab->elf.iplt;
13776 relplt = htab->elf.irelplt;
13777 }
13778 else
13779 {
13780 plt = htab->pltlocal;
13781 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
13782 }
49c09209 13783
2d7ad24e
AM
13784 if (relplt == NULL)
13785 {
13786 loc = plt->contents + ent->plt.offset;
13787 bfd_put_64 (info->output_bfd, val, loc);
13788 if (htab->opd_abi)
13789 {
13790 bfd_vma toc = elf_gp (ibfd);
13791 bfd_put_64 (info->output_bfd, toc, loc + 8);
13792 }
13793 }
49c09209 13794 else
2d7ad24e
AM
13795 {
13796 Elf_Internal_Rela rela;
13797 rela.r_offset = (ent->plt.offset
13798 + plt->output_offset
13799 + plt->output_section->vma);
13800 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13801 {
13802 if (htab->opd_abi)
13803 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13804 else
13805 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13806 }
13807 else
13808 {
13809 if (htab->opd_abi)
13810 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13811 else
13812 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13813 }
13814 rela.r_addend = val;
13815 loc = relplt->contents + (relplt->reloc_count++
13816 * sizeof (Elf64_External_Rela));
13817 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13818 }
49c09209
AM
13819 }
13820
13821 if (local_syms != NULL
13822 && symtab_hdr->contents != (unsigned char *) local_syms)
13823 {
13824 if (!info->keep_memory)
13825 free (local_syms);
13826 else
13827 symtab_hdr->contents = (unsigned char *) local_syms;
13828 }
13829 }
13830 return TRUE;
13831}
13832
721956f4
AM
13833/* Build all the stubs associated with the current output file.
13834 The stubs are kept in a hash table attached to the main linker
13835 hash table. This function is called via gldelf64ppc_finish. */
13836
b34976b6 13837bfd_boolean
e7d1c40c 13838ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 13839 char **stats)
5d1634d7
AM
13840{
13841 struct ppc_link_hash_table *htab = ppc_hash_table (info);
a4b6fadd 13842 struct map_stub *group;
721956f4 13843 asection *stub_sec;
5d1634d7 13844 bfd_byte *p;
e717da7e 13845 int stub_sec_count = 0;
5d1634d7 13846
4dfe6ac6
NC
13847 if (htab == NULL)
13848 return FALSE;
13849
eea6121a 13850 /* Allocate memory to hold the linker stubs. */
d4aaa2a0 13851 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13852 {
13853 group->eh_size = 0;
13854 group->lr_restore = 0;
13855 if ((stub_sec = group->stub_sec) != NULL
13856 && stub_sec->size != 0)
13857 {
13858 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd,
13859 stub_sec->size);
13860 if (stub_sec->contents == NULL)
13861 return FALSE;
13862 stub_sec->size = 0;
13863 }
13864 }
5d1634d7 13865
23eb7e01 13866 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 13867 {
9f951329 13868 unsigned int indx;
ad8e1ba5 13869 bfd_vma plt0;
9f951329 13870
721956f4 13871 /* Build the .glink plt call stub. */
e7d1c40c 13872 if (htab->params->emit_stub_syms)
97b639ba
AM
13873 {
13874 struct elf_link_hash_entry *h;
468392fb
AM
13875 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
13876 TRUE, FALSE, FALSE);
97b639ba
AM
13877 if (h == NULL)
13878 return FALSE;
13879 if (h->root.type == bfd_link_hash_new)
13880 {
13881 h->root.type = bfd_link_hash_defined;
13882 h->root.u.def.section = htab->glink;
ee4bf8d2 13883 h->root.u.def.value = 8;
f5385ebf
AM
13884 h->ref_regular = 1;
13885 h->def_regular = 1;
13886 h->ref_regular_nonweak = 1;
13887 h->forced_local = 1;
13888 h->non_elf = 0;
2ec55de3 13889 h->root.linker_def = 1;
97b639ba
AM
13890 }
13891 }
33e44f2e
AM
13892 plt0 = (htab->elf.splt->output_section->vma
13893 + htab->elf.splt->output_offset
13894 - 16);
176a0d42
AM
13895 if (info->emitrelocations)
13896 {
13897 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
13898 if (r == NULL)
13899 return FALSE;
13900 r->r_offset = (htab->glink->output_offset
13901 + htab->glink->output_section->vma);
13902 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
13903 r->r_addend = plt0;
13904 }
4ce794b7 13905 p = htab->glink->contents;
176a0d42 13906 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
13907 bfd_put_64 (htab->glink->owner, plt0, p);
13908 p += 8;
b9e5796b
AM
13909 if (htab->opd_abi)
13910 {
13911 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
13912 p += 4;
13913 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13914 p += 4;
13915 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13916 p += 4;
13917 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13918 p += 4;
13919 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
13920 p += 4;
13921 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13922 p += 4;
13923 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13924 p += 4;
13925 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
13926 p += 4;
13927 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13928 p += 4;
13929 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
13930 p += 4;
13931 }
13932 else
13933 {
13934 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
13935 p += 4;
13936 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13937 p += 4;
13938 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13939 p += 4;
f378ab09
AM
13940 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
13941 p += 4;
b9e5796b
AM
13942 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13943 p += 4;
13944 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
13945 p += 4;
13946 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
13947 p += 4;
13948 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13949 p += 4;
13950 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
13951 p += 4;
13952 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13953 p += 4;
13954 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
13955 p += 4;
13956 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13957 p += 4;
13958 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
13959 p += 4;
13960 }
407aa07c
AM
13961 bfd_put_32 (htab->glink->owner, BCTR, p);
13962 p += 4;
c75bc4f7 13963 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
ad8e1ba5 13964
9f951329
AM
13965 /* Build the .glink lazy link call stubs. */
13966 indx = 0;
9e390558 13967 while (p < htab->glink->contents + htab->glink->size)
9f951329 13968 {
b9e5796b 13969 if (htab->opd_abi)
9f951329 13970 {
b9e5796b
AM
13971 if (indx < 0x8000)
13972 {
13973 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
13974 p += 4;
13975 }
13976 else
13977 {
13978 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
13979 p += 4;
13980 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
13981 p);
13982 p += 4;
13983 }
9f951329 13984 }
4ce794b7 13985 bfd_put_32 (htab->glink->owner,
ee4bf8d2 13986 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 13987 indx++;
9f951329
AM
13988 p += 4;
13989 }
5d1634d7 13990 }
5d1634d7 13991
49c09209
AM
13992 /* Build .glink global entry stubs, and PLT relocs for globals. */
13993 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
13994
13995 if (!write_plt_relocs_for_local_syms (info))
13996 return FALSE;
9e390558 13997
7341d5e2 13998 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 13999 {
4ce794b7 14000 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 14001 htab->brlt->size);
4ce794b7 14002 if (htab->brlt->contents == NULL)
b34976b6 14003 return FALSE;
721956f4 14004 }
ee75fd95 14005 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
14006 {
14007 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 14008 htab->relbrlt->size);
63bc6f6c
AM
14009 if (htab->relbrlt->contents == NULL)
14010 return FALSE;
14011 }
5d1634d7 14012
721956f4
AM
14013 /* Build the stubs as directed by the stub hash table. */
14014 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 14015
a4b6fadd
AM
14016 for (group = htab->group; group != NULL; group = group->next)
14017 if (group->needs_save_res)
7dda8d3c 14018 group->stub_sec->size += htab->sfpr->size;
a4b6fadd 14019
aa8a7074
AM
14020 if (htab->relbrlt != NULL)
14021 htab->relbrlt->reloc_count = 0;
14022
e7d1c40c 14023 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
14024 for (group = htab->group; group != NULL; group = group->next)
14025 if ((stub_sec = group->stub_sec) != NULL)
691d2e9a
AM
14026 {
14027 int align = abs (htab->params->plt_stub_align);
14028 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
14029 }
794e51c0 14030
7dda8d3c
AM
14031 for (group = htab->group; group != NULL; group = group->next)
14032 if (group->needs_save_res)
14033 {
14034 stub_sec = group->stub_sec;
14035 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
14036 htab->sfpr->contents, htab->sfpr->size);
14037 if (htab->params->emit_stub_syms)
14038 {
14039 unsigned int i;
14040
14041 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
14042 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
14043 return FALSE;
14044 }
14045 }
14046
df136d64
AM
14047 if (htab->glink_eh_frame != NULL
14048 && htab->glink_eh_frame->size != 0)
14049 {
14050 bfd_vma val;
14051 size_t align = 4;
14052
14053 p = htab->glink_eh_frame->contents;
14054 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
14055
14056 for (group = htab->group; group != NULL; group = group->next)
14057 if (group->eh_size != 0)
14058 {
14059 /* Offset to stub section. */
14060 val = (group->stub_sec->output_section->vma
14061 + group->stub_sec->output_offset);
14062 val -= (htab->glink_eh_frame->output_section->vma
14063 + htab->glink_eh_frame->output_offset
14064 + (p + 8 - htab->glink_eh_frame->contents));
14065 if (val + 0x80000000 > 0xffffffff)
14066 {
14067 _bfd_error_handler
14068 (_("%s offset too large for .eh_frame sdata4 encoding"),
14069 group->stub_sec->name);
14070 return FALSE;
14071 }
14072 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14073 p += (group->eh_size + 17 + 3) & -4;
14074 }
14075 if (htab->glink != NULL && htab->glink->size != 0)
14076 {
14077 /* Offset to .glink. */
14078 val = (htab->glink->output_section->vma
14079 + htab->glink->output_offset
14080 + 8);
14081 val -= (htab->glink_eh_frame->output_section->vma
14082 + htab->glink_eh_frame->output_offset
14083 + (p + 8 - htab->glink_eh_frame->contents));
14084 if (val + 0x80000000 > 0xffffffff)
14085 {
14086 _bfd_error_handler
14087 (_("%s offset too large for .eh_frame sdata4 encoding"),
14088 htab->glink->name);
14089 return FALSE;
14090 }
14091 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14092 p += (24 + align - 1) & -align;
14093 }
14094 }
14095
d4aaa2a0
AM
14096 for (group = htab->group; group != NULL; group = group->next)
14097 if ((stub_sec = group->stub_sec) != NULL)
e717da7e
AM
14098 {
14099 stub_sec_count += 1;
c9301e31
AM
14100 if (stub_sec->rawsize != stub_sec->size
14101 && (htab->stub_iteration <= STUB_SHRINK_ITER
14102 || stub_sec->rawsize < stub_sec->size))
e717da7e
AM
14103 break;
14104 }
5d1634d7 14105
25516cc5 14106 if (group != NULL)
5d1634d7 14107 {
b34976b6 14108 htab->stub_error = TRUE;
cf97bcb0 14109 _bfd_error_handler (_("stubs don't match calculated size"));
5d1634d7 14110 }
721956f4 14111
d2a300cf
AM
14112 if (htab->stub_error)
14113 return FALSE;
14114
14115 if (stats != NULL)
14116 {
db84fff3 14117 size_t len;
d2a300cf
AM
14118 *stats = bfd_malloc (500);
14119 if (*stats == NULL)
14120 return FALSE;
14121
db84fff3
AM
14122 len = sprintf (*stats,
14123 ngettext ("linker stubs in %u group\n",
14124 "linker stubs in %u groups\n",
14125 stub_sec_count),
14126 stub_sec_count);
05d0e962
AM
14127 sprintf (*stats + len, _(" branch %lu\n"
14128 " branch toc adj %lu\n"
14129 " branch notoc %lu\n"
14130 " branch both %lu\n"
14131 " long branch %lu\n"
14132 " long toc adj %lu\n"
14133 " long notoc %lu\n"
14134 " long both %lu\n"
14135 " plt call %lu\n"
14136 " plt call save %lu\n"
14137 " plt call notoc %lu\n"
14138 " plt call both %lu\n"
14139 " global entry %lu"),
4ce794b7
AM
14140 htab->stub_count[ppc_stub_long_branch - 1],
14141 htab->stub_count[ppc_stub_long_branch_r2off - 1],
05d0e962
AM
14142 htab->stub_count[ppc_stub_long_branch_notoc - 1],
14143 htab->stub_count[ppc_stub_long_branch_both - 1],
4ce794b7
AM
14144 htab->stub_count[ppc_stub_plt_branch - 1],
14145 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
05d0e962
AM
14146 htab->stub_count[ppc_stub_plt_branch_notoc - 1],
14147 htab->stub_count[ppc_stub_plt_branch_both - 1],
794e51c0 14148 htab->stub_count[ppc_stub_plt_call - 1],
7341d5e2 14149 htab->stub_count[ppc_stub_plt_call_r2save - 1],
05d0e962
AM
14150 htab->stub_count[ppc_stub_plt_call_notoc - 1],
14151 htab->stub_count[ppc_stub_plt_call_both - 1],
7341d5e2 14152 htab->stub_count[ppc_stub_global_entry - 1]);
d2a300cf
AM
14153 }
14154 return TRUE;
5bd4f169
AM
14155}
14156
60124e18
AM
14157/* What to do when ld finds relocations against symbols defined in
14158 discarded sections. */
14159
14160static unsigned int
14161ppc64_elf_action_discarded (asection *sec)
14162{
14163 if (strcmp (".opd", sec->name) == 0)
14164 return 0;
14165
14166 if (strcmp (".toc", sec->name) == 0)
14167 return 0;
14168
bce50a28
JJ
14169 if (strcmp (".toc1", sec->name) == 0)
14170 return 0;
14171
60124e18
AM
14172 return _bfd_elf_default_action_discarded (sec);
14173}
14174
e59a1001
AM
14175/* These are the dynamic relocations supported by glibc. */
14176
14177static bfd_boolean
14178ppc64_glibc_dynamic_reloc (enum elf_ppc64_reloc_type r_type)
14179{
14180 switch (r_type)
14181 {
14182 case R_PPC64_RELATIVE:
14183 case R_PPC64_NONE:
14184 case R_PPC64_ADDR64:
14185 case R_PPC64_GLOB_DAT:
14186 case R_PPC64_IRELATIVE:
14187 case R_PPC64_JMP_IREL:
14188 case R_PPC64_JMP_SLOT:
14189 case R_PPC64_DTPMOD64:
14190 case R_PPC64_DTPREL64:
14191 case R_PPC64_TPREL64:
14192 case R_PPC64_TPREL16_LO_DS:
14193 case R_PPC64_TPREL16_DS:
14194 case R_PPC64_TPREL16:
14195 case R_PPC64_TPREL16_LO:
14196 case R_PPC64_TPREL16_HI:
14197 case R_PPC64_TPREL16_HIGH:
14198 case R_PPC64_TPREL16_HA:
14199 case R_PPC64_TPREL16_HIGHA:
14200 case R_PPC64_TPREL16_HIGHER:
14201 case R_PPC64_TPREL16_HIGHEST:
14202 case R_PPC64_TPREL16_HIGHERA:
14203 case R_PPC64_TPREL16_HIGHESTA:
14204 case R_PPC64_ADDR16_LO_DS:
14205 case R_PPC64_ADDR16_LO:
14206 case R_PPC64_ADDR16_HI:
14207 case R_PPC64_ADDR16_HIGH:
14208 case R_PPC64_ADDR16_HA:
14209 case R_PPC64_ADDR16_HIGHA:
14210 case R_PPC64_REL30:
14211 case R_PPC64_COPY:
14212 case R_PPC64_UADDR64:
14213 case R_PPC64_UADDR32:
14214 case R_PPC64_ADDR32:
14215 case R_PPC64_ADDR24:
14216 case R_PPC64_ADDR16:
14217 case R_PPC64_UADDR16:
14218 case R_PPC64_ADDR16_DS:
14219 case R_PPC64_ADDR16_HIGHER:
14220 case R_PPC64_ADDR16_HIGHEST:
14221 case R_PPC64_ADDR16_HIGHERA:
14222 case R_PPC64_ADDR16_HIGHESTA:
14223 case R_PPC64_ADDR14:
14224 case R_PPC64_ADDR14_BRTAKEN:
14225 case R_PPC64_ADDR14_BRNTAKEN:
14226 case R_PPC64_REL32:
14227 case R_PPC64_REL64:
14228 return TRUE;
14229
14230 default:
14231 return FALSE;
14232 }
14233}
14234
5bd4f169
AM
14235/* The RELOCATE_SECTION function is called by the ELF backend linker
14236 to handle the relocations for a section.
14237
14238 The relocs are always passed as Rela structures; if the section
14239 actually uses Rel structures, the r_addend field will always be
14240 zero.
14241
14242 This function is responsible for adjust the section contents as
14243 necessary, and (if using Rela relocs and generating a
1049f94e 14244 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
14245 necessary.
14246
14247 This function does not have to worry about setting the reloc
14248 address or the reloc symbol index.
14249
14250 LOCAL_SYMS is a pointer to the swapped in local symbols.
14251
14252 LOCAL_SECTIONS is an array giving the section in the input file
14253 corresponding to the st_shndx field of each local symbol.
14254
14255 The global hash table entry for the global symbols can be found
14256 via elf_sym_hashes (input_bfd).
14257
1049f94e 14258 When generating relocatable output, this function must handle
5bd4f169
AM
14259 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
14260 going to be the section symbol corresponding to the output
14261 section, which means that the addend must be adjusted
14262 accordingly. */
14263
b34976b6 14264static bfd_boolean
4ce794b7
AM
14265ppc64_elf_relocate_section (bfd *output_bfd,
14266 struct bfd_link_info *info,
14267 bfd *input_bfd,
14268 asection *input_section,
14269 bfd_byte *contents,
14270 Elf_Internal_Rela *relocs,
14271 Elf_Internal_Sym *local_syms,
14272 asection **local_sections)
5bd4f169 14273{
65f38f15 14274 struct ppc_link_hash_table *htab;
5bd4f169
AM
14275 Elf_Internal_Shdr *symtab_hdr;
14276 struct elf_link_hash_entry **sym_hashes;
5bd4f169 14277 Elf_Internal_Rela *rel;
c316a17c 14278 Elf_Internal_Rela *wrel;
5bd4f169 14279 Elf_Internal_Rela *relend;
411e1bfb
AM
14280 Elf_Internal_Rela outrel;
14281 bfd_byte *loc;
411e1bfb 14282 struct got_entry **local_got_ents;
5bd4f169 14283 bfd_vma TOCstart;
b34976b6
AM
14284 bfd_boolean ret = TRUE;
14285 bfd_boolean is_opd;
794e51c0
AM
14286 /* Assume 'at' branch hints. */
14287 bfd_boolean is_isa_v2 = TRUE;
e59a1001 14288 bfd_boolean warned_dynamic = FALSE;
95f0d0d2 14289 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
5bd4f169 14290
65f38f15 14291 /* Initialize howto table if needed. */
5bd4f169 14292 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
14293 ppc_howto_init ();
14294
65f38f15 14295 htab = ppc_hash_table (info);
4dfe6ac6
NC
14296 if (htab == NULL)
14297 return FALSE;
ee75fd95
AM
14298
14299 /* Don't relocate stub sections. */
e7d1c40c 14300 if (input_section->owner == htab->params->stub_bfd)
ee75fd95
AM
14301 return TRUE;
14302
7af5d5c4
AM
14303 if (!is_ppc64_elf (input_bfd))
14304 {
14305 bfd_set_error (bfd_error_wrong_format);
14306 return FALSE;
14307 }
0ffa91dd 14308
411e1bfb 14309 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 14310 TOCstart = elf_gp (output_bfd);
0ffa91dd 14311 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 14312 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 14313 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 14314
c316a17c 14315 rel = wrel = relocs;
5bd4f169 14316 relend = relocs + input_section->reloc_count;
c316a17c 14317 for (; rel < relend; wrel++, rel++)
5bd4f169 14318 {
04c9666a 14319 enum elf_ppc64_reloc_type r_type;
31c76678 14320 bfd_vma addend;
5bd4f169
AM
14321 bfd_reloc_status_type r;
14322 Elf_Internal_Sym *sym;
14323 asection *sec;
039b3fef
AM
14324 struct elf_link_hash_entry *h_elf;
14325 struct ppc_link_hash_entry *h;
14326 struct ppc_link_hash_entry *fdh;
5bd4f169 14327 const char *sym_name;
0d4792f7 14328 unsigned long r_symndx, toc_symndx;
3a71aa26 14329 bfd_vma toc_addend;
f961d9dd
AM
14330 unsigned char tls_mask, tls_gd, tls_type;
14331 unsigned char sym_type;
5bd4f169 14332 bfd_vma relocation;
23cedd1d 14333 bfd_boolean unresolved_reloc, save_unresolved_reloc;
b34976b6 14334 bfd_boolean warned;
bc30df16 14335 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 14336 unsigned int insn;
e11840f9 14337 unsigned int mask;
721956f4
AM
14338 struct ppc_stub_hash_entry *stub_entry;
14339 bfd_vma max_br_offset;
14340 bfd_vma from;
c316a17c 14341 Elf_Internal_Rela orig_rel;
b80eed39
AM
14342 reloc_howto_type *howto;
14343 struct reloc_howto_struct alt_howto;
4a421c53
AM
14344 uint64_t pinsn;
14345 bfd_vma offset;
5bd4f169 14346
c316a17c
AM
14347 again:
14348 orig_rel = *rel;
14349
4ce794b7 14350 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 14351 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
14352
14353 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
14354 symbol of the previous ADDR64 reloc. The symbol gives us the
14355 proper TOC base to use. */
14356 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
c316a17c
AM
14357 && wrel != relocs
14358 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
ee87f2da 14359 && is_opd)
c316a17c 14360 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
ee87f2da 14361
4ce794b7
AM
14362 sym = NULL;
14363 sec = NULL;
039b3fef 14364 h_elf = NULL;
4ce794b7 14365 sym_name = NULL;
b34976b6
AM
14366 unresolved_reloc = FALSE;
14367 warned = FALSE;
65f38f15 14368
0b13192e 14369 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
14370 {
14371 /* It's a local symbol. */
74f0fb50 14372 struct _opd_sec_data *opd;
4025353c 14373
5bd4f169
AM
14374 sym = local_syms + r_symndx;
14375 sec = local_sections[r_symndx];
26c61ae5 14376 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 14377 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 14378 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
14379 opd = get_opd_info (sec);
14380 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 14381 {
51aecdc5
AM
14382 long adjust = opd->adjust[OPD_NDX (sym->st_value
14383 + rel->r_addend)];
4025353c
AM
14384 if (adjust == -1)
14385 relocation = 0;
14386 else
4cc603a5
AM
14387 {
14388 /* If this is a relocation against the opd section sym
14389 and we have edited .opd, adjust the reloc addend so
14390 that ld -r and ld --emit-relocs output is correct.
14391 If it is a reloc against some other .opd symbol,
14392 then the symbol value will be adjusted later. */
14393 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
14394 rel->r_addend += adjust;
14395 else
14396 relocation += adjust;
14397 }
1e2f5b6e 14398 }
5bd4f169
AM
14399 }
14400 else
14401 {
62d887d4
L
14402 bfd_boolean ignored;
14403
b2a8e766
AM
14404 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
14405 r_symndx, symtab_hdr, sym_hashes,
039b3fef 14406 h_elf, sec, relocation,
62d887d4 14407 unresolved_reloc, warned, ignored);
039b3fef
AM
14408 sym_name = h_elf->root.root.string;
14409 sym_type = h_elf->type;
b69fdb4e
AM
14410 if (sec != NULL
14411 && sec->owner == output_bfd
14412 && strcmp (sec->name, ".opd") == 0)
14413 {
14414 /* This is a symbol defined in a linker script. All
14415 such are defined in output sections, even those
14416 defined by simple assignment from a symbol defined in
14417 an input section. Transfer the symbol to an
14418 appropriate input .opd section, so that a branch to
14419 this symbol will be mapped to the location specified
14420 by the opd entry. */
14421 struct bfd_link_order *lo;
14422 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
14423 if (lo->type == bfd_indirect_link_order)
14424 {
14425 asection *isec = lo->u.indirect.section;
14426 if (h_elf->root.u.def.value >= isec->output_offset
14427 && h_elf->root.u.def.value < (isec->output_offset
14428 + isec->size))
14429 {
14430 h_elf->root.u.def.value -= isec->output_offset;
14431 h_elf->root.u.def.section = isec;
14432 sec = isec;
14433 break;
14434 }
14435 }
14436 }
5bd4f169 14437 }
ed7007c1 14438 h = ppc_elf_hash_entry (h_elf);
5bd4f169 14439
dbaa2011 14440 if (sec != NULL && discarded_section (sec))
c316a17c
AM
14441 {
14442 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
14443 input_bfd, input_section,
0930cb30 14444 contents, rel->r_offset);
c316a17c
AM
14445 wrel->r_offset = rel->r_offset;
14446 wrel->r_info = 0;
14447 wrel->r_addend = 0;
14448
14449 /* For ld -r, remove relocations in debug sections against
dcd2b8a0 14450 symbols defined in discarded sections. Not done for
c316a17c
AM
14451 non-debug to preserve relocs in .eh_frame which the
14452 eh_frame editing code expects to be present. */
14453 if (bfd_link_relocatable (info)
14454 && (input_section->flags & SEC_DEBUGGING))
14455 wrel--;
14456
14457 continue;
14458 }
ab96bf03 14459
0e1862bb 14460 if (bfd_link_relocatable (info))
c316a17c 14461 goto copy_reloc;
ab96bf03 14462
f40da81b
AM
14463 if (h != NULL && &h->elf == htab->elf.hgot)
14464 {
6f20ed8a 14465 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
f40da81b
AM
14466 sec = bfd_abs_section_ptr;
14467 unresolved_reloc = FALSE;
14468 }
14469
951fd09b
AM
14470 /* TLS optimizations. Replace instruction sequences and relocs
14471 based on information we collected in tls_optimize. We edit
14472 RELOCS so that --emit-relocs will output something sensible
14473 for the final instruction stream. */
14474 tls_mask = 0;
14475 tls_gd = 0;
0d4792f7 14476 toc_symndx = 0;
727fc41e
AM
14477 if (h != NULL)
14478 tls_mask = h->tls_mask;
14479 else if (local_got_ents != NULL)
411e1bfb 14480 {
e054468f
AM
14481 struct plt_entry **local_plt = (struct plt_entry **)
14482 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 14483 unsigned char *lgot_masks = (unsigned char *)
e054468f 14484 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
14485 tls_mask = lgot_masks[r_symndx];
14486 }
37da22e5 14487 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
727fc41e
AM
14488 && (r_type == R_PPC64_TLS
14489 || r_type == R_PPC64_TLSGD
14490 || r_type == R_PPC64_TLSLD))
14491 {
14492 /* Check for toc tls entries. */
f961d9dd 14493 unsigned char *toc_tls;
0d4792f7 14494
727fc41e
AM
14495 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14496 &local_syms, rel, input_bfd))
14497 return FALSE;
0d4792f7 14498
727fc41e
AM
14499 if (toc_tls)
14500 tls_mask = *toc_tls;
0d4792f7
AM
14501 }
14502
14503 /* Check that tls relocs are used with tls syms, and non-tls
14504 relocs are used with non-tls syms. */
cf35638d 14505 if (r_symndx != STN_UNDEF
0d4792f7
AM
14506 && r_type != R_PPC64_NONE
14507 && (h == NULL
039b3fef
AM
14508 || h->elf.root.type == bfd_link_hash_defined
14509 || h->elf.root.type == bfd_link_hash_defweak)
71c4e95a 14510 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
0d4792f7 14511 {
37da22e5 14512 if ((tls_mask & TLS_TLS) != 0
727fc41e
AM
14513 && (r_type == R_PPC64_TLS
14514 || r_type == R_PPC64_TLSGD
14515 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
14516 /* R_PPC64_TLS is OK against a symbol in the TOC. */
14517 ;
14518 else
25f53a85 14519 info->callbacks->einfo
1d483afe 14520 (!IS_PPC64_TLS_RELOC (r_type)
695344c0 14521 /* xgettext:c-format */
c1c8c1ef 14522 ? _("%H: %s used with TLS symbol `%pT'\n")
695344c0 14523 /* xgettext:c-format */
c1c8c1ef 14524 : _("%H: %s used with non-TLS symbol `%pT'\n"),
25f53a85 14525 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
14526 ppc64_elf_howto_table[r_type]->name,
14527 sym_name);
411e1bfb
AM
14528 }
14529
14530 /* Ensure reloc mapping code below stays sane. */
14531 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
14532 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
14533 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
14534 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
14535 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
14536 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
14537 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
14538 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
14539 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
14540 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
14541 abort ();
0d4792f7 14542
411e1bfb
AM
14543 switch (r_type)
14544 {
14545 default:
411e1bfb
AM
14546 break;
14547
ba761f19 14548 case R_PPC64_LO_DS_OPT:
95f0d0d2 14549 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
2365f8d7 14550 if ((insn & (0x3fu << 26)) != 58u << 26)
ba761f19
AM
14551 abort ();
14552 insn += (14u << 26) - (58u << 26);
95f0d0d2 14553 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
ba761f19
AM
14554 r_type = R_PPC64_TOC16_LO;
14555 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14556 break;
14557
411e1bfb
AM
14558 case R_PPC64_TOC16:
14559 case R_PPC64_TOC16_LO:
14560 case R_PPC64_TOC16_DS:
14561 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
14562 {
14563 /* Check for toc tls entries. */
f961d9dd 14564 unsigned char *toc_tls;
951fd09b 14565 int retval;
411e1bfb 14566
3a71aa26
AM
14567 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14568 &local_syms, rel, input_bfd);
951fd09b 14569 if (retval == 0)
411e1bfb
AM
14570 return FALSE;
14571
14572 if (toc_tls)
14573 {
951fd09b 14574 tls_mask = *toc_tls;
411e1bfb
AM
14575 if (r_type == R_PPC64_TOC16_DS
14576 || r_type == R_PPC64_TOC16_LO_DS)
81407a69 14577 {
37da22e5 14578 if ((tls_mask & TLS_TLS) != 0
81407a69
AM
14579 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
14580 goto toctprel;
14581 }
411e1bfb 14582 else
951fd09b
AM
14583 {
14584 /* If we found a GD reloc pair, then we might be
14585 doing a GD->IE transition. */
14586 if (retval == 2)
14587 {
b00a0a86 14588 tls_gd = TLS_GDIE;
37da22e5
AM
14589 if ((tls_mask & TLS_TLS) != 0
14590 && (tls_mask & TLS_GD) == 0)
102890f0 14591 goto tls_ldgd_opt;
951fd09b
AM
14592 }
14593 else if (retval == 3)
14594 {
37da22e5
AM
14595 if ((tls_mask & TLS_TLS) != 0
14596 && (tls_mask & TLS_LD) == 0)
102890f0 14597 goto tls_ldgd_opt;
951fd09b
AM
14598 }
14599 }
411e1bfb
AM
14600 }
14601 }
14602 break;
14603
9d6ded02
AM
14604 case R_PPC64_GOT_TPREL16_HI:
14605 case R_PPC64_GOT_TPREL16_HA:
37da22e5 14606 if ((tls_mask & TLS_TLS) != 0
9d6ded02
AM
14607 && (tls_mask & TLS_TPREL) == 0)
14608 {
14609 rel->r_offset -= d_offset;
95f0d0d2 14610 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
9d6ded02
AM
14611 r_type = R_PPC64_NONE;
14612 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14613 }
14614 break;
14615
411e1bfb
AM
14616 case R_PPC64_GOT_TPREL16_DS:
14617 case R_PPC64_GOT_TPREL16_LO_DS:
37da22e5 14618 if ((tls_mask & TLS_TLS) != 0
951fd09b 14619 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14620 {
81407a69 14621 toctprel:
95f0d0d2 14622 insn = bfd_get_32 (input_bfd,
c316a17c 14623 contents + rel->r_offset - d_offset);
411e1bfb
AM
14624 insn &= 31 << 21;
14625 insn |= 0x3c0d0000; /* addis 0,13,0 */
95f0d0d2 14626 bfd_put_32 (input_bfd, insn,
c316a17c 14627 contents + rel->r_offset - d_offset);
411e1bfb 14628 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
14629 if (toc_symndx != 0)
14630 {
14631 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 14632 rel->r_addend = toc_addend;
0d4792f7
AM
14633 /* We changed the symbol. Start over in order to
14634 get h, sym, sec etc. right. */
c316a17c 14635 goto again;
0d4792f7
AM
14636 }
14637 else
14638 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14639 }
14640 break;
14641
c213164a
AM
14642 case R_PPC64_GOT_TPREL34:
14643 if ((tls_mask & TLS_TLS) != 0
14644 && (tls_mask & TLS_TPREL) == 0)
14645 {
14646 /* pld ra,sym@got@tprel@pcrel -> paddi ra,r13,sym@tprel */
14647 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14648 pinsn <<= 32;
14649 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14650 pinsn += ((2ULL << 56) + (-1ULL << 52)
14651 + (14ULL << 26) - (57ULL << 26) + (13ULL << 16));
14652 bfd_put_32 (input_bfd, pinsn >> 32,
14653 contents + rel->r_offset);
14654 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14655 contents + rel->r_offset + 4);
14656 r_type = R_PPC64_TPREL34;
14657 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14658 }
14659 break;
14660
411e1bfb 14661 case R_PPC64_TLS:
37da22e5 14662 if ((tls_mask & TLS_TLS) != 0
951fd09b 14663 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14664 {
c213164a 14665 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2d0f3896
AM
14666 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
14667 if (insn == 0)
c213164a
AM
14668 break;
14669 if ((rel->r_offset & 3) == 0)
0d4792f7 14670 {
c213164a
AM
14671 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
14672 /* Was PPC64_TLS which sits on insn boundary, now
14673 PPC64_TPREL16_LO which is at low-order half-word. */
14674 rel->r_offset += d_offset;
14675 r_type = R_PPC64_TPREL16_LO;
14676 if (toc_symndx != 0)
14677 {
14678 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
14679 rel->r_addend = toc_addend;
14680 /* We changed the symbol. Start over in order to
14681 get h, sym, sec etc. right. */
14682 goto again;
14683 }
14684 else
14685 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14686 }
14687 else if ((rel->r_offset & 3) == 1)
14688 {
14689 /* For pcrel IE to LE we already have the full
14690 offset and thus don't need an addi here. A nop
14691 or mr will do. */
2365f8d7 14692 if ((insn & (0x3fu << 26)) == 14 << 26)
c213164a
AM
14693 {
14694 /* Extract regs from addi rt,ra,si. */
14695 unsigned int rt = (insn >> 21) & 0x1f;
14696 unsigned int ra = (insn >> 16) & 0x1f;
14697 if (rt == ra)
14698 insn = NOP;
14699 else
14700 {
14701 /* Build or ra,rs,rb with rb==rs, ie. mr ra,rs. */
14702 insn = (rt << 16) | (ra << 21) | (ra << 11);
14703 insn |= (31u << 26) | (444u << 1);
14704 }
14705 }
14706 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - 1);
0d4792f7 14707 }
411e1bfb
AM
14708 }
14709 break;
14710
411e1bfb
AM
14711 case R_PPC64_GOT_TLSGD16_HI:
14712 case R_PPC64_GOT_TLSGD16_HA:
b00a0a86 14713 tls_gd = TLS_GDIE;
37da22e5 14714 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
951fd09b
AM
14715 goto tls_gdld_hi;
14716 break;
14717
411e1bfb
AM
14718 case R_PPC64_GOT_TLSLD16_HI:
14719 case R_PPC64_GOT_TLSLD16_HA:
37da22e5 14720 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 14721 {
951fd09b
AM
14722 tls_gdld_hi:
14723 if ((tls_mask & tls_gd) != 0)
14724 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14725 + R_PPC64_GOT_TPREL16_DS);
14726 else
411e1bfb 14727 {
4fe5ca5b 14728 rel->r_offset -= d_offset;
95f0d0d2 14729 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
951fd09b 14730 r_type = R_PPC64_NONE;
411e1bfb 14731 }
951fd09b 14732 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14733 }
14734 break;
14735
951fd09b
AM
14736 case R_PPC64_GOT_TLSGD16:
14737 case R_PPC64_GOT_TLSGD16_LO:
b00a0a86 14738 tls_gd = TLS_GDIE;
37da22e5 14739 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
102890f0 14740 goto tls_ldgd_opt;
951fd09b 14741 break;
411e1bfb 14742
951fd09b
AM
14743 case R_PPC64_GOT_TLSLD16:
14744 case R_PPC64_GOT_TLSLD16_LO:
37da22e5 14745 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
951fd09b 14746 {
b9f04fe0 14747 unsigned int insn1, insn2;
102890f0
AM
14748
14749 tls_ldgd_opt:
727fc41e
AM
14750 offset = (bfd_vma) -1;
14751 /* If not using the newer R_PPC64_TLSGD/LD to mark
14752 __tls_get_addr calls, we must trust that the call
14753 stays with its arg setup insns, ie. that the next
14754 reloc is the __tls_get_addr call associated with
14755 the current reloc. Edit both insns. */
9737e8af 14756 if (input_section->nomark_tls_get_addr
727fc41e
AM
14757 && rel + 1 < relend
14758 && branch_reloc_hash_match (input_bfd, rel + 1,
14759 htab->tls_get_addr,
14760 htab->tls_get_addr_fd))
14761 offset = rel[1].r_offset;
b86ac8e3
AM
14762 /* We read the low GOT_TLS (or TOC16) insn because we
14763 need to keep the destination reg. It may be
14764 something other than the usual r3, and moved to r3
14765 before the call by intervening code. */
95f0d0d2 14766 insn1 = bfd_get_32 (input_bfd,
b86ac8e3 14767 contents + rel->r_offset - d_offset);
102890f0 14768 if ((tls_mask & tls_gd) != 0)
411e1bfb 14769 {
102890f0 14770 /* IE */
b86ac8e3 14771 insn1 &= (0x1f << 21) | (0x1f << 16);
2365f8d7 14772 insn1 |= 58u << 26; /* ld */
102890f0 14773 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 14774 if (offset != (bfd_vma) -1)
f58d5a2d 14775 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
46e9995a
AM
14776 if (r_type == R_PPC64_TOC16
14777 || r_type == R_PPC64_TOC16_LO)
102890f0 14778 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
46e9995a
AM
14779 else
14780 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 1)) & 1)
14781 + R_PPC64_GOT_TPREL16_DS);
102890f0
AM
14782 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14783 }
14784 else
14785 {
14786 /* LE */
b86ac8e3
AM
14787 insn1 &= 0x1f << 21;
14788 insn1 |= 0x3c0d0000; /* addis r,13,0 */
102890f0
AM
14789 insn2 = 0x38630000; /* addi 3,3,0 */
14790 if (tls_gd == 0)
951fd09b 14791 {
102890f0 14792 /* Was an LD reloc. */
71c4e95a 14793 r_symndx = STN_UNDEF;
102890f0 14794 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
951fd09b 14795 }
102890f0 14796 else if (toc_symndx != 0)
3a71aa26
AM
14797 {
14798 r_symndx = toc_symndx;
14799 rel->r_addend = toc_addend;
14800 }
102890f0
AM
14801 r_type = R_PPC64_TPREL16_HA;
14802 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
14803 if (offset != (bfd_vma) -1)
14804 {
14805 rel[1].r_info = ELF64_R_INFO (r_symndx,
14806 R_PPC64_TPREL16_LO);
14807 rel[1].r_offset = offset + d_offset;
14808 rel[1].r_addend = rel->r_addend;
14809 }
102890f0 14810 }
95f0d0d2 14811 bfd_put_32 (input_bfd, insn1,
3a71aa26 14812 contents + rel->r_offset - d_offset);
727fc41e 14813 if (offset != (bfd_vma) -1)
c96e0573
AM
14814 {
14815 bfd_put_32 (input_bfd, insn2, contents + offset);
14816 if (offset + 8 <= input_section->size)
14817 {
14818 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
14819 if (insn2 == LD_R2_0R1 + STK_TOC (htab))
14820 bfd_put_32 (input_bfd, NOP, contents + offset + 4);
14821 }
14822 }
727fc41e
AM
14823 if ((tls_mask & tls_gd) == 0
14824 && (tls_gd == 0 || toc_symndx != 0))
14825 {
14826 /* We changed the symbol. Start over in order
14827 to get h, sym, sec etc. right. */
c316a17c 14828 goto again;
727fc41e
AM
14829 }
14830 }
14831 break;
14832
c213164a
AM
14833 case R_PPC64_GOT_TLSGD34:
14834 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
14835 {
14836 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14837 pinsn <<= 32;
14838 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14839 if ((tls_mask & TLS_GDIE) != 0)
14840 {
14841 /* IE, pla -> pld */
14842 pinsn += (-2ULL << 56) + (57ULL << 26) - (14ULL << 26);
14843 r_type = R_PPC64_GOT_TPREL34;
14844 }
14845 else
14846 {
14847 /* LE, pla pcrel -> paddi r13 */
14848 pinsn += (-1ULL << 52) + (13ULL << 16);
14849 r_type = R_PPC64_TPREL34;
14850 }
14851 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14852 bfd_put_32 (input_bfd, pinsn >> 32,
14853 contents + rel->r_offset);
14854 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14855 contents + rel->r_offset + 4);
14856 }
14857 break;
14858
14859 case R_PPC64_GOT_TLSLD34:
14860 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
14861 {
14862 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14863 pinsn <<= 32;
14864 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14865 pinsn += (-1ULL << 52) + (13ULL << 16);
14866 bfd_put_32 (input_bfd, pinsn >> 32,
14867 contents + rel->r_offset);
14868 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14869 contents + rel->r_offset + 4);
14870 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
14871 r_symndx = STN_UNDEF;
14872 r_type = R_PPC64_TPREL34;
14873 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14874 goto again;
14875 }
14876 break;
14877
727fc41e 14878 case R_PPC64_TLSGD:
37da22e5 14879 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
675e2809 14880 && rel + 1 < relend)
727fc41e 14881 {
b9f04fe0 14882 unsigned int insn2;
5663e321 14883 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 14884
4a421c53 14885 offset = rel->r_offset;
5663e321 14886 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
14887 {
14888 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
14889 if (r_type1 == R_PPC64_PLT_PCREL34
14890 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
14891 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
14892 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14893 break;
14894 }
14895
14896 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14897 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14898
b00a0a86 14899 if ((tls_mask & TLS_GDIE) != 0)
727fc41e
AM
14900 {
14901 /* IE */
14902 r_type = R_PPC64_NONE;
14903 insn2 = 0x7c636a14; /* add 3,3,13 */
14904 }
14905 else
14906 {
14907 /* LE */
14908 if (toc_symndx != 0)
14909 {
14910 r_symndx = toc_symndx;
14911 rel->r_addend = toc_addend;
14912 }
c213164a
AM
14913 if (r_type1 == R_PPC64_REL24_NOTOC
14914 || r_type1 == R_PPC64_PLTCALL_NOTOC)
14915 {
14916 r_type = R_PPC64_NONE;
14917 insn2 = NOP;
14918 }
14919 else
14920 {
14921 rel->r_offset = offset + d_offset;
14922 r_type = R_PPC64_TPREL16_LO;
14923 insn2 = 0x38630000; /* addi 3,3,0 */
14924 }
727fc41e
AM
14925 }
14926 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14927 /* Zap the reloc on the _tls_get_addr call too. */
14928 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14929 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 14930 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
14931 if ((tls_mask & TLS_GDIE) == 0
14932 && toc_symndx != 0
14933 && r_type != R_PPC64_NONE)
c316a17c 14934 goto again;
411e1bfb 14935 }
411e1bfb
AM
14936 break;
14937
727fc41e 14938 case R_PPC64_TLSLD:
37da22e5 14939 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
675e2809 14940 && rel + 1 < relend)
727fc41e 14941 {
b9f04fe0 14942 unsigned int insn2;
5663e321 14943 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 14944
4a421c53 14945 offset = rel->r_offset;
5663e321 14946 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
14947 {
14948 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
14949 if (r_type1 == R_PPC64_PLT_PCREL34
14950 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
14951 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
14952 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14953 break;
14954 }
14955
14956 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14957 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14958
c213164a
AM
14959 if (r_type1 == R_PPC64_REL24_NOTOC
14960 || r_type1 == R_PPC64_PLTCALL_NOTOC)
14961 {
14962 r_type = R_PPC64_NONE;
14963 insn2 = NOP;
14964 }
14965 else
14966 {
14967 rel->r_offset = offset + d_offset;
14968 r_symndx = STN_UNDEF;
14969 r_type = R_PPC64_TPREL16_LO;
14970 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
14971 insn2 = 0x38630000; /* addi 3,3,0 */
14972 }
727fc41e 14973 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
14974 /* Zap the reloc on the _tls_get_addr call too. */
14975 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14976 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 14977 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
14978 if (r_type != R_PPC64_NONE)
14979 goto again;
727fc41e
AM
14980 }
14981 break;
14982
411e1bfb 14983 case R_PPC64_DTPMOD64:
951fd09b
AM
14984 if (rel + 1 < relend
14985 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
14986 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 14987 {
951fd09b
AM
14988 if ((tls_mask & TLS_GD) == 0)
14989 {
14990 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
b00a0a86 14991 if ((tls_mask & TLS_GDIE) != 0)
951fd09b
AM
14992 r_type = R_PPC64_TPREL64;
14993 else
14994 {
4ce794b7 14995 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
14996 r_type = R_PPC64_NONE;
14997 }
14998 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14999 }
15000 }
15001 else
15002 {
15003 if ((tls_mask & TLS_LD) == 0)
411e1bfb 15004 {
4ce794b7 15005 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 15006 r_type = R_PPC64_NONE;
951fd09b 15007 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 15008 }
411e1bfb
AM
15009 }
15010 break;
15011
15012 case R_PPC64_TPREL64:
951fd09b 15013 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
15014 {
15015 r_type = R_PPC64_NONE;
15016 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15017 }
15018 break;
52a82034 15019
006589cf
AM
15020 case R_PPC64_ENTRY:
15021 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
15022 if (!bfd_link_pic (info)
15023 && !info->traditional_format
15024 && relocation + 0x80008000 <= 0xffffffff)
15025 {
15026 unsigned int insn1, insn2;
15027
15028 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15029 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15030 if ((insn1 & ~0xfffc) == LD_R2_0R12
15031 && insn2 == ADD_R2_R2_R12)
15032 {
95f0d0d2 15033 bfd_put_32 (input_bfd,
006589cf
AM
15034 LIS_R2 + PPC_HA (relocation),
15035 contents + rel->r_offset);
95f0d0d2 15036 bfd_put_32 (input_bfd,
006589cf
AM
15037 ADDI_R2_R2 + PPC_LO (relocation),
15038 contents + rel->r_offset + 4);
15039 }
15040 }
15041 else
15042 {
15043 relocation -= (rel->r_offset
15044 + input_section->output_offset
15045 + input_section->output_section->vma);
15046 if (relocation + 0x80008000 <= 0xffffffff)
15047 {
15048 unsigned int insn1, insn2;
15049
15050 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15051 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15052 if ((insn1 & ~0xfffc) == LD_R2_0R12
15053 && insn2 == ADD_R2_R2_R12)
15054 {
95f0d0d2 15055 bfd_put_32 (input_bfd,
006589cf
AM
15056 ADDIS_R2_R12 + PPC_HA (relocation),
15057 contents + rel->r_offset);
95f0d0d2 15058 bfd_put_32 (input_bfd,
006589cf
AM
15059 ADDI_R2_R2 + PPC_LO (relocation),
15060 contents + rel->r_offset + 4);
15061 }
15062 }
15063 }
15064 break;
15065
52a82034
AM
15066 case R_PPC64_REL16_HA:
15067 /* If we are generating a non-PIC executable, edit
15068 . 0: addis 2,12,.TOC.-0b@ha
15069 . addi 2,2,.TOC.-0b@l
15070 used by ELFv2 global entry points to set up r2, to
15071 . lis 2,.TOC.@ha
15072 . addi 2,2,.TOC.@l
15073 if .TOC. is in range. */
0e1862bb 15074 if (!bfd_link_pic (info)
810d4e75 15075 && !info->traditional_format
006589cf 15076 && !htab->opd_abi
4f038ee5 15077 && rel->r_addend == d_offset
52a82034
AM
15078 && h != NULL && &h->elf == htab->elf.hgot
15079 && rel + 1 < relend
15080 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
15081 && rel[1].r_offset == rel->r_offset + 4
15082 && rel[1].r_addend == rel->r_addend + 4
15083 && relocation + 0x80008000 <= 0xffffffff)
15084 {
15085 unsigned int insn1, insn2;
4a421c53 15086 offset = rel->r_offset - d_offset;
95f0d0d2
AM
15087 insn1 = bfd_get_32 (input_bfd, contents + offset);
15088 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
006589cf
AM
15089 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
15090 && (insn2 & 0xffff0000) == ADDI_R2_R2)
52a82034
AM
15091 {
15092 r_type = R_PPC64_ADDR16_HA;
15093 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15094 rel->r_addend -= d_offset;
15095 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
15096 rel[1].r_addend -= d_offset + 4;
95f0d0d2 15097 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
52a82034
AM
15098 }
15099 }
15100 break;
411e1bfb
AM
15101 }
15102
15103 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 15104 insn = 0;
b25116a9
AM
15105 max_br_offset = 1 << 25;
15106 addend = rel->r_addend;
bc30df16 15107 reloc_dest = DEST_NORMAL;
65f38f15 15108 switch (r_type)
5bd4f169
AM
15109 {
15110 default:
65f38f15 15111 break;
5bd4f169 15112
3b421ab3
AM
15113 case R_PPC64_TOCSAVE:
15114 if (relocation + addend == (rel->r_offset
15115 + input_section->output_offset
15116 + input_section->output_section->vma)
15117 && tocsave_find (htab, NO_INSERT,
15118 &local_syms, rel, input_bfd))
15119 {
15120 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15121 if (insn == NOP
15122 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
15123 bfd_put_32 (input_bfd,
15124 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
15125 contents + rel->r_offset);
15126 }
15127 break;
15128
65f38f15
AM
15129 /* Branch taken prediction relocations. */
15130 case R_PPC64_ADDR14_BRTAKEN:
15131 case R_PPC64_REL14_BRTAKEN:
cedb70c5 15132 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
1a0670f3 15133 /* Fall through. */
65f38f15 15134
86c76c7b 15135 /* Branch not taken prediction relocations. */
65f38f15
AM
15136 case R_PPC64_ADDR14_BRNTAKEN:
15137 case R_PPC64_REL14_BRNTAKEN:
95f0d0d2 15138 insn |= bfd_get_32 (input_bfd,
411e1bfb 15139 contents + rel->r_offset) & ~(0x01 << 21);
1a0670f3 15140 /* Fall through. */
86c76c7b 15141
b25116a9
AM
15142 case R_PPC64_REL14:
15143 max_br_offset = 1 << 15;
1a0670f3 15144 /* Fall through. */
5bd4f169 15145
65f38f15 15146 case R_PPC64_REL24:
05d0e962 15147 case R_PPC64_REL24_NOTOC:
23cedd1d 15148 case R_PPC64_PLTCALL:
5663e321 15149 case R_PPC64_PLTCALL_NOTOC:
ad8e1ba5
AM
15150 /* Calls to functions with a different TOC, such as calls to
15151 shared objects, need to alter the TOC pointer. This is
15152 done using a linkage stub. A REL24 branching to these
15153 linkage stubs needs to be followed by a nop, as the nop
15154 will be replaced with an instruction to restore the TOC
15155 base pointer. */
8387904d 15156 fdh = h;
b31867b6
AM
15157 if (h != NULL
15158 && h->oh != NULL
15159 && h->oh->is_func_descriptor)
15160 fdh = ppc_follow_link (h->oh);
31c76678
DK
15161 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
15162 htab);
5663e321
AM
15163 if ((r_type == R_PPC64_PLTCALL
15164 || r_type == R_PPC64_PLTCALL_NOTOC)
23cedd1d 15165 && stub_entry != NULL
05d0e962
AM
15166 && stub_entry->stub_type >= ppc_stub_plt_call
15167 && stub_entry->stub_type <= ppc_stub_plt_call_both)
23cedd1d
AM
15168 stub_entry = NULL;
15169
6abec6bc 15170 if (stub_entry != NULL
d0abeec8
AM
15171 && ((stub_entry->stub_type >= ppc_stub_plt_call
15172 && stub_entry->stub_type <= ppc_stub_plt_call_both)
ad8e1ba5 15173 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
05d0e962
AM
15174 || stub_entry->stub_type == ppc_stub_plt_branch_both
15175 || stub_entry->stub_type == ppc_stub_long_branch_r2off
15176 || stub_entry->stub_type == ppc_stub_long_branch_both))
41bd81ab 15177 {
b25116a9 15178 bfd_boolean can_plt_call = FALSE;
721956f4 15179
6e1816be
AM
15180 if (stub_entry->stub_type == ppc_stub_plt_call
15181 && !htab->opd_abi
15182 && htab->params->plt_localentry0 != 0
15183 && is_elfv2_localentry0 (&h->elf))
15184 {
15185 /* The function doesn't use or change r2. */
15186 can_plt_call = TRUE;
15187 }
05d0e962
AM
15188 else if (r_type == R_PPC64_REL24_NOTOC)
15189 {
15190 /* NOTOC calls don't need to restore r2. */
15191 can_plt_call = TRUE;
15192 }
6e1816be 15193
f378ab09 15194 /* All of these stubs may modify r2, so there must be a
ba8ca3e7
AM
15195 branch and link followed by a nop. The nop is
15196 replaced by an insn to restore r2. */
6e1816be 15197 else if (rel->r_offset + 8 <= input_section->size)
41bd81ab 15198 {
ba8ca3e7
AM
15199 unsigned long br;
15200
15201 br = bfd_get_32 (input_bfd,
15202 contents + rel->r_offset);
15203 if ((br & 1) != 0)
41bd81ab 15204 {
ba8ca3e7
AM
15205 unsigned long nop;
15206
15207 nop = bfd_get_32 (input_bfd,
15208 contents + rel->r_offset + 4);
23cedd1d
AM
15209 if (nop == LD_R2_0R1 + STK_TOC (htab))
15210 can_plt_call = TRUE;
15211 else if (nop == NOP
15212 || nop == CROR_151515
15213 || nop == CROR_313131)
a7f2871e 15214 {
ba8ca3e7 15215 if (h != NULL
ed7007c1 15216 && is_tls_get_addr (&h->elf, htab)
7c9cf415 15217 && htab->params->tls_get_addr_opt)
ba8ca3e7
AM
15218 {
15219 /* Special stub used, leave nop alone. */
15220 }
15221 else
a078d95a
AM
15222 bfd_put_32 (input_bfd,
15223 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7
AM
15224 contents + rel->r_offset + 4);
15225 can_plt_call = TRUE;
a7f2871e 15226 }
41bd81ab 15227 }
5bd4f169 15228 }
721956f4 15229
ba8ca3e7 15230 if (!can_plt_call && h != NULL)
721956f4 15231 {
ba8ca3e7
AM
15232 const char *name = h->elf.root.root.string;
15233
15234 if (*name == '.')
15235 ++name;
15236
15237 if (strncmp (name, "__libc_start_main", 17) == 0
15238 && (name[17] == 0 || name[17] == '@'))
6ab189d5 15239 {
ba8ca3e7
AM
15240 /* Allow crt1 branch to go via a toc adjusting
15241 stub. Other calls that never return could do
15242 the same, if we could detect such. */
b25116a9 15243 can_plt_call = TRUE;
6ab189d5 15244 }
ba8ca3e7
AM
15245 }
15246
15247 if (!can_plt_call)
15248 {
15249 /* g++ as of 20130507 emits self-calls without a
15250 following nop. This is arguably wrong since we
15251 have conflicting information. On the one hand a
15252 global symbol and on the other a local call
15253 sequence, but don't error for this special case.
15254 It isn't possible to cheaply verify we have
15255 exactly such a call. Allow all calls to the same
15256 section. */
15257 asection *code_sec = sec;
15258
15259 if (get_opd_info (sec) != NULL)
ad8e1ba5 15260 {
ba8ca3e7
AM
15261 bfd_vma off = (relocation + addend
15262 - sec->output_section->vma
15263 - sec->output_offset);
bc30df16 15264
ba8ca3e7 15265 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 15266 }
ba8ca3e7
AM
15267 if (code_sec == input_section)
15268 can_plt_call = TRUE;
15269 }
15270
15271 if (!can_plt_call)
15272 {
05d0e962
AM
15273 if (stub_entry->stub_type >= ppc_stub_plt_call
15274 && stub_entry->stub_type <= ppc_stub_plt_call_both)
4805fc55 15275 info->callbacks->einfo
695344c0 15276 /* xgettext:c-format */
c1c8c1ef 15277 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15278 "(plt call stub)\n"),
4805fc55
AM
15279 input_bfd, input_section, rel->r_offset, sym_name);
15280 else
15281 info->callbacks->einfo
695344c0 15282 /* xgettext:c-format */
c1c8c1ef 15283 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15284 "(toc save/adjust stub)\n"),
4805fc55 15285 input_bfd, input_section, rel->r_offset, sym_name);
ba8ca3e7
AM
15286
15287 bfd_set_error (bfd_error_bad_value);
15288 ret = FALSE;
721956f4
AM
15289 }
15290
b25116a9 15291 if (can_plt_call
05d0e962
AM
15292 && stub_entry->stub_type >= ppc_stub_plt_call
15293 && stub_entry->stub_type <= ppc_stub_plt_call_both)
b25116a9
AM
15294 unresolved_reloc = FALSE;
15295 }
15296
6abec6bc
AM
15297 if ((stub_entry == NULL
15298 || stub_entry->stub_type == ppc_stub_long_branch
15299 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
15300 && get_opd_info (sec) != NULL)
15301 {
15302 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
15303 bfd_vma off = (relocation + addend
15304 - sec->output_section->vma
15305 - sec->output_offset);
aef36ac1 15306 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
15307 if (dest != (bfd_vma) -1)
15308 {
15309 relocation = dest;
15310 addend = 0;
bc30df16 15311 reloc_dest = DEST_OPD;
8387904d
AM
15312 }
15313 }
15314
b25116a9
AM
15315 /* If the branch is out of reach we ought to have a long
15316 branch stub. */
15317 from = (rel->r_offset
15318 + input_section->output_offset
15319 + input_section->output_section->vma);
15320
6911b7dc
AM
15321 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
15322 ? fdh->elf.other
15323 : sym->st_other);
15324
6abec6bc
AM
15325 if (stub_entry != NULL
15326 && (stub_entry->stub_type == ppc_stub_long_branch
15327 || stub_entry->stub_type == ppc_stub_plt_branch)
15328 && (r_type == R_PPC64_ADDR14_BRTAKEN
15329 || r_type == R_PPC64_ADDR14_BRNTAKEN
15330 || (relocation + addend - from + max_br_offset
15331 < 2 * max_br_offset)))
15332 /* Don't use the stub if this branch is in range. */
15333 stub_entry = NULL;
b25116a9 15334
05d0e962
AM
15335 if (stub_entry != NULL
15336 && (stub_entry->stub_type == ppc_stub_long_branch_notoc
15337 || stub_entry->stub_type == ppc_stub_long_branch_both
15338 || stub_entry->stub_type == ppc_stub_plt_branch_notoc
15339 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15340 && (r_type != R_PPC64_REL24_NOTOC
15341 || ((fdh ? fdh->elf.other : sym->st_other)
4a4e7361 15342 & STO_PPC64_LOCAL_MASK) <= 1 << STO_PPC64_LOCAL_BIT)
05d0e962
AM
15343 && (relocation + addend - from + max_br_offset
15344 < 2 * max_br_offset))
15345 stub_entry = NULL;
15346
15347 if (stub_entry != NULL
15348 && (stub_entry->stub_type == ppc_stub_long_branch_r2off
15349 || stub_entry->stub_type == ppc_stub_long_branch_both
15350 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
15351 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15352 && r_type == R_PPC64_REL24_NOTOC
15353 && (relocation + addend - from + max_br_offset
15354 < 2 * max_br_offset))
15355 stub_entry = NULL;
15356
b25116a9
AM
15357 if (stub_entry != NULL)
15358 {
15359 /* Munge up the value and addend so that we call the stub
15360 rather than the procedure directly. */
a4b6fadd
AM
15361 asection *stub_sec = stub_entry->group->stub_sec;
15362
15363 if (stub_entry->stub_type == ppc_stub_save_res)
15364 relocation += (stub_sec->output_offset
15365 + stub_sec->output_section->vma
15366 + stub_sec->size - htab->sfpr->size
15367 - htab->sfpr->output_offset
15368 - htab->sfpr->output_section->vma);
15369 else
15370 relocation = (stub_entry->stub_offset
15371 + stub_sec->output_offset
15372 + stub_sec->output_section->vma);
b25116a9 15373 addend = 0;
bc30df16 15374 reloc_dest = DEST_STUB;
3b421ab3 15375
05d0e962
AM
15376 if (((stub_entry->stub_type == ppc_stub_plt_call
15377 && ALWAYS_EMIT_R2SAVE)
15378 || stub_entry->stub_type == ppc_stub_plt_call_r2save
15379 || stub_entry->stub_type == ppc_stub_plt_call_both)
e81b4c93 15380 && !(h != NULL
ed7007c1 15381 && is_tls_get_addr (&h->elf, htab)
e81b4c93 15382 && htab->params->tls_get_addr_opt)
3b421ab3
AM
15383 && rel + 1 < relend
15384 && rel[1].r_offset == rel->r_offset + 4
15385 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
15386 relocation += 4;
05d0e962
AM
15387 else if ((stub_entry->stub_type == ppc_stub_long_branch_both
15388 || stub_entry->stub_type == ppc_stub_plt_branch_both
15389 || stub_entry->stub_type == ppc_stub_plt_call_both)
15390 && r_type == R_PPC64_REL24_NOTOC)
15391 relocation += 4;
5663e321
AM
15392
15393 if (r_type == R_PPC64_REL24_NOTOC
15394 && (stub_entry->stub_type == ppc_stub_plt_call_notoc
15395 || stub_entry->stub_type == ppc_stub_plt_call_both))
15396 htab->notoc_plt = 1;
b25116a9
AM
15397 }
15398
15399 if (insn != 0)
15400 {
794e51c0 15401 if (is_isa_v2)
721956f4 15402 {
b25116a9
AM
15403 /* Set 'a' bit. This is 0b00010 in BO field for branch
15404 on CR(BI) insns (BO == 001at or 011at), and 0b01000
15405 for branch on CTR insns (BO == 1a00t or 1a01t). */
15406 if ((insn & (0x14 << 21)) == (0x04 << 21))
15407 insn |= 0x02 << 21;
15408 else if ((insn & (0x14 << 21)) == (0x10 << 21))
15409 insn |= 0x08 << 21;
15410 else
15411 break;
15412 }
15413 else
15414 {
15415 /* Invert 'y' bit if not the default. */
4cc603a5 15416 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 15417 insn ^= 0x01 << 21;
721956f4 15418 }
b25116a9 15419
95f0d0d2 15420 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
5bd4f169 15421 }
e86ce104 15422
06da1e8e
AM
15423 /* NOP out calls to undefined weak functions.
15424 We can thus call a weak function without first
15425 checking whether the function is defined. */
b25116a9 15426 else if (h != NULL
039b3fef 15427 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 15428 && h->elf.dynindx == -1
05d0e962
AM
15429 && (r_type == R_PPC64_REL24
15430 || r_type == R_PPC64_REL24_NOTOC)
b25116a9 15431 && relocation == 0
4cc603a5 15432 && addend == 0)
e86ce104 15433 {
95f0d0d2 15434 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
c316a17c 15435 goto copy_reloc;
e86ce104 15436 }
65f38f15 15437 break;
066f4018
AM
15438
15439 case R_PPC64_GOT16_DS:
15440 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15441 if (relocation + addend - from + 0x8000 < 0x10000
15442 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15443 {
15444 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15445 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15446 {
15447 insn += (14u << 26) - (58u << 26);
15448 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15449 r_type = R_PPC64_TOC16;
15450 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15451 }
15452 }
15453 break;
15454
15455 case R_PPC64_GOT16_LO_DS:
15456 case R_PPC64_GOT16_HA:
15457 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15458 if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
15459 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15460 {
15461 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15462 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15463 {
15464 insn += (14u << 26) - (58u << 26);
15465 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15466 r_type = R_PPC64_TOC16_LO;
15467 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15468 }
2365f8d7 15469 else if ((insn & (0x3fu << 26)) == 15u << 26 /* addis */)
066f4018
AM
15470 {
15471 r_type = R_PPC64_TOC16_HA;
15472 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15473 }
15474 }
15475 break;
4a421c53
AM
15476
15477 case R_PPC64_GOT_PCREL34:
15478 from = (rel->r_offset
15479 + input_section->output_section->vma
15480 + input_section->output_offset);
15481 if (relocation - from + (1ULL << 33) < 1ULL << 34
15482 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15483 {
15484 offset = rel->r_offset;
15485 pinsn = bfd_get_32 (input_bfd, contents + offset);
15486 pinsn <<= 32;
15487 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15488 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15489 == ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
15490 {
15491 /* Replace with paddi. */
15492 pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
15493 r_type = R_PPC64_PCREL34;
15494 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15495 bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
15496 bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
15497 goto pcrelopt;
15498 }
15499 }
15500 break;
15501
15502 case R_PPC64_PCREL34:
15503 if (SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15504 {
15505 offset = rel->r_offset;
15506 pinsn = bfd_get_32 (input_bfd, contents + offset);
15507 pinsn <<= 32;
15508 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15509 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15510 == ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
15511 | (14ULL << 26) /* paddi */))
15512 {
15513 pcrelopt:
15514 if (rel + 1 < relend
15515 && rel[1].r_offset == offset
15516 && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT))
15517 {
15518 bfd_vma off2 = rel[1].r_addend;
15519 if (off2 == 0)
15520 /* zero means next insn. */
15521 off2 = 8;
15522 off2 += offset;
15523 if (off2 + 4 <= input_section->size)
15524 {
15525 uint64_t pinsn2;
dd9b12c2 15526 bfd_signed_vma addend_off;
4a421c53
AM
15527 pinsn2 = bfd_get_32 (input_bfd, contents + off2);
15528 pinsn2 <<= 32;
15529 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
77486630
AM
15530 {
15531 if (off2 + 8 > input_section->size)
15532 break;
15533 pinsn2 |= bfd_get_32 (input_bfd,
15534 contents + off2 + 4);
15535 }
dd9b12c2 15536 if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
4a421c53 15537 {
dd9b12c2
AM
15538 addend += addend_off;
15539 rel->r_addend = addend;
4a421c53
AM
15540 bfd_put_32 (input_bfd, pinsn >> 32,
15541 contents + offset);
15542 bfd_put_32 (input_bfd, pinsn,
15543 contents + offset + 4);
15544 bfd_put_32 (input_bfd, pinsn2 >> 32,
15545 contents + off2);
77486630
AM
15546 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
15547 bfd_put_32 (input_bfd, pinsn2,
15548 contents + off2 + 4);
4a421c53
AM
15549 }
15550 }
15551 }
15552 }
15553 }
15554 break;
65f38f15 15555 }
5bd4f169 15556
411e1bfb 15557 tls_type = 0;
23cedd1d 15558 save_unresolved_reloc = unresolved_reloc;
65f38f15
AM
15559 switch (r_type)
15560 {
15561 default:
cf97bcb0
AM
15562 /* xgettext:c-format */
15563 _bfd_error_handler (_("%pB: %s unsupported"),
15564 input_bfd, ppc64_elf_howto_table[r_type]->name);
5bd4f169 15565
65f38f15 15566 bfd_set_error (bfd_error_bad_value);
b34976b6 15567 ret = FALSE;
c316a17c 15568 goto copy_reloc;
5bd4f169 15569
65f38f15 15570 case R_PPC64_NONE:
411e1bfb 15571 case R_PPC64_TLS:
727fc41e
AM
15572 case R_PPC64_TLSGD:
15573 case R_PPC64_TLSLD:
3b421ab3 15574 case R_PPC64_TOCSAVE:
04c9666a
AM
15575 case R_PPC64_GNU_VTINHERIT:
15576 case R_PPC64_GNU_VTENTRY:
006589cf 15577 case R_PPC64_ENTRY:
4a421c53 15578 case R_PPC64_PCREL_OPT:
c316a17c 15579 goto copy_reloc;
5bd4f169
AM
15580
15581 /* GOT16 relocations. Like an ADDR16 using the symbol's
15582 address in the GOT as relocation value instead of the
411e1bfb 15583 symbol's value itself. Also, create a GOT entry for the
5bd4f169 15584 symbol and put the symbol value there. */
411e1bfb
AM
15585 case R_PPC64_GOT_TLSGD16:
15586 case R_PPC64_GOT_TLSGD16_LO:
15587 case R_PPC64_GOT_TLSGD16_HI:
15588 case R_PPC64_GOT_TLSGD16_HA:
c213164a 15589 case R_PPC64_GOT_TLSGD34:
951fd09b 15590 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
15591 goto dogot;
15592
15593 case R_PPC64_GOT_TLSLD16:
15594 case R_PPC64_GOT_TLSLD16_LO:
15595 case R_PPC64_GOT_TLSLD16_HI:
15596 case R_PPC64_GOT_TLSLD16_HA:
c213164a 15597 case R_PPC64_GOT_TLSLD34:
951fd09b 15598 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
15599 goto dogot;
15600
15601 case R_PPC64_GOT_TPREL16_DS:
15602 case R_PPC64_GOT_TPREL16_LO_DS:
15603 case R_PPC64_GOT_TPREL16_HI:
15604 case R_PPC64_GOT_TPREL16_HA:
c213164a 15605 case R_PPC64_GOT_TPREL34:
411e1bfb
AM
15606 tls_type = TLS_TLS | TLS_TPREL;
15607 goto dogot;
15608
15609 case R_PPC64_GOT_DTPREL16_DS:
15610 case R_PPC64_GOT_DTPREL16_LO_DS:
15611 case R_PPC64_GOT_DTPREL16_HI:
15612 case R_PPC64_GOT_DTPREL16_HA:
c213164a 15613 case R_PPC64_GOT_DTPREL34:
411e1bfb
AM
15614 tls_type = TLS_TLS | TLS_DTPREL;
15615 goto dogot;
15616
65f38f15
AM
15617 case R_PPC64_GOT16:
15618 case R_PPC64_GOT16_LO:
15619 case R_PPC64_GOT16_HI:
15620 case R_PPC64_GOT16_HA:
15621 case R_PPC64_GOT16_DS:
15622 case R_PPC64_GOT16_LO_DS:
5663e321 15623 case R_PPC64_GOT_PCREL34:
411e1bfb 15624 dogot:
5bd4f169
AM
15625 {
15626 /* Relocation is to the entry for this symbol in the global
15627 offset table. */
e717da7e 15628 asection *got;
d881513a 15629 bfd_vma *offp;
5bd4f169 15630 bfd_vma off;
d881513a 15631 unsigned long indx = 0;
927be08e 15632 struct got_entry *ent;
65f38f15 15633
d881513a 15634 if (tls_type == (TLS_TLS | TLS_LD)
f749f26e 15635 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
927be08e 15636 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 15637 else
5bd4f169 15638 {
d881513a
AM
15639 if (h != NULL)
15640 {
f0158f44
AM
15641 if (!htab->elf.dynamic_sections_created
15642 || h->elf.dynindx == -1
15643 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
21d68fcd 15644 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
d881513a
AM
15645 /* This is actually a static link, or it is a
15646 -Bsymbolic link and the symbol is defined
15647 locally, or the symbol was forced to be local
15648 because of a version file. */
15649 ;
15650 else
15651 {
039b3fef 15652 indx = h->elf.dynindx;
d881513a
AM
15653 unresolved_reloc = FALSE;
15654 }
039b3fef 15655 ent = h->elf.got.glist;
d881513a 15656 }
411e1bfb 15657 else
5bd4f169 15658 {
d881513a
AM
15659 if (local_got_ents == NULL)
15660 abort ();
15661 ent = local_got_ents[r_symndx];
5bd4f169 15662 }
d881513a
AM
15663
15664 for (; ent != NULL; ent = ent->next)
133a1f60 15665 if (ent->addend == orig_rel.r_addend
e717da7e 15666 && ent->owner == input_bfd
d881513a
AM
15667 && ent->tls_type == tls_type)
15668 break;
5bd4f169 15669 }
411e1bfb 15670
927be08e
AM
15671 if (ent == NULL)
15672 abort ();
15673 if (ent->is_indirect)
15674 ent = ent->got.ent;
15675 offp = &ent->got.offset;
15676 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
15677 if (got == NULL)
15678 abort ();
15679
411e1bfb
AM
15680 /* The offset must always be a multiple of 8. We use the
15681 least significant bit to record whether we have already
15682 processed this entry. */
d881513a 15683 off = *offp;
411e1bfb
AM
15684 if ((off & 1) != 0)
15685 off &= ~1;
5bd4f169
AM
15686 else
15687 {
411e1bfb
AM
15688 /* Generate relocs for the dynamic linker, except in
15689 the case of TLSLD where we'll use one entry per
15690 module. */
25f23106
AM
15691 asection *relgot;
15692 bfd_boolean ifunc;
e717da7e 15693
d881513a 15694 *offp = off | 1;
25f23106
AM
15695 relgot = NULL;
15696 ifunc = (h != NULL
15697 ? h->elf.type == STT_GNU_IFUNC
15698 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 15699 if (ifunc)
82e66161
AM
15700 {
15701 relgot = htab->elf.irelplt;
15702 if (indx == 0)
15703 htab->local_ifunc_resolver = 1;
15704 else if (is_static_defined (&h->elf))
15705 htab->maybe_local_ifunc_resolver = 1;
15706 }
f0158f44
AM
15707 else if (indx != 0
15708 || (bfd_link_pic (info)
15709 && (h == NULL
f749f26e
AM
15710 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
15711 && !(tls_type != 0
f15d0b54
AM
15712 && bfd_link_executable (info)
15713 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
19e08130 15714 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 15715 if (relgot != NULL)
5bd4f169 15716 {
e717da7e
AM
15717 outrel.r_offset = (got->output_section->vma
15718 + got->output_offset
411e1bfb 15719 + off);
133a1f60 15720 outrel.r_addend = orig_rel.r_addend;
d881513a 15721 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 15722 {
411e1bfb 15723 outrel.r_addend = 0;
e515b051 15724 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
15725 if (tls_type == (TLS_TLS | TLS_GD))
15726 {
e717da7e
AM
15727 loc = relgot->contents;
15728 loc += (relgot->reloc_count++
d881513a
AM
15729 * sizeof (Elf64_External_Rela));
15730 bfd_elf64_swap_reloca_out (output_bfd,
15731 &outrel, loc);
e515b051 15732 outrel.r_offset += 8;
133a1f60 15733 outrel.r_addend = orig_rel.r_addend;
d881513a
AM
15734 outrel.r_info
15735 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 15736 }
411e1bfb 15737 }
951fd09b 15738 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 15739 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 15740 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 15741 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
15742 else if (indx != 0)
15743 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
15744 else
81407a69 15745 {
25f23106
AM
15746 if (ifunc)
15747 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15748 else
15749 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
15750
15751 /* Write the .got section contents for the sake
15752 of prelink. */
e717da7e 15753 loc = got->contents + off;
23fbd6fa
JJ
15754 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
15755 loc);
81407a69 15756 }
81407a69
AM
15757
15758 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
15759 {
15760 outrel.r_addend += relocation;
15761 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
989f9879
AM
15762 {
15763 if (htab->elf.tls_sec == NULL)
15764 outrel.r_addend = 0;
15765 else
15766 outrel.r_addend -= htab->elf.tls_sec->vma;
15767 }
e515b051 15768 }
e717da7e
AM
15769 loc = relgot->contents;
15770 loc += (relgot->reloc_count++
411e1bfb
AM
15771 * sizeof (Elf64_External_Rela));
15772 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
15773 }
15774
ad8e1ba5 15775 /* Init the .got section contents here if we're not
81407a69 15776 emitting a reloc. */
d881513a 15777 else
411e1bfb 15778 {
133a1f60 15779 relocation += orig_rel.r_addend;
f0158f44 15780 if (tls_type != 0)
411e1bfb 15781 {
989f9879
AM
15782 if (htab->elf.tls_sec == NULL)
15783 relocation = 0;
15784 else
15785 {
f0158f44
AM
15786 if (tls_type & TLS_LD)
15787 relocation = 0;
15788 else
15789 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
676ee2b5 15790 if (tls_type & TLS_TPREL)
989f9879
AM
15791 relocation += DTP_OFFSET - TP_OFFSET;
15792 }
5bd4f169 15793
f0158f44 15794 if (tls_type & (TLS_GD | TLS_LD))
7b609f53
AM
15795 {
15796 bfd_put_64 (output_bfd, relocation,
e717da7e 15797 got->contents + off + 8);
676ee2b5 15798 relocation = 1;
7b609f53 15799 }
411e1bfb
AM
15800 }
15801 bfd_put_64 (output_bfd, relocation,
e717da7e 15802 got->contents + off);
5bd4f169
AM
15803 }
15804 }
15805
65f38f15
AM
15806 if (off >= (bfd_vma) -2)
15807 abort ();
15808
bf102f86 15809 relocation = got->output_section->vma + got->output_offset + off;
133a1f60 15810 addend = 0;
c213164a
AM
15811 if (!(r_type == R_PPC64_GOT_PCREL34
15812 || r_type == R_PPC64_GOT_TLSGD34
15813 || r_type == R_PPC64_GOT_TLSLD34
15814 || r_type == R_PPC64_GOT_TPREL34
15815 || r_type == R_PPC64_GOT_DTPREL34))
5663e321 15816 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
5bd4f169 15817 }
65f38f15
AM
15818 break;
15819
15820 case R_PPC64_PLT16_HA:
15821 case R_PPC64_PLT16_HI:
15822 case R_PPC64_PLT16_LO:
08be3224 15823 case R_PPC64_PLT16_LO_DS:
5663e321
AM
15824 case R_PPC64_PLT_PCREL34:
15825 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
15826 case R_PPC64_PLT32:
15827 case R_PPC64_PLT64:
23cedd1d 15828 case R_PPC64_PLTSEQ:
5663e321 15829 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d 15830 case R_PPC64_PLTCALL:
5663e321 15831 case R_PPC64_PLTCALL_NOTOC:
65f38f15
AM
15832 /* Relocation is to the entry for this symbol in the
15833 procedure linkage table. */
23cedd1d 15834 unresolved_reloc = TRUE;
cbf95972
AM
15835 {
15836 struct plt_entry **plt_list = NULL;
15837 if (h != NULL)
15838 plt_list = &h->elf.plt.plist;
15839 else if (local_got_ents != NULL)
15840 {
15841 struct plt_entry **local_plt = (struct plt_entry **)
15842 (local_got_ents + symtab_hdr->sh_info);
2d7ad24e 15843 plt_list = local_plt + r_symndx;
cbf95972
AM
15844 }
15845 if (plt_list)
15846 {
15847 struct plt_entry *ent;
65f38f15 15848
cbf95972
AM
15849 for (ent = *plt_list; ent != NULL; ent = ent->next)
15850 if (ent->plt.offset != (bfd_vma) -1
133a1f60 15851 && ent->addend == orig_rel.r_addend)
cbf95972
AM
15852 {
15853 asection *plt;
08be3224 15854 bfd_vma got;
cbf95972
AM
15855
15856 plt = htab->elf.splt;
15857 if (!htab->elf.dynamic_sections_created
15858 || h == NULL
15859 || h->elf.dynindx == -1)
2d7ad24e
AM
15860 {
15861 if (h != NULL
15862 ? h->elf.type == STT_GNU_IFUNC
15863 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15864 plt = htab->elf.iplt;
15865 else
15866 plt = htab->pltlocal;
15867 }
15868 relocation = (plt->output_section->vma
15869 + plt->output_offset
15870 + ent->plt.offset);
08be3224 15871 if (r_type == R_PPC64_PLT16_HA
2cdcc330
AM
15872 || r_type == R_PPC64_PLT16_HI
15873 || r_type == R_PPC64_PLT16_LO
15874 || r_type == R_PPC64_PLT16_LO_DS)
08be3224
AM
15875 {
15876 got = (elf_gp (output_bfd)
15877 + htab->sec_info[input_section->id].toc_off);
15878 relocation -= got;
15879 }
133a1f60 15880 addend = 0;
cbf95972
AM
15881 unresolved_reloc = FALSE;
15882 break;
15883 }
15884 }
15885 }
65f38f15 15886 break;
5bd4f169 15887
0b13192e
AM
15888 case R_PPC64_TOC:
15889 /* Relocation value is TOC base. */
15890 relocation = TOCstart;
cf35638d 15891 if (r_symndx == STN_UNDEF)
6f20ed8a 15892 relocation += htab->sec_info[input_section->id].toc_off;
8517fae7
AM
15893 else if (unresolved_reloc)
15894 ;
6f20ed8a
AM
15895 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
15896 relocation += htab->sec_info[sec->id].toc_off;
0b13192e
AM
15897 else
15898 unresolved_reloc = TRUE;
ab96bf03 15899 goto dodyn;
0b13192e 15900
5bd4f169
AM
15901 /* TOC16 relocs. We want the offset relative to the TOC base,
15902 which is the address of the start of the TOC plus 0x8000.
15903 The TOC consists of sections .got, .toc, .tocbss, and .plt,
15904 in this order. */
65f38f15
AM
15905 case R_PPC64_TOC16:
15906 case R_PPC64_TOC16_LO:
15907 case R_PPC64_TOC16_HI:
15908 case R_PPC64_TOC16_DS:
15909 case R_PPC64_TOC16_LO_DS:
15910 case R_PPC64_TOC16_HA:
6f20ed8a 15911 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
1bdd8fac
AM
15912 if (h != NULL)
15913 goto dodyn;
5bd4f169
AM
15914 break;
15915
15916 /* Relocate against the beginning of the section. */
65f38f15
AM
15917 case R_PPC64_SECTOFF:
15918 case R_PPC64_SECTOFF_LO:
15919 case R_PPC64_SECTOFF_HI:
15920 case R_PPC64_SECTOFF_DS:
15921 case R_PPC64_SECTOFF_LO_DS:
15922 case R_PPC64_SECTOFF_HA:
4ce794b7 15923 if (sec != NULL)
65f38f15 15924 addend -= sec->output_section->vma;
5bd4f169
AM
15925 break;
15926
25f23106
AM
15927 case R_PPC64_REL16:
15928 case R_PPC64_REL16_LO:
15929 case R_PPC64_REL16_HI:
15930 case R_PPC64_REL16_HA:
4a969973
AM
15931 case R_PPC64_REL16_HIGH:
15932 case R_PPC64_REL16_HIGHA:
15933 case R_PPC64_REL16_HIGHER:
15934 case R_PPC64_REL16_HIGHERA:
15935 case R_PPC64_REL16_HIGHEST:
15936 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
15937 case R_PPC64_REL16_HIGHER34:
15938 case R_PPC64_REL16_HIGHERA34:
15939 case R_PPC64_REL16_HIGHEST34:
15940 case R_PPC64_REL16_HIGHESTA34:
a680de9a 15941 case R_PPC64_REL16DX_HA:
721956f4
AM
15942 case R_PPC64_REL14:
15943 case R_PPC64_REL14_BRNTAKEN:
15944 case R_PPC64_REL14_BRTAKEN:
5d1634d7 15945 case R_PPC64_REL24:
05d0e962 15946 case R_PPC64_REL24_NOTOC:
5663e321
AM
15947 case R_PPC64_PCREL34:
15948 case R_PPC64_PCREL28:
5d1634d7
AM
15949 break;
15950
411e1bfb
AM
15951 case R_PPC64_TPREL16:
15952 case R_PPC64_TPREL16_LO:
15953 case R_PPC64_TPREL16_HI:
15954 case R_PPC64_TPREL16_HA:
15955 case R_PPC64_TPREL16_DS:
15956 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
15957 case R_PPC64_TPREL16_HIGH:
15958 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
15959 case R_PPC64_TPREL16_HIGHER:
15960 case R_PPC64_TPREL16_HIGHERA:
15961 case R_PPC64_TPREL16_HIGHEST:
15962 case R_PPC64_TPREL16_HIGHESTA:
c213164a 15963 case R_PPC64_TPREL34:
766bc656
AM
15964 if (h != NULL
15965 && h->elf.root.type == bfd_link_hash_undefweak
15966 && h->elf.dynindx == -1)
15967 {
15968 /* Make this relocation against an undefined weak symbol
15969 resolve to zero. This is really just a tweak, since
15970 code using weak externs ought to check that they are
15971 defined before using them. */
15972 bfd_byte *p = contents + rel->r_offset - d_offset;
15973
95f0d0d2 15974 insn = bfd_get_32 (input_bfd, p);
766bc656
AM
15975 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
15976 if (insn != 0)
95f0d0d2 15977 bfd_put_32 (input_bfd, insn, p);
766bc656
AM
15978 break;
15979 }
989f9879
AM
15980 if (htab->elf.tls_sec != NULL)
15981 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7c8bbca5
AM
15982 /* The TPREL16 relocs shouldn't really be used in shared
15983 libs or with non-local symbols as that will result in
15984 DT_TEXTREL being set, but support them anyway. */
15985 goto dodyn;
411e1bfb
AM
15986
15987 case R_PPC64_DTPREL16:
15988 case R_PPC64_DTPREL16_LO:
15989 case R_PPC64_DTPREL16_HI:
15990 case R_PPC64_DTPREL16_HA:
15991 case R_PPC64_DTPREL16_DS:
15992 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
15993 case R_PPC64_DTPREL16_HIGH:
15994 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
15995 case R_PPC64_DTPREL16_HIGHER:
15996 case R_PPC64_DTPREL16_HIGHERA:
15997 case R_PPC64_DTPREL16_HIGHEST:
15998 case R_PPC64_DTPREL16_HIGHESTA:
c213164a 15999 case R_PPC64_DTPREL34:
989f9879
AM
16000 if (htab->elf.tls_sec != NULL)
16001 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
16002 break;
16003
45965137
AM
16004 case R_PPC64_ADDR64_LOCAL:
16005 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
16006 ? h->elf.other
16007 : sym->st_other);
16008 break;
16009
e515b051
AM
16010 case R_PPC64_DTPMOD64:
16011 relocation = 1;
16012 addend = 0;
16013 goto dodyn;
16014
411e1bfb 16015 case R_PPC64_TPREL64:
989f9879
AM
16016 if (htab->elf.tls_sec != NULL)
16017 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
16018 goto dodyn;
16019
16020 case R_PPC64_DTPREL64:
989f9879
AM
16021 if (htab->elf.tls_sec != NULL)
16022 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
1a0670f3 16023 /* Fall through. */
411e1bfb 16024
65f38f15
AM
16025 /* Relocations that may need to be propagated if this is a
16026 dynamic object. */
04c9666a 16027 case R_PPC64_REL30:
65f38f15
AM
16028 case R_PPC64_REL32:
16029 case R_PPC64_REL64:
16030 case R_PPC64_ADDR14:
16031 case R_PPC64_ADDR14_BRNTAKEN:
16032 case R_PPC64_ADDR14_BRTAKEN:
16033 case R_PPC64_ADDR16:
16034 case R_PPC64_ADDR16_DS:
16035 case R_PPC64_ADDR16_HA:
16036 case R_PPC64_ADDR16_HI:
f9c6b907
AM
16037 case R_PPC64_ADDR16_HIGH:
16038 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16039 case R_PPC64_ADDR16_HIGHER:
16040 case R_PPC64_ADDR16_HIGHERA:
16041 case R_PPC64_ADDR16_HIGHEST:
16042 case R_PPC64_ADDR16_HIGHESTA:
16043 case R_PPC64_ADDR16_LO:
16044 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
16045 case R_PPC64_ADDR16_HIGHER34:
16046 case R_PPC64_ADDR16_HIGHERA34:
16047 case R_PPC64_ADDR16_HIGHEST34:
16048 case R_PPC64_ADDR16_HIGHESTA34:
65f38f15 16049 case R_PPC64_ADDR24:
65f38f15
AM
16050 case R_PPC64_ADDR32:
16051 case R_PPC64_ADDR64:
16052 case R_PPC64_UADDR16:
16053 case R_PPC64_UADDR32:
16054 case R_PPC64_UADDR64:
5663e321
AM
16055 case R_PPC64_D34:
16056 case R_PPC64_D34_LO:
16057 case R_PPC64_D34_HI30:
16058 case R_PPC64_D34_HA30:
16059 case R_PPC64_D28:
411e1bfb 16060 dodyn:
5d1634d7 16061 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
16062 break;
16063
41bd81ab
AM
16064 if (NO_OPD_RELOCS && is_opd)
16065 break;
16066
8a9e8e72 16067 if (bfd_link_pic (info)
b1b07054
AM
16068 ? ((h == NULL
16069 || h->dyn_relocs != NULL)
16070 && ((h != NULL && pc_dynrelocs (h))
16071 || must_be_dyn_reloc (info, r_type)))
8a9e8e72
AM
16072 : (h != NULL
16073 ? h->dyn_relocs != NULL
d311bc8b 16074 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
65f38f15 16075 {
b34976b6 16076 bfd_boolean skip, relocate;
65f38f15 16077 asection *sreloc;
1cf1f670 16078 bfd_vma out_off;
82e66161 16079 long indx = 0;
65f38f15
AM
16080
16081 /* When generating a dynamic object, these relocations
16082 are copied into the output file to be resolved at run
16083 time. */
16084
b34976b6
AM
16085 skip = FALSE;
16086 relocate = FALSE;
65f38f15 16087
1cf1f670
AM
16088 out_off = _bfd_elf_section_offset (output_bfd, info,
16089 input_section, rel->r_offset);
16090 if (out_off == (bfd_vma) -1)
b34976b6 16091 skip = TRUE;
1cf1f670 16092 else if (out_off == (bfd_vma) -2)
b34976b6 16093 skip = TRUE, relocate = TRUE;
1cf1f670
AM
16094 out_off += (input_section->output_section->vma
16095 + input_section->output_offset);
16096 outrel.r_offset = out_off;
411e1bfb 16097 outrel.r_addend = rel->r_addend;
65f38f15 16098
1cf1f670
AM
16099 /* Optimize unaligned reloc use. */
16100 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
16101 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
16102 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
16103 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
16104 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
16105 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
16106 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
16107 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
16108 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
16109
65f38f15 16110 if (skip)
0bb2d96a 16111 memset (&outrel, 0, sizeof outrel);
afe397ea 16112 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
16113 && !is_opd
16114 && r_type != R_PPC64_TOC)
14acf4dc 16115 {
82e66161
AM
16116 indx = h->elf.dynindx;
16117 BFD_ASSERT (indx != -1);
16118 outrel.r_info = ELF64_R_INFO (indx, r_type);
14acf4dc 16119 }
65f38f15
AM
16120 else
16121 {
41bd81ab
AM
16122 /* This symbol is local, or marked to become local,
16123 or this is an opd section reloc which must point
16124 at a local function. */
65f38f15 16125 outrel.r_addend += relocation;
e86ce104 16126 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 16127 {
3fad3c7c 16128 if (is_opd && h != NULL)
afbe61cf
AM
16129 {
16130 /* Lie about opd entries. This case occurs
16131 when building shared libraries and we
16132 reference a function in another shared
3fad3c7c
AM
16133 lib. The same thing happens for a weak
16134 definition in an application that's
16135 overridden by a strong definition in a
16136 shared lib. (I believe this is a generic
16137 bug in binutils handling of weak syms.)
16138 In these cases we won't use the opd
1e2f5b6e 16139 entry in this lib. */
b34976b6 16140 unresolved_reloc = FALSE;
afbe61cf 16141 }
25f23106
AM
16142 if (!is_opd
16143 && r_type == R_PPC64_ADDR64
16144 && (h != NULL
16145 ? h->elf.type == STT_GNU_IFUNC
16146 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
16147 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
16148 else
16149 {
16150 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 16151
25f23106
AM
16152 /* We need to relocate .opd contents for ld.so.
16153 Prelink also wants simple and consistent rules
16154 for relocs. This make all RELATIVE relocs have
16155 *r_offset equal to r_addend. */
16156 relocate = TRUE;
16157 }
65f38f15
AM
16158 }
16159 else
16160 {
25f23106
AM
16161 if (h != NULL
16162 ? h->elf.type == STT_GNU_IFUNC
16163 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
16164 {
25f53a85 16165 info->callbacks->einfo
695344c0 16166 /* xgettext:c-format */
174d0a74 16167 (_("%H: %s for indirect "
c1c8c1ef 16168 "function `%pT' unsupported\n"),
25f53a85 16169 input_bfd, input_section, rel->r_offset,
25f23106
AM
16170 ppc64_elf_howto_table[r_type]->name,
16171 sym_name);
16172 ret = FALSE;
16173 }
cf35638d 16174 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
16175 ;
16176 else if (sec == NULL || sec->owner == NULL)
16177 {
16178 bfd_set_error (bfd_error_bad_value);
b34976b6 16179 return FALSE;
65f38f15
AM
16180 }
16181 else
16182 {
f26a3287 16183 asection *osec = sec->output_section;
65f38f15 16184
f26a3287
AM
16185 if ((osec->flags & SEC_THREAD_LOCAL) != 0)
16186 {
16187 /* TLS symbol values are relative to the
16188 TLS segment. Dynamic relocations for
16189 local TLS symbols therefore can't be
16190 reduced to a relocation against their
16191 section symbol because it holds the
16192 address of the section, not a value
16193 relative to the TLS segment. We could
16194 change the .tdata dynamic section symbol
16195 to be zero value but STN_UNDEF works
16196 and is used elsewhere, eg. for TPREL64
16197 GOT relocs against local TLS symbols. */
16198 osec = htab->elf.tls_sec;
16199 indx = 0;
16200 }
16201 else
74541ad4 16202 {
74541ad4 16203 indx = elf_section_data (osec)->dynindx;
f26a3287
AM
16204 if (indx == 0)
16205 {
16206 if ((osec->flags & SEC_READONLY) == 0
16207 && htab->elf.data_index_section != NULL)
16208 osec = htab->elf.data_index_section;
16209 else
16210 osec = htab->elf.text_index_section;
16211 indx = elf_section_data (osec)->dynindx;
16212 }
16213 BFD_ASSERT (indx != 0);
74541ad4 16214 }
74541ad4 16215
65f38f15
AM
16216 /* We are turning this relocation into one
16217 against a section symbol, so subtract out
16218 the output section's address but not the
16219 offset of the input section in the output
16220 section. */
16221 outrel.r_addend -= osec->vma;
16222 }
16223
16224 outrel.r_info = ELF64_R_INFO (indx, r_type);
16225 }
16226 }
16227
16228 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
16229 if (h != NULL
16230 ? h->elf.type == STT_GNU_IFUNC
16231 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
82e66161
AM
16232 {
16233 sreloc = htab->elf.irelplt;
16234 if (indx == 0)
16235 htab->local_ifunc_resolver = 1;
16236 else if (is_static_defined (&h->elf))
16237 htab->maybe_local_ifunc_resolver = 1;
16238 }
65f38f15
AM
16239 if (sreloc == NULL)
16240 abort ();
16241
dfbb6ac9
AM
16242 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
16243 >= sreloc->size)
16244 abort ();
947216bf
AM
16245 loc = sreloc->contents;
16246 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
16247 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
16248
e59a1001
AM
16249 if (!warned_dynamic
16250 && !ppc64_glibc_dynamic_reloc (ELF64_R_TYPE (outrel.r_info)))
16251 {
16252 info->callbacks->einfo
16253 /* xgettext:c-format */
16254 (_("%X%P: %pB: %s against %pT "
16255 "is not supported by glibc as a dynamic relocation\n"),
16256 input_bfd,
16257 ppc64_elf_howto_table[ELF64_R_TYPE (outrel.r_info)]->name,
16258 sym_name);
16259 warned_dynamic = TRUE;
16260 }
16261
65f38f15
AM
16262 /* If this reloc is against an external symbol, it will
16263 be computed at runtime, so there's no need to do
81407a69
AM
16264 anything now. However, for the sake of prelink ensure
16265 that the section contents are a known value. */
2cdcc330 16266 if (!relocate)
81407a69
AM
16267 {
16268 unresolved_reloc = FALSE;
16269 /* The value chosen here is quite arbitrary as ld.so
16270 ignores section contents except for the special
16271 case of .opd where the contents might be accessed
16272 before relocation. Choose zero, as that won't
16273 cause reloc overflow. */
16274 relocation = 0;
16275 addend = 0;
16276 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
16277 to improve backward compatibility with older
16278 versions of ld. */
16279 if (r_type == R_PPC64_ADDR64)
16280 addend = outrel.r_addend;
16281 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 16282 else if (ppc64_elf_howto_table[r_type]->pc_relative)
f0158f44 16283 addend = outrel.r_offset;
81407a69 16284 }
65f38f15 16285 }
5bd4f169
AM
16286 break;
16287
65f38f15
AM
16288 case R_PPC64_COPY:
16289 case R_PPC64_GLOB_DAT:
16290 case R_PPC64_JMP_SLOT:
25f23106 16291 case R_PPC64_JMP_IREL:
65f38f15
AM
16292 case R_PPC64_RELATIVE:
16293 /* We shouldn't ever see these dynamic relocs in relocatable
16294 files. */
ae9a127f 16295 /* Fall through. */
65f38f15
AM
16296
16297 case R_PPC64_PLTGOT16:
16298 case R_PPC64_PLTGOT16_DS:
16299 case R_PPC64_PLTGOT16_HA:
16300 case R_PPC64_PLTGOT16_HI:
16301 case R_PPC64_PLTGOT16_LO:
16302 case R_PPC64_PLTGOT16_LO_DS:
16303 case R_PPC64_PLTREL32:
16304 case R_PPC64_PLTREL64:
16305 /* These ones haven't been implemented yet. */
16306
25f53a85 16307 info->callbacks->einfo
695344c0 16308 /* xgettext:c-format */
c1c8c1ef 16309 (_("%P: %pB: %s is not supported for `%pT'\n"),
d003868e 16310 input_bfd,
4ce794b7 16311 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
16312
16313 bfd_set_error (bfd_error_invalid_operation);
b34976b6 16314 ret = FALSE;
c316a17c 16315 goto copy_reloc;
65f38f15 16316 }
5bd4f169 16317
67f0cbdb
AM
16318 /* Multi-instruction sequences that access the TOC can be
16319 optimized, eg. addis ra,r2,0; addi rb,ra,x;
07d6d2b8 16320 to nop; addi rb,r2,x; */
67f0cbdb
AM
16321 switch (r_type)
16322 {
16323 default:
16324 break;
16325
16326 case R_PPC64_GOT_TLSLD16_HI:
16327 case R_PPC64_GOT_TLSGD16_HI:
16328 case R_PPC64_GOT_TPREL16_HI:
16329 case R_PPC64_GOT_DTPREL16_HI:
16330 case R_PPC64_GOT16_HI:
16331 case R_PPC64_TOC16_HI:
16332 /* These relocs would only be useful if building up an
16333 offset to later add to r2, perhaps in an indexed
16334 addressing mode instruction. Don't try to optimize.
16335 Unfortunately, the possibility of someone building up an
16336 offset like this or even with the HA relocs, means that
16337 we need to check the high insn when optimizing the low
16338 insn. */
16339 break;
16340
5663e321
AM
16341 case R_PPC64_PLTCALL_NOTOC:
16342 if (!unresolved_reloc)
16343 htab->notoc_plt = 1;
16344 /* Fall through. */
23cedd1d
AM
16345 case R_PPC64_PLTCALL:
16346 if (unresolved_reloc)
16347 {
16348 /* No plt entry. Make this into a direct call. */
16349 bfd_byte *p = contents + rel->r_offset;
16350 insn = bfd_get_32 (input_bfd, p);
16351 insn &= 1;
16352 bfd_put_32 (input_bfd, B_DOT | insn, p);
5663e321
AM
16353 if (r_type == R_PPC64_PLTCALL)
16354 bfd_put_32 (input_bfd, NOP, p + 4);
23cedd1d
AM
16355 unresolved_reloc = save_unresolved_reloc;
16356 r_type = R_PPC64_REL24;
16357 }
16358 break;
16359
5663e321 16360 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d
AM
16361 case R_PPC64_PLTSEQ:
16362 if (unresolved_reloc)
16363 {
16364 unresolved_reloc = FALSE;
16365 goto nop_it;
16366 }
16367 break;
16368
5663e321
AM
16369 case R_PPC64_PLT_PCREL34_NOTOC:
16370 if (!unresolved_reloc)
16371 htab->notoc_plt = 1;
16372 /* Fall through. */
16373 case R_PPC64_PLT_PCREL34:
16374 if (unresolved_reloc)
16375 {
16376 bfd_byte *p = contents + rel->r_offset;
16377 bfd_put_32 (input_bfd, PNOP >> 32, p);
16378 bfd_put_32 (input_bfd, PNOP, p + 4);
16379 unresolved_reloc = FALSE;
16380 goto copy_reloc;
16381 }
16382 break;
16383
23cedd1d
AM
16384 case R_PPC64_PLT16_HA:
16385 if (unresolved_reloc)
16386 {
16387 unresolved_reloc = FALSE;
16388 goto nop_it;
16389 }
16390 /* Fall through. */
67f0cbdb
AM
16391 case R_PPC64_GOT_TLSLD16_HA:
16392 case R_PPC64_GOT_TLSGD16_HA:
16393 case R_PPC64_GOT_TPREL16_HA:
16394 case R_PPC64_GOT_DTPREL16_HA:
16395 case R_PPC64_GOT16_HA:
16396 case R_PPC64_TOC16_HA:
98528052 16397 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16398 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052 16399 {
23cedd1d
AM
16400 bfd_byte *p;
16401 nop_it:
16402 p = contents + (rel->r_offset & ~3);
98528052 16403 bfd_put_32 (input_bfd, NOP, p);
d830549d 16404 goto copy_reloc;
98528052 16405 }
67f0cbdb
AM
16406 break;
16407
23cedd1d
AM
16408 case R_PPC64_PLT16_LO:
16409 case R_PPC64_PLT16_LO_DS:
16410 if (unresolved_reloc)
16411 {
16412 unresolved_reloc = FALSE;
16413 goto nop_it;
16414 }
16415 /* Fall through. */
67f0cbdb
AM
16416 case R_PPC64_GOT_TLSLD16_LO:
16417 case R_PPC64_GOT_TLSGD16_LO:
16418 case R_PPC64_GOT_TPREL16_LO_DS:
16419 case R_PPC64_GOT_DTPREL16_LO_DS:
16420 case R_PPC64_GOT16_LO:
16421 case R_PPC64_GOT16_LO_DS:
16422 case R_PPC64_TOC16_LO:
16423 case R_PPC64_TOC16_LO_DS:
98528052 16424 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16425 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
16426 {
16427 bfd_byte *p = contents + (rel->r_offset & ~3);
16428 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16429 if ((insn & (0x3fu << 26)) == 12u << 26 /* addic */)
560c8763
AM
16430 {
16431 /* Transform addic to addi when we change reg. */
2365f8d7 16432 insn &= ~((0x3fu << 26) | (0x1f << 16));
560c8763
AM
16433 insn |= (14u << 26) | (2 << 16);
16434 }
16435 else
67f0cbdb 16436 {
98528052
AM
16437 insn &= ~(0x1f << 16);
16438 insn |= 2 << 16;
67f0cbdb 16439 }
560c8763 16440 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
16441 }
16442 break;
9a23f96e
AM
16443
16444 case R_PPC64_TPREL16_HA:
16445 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16446 {
16447 bfd_byte *p = contents + (rel->r_offset & ~3);
16448 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16449 if ((insn & ((0x3fu << 26) | 0x1f << 16))
9a23f96e
AM
16450 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */)
16451 /* xgettext:c-format */
16452 info->callbacks->minfo
16453 (_("%H: warning: %s unexpected insn %#x.\n"),
d830549d
AM
16454 input_bfd, input_section, rel->r_offset,
16455 ppc64_elf_howto_table[r_type]->name, insn);
9a23f96e 16456 else
d830549d
AM
16457 {
16458 bfd_put_32 (input_bfd, NOP, p);
16459 goto copy_reloc;
16460 }
9a23f96e
AM
16461 }
16462 break;
16463
16464 case R_PPC64_TPREL16_LO:
16465 case R_PPC64_TPREL16_LO_DS:
16466 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16467 {
16468 bfd_byte *p = contents + (rel->r_offset & ~3);
16469 insn = bfd_get_32 (input_bfd, p);
16470 insn &= ~(0x1f << 16);
16471 insn |= 13 << 16;
16472 bfd_put_32 (input_bfd, insn, p);
16473 }
16474 break;
67f0cbdb
AM
16475 }
16476
65f38f15
AM
16477 /* Do any further special processing. */
16478 switch (r_type)
16479 {
16480 default:
16481 break;
16482
25f23106 16483 case R_PPC64_REL16_HA:
4a969973
AM
16484 case R_PPC64_REL16_HIGHA:
16485 case R_PPC64_REL16_HIGHERA:
16486 case R_PPC64_REL16_HIGHESTA:
a680de9a 16487 case R_PPC64_REL16DX_HA:
f9c6b907
AM
16488 case R_PPC64_ADDR16_HA:
16489 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16490 case R_PPC64_ADDR16_HIGHERA:
16491 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
16492 case R_PPC64_TOC16_HA:
16493 case R_PPC64_SECTOFF_HA:
411e1bfb 16494 case R_PPC64_TPREL16_HA:
f9c6b907 16495 case R_PPC64_TPREL16_HIGHA:
411e1bfb 16496 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 16497 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
16498 case R_PPC64_DTPREL16_HA:
16499 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 16500 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 16501 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
16502 /* It's just possible that this symbol is a weak symbol
16503 that's not actually defined anywhere. In that case,
16504 'sec' would be NULL, and we should leave the symbol
16505 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
16506 if (sec == NULL)
16507 break;
1a0670f3 16508 /* Fall through. */
5c5f6e17
AM
16509
16510 case R_PPC64_GOT16_HA:
16511 case R_PPC64_PLTGOT16_HA:
16512 case R_PPC64_PLT16_HA:
16513 case R_PPC64_GOT_TLSGD16_HA:
16514 case R_PPC64_GOT_TLSLD16_HA:
16515 case R_PPC64_GOT_TPREL16_HA:
16516 case R_PPC64_GOT_DTPREL16_HA:
16517 /* Add 0x10000 if sign bit in 0:15 is set.
16518 Bits 0:15 are not used. */
16519 addend += 0x8000;
65f38f15
AM
16520 break;
16521
5663e321
AM
16522 case R_PPC64_D34_HA30:
16523 case R_PPC64_ADDR16_HIGHERA34:
16524 case R_PPC64_ADDR16_HIGHESTA34:
16525 case R_PPC64_REL16_HIGHERA34:
16526 case R_PPC64_REL16_HIGHESTA34:
16527 if (sec != NULL)
16528 addend += 1ULL << 33;
16529 break;
16530
65f38f15
AM
16531 case R_PPC64_ADDR16_DS:
16532 case R_PPC64_ADDR16_LO_DS:
16533 case R_PPC64_GOT16_DS:
16534 case R_PPC64_GOT16_LO_DS:
16535 case R_PPC64_PLT16_LO_DS:
16536 case R_PPC64_SECTOFF_DS:
16537 case R_PPC64_SECTOFF_LO_DS:
16538 case R_PPC64_TOC16_DS:
16539 case R_PPC64_TOC16_LO_DS:
16540 case R_PPC64_PLTGOT16_DS:
16541 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
16542 case R_PPC64_GOT_TPREL16_DS:
16543 case R_PPC64_GOT_TPREL16_LO_DS:
16544 case R_PPC64_GOT_DTPREL16_DS:
16545 case R_PPC64_GOT_DTPREL16_LO_DS:
16546 case R_PPC64_TPREL16_DS:
16547 case R_PPC64_TPREL16_LO_DS:
16548 case R_PPC64_DTPREL16_DS:
16549 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
16550 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
16551 mask = 3;
a680de9a
PB
16552 /* If this reloc is against an lq, lxv, or stxv insn, then
16553 the value must be a multiple of 16. This is somewhat of
16554 a hack, but the "correct" way to do this by defining _DQ
16555 forms of all the _DS relocs bloats all reloc switches in
16556 this file. It doesn't make much sense to use these
16557 relocs in data, so testing the insn should be safe. */
2365f8d7
AM
16558 if ((insn & (0x3fu << 26)) == (56u << 26)
16559 || ((insn & (0x3fu << 26)) == (61u << 26) && (insn & 3) == 1))
adadcc0c 16560 mask = 15;
a680de9a
PB
16561 relocation += addend;
16562 addend = insn & (mask ^ 3);
16563 if ((relocation & mask) != 0)
65f38f15 16564 {
a680de9a 16565 relocation ^= relocation & mask;
25f53a85 16566 info->callbacks->einfo
695344c0 16567 /* xgettext:c-format */
174d0a74 16568 (_("%H: error: %s not a multiple of %u\n"),
25f53a85 16569 input_bfd, input_section, rel->r_offset,
d830549d 16570 ppc64_elf_howto_table[r_type]->name,
adadcc0c 16571 mask + 1);
65f38f15 16572 bfd_set_error (bfd_error_bad_value);
b34976b6 16573 ret = FALSE;
c316a17c 16574 goto copy_reloc;
65f38f15
AM
16575 }
16576 break;
5bd4f169
AM
16577 }
16578
239e1f3a
AM
16579 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
16580 because such sections are not SEC_ALLOC and thus ld.so will
16581 not process them. */
d830549d 16582 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15 16583 if (unresolved_reloc
239e1f3a 16584 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
16585 && h->elf.def_dynamic)
16586 && _bfd_elf_section_offset (output_bfd, info, input_section,
16587 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 16588 {
25f53a85 16589 info->callbacks->einfo
695344c0 16590 /* xgettext:c-format */
c1c8c1ef 16591 (_("%H: unresolvable %s against `%pT'\n"),
25f53a85 16592 input_bfd, input_section, rel->r_offset,
b80eed39 16593 howto->name,
039b3fef 16594 h->elf.root.root.string);
b34976b6 16595 ret = FALSE;
9c07fe7c 16596 }
5bd4f169 16597
b80eed39
AM
16598 /* 16-bit fields in insns mostly have signed values, but a
16599 few insns have 16-bit unsigned values. Really, we should
16600 have different reloc types. */
16601 if (howto->complain_on_overflow != complain_overflow_dont
16602 && howto->dst_mask == 0xffff
16603 && (input_section->flags & SEC_CODE) != 0)
16604 {
16605 enum complain_overflow complain = complain_overflow_signed;
16606
16607 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 16608 if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */)
a47622ac
AM
16609 complain = complain_overflow_bitfield;
16610 else if (howto->rightshift == 0
2365f8d7
AM
16611 ? ((insn & (0x3fu << 26)) == 28u << 26 /* andi */
16612 || (insn & (0x3fu << 26)) == 24u << 26 /* ori */
16613 || (insn & (0x3fu << 26)) == 26u << 26 /* xori */)
16614 : ((insn & (0x3fu << 26)) == 29u << 26 /* andis */
16615 || (insn & (0x3fu << 26)) == 25u << 26 /* oris */
16616 || (insn & (0x3fu << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
16617 complain = complain_overflow_unsigned;
16618 if (howto->complain_on_overflow != complain)
16619 {
16620 alt_howto = *howto;
16621 alt_howto.complain_on_overflow = complain;
16622 howto = &alt_howto;
16623 }
16624 }
16625
5663e321 16626 switch (r_type)
a680de9a 16627 {
5663e321
AM
16628 /* Split field relocs aren't handled by _bfd_final_link_relocate. */
16629 case R_PPC64_D34:
16630 case R_PPC64_D34_LO:
16631 case R_PPC64_D34_HI30:
16632 case R_PPC64_D34_HA30:
16633 case R_PPC64_PCREL34:
16634 case R_PPC64_GOT_PCREL34:
c213164a
AM
16635 case R_PPC64_TPREL34:
16636 case R_PPC64_DTPREL34:
16637 case R_PPC64_GOT_TLSGD34:
16638 case R_PPC64_GOT_TLSLD34:
16639 case R_PPC64_GOT_TPREL34:
16640 case R_PPC64_GOT_DTPREL34:
5663e321
AM
16641 case R_PPC64_PLT_PCREL34:
16642 case R_PPC64_PLT_PCREL34_NOTOC:
16643 case R_PPC64_D28:
16644 case R_PPC64_PCREL28:
16645 if (rel->r_offset + 8 > input_section->size)
16646 r = bfd_reloc_outofrange;
16647 else
16648 {
5663e321
AM
16649 relocation += addend;
16650 if (howto->pc_relative)
16651 relocation -= (rel->r_offset
16652 + input_section->output_offset
16653 + input_section->output_section->vma);
16654 relocation >>= howto->rightshift;
16655
16656 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16657 pinsn <<= 32;
16658 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
16659
16660 pinsn &= ~howto->dst_mask;
16661 pinsn |= (((relocation << 16) | (relocation & 0xffff))
16662 & howto->dst_mask);
16663 bfd_put_32 (input_bfd, pinsn >> 32, contents + rel->r_offset);
16664 bfd_put_32 (input_bfd, pinsn, contents + rel->r_offset + 4);
16665 r = bfd_reloc_ok;
16666 if (howto->complain_on_overflow == complain_overflow_signed
16667 && (relocation + (1ULL << (howto->bitsize - 1))
16668 >= 1ULL << howto->bitsize))
16669 r = bfd_reloc_overflow;
16670 }
16671 break;
16672
16673 case R_PPC64_REL16DX_HA:
a680de9a
PB
16674 if (rel->r_offset + 4 > input_section->size)
16675 r = bfd_reloc_outofrange;
16676 else
16677 {
16678 relocation += addend;
16679 relocation -= (rel->r_offset
16680 + input_section->output_offset
16681 + input_section->output_section->vma);
3de43e7b 16682 relocation = (bfd_signed_vma) relocation >> 16;
a680de9a
PB
16683 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16684 insn &= ~0x1fffc1;
3de43e7b 16685 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
a680de9a
PB
16686 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
16687 r = bfd_reloc_ok;
3de43e7b 16688 if (relocation + 0x8000 > 0xffff)
a680de9a
PB
16689 r = bfd_reloc_overflow;
16690 }
5663e321
AM
16691 break;
16692
16693 default:
16694 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
16695 contents, rel->r_offset,
16696 relocation, addend);
a680de9a 16697 }
5bd4f169 16698
ef60b7ff 16699 if (r != bfd_reloc_ok)
5bd4f169 16700 {
bc30df16 16701 char *more_info = NULL;
b80eed39 16702 const char *reloc_name = howto->name;
bc30df16
AM
16703
16704 if (reloc_dest != DEST_NORMAL)
16705 {
16706 more_info = bfd_malloc (strlen (reloc_name) + 8);
16707 if (more_info != NULL)
16708 {
16709 strcpy (more_info, reloc_name);
16710 strcat (more_info, (reloc_dest == DEST_OPD
16711 ? " (OPD)" : " (stub)"));
16712 reloc_name = more_info;
16713 }
16714 }
16715
cd27b276 16716 if (r == bfd_reloc_overflow)
5bd4f169 16717 {
8131c122
AM
16718 /* On code like "if (foo) foo();" don't report overflow
16719 on a branch to zero when foo is undefined. */
16720 if (!warned
16721 && (reloc_dest == DEST_STUB
16722 || !(h != NULL
16723 && (h->elf.root.type == bfd_link_hash_undefweak
16724 || h->elf.root.type == bfd_link_hash_undefined)
16725 && is_branch_reloc (r_type))))
1a72702b
AM
16726 info->callbacks->reloc_overflow (info, &h->elf.root,
16727 sym_name, reloc_name,
16728 orig_rel.r_addend,
16729 input_bfd, input_section,
16730 rel->r_offset);
ef60b7ff
AM
16731 }
16732 else
16733 {
25f53a85 16734 info->callbacks->einfo
695344c0 16735 /* xgettext:c-format */
c1c8c1ef 16736 (_("%H: %s against `%pT': error %d\n"),
25f53a85 16737 input_bfd, input_section, rel->r_offset,
bc30df16 16738 reloc_name, sym_name, (int) r);
b34976b6 16739 ret = FALSE;
ef60b7ff 16740 }
bc30df16
AM
16741 if (more_info != NULL)
16742 free (more_info);
5bd4f169 16743 }
c316a17c
AM
16744 copy_reloc:
16745 if (wrel != rel)
16746 *wrel = *rel;
16747 }
16748
16749 if (wrel != rel)
16750 {
16751 Elf_Internal_Shdr *rel_hdr;
16752 size_t deleted = rel - wrel;
16753
16754 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
16755 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
16756 if (rel_hdr->sh_size == 0)
16757 {
16758 /* It is too late to remove an empty reloc section. Leave
16759 one NONE reloc.
16760 ??? What is wrong with an empty section??? */
16761 rel_hdr->sh_size = rel_hdr->sh_entsize;
16762 deleted -= 1;
16763 }
16764 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
16765 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
16766 input_section->reloc_count -= deleted;
5bd4f169
AM
16767 }
16768
645ea6a9
AM
16769 /* If we're emitting relocations, then shortly after this function
16770 returns, reloc offsets and addends for this section will be
16771 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
16772 file rather than the input. Save a copy of the relocs for
16773 opd_entry_value. */
0e1862bb 16774 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
8860955f
AM
16775 {
16776 bfd_size_type amt;
16777 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
16778 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
16779 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
16780 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
16781 if (rel == NULL)
16782 return FALSE;
16783 memcpy (rel, relocs, amt);
16784 }
5bd4f169
AM
16785 return ret;
16786}
16787
754021d0
AM
16788/* Adjust the value of any local symbols in opd sections. */
16789
6e0b88f1 16790static int
754021d0
AM
16791ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
16792 const char *name ATTRIBUTE_UNUSED,
16793 Elf_Internal_Sym *elfsym,
16794 asection *input_sec,
16795 struct elf_link_hash_entry *h)
16796{
74f0fb50
AM
16797 struct _opd_sec_data *opd;
16798 long adjust;
754021d0
AM
16799 bfd_vma value;
16800
4025353c 16801 if (h != NULL)
6e0b88f1 16802 return 1;
4025353c 16803
74f0fb50
AM
16804 opd = get_opd_info (input_sec);
16805 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 16806 return 1;
754021d0
AM
16807
16808 value = elfsym->st_value - input_sec->output_offset;
0e1862bb 16809 if (!bfd_link_relocatable (info))
754021d0
AM
16810 value -= input_sec->output_section->vma;
16811
51aecdc5 16812 adjust = opd->adjust[OPD_NDX (value)];
4025353c 16813 if (adjust == -1)
6e0b88f1
AM
16814 return 2;
16815
16816 elfsym->st_value += adjust;
16817 return 1;
754021d0
AM
16818}
16819
5bd4f169
AM
16820/* Finish up dynamic symbol handling. We set the contents of various
16821 dynamic sections here. */
16822
b34976b6 16823static bfd_boolean
4ce794b7
AM
16824ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
16825 struct bfd_link_info *info,
16826 struct elf_link_hash_entry *h,
4aef7643 16827 Elf_Internal_Sym *sym)
5bd4f169 16828{
65f38f15 16829 struct ppc_link_hash_table *htab;
8387904d 16830 struct plt_entry *ent;
5bd4f169 16831
65f38f15 16832 htab = ppc_hash_table (info);
4dfe6ac6
NC
16833 if (htab == NULL)
16834 return FALSE;
5bd4f169 16835
49c09209
AM
16836 if (!htab->opd_abi && !h->def_regular)
16837 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
16838 if (ent->plt.offset != (bfd_vma) -1)
16839 {
16840 /* Mark the symbol as undefined, rather than as
16841 defined in glink. Leave the value if there were
16842 any relocations where pointer equality matters
16843 (this is a clue for the dynamic linker, to make
16844 function pointer comparisons work between an
16845 application and shared library), otherwise set it
16846 to zero. */
16847 sym->st_shndx = SHN_UNDEF;
16848 if (!h->pointer_equality_needed)
16849 sym->st_value = 0;
16850 else if (!h->ref_regular_nonweak)
16851 {
16852 /* This breaks function pointer comparisons, but
16853 that is better than breaking tests for a NULL
16854 function pointer. */
16855 sym->st_value = 0;
16856 }
16857 break;
16858 }
5bd4f169 16859
1bdd8fac
AM
16860 if (h->needs_copy
16861 && (h->root.type == bfd_link_hash_defined
16862 || h->root.type == bfd_link_hash_defweak)
16863 && (h->root.u.def.section == htab->elf.sdynbss
16864 || h->root.u.def.section == htab->elf.sdynrelro))
5bd4f169 16865 {
65f38f15 16866 /* This symbol needs a copy reloc. Set it up. */
49c09209 16867 Elf_Internal_Rela rela;
5474d94f 16868 asection *srel;
49c09209 16869 bfd_byte *loc;
5bd4f169 16870
1bdd8fac 16871 if (h->dynindx == -1)
65f38f15 16872 abort ();
5bd4f169 16873
ed7007c1 16874 rela.r_offset = defined_sym_val (h);
5bd4f169
AM
16875 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
16876 rela.r_addend = 0;
afbf7e8e 16877 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
16878 srel = htab->elf.sreldynrelro;
16879 else
16880 srel = htab->elf.srelbss;
16881 loc = srel->contents;
16882 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 16883 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
16884 }
16885
b34976b6 16886 return TRUE;
5bd4f169
AM
16887}
16888
65f38f15
AM
16889/* Used to decide how to sort relocs in an optimal manner for the
16890 dynamic linker, before writing them out. */
16891
16892static enum elf_reloc_type_class
7e612e98
AM
16893ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
16894 const asection *rel_sec,
16895 const Elf_Internal_Rela *rela)
65f38f15 16896{
04c9666a 16897 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
16898 struct ppc_link_hash_table *htab = ppc_hash_table (info);
16899
33e44f2e 16900 if (rel_sec == htab->elf.irelplt)
7e612e98 16901 return reloc_class_ifunc;
a33d1f77 16902
4ce794b7 16903 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 16904 switch (r_type)
65f38f15
AM
16905 {
16906 case R_PPC64_RELATIVE:
16907 return reloc_class_relative;
16908 case R_PPC64_JMP_SLOT:
16909 return reloc_class_plt;
16910 case R_PPC64_COPY:
16911 return reloc_class_copy;
16912 default:
16913 return reloc_class_normal;
16914 }
16915}
16916
5bd4f169
AM
16917/* Finish up the dynamic sections. */
16918
b34976b6 16919static bfd_boolean
4ce794b7
AM
16920ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
16921 struct bfd_link_info *info)
5bd4f169 16922{
65f38f15
AM
16923 struct ppc_link_hash_table *htab;
16924 bfd *dynobj;
5bd4f169 16925 asection *sdyn;
5bd4f169 16926
65f38f15 16927 htab = ppc_hash_table (info);
4dfe6ac6
NC
16928 if (htab == NULL)
16929 return FALSE;
16930
65f38f15 16931 dynobj = htab->elf.dynobj;
3d4d4302 16932 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 16933
65f38f15 16934 if (htab->elf.dynamic_sections_created)
5bd4f169 16935 {
5bd4f169
AM
16936 Elf64_External_Dyn *dyncon, *dynconend;
16937
33e44f2e 16938 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 16939 abort ();
5bd4f169
AM
16940
16941 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 16942 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
16943 for (; dyncon < dynconend; dyncon++)
16944 {
16945 Elf_Internal_Dyn dyn;
19397422 16946 asection *s;
5bd4f169
AM
16947
16948 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
16949
16950 switch (dyn.d_tag)
16951 {
65f38f15
AM
16952 default:
16953 continue;
5bd4f169 16954
5d1634d7 16955 case DT_PPC64_GLINK:
4ce794b7 16956 s = htab->glink;
6348e046 16957 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
16958 /* We stupidly defined DT_PPC64_GLINK to be the start
16959 of glink rather than the first entry point, which is
16960 what ld.so needs, and now have a bigger stub to
16961 support automatic multiple TOCs. */
9e390558 16962 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
5d1634d7
AM
16963 break;
16964
19397422
AM
16965 case DT_PPC64_OPD:
16966 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
16967 if (s == NULL)
16968 continue;
16969 dyn.d_un.d_ptr = s->vma;
19397422
AM
16970 break;
16971
e8910a83 16972 case DT_PPC64_OPT:
5663e321
AM
16973 if ((htab->do_multi_toc && htab->multi_toc_needed)
16974 || htab->notoc_plt)
e8910a83 16975 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
f378ab09
AM
16976 if (htab->has_plt_localentry0)
16977 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
e8910a83
AM
16978 break;
16979
19397422
AM
16980 case DT_PPC64_OPDSZ:
16981 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
16982 if (s == NULL)
16983 continue;
eea6121a 16984 dyn.d_un.d_val = s->size;
19397422
AM
16985 break;
16986
65f38f15 16987 case DT_PLTGOT:
33e44f2e 16988 s = htab->elf.splt;
6348e046 16989 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
16990 break;
16991
16992 case DT_JMPREL:
33e44f2e 16993 s = htab->elf.srelplt;
6348e046 16994 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 16995 break;
5bd4f169 16996
65f38f15 16997 case DT_PLTRELSZ:
33e44f2e 16998 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7 16999 break;
82e66161
AM
17000
17001 case DT_TEXTREL:
17002 if (htab->local_ifunc_resolver)
17003 info->callbacks->einfo
17004 (_("%X%P: text relocations and GNU indirect "
17005 "functions will result in a segfault at runtime\n"));
17006 else if (htab->maybe_local_ifunc_resolver)
17007 info->callbacks->einfo
17008 (_("%P: warning: text relocations and GNU indirect "
17009 "functions may result in a segfault at runtime\n"));
17010 continue;
5bd4f169 17011 }
5bd4f169 17012
65f38f15 17013 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 17014 }
5bd4f169
AM
17015 }
17016
6528b6eb
AM
17017 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
17018 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17019 {
17020 /* Fill in the first entry in the global offset table.
17021 We use it to hold the link-time TOCbase. */
17022 bfd_put_64 (output_bfd,
60ee0d4a 17023 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 17024 htab->elf.sgot->contents);
5d1634d7
AM
17025
17026 /* Set .got entry size. */
2cdcc330
AM
17027 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
17028 = 8;
5d1634d7
AM
17029 }
17030
6528b6eb
AM
17031 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
17032 && htab->elf.splt->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17033 {
17034 /* Set .plt entry size. */
33e44f2e 17035 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 17036 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
17037 }
17038
84f5d08e
AM
17039 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
17040 brlt ourselves if emitrelocations. */
17041 if (htab->brlt != NULL
17042 && htab->brlt->reloc_count != 0
17043 && !_bfd_elf_link_output_relocs (output_bfd,
17044 htab->brlt,
d4730f92 17045 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
17046 elf_section_data (htab->brlt)->relocs,
17047 NULL))
17048 return FALSE;
17049
176a0d42
AM
17050 if (htab->glink != NULL
17051 && htab->glink->reloc_count != 0
17052 && !_bfd_elf_link_output_relocs (output_bfd,
17053 htab->glink,
d4730f92 17054 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
17055 elf_section_data (htab->glink)->relocs,
17056 NULL))
17057 return FALSE;
17058
da44f4e5 17059
df136d64
AM
17060 if (htab->glink_eh_frame != NULL
17061 && htab->glink_eh_frame->size != 0
17062 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
17063 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
17064 htab->glink_eh_frame,
17065 htab->glink_eh_frame->contents))
17066 return FALSE;
58d180e8 17067
e717da7e 17068 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
17069 since we didn't add them to DYNOBJ. We know dynobj is the first
17070 bfd. */
c72f2fb2 17071 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
17072 {
17073 asection *s;
7b53ace3 17074
0c8d6e5c 17075 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
17076 continue;
17077
e717da7e
AM
17078 s = ppc64_elf_tdata (dynobj)->got;
17079 if (s != NULL
eea6121a 17080 && s->size != 0
e717da7e
AM
17081 && s->output_section != bfd_abs_section_ptr
17082 && !bfd_set_section_contents (output_bfd, s->output_section,
17083 s->contents, s->output_offset,
eea6121a 17084 s->size))
e717da7e
AM
17085 return FALSE;
17086 s = ppc64_elf_tdata (dynobj)->relgot;
17087 if (s != NULL
eea6121a 17088 && s->size != 0
e717da7e
AM
17089 && s->output_section != bfd_abs_section_ptr
17090 && !bfd_set_section_contents (output_bfd, s->output_section,
17091 s->contents, s->output_offset,
eea6121a 17092 s->size))
e717da7e
AM
17093 return FALSE;
17094 }
f6c52c13 17095
b34976b6 17096 return TRUE;
5bd4f169
AM
17097}
17098
5bd4f169 17099#include "elf64-target.h"
7b8e7dad
AM
17100
17101/* FreeBSD support */
17102
17103#undef TARGET_LITTLE_SYM
17104#undef TARGET_LITTLE_NAME
17105
17106#undef TARGET_BIG_SYM
6d00b590 17107#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
17108#undef TARGET_BIG_NAME
17109#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
17110
17111#undef ELF_OSABI
17112#define ELF_OSABI ELFOSABI_FREEBSD
17113
17114#undef elf64_bed
17115#define elf64_bed elf64_powerpc_fbsd_bed
17116
17117#include "elf64-target.h"
This page took 2.882282 seconds and 4 git commands to generate.