]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf64-ppc.c
PowerPC TPREL_HA/LO optimisation
[thirdparty/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
b3adc24a 2 Copyright (C) 1999-2020 Free Software Foundation, Inc.
5bd4f169
AM
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
32ca9640 5 Largely rewritten by Alan Modra.
5bd4f169 6
ae9a127f 7 This file is part of BFD, the Binary File Descriptor library.
5bd4f169 8
ae9a127f
NC
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
cd123cb7 11 the Free Software Foundation; either version 3 of the License, or
ae9a127f 12 (at your option) any later version.
5bd4f169 13
ae9a127f
NC
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
5bd4f169 18
4ce794b7
AM
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
3e110533 21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
5bd4f169 22
cd123cb7 23
4ce794b7
AM
24/* The 64-bit PowerPC ELF ABI may be found at
25 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
5bd4f169 27
3db64b00 28#include "sysdep.h"
183e98be 29#include <stdarg.h>
5bd4f169 30#include "bfd.h"
5bd4f169
AM
31#include "bfdlink.h"
32#include "libbfd.h"
33#include "elf-bfd.h"
04c9666a 34#include "elf/ppc64.h"
5d1634d7 35#include "elf64-ppc.h"
58d180e8 36#include "dwarf2.h"
5bd4f169 37
bb294208
AM
38/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */
39#define OCTETS_PER_BYTE(ABFD, SEC) 1
40
805fc799 41static bfd_reloc_status_type ppc64_elf_ha_reloc
4ce794b7 42 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
43static bfd_reloc_status_type ppc64_elf_branch_reloc
44 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 45static bfd_reloc_status_type ppc64_elf_brtaken_reloc
4ce794b7 46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 47static bfd_reloc_status_type ppc64_elf_sectoff_reloc
4ce794b7 48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 49static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
4ce794b7 50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 51static bfd_reloc_status_type ppc64_elf_toc_reloc
4ce794b7 52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 53static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
4ce794b7 54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 55static bfd_reloc_status_type ppc64_elf_toc64_reloc
4ce794b7 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
5663e321
AM
57static bfd_reloc_status_type ppc64_elf_prefix_reloc
58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 59static bfd_reloc_status_type ppc64_elf_unhandled_reloc
4ce794b7 60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016 61static bfd_vma opd_entry_value
aef36ac1 62 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
5bd4f169 63
6d00b590 64#define TARGET_LITTLE_SYM powerpc_elf64_le_vec
ad8e1ba5 65#define TARGET_LITTLE_NAME "elf64-powerpcle"
6d00b590 66#define TARGET_BIG_SYM powerpc_elf64_vec
ad8e1ba5
AM
67#define TARGET_BIG_NAME "elf64-powerpc"
68#define ELF_ARCH bfd_arch_powerpc
ae95ffa6 69#define ELF_TARGET_ID PPC64_ELF_DATA
ad8e1ba5
AM
70#define ELF_MACHINE_CODE EM_PPC64
71#define ELF_MAXPAGESIZE 0x10000
702d1671
AM
72#define ELF_COMMONPAGESIZE 0x1000
73#define ELF_RELROPAGESIZE ELF_MAXPAGESIZE
ad8e1ba5
AM
74#define elf_info_to_howto ppc64_elf_info_to_howto
75
76#define elf_backend_want_got_sym 0
77#define elf_backend_want_plt_sym 0
78#define elf_backend_plt_alignment 3
79#define elf_backend_plt_not_loaded 1
ad8e1ba5 80#define elf_backend_got_header_size 8
5474d94f 81#define elf_backend_want_dynrelro 1
ad8e1ba5
AM
82#define elf_backend_can_gc_sections 1
83#define elf_backend_can_refcount 1
84#define elf_backend_rela_normal 1
64f52338 85#define elf_backend_dtrel_excludes_plt 1
6bfdb61b 86#define elf_backend_default_execstack 0
ad8e1ba5 87
e717da7e 88#define bfd_elf64_mkobject ppc64_elf_mkobject
ad8e1ba5 89#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
aa374f67 90#define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
ee67d69a
AM
91#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
92#define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
ad8e1ba5
AM
93#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
94#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
90e3cdf2 95#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
aa374f67 96#define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
8c5b4e52 97#define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
ad8e1ba5
AM
98
99#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
100#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
101#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
183e98be 102#define elf_backend_write_core_note ppc64_elf_write_core_note
9d19e4fd 103#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
ad8e1ba5 104#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 105#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
f6c7c3e8 106#define elf_backend_check_directives ppc64_elf_before_check_relocs
e5034e59 107#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
8387904d 108#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5 109#define elf_backend_check_relocs ppc64_elf_check_relocs
c0e331c7 110#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
74f0fb50 111#define elf_backend_gc_keep ppc64_elf_gc_keep
64d03ab5 112#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
ad8e1ba5 113#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
ad8e1ba5
AM
114#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
115#define elf_backend_hide_symbol ppc64_elf_hide_symbol
9f296da3 116#define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
ad8e1ba5
AM
117#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
118#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
a345bc8d 119#define elf_backend_hash_symbol ppc64_elf_hash_symbol
74541ad4 120#define elf_backend_init_index_section _bfd_elf_init_2_index_sections
60124e18 121#define elf_backend_action_discarded ppc64_elf_action_discarded
ad8e1ba5
AM
122#define elf_backend_relocate_section ppc64_elf_relocate_section
123#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
124#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
125#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 126#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
29ef7005 127#define elf_backend_special_sections ppc64_elf_special_sections
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
3115/* ppc64 ELF linker hash table. */
3116
3117struct ppc_link_hash_table
3118{
3119 struct elf_link_hash_table elf;
3120
721956f4
AM
3121 /* The stub hash table. */
3122 struct bfd_hash_table stub_hash_table;
3123
3124 /* Another hash table for plt_branch stubs. */
3125 struct bfd_hash_table branch_hash_table;
3126
3b421ab3
AM
3127 /* Hash table for function prologue tocsave. */
3128 htab_t tocsave_htab;
3129
e7d1c40c
AM
3130 /* Various options and other info passed from the linker. */
3131 struct ppc64_elf_params *params;
721956f4 3132
6f20ed8a
AM
3133 /* The size of sec_info below. */
3134 unsigned int sec_info_arr_size;
3135
3136 /* Per-section array of extra section info. Done this way rather
3137 than as part of ppc64_elf_section_data so we have the info for
3138 non-ppc64 sections. */
3139 struct
3140 {
3141 /* Along with elf_gp, specifies the TOC pointer used by this section. */
ad8e1ba5 3142 bfd_vma toc_off;
6f20ed8a
AM
3143
3144 union
3145 {
3146 /* The section group that this section belongs to. */
3147 struct map_stub *group;
3148 /* A temp section list pointer. */
3149 asection *list;
3150 } u;
3151 } *sec_info;
721956f4 3152
a4b6fadd
AM
3153 /* Linked list of groups. */
3154 struct map_stub *group;
3155
ad8e1ba5
AM
3156 /* Temp used when calculating TOC pointers. */
3157 bfd_vma toc_curr;
bf102f86
AM
3158 bfd *toc_bfd;
3159 asection *toc_first_sec;
ad8e1ba5 3160
b3fac117
AM
3161 /* Used when adding symbols. */
3162 struct ppc_link_hash_entry *dot_syms;
3163
33e44f2e 3164 /* Shortcuts to get to dynamic linker sections. */
4ce794b7 3165 asection *glink;
9e390558 3166 asection *global_entry;
82bd7b59 3167 asection *sfpr;
2d7ad24e
AM
3168 asection *pltlocal;
3169 asection *relpltlocal;
4ce794b7
AM
3170 asection *brlt;
3171 asection *relbrlt;
58d180e8 3172 asection *glink_eh_frame;
ec338859 3173
8387904d
AM
3174 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3175 struct ppc_link_hash_entry *tls_get_addr;
3176 struct ppc_link_hash_entry *tls_get_addr_fd;
411e1bfb 3177
927be08e
AM
3178 /* The size of reliplt used by got entry relocs. */
3179 bfd_size_type got_reli_size;
3180
9b5ecbd0 3181 /* Statistics. */
7341d5e2 3182 unsigned long stub_count[ppc_stub_global_entry];
9b5ecbd0 3183
ee75fd95
AM
3184 /* Number of stubs against global syms. */
3185 unsigned long stub_globals;
3186
ee67d69a
AM
3187 /* Set if we're linking code with function descriptors. */
3188 unsigned int opd_abi:1;
3189
4c52953f 3190 /* Support for multiple toc sections. */
33c0ec9d 3191 unsigned int do_multi_toc:1;
4c52953f 3192 unsigned int multi_toc_needed:1;
927be08e 3193 unsigned int second_toc_pass:1;
67f0cbdb 3194 unsigned int do_toc_opt:1;
4c52953f 3195
9a23f96e
AM
3196 /* Set if tls optimization is enabled. */
3197 unsigned int do_tls_opt:1;
3198
3e04d765
AM
3199 /* Set if inline plt calls should be converted to direct calls. */
3200 unsigned int can_convert_all_inline_plt:1;
3201
5d1634d7 3202 /* Set on error. */
99877b66 3203 unsigned int stub_error:1;
721956f4 3204
8c5b4e52
AM
3205 /* Whether func_desc_adjust needs to be run over symbols. */
3206 unsigned int need_func_desc_adj:1;
721956f4 3207
82e66161
AM
3208 /* Whether there exist local gnu indirect function resolvers,
3209 referenced by dynamic relocations. */
3210 unsigned int local_ifunc_resolver:1;
3211 unsigned int maybe_local_ifunc_resolver:1;
3212
f378ab09
AM
3213 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
3214 unsigned int has_plt_localentry0:1;
3215
5663e321
AM
3216 /* Whether calls are made via the PLT from NOTOC functions. */
3217 unsigned int notoc_plt:1;
3218
04bdff6a
AM
3219 /* Whether to use powerxx instructions in linkage stubs. */
3220 unsigned int powerxx_stubs:1;
3221
721956f4
AM
3222 /* Incremented every time we size stubs. */
3223 unsigned int stub_iteration;
5d1634d7 3224
87d72d41
AM
3225 /* Small local sym cache. */
3226 struct sym_cache sym_cache;
65f38f15
AM
3227};
3228
4c52953f
AM
3229/* Rename some of the generic section flags to better document how they
3230 are used here. */
b0dddeec
AM
3231
3232/* Nonzero if this section has TLS related relocations. */
3233#define has_tls_reloc sec_flg0
3234
9737e8af
AM
3235/* Nonzero if this section has a call to __tls_get_addr lacking marker
3236 relocations. */
3237#define nomark_tls_get_addr sec_flg1
b0dddeec
AM
3238
3239/* Nonzero if this section has any toc or got relocs. */
3240#define has_toc_reloc sec_flg2
3241
3242/* Nonzero if this section has a call to another section that uses
3243 the toc or got. */
d77c8a4b 3244#define makes_toc_func_call sec_flg3
b0dddeec
AM
3245
3246/* Recursion protection when determining above flag. */
d77c8a4b 3247#define call_check_in_progress sec_flg4
70cc837d 3248#define call_check_done sec_flg5
4c52953f 3249
65f38f15
AM
3250/* Get the ppc64 ELF linker hash table from a link_info structure. */
3251
3252#define ppc_hash_table(p) \
4dfe6ac6
NC
3253 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3254 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
65f38f15 3255
721956f4
AM
3256#define ppc_stub_hash_lookup(table, string, create, copy) \
3257 ((struct ppc_stub_hash_entry *) \
3258 bfd_hash_lookup ((table), (string), (create), (copy)))
3259
3260#define ppc_branch_hash_lookup(table, string, create, copy) \
3261 ((struct ppc_branch_hash_entry *) \
3262 bfd_hash_lookup ((table), (string), (create), (copy)))
3263
3264/* Create an entry in the stub hash table. */
3265
3266static struct bfd_hash_entry *
4ce794b7
AM
3267stub_hash_newfunc (struct bfd_hash_entry *entry,
3268 struct bfd_hash_table *table,
3269 const char *string)
721956f4
AM
3270{
3271 /* Allocate the structure if it has not already been allocated by a
3272 subclass. */
3273 if (entry == NULL)
3274 {
3275 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3276 if (entry == NULL)
3277 return entry;
3278 }
3279
3280 /* Call the allocation method of the superclass. */
3281 entry = bfd_hash_newfunc (entry, table, string);
3282 if (entry != NULL)
3283 {
3284 struct ppc_stub_hash_entry *eh;
3285
3286 /* Initialize the local fields. */
3287 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 3288 eh->stub_type = ppc_stub_none;
6f20ed8a 3289 eh->group = NULL;
721956f4
AM
3290 eh->stub_offset = 0;
3291 eh->target_value = 0;
3292 eh->target_section = NULL;
721956f4 3293 eh->h = NULL;
6911b7dc 3294 eh->plt_ent = NULL;
6911b7dc 3295 eh->other = 0;
721956f4
AM
3296 }
3297
3298 return entry;
3299}
3300
3301/* Create an entry in the branch hash table. */
3302
3303static struct bfd_hash_entry *
4ce794b7
AM
3304branch_hash_newfunc (struct bfd_hash_entry *entry,
3305 struct bfd_hash_table *table,
3306 const char *string)
721956f4
AM
3307{
3308 /* Allocate the structure if it has not already been allocated by a
3309 subclass. */
3310 if (entry == NULL)
3311 {
3312 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3313 if (entry == NULL)
3314 return entry;
3315 }
3316
3317 /* Call the allocation method of the superclass. */
3318 entry = bfd_hash_newfunc (entry, table, string);
3319 if (entry != NULL)
3320 {
3321 struct ppc_branch_hash_entry *eh;
3322
3323 /* Initialize the local fields. */
3324 eh = (struct ppc_branch_hash_entry *) entry;
3325 eh->offset = 0;
3326 eh->iter = 0;
3327 }
3328
3329 return entry;
3330}
3331
65f38f15
AM
3332/* Create an entry in a ppc64 ELF linker hash table. */
3333
3334static struct bfd_hash_entry *
4ce794b7
AM
3335link_hash_newfunc (struct bfd_hash_entry *entry,
3336 struct bfd_hash_table *table,
3337 const char *string)
65f38f15
AM
3338{
3339 /* Allocate the structure if it has not already been allocated by a
3340 subclass. */
3341 if (entry == NULL)
3342 {
3343 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3344 if (entry == NULL)
3345 return entry;
3346 }
3347
3348 /* Call the allocation method of the superclass. */
3349 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3350 if (entry != NULL)
3351 {
3352 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3353
b3fac117 3354 memset (&eh->u.stub_cache, 0,
908b32fc 3355 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
3356 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3357
3358 /* When making function calls, old ABI code references function entry
3359 points (dot symbols), while new ABI code references the function
3360 descriptor symbol. We need to make any combination of reference and
3361 definition work together, without breaking archive linking.
3362
3363 For a defined function "foo" and an undefined call to "bar":
3364 An old object defines "foo" and ".foo", references ".bar" (possibly
3365 "bar" too).
3366 A new object defines "foo" and references "bar".
3367
3368 A new object thus has no problem with its undefined symbols being
3369 satisfied by definitions in an old object. On the other hand, the
3370 old object won't have ".bar" satisfied by a new object.
3371
3372 Keep a list of newly added dot-symbols. */
3373
3374 if (string[0] == '.')
3375 {
3376 struct ppc_link_hash_table *htab;
3377
3378 htab = (struct ppc_link_hash_table *) table;
3379 eh->u.next_dot_sym = htab->dot_syms;
3380 htab->dot_syms = eh;
3381 }
65f38f15
AM
3382 }
3383
3384 return entry;
3385}
3386
2cdcc330
AM
3387struct tocsave_entry
3388{
3b421ab3
AM
3389 asection *sec;
3390 bfd_vma offset;
3391};
3392
3393static hashval_t
3394tocsave_htab_hash (const void *p)
3395{
3396 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4aef7643 3397 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
3b421ab3
AM
3398}
3399
3400static int
3401tocsave_htab_eq (const void *p1, const void *p2)
3402{
3403 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
3404 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
3405 return e1->sec == e2->sec && e1->offset == e2->offset;
3406}
3407
68faa637
AM
3408/* Destroy a ppc64 ELF linker hash table. */
3409
3410static void
d495ab0d 3411ppc64_elf_link_hash_table_free (bfd *obfd)
68faa637 3412{
d495ab0d 3413 struct ppc_link_hash_table *htab;
68faa637 3414
d495ab0d 3415 htab = (struct ppc_link_hash_table *) obfd->link.hash;
68faa637
AM
3416 if (htab->tocsave_htab)
3417 htab_delete (htab->tocsave_htab);
d495ab0d
AM
3418 bfd_hash_table_free (&htab->branch_hash_table);
3419 bfd_hash_table_free (&htab->stub_hash_table);
3420 _bfd_elf_link_hash_table_free (obfd);
68faa637
AM
3421}
3422
65f38f15
AM
3423/* Create a ppc64 ELF linker hash table. */
3424
3425static struct bfd_link_hash_table *
4ce794b7 3426ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
3427{
3428 struct ppc_link_hash_table *htab;
3429 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3430
4ce794b7 3431 htab = bfd_zmalloc (amt);
65f38f15
AM
3432 if (htab == NULL)
3433 return NULL;
3434
66eb6687 3435 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
3436 sizeof (struct ppc_link_hash_entry),
3437 PPC64_ELF_DATA))
65f38f15 3438 {
e2d34d7d 3439 free (htab);
65f38f15
AM
3440 return NULL;
3441 }
3442
721956f4 3443 /* Init the stub hash table too. */
66eb6687
AM
3444 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
3445 sizeof (struct ppc_stub_hash_entry)))
2915c55b 3446 {
d495ab0d 3447 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3448 return NULL;
3449 }
721956f4
AM
3450
3451 /* And the branch hash table. */
66eb6687
AM
3452 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
3453 sizeof (struct ppc_branch_hash_entry)))
2915c55b
JK
3454 {
3455 bfd_hash_table_free (&htab->stub_hash_table);
d495ab0d 3456 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3457 return NULL;
3458 }
721956f4 3459
3b421ab3
AM
3460 htab->tocsave_htab = htab_try_create (1024,
3461 tocsave_htab_hash,
3462 tocsave_htab_eq,
3463 NULL);
3464 if (htab->tocsave_htab == NULL)
2915c55b 3465 {
d495ab0d 3466 ppc64_elf_link_hash_table_free (abfd);
2915c55b
JK
3467 return NULL;
3468 }
d495ab0d 3469 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
3b421ab3 3470
3254fd24
AM
3471 /* Initializing two fields of the union is just cosmetic. We really
3472 only care about glist, but when compiled on a 32-bit host the
3473 bfd_vma fields are larger. Setting the bfd_vma to zero makes
3474 debugger inspection of these fields look nicer. */
a6aa5195
AM
3475 htab->elf.init_got_refcount.refcount = 0;
3476 htab->elf.init_got_refcount.glist = NULL;
3477 htab->elf.init_plt_refcount.refcount = 0;
3478 htab->elf.init_plt_refcount.glist = NULL;
3479 htab->elf.init_got_offset.offset = 0;
3480 htab->elf.init_got_offset.glist = NULL;
3481 htab->elf.init_plt_offset.offset = 0;
3482 htab->elf.init_plt_offset.glist = NULL;
3254fd24 3483
65f38f15
AM
3484 return &htab->elf.root;
3485}
3486
bfeb4a28
AM
3487/* Create sections for linker generated code. */
3488
3489static bfd_boolean
3490create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3491{
3492 struct ppc_link_hash_table *htab;
3493 flagword flags;
3494
3495 htab = ppc_hash_table (info);
3496
bfeb4a28
AM
3497 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3498 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
b32547cd
AM
3499 if (htab->params->save_restore_funcs)
3500 {
3501 /* Create .sfpr for code to save and restore fp regs. */
3502 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
3503 flags);
3504 if (htab->sfpr == NULL
fd361982 3505 || !bfd_set_section_alignment (htab->sfpr, 2))
b32547cd
AM
3506 return FALSE;
3507 }
3508
3509 if (bfd_link_relocatable (info))
3510 return TRUE;
bfeb4a28
AM
3511
3512 /* Create .glink for lazy dynamic linking support. */
3513 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3514 flags);
3515 if (htab->glink == NULL
fd361982 3516 || !bfd_set_section_alignment (htab->glink, 3))
bfeb4a28
AM
3517 return FALSE;
3518
9e390558
AM
3519 /* The part of .glink used by global entry stubs, separate so that
3520 it can be aligned appropriately without affecting htab->glink. */
3521 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3522 flags);
3523 if (htab->global_entry == NULL
fd361982 3524 || !bfd_set_section_alignment (htab->global_entry, 2))
9e390558
AM
3525 return FALSE;
3526
bfeb4a28
AM
3527 if (!info->no_ld_generated_unwind_info)
3528 {
3529 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
3530 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3531 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
3532 ".eh_frame",
3533 flags);
3534 if (htab->glink_eh_frame == NULL
fd361982 3535 || !bfd_set_section_alignment (htab->glink_eh_frame, 2))
bfeb4a28
AM
3536 return FALSE;
3537 }
3538
3539 flags = SEC_ALLOC | SEC_LINKER_CREATED;
33e44f2e
AM
3540 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
3541 if (htab->elf.iplt == NULL
fd361982 3542 || !bfd_set_section_alignment (htab->elf.iplt, 3))
bfeb4a28
AM
3543 return FALSE;
3544
3545 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3546 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
33e44f2e
AM
3547 htab->elf.irelplt
3548 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
3549 if (htab->elf.irelplt == NULL
fd361982 3550 || !bfd_set_section_alignment (htab->elf.irelplt, 3))
bfeb4a28
AM
3551 return FALSE;
3552
3553 /* Create branch lookup table for plt_branch stubs. */
3554 flags = (SEC_ALLOC | SEC_LOAD
3555 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3556 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3557 flags);
3558 if (htab->brlt == NULL
fd361982 3559 || !bfd_set_section_alignment (htab->brlt, 3))
bfeb4a28
AM
3560 return FALSE;
3561
2d7ad24e
AM
3562 /* Local plt entries, put in .branch_lt but a separate section for
3563 convenience. */
3564 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3565 flags);
3566 if (htab->pltlocal == NULL
fd361982 3567 || !bfd_set_section_alignment (htab->pltlocal, 3))
2d7ad24e
AM
3568 return FALSE;
3569
0e1862bb 3570 if (!bfd_link_pic (info))
bfeb4a28
AM
3571 return TRUE;
3572
3573 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3574 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2d7ad24e
AM
3575 htab->relbrlt
3576 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
bfeb4a28 3577 if (htab->relbrlt == NULL
fd361982 3578 || !bfd_set_section_alignment (htab->relbrlt, 3))
bfeb4a28
AM
3579 return FALSE;
3580
2d7ad24e
AM
3581 htab->relpltlocal
3582 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
3583 if (htab->relpltlocal == NULL
fd361982 3584 || !bfd_set_section_alignment (htab->relpltlocal, 3))
2d7ad24e
AM
3585 return FALSE;
3586
bfeb4a28
AM
3587 return TRUE;
3588}
3589
e717da7e
AM
3590/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
3591
bfeb4a28 3592bfd_boolean
e7d1c40c
AM
3593ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
3594 struct ppc64_elf_params *params)
e717da7e
AM
3595{
3596 struct ppc_link_hash_table *htab;
3597
e7d1c40c 3598 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
e717da7e
AM
3599
3600/* Always hook our dynamic sections into the first bfd, which is the
3601 linker created stub bfd. This ensures that the GOT header is at
3602 the start of the output TOC section. */
3603 htab = ppc_hash_table (info);
e7d1c40c
AM
3604 htab->elf.dynobj = params->stub_bfd;
3605 htab->params = params;
bfeb4a28 3606
bfeb4a28 3607 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
3608}
3609
721956f4
AM
3610/* Build a name for an entry in the stub hash table. */
3611
3612static char *
4ce794b7
AM
3613ppc_stub_name (const asection *input_section,
3614 const asection *sym_sec,
3615 const struct ppc_link_hash_entry *h,
3616 const Elf_Internal_Rela *rel)
721956f4
AM
3617{
3618 char *stub_name;
bcaa2f82 3619 ssize_t len;
721956f4
AM
3620
3621 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3622 offsets from a sym as a branch target? In fact, we could
3623 probably assume the addend is always zero. */
3624 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3625
3626 if (h)
3627 {
3628 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3629 stub_name = bfd_malloc (len);
46de2a7c
AM
3630 if (stub_name == NULL)
3631 return stub_name;
3632
bcaa2f82
AM
3633 len = sprintf (stub_name, "%08x.%s+%x",
3634 input_section->id & 0xffffffff,
3635 h->elf.root.root.string,
3636 (int) rel->r_addend & 0xffffffff);
721956f4
AM
3637 }
3638 else
3639 {
ad8e1ba5 3640 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 3641 stub_name = bfd_malloc (len);
46de2a7c
AM
3642 if (stub_name == NULL)
3643 return stub_name;
3644
bcaa2f82
AM
3645 len = sprintf (stub_name, "%08x.%x:%x+%x",
3646 input_section->id & 0xffffffff,
3647 sym_sec->id & 0xffffffff,
3648 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3649 (int) rel->r_addend & 0xffffffff);
721956f4 3650 }
bcaa2f82 3651 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 3652 stub_name[len - 2] = 0;
721956f4
AM
3653 return stub_name;
3654}
3655
3656/* Look up an entry in the stub hash. Stub entries are cached because
3657 creating the stub name takes a bit of time. */
3658
3659static struct ppc_stub_hash_entry *
4ce794b7
AM
3660ppc_get_stub_entry (const asection *input_section,
3661 const asection *sym_sec,
039b3fef 3662 struct ppc_link_hash_entry *h,
4ce794b7
AM
3663 const Elf_Internal_Rela *rel,
3664 struct ppc_link_hash_table *htab)
721956f4
AM
3665{
3666 struct ppc_stub_hash_entry *stub_entry;
6f20ed8a 3667 struct map_stub *group;
721956f4
AM
3668
3669 /* If this input section is part of a group of sections sharing one
3670 stub section, then use the id of the first section in the group.
3671 Stub names need to include a section id, as there may well be
3672 more than one stub used to reach say, printf, and we need to
3673 distinguish between them. */
6f20ed8a 3674 group = htab->sec_info[input_section->id].u.group;
89d77b8a
AM
3675 if (group == NULL)
3676 return NULL;
721956f4 3677
b3fac117
AM
3678 if (h != NULL && h->u.stub_cache != NULL
3679 && h->u.stub_cache->h == h
6f20ed8a 3680 && h->u.stub_cache->group == group)
721956f4 3681 {
b3fac117 3682 stub_entry = h->u.stub_cache;
721956f4
AM
3683 }
3684 else
3685 {
3686 char *stub_name;
3687
6f20ed8a 3688 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
721956f4
AM
3689 if (stub_name == NULL)
3690 return NULL;
3691
3692 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 3693 stub_name, FALSE, FALSE);
721956f4 3694 if (h != NULL)
b3fac117 3695 h->u.stub_cache = stub_entry;
721956f4
AM
3696
3697 free (stub_name);
3698 }
3699
3700 return stub_entry;
3701}
3702
3703/* Add a new stub entry to the stub hash. Not all fields of the new
3704 stub entry are initialised. */
3705
3706static struct ppc_stub_hash_entry *
4ce794b7
AM
3707ppc_add_stub (const char *stub_name,
3708 asection *section,
25f53a85 3709 struct bfd_link_info *info)
721956f4 3710{
25f53a85 3711 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 3712 struct map_stub *group;
721956f4
AM
3713 asection *link_sec;
3714 asection *stub_sec;
3715 struct ppc_stub_hash_entry *stub_entry;
3716
6f20ed8a
AM
3717 group = htab->sec_info[section->id].u.group;
3718 link_sec = group->link_sec;
3719 stub_sec = group->stub_sec;
721956f4
AM
3720 if (stub_sec == NULL)
3721 {
6f20ed8a
AM
3722 size_t namelen;
3723 bfd_size_type len;
3724 char *s_name;
721956f4 3725
6f20ed8a
AM
3726 namelen = strlen (link_sec->name);
3727 len = namelen + sizeof (STUB_SUFFIX);
3728 s_name = bfd_alloc (htab->params->stub_bfd, len);
3729 if (s_name == NULL)
3730 return NULL;
721956f4 3731
6f20ed8a
AM
3732 memcpy (s_name, link_sec->name, namelen);
3733 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3734 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
3735 if (stub_sec == NULL)
3736 return NULL;
3737 group->stub_sec = stub_sec;
721956f4
AM
3738 }
3739
3740 /* Enter this entry into the linker stub hash table. */
3741 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 3742 TRUE, FALSE);
721956f4
AM
3743 if (stub_entry == NULL)
3744 {
695344c0 3745 /* xgettext:c-format */
cf97bcb0
AM
3746 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
3747 section->owner, stub_name);
721956f4
AM
3748 return NULL;
3749 }
3750
6f20ed8a 3751 stub_entry->group = group;
721956f4 3752 stub_entry->stub_offset = 0;
721956f4
AM
3753 return stub_entry;
3754}
3755
e717da7e
AM
3756/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3757 not already done. */
65f38f15 3758
b34976b6 3759static bfd_boolean
e717da7e 3760create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 3761{
e717da7e
AM
3762 asection *got, *relgot;
3763 flagword flags;
3764 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 3765
0c8d6e5c 3766 if (!is_ppc64_elf (abfd))
0ffa91dd 3767 return FALSE;
4dfe6ac6
NC
3768 if (htab == NULL)
3769 return FALSE;
0ffa91dd 3770
33e44f2e
AM
3771 if (!htab->elf.sgot
3772 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
3773 return FALSE;
e717da7e
AM
3774
3775 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3776 | SEC_LINKER_CREATED);
3777
c456f082 3778 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 3779 if (!got
fd361982 3780 || !bfd_set_section_alignment (got, 3))
e717da7e 3781 return FALSE;
65f38f15 3782
c456f082
AM
3783 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
3784 flags | SEC_READONLY);
e717da7e 3785 if (!relgot
fd361982 3786 || !bfd_set_section_alignment (relgot, 3))
b34976b6 3787 return FALSE;
e717da7e
AM
3788
3789 ppc64_elf_tdata (abfd)->got = got;
3790 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 3791 return TRUE;
65f38f15 3792}
5bd4f169 3793
b31867b6
AM
3794/* Follow indirect and warning symbol links. */
3795
3796static inline struct bfd_link_hash_entry *
3797follow_link (struct bfd_link_hash_entry *h)
3798{
3799 while (h->type == bfd_link_hash_indirect
3800 || h->type == bfd_link_hash_warning)
3801 h = h->u.i.link;
3802 return h;
3803}
3804
3805static inline struct elf_link_hash_entry *
3806elf_follow_link (struct elf_link_hash_entry *h)
3807{
3808 return (struct elf_link_hash_entry *) follow_link (&h->root);
3809}
3810
3811static inline struct ppc_link_hash_entry *
3812ppc_follow_link (struct ppc_link_hash_entry *h)
3813{
3814 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
3815}
3816
40d16e0b
AM
3817/* Merge PLT info on FROM with that on TO. */
3818
3819static void
3820move_plt_plist (struct ppc_link_hash_entry *from,
3821 struct ppc_link_hash_entry *to)
3822{
3823 if (from->elf.plt.plist != NULL)
3824 {
3825 if (to->elf.plt.plist != NULL)
3826 {
3827 struct plt_entry **entp;
3828 struct plt_entry *ent;
3829
3830 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
3831 {
3832 struct plt_entry *dent;
3833
3834 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
3835 if (dent->addend == ent->addend)
3836 {
3837 dent->plt.refcount += ent->plt.refcount;
3838 *entp = ent->next;
3839 break;
3840 }
3841 if (dent == NULL)
3842 entp = &ent->next;
3843 }
3844 *entp = to->elf.plt.plist;
3845 }
3846
3847 to->elf.plt.plist = from->elf.plt.plist;
3848 from->elf.plt.plist = NULL;
3849 }
3850}
3851
65f38f15
AM
3852/* Copy the extra info we tack onto an elf_link_hash_entry. */
3853
3854static void
fcfa13d2
AM
3855ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
3856 struct elf_link_hash_entry *dir,
3857 struct elf_link_hash_entry *ind)
65f38f15
AM
3858{
3859 struct ppc_link_hash_entry *edir, *eind;
3860
3861 edir = (struct ppc_link_hash_entry *) dir;
3862 eind = (struct ppc_link_hash_entry *) ind;
3863
c79d6685
AM
3864 edir->is_func |= eind->is_func;
3865 edir->is_func_descriptor |= eind->is_func_descriptor;
3866 edir->tls_mask |= eind->tls_mask;
3867 if (eind->oh != NULL)
3868 edir->oh = ppc_follow_link (eind->oh);
3869
474436e6 3870 if (edir->elf.versioned != versioned_hidden)
e81830c5
AM
3871 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
3872 edir->elf.ref_regular |= eind->elf.ref_regular;
3873 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4a7e5234 3874 edir->elf.non_got_ref |= eind->elf.non_got_ref;
e81830c5
AM
3875 edir->elf.needs_plt |= eind->elf.needs_plt;
3876 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
c79d6685 3877
d311bc8b
AM
3878 /* If we were called to copy over info for a weak sym, don't copy
3879 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
3880 in order to simplify readonly_dynrelocs and save a field in the
3881 symbol hash entry, but that means dyn_relocs can't be used in any
3882 tests about a specific symbol, or affect other symbol flags which
ab2477e1 3883 are then tested. */
d311bc8b 3884 if (eind->elf.root.type != bfd_link_hash_indirect)
ab2477e1 3885 return;
d311bc8b 3886
411e1bfb 3887 /* Copy over any dynamic relocs we may have on the indirect sym. */
bbd7ec4a 3888 if (eind->dyn_relocs != NULL)
65f38f15 3889 {
bbd7ec4a
AM
3890 if (edir->dyn_relocs != NULL)
3891 {
6061a67d
AM
3892 struct elf_dyn_relocs **pp;
3893 struct elf_dyn_relocs *p;
bbd7ec4a 3894
fcfa13d2 3895 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a
AM
3896 list. Merge any entries against the same section. */
3897 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3898 {
6061a67d 3899 struct elf_dyn_relocs *q;
bbd7ec4a
AM
3900
3901 for (q = edir->dyn_relocs; q != NULL; q = q->next)
3902 if (q->sec == p->sec)
3903 {
3904 q->pc_count += p->pc_count;
3905 q->count += p->count;
3906 *pp = p->next;
3907 break;
3908 }
3909 if (q == NULL)
3910 pp = &p->next;
3911 }
3912 *pp = edir->dyn_relocs;
3913 }
3914
65f38f15
AM
3915 edir->dyn_relocs = eind->dyn_relocs;
3916 eind->dyn_relocs = NULL;
3917 }
65f38f15 3918
81848ca0
AM
3919 /* Copy over got entries that we may have already seen to the
3920 symbol which just became indirect. */
411e1bfb
AM
3921 if (eind->elf.got.glist != NULL)
3922 {
3923 if (edir->elf.got.glist != NULL)
3924 {
3925 struct got_entry **entp;
3926 struct got_entry *ent;
3927
3928 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3929 {
3930 struct got_entry *dent;
3931
3932 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3933 if (dent->addend == ent->addend
e717da7e 3934 && dent->owner == ent->owner
411e1bfb
AM
3935 && dent->tls_type == ent->tls_type)
3936 {
3937 dent->got.refcount += ent->got.refcount;
3938 *entp = ent->next;
3939 break;
3940 }
3941 if (dent == NULL)
3942 entp = &ent->next;
3943 }
3944 *entp = edir->elf.got.glist;
3945 }
3946
3947 edir->elf.got.glist = eind->elf.got.glist;
3948 eind->elf.got.glist = NULL;
3949 }
3950
3951 /* And plt entries. */
40d16e0b 3952 move_plt_plist (eind, edir);
411e1bfb 3953
fcfa13d2 3954 if (eind->elf.dynindx != -1)
411e1bfb 3955 {
fcfa13d2
AM
3956 if (edir->elf.dynindx != -1)
3957 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3958 edir->elf.dynstr_index);
411e1bfb
AM
3959 edir->elf.dynindx = eind->elf.dynindx;
3960 edir->elf.dynstr_index = eind->elf.dynstr_index;
3961 eind->elf.dynindx = -1;
3962 eind->elf.dynstr_index = 0;
3963 }
411e1bfb
AM
3964}
3965
8387904d
AM
3966/* Find the function descriptor hash entry from the given function code
3967 hash entry FH. Link the entries via their OH fields. */
3968
3969static struct ppc_link_hash_entry *
b31867b6 3970lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
3971{
3972 struct ppc_link_hash_entry *fdh = fh->oh;
3973
3974 if (fdh == NULL)
3975 {
3976 const char *fd_name = fh->elf.root.root.string + 1;
3977
3978 fdh = (struct ppc_link_hash_entry *)
3979 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
b31867b6
AM
3980 if (fdh == NULL)
3981 return fdh;
3982
3983 fdh->is_func_descriptor = 1;
3984 fdh->oh = fh;
3985 fh->is_func = 1;
3986 fh->oh = fdh;
8387904d
AM
3987 }
3988
8c5b4e52
AM
3989 fdh = ppc_follow_link (fdh);
3990 fdh->is_func_descriptor = 1;
3991 fdh->oh = fh;
3992 return fdh;
8387904d
AM
3993}
3994
8c5b4e52 3995/* Make a fake function descriptor sym for the undefined code sym FH. */
bb700d78
AM
3996
3997static struct ppc_link_hash_entry *
3998make_fdh (struct bfd_link_info *info,
908b32fc 3999 struct ppc_link_hash_entry *fh)
bb700d78 4000{
8c5b4e52
AM
4001 bfd *abfd = fh->elf.root.u.undef.abfd;
4002 struct bfd_link_hash_entry *bh = NULL;
bb700d78 4003 struct ppc_link_hash_entry *fdh;
8c5b4e52
AM
4004 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4005 ? BSF_WEAK
4006 : BSF_GLOBAL);
4007
4008 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4009 fh->elf.root.root.string + 1,
4010 flags, bfd_und_section_ptr, 0,
4011 NULL, FALSE, FALSE, &bh))
bb700d78
AM
4012 return NULL;
4013
4014 fdh = (struct ppc_link_hash_entry *) bh;
4015 fdh->elf.non_elf = 0;
908b32fc
AM
4016 fdh->fake = 1;
4017 fdh->is_func_descriptor = 1;
4018 fdh->oh = fh;
4019 fh->is_func = 1;
4020 fh->oh = fdh;
bb700d78
AM
4021 return fdh;
4022}
4023
8387904d
AM
4024/* Fix function descriptor symbols defined in .opd sections to be
4025 function type. */
555cd476
AM
4026
4027static bfd_boolean
c16153ae 4028ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 4029 struct bfd_link_info *info,
555cd476 4030 Elf_Internal_Sym *isym,
6911b7dc 4031 const char **name,
555cd476
AM
4032 flagword *flags ATTRIBUTE_UNUSED,
4033 asection **sec,
b53dfeb2 4034 bfd_vma *value)
555cd476 4035{
b53dfeb2 4036 if (*sec != NULL
f1885d1e 4037 && strcmp ((*sec)->name, ".opd") == 0)
b53dfeb2
AM
4038 {
4039 asection *code_sec;
4040
4041 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4042 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4043 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4044
4045 /* If the symbol is a function defined in .opd, and the function
4046 code is in a discarded group, let it appear to be undefined. */
0e1862bb 4047 if (!bfd_link_relocatable (info)
b53dfeb2
AM
4048 && (*sec)->reloc_count != 0
4049 && opd_entry_value (*sec, *value, &code_sec, NULL,
4050 FALSE) != (bfd_vma) -1
4051 && discarded_section (code_sec))
4052 {
4053 *sec = bfd_und_section_ptr;
4054 isym->st_shndx = SHN_UNDEF;
4055 }
4056 }
dbd1e97e
AM
4057 else if (*sec != NULL
4058 && strcmp ((*sec)->name, ".toc") == 0
4059 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4060 {
4061 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4062 if (htab != NULL)
4063 htab->params->object_in_toc = 1;
4064 }
433817dd 4065
6911b7dc
AM
4066 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4067 {
4068 if (abiversion (ibfd) == 0)
4069 set_abiversion (ibfd, 2);
4070 else if (abiversion (ibfd) == 1)
4071 {
cf97bcb0
AM
4072 _bfd_error_handler (_("symbol '%s' has invalid st_other"
4073 " for ABI version 1"), *name);
6911b7dc
AM
4074 bfd_set_error (bfd_error_bad_value);
4075 return FALSE;
4076 }
4077 }
4078
555cd476
AM
4079 return TRUE;
4080}
4081
6911b7dc
AM
4082/* Merge non-visibility st_other attributes: local entry point. */
4083
4084static void
4085ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4086 const Elf_Internal_Sym *isym,
4087 bfd_boolean definition,
4088 bfd_boolean dynamic)
4089{
f378ab09 4090 if (definition && (!dynamic || !h->def_regular))
6911b7dc
AM
4091 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4092 | ELF_ST_VISIBILITY (h->other));
4093}
4094
8c5b4e52
AM
4095/* Hook called on merging a symbol. We use this to clear "fake" since
4096 we now have a real symbol. */
4097
4098static bfd_boolean
4099ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
8b5f1ed8 4100 const Elf_Internal_Sym *isym,
8c5b4e52
AM
4101 asection **psec ATTRIBUTE_UNUSED,
4102 bfd_boolean newdef ATTRIBUTE_UNUSED,
4103 bfd_boolean olddef ATTRIBUTE_UNUSED,
4104 bfd *oldbfd ATTRIBUTE_UNUSED,
4105 const asection *oldsec ATTRIBUTE_UNUSED)
4106{
4107 ((struct ppc_link_hash_entry *) h)->fake = 0;
8b5f1ed8
AM
4108 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4109 ((struct ppc_link_hash_entry *) h)->non_zero_localentry = 1;
8c5b4e52
AM
4110 return TRUE;
4111}
4112
8387904d 4113/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
4114 inclusion of a new ABI object archive that defines "bar".
4115 NAME is a symbol defined in an archive. Return a symbol in the hash
4116 table that might be satisfied by the archive symbols. */
8387904d
AM
4117
4118static struct elf_link_hash_entry *
4119ppc64_elf_archive_symbol_lookup (bfd *abfd,
4120 struct bfd_link_info *info,
4121 const char *name)
4122{
4123 struct elf_link_hash_entry *h;
4124 char *dot_name;
4125 size_t len;
4126
4127 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
4128 if (h != NULL
4129 /* Don't return this sym if it is a fake function descriptor
4130 created by add_symbol_adjust. */
8c5b4e52 4131 && !((struct ppc_link_hash_entry *) h)->fake)
8387904d
AM
4132 return h;
4133
4134 if (name[0] == '.')
4135 return h;
4136
4137 len = strlen (name);
4138 dot_name = bfd_alloc (abfd, len + 2);
4139 if (dot_name == NULL)
e99955cd 4140 return (struct elf_link_hash_entry *) -1;
8387904d
AM
4141 dot_name[0] = '.';
4142 memcpy (dot_name + 1, name, len + 1);
4143 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4144 bfd_release (abfd, dot_name);
4145 return h;
4146}
4147
4148/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
4149 new ABI object defines "bar". Well, at least, undefined dot symbols
4150 are made weak. This stops later archive searches from including an
4151 object if we already have a function descriptor definition. It also
35b0ce59
AM
4152 prevents the linker complaining about undefined symbols.
4153 We also check and correct mismatched symbol visibility here. The
4154 most restrictive visibility of the function descriptor and the
4155 function entry symbol is used. */
8387904d
AM
4156
4157static bfd_boolean
b3fac117 4158add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 4159{
8387904d
AM
4160 struct ppc_link_hash_table *htab;
4161 struct ppc_link_hash_entry *fdh;
4162
b3fac117
AM
4163 if (eh->elf.root.type == bfd_link_hash_warning)
4164 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 4165
8400d40d
AM
4166 if (eh->elf.root.type == bfd_link_hash_indirect)
4167 return TRUE;
4168
b3fac117
AM
4169 if (eh->elf.root.root.string[0] != '.')
4170 abort ();
8387904d 4171
b3fac117 4172 htab = ppc_hash_table (info);
4dfe6ac6
NC
4173 if (htab == NULL)
4174 return FALSE;
4175
b31867b6 4176 fdh = lookup_fdh (eh, htab);
8c5b4e52
AM
4177 if (fdh == NULL
4178 && !bfd_link_relocatable (info)
4179 && (eh->elf.root.type == bfd_link_hash_undefined
4180 || eh->elf.root.type == bfd_link_hash_undefweak)
4181 && eh->elf.ref_regular)
4182 {
4183 /* Make an undefined function descriptor sym, in order to
4184 pull in an --as-needed shared lib. Archives are handled
4185 elsewhere. */
4186 fdh = make_fdh (info, eh);
4187 if (fdh == NULL)
4188 return FALSE;
bb700d78 4189 }
8c5b4e52
AM
4190
4191 if (fdh != NULL)
8387904d 4192 {
35b0ce59
AM
4193 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4194 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
8c5b4e52
AM
4195
4196 /* Make both descriptor and entry symbol have the most
4197 constraining visibility of either symbol. */
35b0ce59
AM
4198 if (entry_vis < descr_vis)
4199 fdh->elf.other += entry_vis - descr_vis;
4200 else if (entry_vis > descr_vis)
4201 eh->elf.other += descr_vis - entry_vis;
4202
8c5b4e52
AM
4203 /* Propagate reference flags from entry symbol to function
4204 descriptor symbol. */
bc4e12de 4205 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
4070765b 4206 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
8c5b4e52
AM
4207 fdh->elf.ref_regular |= eh->elf.ref_regular;
4208 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
4209
4210 if (!fdh->elf.forced_local
4211 && fdh->elf.dynindx == -1
4212 && fdh->elf.versioned != versioned_hidden
4213 && (bfd_link_dll (info)
4214 || fdh->elf.def_dynamic
4215 || fdh->elf.ref_dynamic)
4216 && (eh->elf.ref_regular
4217 || eh->elf.def_regular))
4218 {
2cdcc330 4219 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
8c5b4e52 4220 return FALSE;
35b0ce59 4221 }
8387904d 4222 }
99877b66 4223
8387904d
AM
4224 return TRUE;
4225}
4226
f6c7c3e8
AM
4227/* Set up opd section info and abiversion for IBFD, and process list
4228 of dot-symbols we made in link_hash_newfunc. */
b3fac117 4229
8387904d 4230static bfd_boolean
f6c7c3e8 4231ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
8387904d 4232{
99877b66 4233 struct ppc_link_hash_table *htab;
b3fac117 4234 struct ppc_link_hash_entry **p, *eh;
459609d6 4235 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
433817dd 4236
459609d6 4237 if (opd != NULL && opd->size != 0)
b3fac117 4238 {
b9399fcf
AM
4239 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
4240 ppc64_elf_section_data (opd)->sec_type = sec_opd;
4241
459609d6
AM
4242 if (abiversion (ibfd) == 0)
4243 set_abiversion (ibfd, 1);
8a2058b5 4244 else if (abiversion (ibfd) >= 2)
f6c7c3e8 4245 {
695344c0 4246 /* xgettext:c-format */
cf97bcb0
AM
4247 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"),
4248 ibfd, abiversion (ibfd));
459609d6
AM
4249 bfd_set_error (bfd_error_bad_value);
4250 return FALSE;
f6c7c3e8 4251 }
b9399fcf 4252 }
f6c7c3e8 4253
b9399fcf
AM
4254 if (is_ppc64_elf (info->output_bfd))
4255 {
4256 /* For input files without an explicit abiversion in e_flags
4257 we should have flagged any with symbol st_other bits set
4258 as ELFv1 and above flagged those with .opd as ELFv2.
4259 Set the output abiversion if not yet set, and for any input
4260 still ambiguous, take its abiversion from the output.
4261 Differences in ABI are reported later. */
4262 if (abiversion (info->output_bfd) == 0)
4263 set_abiversion (info->output_bfd, abiversion (ibfd));
4264 else if (abiversion (ibfd) == 0)
4265 set_abiversion (ibfd, abiversion (info->output_bfd));
b3fac117
AM
4266 }
4267
459609d6
AM
4268 htab = ppc_hash_table (info);
4269 if (htab == NULL)
b9399fcf 4270 return TRUE;
459609d6 4271
b9399fcf
AM
4272 if (opd != NULL && opd->size != 0
4273 && (ibfd->flags & DYNAMIC) == 0
4274 && (opd->flags & SEC_RELOC) != 0
4275 && opd->reloc_count != 0
4276 && !bfd_is_abs_section (opd->output_section)
4277 && info->gc_sections)
4278 {
4279 /* Garbage collection needs some extra help with .opd sections.
4280 We don't want to necessarily keep everything referenced by
4281 relocs in .opd, as that would keep all functions. Instead,
4282 if we reference an .opd symbol (a function descriptor), we
4283 want to keep the function code symbol's section. This is
4284 easy for global symbols, but for local syms we need to keep
4285 information about the associated function section. */
4286 bfd_size_type amt;
4287 asection **opd_sym_map;
4288 Elf_Internal_Shdr *symtab_hdr;
4289 Elf_Internal_Rela *relocs, *rel_end, *rel;
4290
4291 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
4292 opd_sym_map = bfd_zalloc (ibfd, amt);
4293 if (opd_sym_map == NULL)
4294 return FALSE;
4295 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
4296 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
4297 info->keep_memory);
4298 if (relocs == NULL)
4299 return FALSE;
4300 symtab_hdr = &elf_symtab_hdr (ibfd);
4301 rel_end = relocs + opd->reloc_count - 1;
4302 for (rel = relocs; rel < rel_end; rel++)
4303 {
4304 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
4305 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
4306
4307 if (r_type == R_PPC64_ADDR64
4308 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
4309 && r_symndx < symtab_hdr->sh_info)
4310 {
4311 Elf_Internal_Sym *isym;
4312 asection *s;
4313
4314 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
4315 if (isym == NULL)
4316 {
4317 if (elf_section_data (opd)->relocs != relocs)
4318 free (relocs);
4319 return FALSE;
4320 }
4321
4322 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
4323 if (s != NULL && s != opd)
4324 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
4325 }
4326 }
4327 if (elf_section_data (opd)->relocs != relocs)
4328 free (relocs);
4329 }
459609d6
AM
4330
4331 p = &htab->dot_syms;
4332 while ((eh = *p) != NULL)
4333 {
4334 *p = NULL;
4335 if (&eh->elf == htab->elf.hgot)
4336 ;
4337 else if (htab->elf.hgot == NULL
4338 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4339 htab->elf.hgot = &eh->elf;
8c5b4e52
AM
4340 else if (abiversion (ibfd) <= 1)
4341 {
4342 htab->need_func_desc_adj = 1;
4343 if (!add_symbol_adjust (eh, info))
4344 return FALSE;
4345 }
459609d6
AM
4346 p = &eh->u.next_dot_sym;
4347 }
b3fac117 4348 return TRUE;
8387904d
AM
4349}
4350
97fed1c9
JJ
4351/* Undo hash table changes when an --as-needed input file is determined
4352 not to be needed. */
4353
4354static bfd_boolean
e5034e59
AM
4355ppc64_elf_notice_as_needed (bfd *ibfd,
4356 struct bfd_link_info *info,
4357 enum notice_asneeded_action act)
97fed1c9 4358{
e5034e59
AM
4359 if (act == notice_not_needed)
4360 {
4361 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 4362
e5034e59
AM
4363 if (htab == NULL)
4364 return FALSE;
4dfe6ac6 4365
e5034e59
AM
4366 htab->dot_syms = NULL;
4367 }
4368 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
4369}
4370
aa374f67
AM
4371/* If --just-symbols against a final linked binary, then assume we need
4372 toc adjusting stubs when calling functions defined there. */
4373
4374static void
4375ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4376{
4377 if ((sec->flags & SEC_CODE) != 0
4378 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4379 && is_ppc64_elf (sec->owner))
4380 {
2c3f079f
AM
4381 if (abiversion (sec->owner) >= 2
4382 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
aa374f67
AM
4383 sec->has_toc_reloc = 1;
4384 }
4385 _bfd_elf_link_just_syms (sec, info);
4386}
4387
e054468f 4388static struct plt_entry **
4ce794b7
AM
4389update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4390 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
4391{
4392 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 4393 struct plt_entry **local_plt;
f961d9dd 4394 unsigned char *local_got_tls_masks;
411e1bfb
AM
4395
4396 if (local_got_ents == NULL)
4397 {
4398 bfd_size_type size = symtab_hdr->sh_info;
4399
e054468f
AM
4400 size *= (sizeof (*local_got_ents)
4401 + sizeof (*local_plt)
4402 + sizeof (*local_got_tls_masks));
4ce794b7 4403 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 4404 if (local_got_ents == NULL)
e054468f 4405 return NULL;
411e1bfb
AM
4406 elf_local_got_ents (abfd) = local_got_ents;
4407 }
4408
37da22e5 4409 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0)
411e1bfb
AM
4410 {
4411 struct got_entry *ent;
4412
4413 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
4414 if (ent->addend == r_addend
4415 && ent->owner == abfd
4416 && ent->tls_type == tls_type)
411e1bfb
AM
4417 break;
4418 if (ent == NULL)
4419 {
4420 bfd_size_type amt = sizeof (*ent);
4ce794b7 4421 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4422 if (ent == NULL)
4423 return FALSE;
4424 ent->next = local_got_ents[r_symndx];
4425 ent->addend = r_addend;
e717da7e 4426 ent->owner = abfd;
411e1bfb 4427 ent->tls_type = tls_type;
927be08e 4428 ent->is_indirect = FALSE;
411e1bfb
AM
4429 ent->got.refcount = 0;
4430 local_got_ents[r_symndx] = ent;
4431 }
4432 ent->got.refcount += 1;
4433 }
4434
e054468f 4435 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 4436 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
37da22e5 4437 local_got_tls_masks[r_symndx] |= tls_type & 0xff;
e054468f
AM
4438
4439 return local_plt + r_symndx;
65f38f15
AM
4440}
4441
411e1bfb 4442static bfd_boolean
e054468f 4443update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 4444{
411e1bfb 4445 struct plt_entry *ent;
1e2f5b6e 4446
e054468f 4447 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
4448 if (ent->addend == addend)
4449 break;
4450 if (ent == NULL)
1e2f5b6e 4451 {
411e1bfb 4452 bfd_size_type amt = sizeof (*ent);
4ce794b7 4453 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4454 if (ent == NULL)
4455 return FALSE;
e054468f 4456 ent->next = *plist;
411e1bfb
AM
4457 ent->addend = addend;
4458 ent->plt.refcount = 0;
e054468f 4459 *plist = ent;
1e2f5b6e 4460 }
411e1bfb 4461 ent->plt.refcount += 1;
b34976b6 4462 return TRUE;
1e2f5b6e
AM
4463}
4464
e054468f
AM
4465static bfd_boolean
4466is_branch_reloc (enum elf_ppc64_reloc_type r_type)
4467{
4468 return (r_type == R_PPC64_REL24
05d0e962 4469 || r_type == R_PPC64_REL24_NOTOC
e054468f
AM
4470 || r_type == R_PPC64_REL14
4471 || r_type == R_PPC64_REL14_BRTAKEN
4472 || r_type == R_PPC64_REL14_BRNTAKEN
4473 || r_type == R_PPC64_ADDR24
4474 || r_type == R_PPC64_ADDR14
4475 || r_type == R_PPC64_ADDR14_BRTAKEN
23cedd1d 4476 || r_type == R_PPC64_ADDR14_BRNTAKEN
5663e321
AM
4477 || r_type == R_PPC64_PLTCALL
4478 || r_type == R_PPC64_PLTCALL_NOTOC);
23cedd1d
AM
4479}
4480
4481/* Relocs on inline plt call sequence insns prior to the call. */
4482
4483static bfd_boolean
4484is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type)
4485{
4486 return (r_type == R_PPC64_PLT16_HA
4487 || r_type == R_PPC64_PLT16_HI
4488 || r_type == R_PPC64_PLT16_LO
4489 || r_type == R_PPC64_PLT16_LO_DS
5663e321
AM
4490 || r_type == R_PPC64_PLT_PCREL34
4491 || r_type == R_PPC64_PLT_PCREL34_NOTOC
4492 || r_type == R_PPC64_PLTSEQ
4493 || r_type == R_PPC64_PLTSEQ_NOTOC);
e054468f
AM
4494}
4495
5bd4f169 4496/* Look through the relocs for a section during the first phase, and
65f38f15 4497 calculate needed space in the global offset table, procedure
5d1634d7 4498 linkage table, and dynamic reloc sections. */
5bd4f169 4499
b34976b6 4500static bfd_boolean
4ce794b7
AM
4501ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4502 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 4503{
65f38f15 4504 struct ppc_link_hash_table *htab;
5bd4f169 4505 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 4506 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
4507 const Elf_Internal_Rela *rel;
4508 const Elf_Internal_Rela *rel_end;
5bd4f169 4509 asection *sreloc;
3a71aa26 4510 struct elf_link_hash_entry *tga, *dottga;
b9399fcf 4511 bfd_boolean is_opd;
5bd4f169 4512
0e1862bb 4513 if (bfd_link_relocatable (info))
b34976b6 4514 return TRUE;
5bd4f169 4515
680a3378
AM
4516 /* Don't do anything special with non-loaded, non-alloced sections.
4517 In particular, any relocs in such sections should not affect GOT
4518 and PLT reference counting (ie. we don't allow them to create GOT
4519 or PLT entries), there's no possibility or desire to optimize TLS
4520 relocs, and there's not much point in propagating relocs to shared
4521 libs that the dynamic linker won't relocate. */
4522 if ((sec->flags & SEC_ALLOC) == 0)
4523 return TRUE;
4524
0c8d6e5c 4525 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 4526
65f38f15 4527 htab = ppc_hash_table (info);
4dfe6ac6
NC
4528 if (htab == NULL)
4529 return FALSE;
4530
3a71aa26
AM
4531 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4532 FALSE, FALSE, TRUE);
4533 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
4534 FALSE, FALSE, TRUE);
0ffa91dd 4535 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 4536 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 4537 sreloc = NULL;
b9399fcf 4538 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5bd4f169
AM
4539 rel_end = relocs + sec->reloc_count;
4540 for (rel = relocs; rel < rel_end; rel++)
4541 {
4542 unsigned long r_symndx;
4543 struct elf_link_hash_entry *h;
04c9666a 4544 enum elf_ppc64_reloc_type r_type;
727fc41e 4545 int tls_type;
7c8fe5c4 4546 struct _ppc64_elf_section_data *ppc64_sec;
cbf95972 4547 struct plt_entry **ifunc, **plt_list;
5bd4f169
AM
4548
4549 r_symndx = ELF64_R_SYM (rel->r_info);
4550 if (r_symndx < symtab_hdr->sh_info)
4551 h = NULL;
4552 else
973a3492
L
4553 {
4554 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 4555 h = elf_follow_link (h);
1c865ab2
AM
4556
4557 if (h == htab->elf.hgot)
4558 sec->has_toc_reloc = 1;
973a3492 4559 }
5bd4f169 4560
5663e321
AM
4561 r_type = ELF64_R_TYPE (rel->r_info);
4562 switch (r_type)
4563 {
04bdff6a
AM
4564 case R_PPC64_D34:
4565 case R_PPC64_D34_LO:
4566 case R_PPC64_D34_HI30:
4567 case R_PPC64_D34_HA30:
4568 case R_PPC64_D28:
c213164a
AM
4569 case R_PPC64_TPREL34:
4570 case R_PPC64_DTPREL34:
04bdff6a 4571 case R_PPC64_PCREL34:
5663e321 4572 case R_PPC64_GOT_PCREL34:
c213164a
AM
4573 case R_PPC64_GOT_TLSGD34:
4574 case R_PPC64_GOT_TLSLD34:
4575 case R_PPC64_GOT_TPREL34:
4576 case R_PPC64_GOT_DTPREL34:
5663e321
AM
4577 case R_PPC64_PLT_PCREL34:
4578 case R_PPC64_PLT_PCREL34_NOTOC:
04bdff6a
AM
4579 case R_PPC64_PCREL28:
4580 htab->powerxx_stubs = 1;
133a1f60
AM
4581 break;
4582 default:
5663e321
AM
4583 break;
4584 }
903b777d
AM
4585
4586 switch (r_type)
4587 {
4588 case R_PPC64_PLT16_HA:
4589 case R_PPC64_GOT_TLSLD16_HA:
4590 case R_PPC64_GOT_TLSGD16_HA:
4591 case R_PPC64_GOT_TPREL16_HA:
4592 case R_PPC64_GOT_DTPREL16_HA:
4593 case R_PPC64_GOT16_HA:
4594 case R_PPC64_TOC16_HA:
4595 case R_PPC64_PLT16_LO:
4596 case R_PPC64_PLT16_LO_DS:
4597 case R_PPC64_GOT_TLSLD16_LO:
4598 case R_PPC64_GOT_TLSGD16_LO:
4599 case R_PPC64_GOT_TPREL16_LO_DS:
4600 case R_PPC64_GOT_DTPREL16_LO_DS:
4601 case R_PPC64_GOT16_LO:
4602 case R_PPC64_GOT16_LO_DS:
4603 case R_PPC64_TOC16_LO:
4604 case R_PPC64_TOC16_LO_DS:
4605 case R_PPC64_GOT_PCREL34:
4606 ppc64_elf_tdata (abfd)->has_optrel = 1;
4607 ppc64_elf_section_data (sec)->has_optrel = 1;
4608 break;
4609 default:
4610 break;
4611 }
4612
f749f26e 4613 ifunc = NULL;
25f23106
AM
4614 if (h != NULL)
4615 {
4616 if (h->type == STT_GNU_IFUNC)
4617 {
4618 h->needs_plt = 1;
4619 ifunc = &h->plt.plist;
4620 }
4621 }
4622 else
4623 {
4624 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4625 abfd, r_symndx);
4626 if (isym == NULL)
4627 return FALSE;
4628
4629 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4630 {
4631 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4632 rel->r_addend,
37da22e5 4633 NON_GOT | PLT_IFUNC);
25f23106
AM
4634 if (ifunc == NULL)
4635 return FALSE;
4636 }
4637 }
727fc41e 4638
f749f26e 4639 tls_type = 0;
a33d1f77 4640 switch (r_type)
5bd4f169 4641 {
727fc41e
AM
4642 case R_PPC64_TLSGD:
4643 case R_PPC64_TLSLD:
4644 /* These special tls relocs tie a call to __tls_get_addr with
4645 its parameter symbol. */
37da22e5
AM
4646 if (h != NULL)
4647 ((struct ppc_link_hash_entry *) h)->tls_mask |= TLS_TLS | TLS_MARK;
4648 else
4649 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4650 rel->r_addend,
37da22e5
AM
4651 NON_GOT | TLS_TLS | TLS_MARK))
4652 return FALSE;
4653 sec->has_tls_reloc = 1;
727fc41e
AM
4654 break;
4655
411e1bfb
AM
4656 case R_PPC64_GOT_TLSLD16:
4657 case R_PPC64_GOT_TLSLD16_LO:
4658 case R_PPC64_GOT_TLSLD16_HI:
4659 case R_PPC64_GOT_TLSLD16_HA:
c213164a 4660 case R_PPC64_GOT_TLSLD34:
951fd09b 4661 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
4662 goto dogottls;
4663
4664 case R_PPC64_GOT_TLSGD16:
4665 case R_PPC64_GOT_TLSGD16_LO:
4666 case R_PPC64_GOT_TLSGD16_HI:
4667 case R_PPC64_GOT_TLSGD16_HA:
c213164a 4668 case R_PPC64_GOT_TLSGD34:
951fd09b 4669 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
4670 goto dogottls;
4671
4672 case R_PPC64_GOT_TPREL16_DS:
4673 case R_PPC64_GOT_TPREL16_LO_DS:
4674 case R_PPC64_GOT_TPREL16_HI:
4675 case R_PPC64_GOT_TPREL16_HA:
c213164a 4676 case R_PPC64_GOT_TPREL34:
7c8bbca5 4677 if (bfd_link_dll (info))
411e1bfb
AM
4678 info->flags |= DF_STATIC_TLS;
4679 tls_type = TLS_TLS | TLS_TPREL;
4680 goto dogottls;
4681
4682 case R_PPC64_GOT_DTPREL16_DS:
4683 case R_PPC64_GOT_DTPREL16_LO_DS:
4684 case R_PPC64_GOT_DTPREL16_HI:
4685 case R_PPC64_GOT_DTPREL16_HA:
c213164a 4686 case R_PPC64_GOT_DTPREL34:
411e1bfb
AM
4687 tls_type = TLS_TLS | TLS_DTPREL;
4688 dogottls:
4689 sec->has_tls_reloc = 1;
066f4018 4690 goto dogot;
411e1bfb 4691
903b777d
AM
4692 case R_PPC64_GOT16:
4693 case R_PPC64_GOT16_LO:
4694 case R_PPC64_GOT16_HI:
65f38f15 4695 case R_PPC64_GOT16_HA:
903b777d 4696 case R_PPC64_GOT16_DS:
066f4018 4697 case R_PPC64_GOT16_LO_DS:
4a421c53 4698 case R_PPC64_GOT_PCREL34:
066f4018 4699 dogot:
65f38f15 4700 /* This symbol requires a global offset table entry. */
4c52953f 4701 sec->has_toc_reloc = 1;
33c0ec9d
AM
4702 if (r_type == R_PPC64_GOT_TLSLD16
4703 || r_type == R_PPC64_GOT_TLSGD16
4704 || r_type == R_PPC64_GOT_TPREL16_DS
4705 || r_type == R_PPC64_GOT_DTPREL16_DS
4706 || r_type == R_PPC64_GOT16
4707 || r_type == R_PPC64_GOT16_DS)
4708 {
4709 htab->do_multi_toc = 1;
d77c8a4b 4710 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
4711 }
4712
e717da7e
AM
4713 if (ppc64_elf_tdata (abfd)->got == NULL
4714 && !create_got_section (abfd, info))
b34976b6 4715 return FALSE;
5bd4f169
AM
4716
4717 if (h != NULL)
4718 {
411e1bfb
AM
4719 struct ppc_link_hash_entry *eh;
4720 struct got_entry *ent;
65f38f15 4721
411e1bfb
AM
4722 eh = (struct ppc_link_hash_entry *) h;
4723 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
133a1f60 4724 if (ent->addend == rel->r_addend
e717da7e 4725 && ent->owner == abfd
411e1bfb
AM
4726 && ent->tls_type == tls_type)
4727 break;
4728 if (ent == NULL)
5bd4f169 4729 {
411e1bfb 4730 bfd_size_type amt = sizeof (*ent);
4ce794b7 4731 ent = bfd_alloc (abfd, amt);
411e1bfb 4732 if (ent == NULL)
b34976b6 4733 return FALSE;
411e1bfb 4734 ent->next = eh->elf.got.glist;
133a1f60 4735 ent->addend = rel->r_addend;
e717da7e 4736 ent->owner = abfd;
411e1bfb 4737 ent->tls_type = tls_type;
927be08e 4738 ent->is_indirect = FALSE;
411e1bfb
AM
4739 ent->got.refcount = 0;
4740 eh->elf.got.glist = ent;
5bd4f169 4741 }
411e1bfb 4742 ent->got.refcount += 1;
e7b938ca 4743 eh->tls_mask |= tls_type;
5bd4f169 4744 }
411e1bfb
AM
4745 else
4746 /* This is a global offset table entry for a local symbol. */
4747 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4748 rel->r_addend, tls_type))
411e1bfb 4749 return FALSE;
a345bc8d
AM
4750
4751 /* We may also need a plt entry if the symbol turns out to be
4752 an ifunc. */
0e1862bb 4753 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
a345bc8d 4754 {
133a1f60 4755 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
a345bc8d
AM
4756 return FALSE;
4757 }
5bd4f169
AM
4758 break;
4759
5bd4f169 4760 case R_PPC64_PLT16_HA:
65f38f15
AM
4761 case R_PPC64_PLT16_HI:
4762 case R_PPC64_PLT16_LO:
08be3224 4763 case R_PPC64_PLT16_LO_DS:
5663e321
AM
4764 case R_PPC64_PLT_PCREL34:
4765 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
4766 case R_PPC64_PLT32:
4767 case R_PPC64_PLT64:
cbf95972
AM
4768 /* This symbol requires a procedure linkage table entry. */
4769 plt_list = ifunc;
4770 if (h != NULL)
e054468f 4771 {
e054468f
AM
4772 h->needs_plt = 1;
4773 if (h->root.root.string[0] == '.'
4774 && h->root.root.string[1] != '\0')
4775 ((struct ppc_link_hash_entry *) h)->is_func = 1;
2d7ad24e 4776 ((struct ppc_link_hash_entry *) h)->tls_mask |= PLT_KEEP;
cbf95972
AM
4777 plt_list = &h->plt.plist;
4778 }
4779 if (plt_list == NULL)
2d7ad24e 4780 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4781 rel->r_addend,
2d7ad24e 4782 NON_GOT | PLT_KEEP);
133a1f60 4783 if (!update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4784 return FALSE;
5bd4f169
AM
4785 break;
4786
4787 /* The following relocations don't need to propagate the
4788 relocation if linking a shared object since they are
4789 section relative. */
4790 case R_PPC64_SECTOFF:
4791 case R_PPC64_SECTOFF_LO:
4792 case R_PPC64_SECTOFF_HI:
4793 case R_PPC64_SECTOFF_HA:
4794 case R_PPC64_SECTOFF_DS:
4795 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
4796 case R_PPC64_DTPREL16:
4797 case R_PPC64_DTPREL16_LO:
4798 case R_PPC64_DTPREL16_HI:
4799 case R_PPC64_DTPREL16_HA:
4800 case R_PPC64_DTPREL16_DS:
4801 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
4802 case R_PPC64_DTPREL16_HIGH:
4803 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
4804 case R_PPC64_DTPREL16_HIGHER:
4805 case R_PPC64_DTPREL16_HIGHERA:
4806 case R_PPC64_DTPREL16_HIGHEST:
4807 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
4808 break;
4809
ad8e1ba5 4810 /* Nor do these. */
25f23106
AM
4811 case R_PPC64_REL16:
4812 case R_PPC64_REL16_LO:
4813 case R_PPC64_REL16_HI:
4814 case R_PPC64_REL16_HA:
4a969973
AM
4815 case R_PPC64_REL16_HIGH:
4816 case R_PPC64_REL16_HIGHA:
4817 case R_PPC64_REL16_HIGHER:
4818 case R_PPC64_REL16_HIGHERA:
4819 case R_PPC64_REL16_HIGHEST:
4820 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
4821 case R_PPC64_REL16_HIGHER34:
4822 case R_PPC64_REL16_HIGHERA34:
4823 case R_PPC64_REL16_HIGHEST34:
4824 case R_PPC64_REL16_HIGHESTA34:
a680de9a 4825 case R_PPC64_REL16DX_HA:
25f23106
AM
4826 break;
4827
45965137
AM
4828 /* Not supported as a dynamic relocation. */
4829 case R_PPC64_ADDR64_LOCAL:
0e1862bb 4830 if (bfd_link_pic (info))
45965137
AM
4831 {
4832 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
4833 ppc_howto_init ();
695344c0 4834 /* xgettext:c-format */
174d0a74 4835 info->callbacks->einfo (_("%H: %s reloc unsupported "
cf97bcb0 4836 "in shared libraries and PIEs\n"),
45965137
AM
4837 abfd, sec, rel->r_offset,
4838 ppc64_elf_howto_table[r_type]->name);
4839 bfd_set_error (bfd_error_bad_value);
4840 return FALSE;
4841 }
4842 break;
4843
ad8e1ba5 4844 case R_PPC64_TOC16:
33c0ec9d
AM
4845 case R_PPC64_TOC16_DS:
4846 htab->do_multi_toc = 1;
d77c8a4b 4847 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
1a0670f3 4848 /* Fall through. */
ad8e1ba5
AM
4849 case R_PPC64_TOC16_LO:
4850 case R_PPC64_TOC16_HI:
4851 case R_PPC64_TOC16_HA:
ad8e1ba5 4852 case R_PPC64_TOC16_LO_DS:
4c52953f 4853 sec->has_toc_reloc = 1;
ec73ddcd 4854 if (h != NULL && bfd_link_executable (info))
1bdd8fac
AM
4855 {
4856 /* We may need a copy reloc. */
4857 h->non_got_ref = 1;
4858 /* Strongly prefer a copy reloc over a dynamic reloc.
4859 glibc ld.so as of 2019-08 will error out if one of
4860 these relocations is emitted. */
4861 h->needs_copy = 1;
4862 goto dodyn;
4863 }
ad8e1ba5
AM
4864 break;
4865
006589cf
AM
4866 /* Marker reloc. */
4867 case R_PPC64_ENTRY:
4868 break;
4869
5bd4f169
AM
4870 /* This relocation describes the C++ object vtable hierarchy.
4871 Reconstruct it for later use during GC. */
4872 case R_PPC64_GNU_VTINHERIT:
c152c796 4873 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 4874 return FALSE;
5bd4f169
AM
4875 break;
4876
4877 /* This relocation describes which C++ vtable entries are actually
4878 used. Record for later use during GC. */
4879 case R_PPC64_GNU_VTENTRY:
a0ea3a14 4880 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 4881 return FALSE;
5bd4f169
AM
4882 break;
4883
721956f4
AM
4884 case R_PPC64_REL14:
4885 case R_PPC64_REL14_BRTAKEN:
4886 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
4887 {
4888 asection *dest = NULL;
4889
4890 /* Heuristic: If jumping outside our section, chances are
4891 we are going to need a stub. */
4892 if (h != NULL)
4893 {
4894 /* If the sym is weak it may be overridden later, so
4895 don't assume we know where a weak sym lives. */
4896 if (h->root.type == bfd_link_hash_defined)
4897 dest = h->root.u.def.section;
4898 }
4899 else
87d72d41
AM
4900 {
4901 Elf_Internal_Sym *isym;
4902
4903 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4904 abfd, r_symndx);
4905 if (isym == NULL)
4906 return FALSE;
4907
4908 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
4909 }
4910
220c76dd 4911 if (dest != sec)
7c8fe5c4 4912 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 4913 }
3e04d765
AM
4914 goto rel24;
4915
4916 case R_PPC64_PLTCALL:
5663e321 4917 case R_PPC64_PLTCALL_NOTOC:
3e04d765 4918 ppc64_elf_section_data (sec)->has_pltcall = 1;
721956f4
AM
4919 /* Fall through. */
4920
5d1634d7 4921 case R_PPC64_REL24:
05d0e962 4922 case R_PPC64_REL24_NOTOC:
3e04d765 4923 rel24:
cbf95972
AM
4924 plt_list = ifunc;
4925 if (h != NULL)
5d1634d7 4926 {
e054468f
AM
4927 h->needs_plt = 1;
4928 if (h->root.root.string[0] == '.'
4929 && h->root.root.string[1] != '\0')
4930 ((struct ppc_link_hash_entry *) h)->is_func = 1;
cbf95972 4931
3a71aa26 4932 if (h == tga || h == dottga)
cbf95972
AM
4933 {
4934 sec->has_tls_reloc = 1;
4935 if (rel != relocs
4936 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
4937 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
4938 /* We have a new-style __tls_get_addr call with
4939 a marker reloc. */
4940 ;
4941 else
4942 /* Mark this section as having an old-style call. */
9737e8af 4943 sec->nomark_tls_get_addr = 1;
cbf95972
AM
4944 }
4945 plt_list = &h->plt.plist;
411e1bfb 4946 }
cbf95972
AM
4947
4948 /* We may need a .plt entry if the function this reloc
4949 refers to is in a shared lib. */
4950 if (plt_list
133a1f60 4951 && !update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4952 return FALSE;
411e1bfb
AM
4953 break;
4954
cbf95972
AM
4955 case R_PPC64_ADDR14:
4956 case R_PPC64_ADDR14_BRNTAKEN:
4957 case R_PPC64_ADDR14_BRTAKEN:
4958 case R_PPC64_ADDR24:
4959 goto dodyn;
4960
411e1bfb
AM
4961 case R_PPC64_TPREL64:
4962 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
7c8bbca5 4963 if (bfd_link_dll (info))
411e1bfb
AM
4964 info->flags |= DF_STATIC_TLS;
4965 goto dotlstoc;
4966
4967 case R_PPC64_DTPMOD64:
4968 if (rel + 1 < rel_end
4969 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4970 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 4971 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 4972 else
951fd09b 4973 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
4974 goto dotlstoc;
4975
4976 case R_PPC64_DTPREL64:
4977 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4978 if (rel != relocs
4979 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4980 && rel[-1].r_offset == rel->r_offset - 8)
4981 /* This is the second reloc of a dtpmod, dtprel pair.
4982 Don't mark with TLS_DTPREL. */
4983 goto dodyn;
4984
4985 dotlstoc:
4986 sec->has_tls_reloc = 1;
4987 if (h != NULL)
4988 {
4989 struct ppc_link_hash_entry *eh;
4990 eh = (struct ppc_link_hash_entry *) h;
46e9995a 4991 eh->tls_mask |= tls_type & 0xff;
411e1bfb
AM
4992 }
4993 else
4994 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4995 rel->r_addend, tls_type))
411e1bfb
AM
4996 return FALSE;
4997
7c8fe5c4
AM
4998 ppc64_sec = ppc64_elf_section_data (sec);
4999 if (ppc64_sec->sec_type != sec_toc)
411e1bfb 5000 {
3a71aa26
AM
5001 bfd_size_type amt;
5002
e7b938ca 5003 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5004 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5005 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5006 if (ppc64_sec->u.toc.symndx == NULL)
5007 return FALSE;
5008 amt = sec->size * sizeof (bfd_vma) / 8;
5009 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5010 if (ppc64_sec->u.toc.add == NULL)
411e1bfb 5011 return FALSE;
7c8fe5c4
AM
5012 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5013 ppc64_sec->sec_type = sec_toc;
411e1bfb
AM
5014 }
5015 BFD_ASSERT (rel->r_offset % 8 == 0);
3a71aa26 5016 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
133a1f60 5017 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5018
5019 /* Mark the second slot of a GD or LD entry.
5020 -1 to indicate GD and -2 to indicate LD. */
5021 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5022 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5023 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5024 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5025 goto dodyn;
5026
411e1bfb
AM
5027 case R_PPC64_TPREL16_HI:
5028 case R_PPC64_TPREL16_HA:
f9c6b907
AM
5029 case R_PPC64_TPREL16_HIGH:
5030 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5031 case R_PPC64_TPREL16_HIGHER:
5032 case R_PPC64_TPREL16_HIGHERA:
5033 case R_PPC64_TPREL16_HIGHEST:
5034 case R_PPC64_TPREL16_HIGHESTA:
93b9bf16
AM
5035 sec->has_tls_reloc = 1;
5036 /* Fall through. */
c213164a 5037 case R_PPC64_TPREL34:
93b9bf16
AM
5038 case R_PPC64_TPREL16:
5039 case R_PPC64_TPREL16_DS:
5040 case R_PPC64_TPREL16_LO:
5041 case R_PPC64_TPREL16_LO_DS:
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)
8c5b4e52 5052 ((struct ppc_link_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
ec338859 5156 head = &((struct ppc_link_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
8b5f1ed8 5537 && !((struct ppc_link_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
8c5b4e52
AM
5586static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
5587
5588/* Garbage collect sections, after first dealing with dot-symbols. */
5589
5590static bfd_boolean
5591ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
5592{
5593 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5594
5595 if (htab != NULL && htab->need_func_desc_adj)
5596 {
5597 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5598 htab->need_func_desc_adj = 0;
5599 }
5600 return bfd_elf_gc_sections (abfd, info);
5601}
5602
74f0fb50
AM
5603/* Mark all our entry sym sections, both opd and code section. */
5604
5605static void
5606ppc64_elf_gc_keep (struct bfd_link_info *info)
5607{
5608 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5609 struct bfd_sym_chain *sym;
5610
4dfe6ac6
NC
5611 if (htab == NULL)
5612 return;
5613
74f0fb50
AM
5614 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5615 {
b31867b6 5616 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
5617 asection *sec;
5618
5619 eh = (struct ppc_link_hash_entry *)
b31867b6 5620 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
74f0fb50
AM
5621 if (eh == NULL)
5622 continue;
5623 if (eh->elf.root.type != bfd_link_hash_defined
5624 && eh->elf.root.type != bfd_link_hash_defweak)
5625 continue;
5626
b31867b6
AM
5627 fh = defined_code_entry (eh);
5628 if (fh != NULL)
74f0fb50 5629 {
b31867b6 5630 sec = fh->elf.root.u.def.section;
74f0fb50
AM
5631 sec->flags |= SEC_KEEP;
5632 }
5633 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5634 && opd_entry_value (eh->elf.root.u.def.section,
5635 eh->elf.root.u.def.value,
aef36ac1 5636 &sec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50
AM
5637 sec->flags |= SEC_KEEP;
5638
5639 sec = eh->elf.root.u.def.section;
5640 sec->flags |= SEC_KEEP;
5641 }
5642}
5643
64d03ab5
AM
5644/* Mark sections containing dynamically referenced symbols. When
5645 building shared libraries, we must assume that any visible symbol is
5646 referenced. */
5647
5648static bfd_boolean
5649ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5650{
5651 struct bfd_link_info *info = (struct bfd_link_info *) inf;
5652 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
b31867b6 5653 struct ppc_link_hash_entry *fdh;
b407645f 5654 struct bfd_elf_dynamic_list *d = info->dynamic_list;
64d03ab5 5655
64d03ab5 5656 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
5657 fdh = defined_func_desc (eh);
5658 if (fdh != NULL)
5659 eh = fdh;
64d03ab5
AM
5660
5661 if ((eh->elf.root.type == bfd_link_hash_defined
5662 || eh->elf.root.type == bfd_link_hash_defweak)
87e79a65 5663 && ((eh->elf.ref_dynamic && !eh->elf.forced_local)
1c9177d9 5664 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
64d03ab5 5665 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8 5666 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
0e1862bb 5667 && (!bfd_link_executable (info)
e278ae05 5668 || info->gc_keep_exported
b407645f
AM
5669 || info->export_dynamic
5670 || (eh->elf.dynamic
5671 && d != NULL
2cdcc330
AM
5672 && (*d->match) (&d->head, NULL,
5673 eh->elf.root.root.string)))
e278ae05 5674 && (eh->elf.versioned >= versioned
4c58e0d8
AM
5675 || !bfd_hide_sym_by_version (info->version_info,
5676 eh->elf.root.root.string)))))
64d03ab5
AM
5677 {
5678 asection *code_sec;
b31867b6 5679 struct ppc_link_hash_entry *fh;
64d03ab5
AM
5680
5681 eh->elf.root.u.def.section->flags |= SEC_KEEP;
5682
5683 /* Function descriptor syms cause the associated
5684 function code sym section to be marked. */
b31867b6
AM
5685 fh = defined_code_entry (eh);
5686 if (fh != NULL)
5687 {
5688 code_sec = fh->elf.root.u.def.section;
5689 code_sec->flags |= SEC_KEEP;
5690 }
64d03ab5
AM
5691 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5692 && opd_entry_value (eh->elf.root.u.def.section,
5693 eh->elf.root.u.def.value,
aef36ac1 5694 &code_sec, NULL, FALSE) != (bfd_vma) -1)
64d03ab5
AM
5695 code_sec->flags |= SEC_KEEP;
5696 }
5697
5698 return TRUE;
5699}
5700
5bd4f169
AM
5701/* Return the section that should be marked against GC for a given
5702 relocation. */
5703
5704static asection *
4ce794b7 5705ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 5706 struct bfd_link_info *info,
4ce794b7
AM
5707 Elf_Internal_Rela *rel,
5708 struct elf_link_hash_entry *h,
5709 Elf_Internal_Sym *sym)
5bd4f169 5710{
ccfa59ea
AM
5711 asection *rsec;
5712
ccfa59ea
AM
5713 /* Syms return NULL if we're marking .opd, so we avoid marking all
5714 function sections, as all functions are referenced in .opd. */
5715 rsec = NULL;
5716 if (get_opd_info (sec) != NULL)
5717 return rsec;
1e2f5b6e 5718
5bd4f169
AM
5719 if (h != NULL)
5720 {
04c9666a 5721 enum elf_ppc64_reloc_type r_type;
b31867b6 5722 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 5723
4ce794b7 5724 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 5725 switch (r_type)
5bd4f169
AM
5726 {
5727 case R_PPC64_GNU_VTINHERIT:
5728 case R_PPC64_GNU_VTENTRY:
5729 break;
5730
5731 default:
5732 switch (h->root.type)
5733 {
5734 case bfd_link_hash_defined:
5735 case bfd_link_hash_defweak:
ccfa59ea 5736 eh = (struct ppc_link_hash_entry *) h;
b31867b6
AM
5737 fdh = defined_func_desc (eh);
5738 if (fdh != NULL)
8c5b4e52
AM
5739 {
5740 /* -mcall-aixdesc code references the dot-symbol on
5741 a call reloc. Mark the function descriptor too
5742 against garbage collection. */
5743 fdh->elf.mark = 1;
60d67dc8
AM
5744 if (fdh->elf.is_weakalias)
5745 weakdef (&fdh->elf)->mark = 1;
8c5b4e52
AM
5746 eh = fdh;
5747 }
1e2f5b6e
AM
5748
5749 /* Function descriptor syms cause the associated
5750 function code sym section to be marked. */
b31867b6
AM
5751 fh = defined_code_entry (eh);
5752 if (fh != NULL)
ccfa59ea
AM
5753 {
5754 /* They also mark their opd section. */
74f0fb50 5755 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5756
b31867b6 5757 rsec = fh->elf.root.u.def.section;
ccfa59ea 5758 }
8387904d
AM
5759 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5760 && opd_entry_value (eh->elf.root.u.def.section,
5761 eh->elf.root.u.def.value,
aef36ac1 5762 &rsec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50 5763 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5764 else
1e2f5b6e
AM
5765 rsec = h->root.u.def.section;
5766 break;
5bd4f169
AM
5767
5768 case bfd_link_hash_common:
1e2f5b6e
AM
5769 rsec = h->root.u.c.p->section;
5770 break;
5bd4f169
AM
5771
5772 default:
fb34365b 5773 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
5774 }
5775 }
5776 }
5777 else
5778 {
74f0fb50 5779 struct _opd_sec_data *opd;
1e2f5b6e
AM
5780
5781 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
5782 opd = get_opd_info (rsec);
5783 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 5784 {
74f0fb50 5785 rsec->gc_mark = 1;
ccfa59ea 5786
51aecdc5 5787 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
ccfa59ea 5788 }
5bd4f169
AM
5789 }
5790
1e2f5b6e 5791 return rsec;
5bd4f169
AM
5792}
5793
deb0e272
AM
5794/* The maximum size of .sfpr. */
5795#define SFPR_MAX (218*4)
5796
5797struct sfpr_def_parms
5798{
699733f6
AM
5799 const char name[12];
5800 unsigned char lo, hi;
2cdcc330
AM
5801 bfd_byte *(*write_ent) (bfd *, bfd_byte *, int);
5802 bfd_byte *(*write_tail) (bfd *, bfd_byte *, int);
deb0e272
AM
5803};
5804
a4b6fadd
AM
5805/* Auto-generate _save*, _rest* functions in .sfpr.
5806 If STUB_SEC is non-null, define alias symbols in STUB_SEC
5807 instead. */
deb0e272 5808
4dfe6ac6 5809static bfd_boolean
a4b6fadd
AM
5810sfpr_define (struct bfd_link_info *info,
5811 const struct sfpr_def_parms *parm,
5812 asection *stub_sec)
deb0e272
AM
5813{
5814 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5815 unsigned int i;
5816 size_t len = strlen (parm->name);
5817 bfd_boolean writing = FALSE;
699733f6 5818 char sym[16];
deb0e272 5819
4dfe6ac6
NC
5820 if (htab == NULL)
5821 return FALSE;
5822
deb0e272
AM
5823 memcpy (sym, parm->name, len);
5824 sym[len + 2] = 0;
5825
5826 for (i = parm->lo; i <= parm->hi; i++)
5827 {
a4b6fadd 5828 struct ppc_link_hash_entry *h;
deb0e272
AM
5829
5830 sym[len + 0] = i / 10 + '0';
5831 sym[len + 1] = i % 10 + '0';
a4b6fadd 5832 h = (struct ppc_link_hash_entry *)
b32547cd 5833 elf_link_hash_lookup (&htab->elf, sym, writing, TRUE, TRUE);
a4b6fadd 5834 if (stub_sec != NULL)
deb0e272 5835 {
a4b6fadd
AM
5836 if (h != NULL
5837 && h->elf.root.type == bfd_link_hash_defined
5838 && h->elf.root.u.def.section == htab->sfpr)
5839 {
5840 struct elf_link_hash_entry *s;
5841 char buf[32];
5842 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
5843 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
5844 if (s == NULL)
5845 return FALSE;
779f2ae7 5846 if (s->root.type == bfd_link_hash_new)
a4b6fadd
AM
5847 {
5848 s->root.type = bfd_link_hash_defined;
5849 s->root.u.def.section = stub_sec;
7dda8d3c 5850 s->root.u.def.value = (stub_sec->size - htab->sfpr->size
a4b6fadd
AM
5851 + h->elf.root.u.def.value);
5852 s->ref_regular = 1;
5853 s->def_regular = 1;
5854 s->ref_regular_nonweak = 1;
5855 s->forced_local = 1;
5856 s->non_elf = 0;
5857 s->root.linker_def = 1;
5858 }
5859 }
5860 continue;
5861 }
5862 if (h != NULL)
5863 {
5864 h->save_res = 1;
5865 if (!h->elf.def_regular)
deb0e272 5866 {
a4b6fadd
AM
5867 h->elf.root.type = bfd_link_hash_defined;
5868 h->elf.root.u.def.section = htab->sfpr;
5869 h->elf.root.u.def.value = htab->sfpr->size;
5870 h->elf.type = STT_FUNC;
5871 h->elf.def_regular = 1;
b32547cd 5872 h->elf.non_elf = 0;
a4b6fadd
AM
5873 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
5874 writing = TRUE;
deb0e272 5875 if (htab->sfpr->contents == NULL)
a4b6fadd 5876 {
2cdcc330
AM
5877 htab->sfpr->contents
5878 = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
a4b6fadd
AM
5879 if (htab->sfpr->contents == NULL)
5880 return FALSE;
5881 }
deb0e272
AM
5882 }
5883 }
5884 if (writing)
5885 {
5886 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5887 if (i != parm->hi)
5888 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5889 else
5890 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5891 htab->sfpr->size = p - htab->sfpr->contents;
5892 }
5893 }
5894
5895 return TRUE;
5896}
5897
5898static bfd_byte *
5899savegpr0 (bfd *abfd, bfd_byte *p, int r)
5900{
5901 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5902 return p + 4;
5903}
5904
5905static bfd_byte *
5906savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5907{
5908 p = savegpr0 (abfd, p, r);
a078d95a 5909 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
5910 p = p + 4;
5911 bfd_put_32 (abfd, BLR, p);
5912 return p + 4;
5913}
5914
5915static bfd_byte *
5916restgpr0 (bfd *abfd, bfd_byte *p, int r)
5917{
5918 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5919 return p + 4;
5920}
5921
5922static bfd_byte *
5923restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5924{
a078d95a 5925 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
5926 p = p + 4;
5927 p = restgpr0 (abfd, p, r);
5928 bfd_put_32 (abfd, MTLR_R0, p);
5929 p = p + 4;
5930 if (r == 29)
5931 {
5932 p = restgpr0 (abfd, p, 30);
5933 p = restgpr0 (abfd, p, 31);
5934 }
5935 bfd_put_32 (abfd, BLR, p);
5936 return p + 4;
5937}
5938
5939static bfd_byte *
5940savegpr1 (bfd *abfd, bfd_byte *p, int r)
5941{
5942 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5943 return p + 4;
5944}
5945
5946static bfd_byte *
5947savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5948{
5949 p = savegpr1 (abfd, p, r);
5950 bfd_put_32 (abfd, BLR, p);
5951 return p + 4;
5952}
5953
5954static bfd_byte *
5955restgpr1 (bfd *abfd, bfd_byte *p, int r)
5956{
5957 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5958 return p + 4;
5959}
5960
5961static bfd_byte *
5962restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5963{
5964 p = restgpr1 (abfd, p, r);
5965 bfd_put_32 (abfd, BLR, p);
5966 return p + 4;
5967}
5968
5969static bfd_byte *
5970savefpr (bfd *abfd, bfd_byte *p, int r)
5971{
5972 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5973 return p + 4;
5974}
5975
5976static bfd_byte *
5977savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
5978{
5979 p = savefpr (abfd, p, r);
a078d95a 5980 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
5981 p = p + 4;
5982 bfd_put_32 (abfd, BLR, p);
5983 return p + 4;
5984}
5985
5986static bfd_byte *
5987restfpr (bfd *abfd, bfd_byte *p, int r)
5988{
5989 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5990 return p + 4;
5991}
5992
5993static bfd_byte *
5994restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
5995{
a078d95a 5996 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
5997 p = p + 4;
5998 p = restfpr (abfd, p, r);
5999 bfd_put_32 (abfd, MTLR_R0, p);
6000 p = p + 4;
6001 if (r == 29)
6002 {
6003 p = restfpr (abfd, p, 30);
6004 p = restfpr (abfd, p, 31);
6005 }
6006 bfd_put_32 (abfd, BLR, p);
6007 return p + 4;
6008}
6009
6010static bfd_byte *
6011savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6012{
6013 p = savefpr (abfd, p, r);
6014 bfd_put_32 (abfd, BLR, p);
6015 return p + 4;
6016}
6017
6018static bfd_byte *
6019restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6020{
6021 p = restfpr (abfd, p, r);
6022 bfd_put_32 (abfd, BLR, p);
6023 return p + 4;
6024}
6025
6026static bfd_byte *
6027savevr (bfd *abfd, bfd_byte *p, int r)
6028{
6029 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6030 p = p + 4;
6031 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6032 return p + 4;
6033}
6034
6035static bfd_byte *
6036savevr_tail (bfd *abfd, bfd_byte *p, int r)
6037{
6038 p = savevr (abfd, p, r);
6039 bfd_put_32 (abfd, BLR, p);
6040 return p + 4;
6041}
6042
6043static bfd_byte *
6044restvr (bfd *abfd, bfd_byte *p, int r)
6045{
6046 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6047 p = p + 4;
6048 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6049 return p + 4;
6050}
6051
6052static bfd_byte *
6053restvr_tail (bfd *abfd, bfd_byte *p, int r)
6054{
6055 p = restvr (abfd, p, r);
6056 bfd_put_32 (abfd, BLR, p);
6057 return p + 4;
6058}
6059
e86ce104
AM
6060/* Called via elf_link_hash_traverse to transfer dynamic linking
6061 information on function code symbol entries to their corresponding
6062 function descriptor symbol entries. */
deb0e272 6063
b34976b6 6064static bfd_boolean
4ce794b7 6065func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6066{
e86ce104 6067 struct bfd_link_info *info;
65f38f15 6068 struct ppc_link_hash_table *htab;
50bc7936
AM
6069 struct ppc_link_hash_entry *fh;
6070 struct ppc_link_hash_entry *fdh;
6071 bfd_boolean force_local;
5bd4f169 6072
50bc7936
AM
6073 fh = (struct ppc_link_hash_entry *) h;
6074 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 6075 return TRUE;
e86ce104 6076
8c5b4e52
AM
6077 if (!fh->is_func)
6078 return TRUE;
6079
6080 if (fh->elf.root.root.string[0] != '.'
6081 || fh->elf.root.root.string[1] == '\0')
6082 return TRUE;
6083
4ce794b7 6084 info = inf;
65f38f15 6085 htab = ppc_hash_table (info);
4dfe6ac6
NC
6086 if (htab == NULL)
6087 return FALSE;
5bd4f169 6088
8c5b4e52
AM
6089 /* Find the corresponding function descriptor symbol. */
6090 fdh = lookup_fdh (fh, htab);
6091
c09bdfe5
AM
6092 /* Resolve undefined references to dot-symbols as the value
6093 in the function descriptor, if we have one in a regular object.
6094 This is to satisfy cases like ".quad .foo". Calls to functions
6095 in dynamic objects are handled elsewhere. */
8c5b4e52
AM
6096 if ((fh->elf.root.type == bfd_link_hash_undefined
6097 || fh->elf.root.type == bfd_link_hash_undefweak)
6098 && (fdh->elf.root.type == bfd_link_hash_defined
6099 || fdh->elf.root.type == bfd_link_hash_defweak)
b31867b6
AM
6100 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6101 && opd_entry_value (fdh->elf.root.u.def.section,
6102 fdh->elf.root.u.def.value,
c09bdfe5 6103 &fh->elf.root.u.def.section,
aef36ac1 6104 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
c09bdfe5 6105 {
b31867b6 6106 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 6107 fh->elf.forced_local = 1;
b31867b6
AM
6108 fh->elf.def_regular = fdh->elf.def_regular;
6109 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
6110 }
6111
8c5b4e52
AM
6112 if (!fh->elf.dynamic)
6113 {
6114 struct plt_entry *ent;
5bd4f169 6115
8c5b4e52
AM
6116 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6117 if (ent->plt.refcount > 0)
6118 break;
6119 if (ent == NULL)
6120 return TRUE;
6121 }
5bd4f169 6122
8c5b4e52 6123 /* Create a descriptor as undefined if necessary. */
50bc7936 6124 if (fdh == NULL
0e1862bb 6125 && !bfd_link_executable (info)
50bc7936
AM
6126 && (fh->elf.root.type == bfd_link_hash_undefined
6127 || fh->elf.root.type == bfd_link_hash_undefweak))
6128 {
908b32fc 6129 fdh = make_fdh (info, fh);
bb700d78
AM
6130 if (fdh == NULL)
6131 return FALSE;
50bc7936 6132 }
648cca2c 6133
8c5b4e52 6134 /* We can't support overriding of symbols on a fake descriptor. */
908b32fc
AM
6135 if (fdh != NULL
6136 && fdh->fake
8c5b4e52
AM
6137 && (fh->elf.root.type == bfd_link_hash_defined
6138 || fh->elf.root.type == bfd_link_hash_defweak))
6139 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
908b32fc 6140
8c5b4e52
AM
6141 /* Transfer dynamic linking information to the function descriptor. */
6142 if (fdh != NULL)
6143 {
f5385ebf
AM
6144 fdh->elf.ref_regular |= fh->elf.ref_regular;
6145 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6146 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6147 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
8c5b4e52
AM
6148 fdh->elf.dynamic |= fh->elf.dynamic;
6149 fdh->elf.needs_plt |= (fh->elf.needs_plt
6150 || fh->elf.type == STT_FUNC
6151 || fh->elf.type == STT_GNU_IFUNC);
6152 move_plt_plist (fh, fdh);
6153
6154 if (!fdh->elf.forced_local
6155 && fh->elf.dynindx != -1)
6156 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6157 return FALSE;
e86ce104
AM
6158 }
6159
50bc7936
AM
6160 /* Now that the info is on the function descriptor, clear the
6161 function code sym info. Any function code syms for which we
6162 don't have a definition in a regular file, we force local.
6163 This prevents a shared library from exporting syms that have
6164 been imported from another library. Function code syms that
6165 are really in the library we must leave global to prevent the
6166 linker dragging in a definition from a static library. */
93f3fa99
AM
6167 force_local = (!fh->elf.def_regular
6168 || fdh == NULL
6169 || !fdh->elf.def_regular
6170 || fdh->elf.forced_local);
50bc7936
AM
6171 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6172
b34976b6 6173 return TRUE;
e86ce104 6174}
40b8271b 6175
a4b6fadd
AM
6176static const struct sfpr_def_parms save_res_funcs[] =
6177 {
6178 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6179 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6180 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6181 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6182 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6183 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6184 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6185 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6186 { "._savef", 14, 31, savefpr, savefpr1_tail },
6187 { "._restf", 14, 31, restfpr, restfpr1_tail },
6188 { "_savevr_", 20, 31, savevr, savevr_tail },
6189 { "_restvr_", 20, 31, restvr, restvr_tail }
6190 };
6191
e86ce104 6192/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
6193 this hook to a) provide some gcc support functions, and b) transfer
6194 dynamic linking information gathered so far on function code symbol
6195 entries, to their corresponding function descriptor symbol entries. */
deb0e272 6196
b34976b6 6197static bfd_boolean
4ce794b7
AM
6198ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6199 struct bfd_link_info *info)
e86ce104
AM
6200{
6201 struct ppc_link_hash_table *htab;
6202
6203 htab = ppc_hash_table (info);
4dfe6ac6
NC
6204 if (htab == NULL)
6205 return FALSE;
6206
b32547cd
AM
6207 /* Provide any missing _save* and _rest* functions. */
6208 if (htab->sfpr != NULL)
6209 {
6210 unsigned int i;
6211
6212 htab->sfpr->size = 0;
6213 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
6214 if (!sfpr_define (info, &save_res_funcs[i], NULL))
6215 return FALSE;
6216 if (htab->sfpr->size == 0)
6217 htab->sfpr->flags |= SEC_EXCLUDE;
6218 }
6219
6220 if (bfd_link_relocatable (info))
6221 return TRUE;
6222
6223 if (htab->elf.hgot != NULL)
dba6fa9b
AM
6224 {
6225 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
6226 /* Make .TOC. defined so as to prevent it being made dynamic.
6227 The wrong value here is fixed later in ppc64_elf_set_toc. */
43417696
AM
6228 if (!htab->elf.hgot->def_regular
6229 || htab->elf.hgot->root.type != bfd_link_hash_defined)
6230 {
6231 htab->elf.hgot->root.type = bfd_link_hash_defined;
6232 htab->elf.hgot->root.u.def.value = 0;
6233 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
6234 htab->elf.hgot->def_regular = 1;
6235 htab->elf.hgot->root.linker_def = 1;
6236 }
dba6fa9b 6237 htab->elf.hgot->type = STT_OBJECT;
2cdcc330
AM
6238 htab->elf.hgot->other
6239 = (htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
dba6fa9b 6240 }
c66bb0ee 6241
8c5b4e52
AM
6242 if (htab->need_func_desc_adj)
6243 {
6244 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6245 htab->need_func_desc_adj = 0;
6246 }
805fc799 6247
b34976b6 6248 return TRUE;
e86ce104
AM
6249}
6250
98bbb1b8 6251/* Find dynamic relocs for H that apply to read-only sections. */
a345bc8d 6252
98bbb1b8 6253static asection *
a345bc8d
AM
6254readonly_dynrelocs (struct elf_link_hash_entry *h)
6255{
6256 struct ppc_link_hash_entry *eh;
6257 struct elf_dyn_relocs *p;
6258
6259 eh = (struct ppc_link_hash_entry *) h;
6260 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6261 {
6262 asection *s = p->sec->output_section;
6263
6264 if (s != NULL && (s->flags & SEC_READONLY) != 0)
98bbb1b8 6265 return p->sec;
a345bc8d 6266 }
98bbb1b8 6267 return NULL;
a345bc8d
AM
6268}
6269
d311bc8b 6270/* Return true if we have dynamic relocs against H or any of its weak
ab2477e1
AM
6271 aliases, that apply to read-only sections. Cannot be used after
6272 size_dynamic_sections. */
d311bc8b
AM
6273
6274static bfd_boolean
6275alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
6276{
6277 struct ppc_link_hash_entry *eh;
6278
6279 eh = (struct ppc_link_hash_entry *) h;
6280 do
6281 {
6282 if (readonly_dynrelocs (&eh->elf))
6283 return TRUE;
ab2477e1 6284 eh = (struct ppc_link_hash_entry *) eh->elf.u.alias;
2cdcc330
AM
6285 }
6286 while (eh != NULL && &eh->elf != h);
d311bc8b
AM
6287
6288 return FALSE;
6289}
8a2058b5 6290
8a9e8e72
AM
6291/* Return whether EH has pc-relative dynamic relocs. */
6292
6293static bfd_boolean
6294pc_dynrelocs (struct ppc_link_hash_entry *eh)
6295{
6296 struct elf_dyn_relocs *p;
6297
6298 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6299 if (p->pc_count != 0)
6300 return TRUE;
6301 return FALSE;
6302}
6303
8a2058b5
AM
6304/* Return true if a global entry stub will be created for H. Valid
6305 for ELFv2 before plt entries have been allocated. */
6306
6307static bfd_boolean
6308global_entry_stub (struct elf_link_hash_entry *h)
6309{
6310 struct plt_entry *pent;
6311
6312 if (!h->pointer_equality_needed
6313 || h->def_regular)
6314 return FALSE;
6315
6316 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
6317 if (pent->plt.refcount > 0
6318 && pent->addend == 0)
6319 return TRUE;
6320
6321 return FALSE;
6322}
6323
e86ce104
AM
6324/* Adjust a symbol defined by a dynamic object and referenced by a
6325 regular object. The current definition is in some section of the
6326 dynamic object, but we're not including those sections. We have to
6327 change the definition to something the rest of the link can
6328 understand. */
6329
b34976b6 6330static bfd_boolean
4ce794b7
AM
6331ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6332 struct elf_link_hash_entry *h)
e86ce104
AM
6333{
6334 struct ppc_link_hash_table *htab;
5474d94f 6335 asection *s, *srel;
e86ce104
AM
6336
6337 htab = ppc_hash_table (info);
4dfe6ac6
NC
6338 if (htab == NULL)
6339 return FALSE;
e86ce104
AM
6340
6341 /* Deal with function syms. */
6342 if (h->type == STT_FUNC
e054468f 6343 || h->type == STT_GNU_IFUNC
f5385ebf 6344 || h->needs_plt)
e86ce104 6345 {
529fe20e
AM
6346 bfd_boolean local = (((struct ppc_link_hash_entry *) h)->save_res
6347 || SYMBOL_CALLS_LOCAL (info, h)
6348 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
6349 /* Discard dyn_relocs when non-pic if we've decided that a
6350 function symbol is local and not an ifunc. We keep dynamic
6351 relocs for ifuncs when local rather than always emitting a
6352 plt call stub for them and defining the symbol on the call
6353 stub. We can't do that for ELFv1 anyway (a function symbol
6354 is defined on a descriptor, not code) and it can be faster at
6355 run-time due to not needing to bounce through a stub. The
6356 dyn_relocs for ifuncs will be applied even in a static
6357 executable. */
6358 if (!bfd_link_pic (info)
6359 && h->type != STT_GNU_IFUNC
6360 && local)
6361 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
6362
e86ce104
AM
6363 /* Clear procedure linkage table information for any symbol that
6364 won't need a .plt entry. */
411e1bfb
AM
6365 struct plt_entry *ent;
6366 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6367 if (ent->plt.refcount > 0)
6368 break;
8387904d 6369 if (ent == NULL
2d7ad24e
AM
6370 || (h->type != STT_GNU_IFUNC
6371 && local
3e04d765
AM
6372 && (htab->can_convert_all_inline_plt
6373 || (((struct ppc_link_hash_entry *) h)->tls_mask
6374 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
40b8271b 6375 {
411e1bfb 6376 h->plt.plist = NULL;
f5385ebf 6377 h->needs_plt = 0;
d1eca1e4 6378 h->pointer_equality_needed = 0;
40b8271b 6379 }
8a2058b5 6380 else if (abiversion (info->output_bfd) >= 2)
a345bc8d 6381 {
d1eca1e4
AM
6382 /* Taking a function's address in a read/write section
6383 doesn't require us to define the function symbol in the
6384 executable on a global entry stub. A dynamic reloc can
8a2058b5
AM
6385 be used instead. The reason we prefer a few more dynamic
6386 relocs is that calling via a global entry stub costs a
6387 few more instructions, and pointer_equality_needed causes
6388 extra work in ld.so when resolving these symbols. */
529fe20e 6389 if (global_entry_stub (h))
d1eca1e4 6390 {
ab2477e1 6391 if (!readonly_dynrelocs (h))
529fe20e
AM
6392 {
6393 h->pointer_equality_needed = 0;
04383fd1
AM
6394 /* If we haven't seen a branch reloc and the symbol
6395 isn't an ifunc then we don't need a plt entry. */
529fe20e
AM
6396 if (!h->needs_plt)
6397 h->plt.plist = NULL;
6398 }
6399 else if (!bfd_link_pic (info))
6400 /* We are going to be defining the function symbol on the
6401 plt stub, so no dyn_relocs needed when non-pic. */
6402 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
d1eca1e4
AM
6403 }
6404
3988aed5
AM
6405 /* ELFv2 function symbols can't have copy relocs. */
6406 return TRUE;
6407 }
6408 else if (!h->needs_plt
ab2477e1 6409 && !readonly_dynrelocs (h))
3988aed5 6410 {
04383fd1
AM
6411 /* If we haven't seen a branch reloc and the symbol isn't an
6412 ifunc then we don't need a plt entry. */
3988aed5
AM
6413 h->plt.plist = NULL;
6414 h->pointer_equality_needed = 0;
a345bc8d
AM
6415 return TRUE;
6416 }
5bd4f169 6417 }
bbd7ec4a 6418 else
411e1bfb 6419 h->plt.plist = NULL;
5bd4f169
AM
6420
6421 /* If this is a weak symbol, and there is a real definition, the
6422 processor independent code will have arranged for us to see the
6423 real definition first, and we can just use the same value. */
60d67dc8 6424 if (h->is_weakalias)
5bd4f169 6425 {
60d67dc8
AM
6426 struct elf_link_hash_entry *def = weakdef (h);
6427 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
6428 h->root.u.def.section = def->root.u.def.section;
6429 h->root.u.def.value = def->root.u.def.value;
4a7e5234
AM
6430 if (def->root.u.def.section == htab->elf.sdynbss
6431 || def->root.u.def.section == htab->elf.sdynrelro)
6432 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
b34976b6 6433 return TRUE;
5bd4f169
AM
6434 }
6435
5bd4f169
AM
6436 /* If we are creating a shared library, we must presume that the
6437 only references to the symbol are via the global offset table.
6438 For such cases we need not do anything here; the relocations will
6439 be handled correctly by relocate_section. */
ec73ddcd 6440 if (!bfd_link_executable (info))
b34976b6 6441 return TRUE;
5bd4f169 6442
65f38f15
AM
6443 /* If there are no references to this symbol that do not use the
6444 GOT, we don't need to generate a copy reloc. */
f5385ebf 6445 if (!h->non_got_ref)
b34976b6 6446 return TRUE;
65f38f15 6447
b186458a 6448 /* Don't generate a copy reloc for symbols defined in the executable. */
d93d1c80 6449 if (!h->def_dynamic || !h->ref_regular || h->def_regular
b186458a 6450
d93d1c80
AM
6451 /* If -z nocopyreloc was given, don't generate them either. */
6452 || info->nocopyreloc
a127494f 6453
dce2246a 6454 /* If we don't find any dynamic relocs in read-only sections, then
d93d1c80 6455 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1bdd8fac
AM
6456 || (ELIMINATE_COPY_RELOCS
6457 && !h->needs_copy
6458 && !alias_readonly_dynrelocs (h))
65f38f15 6459
d93d1c80
AM
6460 /* Protected variables do not work with .dynbss. The copy in
6461 .dynbss won't be used by the shared library with the protected
6462 definition for the variable. Text relocations are preferable
6463 to an incorrect program. */
6464 || h->protected_def)
529fe20e 6465 return TRUE;
a127494f 6466
e1c6cf61
AM
6467 if (h->type == STT_FUNC
6468 || h->type == STT_GNU_IFUNC)
97b639ba 6469 {
e1c6cf61
AM
6470 /* .dynbss copies of function symbols only work if we have
6471 ELFv1 dot-symbols. ELFv1 compilers since 2004 default to not
6472 use dot-symbols and set the function symbol size to the text
6473 size of the function rather than the size of the descriptor.
6474 That's wrong for copying a descriptor. */
6475 if (((struct ppc_link_hash_entry *) h)->oh == NULL
6476 || !(h->size == 24 || h->size == 16))
6477 return TRUE;
6478
6479 /* We should never get here, but unfortunately there are old
6480 versions of gcc (circa gcc-3.2) that improperly for the
6481 ELFv1 ABI put initialized function pointers, vtable refs and
6482 suchlike in read-only sections. Allow them to proceed, but
6483 warn that this might break at runtime. */
25f53a85 6484 info->callbacks->einfo
c1c8c1ef 6485 (_("%P: copy reloc against `%pT' requires lazy plt linking; "
25f53a85 6486 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
6487 h->root.root.string);
6488 }
5d35169e
AM
6489
6490 /* This is a reference to a symbol defined by a dynamic object which
6491 is not a function. */
6492
5bd4f169
AM
6493 /* We must allocate the symbol in our .dynbss section, which will
6494 become part of the .bss section of the executable. There will be
6495 an entry for this symbol in the .dynsym section. The dynamic
6496 object will contain position independent code, so all references
6497 from the dynamic object to this symbol will go through the global
6498 offset table. The dynamic linker will use the .dynsym entry to
6499 determine the address it must put in the global offset table, so
6500 both the dynamic object and the regular object will refer to the
6501 same memory location for the variable. */
5474d94f
AM
6502 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6503 {
6504 s = htab->elf.sdynrelro;
6505 srel = htab->elf.sreldynrelro;
6506 }
6507 else
6508 {
6509 s = htab->elf.sdynbss;
6510 srel = htab->elf.srelbss;
6511 }
1d7e9d18 6512 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 6513 {
4a7e5234
AM
6514 /* We must generate a R_PPC64_COPY reloc to tell the dynamic
6515 linker to copy the initial value out of the dynamic object
6516 and into the runtime process image. */
5474d94f 6517 srel->size += sizeof (Elf64_External_Rela);
f5385ebf 6518 h->needs_copy = 1;
5bd4f169
AM
6519 }
6520
529fe20e
AM
6521 /* We no longer want dyn_relocs. */
6522 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
6cabe1ea 6523 return _bfd_elf_adjust_dynamic_copy (info, h, s);
5bd4f169
AM
6524}
6525
e86ce104
AM
6526/* If given a function descriptor symbol, hide both the function code
6527 sym and the descriptor. */
6528static void
4ce794b7
AM
6529ppc64_elf_hide_symbol (struct bfd_link_info *info,
6530 struct elf_link_hash_entry *h,
6531 bfd_boolean force_local)
e86ce104 6532{
34814b9f 6533 struct ppc_link_hash_entry *eh;
e86ce104
AM
6534 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6535
87469ba2
AM
6536 if (ppc_hash_table (info) == NULL)
6537 return;
6538
34814b9f
AM
6539 eh = (struct ppc_link_hash_entry *) h;
6540 if (eh->is_func_descriptor)
e86ce104 6541 {
34814b9f 6542 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 6543
721956f4 6544 if (fh == NULL)
d1329ca3
AM
6545 {
6546 const char *p, *q;
b8ac2841 6547 struct elf_link_hash_table *htab = elf_hash_table (info);
d1329ca3
AM
6548 char save;
6549
6550 /* We aren't supposed to use alloca in BFD because on
6551 systems which do not have alloca the version in libiberty
6552 calls xmalloc, which might cause the program to crash
6553 when it runs out of memory. This function doesn't have a
6554 return status, so there's no way to gracefully return an
6555 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
6556 accessed; It's either a string in an ELF string table,
6557 or allocated in an objalloc structure. */
d1329ca3 6558
34814b9f 6559 p = eh->elf.root.root.string - 1;
d1329ca3
AM
6560 save = *p;
6561 *(char *) p = '.';
34814b9f 6562 fh = (struct ppc_link_hash_entry *)
b8ac2841 6563 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
d1329ca3
AM
6564 *(char *) p = save;
6565
6566 /* Unfortunately, if it so happens that the string we were
6567 looking for was allocated immediately before this string,
6568 then we overwrote the string terminator. That's the only
6569 reason the lookup should fail. */
6570 if (fh == NULL)
6571 {
34814b9f
AM
6572 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6573 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 6574 --q, --p;
34814b9f
AM
6575 if (q < eh->elf.root.root.string && *p == '.')
6576 fh = (struct ppc_link_hash_entry *)
b8ac2841 6577 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
d1329ca3
AM
6578 }
6579 if (fh != NULL)
6580 {
34814b9f
AM
6581 eh->oh = fh;
6582 fh->oh = eh;
d1329ca3
AM
6583 }
6584 }
e86ce104 6585 if (fh != NULL)
34814b9f 6586 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
6587 }
6588}
6589
411e1bfb 6590static bfd_boolean
8843416a
AM
6591get_sym_h (struct elf_link_hash_entry **hp,
6592 Elf_Internal_Sym **symp,
6593 asection **symsecp,
f961d9dd 6594 unsigned char **tls_maskp,
8843416a
AM
6595 Elf_Internal_Sym **locsymsp,
6596 unsigned long r_symndx,
6597 bfd *ibfd)
411e1bfb 6598{
0ffa91dd 6599 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
6600
6601 if (r_symndx >= symtab_hdr->sh_info)
6602 {
6603 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6604 struct elf_link_hash_entry *h;
6605
6606 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 6607 h = elf_follow_link (h);
411e1bfb
AM
6608
6609 if (hp != NULL)
6610 *hp = h;
6611
6612 if (symp != NULL)
6613 *symp = NULL;
6614
6615 if (symsecp != NULL)
6616 {
6617 asection *symsec = NULL;
6618 if (h->root.type == bfd_link_hash_defined
6619 || h->root.type == bfd_link_hash_defweak)
6620 symsec = h->root.u.def.section;
6621 *symsecp = symsec;
6622 }
6623
e7b938ca 6624 if (tls_maskp != NULL)
411e1bfb
AM
6625 {
6626 struct ppc_link_hash_entry *eh;
6627
6628 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 6629 *tls_maskp = &eh->tls_mask;
411e1bfb
AM
6630 }
6631 }
6632 else
6633 {
6634 Elf_Internal_Sym *sym;
6635 Elf_Internal_Sym *locsyms = *locsymsp;
6636
6637 if (locsyms == NULL)
6638 {
6639 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6640 if (locsyms == NULL)
6641 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6642 symtab_hdr->sh_info,
6643 0, NULL, NULL, NULL);
6644 if (locsyms == NULL)
6645 return FALSE;
6646 *locsymsp = locsyms;
6647 }
6648 sym = locsyms + r_symndx;
6649
6650 if (hp != NULL)
6651 *hp = NULL;
6652
6653 if (symp != NULL)
6654 *symp = sym;
6655
6656 if (symsecp != NULL)
cb33740c 6657 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 6658
e7b938ca 6659 if (tls_maskp != NULL)
411e1bfb
AM
6660 {
6661 struct got_entry **lgot_ents;
f961d9dd 6662 unsigned char *tls_mask;
411e1bfb 6663
e7b938ca 6664 tls_mask = NULL;
411e1bfb
AM
6665 lgot_ents = elf_local_got_ents (ibfd);
6666 if (lgot_ents != NULL)
6667 {
e054468f
AM
6668 struct plt_entry **local_plt = (struct plt_entry **)
6669 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 6670 unsigned char *lgot_masks = (unsigned char *)
e054468f 6671 (local_plt + symtab_hdr->sh_info);
e7b938ca 6672 tls_mask = &lgot_masks[r_symndx];
411e1bfb 6673 }
e7b938ca 6674 *tls_maskp = tls_mask;
411e1bfb
AM
6675 }
6676 }
6677 return TRUE;
6678}
6679
e7b938ca 6680/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 6681 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 6682 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
6683
6684static int
f961d9dd 6685get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
6686 unsigned long *toc_symndx,
6687 bfd_vma *toc_addend,
0d4792f7 6688 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
6689 const Elf_Internal_Rela *rel,
6690 bfd *ibfd)
411e1bfb
AM
6691{
6692 unsigned long r_symndx;
0d4792f7 6693 int next_r;
411e1bfb
AM
6694 struct elf_link_hash_entry *h;
6695 Elf_Internal_Sym *sym;
6696 asection *sec;
6697 bfd_vma off;
6698
6699 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 6700 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 6701 return 0;
411e1bfb 6702
37da22e5
AM
6703 if ((*tls_maskp != NULL
6704 && (**tls_maskp & TLS_TLS) != 0
6705 && **tls_maskp != (TLS_TLS | TLS_MARK))
411e1bfb 6706 || sec == NULL
6bee8834 6707 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 6708 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 6709 return 1;
411e1bfb
AM
6710
6711 /* Look inside a TOC section too. */
6712 if (h != NULL)
6713 {
6714 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
6715 off = h->root.u.def.value;
6716 }
6717 else
6718 off = sym->st_value;
6719 off += rel->r_addend;
6720 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
6721 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
6722 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
6723 if (toc_symndx != NULL)
6724 *toc_symndx = r_symndx;
3a71aa26
AM
6725 if (toc_addend != NULL)
6726 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
6727 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6728 return 0;
854b41e7 6729 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
6730 && (next_r == -1 || next_r == -2))
6731 return 1 - next_r;
951fd09b 6732 return 1;
411e1bfb
AM
6733}
6734
3b421ab3
AM
6735/* Find (or create) an entry in the tocsave hash table. */
6736
6737static struct tocsave_entry *
6738tocsave_find (struct ppc_link_hash_table *htab,
6739 enum insert_option insert,
6740 Elf_Internal_Sym **local_syms,
6741 const Elf_Internal_Rela *irela,
6742 bfd *ibfd)
6743{
6744 unsigned long r_indx;
6745 struct elf_link_hash_entry *h;
6746 Elf_Internal_Sym *sym;
6747 struct tocsave_entry ent, *p;
6748 hashval_t hash;
6749 struct tocsave_entry **slot;
6750
6751 r_indx = ELF64_R_SYM (irela->r_info);
6752 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
6753 return NULL;
6754 if (ent.sec == NULL || ent.sec->output_section == NULL)
6755 {
4eca0228 6756 _bfd_error_handler
871b3ab2 6757 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
3b421ab3
AM
6758 return NULL;
6759 }
6760
6761 if (h != NULL)
6762 ent.offset = h->root.u.def.value;
6763 else
6764 ent.offset = sym->st_value;
6765 ent.offset += irela->r_addend;
6766
6767 hash = tocsave_htab_hash (&ent);
6768 slot = ((struct tocsave_entry **)
6769 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
6770 if (slot == NULL)
6771 return NULL;
6772
6773 if (*slot == NULL)
6774 {
6775 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
6776 if (p == NULL)
6777 return NULL;
6778 *p = ent;
6779 *slot = p;
6780 }
6781 return *slot;
6782}
6783
754021d0 6784/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 6785 code for the old ABI, these will already have been done. */
754021d0
AM
6786
6787static bfd_boolean
6788adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
6789{
6790 struct ppc_link_hash_entry *eh;
6791 asection *sym_sec;
74f0fb50 6792 struct _opd_sec_data *opd;
754021d0
AM
6793
6794 if (h->root.type == bfd_link_hash_indirect)
6795 return TRUE;
6796
754021d0
AM
6797 if (h->root.type != bfd_link_hash_defined
6798 && h->root.type != bfd_link_hash_defweak)
6799 return TRUE;
6800
6801 eh = (struct ppc_link_hash_entry *) h;
6802 if (eh->adjust_done)
6803 return TRUE;
6804
6805 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
6806 opd = get_opd_info (sym_sec);
6807 if (opd != NULL && opd->adjust != NULL)
754021d0 6808 {
51aecdc5 6809 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
4025353c
AM
6810 if (adjust == -1)
6811 {
6812 /* This entry has been deleted. */
b3fac117 6813 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
6814 if (dsec == NULL)
6815 {
6816 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 6817 if (discarded_section (dsec))
81688140 6818 {
b3fac117 6819 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
6820 break;
6821 }
6822 }
4025353c 6823 eh->elf.root.u.def.value = 0;
81688140 6824 eh->elf.root.u.def.section = dsec;
4025353c
AM
6825 }
6826 else
6827 eh->elf.root.u.def.value += adjust;
754021d0
AM
6828 eh->adjust_done = 1;
6829 }
6830 return TRUE;
6831}
6832
8c1d1bb8 6833/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 6834 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
6835 have already been determined. */
6836
6837static bfd_boolean
6838dec_dynrel_count (bfd_vma r_info,
6839 asection *sec,
6840 struct bfd_link_info *info,
6841 Elf_Internal_Sym **local_syms,
6842 struct elf_link_hash_entry *h,
19e08130 6843 Elf_Internal_Sym *sym)
8c1d1bb8
AM
6844{
6845 enum elf_ppc64_reloc_type r_type;
19e08130 6846 asection *sym_sec = NULL;
8c1d1bb8
AM
6847
6848 /* Can this reloc be dynamic? This switch, and later tests here
6849 should be kept in sync with the code in check_relocs. */
6850 r_type = ELF64_R_TYPE (r_info);
6851 switch (r_type)
6852 {
6853 default:
6854 return TRUE;
6855
1bdd8fac
AM
6856 case R_PPC64_TOC16:
6857 case R_PPC64_TOC16_DS:
6858 case R_PPC64_TOC16_LO:
6859 case R_PPC64_TOC16_HI:
6860 case R_PPC64_TOC16_HA:
6861 case R_PPC64_TOC16_LO_DS:
6862 if (h == NULL)
6863 return TRUE;
6864 break;
6865
8c1d1bb8
AM
6866 case R_PPC64_TPREL16:
6867 case R_PPC64_TPREL16_LO:
6868 case R_PPC64_TPREL16_HI:
6869 case R_PPC64_TPREL16_HA:
6870 case R_PPC64_TPREL16_DS:
6871 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
6872 case R_PPC64_TPREL16_HIGH:
6873 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
6874 case R_PPC64_TPREL16_HIGHER:
6875 case R_PPC64_TPREL16_HIGHERA:
6876 case R_PPC64_TPREL16_HIGHEST:
6877 case R_PPC64_TPREL16_HIGHESTA:
8c1d1bb8 6878 case R_PPC64_TPREL64:
c213164a 6879 case R_PPC64_TPREL34:
8c1d1bb8
AM
6880 case R_PPC64_DTPMOD64:
6881 case R_PPC64_DTPREL64:
6882 case R_PPC64_ADDR64:
6883 case R_PPC64_REL30:
6884 case R_PPC64_REL32:
6885 case R_PPC64_REL64:
6886 case R_PPC64_ADDR14:
6887 case R_PPC64_ADDR14_BRNTAKEN:
6888 case R_PPC64_ADDR14_BRTAKEN:
6889 case R_PPC64_ADDR16:
6890 case R_PPC64_ADDR16_DS:
6891 case R_PPC64_ADDR16_HA:
6892 case R_PPC64_ADDR16_HI:
f9c6b907
AM
6893 case R_PPC64_ADDR16_HIGH:
6894 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
6895 case R_PPC64_ADDR16_HIGHER:
6896 case R_PPC64_ADDR16_HIGHERA:
6897 case R_PPC64_ADDR16_HIGHEST:
6898 case R_PPC64_ADDR16_HIGHESTA:
6899 case R_PPC64_ADDR16_LO:
6900 case R_PPC64_ADDR16_LO_DS:
6901 case R_PPC64_ADDR24:
6902 case R_PPC64_ADDR32:
6903 case R_PPC64_UADDR16:
6904 case R_PPC64_UADDR32:
6905 case R_PPC64_UADDR64:
6906 case R_PPC64_TOC:
5663e321
AM
6907 case R_PPC64_D34:
6908 case R_PPC64_D34_LO:
6909 case R_PPC64_D34_HI30:
6910 case R_PPC64_D34_HA30:
6911 case R_PPC64_ADDR16_HIGHER34:
6912 case R_PPC64_ADDR16_HIGHERA34:
6913 case R_PPC64_ADDR16_HIGHEST34:
6914 case R_PPC64_ADDR16_HIGHESTA34:
6915 case R_PPC64_D28:
8c1d1bb8
AM
6916 break;
6917 }
6918
6919 if (local_syms != NULL)
6920 {
6921 unsigned long r_symndx;
8c1d1bb8
AM
6922 bfd *ibfd = sec->owner;
6923
6924 r_symndx = ELF64_R_SYM (r_info);
6925 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
6926 return FALSE;
6927 }
6928
ec73ddcd
AM
6929 if ((h != NULL
6930 && (h->root.type == bfd_link_hash_defweak
6931 || !h->def_regular))
6932 || (h != NULL
6933 && !bfd_link_executable (info)
6934 && !SYMBOLIC_BIND (info, h))
6935 || (bfd_link_pic (info)
6936 && must_be_dyn_reloc (info, r_type))
6937 || (!bfd_link_pic (info)
6938 && (h != NULL
6939 ? h->type == STT_GNU_IFUNC
6940 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
8c1d1bb8
AM
6941 ;
6942 else
6943 return TRUE;
6944
6945 if (h != NULL)
6edfbbad 6946 {
19e08130
AM
6947 struct elf_dyn_relocs *p;
6948 struct elf_dyn_relocs **pp;
6949 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6950
6951 /* elf_gc_sweep may have already removed all dyn relocs associated
6952 with local syms for a given section. Also, symbol flags are
6953 changed by elf_gc_sweep_symbol, confusing the test above. Don't
6954 report a dynreloc miscount. */
6955 if (*pp == NULL && info->gc_sections)
6956 return TRUE;
6957
6958 while ((p = *pp) != NULL)
60124e18 6959 {
19e08130
AM
6960 if (p->sec == sec)
6961 {
6962 if (!must_be_dyn_reloc (info, r_type))
6963 p->pc_count -= 1;
6964 p->count -= 1;
6965 if (p->count == 0)
6966 *pp = p->next;
6967 return TRUE;
6968 }
6969 pp = &p->next;
60124e18 6970 }
6edfbbad 6971 }
19e08130
AM
6972 else
6973 {
6974 struct ppc_dyn_relocs *p;
6975 struct ppc_dyn_relocs **pp;
6976 void *vpp;
6977 bfd_boolean is_ifunc;
8c1d1bb8 6978
19e08130
AM
6979 if (local_syms == NULL)
6980 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6981 if (sym_sec == NULL)
6982 sym_sec = sec;
c57da1a7 6983
19e08130
AM
6984 vpp = &elf_section_data (sym_sec)->local_dynrel;
6985 pp = (struct ppc_dyn_relocs **) vpp;
6986
6987 if (*pp == NULL && info->gc_sections)
6988 return TRUE;
6989
6990 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
6991 while ((p = *pp) != NULL)
8c1d1bb8 6992 {
19e08130
AM
6993 if (p->sec == sec && p->ifunc == is_ifunc)
6994 {
6995 p->count -= 1;
6996 if (p->count == 0)
6997 *pp = p->next;
6998 return TRUE;
6999 }
7000 pp = &p->next;
8c1d1bb8 7001 }
8c1d1bb8
AM
7002 }
7003
695344c0 7004 /* xgettext:c-format */
cf97bcb0
AM
7005 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"),
7006 sec->owner, sec);
8c1d1bb8
AM
7007 bfd_set_error (bfd_error_bad_value);
7008 return FALSE;
7009}
7010
754021d0
AM
7011/* Remove unused Official Procedure Descriptor entries. Currently we
7012 only remove those associated with functions in discarded link-once
7013 sections, or weakly defined functions that have been overridden. It
7014 would be possible to remove many more entries for statically linked
7015 applications. */
7016
b34976b6 7017bfd_boolean
e7d1c40c 7018ppc64_elf_edit_opd (struct bfd_link_info *info)
1e2f5b6e
AM
7019{
7020 bfd *ibfd;
754021d0 7021 bfd_boolean some_edited = FALSE;
3f764659 7022 asection *need_pad = NULL;
e7d1c40c
AM
7023 struct ppc_link_hash_table *htab;
7024
7025 htab = ppc_hash_table (info);
7026 if (htab == NULL)
7027 return FALSE;
1e2f5b6e 7028
c72f2fb2 7029 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1e2f5b6e
AM
7030 {
7031 asection *sec;
7032 Elf_Internal_Rela *relstart, *rel, *relend;
7033 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7034 Elf_Internal_Sym *local_syms;
74f0fb50 7035 struct _opd_sec_data *opd;
51aecdc5 7036 bfd_boolean need_edit, add_aux_fields, broken;
3f764659 7037 bfd_size_type cnt_16b = 0;
1e2f5b6e 7038
854b41e7
AM
7039 if (!is_ppc64_elf (ibfd))
7040 continue;
7041
1e2f5b6e 7042 sec = bfd_get_section_by_name (ibfd, ".opd");
46de2a7c 7043 if (sec == NULL || sec->size == 0)
1e2f5b6e
AM
7044 continue;
7045
dbaa2011 7046 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7047 continue;
7048
1e2f5b6e
AM
7049 if (sec->output_section == bfd_abs_section_ptr)
7050 continue;
7051
7052 /* Look through the section relocs. */
7053 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7054 continue;
7055
6cdc0ccc 7056 local_syms = NULL;
0ffa91dd 7057 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7058
7059 /* Read the relocations. */
4ce794b7 7060 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7061 info->keep_memory);
1e2f5b6e 7062 if (relstart == NULL)
b34976b6 7063 return FALSE;
1e2f5b6e
AM
7064
7065 /* First run through the relocs to check they are sane, and to
7066 determine whether we need to edit this opd section. */
b34976b6 7067 need_edit = FALSE;
51aecdc5 7068 broken = FALSE;
3f764659 7069 need_pad = sec;
1e2f5b6e 7070 relend = relstart + sec->reloc_count;
50bc7936 7071 for (rel = relstart; rel < relend; )
1e2f5b6e 7072 {
04c9666a 7073 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7074 unsigned long r_symndx;
7075 asection *sym_sec;
7076 struct elf_link_hash_entry *h;
7077 Elf_Internal_Sym *sym;
51aecdc5 7078 bfd_vma offset;
1e2f5b6e 7079
51aecdc5 7080 /* .opd contains an array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7081 only interested in the reloc pointing to a function entry
7082 point. */
51aecdc5
AM
7083 offset = rel->r_offset;
7084 if (rel + 1 == relend
7085 || rel[1].r_offset != offset + 8)
1e2f5b6e
AM
7086 {
7087 /* If someone messes with .opd alignment then after a
7088 "ld -r" we might have padding in the middle of .opd.
7089 Also, there's nothing to prevent someone putting
7090 something silly in .opd with the assembler. No .opd
b34976b6 7091 optimization for them! */
3f764659 7092 broken_opd:
4eca0228 7093 _bfd_error_handler
871b3ab2 7094 (_("%pB: .opd is not a regular array of opd entries"), ibfd);
51aecdc5 7095 broken = TRUE;
1e2f5b6e
AM
7096 break;
7097 }
7098
50bc7936
AM
7099 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7100 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7101 {
4eca0228 7102 _bfd_error_handler
695344c0 7103 /* xgettext:c-format */
871b3ab2 7104 (_("%pB: unexpected reloc type %u in .opd section"),
d003868e 7105 ibfd, r_type);
51aecdc5 7106 broken = TRUE;
50bc7936
AM
7107 break;
7108 }
7109
1e2f5b6e 7110 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7111 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7112 r_symndx, ibfd))
50bc7936 7113 goto error_ret;
1e2f5b6e
AM
7114
7115 if (sym_sec == NULL || sym_sec->owner == NULL)
7116 {
411e1bfb
AM
7117 const char *sym_name;
7118 if (h != NULL)
7119 sym_name = h->root.root.string;
7120 else
26c61ae5
L
7121 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7122 sym_sec);
411e1bfb 7123
4eca0228 7124 _bfd_error_handler
695344c0 7125 /* xgettext:c-format */
871b3ab2 7126 (_("%pB: undefined sym `%s' in .opd section"),
d003868e 7127 ibfd, sym_name);
51aecdc5 7128 broken = TRUE;
1e2f5b6e
AM
7129 break;
7130 }
7131
51020317
AM
7132 /* opd entries are always for functions defined in the
7133 current input bfd. If the symbol isn't defined in the
7134 input bfd, then we won't be using the function in this
7135 bfd; It must be defined in a linkonce section in another
7136 bfd, or is weak. It's also possible that we are
7137 discarding the function due to a linker script /DISCARD/,
7138 which we test for via the output_section. */
7139 if (sym_sec->owner != ibfd
7140 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 7141 need_edit = TRUE;
1e2f5b6e 7142
50bc7936 7143 rel += 2;
51aecdc5
AM
7144 if (rel + 1 == relend
7145 || (rel + 2 < relend
7146 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
7147 ++rel;
7148
7149 if (rel == relend)
3f764659
JJ
7150 {
7151 if (sec->size == offset + 24)
7152 {
7153 need_pad = NULL;
7154 break;
7155 }
51aecdc5 7156 if (sec->size == offset + 16)
3f764659
JJ
7157 {
7158 cnt_16b++;
7159 break;
7160 }
7161 goto broken_opd;
7162 }
3f764659
JJ
7163 else if (rel + 1 < relend
7164 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7165 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7166 {
51aecdc5
AM
7167 if (rel[0].r_offset == offset + 16)
7168 cnt_16b++;
7169 else if (rel[0].r_offset != offset + 24)
7170 goto broken_opd;
3f764659
JJ
7171 }
7172 else
7173 goto broken_opd;
1e2f5b6e
AM
7174 }
7175
e7d1c40c 7176 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
3f764659 7177
51aecdc5 7178 if (!broken && (need_edit || add_aux_fields))
1e2f5b6e
AM
7179 {
7180 Elf_Internal_Rela *write_rel;
d4730f92 7181 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 7182 bfd_byte *rptr, *wptr;
983bddc8 7183 bfd_byte *new_contents;
74f0fb50
AM
7184 bfd_size_type amt;
7185
983bddc8 7186 new_contents = NULL;
51aecdc5 7187 amt = OPD_NDX (sec->size) * sizeof (long);
74f0fb50 7188 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 7189 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50
AM
7190 if (opd->adjust == NULL)
7191 return FALSE;
1e2f5b6e
AM
7192
7193 /* This seems a waste of time as input .opd sections are all
7194 zeros as generated by gcc, but I suppose there's no reason
7195 this will always be so. We might start putting something in
7196 the third word of .opd entries. */
7197 if ((sec->flags & SEC_IN_MEMORY) == 0)
7198 {
eea6121a
AM
7199 bfd_byte *loc;
7200 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 7201 {
eea6121a
AM
7202 if (loc != NULL)
7203 free (loc);
50bc7936 7204 error_ret:
6cdc0ccc
AM
7205 if (local_syms != NULL
7206 && symtab_hdr->contents != (unsigned char *) local_syms)
7207 free (local_syms);
6cdc0ccc
AM
7208 if (elf_section_data (sec)->relocs != relstart)
7209 free (relstart);
b34976b6 7210 return FALSE;
6cdc0ccc 7211 }
1e2f5b6e
AM
7212 sec->contents = loc;
7213 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7214 }
7215
7216 elf_section_data (sec)->relocs = relstart;
7217
3f764659 7218 new_contents = sec->contents;
3f764659
JJ
7219 if (add_aux_fields)
7220 {
7221 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7222 if (new_contents == NULL)
7223 return FALSE;
51aecdc5 7224 need_pad = NULL;
3f764659 7225 }
b4f4e59f
AM
7226 wptr = new_contents;
7227 rptr = sec->contents;
1e2f5b6e 7228 write_rel = relstart;
51aecdc5 7229 for (rel = relstart; rel < relend; )
1e2f5b6e 7230 {
50bc7936
AM
7231 unsigned long r_symndx;
7232 asection *sym_sec;
7233 struct elf_link_hash_entry *h;
51aecdc5 7234 struct ppc_link_hash_entry *fdh = NULL;
50bc7936 7235 Elf_Internal_Sym *sym;
51aecdc5
AM
7236 long opd_ent_size;
7237 Elf_Internal_Rela *next_rel;
7238 bfd_boolean skip;
50bc7936
AM
7239
7240 r_symndx = ELF64_R_SYM (rel->r_info);
7241 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 7242 r_symndx, ibfd))
50bc7936
AM
7243 goto error_ret;
7244
51aecdc5
AM
7245 next_rel = rel + 2;
7246 if (next_rel + 1 == relend
7247 || (next_rel + 2 < relend
7248 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
7249 ++next_rel;
7250
7251 /* See if the .opd entry is full 24 byte or
7252 16 byte (with fd_aux entry overlapped with next
7253 fd_func). */
7254 opd_ent_size = 24;
7255 if (next_rel == relend)
1e2f5b6e 7256 {
51aecdc5 7257 if (sec->size == rel->r_offset + 16)
3f764659 7258 opd_ent_size = 16;
51aecdc5
AM
7259 }
7260 else if (next_rel->r_offset == rel->r_offset + 16)
7261 opd_ent_size = 16;
3f764659 7262
51aecdc5
AM
7263 if (h != NULL
7264 && h->root.root.string[0] == '.')
7265 {
8c5b4e52
AM
7266 fdh = ((struct ppc_link_hash_entry *) h)->oh;
7267 if (fdh != NULL)
7268 {
7269 fdh = ppc_follow_link (fdh);
7270 if (fdh->elf.root.type != bfd_link_hash_defined
7271 && fdh->elf.root.type != bfd_link_hash_defweak)
7272 fdh = NULL;
7273 }
51aecdc5 7274 }
1e2f5b6e 7275
51aecdc5
AM
7276 skip = (sym_sec->owner != ibfd
7277 || sym_sec->output_section == bfd_abs_section_ptr);
7278 if (skip)
7279 {
7280 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7 7281 {
51aecdc5
AM
7282 /* Arrange for the function descriptor sym
7283 to be dropped. */
7284 fdh->elf.root.u.def.value = 0;
7285 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 7286 }
51aecdc5 7287 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
1e2f5b6e 7288
0e1862bb 7289 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
51aecdc5
AM
7290 rel = next_rel;
7291 else
7292 while (1)
7293 {
7294 if (!dec_dynrel_count (rel->r_info, sec, info,
7295 NULL, h, sym))
7296 goto error_ret;
754021d0 7297
51aecdc5
AM
7298 if (++rel == next_rel)
7299 break;
1e2f5b6e 7300
51aecdc5
AM
7301 r_symndx = ELF64_R_SYM (rel->r_info);
7302 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7303 r_symndx, ibfd))
7304 goto error_ret;
7305 }
50bc7936
AM
7306 }
7307 else
1e2f5b6e 7308 {
51aecdc5
AM
7309 /* We'll be keeping this opd entry. */
7310 long adjust;
7311
7312 if (fdh != NULL)
7313 {
7314 /* Redefine the function descriptor symbol to
7315 this location in the opd section. It is
7316 necessary to update the value here rather
7317 than using an array of adjustments as we do
7318 for local symbols, because various places
7319 in the generic ELF code use the value
7320 stored in u.def.value. */
7321 fdh->elf.root.u.def.value = wptr - new_contents;
7322 fdh->adjust_done = 1;
7323 }
7324
7325 /* Local syms are a bit tricky. We could
7326 tweak them as they can be cached, but
7327 we'd need to look through the local syms
7328 for the function descriptor sym which we
7329 don't have at the moment. So keep an
7330 array of adjustments. */
7331 adjust = (wptr - new_contents) - (rptr - sec->contents);
7332 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
7333
7334 if (wptr != rptr)
7335 memcpy (wptr, rptr, opd_ent_size);
7336 wptr += opd_ent_size;
7337 if (add_aux_fields && opd_ent_size == 16)
7338 {
7339 memset (wptr, '\0', 8);
7340 wptr += 8;
7341 }
7342
50bc7936 7343 /* We need to adjust any reloc offsets to point to the
51aecdc5
AM
7344 new opd entries. */
7345 for ( ; rel != next_rel; ++rel)
7346 {
7347 rel->r_offset += adjust;
7348 if (write_rel != rel)
7349 memcpy (write_rel, rel, sizeof (*rel));
7350 ++write_rel;
7351 }
1e2f5b6e 7352 }
51aecdc5
AM
7353
7354 rptr += opd_ent_size;
1e2f5b6e
AM
7355 }
7356
3f764659 7357 sec->size = wptr - new_contents;
1e2f5b6e 7358 sec->reloc_count = write_rel - relstart;
3f764659
JJ
7359 if (add_aux_fields)
7360 {
7361 free (sec->contents);
7362 sec->contents = new_contents;
7363 }
7364
05bf9422 7365 /* Fudge the header size too, as this is used later in
cdcf6e38 7366 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
7367 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7368 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
754021d0 7369 some_edited = TRUE;
1e2f5b6e 7370 }
6cdc0ccc 7371 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 7372 free (relstart);
6cdc0ccc 7373
411e1bfb
AM
7374 if (local_syms != NULL
7375 && symtab_hdr->contents != (unsigned char *) local_syms)
7376 {
7377 if (!info->keep_memory)
7378 free (local_syms);
7379 else
7380 symtab_hdr->contents = (unsigned char *) local_syms;
7381 }
7382 }
7383
754021d0
AM
7384 if (some_edited)
7385 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7386
3f764659
JJ
7387 /* If we are doing a final link and the last .opd entry is just 16 byte
7388 long, add a 8 byte padding after it. */
0e1862bb 7389 if (need_pad != NULL && !bfd_link_relocatable (info))
3f764659
JJ
7390 {
7391 bfd_byte *p;
7392
7393 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7394 {
7395 BFD_ASSERT (need_pad->size > 0);
7396
7397 p = bfd_malloc (need_pad->size + 8);
7398 if (p == NULL)
7399 return FALSE;
699733f6 7400
2cdcc330
AM
7401 if (!bfd_get_section_contents (need_pad->owner, need_pad,
7402 p, 0, need_pad->size))
3f764659
JJ
7403 return FALSE;
7404
7405 need_pad->contents = p;
7406 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7407 }
7408 else
7409 {
7410 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7411 if (p == NULL)
7412 return FALSE;
7413
7414 need_pad->contents = p;
7415 }
7416
7417 memset (need_pad->contents + need_pad->size, 0, 8);
7418 need_pad->size += 8;
7419 }
7420
411e1bfb
AM
7421 return TRUE;
7422}
7423
3e04d765
AM
7424/* Analyze inline PLT call relocations to see whether calls to locally
7425 defined functions can be converted to direct calls. */
7426
7427bfd_boolean
7428ppc64_elf_inline_plt (struct bfd_link_info *info)
7429{
7430 struct ppc_link_hash_table *htab;
7431 bfd *ibfd;
7432 asection *sec;
7433 bfd_vma low_vma, high_vma, limit;
7434
7435 htab = ppc_hash_table (info);
7436 if (htab == NULL)
7437 return FALSE;
7438
7439 /* A bl insn can reach -0x2000000 to 0x1fffffc. The limit is
7440 reduced somewhat to cater for possible stubs that might be added
7441 between the call and its destination. */
7442 if (htab->params->group_size < 0)
7443 {
7444 limit = -htab->params->group_size;
7445 if (limit == 1)
7446 limit = 0x1e00000;
7447 }
7448 else
7449 {
7450 limit = htab->params->group_size;
7451 if (limit == 1)
7452 limit = 0x1c00000;
7453 }
7454
7455 low_vma = -1;
7456 high_vma = 0;
7457 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
7458 if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
7459 {
7460 if (low_vma > sec->vma)
7461 low_vma = sec->vma;
7462 if (high_vma < sec->vma + sec->size)
7463 high_vma = sec->vma + sec->size;
7464 }
7465
7466 /* If a "bl" can reach anywhere in local code sections, then we can
7467 convert all inline PLT sequences to direct calls when the symbol
7468 is local. */
7469 if (high_vma - low_vma < limit)
7470 {
7471 htab->can_convert_all_inline_plt = 1;
7472 return TRUE;
7473 }
7474
7475 /* Otherwise, go looking through relocs for cases where a direct
7476 call won't reach. Mark the symbol on any such reloc to disable
7477 the optimization and keep the PLT entry as it seems likely that
7478 this will be better than creating trampolines. Note that this
7479 will disable the optimization for all inline PLT calls to a
7480 particular symbol, not just those that won't reach. The
7481 difficulty in doing a more precise optimization is that the
7482 linker needs to make a decision depending on whether a
7483 particular R_PPC64_PLTCALL insn can be turned into a direct
7484 call, for each of the R_PPC64_PLTSEQ and R_PPC64_PLT16* insns in
7485 the sequence, and there is nothing that ties those relocs
7486 together except their symbol. */
7487
7488 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7489 {
7490 Elf_Internal_Shdr *symtab_hdr;
7491 Elf_Internal_Sym *local_syms;
7492
7493 if (!is_ppc64_elf (ibfd))
7494 continue;
7495
7496 local_syms = NULL;
7497 symtab_hdr = &elf_symtab_hdr (ibfd);
7498
7499 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7500 if (ppc64_elf_section_data (sec)->has_pltcall
7501 && !bfd_is_abs_section (sec->output_section))
7502 {
7503 Elf_Internal_Rela *relstart, *rel, *relend;
7504
7505 /* Read the relocations. */
7506 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7507 info->keep_memory);
7508 if (relstart == NULL)
7509 return FALSE;
7510
7511 relend = relstart + sec->reloc_count;
de9c1b7c 7512 for (rel = relstart; rel < relend; rel++)
3e04d765
AM
7513 {
7514 enum elf_ppc64_reloc_type r_type;
7515 unsigned long r_symndx;
7516 asection *sym_sec;
7517 struct elf_link_hash_entry *h;
7518 Elf_Internal_Sym *sym;
7519 unsigned char *tls_maskp;
7520
7521 r_type = ELF64_R_TYPE (rel->r_info);
5663e321
AM
7522 if (r_type != R_PPC64_PLTCALL
7523 && r_type != R_PPC64_PLTCALL_NOTOC)
3e04d765
AM
7524 continue;
7525
7526 r_symndx = ELF64_R_SYM (rel->r_info);
7527 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
7528 r_symndx, ibfd))
7529 {
7530 if (elf_section_data (sec)->relocs != relstart)
7531 free (relstart);
7532 if (local_syms != NULL
2cdcc330 7533 && symtab_hdr->contents != (bfd_byte *) local_syms)
3e04d765
AM
7534 free (local_syms);
7535 return FALSE;
7536 }
7537
7538 if (sym_sec != NULL && sym_sec->output_section != NULL)
7539 {
7540 bfd_vma from, to;
7541 if (h != NULL)
7542 to = h->root.u.def.value;
7543 else
7544 to = sym->st_value;
7545 to += (rel->r_addend
7546 + sym_sec->output_offset
7547 + sym_sec->output_section->vma);
7548 from = (rel->r_offset
7549 + sec->output_offset
7550 + sec->output_section->vma);
5663e321
AM
7551 if (to - from + limit < 2 * limit
7552 && !(r_type == R_PPC64_PLTCALL_NOTOC
7553 && (((h ? h->other : sym->st_other)
7554 & STO_PPC64_LOCAL_MASK)
4a4e7361 7555 > 1 << STO_PPC64_LOCAL_BIT)))
3e04d765
AM
7556 *tls_maskp &= ~PLT_KEEP;
7557 }
7558 }
7559 if (elf_section_data (sec)->relocs != relstart)
7560 free (relstart);
7561 }
7562
7563 if (local_syms != NULL
7564 && symtab_hdr->contents != (unsigned char *) local_syms)
7565 {
7566 if (!info->keep_memory)
7567 free (local_syms);
7568 else
7569 symtab_hdr->contents = (unsigned char *) local_syms;
7570 }
7571 }
7572
7573 return TRUE;
7574}
7575
e1918d23 7576/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 7577
e1918d23 7578asection *
e7d1c40c 7579ppc64_elf_tls_setup (struct bfd_link_info *info)
411e1bfb 7580{
411e1bfb
AM
7581 struct ppc_link_hash_table *htab;
7582
411e1bfb 7583 htab = ppc_hash_table (info);
4dfe6ac6
NC
7584 if (htab == NULL)
7585 return NULL;
7586
ee67d69a
AM
7587 if (abiversion (info->output_bfd) == 1)
7588 htab->opd_abi = 1;
7589
e7d1c40c 7590 if (htab->params->no_multi_toc)
33c0ec9d
AM
7591 htab->do_multi_toc = 0;
7592 else if (!htab->do_multi_toc)
e7d1c40c 7593 htab->params->no_multi_toc = 1;
33c0ec9d 7594
8b5f1ed8
AM
7595 /* Default to --no-plt-localentry, as this option can cause problems
7596 with symbol interposition. For example, glibc libpthread.so and
7597 libc.so duplicate many pthread symbols, with a fallback
7598 implementation in libc.so. In some cases the fallback does more
7599 work than the pthread implementation. __pthread_condattr_destroy
7600 is one such symbol: the libpthread.so implementation is
7601 localentry:0 while the libc.so implementation is localentry:8.
7602 An app that "cleverly" uses dlopen to only load necessary
7603 libraries at runtime may omit loading libpthread.so when not
7604 running multi-threaded, which then results in the libc.so
7605 fallback symbols being used and ld.so complaining. Now there
7606 are workarounds in ld (see non_zero_localentry) to detect the
7607 pthread situation, but that may not be the only case where
7608 --plt-localentry can cause trouble. */
f378ab09 7609 if (htab->params->plt_localentry0 < 0)
8b5f1ed8 7610 htab->params->plt_localentry0 = 0;
d44c746a
AM
7611 if (htab->params->plt_localentry0
7612 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
7613 FALSE, FALSE, FALSE) == NULL)
cf97bcb0
AM
7614 _bfd_error_handler
7615 (_("warning: --plt-localentry is especially dangerous without "
7616 "ld.so support to detect ABI violations"));
f378ab09 7617
3a71aa26
AM
7618 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7619 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7620 FALSE, FALSE, TRUE));
a7f2871e
AM
7621 /* Move dynamic linking info to the function descriptor sym. */
7622 if (htab->tls_get_addr != NULL)
7623 func_desc_adjust (&htab->tls_get_addr->elf, info);
3a71aa26
AM
7624 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7625 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7626 FALSE, FALSE, TRUE));
7c9cf415 7627 if (htab->params->tls_get_addr_opt)
a7f2871e
AM
7628 {
7629 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
7630
7631 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7632 FALSE, FALSE, TRUE);
7633 if (opt != NULL)
7634 func_desc_adjust (opt, info);
7635 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7636 FALSE, FALSE, TRUE);
7637 if (opt_fd != NULL
7638 && (opt_fd->root.type == bfd_link_hash_defined
7639 || opt_fd->root.type == bfd_link_hash_defweak))
7640 {
7641 /* If glibc supports an optimized __tls_get_addr call stub,
7642 signalled by the presence of __tls_get_addr_opt, and we'll
7643 be calling __tls_get_addr via a plt call stub, then
7644 make __tls_get_addr point to __tls_get_addr_opt. */
7645 tga_fd = &htab->tls_get_addr_fd->elf;
7646 if (htab->elf.dynamic_sections_created
7647 && tga_fd != NULL
7648 && (tga_fd->type == STT_FUNC
7649 || tga_fd->needs_plt)
7650 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
21d68fcd 7651 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd)))
a7f2871e
AM
7652 {
7653 struct plt_entry *ent;
7654
7655 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7656 if (ent->plt.refcount > 0)
7657 break;
7658 if (ent != NULL)
7659 {
7660 tga_fd->root.type = bfd_link_hash_indirect;
7661 tga_fd->root.u.i.link = &opt_fd->root;
7662 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
b531344c 7663 opt_fd->mark = 1;
a7f2871e
AM
7664 if (opt_fd->dynindx != -1)
7665 {
7666 /* Use __tls_get_addr_opt in dynamic relocations. */
7667 opt_fd->dynindx = -1;
7668 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7669 opt_fd->dynstr_index);
7670 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
854b41e7 7671 return NULL;
a7f2871e 7672 }
2cdcc330
AM
7673 htab->tls_get_addr_fd
7674 = (struct ppc_link_hash_entry *) opt_fd;
a7f2871e
AM
7675 tga = &htab->tls_get_addr->elf;
7676 if (opt != NULL && tga != NULL)
7677 {
7678 tga->root.type = bfd_link_hash_indirect;
7679 tga->root.u.i.link = &opt->root;
7680 ppc64_elf_copy_indirect_symbol (info, opt, tga);
b531344c 7681 opt->mark = 1;
a7f2871e
AM
7682 _bfd_elf_link_hash_hide_symbol (info, opt,
7683 tga->forced_local);
7684 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
7685 }
7686 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7687 htab->tls_get_addr_fd->is_func_descriptor = 1;
7688 if (htab->tls_get_addr != NULL)
7689 {
7690 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7691 htab->tls_get_addr->is_func = 1;
7692 }
7693 }
7694 }
7695 }
7c9cf415
AM
7696 else if (htab->params->tls_get_addr_opt < 0)
7697 htab->params->tls_get_addr_opt = 0;
a7f2871e 7698 }
33c0ec9d 7699 return _bfd_elf_tls_setup (info->output_bfd, info);
3a71aa26 7700}
8387904d 7701
3a71aa26
AM
7702/* Return TRUE iff REL is a branch reloc with a global symbol matching
7703 HASH1 or HASH2. */
8387904d 7704
3a71aa26
AM
7705static bfd_boolean
7706branch_reloc_hash_match (const bfd *ibfd,
7707 const Elf_Internal_Rela *rel,
7708 const struct ppc_link_hash_entry *hash1,
7709 const struct ppc_link_hash_entry *hash2)
7710{
7711 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7712 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7713 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7714
e054468f 7715 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 7716 {
3a71aa26
AM
7717 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7718 struct elf_link_hash_entry *h;
8387904d 7719
3a71aa26 7720 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7721 h = elf_follow_link (h);
3a71aa26
AM
7722 if (h == &hash1->elf || h == &hash2->elf)
7723 return TRUE;
a48ebf4d 7724 }
3a71aa26 7725 return FALSE;
951fd09b 7726}
411e1bfb 7727
951fd09b
AM
7728/* Run through all the TLS relocs looking for optimization
7729 opportunities. The linker has been hacked (see ppc64elf.em) to do
7730 a preliminary section layout so that we know the TLS segment
7731 offsets. We can't optimize earlier because some optimizations need
7732 to know the tp offset, and we need to optimize before allocating
7733 dynamic relocations. */
7734
7735bfd_boolean
33c0ec9d 7736ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
7737{
7738 bfd *ibfd;
7739 asection *sec;
7740 struct ppc_link_hash_table *htab;
663a1470 7741 unsigned char *toc_ref;
102890f0 7742 int pass;
951fd09b 7743
3cbc1e5e 7744 if (!bfd_link_executable (info))
411e1bfb
AM
7745 return TRUE;
7746
951fd09b 7747 htab = ppc_hash_table (info);
4dfe6ac6
NC
7748 if (htab == NULL)
7749 return FALSE;
7750
93b9bf16
AM
7751 htab->do_tls_opt = 1;
7752
663a1470
AM
7753 /* Make two passes over the relocs. On the first pass, mark toc
7754 entries involved with tls relocs, and check that tls relocs
7755 involved in setting up a tls_get_addr call are indeed followed by
7756 such a call. If they are not, we can't do any tls optimization.
7757 On the second pass twiddle tls_mask flags to notify
7758 relocate_section that optimization can be done, and adjust got
7759 and plt refcounts. */
7760 toc_ref = NULL;
7761 for (pass = 0; pass < 2; ++pass)
c72f2fb2 7762 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
663a1470
AM
7763 {
7764 Elf_Internal_Sym *locsyms = NULL;
7765 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7766
102890f0
AM
7767 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7768 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7769 {
7770 Elf_Internal_Rela *relstart, *rel, *relend;
663a1470 7771 bfd_boolean found_tls_get_addr_arg = 0;
411e1bfb 7772
102890f0
AM
7773 /* Read the relocations. */
7774 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7775 info->keep_memory);
7776 if (relstart == NULL)
2915c55b
JK
7777 {
7778 free (toc_ref);
7779 return FALSE;
7780 }
411e1bfb 7781
102890f0
AM
7782 relend = relstart + sec->reloc_count;
7783 for (rel = relstart; rel < relend; rel++)
7784 {
7785 enum elf_ppc64_reloc_type r_type;
7786 unsigned long r_symndx;
7787 struct elf_link_hash_entry *h;
7788 Elf_Internal_Sym *sym;
7789 asection *sym_sec;
f961d9dd 7790 unsigned char *tls_mask;
46e9995a 7791 unsigned int tls_set, tls_clear, tls_type = 0;
102890f0
AM
7792 bfd_vma value;
7793 bfd_boolean ok_tprel, is_local;
7794 long toc_ref_index = 0;
7795 int expecting_tls_get_addr = 0;
663a1470 7796 bfd_boolean ret = FALSE;
411e1bfb 7797
102890f0
AM
7798 r_symndx = ELF64_R_SYM (rel->r_info);
7799 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
7800 r_symndx, ibfd))
7801 {
7802 err_free_rel:
7803 if (elf_section_data (sec)->relocs != relstart)
7804 free (relstart);
7805 if (toc_ref != NULL)
7806 free (toc_ref);
7807 if (locsyms != NULL
0ffa91dd 7808 && (elf_symtab_hdr (ibfd).contents
102890f0
AM
7809 != (unsigned char *) locsyms))
7810 free (locsyms);
663a1470 7811 return ret;
102890f0 7812 }
411e1bfb 7813
102890f0
AM
7814 if (h != NULL)
7815 {
766bc656
AM
7816 if (h->root.type == bfd_link_hash_defined
7817 || h->root.type == bfd_link_hash_defweak)
7818 value = h->root.u.def.value;
7819 else if (h->root.type == bfd_link_hash_undefweak)
7820 value = 0;
7821 else
663a1470
AM
7822 {
7823 found_tls_get_addr_arg = 0;
7824 continue;
7825 }
102890f0
AM
7826 }
7827 else
7828 /* Symbols referenced by TLS relocs must be of type
7829 STT_TLS. So no need for .opd local sym adjust. */
7830 value = sym->st_value;
7831
7832 ok_tprel = FALSE;
f749f26e
AM
7833 is_local = SYMBOL_REFERENCES_LOCAL (info, h);
7834 if (is_local)
102890f0 7835 {
766bc656
AM
7836 if (h != NULL
7837 && h->root.type == bfd_link_hash_undefweak)
7838 ok_tprel = TRUE;
c27b8c2a
AM
7839 else if (sym_sec != NULL
7840 && sym_sec->output_section != NULL)
766bc656
AM
7841 {
7842 value += sym_sec->output_offset;
7843 value += sym_sec->output_section->vma;
0b147428 7844 value -= htab->elf.tls_sec->vma + TP_OFFSET;
c213164a
AM
7845 /* Note that even though the prefix insns
7846 allow a 1<<33 offset we use the same test
7847 as for addis;addi. There may be a mix of
7848 pcrel and non-pcrel code and the decision
7849 to optimise is per symbol, not per TLS
7850 sequence. */
0b147428 7851 ok_tprel = value + 0x80008000ULL < 1ULL << 32;
766bc656 7852 }
102890f0 7853 }
951fd09b 7854
102890f0 7855 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
7856 /* If this section has old-style __tls_get_addr calls
7857 without marker relocs, then check that each
7858 __tls_get_addr call reloc is preceded by a reloc
7859 that conceivably belongs to the __tls_get_addr arg
7860 setup insn. If we don't find matching arg setup
7861 relocs, don't do any tls optimization. */
7862 if (pass == 0
9737e8af 7863 && sec->nomark_tls_get_addr
663a1470
AM
7864 && h != NULL
7865 && (h == &htab->tls_get_addr->elf
7866 || h == &htab->tls_get_addr_fd->elf)
7867 && !found_tls_get_addr_arg
7868 && is_branch_reloc (r_type))
7869 {
25f53a85 7870 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
7871 "TLS optimization disabled\n"),
7872 ibfd, sec, rel->r_offset);
7873 ret = TRUE;
7874 goto err_free_rel;
7875 }
7876
7877 found_tls_get_addr_arg = 0;
102890f0
AM
7878 switch (r_type)
7879 {
7880 case R_PPC64_GOT_TLSLD16:
7881 case R_PPC64_GOT_TLSLD16_LO:
c213164a 7882 case R_PPC64_GOT_TLSLD34:
102890f0 7883 expecting_tls_get_addr = 1;
663a1470 7884 found_tls_get_addr_arg = 1;
1a0670f3 7885 /* Fall through. */
102890f0
AM
7886
7887 case R_PPC64_GOT_TLSLD16_HI:
7888 case R_PPC64_GOT_TLSLD16_HA:
7889 /* These relocs should never be against a symbol
7890 defined in a shared lib. Leave them alone if
7891 that turns out to be the case. */
7892 if (!is_local)
7893 continue;
411e1bfb 7894
102890f0 7895 /* LD -> LE */
411e1bfb 7896 tls_set = 0;
102890f0
AM
7897 tls_clear = TLS_LD;
7898 tls_type = TLS_TLS | TLS_LD;
7899 break;
411e1bfb 7900
102890f0
AM
7901 case R_PPC64_GOT_TLSGD16:
7902 case R_PPC64_GOT_TLSGD16_LO:
c213164a 7903 case R_PPC64_GOT_TLSGD34:
102890f0 7904 expecting_tls_get_addr = 1;
663a1470 7905 found_tls_get_addr_arg = 1;
1a0670f3 7906 /* Fall through. */
102890f0
AM
7907
7908 case R_PPC64_GOT_TLSGD16_HI:
7909 case R_PPC64_GOT_TLSGD16_HA:
7910 if (ok_tprel)
7911 /* GD -> LE */
411e1bfb 7912 tls_set = 0;
102890f0
AM
7913 else
7914 /* GD -> IE */
b00a0a86 7915 tls_set = TLS_TLS | TLS_GDIE;
102890f0
AM
7916 tls_clear = TLS_GD;
7917 tls_type = TLS_TLS | TLS_GD;
7918 break;
7919
c213164a 7920 case R_PPC64_GOT_TPREL34:
102890f0
AM
7921 case R_PPC64_GOT_TPREL16_DS:
7922 case R_PPC64_GOT_TPREL16_LO_DS:
7923 case R_PPC64_GOT_TPREL16_HI:
7924 case R_PPC64_GOT_TPREL16_HA:
7925 if (ok_tprel)
7926 {
7927 /* IE -> LE */
7928 tls_set = 0;
7929 tls_clear = TLS_TPREL;
7930 tls_type = TLS_TLS | TLS_TPREL;
7931 break;
7932 }
411e1bfb
AM
7933 continue;
7934
727fc41e 7935 case R_PPC64_TLSLD:
7d04a20a
AM
7936 if (!is_local)
7937 continue;
7938 /* Fall through. */
7939 case R_PPC64_TLSGD:
23cedd1d
AM
7940 if (rel + 1 < relend
7941 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
7942 {
7943 if (pass != 0
2cdcc330 7944 && (ELF64_R_TYPE (rel[1].r_info)
5663e321
AM
7945 != R_PPC64_PLTSEQ)
7946 && (ELF64_R_TYPE (rel[1].r_info)
7947 != R_PPC64_PLTSEQ_NOTOC))
23cedd1d
AM
7948 {
7949 r_symndx = ELF64_R_SYM (rel[1].r_info);
7950 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms,
2cdcc330 7951 r_symndx, ibfd))
23cedd1d
AM
7952 goto err_free_rel;
7953 if (h != NULL)
7954 {
7955 struct plt_entry *ent = NULL;
7956
7957 for (ent = h->plt.plist;
7958 ent != NULL;
7959 ent = ent->next)
7960 if (ent->addend == rel[1].r_addend)
7961 break;
7962
7963 if (ent != NULL
7964 && ent->plt.refcount > 0)
7965 ent->plt.refcount -= 1;
7966 }
7967 }
7968 continue;
7969 }
663a1470 7970 found_tls_get_addr_arg = 1;
1a0670f3 7971 /* Fall through. */
663a1470
AM
7972
7973 case R_PPC64_TLS:
7974 case R_PPC64_TOC16:
7975 case R_PPC64_TOC16_LO:
102890f0
AM
7976 if (sym_sec == NULL || sym_sec != toc)
7977 continue;
7978
7979 /* Mark this toc entry as referenced by a TLS
7980 code sequence. We can do that now in the
7981 case of R_PPC64_TLS, and after checking for
7982 tls_get_addr for the TOC16 relocs. */
7983 if (toc_ref == NULL)
2cdcc330
AM
7984 toc_ref
7985 = bfd_zmalloc (toc->output_section->rawsize / 8);
663a1470
AM
7986 if (toc_ref == NULL)
7987 goto err_free_rel;
7988
102890f0
AM
7989 if (h != NULL)
7990 value = h->root.u.def.value;
7991 else
7992 value = sym->st_value;
7993 value += rel->r_addend;
73242275
AM
7994 if (value % 8 != 0)
7995 continue;
7996 BFD_ASSERT (value < toc->size
7997 && toc->output_offset % 8 == 0);
663a1470 7998 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
7999 if (r_type == R_PPC64_TLS
8000 || r_type == R_PPC64_TLSGD
8001 || r_type == R_PPC64_TLSLD)
102890f0
AM
8002 {
8003 toc_ref[toc_ref_index] = 1;
8004 continue;
8005 }
8006
8007 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8008 continue;
8009
8010 tls_set = 0;
8011 tls_clear = 0;
8012 expecting_tls_get_addr = 2;
8013 break;
8014
8015 case R_PPC64_TPREL64:
8016 if (pass == 0
8017 || sec != toc
8018 || toc_ref == NULL
663a1470 8019 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8020 continue;
8021 if (ok_tprel)
8022 {
8023 /* IE -> LE */
8024 tls_set = TLS_EXPLICIT;
8025 tls_clear = TLS_TPREL;
8026 break;
8027 }
8028 continue;
8029
8030 case R_PPC64_DTPMOD64:
8031 if (pass == 0
8032 || sec != toc
8033 || toc_ref == NULL
663a1470 8034 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8035 continue;
8036 if (rel + 1 < relend
8037 && (rel[1].r_info
8038 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8039 && rel[1].r_offset == rel->r_offset + 8)
8040 {
8041 if (ok_tprel)
8042 /* GD -> LE */
8043 tls_set = TLS_EXPLICIT | TLS_GD;
8044 else
8045 /* GD -> IE */
b00a0a86 8046 tls_set = TLS_EXPLICIT | TLS_GD | TLS_GDIE;
102890f0
AM
8047 tls_clear = TLS_GD;
8048 }
8049 else
8050 {
8051 if (!is_local)
8052 continue;
8053
8054 /* LD -> LE */
8055 tls_set = TLS_EXPLICIT;
8056 tls_clear = TLS_LD;
8057 }
8058 break;
8059
93b9bf16
AM
8060 case R_PPC64_TPREL16_HA:
8061 if (pass == 0)
8062 {
8063 unsigned char buf[4];
8064 unsigned int insn;
8065 bfd_vma off = rel->r_offset & ~3;
8066 if (!bfd_get_section_contents (ibfd, sec, buf,
8067 off, 4))
8068 goto err_free_rel;
8069 insn = bfd_get_32 (ibfd, buf);
8070 /* addis rt,13,imm */
8071 if ((insn & ((0x3fu << 26) | 0x1f << 16))
8072 != ((15u << 26) | (13 << 16)))
8073 {
8074 /* xgettext:c-format */
8075 info->callbacks->minfo
8076 (_("%H: warning: %s unexpected insn %#x.\n"),
8077 ibfd, sec, off, "R_PPC64_TPREL16_HA", insn);
8078 htab->do_tls_opt = 0;
8079 }
8080 }
8081 continue;
8082
8083 case R_PPC64_TPREL16_HI:
8084 case R_PPC64_TPREL16_HIGH:
8085 case R_PPC64_TPREL16_HIGHA:
8086 case R_PPC64_TPREL16_HIGHER:
8087 case R_PPC64_TPREL16_HIGHERA:
8088 case R_PPC64_TPREL16_HIGHEST:
8089 case R_PPC64_TPREL16_HIGHESTA:
8090 /* These can all be used in sequences along with
8091 TPREL16_LO or TPREL16_LO_DS in ways we aren't
8092 able to verify easily. */
8093 htab->do_tls_opt = 0;
8094 continue;
8095
102890f0
AM
8096 default:
8097 continue;
8098 }
8099
8100 if (pass == 0)
8101 {
727fc41e 8102 if (!expecting_tls_get_addr
9737e8af 8103 || !sec->nomark_tls_get_addr)
102890f0
AM
8104 continue;
8105
3a71aa26
AM
8106 if (rel + 1 < relend
8107 && branch_reloc_hash_match (ibfd, rel + 1,
8108 htab->tls_get_addr,
8109 htab->tls_get_addr_fd))
102890f0 8110 {
3a71aa26 8111 if (expecting_tls_get_addr == 2)
102890f0 8112 {
3a71aa26 8113 /* Check for toc tls entries. */
f961d9dd 8114 unsigned char *toc_tls;
3a71aa26
AM
8115 int retval;
8116
8117 retval = get_tls_mask (&toc_tls, NULL, NULL,
8118 &locsyms,
8119 rel, ibfd);
8120 if (retval == 0)
8121 goto err_free_rel;
663a1470
AM
8122 if (toc_tls != NULL)
8123 {
37da22e5
AM
8124 if ((*toc_tls & TLS_TLS) != 0
8125 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0))
663a1470
AM
8126 found_tls_get_addr_arg = 1;
8127 if (retval > 1)
8128 toc_ref[toc_ref_index] = 1;
8129 }
102890f0 8130 }
3a71aa26 8131 continue;
102890f0
AM
8132 }
8133
102890f0
AM
8134 /* Uh oh, we didn't find the expected call. We
8135 could just mark this symbol to exclude it
8136 from tls optimization but it's safer to skip
663a1470 8137 the entire optimization. */
695344c0 8138 /* xgettext:c-format */
25f53a85 8139 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8140 "TLS optimization disabled\n"),
8141 ibfd, sec, rel->r_offset);
8142 ret = TRUE;
8143 goto err_free_rel;
102890f0
AM
8144 }
8145
37da22e5
AM
8146 /* If we don't have old-style __tls_get_addr calls
8147 without TLSGD/TLSLD marker relocs, and we haven't
8148 found a new-style __tls_get_addr call with a
8149 marker for this symbol, then we either have a
8150 broken object file or an -mlongcall style
8151 indirect call to __tls_get_addr without a marker.
8152 Disable optimization in this case. */
8153 if ((tls_clear & (TLS_GD | TLS_LD)) != 0
8154 && (tls_set & TLS_EXPLICIT) == 0
9737e8af 8155 && !sec->nomark_tls_get_addr
37da22e5
AM
8156 && ((*tls_mask & (TLS_TLS | TLS_MARK))
8157 != (TLS_TLS | TLS_MARK)))
8158 continue;
8159
7d04a20a 8160 if (expecting_tls_get_addr == 1 + !sec->nomark_tls_get_addr)
102890f0 8161 {
23cedd1d
AM
8162 struct plt_entry *ent = NULL;
8163
8164 if (htab->tls_get_addr != NULL)
8165 for (ent = htab->tls_get_addr->elf.plt.plist;
8166 ent != NULL;
8167 ent = ent->next)
8168 if (ent->addend == 0)
102890f0 8169 break;
411e1bfb 8170
23cedd1d
AM
8171 if (ent == NULL && htab->tls_get_addr_fd != NULL)
8172 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8173 ent != NULL;
8174 ent = ent->next)
8175 if (ent->addend == 0)
102890f0 8176 break;
23cedd1d
AM
8177
8178 if (ent != NULL
8179 && ent->plt.refcount > 0)
8180 ent->plt.refcount -= 1;
102890f0 8181 }
411e1bfb 8182
102890f0 8183 if (tls_clear == 0)
30038c59
AM
8184 continue;
8185
102890f0
AM
8186 if ((tls_set & TLS_EXPLICIT) == 0)
8187 {
8188 struct got_entry *ent;
411e1bfb 8189
102890f0
AM
8190 /* Adjust got entry for this reloc. */
8191 if (h != NULL)
8192 ent = h->got.glist;
8193 else
8194 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 8195
102890f0
AM
8196 for (; ent != NULL; ent = ent->next)
8197 if (ent->addend == rel->r_addend
8198 && ent->owner == ibfd
8199 && ent->tls_type == tls_type)
8200 break;
8201 if (ent == NULL)
8202 abort ();
411e1bfb 8203
102890f0
AM
8204 if (tls_set == 0)
8205 {
8206 /* We managed to get rid of a got entry. */
8207 if (ent->got.refcount > 0)
8208 ent->got.refcount -= 1;
8209 }
8210 }
8211 else
8212 {
8213 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8214 we'll lose one or two dyn relocs. */
8215 if (!dec_dynrel_count (rel->r_info, sec, info,
19e08130 8216 NULL, h, sym))
102890f0 8217 return FALSE;
411e1bfb 8218
102890f0
AM
8219 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8220 {
8221 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
19e08130 8222 NULL, h, sym))
102890f0
AM
8223 return FALSE;
8224 }
8225 }
411e1bfb 8226
46e9995a 8227 *tls_mask |= tls_set & 0xff;
102890f0
AM
8228 *tls_mask &= ~tls_clear;
8229 }
8c1d1bb8 8230
102890f0
AM
8231 if (elf_section_data (sec)->relocs != relstart)
8232 free (relstart);
8233 }
411e1bfb 8234
663a1470
AM
8235 if (locsyms != NULL
8236 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8237 {
8238 if (!info->keep_memory)
8239 free (locsyms);
8240 else
8241 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8242 }
8243 }
411e1bfb 8244
663a1470
AM
8245 if (toc_ref != NULL)
8246 free (toc_ref);
b34976b6 8247 return TRUE;
1e2f5b6e 8248}
b34976b6 8249
c5614fa4
AM
8250/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8251 the values of any global symbols in a toc section that has been
8252 edited. Globals in toc sections should be a rarity, so this function
8253 sets a flag if any are found in toc sections other than the one just
de194d85 8254 edited, so that further hash table traversals can be avoided. */
c5614fa4
AM
8255
8256struct adjust_toc_info
8257{
8258 asection *toc;
8259 unsigned long *skip;
8260 bfd_boolean global_toc_syms;
8261};
8262
ba761f19
AM
8263enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8264
c5614fa4
AM
8265static bfd_boolean
8266adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8267{
8268 struct ppc_link_hash_entry *eh;
8269 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 8270 unsigned long i;
c5614fa4 8271
c5614fa4
AM
8272 if (h->root.type != bfd_link_hash_defined
8273 && h->root.type != bfd_link_hash_defweak)
8274 return TRUE;
8275
8276 eh = (struct ppc_link_hash_entry *) h;
8277 if (eh->adjust_done)
8278 return TRUE;
8279
8280 if (eh->elf.root.u.def.section == toc_inf->toc)
8281 {
854b41e7
AM
8282 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8283 i = toc_inf->toc->rawsize >> 3;
c5614fa4 8284 else
854b41e7
AM
8285 i = eh->elf.root.u.def.value >> 3;
8286
ba761f19 8287 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4 8288 {
4eca0228 8289 _bfd_error_handler
854b41e7
AM
8290 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8291 do
8292 ++i;
ba761f19 8293 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 8294 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 8295 }
854b41e7
AM
8296
8297 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
8298 eh->adjust_done = 1;
8299 }
8300 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8301 toc_inf->global_toc_syms = TRUE;
8302
8303 return TRUE;
8304}
8305
39eeab25
AM
8306/* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8307 on a _LO variety toc/got reloc. */
560c8763
AM
8308
8309static bfd_boolean
39eeab25 8310ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
560c8763 8311{
2365f8d7
AM
8312 return ((insn & (0x3fu << 26)) == 12u << 26 /* addic */
8313 || (insn & (0x3fu << 26)) == 14u << 26 /* addi */
8314 || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */
8315 || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */
8316 || (insn & (0x3fu << 26)) == 36u << 26 /* stw */
8317 || (insn & (0x3fu << 26)) == 38u << 26 /* stb */
8318 || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */
8319 || (insn & (0x3fu << 26)) == 42u << 26 /* lha */
8320 || (insn & (0x3fu << 26)) == 44u << 26 /* sth */
8321 || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */
8322 || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */
8323 || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */
8324 || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */
8325 || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */
8326 || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */
8327 || (insn & (0x3fu << 26)) == 56u << 26 /* lq,lfq */
8328 || ((insn & (0x3fu << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
39eeab25
AM
8329 /* Exclude lfqu by testing reloc. If relocs are ever
8330 defined for the reduced D field in psq_lu then those
8331 will need testing too. */
8332 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8333 || ((insn & (0x3fu << 26)) == 58u << 26 /* ld,lwa */
39eeab25 8334 && (insn & 1) == 0)
2365f8d7
AM
8335 || (insn & (0x3fu << 26)) == 60u << 26 /* stfq */
8336 || ((insn & (0x3fu << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
39eeab25
AM
8337 /* Exclude stfqu. psq_stu as above for psq_lu. */
8338 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8339 || ((insn & (0x3fu << 26)) == 62u << 26 /* std,stq */
39eeab25 8340 && (insn & 1) == 0));
560c8763
AM
8341}
8342
4a421c53
AM
8343/* PCREL_OPT in one instance flags to the linker that a pair of insns:
8344 pld ra,symbol@got@pcrel
dd9b12c2 8345 load/store rt,off(ra)
4a421c53 8346 or
d4b87b1e 8347 pla ra,symbol@pcrel
dd9b12c2 8348 load/store rt,off(ra)
4a421c53 8349 may be translated to
dd9b12c2 8350 pload/pstore rt,symbol+off@pcrel
4a421c53
AM
8351 nop.
8352 This function returns true if the optimization is possible, placing
dd9b12c2 8353 the prefix insn in *PINSN1, a NOP in *PINSN2 and the offset in *POFF.
4a421c53
AM
8354
8355 On entry to this function, the linker has already determined that
d4b87b1e 8356 the pld can be replaced with pla: *PINSN1 is that pla insn,
4a421c53
AM
8357 while *PINSN2 is the second instruction. */
8358
8359static bfd_boolean
dd9b12c2 8360xlate_pcrel_opt (uint64_t *pinsn1, uint64_t *pinsn2, bfd_signed_vma *poff)
4a421c53 8361{
77486630
AM
8362 uint64_t insn1 = *pinsn1;
8363 uint64_t insn2 = *pinsn2;
dd9b12c2 8364 bfd_signed_vma off;
4a421c53 8365
77486630
AM
8366 if ((insn2 & (63ULL << 58)) == 1ULL << 58)
8367 {
8368 /* Check that regs match. */
8369 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
8370 return FALSE;
8371
8372 /* P8LS or PMLS form, non-pcrel. */
8373 if ((insn2 & (-1ULL << 50) & ~(1ULL << 56)) != (1ULL << 58))
8374 return FALSE;
8375
8376 *pinsn1 = (insn2 & ~(31 << 16) & ~0x3ffff0000ffffULL) | (1ULL << 52);
8377 *pinsn2 = PNOP;
8378 off = ((insn2 >> 16) & 0x3ffff0000ULL) | (insn2 & 0xffff);
8379 *poff = (off ^ 0x200000000ULL) - 0x200000000ULL;
8380 return TRUE;
8381 }
8382
8383 insn2 >>= 32;
8384
4a421c53 8385 /* Check that regs match. */
77486630 8386 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
4a421c53
AM
8387 return FALSE;
8388
8389 switch ((insn2 >> 26) & 63)
8390 {
8391 default:
8392 return FALSE;
8393
8394 case 32: /* lwz */
8395 case 34: /* lbz */
8396 case 36: /* stw */
8397 case 38: /* stb */
8398 case 40: /* lhz */
8399 case 42: /* lha */
8400 case 44: /* sth */
8401 case 48: /* lfs */
8402 case 50: /* lfd */
8403 case 52: /* stfs */
8404 case 54: /* stfd */
8405 /* These are the PMLS cases, where we just need to tack a prefix
dd9b12c2 8406 on the insn. */
77486630 8407 insn1 = ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
4a421c53 8408 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8409 off = insn2 & 0xffff;
4a421c53
AM
8410 break;
8411
8412 case 58: /* lwa, ld */
dd9b12c2 8413 if ((insn2 & 1) != 0)
4a421c53 8414 return FALSE;
77486630 8415 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8416 | (insn2 & 2 ? 41ULL << 26 : 57ULL << 26)
8417 | (insn2 & (31ULL << 21)));
dd9b12c2 8418 off = insn2 & 0xfffc;
4a421c53
AM
8419 break;
8420
8421 case 57: /* lxsd, lxssp */
dd9b12c2 8422 if ((insn2 & 3) < 2)
4a421c53 8423 return FALSE;
77486630 8424 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8425 | ((40ULL | (insn2 & 3)) << 26)
8426 | (insn2 & (31ULL << 21)));
dd9b12c2 8427 off = insn2 & 0xfffc;
4a421c53
AM
8428 break;
8429
8430 case 61: /* stxsd, stxssp, lxv, stxv */
8431 if ((insn2 & 3) == 0)
8432 return FALSE;
8433 else if ((insn2 & 3) >= 2)
8434 {
77486630 8435 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8436 | ((44ULL | (insn2 & 3)) << 26)
8437 | (insn2 & (31ULL << 21)));
dd9b12c2 8438 off = insn2 & 0xfffc;
4a421c53
AM
8439 }
8440 else
8441 {
77486630 8442 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8443 | ((50ULL | (insn2 & 4) | ((insn2 & 8) >> 3)) << 26)
8444 | (insn2 & (31ULL << 21)));
dd9b12c2 8445 off = insn2 & 0xfff0;
4a421c53
AM
8446 }
8447 break;
8448
8449 case 56: /* lq */
77486630 8450 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53 8451 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8452 off = insn2 & 0xffff;
4a421c53
AM
8453 break;
8454
8455 case 62: /* std, stq */
dd9b12c2 8456 if ((insn2 & 1) != 0)
4a421c53 8457 return FALSE;
77486630 8458 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8459 | ((insn2 & 2) == 0 ? 61ULL << 26 : 60ULL << 26)
8460 | (insn2 & (31ULL << 21)));
dd9b12c2 8461 off = insn2 & 0xfffc;
4a421c53
AM
8462 break;
8463 }
8464
77486630 8465 *pinsn1 = insn1;
4a421c53 8466 *pinsn2 = (uint64_t) NOP << 32;
dd9b12c2 8467 *poff = (off ^ 0x8000) - 0x8000;
4a421c53
AM
8468 return TRUE;
8469}
8470
c5614fa4
AM
8471/* Examine all relocs referencing .toc sections in order to remove
8472 unused .toc entries. */
8473
8474bfd_boolean
33c0ec9d 8475ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
8476{
8477 bfd *ibfd;
8478 struct adjust_toc_info toc_inf;
67f0cbdb 8479 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 8480
67f0cbdb 8481 htab->do_toc_opt = 1;
c5614fa4 8482 toc_inf.global_toc_syms = TRUE;
c72f2fb2 8483 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
c5614fa4
AM
8484 {
8485 asection *toc, *sec;
8486 Elf_Internal_Shdr *symtab_hdr;
8487 Elf_Internal_Sym *local_syms;
425b145b 8488 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
8489 unsigned long *skip, *drop;
8490 unsigned char *used;
8491 unsigned char *keep, last, some_unused;
8492
854b41e7
AM
8493 if (!is_ppc64_elf (ibfd))
8494 continue;
8495
c5614fa4
AM
8496 toc = bfd_get_section_by_name (ibfd, ".toc");
8497 if (toc == NULL
92b7a70f 8498 || toc->size == 0
dbaa2011
AM
8499 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8500 || discarded_section (toc))
c5614fa4
AM
8501 continue;
8502
425b145b 8503 toc_relocs = NULL;
c5614fa4 8504 local_syms = NULL;
0ffa91dd 8505 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
8506
8507 /* Look at sections dropped from the final link. */
8508 skip = NULL;
8509 relstart = NULL;
8510 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8511 {
8512 if (sec->reloc_count == 0
dbaa2011 8513 || !discarded_section (sec)
c5614fa4
AM
8514 || get_opd_info (sec)
8515 || (sec->flags & SEC_ALLOC) == 0
8516 || (sec->flags & SEC_DEBUGGING) != 0)
8517 continue;
8518
8519 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8520 if (relstart == NULL)
8521 goto error_ret;
8522
8523 /* Run through the relocs to see which toc entries might be
8524 unused. */
8525 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8526 {
8527 enum elf_ppc64_reloc_type r_type;
8528 unsigned long r_symndx;
8529 asection *sym_sec;
8530 struct elf_link_hash_entry *h;
8531 Elf_Internal_Sym *sym;
8532 bfd_vma val;
8533
8534 r_type = ELF64_R_TYPE (rel->r_info);
8535 switch (r_type)
8536 {
8537 default:
8538 continue;
8539
8540 case R_PPC64_TOC16:
8541 case R_PPC64_TOC16_LO:
8542 case R_PPC64_TOC16_HI:
8543 case R_PPC64_TOC16_HA:
8544 case R_PPC64_TOC16_DS:
8545 case R_PPC64_TOC16_LO_DS:
8546 break;
8547 }
8548
8549 r_symndx = ELF64_R_SYM (rel->r_info);
8550 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8551 r_symndx, ibfd))
8552 goto error_ret;
8553
8554 if (sym_sec != toc)
8555 continue;
8556
8557 if (h != NULL)
8558 val = h->root.u.def.value;
8559 else
8560 val = sym->st_value;
8561 val += rel->r_addend;
8562
8563 if (val >= toc->size)
8564 continue;
8565
8566 /* Anything in the toc ought to be aligned to 8 bytes.
8567 If not, don't mark as unused. */
8568 if (val & 7)
8569 continue;
8570
8571 if (skip == NULL)
8572 {
854b41e7 8573 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
8574 if (skip == NULL)
8575 goto error_ret;
8576 }
8577
ba761f19 8578 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
8579 }
8580
8581 if (elf_section_data (sec)->relocs != relstart)
8582 free (relstart);
8583 }
8584
ba761f19
AM
8585 /* For largetoc loads of address constants, we can convert
8586 . addis rx,2,addr@got@ha
8587 . ld ry,addr@got@l(rx)
8588 to
8589 . addis rx,2,addr@toc@ha
8590 . addi ry,rx,addr@toc@l
8591 when addr is within 2G of the toc pointer. This then means
8592 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 8593
ba761f19
AM
8594 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8595 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8596 && toc->reloc_count != 0)
8597 {
8598 /* Read toc relocs. */
425b145b
AM
8599 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8600 info->keep_memory);
8601 if (toc_relocs == NULL)
ba761f19
AM
8602 goto error_ret;
8603
425b145b 8604 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
8605 {
8606 enum elf_ppc64_reloc_type r_type;
8607 unsigned long r_symndx;
8608 asection *sym_sec;
8609 struct elf_link_hash_entry *h;
8610 Elf_Internal_Sym *sym;
8611 bfd_vma val, addr;
8612
8613 r_type = ELF64_R_TYPE (rel->r_info);
8614 if (r_type != R_PPC64_ADDR64)
8615 continue;
8616
8617 r_symndx = ELF64_R_SYM (rel->r_info);
8618 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8619 r_symndx, ibfd))
8620 goto error_ret;
8621
425b145b 8622 if (sym_sec == NULL
c27b8c2a 8623 || sym_sec->output_section == NULL
dbaa2011 8624 || discarded_section (sym_sec))
425b145b
AM
8625 continue;
8626
afe397ea 8627 if (!SYMBOL_REFERENCES_LOCAL (info, h))
ba761f19
AM
8628 continue;
8629
8630 if (h != NULL)
bddc25c9
AM
8631 {
8632 if (h->type == STT_GNU_IFUNC)
8633 continue;
8634 val = h->root.u.def.value;
8635 }
ba761f19 8636 else
bddc25c9
AM
8637 {
8638 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8639 continue;
8640 val = sym->st_value;
8641 }
ba761f19
AM
8642 val += rel->r_addend;
8643 val += sym_sec->output_section->vma + sym_sec->output_offset;
8644
8645 /* We don't yet know the exact toc pointer value, but we
8646 know it will be somewhere in the toc section. Don't
8647 optimize if the difference from any possible toc
8648 pointer is outside [ff..f80008000, 7fff7fff]. */
8649 addr = toc->output_section->vma + TOC_BASE_OFF;
8650 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8651 continue;
8652
8653 addr = toc->output_section->vma + toc->output_section->rawsize;
8654 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8655 continue;
8656
8657 if (skip == NULL)
8658 {
8659 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8660 if (skip == NULL)
8661 goto error_ret;
8662 }
8663
8664 skip[rel->r_offset >> 3]
425b145b 8665 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 8666 }
ba761f19
AM
8667 }
8668
c5614fa4
AM
8669 if (skip == NULL)
8670 continue;
8671
8672 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8673 if (used == NULL)
8674 {
8675 error_ret:
8676 if (local_syms != NULL
8677 && symtab_hdr->contents != (unsigned char *) local_syms)
8678 free (local_syms);
8679 if (sec != NULL
8680 && relstart != NULL
8681 && elf_section_data (sec)->relocs != relstart)
8682 free (relstart);
425b145b
AM
8683 if (toc_relocs != NULL
8684 && elf_section_data (toc)->relocs != toc_relocs)
8685 free (toc_relocs);
c5614fa4
AM
8686 if (skip != NULL)
8687 free (skip);
8688 return FALSE;
8689 }
8690
30038c59
AM
8691 /* Now check all kept sections that might reference the toc.
8692 Check the toc itself last. */
8693 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8694 : ibfd->sections);
c5614fa4 8695 sec != NULL;
c5614fa4 8696 sec = (sec == toc ? NULL
c5614fa4 8697 : sec->next == NULL ? toc
30038c59 8698 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
8699 : sec->next))
8700 {
8701 int repeat;
8702
8703 if (sec->reloc_count == 0
dbaa2011 8704 || discarded_section (sec)
c5614fa4
AM
8705 || get_opd_info (sec)
8706 || (sec->flags & SEC_ALLOC) == 0
8707 || (sec->flags & SEC_DEBUGGING) != 0)
8708 continue;
8709
854b41e7
AM
8710 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8711 info->keep_memory);
c5614fa4 8712 if (relstart == NULL)
2915c55b
JK
8713 {
8714 free (used);
8715 goto error_ret;
8716 }
c5614fa4
AM
8717
8718 /* Mark toc entries referenced as used. */
c5614fa4 8719 do
d4f1ee75
AM
8720 {
8721 repeat = 0;
8722 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8723 {
8724 enum elf_ppc64_reloc_type r_type;
8725 unsigned long r_symndx;
8726 asection *sym_sec;
8727 struct elf_link_hash_entry *h;
8728 Elf_Internal_Sym *sym;
8729 bfd_vma val;
98528052 8730
d4f1ee75 8731 r_type = ELF64_R_TYPE (rel->r_info);
d4f1ee75
AM
8732 switch (r_type)
8733 {
8734 case R_PPC64_TOC16:
8735 case R_PPC64_TOC16_LO:
8736 case R_PPC64_TOC16_HI:
8737 case R_PPC64_TOC16_HA:
8738 case R_PPC64_TOC16_DS:
8739 case R_PPC64_TOC16_LO_DS:
8740 /* In case we're taking addresses of toc entries. */
8741 case R_PPC64_ADDR64:
8742 break;
c5614fa4 8743
d4f1ee75
AM
8744 default:
8745 continue;
8746 }
c5614fa4 8747
d4f1ee75
AM
8748 r_symndx = ELF64_R_SYM (rel->r_info);
8749 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8750 r_symndx, ibfd))
8751 {
8752 free (used);
8753 goto error_ret;
8754 }
c5614fa4 8755
d4f1ee75
AM
8756 if (sym_sec != toc)
8757 continue;
c5614fa4 8758
d4f1ee75
AM
8759 if (h != NULL)
8760 val = h->root.u.def.value;
8761 else
8762 val = sym->st_value;
8763 val += rel->r_addend;
ba761f19 8764
d4f1ee75
AM
8765 if (val >= toc->size)
8766 continue;
ba761f19 8767
d4f1ee75
AM
8768 if ((skip[val >> 3] & can_optimize) != 0)
8769 {
8770 bfd_vma off;
8771 unsigned char opc;
8772
8773 switch (r_type)
8774 {
8775 case R_PPC64_TOC16_HA:
ba761f19 8776 break;
ba761f19 8777
d4f1ee75
AM
8778 case R_PPC64_TOC16_LO_DS:
8779 off = rel->r_offset;
8780 off += (bfd_big_endian (ibfd) ? -2 : 3);
8781 if (!bfd_get_section_contents (ibfd, sec, &opc,
8782 off, 1))
8783 {
8784 free (used);
8785 goto error_ret;
8786 }
8787 if ((opc & (0x3f << 2)) == (58u << 2))
8788 break;
1a0670f3 8789 /* Fall through. */
ba761f19 8790
d4f1ee75
AM
8791 default:
8792 /* Wrong sort of reloc, or not a ld. We may
8793 as well clear ref_from_discarded too. */
8794 skip[val >> 3] = 0;
8795 }
8796 }
8797
8798 if (sec != toc)
8799 used[val >> 3] = 1;
8800 /* For the toc section, we only mark as used if this
8801 entry itself isn't unused. */
8802 else if ((used[rel->r_offset >> 3]
8803 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
8804 && !used[val >> 3])
8805 {
8806 /* Do all the relocs again, to catch reference
8807 chains. */
8808 repeat = 1;
8809 used[val >> 3] = 1;
8810 }
8811 }
8812 }
c5614fa4 8813 while (repeat);
854b41e7
AM
8814
8815 if (elf_section_data (sec)->relocs != relstart)
8816 free (relstart);
c5614fa4
AM
8817 }
8818
8819 /* Merge the used and skip arrays. Assume that TOC
8820 doublewords not appearing as either used or unused belong
de194d85 8821 to an entry more than one doubleword in size. */
c5614fa4
AM
8822 for (drop = skip, keep = used, last = 0, some_unused = 0;
8823 drop < skip + (toc->size + 7) / 8;
8824 ++drop, ++keep)
8825 {
8826 if (*keep)
8827 {
ba761f19
AM
8828 *drop &= ~ref_from_discarded;
8829 if ((*drop & can_optimize) != 0)
8830 some_unused = 1;
c5614fa4
AM
8831 last = 0;
8832 }
b140b010 8833 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
8834 {
8835 some_unused = 1;
ba761f19 8836 last = ref_from_discarded;
c5614fa4
AM
8837 }
8838 else
8839 *drop = last;
8840 }
8841
8842 free (used);
8843
8844 if (some_unused)
8845 {
8846 bfd_byte *contents, *src;
8847 unsigned long off;
d62b3684 8848 Elf_Internal_Sym *sym;
ba761f19 8849 bfd_boolean local_toc_syms = FALSE;
c5614fa4
AM
8850
8851 /* Shuffle the toc contents, and at the same time convert the
8852 skip array from booleans into offsets. */
8853 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8854 goto error_ret;
8855
8856 elf_section_data (toc)->this_hdr.contents = contents;
8857
8858 for (src = contents, off = 0, drop = skip;
8859 src < contents + toc->size;
8860 src += 8, ++drop)
8861 {
ba761f19
AM
8862 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
8863 off += 8;
c5614fa4
AM
8864 else if (off != 0)
8865 {
8866 *drop = off;
8867 memcpy (src - off, src, 8);
8868 }
8869 }
854b41e7 8870 *drop = off;
c5614fa4
AM
8871 toc->rawsize = toc->size;
8872 toc->size = src - contents - off;
8873
ba761f19
AM
8874 /* Adjust addends for relocs against the toc section sym,
8875 and optimize any accesses we can. */
c5614fa4
AM
8876 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8877 {
8878 if (sec->reloc_count == 0
dbaa2011 8879 || discarded_section (sec))
c5614fa4
AM
8880 continue;
8881
8882 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 8883 info->keep_memory);
c5614fa4
AM
8884 if (relstart == NULL)
8885 goto error_ret;
8886
8887 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8888 {
8889 enum elf_ppc64_reloc_type r_type;
8890 unsigned long r_symndx;
8891 asection *sym_sec;
8892 struct elf_link_hash_entry *h;
854b41e7 8893 bfd_vma val;
c5614fa4
AM
8894
8895 r_type = ELF64_R_TYPE (rel->r_info);
8896 switch (r_type)
8897 {
8898 default:
8899 continue;
8900
8901 case R_PPC64_TOC16:
8902 case R_PPC64_TOC16_LO:
8903 case R_PPC64_TOC16_HI:
8904 case R_PPC64_TOC16_HA:
8905 case R_PPC64_TOC16_DS:
8906 case R_PPC64_TOC16_LO_DS:
8907 case R_PPC64_ADDR64:
8908 break;
8909 }
8910
8911 r_symndx = ELF64_R_SYM (rel->r_info);
8912 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8913 r_symndx, ibfd))
8914 goto error_ret;
8915
ba761f19 8916 if (sym_sec != toc)
c5614fa4
AM
8917 continue;
8918
ba761f19
AM
8919 if (h != NULL)
8920 val = h->root.u.def.value;
8921 else
8922 {
8923 val = sym->st_value;
8924 if (val != 0)
8925 local_toc_syms = TRUE;
8926 }
8927
8928 val += rel->r_addend;
854b41e7
AM
8929
8930 if (val > toc->rawsize)
8931 val = toc->rawsize;
ba761f19
AM
8932 else if ((skip[val >> 3] & ref_from_discarded) != 0)
8933 continue;
8934 else if ((skip[val >> 3] & can_optimize) != 0)
8935 {
8936 Elf_Internal_Rela *tocrel
425b145b 8937 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
8938 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
8939
8940 switch (r_type)
8941 {
8942 case R_PPC64_TOC16_HA:
8943 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
8944 break;
8945
8946 case R_PPC64_TOC16_LO_DS:
8947 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
8948 break;
8949
8950 default:
28942f62
AM
8951 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
8952 ppc_howto_init ();
b140b010 8953 info->callbacks->einfo
695344c0 8954 /* xgettext:c-format */
174d0a74 8955 (_("%H: %s references "
b140b010
AM
8956 "optimized away TOC entry\n"),
8957 ibfd, sec, rel->r_offset,
8958 ppc64_elf_howto_table[r_type]->name);
8959 bfd_set_error (bfd_error_bad_value);
8960 goto error_ret;
ba761f19
AM
8961 }
8962 rel->r_addend = tocrel->r_addend;
8963 elf_section_data (sec)->relocs = relstart;
8964 continue;
8965 }
8966
8967 if (h != NULL || sym->st_value != 0)
8968 continue;
854b41e7
AM
8969
8970 rel->r_addend -= skip[val >> 3];
8971 elf_section_data (sec)->relocs = relstart;
c5614fa4 8972 }
854b41e7
AM
8973
8974 if (elf_section_data (sec)->relocs != relstart)
8975 free (relstart);
c5614fa4
AM
8976 }
8977
8978 /* We shouldn't have local or global symbols defined in the TOC,
8979 but handle them anyway. */
df22d223
AM
8980 if (local_syms != NULL)
8981 for (sym = local_syms;
8982 sym < local_syms + symtab_hdr->sh_info;
8983 ++sym)
8984 if (sym->st_value != 0
8985 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
8986 {
8987 unsigned long i;
854b41e7 8988
df22d223
AM
8989 if (sym->st_value > toc->rawsize)
8990 i = toc->rawsize >> 3;
8991 else
8992 i = sym->st_value >> 3;
854b41e7 8993
df22d223
AM
8994 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
8995 {
8996 if (local_toc_syms)
4eca0228 8997 _bfd_error_handler
df22d223
AM
8998 (_("%s defined on removed toc entry"),
8999 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9000 do
9001 ++i;
9002 while ((skip[i] & (ref_from_discarded | can_optimize)));
9003 sym->st_value = (bfd_vma) i << 3;
9004 }
d62b3684 9005
df22d223
AM
9006 sym->st_value -= skip[i];
9007 symtab_hdr->contents = (unsigned char *) local_syms;
9008 }
c5614fa4 9009
854b41e7 9010 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
9011 if (toc_inf.global_toc_syms)
9012 {
9013 toc_inf.toc = toc;
9014 toc_inf.skip = skip;
9015 toc_inf.global_toc_syms = FALSE;
9016 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9017 &toc_inf);
9018 }
854b41e7
AM
9019
9020 if (toc->reloc_count != 0)
9021 {
d4730f92 9022 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
9023 Elf_Internal_Rela *wrel;
9024 bfd_size_type sz;
9025
854b41e7 9026 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
9027 if (toc_relocs == NULL)
9028 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9029 info->keep_memory);
9030 if (toc_relocs == NULL)
9031 goto error_ret;
9032
425b145b
AM
9033 wrel = toc_relocs;
9034 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9035 if ((skip[rel->r_offset >> 3]
9036 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
9037 {
9038 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9039 wrel->r_info = rel->r_info;
9040 wrel->r_addend = rel->r_addend;
9041 ++wrel;
9042 }
9043 else if (!dec_dynrel_count (rel->r_info, toc, info,
9044 &local_syms, NULL, NULL))
9045 goto error_ret;
9046
425b145b
AM
9047 elf_section_data (toc)->relocs = toc_relocs;
9048 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
9049 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9050 sz = rel_hdr->sh_entsize;
9051 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9052 }
c5614fa4 9053 }
28be611c
AM
9054 else if (toc_relocs != NULL
9055 && elf_section_data (toc)->relocs != toc_relocs)
425b145b 9056 free (toc_relocs);
c5614fa4
AM
9057
9058 if (local_syms != NULL
9059 && symtab_hdr->contents != (unsigned char *) local_syms)
9060 {
9061 if (!info->keep_memory)
9062 free (local_syms);
9063 else
9064 symtab_hdr->contents = (unsigned char *) local_syms;
9065 }
9066 free (skip);
9067 }
9068
066f4018 9069 /* Look for cases where we can change an indirect GOT access to
4a421c53
AM
9070 a GOT relative or PC relative access, possibly reducing the
9071 number of GOT entries. */
066f4018
AM
9072 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9073 {
9074 asection *sec;
9075 Elf_Internal_Shdr *symtab_hdr;
9076 Elf_Internal_Sym *local_syms;
9077 Elf_Internal_Rela *relstart, *rel;
9078 bfd_vma got;
9079
9080 if (!is_ppc64_elf (ibfd))
9081 continue;
9082
903b777d 9083 if (!ppc64_elf_tdata (ibfd)->has_optrel)
066f4018
AM
9084 continue;
9085
9086 sec = ppc64_elf_tdata (ibfd)->got;
903b777d
AM
9087 got = 0;
9088 if (sec != NULL)
9089 got = sec->output_section->vma + sec->output_offset + 0x8000;
066f4018
AM
9090
9091 local_syms = NULL;
9092 symtab_hdr = &elf_symtab_hdr (ibfd);
9093
9094 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9095 {
9096 if (sec->reloc_count == 0
903b777d 9097 || !ppc64_elf_section_data (sec)->has_optrel
066f4018
AM
9098 || discarded_section (sec))
9099 continue;
9100
9101 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9102 info->keep_memory);
9103 if (relstart == NULL)
9104 {
9105 got_error_ret:
9106 if (local_syms != NULL
9107 && symtab_hdr->contents != (unsigned char *) local_syms)
9108 free (local_syms);
9109 if (sec != NULL
9110 && relstart != NULL
9111 && elf_section_data (sec)->relocs != relstart)
9112 free (relstart);
9113 return FALSE;
9114 }
9115
9116 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9117 {
9118 enum elf_ppc64_reloc_type r_type;
9119 unsigned long r_symndx;
9120 Elf_Internal_Sym *sym;
9121 asection *sym_sec;
9122 struct elf_link_hash_entry *h;
9123 struct got_entry *ent;
133a1f60 9124 bfd_vma val, pc;
4a421c53 9125 unsigned char buf[8];
066f4018 9126 unsigned int insn;
903b777d 9127 enum {no_check, check_lo, check_ha} insn_check;
066f4018
AM
9128
9129 r_type = ELF64_R_TYPE (rel->r_info);
903b777d
AM
9130 switch (r_type)
9131 {
9132 default:
9133 insn_check = no_check;
9134 break;
9135
9136 case R_PPC64_PLT16_HA:
9137 case R_PPC64_GOT_TLSLD16_HA:
9138 case R_PPC64_GOT_TLSGD16_HA:
9139 case R_PPC64_GOT_TPREL16_HA:
9140 case R_PPC64_GOT_DTPREL16_HA:
9141 case R_PPC64_GOT16_HA:
9142 case R_PPC64_TOC16_HA:
9143 insn_check = check_ha;
9144 break;
9145
9146 case R_PPC64_PLT16_LO:
9147 case R_PPC64_PLT16_LO_DS:
9148 case R_PPC64_GOT_TLSLD16_LO:
9149 case R_PPC64_GOT_TLSGD16_LO:
9150 case R_PPC64_GOT_TPREL16_LO_DS:
9151 case R_PPC64_GOT_DTPREL16_LO_DS:
9152 case R_PPC64_GOT16_LO:
9153 case R_PPC64_GOT16_LO_DS:
9154 case R_PPC64_TOC16_LO:
9155 case R_PPC64_TOC16_LO_DS:
9156 insn_check = check_lo;
9157 break;
9158 }
9159
9160 if (insn_check != no_check)
9161 {
9162 bfd_vma off = rel->r_offset & ~3;
9163
9164 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9165 goto got_error_ret;
9166
9167 insn = bfd_get_32 (ibfd, buf);
9168 if (insn_check == check_lo
9169 ? !ok_lo_toc_insn (insn, r_type)
2365f8d7 9170 : ((insn & ((0x3fu << 26) | 0x1f << 16))
903b777d
AM
9171 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9172 {
9173 char str[12];
9174
9175 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9176 sprintf (str, "%#08x", insn);
9177 info->callbacks->einfo
9178 /* xgettext:c-format */
9179 (_("%H: got/toc optimization is not supported for"
9180 " %s instruction\n"),
9181 ibfd, sec, rel->r_offset & ~3, str);
9182 continue;
9183 }
9184 }
9185
066f4018
AM
9186 switch (r_type)
9187 {
bb22a418
AM
9188 /* Note that we don't delete GOT entries for
9189 R_PPC64_GOT16_DS since we'd need a lot more
9190 analysis. For starters, the preliminary layout is
9191 before the GOT, PLT, dynamic sections and stubs are
9192 laid out. Then we'd need to allow for changes in
9193 distance between sections caused by alignment. */
066f4018
AM
9194 default:
9195 continue;
9196
066f4018
AM
9197 case R_PPC64_GOT16_HA:
9198 case R_PPC64_GOT16_LO_DS:
4a421c53 9199 case R_PPC64_GOT_PCREL34:
066f4018
AM
9200 break;
9201 }
9202
9203 r_symndx = ELF64_R_SYM (rel->r_info);
9204 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9205 r_symndx, ibfd))
9206 goto got_error_ret;
9207
6d5554a6
AM
9208 if (sym_sec == NULL
9209 || sym_sec->output_section == NULL
9210 || discarded_section (sym_sec))
9211 continue;
9212
066f4018
AM
9213 if (!SYMBOL_REFERENCES_LOCAL (info, h))
9214 continue;
9215
9216 if (h != NULL)
9217 val = h->root.u.def.value;
9218 else
9219 val = sym->st_value;
133a1f60 9220 val += rel->r_addend;
066f4018
AM
9221 val += sym_sec->output_section->vma + sym_sec->output_offset;
9222
bb22a418
AM
9223/* Fudge factor to allow for the fact that the preliminary layout
9224 isn't exact. Reduce limits by this factor. */
9225#define LIMIT_ADJUST(LIMIT) ((LIMIT) - (LIMIT) / 16)
9226
066f4018
AM
9227 switch (r_type)
9228 {
9229 default:
9230 continue;
9231
066f4018 9232 case R_PPC64_GOT16_HA:
bb22a418
AM
9233 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9234 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9235 continue;
9236
9237 if (!bfd_get_section_contents (ibfd, sec, buf,
9238 rel->r_offset & ~3, 4))
9239 goto got_error_ret;
9240 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9241 if (((insn & ((0x3fu << 26) | 0x1f << 16))
066f4018
AM
9242 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9243 continue;
9244 break;
9245
9246 case R_PPC64_GOT16_LO_DS:
bb22a418
AM
9247 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9248 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9249 continue;
9250 if (!bfd_get_section_contents (ibfd, sec, buf,
9251 rel->r_offset & ~3, 4))
9252 goto got_error_ret;
9253 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9254 if ((insn & (0x3fu << 26 | 0x3)) != 58u << 26 /* ld */)
066f4018
AM
9255 continue;
9256 break;
4a421c53
AM
9257
9258 case R_PPC64_GOT_PCREL34:
9259 pc = rel->r_offset;
9260 pc += sec->output_section->vma + sec->output_offset;
bb22a418
AM
9261 if (val - pc + LIMIT_ADJUST (1ULL << 33)
9262 >= LIMIT_ADJUST (1ULL << 34))
4a421c53
AM
9263 continue;
9264 if (!bfd_get_section_contents (ibfd, sec, buf,
9265 rel->r_offset & ~3, 8))
9266 goto got_error_ret;
9267 insn = bfd_get_32 (ibfd, buf);
9268 if ((insn & (-1u << 18)) != ((1u << 26) | (1u << 20)))
9269 continue;
9270 insn = bfd_get_32 (ibfd, buf + 4);
2365f8d7 9271 if ((insn & (0x3fu << 26)) != 57u << 26)
4a421c53
AM
9272 continue;
9273 break;
066f4018 9274 }
bb22a418 9275#undef LIMIT_ADJUST
066f4018
AM
9276
9277 if (h != NULL)
9278 ent = h->got.glist;
9279 else
9280 {
9281 struct got_entry **local_got_ents = elf_local_got_ents (ibfd);
9282 ent = local_got_ents[r_symndx];
9283 }
9284 for (; ent != NULL; ent = ent->next)
133a1f60 9285 if (ent->addend == rel->r_addend
066f4018
AM
9286 && ent->owner == ibfd
9287 && ent->tls_type == 0)
9288 break;
9289 BFD_ASSERT (ent && ent->got.refcount > 0);
9290 ent->got.refcount -= 1;
9291 }
9292
9293 if (elf_section_data (sec)->relocs != relstart)
9294 free (relstart);
9295 }
9296
9297 if (local_syms != NULL
9298 && symtab_hdr->contents != (unsigned char *) local_syms)
9299 {
9300 if (!info->keep_memory)
9301 free (local_syms);
9302 else
9303 symtab_hdr->contents = (unsigned char *) local_syms;
9304 }
9305 }
9306
c5614fa4
AM
9307 return TRUE;
9308}
9309
1bbe0902
AM
9310/* Return true iff input section I references the TOC using
9311 instructions limited to +/-32k offsets. */
9312
9313bfd_boolean
9314ppc64_elf_has_small_toc_reloc (asection *i)
9315{
9316 return (is_ppc64_elf (i->owner)
9317 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9318}
9319
927be08e
AM
9320/* Allocate space for one GOT entry. */
9321
9322static void
9323allocate_got (struct elf_link_hash_entry *h,
9324 struct bfd_link_info *info,
9325 struct got_entry *gent)
9326{
9327 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
9328 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9329 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9330 ? 16 : 8);
9331 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9332 ? 2 : 1) * sizeof (Elf64_External_Rela);
9333 asection *got = ppc64_elf_tdata (gent->owner)->got;
9334
9335 gent->got.offset = got->size;
9336 got->size += entsize;
9337
19e08130 9338 if (h->type == STT_GNU_IFUNC)
927be08e 9339 {
33e44f2e 9340 htab->elf.irelplt->size += rentsize;
19e08130 9341 htab->got_reli_size += rentsize;
927be08e 9342 }
f15d0b54 9343 else if (((bfd_link_pic (info)
f749f26e 9344 && !(gent->tls_type != 0
f15d0b54
AM
9345 && bfd_link_executable (info)
9346 && SYMBOL_REFERENCES_LOCAL (info, h)))
f0158f44
AM
9347 || (htab->elf.dynamic_sections_created
9348 && h->dynindx != -1
9349 && !SYMBOL_REFERENCES_LOCAL (info, h)))
21d68fcd 9350 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
927be08e 9351 {
19e08130 9352 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9353 relgot->size += rentsize;
927be08e
AM
9354 }
9355}
9356
7865406b
AM
9357/* This function merges got entries in the same toc group. */
9358
9359static void
9360merge_got_entries (struct got_entry **pent)
9361{
9362 struct got_entry *ent, *ent2;
9363
9364 for (ent = *pent; ent != NULL; ent = ent->next)
9365 if (!ent->is_indirect)
9366 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9367 if (!ent2->is_indirect
9368 && ent2->addend == ent->addend
9369 && ent2->tls_type == ent->tls_type
9370 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9371 {
9372 ent2->is_indirect = TRUE;
9373 ent2->got.ent = ent;
9374 }
9375}
9376
46434633 9377/* If H is undefined, make it dynamic if that makes sense. */
f0158f44
AM
9378
9379static bfd_boolean
46434633
AM
9380ensure_undef_dynamic (struct bfd_link_info *info,
9381 struct elf_link_hash_entry *h)
f0158f44
AM
9382{
9383 struct elf_link_hash_table *htab = elf_hash_table (info);
9384
9385 if (htab->dynamic_sections_created
46434633
AM
9386 && ((info->dynamic_undefined_weak != 0
9387 && h->root.type == bfd_link_hash_undefweak)
9388 || h->root.type == bfd_link_hash_undefined)
f0158f44
AM
9389 && h->dynindx == -1
9390 && !h->forced_local
9391 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9392 return bfd_elf_link_record_dynamic_symbol (info, h);
9393 return TRUE;
9394}
9395
65f38f15
AM
9396/* Allocate space in .plt, .got and associated reloc sections for
9397 dynamic relocs. */
5bd4f169 9398
b34976b6 9399static bfd_boolean
4ce794b7 9400allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9401{
65f38f15
AM
9402 struct bfd_link_info *info;
9403 struct ppc_link_hash_table *htab;
5bd4f169 9404 asection *s;
65f38f15 9405 struct ppc_link_hash_entry *eh;
0b8bcf0d 9406 struct got_entry **pgent, *gent;
5bd4f169 9407
e92d460e 9408 if (h->root.type == bfd_link_hash_indirect)
b34976b6 9409 return TRUE;
5bd4f169 9410
65f38f15
AM
9411 info = (struct bfd_link_info *) inf;
9412 htab = ppc_hash_table (info);
4dfe6ac6
NC
9413 if (htab == NULL)
9414 return FALSE;
5bd4f169 9415
951fd09b
AM
9416 eh = (struct ppc_link_hash_entry *) h;
9417 /* Run through the TLS GD got entries first if we're changing them
9418 to TPREL. */
b00a0a86 9419 if ((eh->tls_mask & (TLS_TLS | TLS_GDIE)) == (TLS_TLS | TLS_GDIE))
951fd09b
AM
9420 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9421 if (gent->got.refcount > 0
9422 && (gent->tls_type & TLS_GD) != 0)
9423 {
9424 /* This was a GD entry that has been converted to TPREL. If
9425 there happens to be a TPREL entry we can use that one. */
9426 struct got_entry *ent;
9427 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9428 if (ent->got.refcount > 0
9429 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9430 && ent->addend == gent->addend
9431 && ent->owner == gent->owner)
951fd09b
AM
9432 {
9433 gent->got.refcount = 0;
9434 break;
9435 }
9436
9437 /* If not, then we'll be using our own TPREL entry. */
9438 if (gent->got.refcount != 0)
9439 gent->tls_type = TLS_TLS | TLS_TPREL;
9440 }
9441
7865406b
AM
9442 /* Remove any list entry that won't generate a word in the GOT before
9443 we call merge_got_entries. Otherwise we risk merging to empty
9444 entries. */
0b8bcf0d
AM
9445 pgent = &h->got.glist;
9446 while ((gent = *pgent) != NULL)
411e1bfb 9447 if (gent->got.refcount > 0)
7865406b
AM
9448 {
9449 if ((gent->tls_type & TLS_LD) != 0
f749f26e 9450 && SYMBOL_REFERENCES_LOCAL (info, h))
7865406b
AM
9451 {
9452 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9453 *pgent = gent->next;
9454 }
9455 else
9456 pgent = &gent->next;
9457 }
9458 else
9459 *pgent = gent->next;
9460
9461 if (!htab->do_multi_toc)
9462 merge_got_entries (&h->got.glist);
9463
9464 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9465 if (!gent->is_indirect)
411e1bfb 9466 {
ec73ddcd
AM
9467 /* Ensure we catch all the cases where this symbol should
9468 be made dynamic. */
46434633 9469 if (!ensure_undef_dynamic (info, h))
f0158f44 9470 return FALSE;
65f38f15 9471
0c8d6e5c 9472 if (!is_ppc64_elf (gent->owner))
927be08e 9473 abort ();
0ffa91dd 9474
927be08e 9475 allocate_got (h, info, gent);
411e1bfb 9476 }
65f38f15 9477
954b63d4
AM
9478 /* If no dynamic sections we can't have dynamic relocs, except for
9479 IFUNCs which are handled even in static executables. */
8a2058b5
AM
9480 if (!htab->elf.dynamic_sections_created
9481 && h->type != STT_GNU_IFUNC)
9482 eh->dyn_relocs = NULL;
9483
529fe20e
AM
9484 /* Discard relocs on undefined symbols that must be local. */
9485 else if (h->root.type == bfd_link_hash_undefined
9486 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9487 eh->dyn_relocs = NULL;
9488
954b63d4
AM
9489 /* Also discard relocs on undefined weak syms with non-default
9490 visibility, or when dynamic_undefined_weak says so. */
21d68fcd 9491 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
954b63d4
AM
9492 eh->dyn_relocs = NULL;
9493
8a2058b5 9494 if (eh->dyn_relocs != NULL)
65f38f15 9495 {
8a2058b5
AM
9496 struct elf_dyn_relocs *p, **pp;
9497
57e7d118
AM
9498 /* In the shared -Bsymbolic case, discard space allocated for
9499 dynamic pc-relative relocs against symbols which turn out to
9500 be defined in regular objects. For the normal shared case,
9501 discard space for relocs that have become local due to symbol
9502 visibility changes. */
57e7d118 9503 if (bfd_link_pic (info))
65f38f15 9504 {
57e7d118
AM
9505 /* Relocs that use pc_count are those that appear on a call
9506 insn, or certain REL relocs (see must_be_dyn_reloc) that
9507 can be generated via assembly. We want calls to
9508 protected symbols to resolve directly to the function
9509 rather than going via the plt. If people want function
9510 pointer comparisons to work as expected then they should
9511 avoid writing weird assembly. */
9512 if (SYMBOL_CALLS_LOCAL (info, h))
9513 {
57e7d118
AM
9514 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9515 {
9516 p->count -= p->pc_count;
9517 p->pc_count = 0;
9518 if (p->count == 0)
9519 *pp = p->next;
9520 else
9521 pp = &p->next;
9522 }
9523 }
65f38f15 9524
954b63d4 9525 if (eh->dyn_relocs != NULL)
5bd4f169 9526 {
ec73ddcd
AM
9527 /* Ensure we catch all the cases where this symbol
9528 should be made dynamic. */
46434633 9529 if (!ensure_undef_dynamic (info, h))
f0158f44 9530 return FALSE;
5bd4f169 9531 }
65f38f15 9532 }
ec73ddcd
AM
9533
9534 /* For a fixed position executable, discard space for
9535 relocs against symbols which are not dynamic. */
9536 else if (h->type != STT_GNU_IFUNC)
57e7d118 9537 {
529fe20e
AM
9538 if (h->dynamic_adjusted
9539 && !h->def_regular
9540 && !ELF_COMMON_DEF_P (h))
f0158f44 9541 {
ec73ddcd
AM
9542 /* Ensure we catch all the cases where this symbol
9543 should be made dynamic. */
46434633 9544 if (!ensure_undef_dynamic (info, h))
f0158f44 9545 return FALSE;
dfbb6ac9 9546
ec73ddcd 9547 /* But if that didn't work out, discard dynamic relocs. */
f0158f44
AM
9548 if (h->dynindx == -1)
9549 eh->dyn_relocs = NULL;
9550 }
9551 else
8a2058b5 9552 eh->dyn_relocs = NULL;
57e7d118
AM
9553 }
9554
9555 /* Finally, allocate space. */
9556 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9557 {
9558 asection *sreloc = elf_section_data (p->sec)->sreloc;
9559 if (eh->elf.type == STT_GNU_IFUNC)
9560 sreloc = htab->elf.irelplt;
9561 sreloc->size += p->count * sizeof (Elf64_External_Rela);
dfbb6ac9 9562 }
65f38f15 9563 }
57e7d118 9564
2d7ad24e
AM
9565 /* We might need a PLT entry when the symbol
9566 a) is dynamic, or
9567 b) is an ifunc, or
9568 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
9569 d) has plt16 relocs and we are linking statically. */
9570 if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
9571 || h->type == STT_GNU_IFUNC
9572 || (h->needs_plt && h->dynamic_adjusted)
9573 || (h->needs_plt
9574 && h->def_regular
9575 && !htab->elf.dynamic_sections_created
3e04d765 9576 && !htab->can_convert_all_inline_plt
2d7ad24e
AM
9577 && (((struct ppc_link_hash_entry *) h)->tls_mask
9578 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
65f38f15 9579 {
57e7d118
AM
9580 struct plt_entry *pent;
9581 bfd_boolean doneone = FALSE;
9582 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9583 if (pent->plt.refcount > 0)
9584 {
9585 if (!htab->elf.dynamic_sections_created
9586 || h->dynindx == -1)
9587 {
2d7ad24e
AM
9588 if (h->type == STT_GNU_IFUNC)
9589 {
9590 s = htab->elf.iplt;
9591 pent->plt.offset = s->size;
9592 s->size += PLT_ENTRY_SIZE (htab);
9593 s = htab->elf.irelplt;
9594 }
9595 else
9596 {
9597 s = htab->pltlocal;
9598 pent->plt.offset = s->size;
9599 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
9600 s = bfd_link_pic (info) ? htab->relpltlocal : NULL;
9601 }
57e7d118
AM
9602 }
9603 else
9604 {
9605 /* If this is the first .plt entry, make room for the special
9606 first entry. */
9607 s = htab->elf.splt;
9608 if (s->size == 0)
9609 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
65f38f15 9610
57e7d118 9611 pent->plt.offset = s->size;
65f38f15 9612
57e7d118
AM
9613 /* Make room for this entry. */
9614 s->size += PLT_ENTRY_SIZE (htab);
65f38f15 9615
57e7d118
AM
9616 /* Make room for the .glink code. */
9617 s = htab->glink;
9618 if (s->size == 0)
9e390558 9619 s->size += GLINK_PLTRESOLVE_SIZE (htab);
57e7d118
AM
9620 if (htab->opd_abi)
9621 {
9622 /* We need bigger stubs past index 32767. */
9e390558 9623 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4)
57e7d118
AM
9624 s->size += 4;
9625 s->size += 2*4;
9626 }
9627 else
9628 s->size += 4;
65f38f15 9629
57e7d118
AM
9630 /* We also need to make an entry in the .rela.plt section. */
9631 s = htab->elf.srelplt;
9632 }
2d7ad24e
AM
9633 if (s != NULL)
9634 s->size += sizeof (Elf64_External_Rela);
57e7d118
AM
9635 doneone = TRUE;
9636 }
9637 else
9638 pent->plt.offset = (bfd_vma) -1;
9639 if (!doneone)
9640 {
9641 h->plt.plist = NULL;
9642 h->needs_plt = 0;
9643 }
65f38f15 9644 }
57e7d118 9645 else
65f38f15 9646 {
57e7d118
AM
9647 h->plt.plist = NULL;
9648 h->needs_plt = 0;
65f38f15
AM
9649 }
9650
b34976b6 9651 return TRUE;
65f38f15
AM
9652}
9653
9e390558
AM
9654#define PPC_LO(v) ((v) & 0xffff)
9655#define PPC_HI(v) (((v) >> 16) & 0xffff)
9656#define PPC_HA(v) PPC_HI ((v) + 0x8000)
04bdff6a
AM
9657#define D34(v) \
9658 ((((v) & 0x3ffff0000ULL) << 16) | (v & 0xffff))
9659#define HA34(v) ((v + (1ULL << 33)) >> 34)
9e390558 9660
a345bc8d
AM
9661/* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9662 to set up space for global entry stubs. These are put in glink,
9663 after the branch table. */
65f38f15 9664
b34976b6 9665static bfd_boolean
a345bc8d 9666size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
65f38f15 9667{
a345bc8d
AM
9668 struct bfd_link_info *info;
9669 struct ppc_link_hash_table *htab;
9670 struct plt_entry *pent;
9e390558 9671 asection *s, *plt;
65f38f15 9672
a345bc8d
AM
9673 if (h->root.type == bfd_link_hash_indirect)
9674 return TRUE;
65f38f15 9675
a345bc8d
AM
9676 if (!h->pointer_equality_needed)
9677 return TRUE;
65f38f15 9678
a345bc8d
AM
9679 if (h->def_regular)
9680 return TRUE;
65f38f15 9681
a345bc8d
AM
9682 info = inf;
9683 htab = ppc_hash_table (info);
9684 if (htab == NULL)
9685 return FALSE;
9686
9e390558
AM
9687 s = htab->global_entry;
9688 plt = htab->elf.splt;
a345bc8d
AM
9689 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9690 if (pent->plt.offset != (bfd_vma) -1
9691 && pent->addend == 0)
9692 {
afe397ea
AM
9693 /* For ELFv2, if this symbol is not defined in a regular file
9694 and we are not generating a shared library or pie, then we
9695 need to define the symbol in the executable on a call stub.
9696 This is to avoid text relocations. */
9e390558
AM
9697 bfd_vma off, stub_align, stub_off, stub_size;
9698 unsigned int align_power;
9699
9700 stub_size = 16;
9701 stub_off = s->size;
9702 if (htab->params->plt_stub_align >= 0)
9703 align_power = htab->params->plt_stub_align;
9704 else
9705 align_power = -htab->params->plt_stub_align;
9706 /* Setting section alignment is delayed until we know it is
9707 non-empty. Otherwise the .text output section will be
9708 aligned at least to plt_stub_align even when no global
9709 entry stubs are needed. */
9710 if (s->alignment_power < align_power)
9711 s->alignment_power = align_power;
9712 stub_align = (bfd_vma) 1 << align_power;
9713 if (htab->params->plt_stub_align >= 0
9714 || ((((stub_off + stub_size - 1) & -stub_align)
9715 - (stub_off & -stub_align))
9716 > ((stub_size - 1) & -stub_align)))
9717 stub_off = (stub_off + stub_align - 1) & -stub_align;
9718 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
9719 off -= stub_off + s->output_offset + s->output_section->vma;
9720 /* Note that for --plt-stub-align negative we have a possible
9721 dependency between stub offset and size. Break that
9722 dependency by assuming the max stub size when calculating
9723 the stub offset. */
9724 if (PPC_HA (off) == 0)
9725 stub_size -= 4;
8a2058b5 9726 h->root.type = bfd_link_hash_defined;
afe397ea 9727 h->root.u.def.section = s;
9e390558
AM
9728 h->root.u.def.value = stub_off;
9729 s->size = stub_off + stub_size;
a345bc8d
AM
9730 break;
9731 }
9732 return TRUE;
9733}
9734
9735/* Set DF_TEXTREL if we find any dynamic relocs that apply to
9736 read-only sections. */
9737
9738static bfd_boolean
98bbb1b8 9739maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
a345bc8d 9740{
98bbb1b8
AM
9741 asection *sec;
9742
a345bc8d
AM
9743 if (h->root.type == bfd_link_hash_indirect)
9744 return TRUE;
9745
98bbb1b8
AM
9746 sec = readonly_dynrelocs (h);
9747 if (sec != NULL)
a345bc8d 9748 {
98bbb1b8
AM
9749 struct bfd_link_info *info = (struct bfd_link_info *) inf;
9750
9751 info->flags |= DF_TEXTREL;
2cdcc330
AM
9752 info->callbacks->minfo (_("%pB: dynamic relocation against `%pT'"
9753 " in read-only section `%pA'\n"),
9754 sec->owner, h->root.root.string, sec);
a345bc8d
AM
9755
9756 /* Not an error, just cut short the traversal. */
9757 return FALSE;
65f38f15 9758 }
b34976b6 9759 return TRUE;
65f38f15
AM
9760}
9761
9762/* Set the sizes of the dynamic sections. */
9763
b34976b6 9764static bfd_boolean
ee67d69a 9765ppc64_elf_size_dynamic_sections (bfd *output_bfd,
4ce794b7 9766 struct bfd_link_info *info)
65f38f15
AM
9767{
9768 struct ppc_link_hash_table *htab;
9769 bfd *dynobj;
9770 asection *s;
b34976b6 9771 bfd_boolean relocs;
65f38f15 9772 bfd *ibfd;
7865406b 9773 struct got_entry *first_tlsld;
65f38f15
AM
9774
9775 htab = ppc_hash_table (info);
4dfe6ac6
NC
9776 if (htab == NULL)
9777 return FALSE;
9778
65f38f15
AM
9779 dynobj = htab->elf.dynobj;
9780 if (dynobj == NULL)
9781 abort ();
9782
9783 if (htab->elf.dynamic_sections_created)
9784 {
9785 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 9786 if (bfd_link_executable (info) && !info->nointerp)
65f38f15 9787 {
3d4d4302 9788 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
9789 if (s == NULL)
9790 abort ();
eea6121a 9791 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
9792 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9793 }
9794 }
9795
9796 /* Set up .got offsets for local syms, and space for local dynamic
9797 relocs. */
c72f2fb2 9798 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
65f38f15 9799 {
411e1bfb
AM
9800 struct got_entry **lgot_ents;
9801 struct got_entry **end_lgot_ents;
e054468f
AM
9802 struct plt_entry **local_plt;
9803 struct plt_entry **end_local_plt;
f961d9dd 9804 unsigned char *lgot_masks;
65f38f15
AM
9805 bfd_size_type locsymcount;
9806 Elf_Internal_Shdr *symtab_hdr;
65f38f15 9807
0c8d6e5c 9808 if (!is_ppc64_elf (ibfd))
65f38f15
AM
9809 continue;
9810
9811 for (s = ibfd->sections; s != NULL; s = s->next)
9812 {
19e08130 9813 struct ppc_dyn_relocs *p;
65f38f15 9814
6edfbbad 9815 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 9816 {
ec338859
AM
9817 if (!bfd_is_abs_section (p->sec)
9818 && bfd_is_abs_section (p->sec->output_section))
9819 {
9820 /* Input section has been discarded, either because
9821 it is a copy of a linkonce section or due to
9822 linker script /DISCARD/, so we'll be discarding
9823 the relocs too. */
9824 }
248866a8 9825 else if (p->count != 0)
ec338859 9826 {
19e08130
AM
9827 asection *srel = elf_section_data (p->sec)->sreloc;
9828 if (p->ifunc)
33e44f2e 9829 srel = htab->elf.irelplt;
eea6121a 9830 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
9831 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9832 info->flags |= DF_TEXTREL;
ec338859 9833 }
65f38f15
AM
9834 }
9835 }
9836
411e1bfb
AM
9837 lgot_ents = elf_local_got_ents (ibfd);
9838 if (!lgot_ents)
65f38f15
AM
9839 continue;
9840
0ffa91dd 9841 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 9842 locsymcount = symtab_hdr->sh_info;
411e1bfb 9843 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
9844 local_plt = (struct plt_entry **) end_lgot_ents;
9845 end_local_plt = local_plt + locsymcount;
f961d9dd 9846 lgot_masks = (unsigned char *) end_local_plt;
e717da7e 9847 s = ppc64_elf_tdata (ibfd)->got;
e7b938ca 9848 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 9849 {
0b8bcf0d 9850 struct got_entry **pent, *ent;
411e1bfb 9851
0b8bcf0d
AM
9852 pent = lgot_ents;
9853 while ((ent = *pent) != NULL)
411e1bfb
AM
9854 if (ent->got.refcount > 0)
9855 {
e7b938ca 9856 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 9857 {
927be08e 9858 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 9859 *pent = ent->next;
411e1bfb
AM
9860 }
9861 else
9862 {
19e08130
AM
9863 unsigned int ent_size = 8;
9864 unsigned int rel_size = sizeof (Elf64_External_Rela);
9865
eea6121a 9866 ent->got.offset = s->size;
e7b938ca 9867 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 9868 {
19e08130
AM
9869 ent_size *= 2;
9870 rel_size *= 2;
9871 }
9872 s->size += ent_size;
37da22e5 9873 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 9874 {
33e44f2e 9875 htab->elf.irelplt->size += rel_size;
19e08130
AM
9876 htab->got_reli_size += rel_size;
9877 }
93370e8e
AM
9878 else if (bfd_link_pic (info)
9879 && !(ent->tls_type != 0
9880 && bfd_link_executable (info)))
19e08130
AM
9881 {
9882 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9883 srel->size += rel_size;
927be08e 9884 }
0b8bcf0d 9885 pent = &ent->next;
411e1bfb
AM
9886 }
9887 }
9888 else
0b8bcf0d 9889 *pent = ent->next;
65f38f15 9890 }
e054468f 9891
2d7ad24e
AM
9892 /* Allocate space for plt calls to local syms. */
9893 lgot_masks = (unsigned char *) end_local_plt;
9894 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
e054468f
AM
9895 {
9896 struct plt_entry *ent;
9897
9898 for (ent = *local_plt; ent != NULL; ent = ent->next)
9899 if (ent->plt.refcount > 0)
9900 {
2d7ad24e
AM
9901 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
9902 {
9903 s = htab->elf.iplt;
9904 ent->plt.offset = s->size;
9905 s->size += PLT_ENTRY_SIZE (htab);
9906 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
9907 }
3e04d765
AM
9908 else if (htab->can_convert_all_inline_plt
9909 || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
2d7ad24e
AM
9910 ent->plt.offset = (bfd_vma) -1;
9911 else
9912 {
9913 s = htab->pltlocal;
9914 ent->plt.offset = s->size;
9915 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
9916 if (bfd_link_pic (info))
9917 htab->relpltlocal->size += sizeof (Elf64_External_Rela);
9918 }
e054468f
AM
9919 }
9920 else
9921 ent->plt.offset = (bfd_vma) -1;
9922 }
65f38f15
AM
9923 }
9924
9925 /* Allocate global sym .plt and .got entries, and space for global
9926 sym dynamic relocs. */
4ce794b7 9927 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
a345bc8d 9928
0e1862bb 9929 if (!htab->opd_abi && !bfd_link_pic (info))
a345bc8d 9930 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
65f38f15 9931
7865406b 9932 first_tlsld = NULL;
c72f2fb2 9933 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
102890f0 9934 {
7865406b
AM
9935 struct got_entry *ent;
9936
0c8d6e5c 9937 if (!is_ppc64_elf (ibfd))
102890f0
AM
9938 continue;
9939
7865406b
AM
9940 ent = ppc64_tlsld_got (ibfd);
9941 if (ent->got.refcount > 0)
102890f0 9942 {
7865406b 9943 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 9944 {
7865406b
AM
9945 ent->is_indirect = TRUE;
9946 ent->got.ent = first_tlsld;
9947 }
9948 else
9949 {
9950 if (first_tlsld == NULL)
9951 first_tlsld = ent;
9952 s = ppc64_elf_tdata (ibfd)->got;
9953 ent->got.offset = s->size;
9954 ent->owner = ibfd;
9955 s->size += 16;
f749f26e 9956 if (bfd_link_dll (info))
7865406b
AM
9957 {
9958 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9959 srel->size += sizeof (Elf64_External_Rela);
9960 }
102890f0
AM
9961 }
9962 }
9963 else
7865406b 9964 ent->got.offset = (bfd_vma) -1;
102890f0
AM
9965 }
9966
65f38f15
AM
9967 /* We now have determined the sizes of the various dynamic sections.
9968 Allocate memory for them. */
b34976b6 9969 relocs = FALSE;
65f38f15
AM
9970 for (s = dynobj->sections; s != NULL; s = s->next)
9971 {
9972 if ((s->flags & SEC_LINKER_CREATED) == 0)
9973 continue;
9974
4ce794b7 9975 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
9976 /* These haven't been allocated yet; don't strip. */
9977 continue;
33e44f2e
AM
9978 else if (s == htab->elf.sgot
9979 || s == htab->elf.splt
9980 || s == htab->elf.iplt
2d7ad24e 9981 || s == htab->pltlocal
c456f082 9982 || s == htab->glink
9e390558 9983 || s == htab->global_entry
5474d94f
AM
9984 || s == htab->elf.sdynbss
9985 || s == htab->elf.sdynrelro)
65f38f15
AM
9986 {
9987 /* Strip this section if we don't need it; see the
9988 comment below. */
5bd4f169 9989 }
58d180e8
AM
9990 else if (s == htab->glink_eh_frame)
9991 {
9992 if (!bfd_is_abs_section (s->output_section))
9993 /* Not sized yet. */
9994 continue;
9995 }
70cc837d 9996 else if (CONST_STRNEQ (s->name, ".rela"))
5bd4f169 9997 {
c456f082 9998 if (s->size != 0)
5bd4f169 9999 {
33e44f2e 10000 if (s != htab->elf.srelplt)
b34976b6 10001 relocs = TRUE;
5bd4f169
AM
10002
10003 /* We use the reloc_count field as a counter if we need
10004 to copy relocs into the output file. */
10005 s->reloc_count = 0;
10006 }
10007 }
65f38f15 10008 else
5bd4f169
AM
10009 {
10010 /* It's not one of our sections, so don't allocate space. */
10011 continue;
10012 }
10013
eea6121a 10014 if (s->size == 0)
5bd4f169 10015 {
c456f082
AM
10016 /* If we don't need this section, strip it from the
10017 output file. This is mostly to handle .rela.bss and
10018 .rela.plt. We must create both sections in
10019 create_dynamic_sections, because they must be created
10020 before the linker maps input sections to output
10021 sections. The linker does that before
10022 adjust_dynamic_symbol is called, and it is that
10023 function which decides whether anything needs to go
10024 into these sections. */
8423293d 10025 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
10026 continue;
10027 }
10028
06bcf541
AM
10029 if (bfd_is_abs_section (s->output_section))
10030 _bfd_error_handler (_("warning: discarding dynamic section %s"),
10031 s->name);
10032
c456f082 10033 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
10034 continue;
10035
65f38f15
AM
10036 /* Allocate memory for the section contents. We use bfd_zalloc
10037 here in case unused entries are not reclaimed before the
10038 section's contents are written out. This should not happen,
411e1bfb
AM
10039 but this way if it does we get a R_PPC64_NONE reloc in .rela
10040 sections instead of garbage.
10041 We also rely on the section contents being zero when writing
5474d94f 10042 the GOT and .dynrelro. */
eea6121a 10043 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 10044 if (s->contents == NULL)
b34976b6 10045 return FALSE;
5bd4f169
AM
10046 }
10047
c72f2fb2 10048 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
e717da7e 10049 {
0c8d6e5c 10050 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
10051 continue;
10052
e717da7e 10053 s = ppc64_elf_tdata (ibfd)->got;
33e44f2e 10054 if (s != NULL && s != htab->elf.sgot)
e717da7e 10055 {
eea6121a 10056 if (s->size == 0)
8423293d 10057 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10058 else
10059 {
eea6121a 10060 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10061 if (s->contents == NULL)
10062 return FALSE;
10063 }
10064 }
10065 s = ppc64_elf_tdata (ibfd)->relgot;
10066 if (s != NULL)
10067 {
eea6121a 10068 if (s->size == 0)
8423293d 10069 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10070 else
10071 {
eea6121a 10072 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10073 if (s->contents == NULL)
10074 return FALSE;
10075 relocs = TRUE;
10076 s->reloc_count = 0;
10077 }
10078 }
10079 }
10080
e86ce104 10081 if (htab->elf.dynamic_sections_created)
5bd4f169 10082 {
e8910a83
AM
10083 bfd_boolean tls_opt;
10084
5bd4f169
AM
10085 /* Add some entries to the .dynamic section. We fill in the
10086 values later, in ppc64_elf_finish_dynamic_sections, but we
10087 must add the entries now so that we get the correct size for
10088 the .dynamic section. The DT_DEBUG entry is filled in by the
10089 dynamic linker and used by the debugger. */
dc810e39 10090#define add_dynamic_entry(TAG, VAL) \
5a580b3a 10091 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 10092
0e1862bb 10093 if (bfd_link_executable (info))
5bd4f169 10094 {
dc810e39 10095 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 10096 return FALSE;
5bd4f169
AM
10097 }
10098
33e44f2e 10099 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5bd4f169 10100 {
dc810e39
AM
10101 if (!add_dynamic_entry (DT_PLTGOT, 0)
10102 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10103 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
10104 || !add_dynamic_entry (DT_JMPREL, 0)
10105 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 10106 return FALSE;
5bd4f169
AM
10107 }
10108
ee67d69a 10109 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
10110 {
10111 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10112 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 10113 return FALSE;
19397422
AM
10114 }
10115
7c9cf415 10116 tls_opt = (htab->params->tls_get_addr_opt
e8910a83
AM
10117 && htab->tls_get_addr_fd != NULL
10118 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
10119 if (tls_opt || !htab->opd_abi)
10120 {
10121 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10122 return FALSE;
10123 }
a7f2871e 10124
5bd4f169
AM
10125 if (relocs)
10126 {
dc810e39
AM
10127 if (!add_dynamic_entry (DT_RELA, 0)
10128 || !add_dynamic_entry (DT_RELASZ, 0)
10129 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 10130 return FALSE;
5bd4f169 10131
65f38f15
AM
10132 /* If any dynamic relocs apply to a read-only section,
10133 then we need a DT_TEXTREL entry. */
248866a8 10134 if ((info->flags & DF_TEXTREL) == 0)
a345bc8d 10135 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
5bd4f169 10136
65f38f15 10137 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 10138 {
65f38f15 10139 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 10140 return FALSE;
5bd4f169 10141 }
5bd4f169 10142 }
5bd4f169 10143 }
65f38f15 10144#undef add_dynamic_entry
5bd4f169 10145
b34976b6 10146 return TRUE;
5bd4f169
AM
10147}
10148
a345bc8d
AM
10149/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10150
10151static bfd_boolean
10152ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10153{
10154 if (h->plt.plist != NULL
10155 && !h->def_regular
10156 && !h->pointer_equality_needed)
10157 return FALSE;
10158
10159 return _bfd_elf_hash_symbol (h);
10160}
10161
721956f4 10162/* Determine the type of stub needed, if any, for a call. */
5bd4f169 10163
4ce794b7
AM
10164static inline enum ppc_stub_type
10165ppc_type_of_stub (asection *input_sec,
10166 const Elf_Internal_Rela *rel,
10167 struct ppc_link_hash_entry **hash,
e054468f 10168 struct plt_entry **plt_ent,
6911b7dc
AM
10169 bfd_vma destination,
10170 unsigned long local_off)
5bd4f169 10171{
721956f4
AM
10172 struct ppc_link_hash_entry *h = *hash;
10173 bfd_vma location;
10174 bfd_vma branch_offset;
10175 bfd_vma max_branch_offset;
4ce794b7 10176 enum elf_ppc64_reloc_type r_type;
5bd4f169 10177
721956f4
AM
10178 if (h != NULL)
10179 {
e054468f 10180 struct plt_entry *ent;
7fe2b9a6 10181 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
10182 if (h->oh != NULL
10183 && h->oh->is_func_descriptor)
7b8f6675
AM
10184 {
10185 fdh = ppc_follow_link (h->oh);
10186 *hash = fdh;
10187 }
8387904d 10188
e054468f
AM
10189 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10190 if (ent->addend == rel->r_addend
10191 && ent->plt.offset != (bfd_vma) -1)
10192 {
e054468f
AM
10193 *plt_ent = ent;
10194 return ppc_stub_plt_call;
10195 }
5bd4f169 10196
7fe2b9a6
AM
10197 /* Here, we know we don't have a plt entry. If we don't have a
10198 either a defined function descriptor or a defined entry symbol
10199 in a regular object file, then it is pointless trying to make
10200 any other type of stub. */
854b41e7
AM
10201 if (!is_static_defined (&fdh->elf)
10202 && !is_static_defined (&h->elf))
721956f4 10203 return ppc_stub_none;
5d1634d7 10204 }
e054468f
AM
10205 else if (elf_local_got_ents (input_sec->owner) != NULL)
10206 {
10207 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10208 struct plt_entry **local_plt = (struct plt_entry **)
10209 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10210 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10211
10212 if (local_plt[r_symndx] != NULL)
10213 {
10214 struct plt_entry *ent;
10215
10216 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10217 if (ent->addend == rel->r_addend
10218 && ent->plt.offset != (bfd_vma) -1)
10219 {
10220 *plt_ent = ent;
10221 return ppc_stub_plt_call;
10222 }
10223 }
10224 }
5d1634d7 10225
721956f4
AM
10226 /* Determine where the call point is. */
10227 location = (input_sec->output_offset
10228 + input_sec->output_section->vma
10229 + rel->r_offset);
5d1634d7 10230
721956f4
AM
10231 branch_offset = destination - location;
10232 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 10233
721956f4
AM
10234 /* Determine if a long branch stub is needed. */
10235 max_branch_offset = 1 << 25;
23cedd1d
AM
10236 if (r_type == R_PPC64_REL14
10237 || r_type == R_PPC64_REL14_BRTAKEN
10238 || r_type == R_PPC64_REL14_BRNTAKEN)
721956f4 10239 max_branch_offset = 1 << 15;
5d1634d7 10240
6911b7dc 10241 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
721956f4
AM
10242 /* We need a stub. Figure out whether a long_branch or plt_branch
10243 is needed later. */
10244 return ppc_stub_long_branch;
5d1634d7 10245
721956f4 10246 return ppc_stub_none;
5d1634d7
AM
10247}
10248
f891966f
AM
10249/* Gets the address of a label (1:) in r11 and builds an offset in r12,
10250 then adds it to r11 (LOAD false) or loads r12 from r11+r12 (LOAD true).
10251 . mflr %r12
10252 . bcl 20,31,1f
10253 .1: mflr %r11
10254 . mtlr %r12
05d0e962 10255 . lis %r12,xxx-1b@highest
f891966f 10256 . ori %r12,%r12,xxx-1b@higher
05d0e962 10257 . sldi %r12,%r12,32
f891966f 10258 . oris %r12,%r12,xxx-1b@high
05d0e962 10259 . ori %r12,%r12,xxx-1b@l
f891966f 10260 . add/ldx %r12,%r11,%r12 */
05d0e962
AM
10261
10262static bfd_byte *
10263build_offset (bfd *abfd, bfd_byte *p, bfd_vma off, bfd_boolean load)
10264{
f891966f
AM
10265 bfd_put_32 (abfd, MFLR_R12, p);
10266 p += 4;
10267 bfd_put_32 (abfd, BCL_20_31, p);
10268 p += 4;
10269 bfd_put_32 (abfd, MFLR_R11, p);
10270 p += 4;
10271 bfd_put_32 (abfd, MTLR_R12, p);
10272 p += 4;
05d0e962
AM
10273 if (off + 0x8000 < 0x10000)
10274 {
10275 if (load)
10276 bfd_put_32 (abfd, LD_R12_0R11 + PPC_LO (off), p);
10277 else
10278 bfd_put_32 (abfd, ADDI_R12_R11 + PPC_LO (off), p);
10279 p += 4;
10280 }
10281 else if (off + 0x80008000ULL < 0x100000000ULL)
10282 {
10283 bfd_put_32 (abfd, ADDIS_R12_R11 + PPC_HA (off), p);
10284 p += 4;
10285 if (load)
10286 bfd_put_32 (abfd, LD_R12_0R12 + PPC_LO (off), p);
10287 else
10288 bfd_put_32 (abfd, ADDI_R12_R12 + PPC_LO (off), p);
10289 p += 4;
10290 }
10291 else
10292 {
10293 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10294 {
10295 bfd_put_32 (abfd, LI_R12_0 + ((off >> 32) & 0xffff), p);
10296 p += 4;
10297 }
10298 else
10299 {
10300 bfd_put_32 (abfd, LIS_R12 + ((off >> 48) & 0xffff), p);
10301 p += 4;
10302 if (((off >> 32) & 0xffff) != 0)
10303 {
10304 bfd_put_32 (abfd, ORI_R12_R12_0 + ((off >> 32) & 0xffff), p);
10305 p += 4;
10306 }
10307 }
10308 if (((off >> 32) & 0xffffffffULL) != 0)
10309 {
10310 bfd_put_32 (abfd, SLDI_R12_R12_32, p);
10311 p += 4;
10312 }
10313 if (PPC_HI (off) != 0)
10314 {
10315 bfd_put_32 (abfd, ORIS_R12_R12_0 + PPC_HI (off), p);
10316 p += 4;
10317 }
10318 if (PPC_LO (off) != 0)
10319 {
10320 bfd_put_32 (abfd, ORI_R12_R12_0 + PPC_LO (off), p);
10321 p += 4;
10322 }
10323 if (load)
10324 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10325 else
10326 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10327 p += 4;
10328 }
10329 return p;
10330}
10331
10332static unsigned int
10333size_offset (bfd_vma off)
10334{
10335 unsigned int size;
10336 if (off + 0x8000 < 0x10000)
10337 size = 4;
10338 else if (off + 0x80008000ULL < 0x100000000ULL)
10339 size = 8;
10340 else
10341 {
10342 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10343 size = 4;
10344 else
10345 {
10346 size = 4;
10347 if (((off >> 32) & 0xffff) != 0)
10348 size += 4;
10349 }
10350 if (((off >> 32) & 0xffffffffULL) != 0)
10351 size += 4;
10352 if (PPC_HI (off) != 0)
10353 size += 4;
10354 if (PPC_LO (off) != 0)
10355 size += 4;
10356 size += 4;
10357 }
f891966f 10358 return size + 16;
05d0e962
AM
10359}
10360
3d58e1fc
AM
10361static unsigned int
10362num_relocs_for_offset (bfd_vma off)
10363{
10364 unsigned int num_rel;
10365 if (off + 0x8000 < 0x10000)
10366 num_rel = 1;
10367 else if (off + 0x80008000ULL < 0x100000000ULL)
10368 num_rel = 2;
10369 else
10370 {
10371 num_rel = 1;
10372 if (off + 0x800000000000ULL >= 0x1000000000000ULL
10373 && ((off >> 32) & 0xffff) != 0)
10374 num_rel += 1;
10375 if (PPC_HI (off) != 0)
10376 num_rel += 1;
10377 if (PPC_LO (off) != 0)
10378 num_rel += 1;
10379 }
10380 return num_rel;
10381}
10382
10383static Elf_Internal_Rela *
10384emit_relocs_for_offset (struct bfd_link_info *info, Elf_Internal_Rela *r,
10385 bfd_vma roff, bfd_vma targ, bfd_vma off)
10386{
10387 bfd_vma relative_targ = targ - (roff - 8);
10388 if (bfd_big_endian (info->output_bfd))
10389 roff += 2;
10390 r->r_offset = roff;
10391 r->r_addend = relative_targ + roff;
10392 if (off + 0x8000 < 0x10000)
10393 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16);
10394 else if (off + 0x80008000ULL < 0x100000000ULL)
10395 {
10396 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HA);
10397 ++r;
10398 roff += 4;
10399 r->r_offset = roff;
10400 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10401 r->r_addend = relative_targ + roff;
10402 }
10403 else
10404 {
10405 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10406 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10407 else
10408 {
10409 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHEST);
10410 if (((off >> 32) & 0xffff) != 0)
10411 {
10412 ++r;
10413 roff += 4;
10414 r->r_offset = roff;
10415 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10416 r->r_addend = relative_targ + roff;
10417 }
10418 }
10419 if (((off >> 32) & 0xffffffffULL) != 0)
10420 roff += 4;
10421 if (PPC_HI (off) != 0)
10422 {
10423 ++r;
10424 roff += 4;
10425 r->r_offset = roff;
10426 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGH);
10427 r->r_addend = relative_targ + roff;
10428 }
10429 if (PPC_LO (off) != 0)
10430 {
10431 ++r;
10432 roff += 4;
10433 r->r_offset = roff;
10434 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10435 r->r_addend = relative_targ + roff;
10436 }
10437 }
10438 return r;
10439}
10440
04bdff6a
AM
10441static bfd_byte *
10442build_powerxx_offset (bfd *abfd, bfd_byte *p, bfd_vma off, int odd,
10443 bfd_boolean load)
10444{
10445 uint64_t insn;
10446 if (off - odd + (1ULL << 33) < 1ULL << 34)
10447 {
10448 off -= odd;
10449 if (odd)
10450 {
10451 bfd_put_32 (abfd, NOP, p);
10452 p += 4;
10453 }
10454 if (load)
10455 insn = PLD_R12_PC;
10456 else
10457 insn = PADDI_R12_PC;
10458 insn |= D34 (off);
10459 bfd_put_32 (abfd, insn >> 32, p);
10460 p += 4;
10461 bfd_put_32 (abfd, insn, p);
10462 }
10463 /* The minimum value for paddi is -0x200000000. The minimum value
10464 for li is -0x8000, which when shifted by 34 and added gives a
10465 minimum value of -0x2000200000000. The maximum value is
10466 0x1ffffffff+0x7fff<<34 which is 0x2000200000000-1. */
10467 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10468 {
10469 off -= 8 - odd;
10470 bfd_put_32 (abfd, LI_R11_0 | (HA34 (off) & 0xffff), p);
10471 p += 4;
10472 if (!odd)
10473 {
10474 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10475 p += 4;
10476 }
10477 insn = PADDI_R12_PC | D34 (off);
10478 bfd_put_32 (abfd, insn >> 32, p);
10479 p += 4;
10480 bfd_put_32 (abfd, insn, p);
10481 p += 4;
10482 if (odd)
10483 {
10484 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10485 p += 4;
10486 }
10487 if (load)
10488 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10489 else
10490 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10491 }
10492 else
10493 {
10494 off -= odd + 8;
10495 bfd_put_32 (abfd, LIS_R11 | ((HA34 (off) >> 16) & 0x3fff), p);
10496 p += 4;
10497 bfd_put_32 (abfd, ORI_R11_R11_0 | (HA34 (off) & 0xffff), p);
10498 p += 4;
10499 if (odd)
10500 {
10501 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10502 p += 4;
10503 }
10504 insn = PADDI_R12_PC | D34 (off);
10505 bfd_put_32 (abfd, insn >> 32, p);
10506 p += 4;
10507 bfd_put_32 (abfd, insn, p);
10508 p += 4;
10509 if (!odd)
10510 {
10511 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10512 p += 4;
10513 }
10514 if (load)
10515 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10516 else
10517 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10518 }
10519 p += 4;
10520 return p;
10521}
10522
10523static unsigned int
10524size_powerxx_offset (bfd_vma off, int odd)
10525{
10526 if (off - odd + (1ULL << 33) < 1ULL << 34)
10527 return odd + 8;
10528 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10529 return 20;
10530 else
10531 return 24;
10532}
10533
10534static unsigned int
10535num_relocs_for_powerxx_offset (bfd_vma off, int odd)
10536{
10537 if (off - odd + (1ULL << 33) < 1ULL << 34)
10538 return 1;
10539 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10540 return 2;
10541 else
10542 return 3;
10543}
10544
10545static Elf_Internal_Rela *
10546emit_relocs_for_powerxx_offset (struct bfd_link_info *info,
10547 Elf_Internal_Rela *r, bfd_vma roff,
10548 bfd_vma targ, bfd_vma off, int odd)
10549{
10550 if (off - odd + (1ULL << 33) < 1ULL << 34)
10551 roff += odd;
10552 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10553 {
10554 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10555 r->r_offset = roff + d_offset;
10556 r->r_addend = targ + 8 - odd - d_offset;
10557 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10558 ++r;
10559 roff += 8 - odd;
10560 }
10561 else
10562 {
10563 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10564 r->r_offset = roff + d_offset;
10565 r->r_addend = targ + 8 + odd - d_offset;
10566 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHESTA34);
10567 ++r;
10568 roff += 4;
10569 r->r_offset = roff + d_offset;
10570 r->r_addend = targ + 4 + odd - d_offset;
10571 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10572 ++r;
10573 roff += 4 + odd;
10574 }
10575 r->r_offset = roff;
10576 r->r_addend = targ;
10577 r->r_info = ELF64_R_INFO (0, R_PPC64_PCREL34);
10578 return r;
10579}
10580
df136d64
AM
10581/* Emit .eh_frame opcode to advance pc by DELTA. */
10582
10583static bfd_byte *
10584eh_advance (bfd *abfd, bfd_byte *eh, unsigned int delta)
10585{
10586 delta /= 4;
10587 if (delta < 64)
10588 *eh++ = DW_CFA_advance_loc + delta;
10589 else if (delta < 256)
10590 {
10591 *eh++ = DW_CFA_advance_loc1;
10592 *eh++ = delta;
10593 }
10594 else if (delta < 65536)
10595 {
10596 *eh++ = DW_CFA_advance_loc2;
10597 bfd_put_16 (abfd, delta, eh);
10598 eh += 2;
10599 }
10600 else
10601 {
10602 *eh++ = DW_CFA_advance_loc4;
10603 bfd_put_32 (abfd, delta, eh);
10604 eh += 4;
10605 }
10606 return eh;
10607}
10608
10609/* Size of required .eh_frame opcode to advance pc by DELTA. */
10610
10611static unsigned int
10612eh_advance_size (unsigned int delta)
10613{
10614 if (delta < 64 * 4)
10615 /* DW_CFA_advance_loc+[1..63]. */
10616 return 1;
10617 if (delta < 256 * 4)
10618 /* DW_CFA_advance_loc1, byte. */
10619 return 2;
10620 if (delta < 65536 * 4)
10621 /* DW_CFA_advance_loc2, 2 bytes. */
10622 return 3;
10623 /* DW_CFA_advance_loc4, 4 bytes. */
10624 return 5;
10625}
10626
794e51c0
AM
10627/* With power7 weakly ordered memory model, it is possible for ld.so
10628 to update a plt entry in one thread and have another thread see a
10629 stale zero toc entry. To avoid this we need some sort of acquire
10630 barrier in the call stub. One solution is to make the load of the
10631 toc word seem to appear to depend on the load of the function entry
10632 word. Another solution is to test for r2 being zero, and branch to
10633 the appropriate glink entry if so.
10634
10635 . fake dep barrier compare
71a39c98
AM
10636 . ld 12,xxx(2) ld 12,xxx(2)
10637 . mtctr 12 mtctr 12
10638 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
10639 . add 2,2,11 cmpldi 2,0
10640 . ld 2,xxx+8(2) bnectr+
10641 . bctr b <glink_entry>
10642
10643 The solution involving the compare turns out to be faster, so
10644 that's what we use unless the branch won't reach. */
10645
10646#define ALWAYS_USE_FAKE_DEP 0
10647#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 10648
794e51c0
AM
10649static inline unsigned int
10650plt_stub_size (struct ppc_link_hash_table *htab,
10651 struct ppc_stub_hash_entry *stub_entry,
10652 bfd_vma off)
10653{
05d0e962 10654 unsigned size;
b9e5796b 10655
05d0e962
AM
10656 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
10657 {
04bdff6a
AM
10658 if (htab->powerxx_stubs)
10659 {
10660 bfd_vma start = (stub_entry->stub_offset
10661 + stub_entry->group->stub_sec->output_offset
10662 + stub_entry->group->stub_sec->output_section->vma);
10663 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10664 start += 4;
10665 size = 8 + size_powerxx_offset (off, start & 4);
10666 }
10667 else
10668 size = 8 + size_offset (off - 8);
05d0e962
AM
10669 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10670 size += 4;
10671 return size;
10672 }
10673
10674 size = 12;
b9e5796b
AM
10675 if (ALWAYS_EMIT_R2SAVE
10676 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10677 size += 4;
10678 if (PPC_HA (off) != 0)
794e51c0 10679 size += 4;
b9e5796b
AM
10680 if (htab->opd_abi)
10681 {
10682 size += 4;
e7d1c40c 10683 if (htab->params->plt_static_chain)
b9e5796b 10684 size += 4;
bd4d2eaa
AM
10685 if (htab->params->plt_thread_safe
10686 && htab->elf.dynamic_sections_created
10687 && stub_entry->h != NULL
10688 && stub_entry->h->elf.dynindx != -1)
b9e5796b 10689 size += 8;
e7d1c40c 10690 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
b9e5796b
AM
10691 size += 4;
10692 }
794e51c0
AM
10693 if (stub_entry->h != NULL
10694 && (stub_entry->h == htab->tls_get_addr_fd
10695 || stub_entry->h == htab->tls_get_addr)
7c9cf415 10696 && htab->params->tls_get_addr_opt)
f378ab09
AM
10697 {
10698 size += 7 * 4;
e81b4c93 10699 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
407aa07c 10700 size += 6 * 4;
f378ab09 10701 }
794e51c0
AM
10702 return size;
10703}
10704
2420fff6
AM
10705/* Depending on the sign of plt_stub_align:
10706 If positive, return the padding to align to a 2**plt_stub_align
10707 boundary.
10708 If negative, if this stub would cross fewer 2**plt_stub_align
10709 boundaries if we align, then return the padding needed to do so. */
10710
794e51c0
AM
10711static inline unsigned int
10712plt_stub_pad (struct ppc_link_hash_table *htab,
10713 struct ppc_stub_hash_entry *stub_entry,
10714 bfd_vma plt_off)
10715{
2420fff6 10716 int stub_align;
1aa42141 10717 unsigned stub_size;
6f20ed8a 10718 bfd_vma stub_off = stub_entry->group->stub_sec->size;
794e51c0 10719
2420fff6
AM
10720 if (htab->params->plt_stub_align >= 0)
10721 {
10722 stub_align = 1 << htab->params->plt_stub_align;
10723 if ((stub_off & (stub_align - 1)) != 0)
10724 return stub_align - (stub_off & (stub_align - 1));
10725 return 0;
10726 }
10727
10728 stub_align = 1 << -htab->params->plt_stub_align;
1aa42141 10729 stub_size = plt_stub_size (htab, stub_entry, plt_off);
794e51c0 10730 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
e05fa0ba 10731 > ((stub_size - 1) & -stub_align))
794e51c0
AM
10732 return stub_align - (stub_off & (stub_align - 1));
10733 return 0;
10734}
10735
10736/* Build a .plt call stub. */
10737
10738static inline bfd_byte *
10739build_plt_stub (struct ppc_link_hash_table *htab,
10740 struct ppc_stub_hash_entry *stub_entry,
10741 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10742{
e7d1c40c 10743 bfd *obfd = htab->params->stub_bfd;
b9e5796b 10744 bfd_boolean plt_load_toc = htab->opd_abi;
e7d1c40c 10745 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
bd4d2eaa
AM
10746 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10747 && htab->elf.dynamic_sections_created
10748 && stub_entry->h != NULL
10749 && stub_entry->h->elf.dynindx != -1);
794e51c0
AM
10750 bfd_boolean use_fake_dep = plt_thread_safe;
10751 bfd_vma cmp_branch_off = 0;
10752
10753 if (!ALWAYS_USE_FAKE_DEP
b9e5796b 10754 && plt_load_toc
794e51c0 10755 && plt_thread_safe
bd4d2eaa
AM
10756 && !((stub_entry->h == htab->tls_get_addr_fd
10757 || stub_entry->h == htab->tls_get_addr)
7c9cf415 10758 && htab->params->tls_get_addr_opt))
794e51c0
AM
10759 {
10760 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
b9e5796b
AM
10761 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10762 / PLT_ENTRY_SIZE (htab));
9e390558 10763 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8;
794e51c0
AM
10764 bfd_vma to, from;
10765
68d62958
AM
10766 if (pltindex > 32768)
10767 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
10768 to = (glinkoff
10769 + htab->glink->output_offset
10770 + htab->glink->output_section->vma);
6f20ed8a 10771 from = (p - stub_entry->group->stub_sec->contents
794e51c0
AM
10772 + 4 * (ALWAYS_EMIT_R2SAVE
10773 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10774 + 4 * (PPC_HA (offset) != 0)
10775 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10776 != PPC_HA (offset))
10777 + 4 * (plt_static_chain != 0)
10778 + 20
6f20ed8a
AM
10779 + stub_entry->group->stub_sec->output_offset
10780 + stub_entry->group->stub_sec->output_section->vma);
794e51c0
AM
10781 cmp_branch_off = to - from;
10782 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10783 }
10784
ac2df442
AM
10785 if (PPC_HA (offset) != 0)
10786 {
176a0d42
AM
10787 if (r != NULL)
10788 {
794e51c0
AM
10789 if (ALWAYS_EMIT_R2SAVE
10790 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10791 r[0].r_offset += 4;
176a0d42 10792 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 10793 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
10794 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10795 r[1].r_addend = r[0].r_addend;
b9e5796b 10796 if (plt_load_toc)
176a0d42 10797 {
b9e5796b 10798 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10799 {
b9e5796b
AM
10800 r[2].r_offset = r[1].r_offset + 4;
10801 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10802 r[2].r_addend = r[0].r_addend;
10803 }
10804 else
10805 {
10806 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10807 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10808 r[2].r_addend = r[0].r_addend + 8;
10809 if (plt_static_chain)
10810 {
10811 r[3].r_offset = r[2].r_offset + 4;
10812 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10813 r[3].r_addend = r[0].r_addend + 16;
10814 }
c7131b65 10815 }
176a0d42
AM
10816 }
10817 }
794e51c0
AM
10818 if (ALWAYS_EMIT_R2SAVE
10819 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10820 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
397998fc
AM
10821 if (plt_load_toc)
10822 {
10823 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10824 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10825 }
10826 else
10827 {
10828 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10829 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10830 }
b9e5796b
AM
10831 if (plt_load_toc
10832 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 10833 {
71a39c98 10834 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
10835 offset = 0;
10836 }
71a39c98 10837 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10838 if (plt_load_toc)
794e51c0 10839 {
b9e5796b
AM
10840 if (use_fake_dep)
10841 {
10842 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10843 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10844 }
10845 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10846 if (plt_static_chain)
10847 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
794e51c0 10848 }
ac2df442
AM
10849 }
10850 else
10851 {
176a0d42
AM
10852 if (r != NULL)
10853 {
794e51c0
AM
10854 if (ALWAYS_EMIT_R2SAVE
10855 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10856 r[0].r_offset += 4;
176a0d42 10857 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
b9e5796b 10858 if (plt_load_toc)
176a0d42 10859 {
b9e5796b 10860 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10861 {
b9e5796b
AM
10862 r[1].r_offset = r[0].r_offset + 4;
10863 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10864 r[1].r_addend = r[0].r_addend;
10865 }
10866 else
10867 {
10868 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10869 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10870 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10871 if (plt_static_chain)
10872 {
10873 r[2].r_offset = r[1].r_offset + 4;
10874 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10875 r[2].r_addend = r[0].r_addend + 8;
10876 }
c7131b65 10877 }
176a0d42
AM
10878 }
10879 }
794e51c0
AM
10880 if (ALWAYS_EMIT_R2SAVE
10881 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10882 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
71a39c98 10883 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
b9e5796b
AM
10884 if (plt_load_toc
10885 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
10886 {
10887 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10888 offset = 0;
10889 }
71a39c98 10890 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10891 if (plt_load_toc)
794e51c0 10892 {
b9e5796b
AM
10893 if (use_fake_dep)
10894 {
10895 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10896 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10897 }
10898 if (plt_static_chain)
10899 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10900 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
794e51c0 10901 }
ac2df442 10902 }
b9e5796b 10903 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
794e51c0
AM
10904 {
10905 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10906 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 10907 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
10908 }
10909 else
407aa07c 10910 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
10911 return p;
10912}
10913
a7f2871e
AM
10914/* Build a special .plt call stub for __tls_get_addr. */
10915
10916#define LD_R11_0R3 0xe9630000
10917#define LD_R12_0R3 0xe9830000
10918#define MR_R0_R3 0x7c601b78
10919#define CMPDI_R11_0 0x2c2b0000
10920#define ADD_R3_R12_R13 0x7c6c6a14
10921#define BEQLR 0x4d820020
10922#define MR_R3_R0 0x7c030378
a7f2871e
AM
10923#define STD_R11_0R1 0xf9610000
10924#define BCTRL 0x4e800421
10925#define LD_R11_0R1 0xe9610000
a7f2871e
AM
10926#define MTLR_R11 0x7d6803a6
10927
10928static inline bfd_byte *
794e51c0
AM
10929build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10930 struct ppc_stub_hash_entry *stub_entry,
10931 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 10932{
e7d1c40c 10933 bfd *obfd = htab->params->stub_bfd;
df136d64 10934 bfd_byte *loc = p;
794e51c0 10935
a7f2871e
AM
10936 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10937 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10938 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10939 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10940 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10941 bfd_put_32 (obfd, BEQLR, p), p += 4;
10942 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
f378ab09
AM
10943 if (r != NULL)
10944 r[0].r_offset += 7 * 4;
e81b4c93 10945 if (stub_entry->stub_type != ppc_stub_plt_call_r2save)
f378ab09
AM
10946 return build_plt_stub (htab, stub_entry, p, offset, r);
10947
a7f2871e 10948 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
a078d95a 10949 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
10950
10951 if (r != NULL)
f378ab09 10952 r[0].r_offset += 2 * 4;
794e51c0 10953 p = build_plt_stub (htab, stub_entry, p, offset, r);
407aa07c 10954 bfd_put_32 (obfd, BCTRL, p - 4);
a7f2871e 10955
a078d95a 10956 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
bd4d2eaa 10957 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
10958 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10959 bfd_put_32 (obfd, BLR, p), p += 4;
10960
df136d64
AM
10961 if (htab->glink_eh_frame != NULL
10962 && htab->glink_eh_frame->size != 0)
10963 {
10964 bfd_byte *base, *eh;
10965 unsigned int lr_used, delta;
10966
10967 base = htab->glink_eh_frame->contents + stub_entry->group->eh_base + 17;
10968 eh = base + stub_entry->group->eh_size;
10969 lr_used = stub_entry->stub_offset + (p - 20 - loc);
10970 delta = lr_used - stub_entry->group->lr_restore;
10971 stub_entry->group->lr_restore = lr_used + 16;
10972 eh = eh_advance (htab->elf.dynobj, eh, delta);
10973 *eh++ = DW_CFA_offset_extended_sf;
10974 *eh++ = 65;
10975 *eh++ = -(STK_LINKER (htab) / 8) & 0x7f;
10976 *eh++ = DW_CFA_advance_loc + 4;
10977 *eh++ = DW_CFA_restore_extended;
10978 *eh++ = 65;
10979 stub_entry->group->eh_size = eh - base;
10980 }
a7f2871e
AM
10981 return p;
10982}
10983
176a0d42
AM
10984static Elf_Internal_Rela *
10985get_relocs (asection *sec, int count)
10986{
10987 Elf_Internal_Rela *relocs;
10988 struct bfd_elf_section_data *elfsec_data;
10989
10990 elfsec_data = elf_section_data (sec);
10991 relocs = elfsec_data->relocs;
10992 if (relocs == NULL)
10993 {
10994 bfd_size_type relsize;
10995 relsize = sec->reloc_count * sizeof (*relocs);
10996 relocs = bfd_alloc (sec->owner, relsize);
10997 if (relocs == NULL)
10998 return NULL;
10999 elfsec_data->relocs = relocs;
d4730f92
BS
11000 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
11001 sizeof (Elf_Internal_Shdr));
11002 if (elfsec_data->rela.hdr == NULL)
11003 return NULL;
11004 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
11005 * sizeof (Elf64_External_Rela));
11006 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
11007 sec->reloc_count = 0;
11008 }
11009 relocs += sec->reloc_count;
11010 sec->reloc_count += count;
11011 return relocs;
11012}
11013
3d58e1fc
AM
11014/* Convert the relocs R[0] thru R[-NUM_REL+1], which are all no-symbol
11015 forms, to the equivalent relocs against the global symbol given by
11016 STUB_ENTRY->H. */
11017
11018static bfd_boolean
11019use_global_in_relocs (struct ppc_link_hash_table *htab,
11020 struct ppc_stub_hash_entry *stub_entry,
11021 Elf_Internal_Rela *r, unsigned int num_rel)
11022{
11023 struct elf_link_hash_entry **hashes;
11024 unsigned long symndx;
11025 struct ppc_link_hash_entry *h;
11026 bfd_vma symval;
11027
11028 /* Relocs are always against symbols in their own object file. Fake
11029 up global sym hashes for the stub bfd (which has no symbols). */
11030 hashes = elf_sym_hashes (htab->params->stub_bfd);
11031 if (hashes == NULL)
11032 {
11033 bfd_size_type hsize;
11034
11035 /* When called the first time, stub_globals will contain the
11036 total number of symbols seen during stub sizing. After
11037 allocating, stub_globals is used as an index to fill the
11038 hashes array. */
11039 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
11040 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
11041 if (hashes == NULL)
11042 return FALSE;
11043 elf_sym_hashes (htab->params->stub_bfd) = hashes;
11044 htab->stub_globals = 1;
11045 }
11046 symndx = htab->stub_globals++;
11047 h = stub_entry->h;
11048 hashes[symndx] = &h->elf;
11049 if (h->oh != NULL && h->oh->is_func)
11050 h = ppc_follow_link (h->oh);
11051 BFD_ASSERT (h->elf.root.type == bfd_link_hash_defined
11052 || h->elf.root.type == bfd_link_hash_defweak);
11053 symval = (h->elf.root.u.def.value
11054 + h->elf.root.u.def.section->output_offset
11055 + h->elf.root.u.def.section->output_section->vma);
11056 while (num_rel-- != 0)
11057 {
11058 r->r_info = ELF64_R_INFO (symndx, ELF64_R_TYPE (r->r_info));
11059 if (h->elf.root.u.def.section != stub_entry->target_section)
11060 {
11061 /* H is an opd symbol. The addend must be zero, and the
11062 branch reloc is the only one we can convert. */
11063 r->r_addend = 0;
11064 break;
11065 }
11066 else
11067 r->r_addend -= symval;
11068 --r;
11069 }
11070 return TRUE;
11071}
11072
aa374f67 11073static bfd_vma
25f53a85 11074get_r2off (struct bfd_link_info *info,
aa374f67
AM
11075 struct ppc_stub_hash_entry *stub_entry)
11076{
25f53a85 11077 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 11078 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
aa374f67
AM
11079
11080 if (r2off == 0)
11081 {
11082 /* Support linking -R objects. Get the toc pointer from the
11083 opd entry. */
11084 char buf[8];
b9e5796b
AM
11085 if (!htab->opd_abi)
11086 return r2off;
aa374f67
AM
11087 asection *opd = stub_entry->h->elf.root.u.def.section;
11088 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
11089
11090 if (strcmp (opd->name, ".opd") != 0
11091 || opd->reloc_count != 0)
11092 {
2cdcc330
AM
11093 info->callbacks->einfo
11094 (_("%P: cannot find opd entry toc for `%pT'\n"),
11095 stub_entry->h->elf.root.root.string);
aa374f67 11096 bfd_set_error (bfd_error_bad_value);
a7c49797 11097 return (bfd_vma) -1;
aa374f67
AM
11098 }
11099 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
a7c49797 11100 return (bfd_vma) -1;
aa374f67 11101 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 11102 r2off -= elf_gp (info->output_bfd);
aa374f67 11103 }
6f20ed8a 11104 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
aa374f67
AM
11105 return r2off;
11106}
11107
b34976b6 11108static bfd_boolean
4ce794b7 11109ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 11110{
721956f4
AM
11111 struct ppc_stub_hash_entry *stub_entry;
11112 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
11113 struct bfd_link_info *info;
11114 struct ppc_link_hash_table *htab;
721956f4 11115 bfd_byte *loc;
3d58e1fc 11116 bfd_byte *p, *relp;
1aa42141 11117 bfd_vma targ, off;
176a0d42 11118 Elf_Internal_Rela *r;
e054468f 11119 asection *plt;
3d58e1fc 11120 int num_rel;
04bdff6a 11121 int odd;
5d1634d7 11122
721956f4
AM
11123 /* Massage our args to the form they really have. */
11124 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 11125 info = in_arg;
5d1634d7 11126
5d1634d7 11127 htab = ppc_hash_table (info);
4dfe6ac6
NC
11128 if (htab == NULL)
11129 return FALSE;
5d1634d7 11130
1aa42141 11131 BFD_ASSERT (stub_entry->stub_offset >= stub_entry->group->stub_sec->size);
6f20ed8a 11132 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
721956f4 11133
4ce794b7 11134 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 11135 switch (stub_entry->stub_type)
5d1634d7 11136 {
721956f4 11137 case ppc_stub_long_branch:
ad8e1ba5 11138 case ppc_stub_long_branch_r2off:
721956f4 11139 /* Branches are relative. This is where we are going to. */
1aa42141 11140 targ = (stub_entry->target_value
6911b7dc
AM
11141 + stub_entry->target_section->output_offset
11142 + stub_entry->target_section->output_section->vma);
1aa42141 11143 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
5d1634d7 11144
721956f4 11145 /* And this is where we are coming from. */
1aa42141
AM
11146 off = (stub_entry->stub_offset
11147 + stub_entry->group->stub_sec->output_offset
11148 + stub_entry->group->stub_sec->output_section->vma);
11149 off = targ - off;
e86ce104 11150
9e390558 11151 p = loc;
ac2df442 11152 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 11153 {
25f53a85 11154 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 11155
a7c49797 11156 if (r2off == (bfd_vma) -1)
aa374f67
AM
11157 {
11158 htab->stub_error = TRUE;
11159 return FALSE;
11160 }
9e390558
AM
11161 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11162 p += 4;
ac2df442
AM
11163 if (PPC_HA (r2off) != 0)
11164 {
e7d1c40c 11165 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11166 ADDIS_R2_R2 | PPC_HA (r2off), p);
11167 p += 4;
a7c49797
AM
11168 }
11169 if (PPC_LO (r2off) != 0)
11170 {
11171 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11172 ADDI_R2_R2 | PPC_LO (r2off), p);
11173 p += 4;
ac2df442 11174 }
9e390558 11175 off -= p - loc;
ad8e1ba5 11176 }
9e390558
AM
11177 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p);
11178 p += 4;
ad8e1ba5 11179
5c3dead3
AM
11180 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11181 {
cf97bcb0
AM
11182 _bfd_error_handler
11183 (_("long branch stub `%s' offset overflow"),
bc30df16 11184 stub_entry->root.string);
5c3dead3
AM
11185 htab->stub_error = TRUE;
11186 return FALSE;
11187 }
ee75fd95
AM
11188
11189 if (info->emitrelocations)
11190 {
6f20ed8a 11191 r = get_relocs (stub_entry->group->stub_sec, 1);
176a0d42
AM
11192 if (r == NULL)
11193 return FALSE;
9e390558 11194 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
ee75fd95 11195 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
1aa42141 11196 r->r_addend = targ;
3d58e1fc
AM
11197 if (stub_entry->h != NULL
11198 && !use_global_in_relocs (htab, stub_entry, r, 1))
11199 return FALSE;
ee75fd95 11200 }
721956f4 11201 break;
e86ce104 11202
721956f4 11203 case ppc_stub_plt_branch:
ad8e1ba5 11204 case ppc_stub_plt_branch_r2off:
721956f4
AM
11205 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11206 stub_entry->root.string + 9,
b34976b6 11207 FALSE, FALSE);
721956f4
AM
11208 if (br_entry == NULL)
11209 {
cf97bcb0
AM
11210 _bfd_error_handler (_("can't find branch stub `%s'"),
11211 stub_entry->root.string);
b34976b6
AM
11212 htab->stub_error = TRUE;
11213 return FALSE;
721956f4
AM
11214 }
11215
1aa42141 11216 targ = (stub_entry->target_value
176a0d42
AM
11217 + stub_entry->target_section->output_offset
11218 + stub_entry->target_section->output_section->vma);
6911b7dc 11219 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
1aa42141 11220 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 11221
1aa42141 11222 bfd_put_64 (htab->brlt->owner, targ,
4ce794b7 11223 htab->brlt->contents + br_entry->offset);
721956f4 11224
f94498ff 11225 if (br_entry->iter == htab->stub_iteration)
721956f4 11226 {
f94498ff 11227 br_entry->iter = 0;
84f5d08e 11228
f94498ff 11229 if (htab->relbrlt != NULL)
84f5d08e 11230 {
f94498ff
AM
11231 /* Create a reloc for the branch lookup table entry. */
11232 Elf_Internal_Rela rela;
11233 bfd_byte *rl;
11234
11235 rela.r_offset = (br_entry->offset
11236 + htab->brlt->output_offset
11237 + htab->brlt->output_section->vma);
11238 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11239 rela.r_addend = targ;
f94498ff
AM
11240
11241 rl = htab->relbrlt->contents;
11242 rl += (htab->relbrlt->reloc_count++
11243 * sizeof (Elf64_External_Rela));
11244 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
11245 }
11246 else if (info->emitrelocations)
11247 {
176a0d42
AM
11248 r = get_relocs (htab->brlt, 1);
11249 if (r == NULL)
11250 return FALSE;
11251 /* brlt, being SEC_LINKER_CREATED does not go through the
11252 normal reloc processing. Symbols and offsets are not
11253 translated from input file to output file form, so
11254 set up the offset per the output file. */
f94498ff
AM
11255 r->r_offset = (br_entry->offset
11256 + htab->brlt->output_offset
11257 + htab->brlt->output_section->vma);
11258 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11259 r->r_addend = targ;
84f5d08e 11260 }
84f5d08e 11261 }
721956f4 11262
1aa42141 11263 targ = (br_entry->offset
176a0d42
AM
11264 + htab->brlt->output_offset
11265 + htab->brlt->output_section->vma);
11266
1aa42141
AM
11267 off = (elf_gp (info->output_bfd)
11268 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11269 off = targ - off;
721956f4 11270
ad8e1ba5 11271 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 11272 {
25f53a85 11273 info->callbacks->einfo
c1c8c1ef 11274 (_("%P: linkage table error against `%pT'\n"),
721956f4 11275 stub_entry->root.string);
5d1634d7 11276 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11277 htab->stub_error = TRUE;
11278 return FALSE;
5d1634d7 11279 }
41bd81ab 11280
176a0d42
AM
11281 if (info->emitrelocations)
11282 {
6f20ed8a 11283 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
176a0d42
AM
11284 if (r == NULL)
11285 return FALSE;
6f20ed8a 11286 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11287 if (bfd_big_endian (info->output_bfd))
11288 r[0].r_offset += 2;
00f412ee 11289 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
176a0d42
AM
11290 r[0].r_offset += 4;
11291 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
1aa42141 11292 r[0].r_addend = targ;
176a0d42
AM
11293 if (PPC_HA (off) != 0)
11294 {
11295 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11296 r[1].r_offset = r[0].r_offset + 4;
11297 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11298 r[1].r_addend = r[0].r_addend;
11299 }
11300 }
11301
9e390558 11302 p = loc;
00f412ee 11303 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ad8e1ba5 11304 {
176a0d42 11305 if (PPC_HA (off) != 0)
ac2df442 11306 {
e7d1c40c 11307 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11308 ADDIS_R12_R2 | PPC_HA (off), p);
11309 p += 4;
e7d1c40c 11310 bfd_put_32 (htab->params->stub_bfd,
9e390558 11311 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11312 }
11313 else
9e390558
AM
11314 bfd_put_32 (htab->params->stub_bfd,
11315 LD_R12_0R2 | PPC_LO (off), p);
ad8e1ba5
AM
11316 }
11317 else
11318 {
25f53a85 11319 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 11320
a7c49797 11321 if (r2off == (bfd_vma) -1)
aa374f67
AM
11322 {
11323 htab->stub_error = TRUE;
11324 return FALSE;
11325 }
ad8e1ba5 11326
9e390558
AM
11327 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11328 p += 4;
176a0d42 11329 if (PPC_HA (off) != 0)
ac2df442 11330 {
e7d1c40c 11331 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11332 ADDIS_R12_R2 | PPC_HA (off), p);
11333 p += 4;
e7d1c40c 11334 bfd_put_32 (htab->params->stub_bfd,
9e390558 11335 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11336 }
11337 else
9e390558 11338 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p);
ac2df442
AM
11339
11340 if (PPC_HA (r2off) != 0)
11341 {
9e390558 11342 p += 4;
e7d1c40c 11343 bfd_put_32 (htab->params->stub_bfd,
9e390558 11344 ADDIS_R2_R2 | PPC_HA (r2off), p);
00f412ee
AM
11345 }
11346 if (PPC_LO (r2off) != 0)
11347 {
9e390558 11348 p += 4;
e7d1c40c 11349 bfd_put_32 (htab->params->stub_bfd,
9e390558 11350 ADDI_R2_R2 | PPC_LO (r2off), p);
ac2df442 11351 }
ad8e1ba5 11352 }
9e390558
AM
11353 p += 4;
11354 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11355 p += 4;
407aa07c
AM
11356 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11357 p += 4;
721956f4 11358 break;
5d1634d7 11359
05d0e962
AM
11360 case ppc_stub_long_branch_notoc:
11361 case ppc_stub_long_branch_both:
11362 case ppc_stub_plt_branch_notoc:
11363 case ppc_stub_plt_branch_both:
11364 case ppc_stub_plt_call_notoc:
11365 case ppc_stub_plt_call_both:
11366 p = loc;
f891966f 11367 off = (stub_entry->stub_offset
05d0e962
AM
11368 + stub_entry->group->stub_sec->output_offset
11369 + stub_entry->group->stub_sec->output_section->vma);
11370 if (stub_entry->stub_type == ppc_stub_long_branch_both
11371 || stub_entry->stub_type == ppc_stub_plt_branch_both
11372 || stub_entry->stub_type == ppc_stub_plt_call_both)
11373 {
11374 off += 4;
11375 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11376 p += 4;
11377 }
11378 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
11379 {
11380 targ = stub_entry->plt_ent->plt.offset & ~1;
11381 if (targ >= (bfd_vma) -2)
11382 abort ();
11383
11384 plt = htab->elf.splt;
11385 if (!htab->elf.dynamic_sections_created
11386 || stub_entry->h == NULL
11387 || stub_entry->h->elf.dynindx == -1)
11388 {
11389 if (stub_entry->symtype == STT_GNU_IFUNC)
11390 plt = htab->elf.iplt;
11391 else
11392 plt = htab->pltlocal;
11393 }
11394 targ += plt->output_offset + plt->output_section->vma;
11395 }
11396 else
11397 targ = (stub_entry->target_value
11398 + stub_entry->target_section->output_offset
11399 + stub_entry->target_section->output_section->vma);
04bdff6a 11400 odd = off & 4;
05d0e962 11401 off = targ - off;
f891966f 11402
3d58e1fc
AM
11403 relp = p;
11404 num_rel = 0;
04bdff6a
AM
11405 if (htab->powerxx_stubs)
11406 {
11407 bfd_boolean load = stub_entry->stub_type >= ppc_stub_plt_call_notoc;
11408 p = build_powerxx_offset (htab->params->stub_bfd, p, off, odd, load);
11409 }
11410 else
11411 {
11412 /* The notoc stubs calculate their target (either a PLT entry or
11413 the global entry point of a function) relative to the PC
11414 returned by the "bcl" two instructions past the start of the
11415 sequence emitted by build_offset. The offset is therefore 8
11416 less than calculated from the start of the sequence. */
11417 off -= 8;
11418 p = build_offset (htab->params->stub_bfd, p, off,
11419 stub_entry->stub_type >= ppc_stub_plt_call_notoc);
11420 }
11421
f891966f 11422 if (stub_entry->stub_type <= ppc_stub_long_branch_both)
05d0e962 11423 {
f891966f 11424 bfd_vma from;
3d58e1fc 11425 num_rel = 1;
f891966f
AM
11426 from = (stub_entry->stub_offset
11427 + stub_entry->group->stub_sec->output_offset
11428 + stub_entry->group->stub_sec->output_section->vma
11429 + (p - loc));
05d0e962 11430 bfd_put_32 (htab->params->stub_bfd,
f891966f 11431 B_DOT | ((targ - from) & 0x3fffffc), p);
05d0e962
AM
11432 }
11433 else
11434 {
11435 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11436 p += 4;
11437 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11438 }
11439 p += 4;
df136d64 11440
3d58e1fc
AM
11441 if (info->emitrelocations)
11442 {
04bdff6a
AM
11443 bfd_vma roff = relp - stub_entry->group->stub_sec->contents;
11444 if (htab->powerxx_stubs)
11445 num_rel += num_relocs_for_powerxx_offset (off, odd);
11446 else
11447 {
11448 num_rel += num_relocs_for_offset (off);
11449 roff += 16;
11450 }
3d58e1fc
AM
11451 r = get_relocs (stub_entry->group->stub_sec, num_rel);
11452 if (r == NULL)
11453 return FALSE;
04bdff6a
AM
11454 if (htab->powerxx_stubs)
11455 r = emit_relocs_for_powerxx_offset (info, r, roff, targ, off, odd);
11456 else
11457 r = emit_relocs_for_offset (info, r, roff, targ, off);
3d58e1fc
AM
11458 if (stub_entry->stub_type == ppc_stub_long_branch_notoc
11459 || stub_entry->stub_type == ppc_stub_long_branch_both)
11460 {
11461 ++r;
11462 roff = p - 4 - stub_entry->group->stub_sec->contents;
11463 r->r_offset = roff;
11464 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
11465 r->r_addend = targ;
11466 if (stub_entry->h != NULL
11467 && !use_global_in_relocs (htab, stub_entry, r, num_rel))
11468 return FALSE;
11469 }
11470 }
11471
04bdff6a
AM
11472 if (!htab->powerxx_stubs
11473 && htab->glink_eh_frame != NULL
11474 && htab->glink_eh_frame->size != 0)
df136d64
AM
11475 {
11476 bfd_byte *base, *eh;
11477 unsigned int lr_used, delta;
11478
11479 base = (htab->glink_eh_frame->contents
11480 + stub_entry->group->eh_base + 17);
11481 eh = base + stub_entry->group->eh_size;
11482 lr_used = stub_entry->stub_offset + 8;
11483 if (stub_entry->stub_type == ppc_stub_long_branch_both
11484 || stub_entry->stub_type == ppc_stub_plt_branch_both
11485 || stub_entry->stub_type == ppc_stub_plt_call_both)
11486 lr_used += 4;
11487 delta = lr_used - stub_entry->group->lr_restore;
11488 stub_entry->group->lr_restore = lr_used + 8;
11489 eh = eh_advance (htab->elf.dynobj, eh, delta);
11490 *eh++ = DW_CFA_register;
11491 *eh++ = 65;
11492 *eh++ = 12;
11493 *eh++ = DW_CFA_advance_loc + 2;
11494 *eh++ = DW_CFA_restore_extended;
11495 *eh++ = 65;
11496 stub_entry->group->eh_size = eh - base;
11497 }
05d0e962
AM
11498 break;
11499
721956f4 11500 case ppc_stub_plt_call:
794e51c0 11501 case ppc_stub_plt_call_r2save:
e054468f 11502 if (stub_entry->h != NULL
b31867b6
AM
11503 && stub_entry->h->is_func_descriptor
11504 && stub_entry->h->oh != NULL)
c862ae31 11505 {
b31867b6
AM
11506 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11507
11508 /* If the old-ABI "dot-symbol" is undefined make it weak so
6f20ed8a 11509 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
8c5b4e52
AM
11510 if (fh->elf.root.type == bfd_link_hash_undefined
11511 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11512 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
b31867b6 11513 fh->elf.root.type = bfd_link_hash_undefweak;
c862ae31
AM
11514 }
11515
721956f4 11516 /* Now build the stub. */
1aa42141
AM
11517 targ = stub_entry->plt_ent->plt.offset & ~1;
11518 if (targ >= (bfd_vma) -2)
721956f4
AM
11519 abort ();
11520
33e44f2e 11521 plt = htab->elf.splt;
25f23106
AM
11522 if (!htab->elf.dynamic_sections_created
11523 || stub_entry->h == NULL
11524 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11525 {
11526 if (stub_entry->symtype == STT_GNU_IFUNC)
11527 plt = htab->elf.iplt;
11528 else
11529 plt = htab->pltlocal;
11530 }
1aa42141 11531 targ += plt->output_offset + plt->output_section->vma;
e054468f 11532
1aa42141
AM
11533 off = (elf_gp (info->output_bfd)
11534 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11535 off = targ - off;
721956f4 11536
ad8e1ba5 11537 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 11538 {
25f53a85 11539 info->callbacks->einfo
695344c0 11540 /* xgettext:c-format */
c1c8c1ef 11541 (_("%P: linkage table error against `%pT'\n"),
e054468f
AM
11542 stub_entry->h != NULL
11543 ? stub_entry->h->elf.root.root.string
11544 : "<local sym>");
721956f4 11545 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11546 htab->stub_error = TRUE;
11547 return FALSE;
721956f4
AM
11548 }
11549
176a0d42
AM
11550 r = NULL;
11551 if (info->emitrelocations)
11552 {
6f20ed8a 11553 r = get_relocs (stub_entry->group->stub_sec,
3ba720c7
AM
11554 ((PPC_HA (off) != 0)
11555 + (htab->opd_abi
e7d1c40c 11556 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
11557 && PPC_HA (off + 16) == PPC_HA (off))
11558 : 1)));
176a0d42
AM
11559 if (r == NULL)
11560 return FALSE;
6f20ed8a 11561 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11562 if (bfd_big_endian (info->output_bfd))
11563 r[0].r_offset += 2;
1aa42141 11564 r[0].r_addend = targ;
176a0d42 11565 }
a7f2871e
AM
11566 if (stub_entry->h != NULL
11567 && (stub_entry->h == htab->tls_get_addr_fd
11568 || stub_entry->h == htab->tls_get_addr)
7c9cf415 11569 && htab->params->tls_get_addr_opt)
794e51c0 11570 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 11571 else
794e51c0 11572 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
11573 break;
11574
a4b6fadd
AM
11575 case ppc_stub_save_res:
11576 return TRUE;
11577
721956f4
AM
11578 default:
11579 BFD_FAIL ();
b34976b6 11580 return FALSE;
721956f4
AM
11581 }
11582
1aa42141 11583 stub_entry->group->stub_sec->size = stub_entry->stub_offset + (p - loc);
97b639ba 11584
e7d1c40c 11585 if (htab->params->emit_stub_syms)
97b639ba
AM
11586 {
11587 struct elf_link_hash_entry *h;
ee75fd95
AM
11588 size_t len1, len2;
11589 char *name;
11590 const char *const stub_str[] = { "long_branch",
05d0e962
AM
11591 "long_branch",
11592 "long_branch",
3f6ff479
AM
11593 "long_branch",
11594 "plt_branch",
ee75fd95 11595 "plt_branch",
05d0e962
AM
11596 "plt_branch",
11597 "plt_branch",
11598 "plt_call",
11599 "plt_call",
794e51c0 11600 "plt_call",
ee75fd95
AM
11601 "plt_call" };
11602
11603 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11604 len2 = strlen (stub_entry->root.string);
11605 name = bfd_malloc (len1 + len2 + 2);
11606 if (name == NULL)
11607 return FALSE;
11608 memcpy (name, stub_entry->root.string, 9);
11609 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11610 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11611 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
11612 if (h == NULL)
11613 return FALSE;
11614 if (h->root.type == bfd_link_hash_new)
11615 {
11616 h->root.type = bfd_link_hash_defined;
6f20ed8a 11617 h->root.u.def.section = stub_entry->group->stub_sec;
97b639ba 11618 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
11619 h->ref_regular = 1;
11620 h->def_regular = 1;
11621 h->ref_regular_nonweak = 1;
11622 h->forced_local = 1;
11623 h->non_elf = 0;
2ec55de3 11624 h->root.linker_def = 1;
97b639ba
AM
11625 }
11626 }
11627
b34976b6 11628 return TRUE;
721956f4
AM
11629}
11630
11631/* As above, but don't actually build the stub. Just bump offset so
11632 we know stub section sizes, and select plt_branch stubs where
11633 long_branch stubs won't do. */
11634
b34976b6 11635static bfd_boolean
4ce794b7 11636ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
11637{
11638 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 11639 struct bfd_link_info *info;
721956f4 11640 struct ppc_link_hash_table *htab;
f891966f
AM
11641 asection *plt;
11642 bfd_vma targ, off, r2off;
04bdff6a 11643 unsigned int size, extra, lr_used, delta, odd;
721956f4
AM
11644
11645 /* Massage our args to the form they really have. */
11646 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
11647 info = in_arg;
11648
11649 htab = ppc_hash_table (info);
4dfe6ac6
NC
11650 if (htab == NULL)
11651 return FALSE;
721956f4 11652
1aa42141
AM
11653 /* Make a note of the offset within the stubs for this entry. */
11654 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11655
a4b6fadd
AM
11656 if (stub_entry->h != NULL
11657 && stub_entry->h->save_res
11658 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11659 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11660 {
11661 /* Don't make stubs to out-of-line register save/restore
11662 functions. Instead, emit copies of the functions. */
11663 stub_entry->group->needs_save_res = 1;
11664 stub_entry->stub_type = ppc_stub_save_res;
11665 return TRUE;
11666 }
11667
f891966f 11668 switch (stub_entry->stub_type)
721956f4 11669 {
f891966f
AM
11670 case ppc_stub_plt_branch:
11671 case ppc_stub_plt_branch_r2off:
11672 /* Reset the stub type from the plt branch variant in case we now
11673 can reach with a shorter stub. */
11674 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11675 /* Fall through. */
11676 case ppc_stub_long_branch:
11677 case ppc_stub_long_branch_r2off:
1aa42141
AM
11678 targ = (stub_entry->target_value
11679 + stub_entry->target_section->output_offset
11680 + stub_entry->target_section->output_section->vma);
f891966f 11681 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
1aa42141
AM
11682 off = (stub_entry->stub_offset
11683 + stub_entry->group->stub_sec->output_offset
11684 + stub_entry->group->stub_sec->output_section->vma);
721956f4 11685
ad8e1ba5 11686 size = 4;
f891966f 11687 r2off = 0;
ad8e1ba5
AM
11688 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11689 {
25f53a85 11690 r2off = get_r2off (info, stub_entry);
a7c49797 11691 if (r2off == (bfd_vma) -1)
aa374f67
AM
11692 {
11693 htab->stub_error = TRUE;
11694 return FALSE;
11695 }
a7c49797 11696 size = 8;
ac2df442 11697 if (PPC_HA (r2off) != 0)
a7c49797
AM
11698 size += 4;
11699 if (PPC_LO (r2off) != 0)
11700 size += 4;
1aa42141 11701 off += size - 4;
ad8e1ba5 11702 }
1aa42141 11703 off = targ - off;
ad8e1ba5 11704
f891966f
AM
11705 /* If the branch offset is too big, use a ppc_stub_plt_branch.
11706 Do the same for -R objects without function descriptors. */
11707 if ((stub_entry->stub_type == ppc_stub_long_branch_r2off
11708 && r2off == 0
11709 && htab->sec_info[stub_entry->target_section->id].toc_off == 0)
11710 || off + (1 << 25) >= (bfd_vma) (1 << 26))
721956f4 11711 {
f891966f 11712 struct ppc_branch_hash_entry *br_entry;
df136d64 11713
f891966f
AM
11714 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11715 stub_entry->root.string + 9,
11716 TRUE, FALSE);
11717 if (br_entry == NULL)
721956f4 11718 {
f891966f
AM
11719 _bfd_error_handler (_("can't build branch stub `%s'"),
11720 stub_entry->root.string);
11721 htab->stub_error = TRUE;
11722 return FALSE;
721956f4
AM
11723 }
11724
f891966f 11725 if (br_entry->iter != htab->stub_iteration)
721956f4 11726 {
f891966f
AM
11727 br_entry->iter = htab->stub_iteration;
11728 br_entry->offset = htab->brlt->size;
11729 htab->brlt->size += 8;
63bc6f6c 11730
f891966f
AM
11731 if (htab->relbrlt != NULL)
11732 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11733 else if (info->emitrelocations)
84f5d08e 11734 {
f891966f
AM
11735 htab->brlt->reloc_count += 1;
11736 htab->brlt->flags |= SEC_RELOC;
05d0e962 11737 }
f891966f 11738 }
ac2df442 11739
f891966f
AM
11740 targ = (br_entry->offset
11741 + htab->brlt->output_offset
11742 + htab->brlt->output_section->vma);
11743 off = (elf_gp (info->output_bfd)
11744 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11745 off = targ - off;
176a0d42 11746
f891966f
AM
11747 if (info->emitrelocations)
11748 {
11749 stub_entry->group->stub_sec->reloc_count
11750 += 1 + (PPC_HA (off) != 0);
11751 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11752 }
05d0e962 11753
f891966f
AM
11754 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11755 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11756 {
11757 size = 12;
11758 if (PPC_HA (off) != 0)
11759 size = 16;
ac2df442 11760 }
f891966f 11761 else
ac2df442 11762 {
f891966f
AM
11763 size = 16;
11764 if (PPC_HA (off) != 0)
11765 size += 4;
11766
11767 if (PPC_HA (r2off) != 0)
11768 size += 4;
11769 if (PPC_LO (r2off) != 0)
11770 size += 4;
ac2df442 11771 }
721956f4 11772 }
f891966f
AM
11773 else if (info->emitrelocations)
11774 {
11775 stub_entry->group->stub_sec->reloc_count += 1;
11776 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11777 }
11778 break;
11779
11780 case ppc_stub_plt_branch_notoc:
11781 case ppc_stub_plt_branch_both:
11782 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11783 /* Fall through. */
11784 case ppc_stub_long_branch_notoc:
11785 case ppc_stub_long_branch_both:
11786 off = (stub_entry->stub_offset
11787 + stub_entry->group->stub_sec->output_offset
11788 + stub_entry->group->stub_sec->output_section->vma);
11789 size = 0;
11790 if (stub_entry->stub_type == ppc_stub_long_branch_both)
11791 size = 4;
11792 off += size;
11793 targ = (stub_entry->target_value
11794 + stub_entry->target_section->output_offset
11795 + stub_entry->target_section->output_section->vma);
04bdff6a 11796 odd = off & 4;
f891966f
AM
11797 off = targ - off;
11798
3d58e1fc
AM
11799 if (info->emitrelocations)
11800 {
04bdff6a
AM
11801 unsigned int num_rel;
11802 if (htab->powerxx_stubs)
11803 num_rel = num_relocs_for_powerxx_offset (off, odd);
11804 else
11805 num_rel = num_relocs_for_offset (off - 8);
11806 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
11807 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11808 }
11809
04bdff6a
AM
11810 if (htab->powerxx_stubs)
11811 extra = size_powerxx_offset (off, odd);
11812 else
11813 extra = size_offset (off - 8);
f891966f
AM
11814 /* Include branch insn plus those in the offset sequence. */
11815 size += 4 + extra;
11816 /* The branch insn is at the end, or "extra" bytes along. So
11817 its offset will be "extra" bytes less that that already
11818 calculated. */
11819 off -= extra;
11820
04bdff6a
AM
11821 if (!htab->powerxx_stubs)
11822 {
11823 /* After the bcl, lr has been modified so we need to emit
11824 .eh_frame info saying the return address is in r12. */
11825 lr_used = stub_entry->stub_offset + 8;
11826 if (stub_entry->stub_type == ppc_stub_long_branch_both)
11827 lr_used += 4;
11828 /* The eh_frame info will consist of a DW_CFA_advance_loc or
11829 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
11830 DW_CFA_restore_extended 65. */
11831 delta = lr_used - stub_entry->group->lr_restore;
11832 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11833 stub_entry->group->lr_restore = lr_used + 8;
11834 }
f891966f
AM
11835
11836 /* If the branch can't reach, use a plt_branch. */
11837 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11838 {
11839 stub_entry->stub_type += (ppc_stub_plt_branch_notoc
11840 - ppc_stub_long_branch_notoc);
11841 size += 4;
11842 }
3d58e1fc
AM
11843 else if (info->emitrelocations)
11844 stub_entry->group->stub_sec->reloc_count +=1;
f891966f
AM
11845 break;
11846
11847 case ppc_stub_plt_call_notoc:
11848 case ppc_stub_plt_call_both:
11849 off = (stub_entry->stub_offset
11850 + stub_entry->group->stub_sec->output_offset
11851 + stub_entry->group->stub_sec->output_section->vma);
11852 if (stub_entry->stub_type == ppc_stub_plt_call_both)
11853 off += 4;
11854 targ = stub_entry->plt_ent->plt.offset & ~1;
11855 if (targ >= (bfd_vma) -2)
11856 abort ();
11857
11858 plt = htab->elf.splt;
11859 if (!htab->elf.dynamic_sections_created
11860 || stub_entry->h == NULL
11861 || stub_entry->h->elf.dynindx == -1)
11862 {
11863 if (stub_entry->symtype == STT_GNU_IFUNC)
11864 plt = htab->elf.iplt;
11865 else
11866 plt = htab->pltlocal;
11867 }
11868 targ += plt->output_offset + plt->output_section->vma;
04bdff6a 11869 odd = off & 4;
f891966f
AM
11870 off = targ - off;
11871
11872 if (htab->params->plt_stub_align != 0)
11873 {
11874 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11875
11876 stub_entry->group->stub_sec->size += pad;
11877 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11878 off -= pad;
11879 }
11880
3d58e1fc
AM
11881 if (info->emitrelocations)
11882 {
04bdff6a
AM
11883 unsigned int num_rel;
11884 if (htab->powerxx_stubs)
11885 num_rel = num_relocs_for_powerxx_offset (off, odd);
11886 else
11887 num_rel = num_relocs_for_offset (off - 8);
11888 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
11889 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11890 }
11891
f891966f
AM
11892 size = plt_stub_size (htab, stub_entry, off);
11893
04bdff6a
AM
11894 if (!htab->powerxx_stubs)
11895 {
11896 /* After the bcl, lr has been modified so we need to emit
11897 .eh_frame info saying the return address is in r12. */
11898 lr_used = stub_entry->stub_offset + 8;
11899 if (stub_entry->stub_type == ppc_stub_plt_call_both)
11900 lr_used += 4;
11901 /* The eh_frame info will consist of a DW_CFA_advance_loc or
11902 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
11903 DW_CFA_restore_extended 65. */
11904 delta = lr_used - stub_entry->group->lr_restore;
11905 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11906 stub_entry->group->lr_restore = lr_used + 8;
11907 }
f891966f
AM
11908 break;
11909
11910 case ppc_stub_plt_call:
11911 case ppc_stub_plt_call_r2save:
11912 targ = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
11913 if (targ >= (bfd_vma) -2)
11914 abort ();
11915 plt = htab->elf.splt;
11916 if (!htab->elf.dynamic_sections_created
11917 || stub_entry->h == NULL
11918 || stub_entry->h->elf.dynindx == -1)
11919 {
11920 if (stub_entry->symtype == STT_GNU_IFUNC)
11921 plt = htab->elf.iplt;
11922 else
11923 plt = htab->pltlocal;
11924 }
11925 targ += plt->output_offset + plt->output_section->vma;
11926
11927 off = (elf_gp (info->output_bfd)
11928 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11929 off = targ - off;
11930
11931 if (htab->params->plt_stub_align != 0)
11932 {
11933 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11934
11935 stub_entry->group->stub_sec->size += pad;
11936 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11937 }
11938
11939 if (info->emitrelocations)
11940 {
11941 stub_entry->group->stub_sec->reloc_count
11942 += ((PPC_HA (off) != 0)
11943 + (htab->opd_abi
11944 ? 2 + (htab->params->plt_static_chain
11945 && PPC_HA (off + 16) == PPC_HA (off))
11946 : 1));
11947 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11948 }
11949
11950 size = plt_stub_size (htab, stub_entry, off);
11951
11952 if (stub_entry->h != NULL
11953 && (stub_entry->h == htab->tls_get_addr_fd
11954 || stub_entry->h == htab->tls_get_addr)
11955 && htab->params->tls_get_addr_opt
11956 && stub_entry->stub_type == ppc_stub_plt_call_r2save)
11957 {
11958 /* After the bctrl, lr has been modified so we need to
11959 emit .eh_frame info saying the return address is
11960 on the stack. In fact we put the EH info specifying
11961 that the return address is on the stack *at* the
11962 call rather than after it, because the EH info for a
11963 call needs to be specified by that point.
11964 See libgcc/unwind-dw2.c execute_cfa_program. */
11965 lr_used = stub_entry->stub_offset + size - 20;
11966 /* The eh_frame info will consist of a DW_CFA_advance_loc
11967 or variant, DW_CFA_offset_externed_sf, 65, -stackoff,
11968 DW_CFA_advance_loc+4, DW_CFA_restore_extended, 65. */
11969 delta = lr_used - stub_entry->group->lr_restore;
11970 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11971 stub_entry->group->lr_restore = size - 4;
11972 }
11973 break;
11974
11975 default:
11976 BFD_FAIL ();
11977 return FALSE;
721956f4
AM
11978 }
11979
6f20ed8a 11980 stub_entry->group->stub_sec->size += size;
b34976b6 11981 return TRUE;
721956f4
AM
11982}
11983
11984/* Set up various things so that we can make a list of input sections
11985 for each output section included in the link. Returns -1 on error,
cedb70c5 11986 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
11987
11988int
e7d1c40c 11989ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4 11990{
6f20ed8a 11991 unsigned int id;
721956f4
AM
11992 bfd_size_type amt;
11993 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11994
4dfe6ac6
NC
11995 if (htab == NULL)
11996 return -1;
4c52953f 11997
7cf7fcc8 11998 htab->sec_info_arr_size = _bfd_section_id;
6f20ed8a
AM
11999 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
12000 htab->sec_info = bfd_zmalloc (amt);
12001 if (htab->sec_info == NULL)
721956f4
AM
12002 return -1;
12003
3d6f9012
AM
12004 /* Set toc_off for com, und, abs and ind sections. */
12005 for (id = 0; id < 3; id++)
6f20ed8a 12006 htab->sec_info[id].toc_off = TOC_BASE_OFF;
734b6cf9 12007
721956f4
AM
12008 return 1;
12009}
12010
927be08e
AM
12011/* Set up for first pass at multitoc partitioning. */
12012
12013void
12014ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
12015{
12016 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12017
1c865ab2 12018 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
12019 htab->toc_bfd = NULL;
12020 htab->toc_first_sec = NULL;
12021}
12022
e717da7e
AM
12023/* The linker repeatedly calls this function for each TOC input section
12024 and linker generated GOT section. Group input bfds such that the toc
927be08e 12025 within a group is less than 64k in size. */
ad8e1ba5 12026
927be08e 12027bfd_boolean
4ce794b7 12028ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
12029{
12030 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 12031 bfd_vma addr, off, limit;
ad8e1ba5 12032
4dfe6ac6
NC
12033 if (htab == NULL)
12034 return FALSE;
12035
927be08e 12036 if (!htab->second_toc_pass)
4c52953f 12037 {
927be08e 12038 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
12039 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
12040
12041 if (new_bfd)
bf102f86
AM
12042 {
12043 htab->toc_bfd = isec->owner;
12044 htab->toc_first_sec = isec;
12045 }
927be08e 12046
bf102f86
AM
12047 addr = isec->output_offset + isec->output_section->vma;
12048 off = addr - htab->toc_curr;
d77c8a4b
AM
12049 limit = 0x80008000;
12050 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
12051 limit = 0x10000;
12052 if (off + isec->size > limit)
bf102f86
AM
12053 {
12054 addr = (htab->toc_first_sec->output_offset
12055 + htab->toc_first_sec->output_section->vma);
12056 htab->toc_curr = addr;
a27e685f 12057 htab->toc_curr &= -TOC_BASE_ALIGN;
bf102f86 12058 }
99877b66 12059
927be08e
AM
12060 /* toc_curr is the base address of this toc group. Set elf_gp
12061 for the input section to be the offset relative to the
12062 output toc base plus 0x8000. Making the input elf_gp an
12063 offset allows us to move the toc as a whole without
12064 recalculating input elf_gp. */
06bcf541 12065 off = htab->toc_curr - elf_gp (info->output_bfd);
927be08e
AM
12066 off += TOC_BASE_OFF;
12067
12068 /* Die if someone uses a linker script that doesn't keep input
12069 file .toc and .got together. */
a4fd3de5
AM
12070 if (new_bfd
12071 && elf_gp (isec->owner) != 0
927be08e
AM
12072 && elf_gp (isec->owner) != off)
12073 return FALSE;
12074
12075 elf_gp (isec->owner) = off;
12076 return TRUE;
4c52953f 12077 }
927be08e
AM
12078
12079 /* During the second pass toc_first_sec points to the start of
12080 a toc group, and toc_curr is used to track the old elf_gp.
12081 We use toc_bfd to ensure we only look at each bfd once. */
12082 if (htab->toc_bfd == isec->owner)
12083 return TRUE;
12084 htab->toc_bfd = isec->owner;
12085
12086 if (htab->toc_first_sec == NULL
12087 || htab->toc_curr != elf_gp (isec->owner))
12088 {
12089 htab->toc_curr = elf_gp (isec->owner);
12090 htab->toc_first_sec = isec;
12091 }
12092 addr = (htab->toc_first_sec->output_offset
12093 + htab->toc_first_sec->output_section->vma);
06bcf541 12094 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
927be08e
AM
12095 elf_gp (isec->owner) = off;
12096
12097 return TRUE;
ad8e1ba5
AM
12098}
12099
927be08e
AM
12100/* Called via elf_link_hash_traverse to merge GOT entries for global
12101 symbol H. */
12102
12103static bfd_boolean
12104merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12105{
12106 if (h->root.type == bfd_link_hash_indirect)
12107 return TRUE;
12108
927be08e
AM
12109 merge_got_entries (&h->got.glist);
12110
12111 return TRUE;
12112}
12113
12114/* Called via elf_link_hash_traverse to allocate GOT entries for global
12115 symbol H. */
12116
12117static bfd_boolean
12118reallocate_got (struct elf_link_hash_entry *h, void *inf)
12119{
12120 struct got_entry *gent;
12121
12122 if (h->root.type == bfd_link_hash_indirect)
12123 return TRUE;
12124
927be08e
AM
12125 for (gent = h->got.glist; gent != NULL; gent = gent->next)
12126 if (!gent->is_indirect)
12127 allocate_got (h, (struct bfd_link_info *) inf, gent);
12128 return TRUE;
12129}
12130
12131/* Called on the first multitoc pass after the last call to
12132 ppc64_elf_next_toc_section. This function removes duplicate GOT
12133 entries. */
12134
12135bfd_boolean
12136ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
12137{
12138 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
12139 struct bfd *ibfd, *ibfd2;
12140 bfd_boolean done_something;
12141
12142 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 12143
7865406b
AM
12144 if (!htab->do_multi_toc)
12145 return FALSE;
12146
d0fae19d 12147 /* Merge global sym got entries within a toc group. */
927be08e
AM
12148 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
12149
12150 /* And tlsld_got. */
c72f2fb2 12151 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12152 {
12153 struct got_entry *ent, *ent2;
12154
12155 if (!is_ppc64_elf (ibfd))
12156 continue;
12157
12158 ent = ppc64_tlsld_got (ibfd);
12159 if (!ent->is_indirect
12160 && ent->got.offset != (bfd_vma) -1)
12161 {
c72f2fb2 12162 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
12163 {
12164 if (!is_ppc64_elf (ibfd2))
12165 continue;
12166
12167 ent2 = ppc64_tlsld_got (ibfd2);
12168 if (!ent2->is_indirect
12169 && ent2->got.offset != (bfd_vma) -1
12170 && elf_gp (ibfd2) == elf_gp (ibfd))
12171 {
12172 ent2->is_indirect = TRUE;
12173 ent2->got.ent = ent;
12174 }
12175 }
12176 }
12177 }
12178
12179 /* Zap sizes of got sections. */
33e44f2e
AM
12180 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
12181 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
12182 htab->got_reli_size = 0;
12183
c72f2fb2 12184 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12185 {
12186 asection *got, *relgot;
12187
12188 if (!is_ppc64_elf (ibfd))
12189 continue;
12190
12191 got = ppc64_elf_tdata (ibfd)->got;
12192 if (got != NULL)
12193 {
12194 got->rawsize = got->size;
12195 got->size = 0;
12196 relgot = ppc64_elf_tdata (ibfd)->relgot;
12197 relgot->rawsize = relgot->size;
12198 relgot->size = 0;
12199 }
12200 }
12201
12202 /* Now reallocate the got, local syms first. We don't need to
12203 allocate section contents again since we never increase size. */
c72f2fb2 12204 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12205 {
12206 struct got_entry **lgot_ents;
12207 struct got_entry **end_lgot_ents;
12208 struct plt_entry **local_plt;
12209 struct plt_entry **end_local_plt;
f961d9dd 12210 unsigned char *lgot_masks;
927be08e
AM
12211 bfd_size_type locsymcount;
12212 Elf_Internal_Shdr *symtab_hdr;
19e08130 12213 asection *s;
927be08e
AM
12214
12215 if (!is_ppc64_elf (ibfd))
12216 continue;
12217
12218 lgot_ents = elf_local_got_ents (ibfd);
12219 if (!lgot_ents)
12220 continue;
12221
12222 symtab_hdr = &elf_symtab_hdr (ibfd);
12223 locsymcount = symtab_hdr->sh_info;
12224 end_lgot_ents = lgot_ents + locsymcount;
12225 local_plt = (struct plt_entry **) end_lgot_ents;
12226 end_local_plt = local_plt + locsymcount;
f961d9dd 12227 lgot_masks = (unsigned char *) end_local_plt;
927be08e 12228 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
12229 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
12230 {
12231 struct got_entry *ent;
12232
12233 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 12234 {
19e08130
AM
12235 unsigned int ent_size = 8;
12236 unsigned int rel_size = sizeof (Elf64_External_Rela);
12237
d0fae19d
AM
12238 ent->got.offset = s->size;
12239 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 12240 {
19e08130
AM
12241 ent_size *= 2;
12242 rel_size *= 2;
12243 }
12244 s->size += ent_size;
37da22e5 12245 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 12246 {
33e44f2e 12247 htab->elf.irelplt->size += rel_size;
19e08130
AM
12248 htab->got_reli_size += rel_size;
12249 }
6a3858a6 12250 else if (bfd_link_pic (info)
f749f26e 12251 && !(ent->tls_type != 0
6a3858a6 12252 && bfd_link_executable (info)))
19e08130
AM
12253 {
12254 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12255 srel->size += rel_size;
d0fae19d
AM
12256 }
12257 }
927be08e
AM
12258 }
12259 }
12260
12261 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
12262
c72f2fb2 12263 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12264 {
12265 struct got_entry *ent;
12266
12267 if (!is_ppc64_elf (ibfd))
12268 continue;
12269
12270 ent = ppc64_tlsld_got (ibfd);
12271 if (!ent->is_indirect
12272 && ent->got.offset != (bfd_vma) -1)
12273 {
12274 asection *s = ppc64_elf_tdata (ibfd)->got;
12275 ent->got.offset = s->size;
12276 s->size += 16;
f749f26e 12277 if (bfd_link_dll (info))
927be08e
AM
12278 {
12279 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12280 srel->size += sizeof (Elf64_External_Rela);
12281 }
12282 }
12283 }
12284
33e44f2e 12285 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 12286 if (!done_something)
c72f2fb2 12287 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12288 {
12289 asection *got;
12290
12291 if (!is_ppc64_elf (ibfd))
12292 continue;
12293
12294 got = ppc64_elf_tdata (ibfd)->got;
12295 if (got != NULL)
12296 {
12297 done_something = got->rawsize != got->size;
12298 if (done_something)
12299 break;
12300 }
12301 }
12302
12303 if (done_something)
e7d1c40c 12304 (*htab->params->layout_sections_again) ();
927be08e
AM
12305
12306 /* Set up for second pass over toc sections to recalculate elf_gp
12307 on input sections. */
12308 htab->toc_bfd = NULL;
12309 htab->toc_first_sec = NULL;
12310 htab->second_toc_pass = TRUE;
12311 return done_something;
12312}
12313
12314/* Called after second pass of multitoc partitioning. */
12315
12316void
12317ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
12318{
12319 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12320
12321 /* After the second pass, toc_curr tracks the TOC offset used
12322 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 12323 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
12324}
12325
9b5ecbd0
AM
12326/* No toc references were found in ISEC. If the code in ISEC makes no
12327 calls, then there's no need to use toc adjusting stubs when branching
12328 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
12329 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
12330 needed, and 2 if a cyclical call-graph was found but no other reason
12331 for a stub was detected. If called from the top level, a return of
12332 2 means the same as a return of 0. */
9b5ecbd0
AM
12333
12334static int
4ce794b7 12335toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 12336{
9b5ecbd0 12337 int ret;
70cc837d
AM
12338
12339 /* Mark this section as checked. */
12340 isec->call_check_done = 1;
9b5ecbd0 12341
772119ce
AM
12342 /* We know none of our code bearing sections will need toc stubs. */
12343 if ((isec->flags & SEC_LINKER_CREATED) != 0)
12344 return 0;
12345
eea6121a 12346 if (isec->size == 0)
082c50f8
AM
12347 return 0;
12348
4c52953f
AM
12349 if (isec->output_section == NULL)
12350 return 0;
12351
4c52953f 12352 ret = 0;
70cc837d 12353 if (isec->reloc_count != 0)
9b5ecbd0 12354 {
70cc837d
AM
12355 Elf_Internal_Rela *relstart, *rel;
12356 Elf_Internal_Sym *local_syms;
12357 struct ppc_link_hash_table *htab;
2917689a 12358
70cc837d
AM
12359 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
12360 info->keep_memory);
12361 if (relstart == NULL)
12362 return -1;
90aecf7a 12363
70cc837d
AM
12364 /* Look for branches to outside of this section. */
12365 local_syms = NULL;
12366 htab = ppc_hash_table (info);
12367 if (htab == NULL)
12368 return -1;
4c52953f 12369
70cc837d 12370 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 12371 {
70cc837d
AM
12372 enum elf_ppc64_reloc_type r_type;
12373 unsigned long r_symndx;
12374 struct elf_link_hash_entry *h;
12375 struct ppc_link_hash_entry *eh;
12376 Elf_Internal_Sym *sym;
12377 asection *sym_sec;
12378 struct _opd_sec_data *opd;
12379 bfd_vma sym_value;
12380 bfd_vma dest;
12381
12382 r_type = ELF64_R_TYPE (rel->r_info);
12383 if (r_type != R_PPC64_REL24
05d0e962 12384 && r_type != R_PPC64_REL24_NOTOC
70cc837d
AM
12385 && r_type != R_PPC64_REL14
12386 && r_type != R_PPC64_REL14_BRTAKEN
23cedd1d 12387 && r_type != R_PPC64_REL14_BRNTAKEN
5663e321
AM
12388 && r_type != R_PPC64_PLTCALL
12389 && r_type != R_PPC64_PLTCALL_NOTOC)
70cc837d 12390 continue;
4c52953f 12391
70cc837d
AM
12392 r_symndx = ELF64_R_SYM (rel->r_info);
12393 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
12394 isec->owner))
4c52953f 12395 {
70cc837d
AM
12396 ret = -1;
12397 break;
12398 }
4c52953f 12399
70cc837d
AM
12400 /* Calls to dynamic lib functions go through a plt call stub
12401 that uses r2. */
12402 eh = (struct ppc_link_hash_entry *) h;
12403 if (eh != NULL
12404 && (eh->elf.plt.plist != NULL
12405 || (eh->oh != NULL
12406 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
12407 {
12408 ret = 1;
12409 break;
4c52953f
AM
12410 }
12411
70cc837d
AM
12412 if (sym_sec == NULL)
12413 /* Ignore other undefined symbols. */
4c52953f 12414 continue;
4c52953f 12415
70cc837d
AM
12416 /* Assume branches to other sections not included in the
12417 link need stubs too, to cover -R and absolute syms. */
12418 if (sym_sec->output_section == NULL)
12419 {
12420 ret = 1;
12421 break;
12422 }
4c52953f 12423
70cc837d
AM
12424 if (h == NULL)
12425 sym_value = sym->st_value;
12426 else
12427 {
12428 if (h->root.type != bfd_link_hash_defined
12429 && h->root.type != bfd_link_hash_defweak)
12430 abort ();
12431 sym_value = h->root.u.def.value;
12432 }
12433 sym_value += rel->r_addend;
4c52953f 12434
70cc837d
AM
12435 /* If this branch reloc uses an opd sym, find the code section. */
12436 opd = get_opd_info (sym_sec);
12437 if (opd != NULL)
12438 {
12439 if (h == NULL && opd->adjust != NULL)
12440 {
12441 long adjust;
4c52953f 12442
92a9c616 12443 adjust = opd->adjust[OPD_NDX (sym_value)];
70cc837d
AM
12444 if (adjust == -1)
12445 /* Assume deleted functions won't ever be called. */
12446 continue;
12447 sym_value += adjust;
12448 }
4c52953f 12449
aef36ac1
AM
12450 dest = opd_entry_value (sym_sec, sym_value,
12451 &sym_sec, NULL, FALSE);
70cc837d
AM
12452 if (dest == (bfd_vma) -1)
12453 continue;
12454 }
12455 else
12456 dest = (sym_value
12457 + sym_sec->output_offset
12458 + sym_sec->output_section->vma);
4c52953f 12459
70cc837d
AM
12460 /* Ignore branch to self. */
12461 if (sym_sec == isec)
12462 continue;
4c52953f 12463
70cc837d
AM
12464 /* If the called function uses the toc, we need a stub. */
12465 if (sym_sec->has_toc_reloc
12466 || sym_sec->makes_toc_func_call)
4c52953f 12467 {
70cc837d 12468 ret = 1;
4c52953f
AM
12469 break;
12470 }
70cc837d
AM
12471
12472 /* Assume any branch that needs a long branch stub might in fact
12473 need a plt_branch stub. A plt_branch stub uses r2. */
12474 else if (dest - (isec->output_offset
12475 + isec->output_section->vma
6911b7dc
AM
12476 + rel->r_offset) + (1 << 25)
12477 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
12478 ? h->other
12479 : sym->st_other))
4c52953f 12480 {
70cc837d
AM
12481 ret = 1;
12482 break;
12483 }
12484
12485 /* If calling back to a section in the process of being
12486 tested, we can't say for sure that no toc adjusting stubs
12487 are needed, so don't return zero. */
12488 else if (sym_sec->call_check_in_progress)
12489 ret = 2;
12490
12491 /* Branches to another section that itself doesn't have any TOC
12492 references are OK. Recursively call ourselves to check. */
12493 else if (!sym_sec->call_check_done)
12494 {
12495 int recur;
12496
12497 /* Mark current section as indeterminate, so that other
12498 sections that call back to current won't be marked as
12499 known. */
12500 isec->call_check_in_progress = 1;
12501 recur = toc_adjusting_stub_needed (info, sym_sec);
12502 isec->call_check_in_progress = 0;
12503
4c52953f
AM
12504 if (recur != 0)
12505 {
70cc837d
AM
12506 ret = recur;
12507 if (recur != 2)
12508 break;
4c52953f
AM
12509 }
12510 }
4c52953f 12511 }
70cc837d
AM
12512
12513 if (local_syms != NULL
12514 && (elf_symtab_hdr (isec->owner).contents
12515 != (unsigned char *) local_syms))
12516 free (local_syms);
12517 if (elf_section_data (isec)->relocs != relstart)
12518 free (relstart);
9b5ecbd0
AM
12519 }
12520
70cc837d
AM
12521 if ((ret & 1) == 0
12522 && isec->map_head.s != NULL
12523 && (strcmp (isec->output_section->name, ".init") == 0
12524 || strcmp (isec->output_section->name, ".fini") == 0))
12525 {
12526 if (isec->map_head.s->has_toc_reloc
12527 || isec->map_head.s->makes_toc_func_call)
12528 ret = 1;
12529 else if (!isec->map_head.s->call_check_done)
12530 {
12531 int recur;
12532 isec->call_check_in_progress = 1;
12533 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
12534 isec->call_check_in_progress = 0;
12535 if (recur != 0)
12536 ret = recur;
12537 }
12538 }
12539
12540 if (ret == 1)
12541 isec->makes_toc_func_call = 1;
4c52953f 12542
9b5ecbd0
AM
12543 return ret;
12544}
12545
721956f4
AM
12546/* The linker repeatedly calls this function for each input section,
12547 in the order that input sections are linked into output sections.
12548 Build lists of input sections to determine groupings between which
12549 we may insert linker stubs. */
12550
9b5ecbd0 12551bfd_boolean
4ce794b7 12552ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
12553{
12554 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12555
4dfe6ac6
NC
12556 if (htab == NULL)
12557 return FALSE;
12558
734b6cf9 12559 if ((isec->output_section->flags & SEC_CODE) != 0
6f20ed8a 12560 && isec->output_section->id < htab->sec_info_arr_size)
721956f4 12561 {
3d6f9012
AM
12562 /* This happens to make the list in reverse order,
12563 which is what we want. */
6f20ed8a
AM
12564 htab->sec_info[isec->id].u.list
12565 = htab->sec_info[isec->output_section->id].u.list;
12566 htab->sec_info[isec->output_section->id].u.list = isec;
721956f4 12567 }
ad8e1ba5 12568
4c52953f 12569 if (htab->multi_toc_needed)
9b5ecbd0 12570 {
8b974ba3
AM
12571 /* Analyse sections that aren't already flagged as needing a
12572 valid toc pointer. Exclude .fixup for the linux kernel.
12573 .fixup contains branches, but only back to the function that
12574 hit an exception. */
12575 if (!(isec->has_toc_reloc
12576 || (isec->flags & SEC_CODE) == 0
12577 || strcmp (isec->name, ".fixup") == 0
12578 || isec->call_check_done))
12579 {
12580 if (toc_adjusting_stub_needed (info, isec) < 0)
6683a28d 12581 return FALSE;
8b974ba3
AM
12582 }
12583 /* Make all sections use the TOC assigned for this object file.
12584 This will be wrong for pasted sections; We fix that in
12585 check_pasted_section(). */
12586 if (elf_gp (isec->owner) != 0)
12587 htab->toc_curr = elf_gp (isec->owner);
12588 }
12589
6f20ed8a 12590 htab->sec_info[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 12591 return TRUE;
721956f4
AM
12592}
12593
70cc837d
AM
12594/* Check that all .init and .fini sections use the same toc, if they
12595 have toc relocs. */
12596
12597static bfd_boolean
12598check_pasted_section (struct bfd_link_info *info, const char *name)
12599{
12600 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12601
12602 if (o != NULL)
12603 {
12604 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12605 bfd_vma toc_off = 0;
12606 asection *i;
12607
12608 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12609 if (i->has_toc_reloc)
12610 {
12611 if (toc_off == 0)
6f20ed8a
AM
12612 toc_off = htab->sec_info[i->id].toc_off;
12613 else if (toc_off != htab->sec_info[i->id].toc_off)
70cc837d
AM
12614 return FALSE;
12615 }
6683a28d
AM
12616
12617 if (toc_off == 0)
12618 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12619 if (i->makes_toc_func_call)
12620 {
6f20ed8a 12621 toc_off = htab->sec_info[i->id].toc_off;
6683a28d
AM
12622 break;
12623 }
12624
70cc837d
AM
12625 /* Make sure the whole pasted function uses the same toc offset. */
12626 if (toc_off != 0)
12627 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
6f20ed8a 12628 htab->sec_info[i->id].toc_off = toc_off;
70cc837d
AM
12629 }
12630 return TRUE;
12631}
12632
12633bfd_boolean
12634ppc64_elf_check_init_fini (struct bfd_link_info *info)
12635{
12636 return (check_pasted_section (info, ".init")
12637 & check_pasted_section (info, ".fini"));
12638}
12639
721956f4
AM
12640/* See whether we can group stub sections together. Grouping stub
12641 sections may result in fewer stubs. More importantly, we need to
12642 put all .init* and .fini* stubs at the beginning of the .init or
12643 .fini output sections respectively, because glibc splits the
12644 _init and _fini functions into multiple parts. Putting a stub in
12645 the middle of a function is not a good idea. */
12646
6f20ed8a
AM
12647static bfd_boolean
12648group_sections (struct bfd_link_info *info,
4ce794b7
AM
12649 bfd_size_type stub_group_size,
12650 bfd_boolean stubs_always_before_branch)
721956f4 12651{
6f20ed8a
AM
12652 struct ppc_link_hash_table *htab;
12653 asection *osec;
7c8fe5c4
AM
12654 bfd_boolean suppress_size_errors;
12655
6f20ed8a
AM
12656 htab = ppc_hash_table (info);
12657 if (htab == NULL)
12658 return FALSE;
12659
7c8fe5c4 12660 suppress_size_errors = FALSE;
7c8fe5c4
AM
12661 if (stub_group_size == 1)
12662 {
12663 /* Default values. */
12664 if (stubs_always_before_branch)
09f92717 12665 stub_group_size = 0x1e00000;
7c8fe5c4 12666 else
09f92717 12667 stub_group_size = 0x1c00000;
7c8fe5c4
AM
12668 suppress_size_errors = TRUE;
12669 }
12670
6f20ed8a 12671 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
721956f4 12672 {
6f20ed8a
AM
12673 asection *tail;
12674
12675 if (osec->id >= htab->sec_info_arr_size)
12676 continue;
12677
12678 tail = htab->sec_info[osec->id].u.list;
734b6cf9 12679 while (tail != NULL)
721956f4 12680 {
734b6cf9
AM
12681 asection *curr;
12682 asection *prev;
12683 bfd_size_type total;
12684 bfd_boolean big_sec;
12685 bfd_vma curr_toc;
6f20ed8a 12686 struct map_stub *group;
09f92717 12687 bfd_size_type group_size;
734b6cf9
AM
12688
12689 curr = tail;
eea6121a 12690 total = tail->size;
09f92717
AM
12691 group_size = (ppc64_elf_section_data (tail) != NULL
12692 && ppc64_elf_section_data (tail)->has_14bit_branch
12693 ? stub_group_size >> 10 : stub_group_size);
12694
12695 big_sec = total > group_size;
7c8fe5c4 12696 if (big_sec && !suppress_size_errors)
695344c0 12697 /* xgettext:c-format */
871b3ab2 12698 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
4eca0228 12699 tail->owner, tail);
6f20ed8a 12700 curr_toc = htab->sec_info[tail->id].toc_off;
734b6cf9 12701
6f20ed8a 12702 while ((prev = htab->sec_info[curr->id].u.list) != NULL
734b6cf9 12703 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
12704 < (ppc64_elf_section_data (prev) != NULL
12705 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12706 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12707 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12708 curr = prev;
12709
12710 /* OK, the size from the start of CURR to the end is less
09f92717 12711 than group_size and thus can be handled by one stub
734b6cf9 12712 section. (or the tail section is itself larger than
09f92717
AM
12713 group_size, in which case we may be toast.) We should
12714 really be keeping track of the total size of stubs added
12715 here, as stubs contribute to the final output section
12716 size. That's a little tricky, and this way will only
12717 break if stubs added make the total size more than 2^25,
12718 ie. for the default stub_group_size, if stubs total more
12719 than 2097152 bytes, or nearly 75000 plt call stubs. */
6f20ed8a
AM
12720 group = bfd_alloc (curr->owner, sizeof (*group));
12721 if (group == NULL)
12722 return FALSE;
12723 group->link_sec = curr;
12724 group->stub_sec = NULL;
a4b6fadd 12725 group->needs_save_res = 0;
df136d64
AM
12726 group->lr_restore = 0;
12727 group->eh_size = 0;
12728 group->eh_base = 0;
a4b6fadd
AM
12729 group->next = htab->group;
12730 htab->group = group;
734b6cf9 12731 do
721956f4 12732 {
6f20ed8a 12733 prev = htab->sec_info[tail->id].u.list;
734b6cf9 12734 /* Set up this stub group. */
6f20ed8a 12735 htab->sec_info[tail->id].u.group = group;
721956f4 12736 }
734b6cf9
AM
12737 while (tail != curr && (tail = prev) != NULL);
12738
09f92717 12739 /* But wait, there's more! Input sections up to group_size
734b6cf9
AM
12740 bytes before the stub section can be handled by it too.
12741 Don't do this if we have a really large section after the
12742 stubs, as adding more stubs increases the chance that
12743 branches may not reach into the stub section. */
12744 if (!stubs_always_before_branch && !big_sec)
12745 {
12746 total = 0;
12747 while (prev != NULL
12748 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
12749 < (ppc64_elf_section_data (prev) != NULL
12750 && ppc64_elf_section_data (prev)->has_14bit_branch
2cdcc330
AM
12751 ? (group_size = stub_group_size >> 10)
12752 : group_size))
6f20ed8a 12753 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12754 {
12755 tail = prev;
6f20ed8a
AM
12756 prev = htab->sec_info[tail->id].u.list;
12757 htab->sec_info[tail->id].u.group = group;
734b6cf9
AM
12758 }
12759 }
12760 tail = prev;
721956f4
AM
12761 }
12762 }
6f20ed8a 12763 return TRUE;
721956f4
AM
12764}
12765
58d180e8
AM
12766static const unsigned char glink_eh_frame_cie[] =
12767{
12768 0, 0, 0, 16, /* length. */
12769 0, 0, 0, 0, /* id. */
12770 1, /* CIE version. */
12771 'z', 'R', 0, /* Augmentation string. */
12772 4, /* Code alignment. */
12773 0x78, /* Data alignment. */
12774 65, /* RA reg. */
12775 1, /* Augmentation size. */
12776 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
2e0ce1c8 12777 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
58d180e8
AM
12778};
12779
d969d15f
AM
12780/* Stripping output sections is normally done before dynamic section
12781 symbols have been allocated. This function is called later, and
12782 handles cases like htab->brlt which is mapped to its own output
12783 section. */
12784
12785static void
12786maybe_strip_output (struct bfd_link_info *info, asection *isec)
12787{
12788 if (isec->size == 0
12789 && isec->output_section->size == 0
53d8967a 12790 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
12791 && !bfd_section_removed_from_list (info->output_bfd,
12792 isec->output_section)
12793 && elf_section_data (isec->output_section)->dynindx == 0)
12794 {
12795 isec->output_section->flags |= SEC_EXCLUDE;
12796 bfd_section_list_remove (info->output_bfd, isec->output_section);
12797 info->output_bfd->section_count--;
12798 }
12799}
12800
721956f4
AM
12801/* Determine and set the size of the stub section for a final link.
12802
12803 The basic idea here is to examine all the relocations looking for
12804 PC-relative calls to a target that is unreachable with a "bl"
12805 instruction. */
12806
b34976b6 12807bfd_boolean
e7d1c40c 12808ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
12809{
12810 bfd_size_type stub_group_size;
b34976b6 12811 bfd_boolean stubs_always_before_branch;
721956f4
AM
12812 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12813
4dfe6ac6
NC
12814 if (htab == NULL)
12815 return FALSE;
12816
0e1862bb 12817 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
e7d1c40c 12818 htab->params->plt_thread_safe = 1;
b9e5796b 12819 if (!htab->opd_abi)
e7d1c40c
AM
12820 htab->params->plt_thread_safe = 0;
12821 else if (htab->params->plt_thread_safe == -1)
794e51c0 12822 {
e2458743 12823 static const char *const thread_starter[] =
794e51c0
AM
12824 {
12825 "pthread_create",
12826 /* libstdc++ */
12827 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12828 /* librt */
12829 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12830 "mq_notify", "create_timer",
12831 /* libanl */
12832 "getaddrinfo_a",
12833 /* libgomp */
2300b5a1 12834 "GOMP_parallel",
794e51c0 12835 "GOMP_parallel_start",
2300b5a1 12836 "GOMP_parallel_loop_static",
794e51c0 12837 "GOMP_parallel_loop_static_start",
2300b5a1 12838 "GOMP_parallel_loop_dynamic",
794e51c0 12839 "GOMP_parallel_loop_dynamic_start",
2300b5a1 12840 "GOMP_parallel_loop_guided",
794e51c0 12841 "GOMP_parallel_loop_guided_start",
2300b5a1 12842 "GOMP_parallel_loop_runtime",
794e51c0 12843 "GOMP_parallel_loop_runtime_start",
2300b5a1 12844 "GOMP_parallel_sections",
68ffbac6 12845 "GOMP_parallel_sections_start",
f9dffbf0
AM
12846 /* libgo */
12847 "__go_go",
794e51c0
AM
12848 };
12849 unsigned i;
12850
a4b6fadd 12851 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
794e51c0
AM
12852 {
12853 struct elf_link_hash_entry *h;
12854 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12855 FALSE, FALSE, TRUE);
e7d1c40c
AM
12856 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12857 if (htab->params->plt_thread_safe)
794e51c0
AM
12858 break;
12859 }
12860 }
e7d1c40c
AM
12861 stubs_always_before_branch = htab->params->group_size < 0;
12862 if (htab->params->group_size < 0)
12863 stub_group_size = -htab->params->group_size;
721956f4 12864 else
e7d1c40c 12865 stub_group_size = htab->params->group_size;
721956f4 12866
6f20ed8a
AM
12867 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12868 return FALSE;
721956f4 12869
c9301e31
AM
12870#define STUB_SHRINK_ITER 20
12871 /* Loop until no stubs added. After iteration 20 of this loop we may
12872 exit on a stub section shrinking. This is to break out of a
12873 pathological case where adding stubs on one iteration decreases
12874 section gaps (perhaps due to alignment), which then requires
12875 fewer or smaller stubs on the next iteration. */
12876
721956f4
AM
12877 while (1)
12878 {
12879 bfd *input_bfd;
12880 unsigned int bfd_indx;
a4b6fadd 12881 struct map_stub *group;
721956f4
AM
12882
12883 htab->stub_iteration += 1;
721956f4
AM
12884
12885 for (input_bfd = info->input_bfds, bfd_indx = 0;
12886 input_bfd != NULL;
c72f2fb2 12887 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
12888 {
12889 Elf_Internal_Shdr *symtab_hdr;
12890 asection *section;
6cdc0ccc 12891 Elf_Internal_Sym *local_syms = NULL;
721956f4 12892
0c8d6e5c 12893 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
12894 continue;
12895
721956f4 12896 /* We'll need the symbol table in a second. */
0ffa91dd 12897 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
12898 if (symtab_hdr->sh_info == 0)
12899 continue;
12900
721956f4
AM
12901 /* Walk over each section attached to the input bfd. */
12902 for (section = input_bfd->sections;
12903 section != NULL;
12904 section = section->next)
12905 {
721956f4 12906 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
12907
12908 /* If there aren't any relocs, then there's nothing more
12909 to do. */
12910 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
12911 || (section->flags & SEC_ALLOC) == 0
12912 || (section->flags & SEC_LOAD) == 0
12913 || (section->flags & SEC_CODE) == 0
721956f4
AM
12914 || section->reloc_count == 0)
12915 continue;
12916
12917 /* If this section is a link-once section that will be
12918 discarded, then don't create any stubs. */
12919 if (section->output_section == NULL
927be08e 12920 || section->output_section->owner != info->output_bfd)
721956f4
AM
12921 continue;
12922
1e2f5b6e
AM
12923 /* Get the relocs. */
12924 internal_relocs
4ce794b7 12925 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 12926 info->keep_memory);
721956f4 12927 if (internal_relocs == NULL)
1e2f5b6e 12928 goto error_ret_free_local;
721956f4
AM
12929
12930 /* Now examine each relocation. */
12931 irela = internal_relocs;
12932 irelaend = irela + section->reloc_count;
12933 for (; irela < irelaend; irela++)
12934 {
4ce794b7
AM
12935 enum elf_ppc64_reloc_type r_type;
12936 unsigned int r_indx;
721956f4
AM
12937 enum ppc_stub_type stub_type;
12938 struct ppc_stub_hash_entry *stub_entry;
8387904d 12939 asection *sym_sec, *code_sec;
e054468f 12940 bfd_vma sym_value, code_value;
721956f4 12941 bfd_vma destination;
6911b7dc 12942 unsigned long local_off;
8843416a 12943 bfd_boolean ok_dest;
721956f4 12944 struct ppc_link_hash_entry *hash;
8387904d 12945 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
12946 struct elf_link_hash_entry *h;
12947 Elf_Internal_Sym *sym;
721956f4
AM
12948 char *stub_name;
12949 const asection *id_sec;
74f0fb50 12950 struct _opd_sec_data *opd;
e054468f 12951 struct plt_entry *plt_ent;
721956f4
AM
12952
12953 r_type = ELF64_R_TYPE (irela->r_info);
12954 r_indx = ELF64_R_SYM (irela->r_info);
12955
4ce794b7 12956 if (r_type >= R_PPC64_max)
721956f4
AM
12957 {
12958 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 12959 goto error_ret_free_internal;
721956f4
AM
12960 }
12961
12962 /* Only look for stubs on branch instructions. */
4ce794b7 12963 if (r_type != R_PPC64_REL24
05d0e962 12964 && r_type != R_PPC64_REL24_NOTOC
4ce794b7
AM
12965 && r_type != R_PPC64_REL14
12966 && r_type != R_PPC64_REL14_BRTAKEN
12967 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
12968 continue;
12969
12970 /* Now determine the call target, its name, value,
12971 section. */
411e1bfb
AM
12972 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12973 r_indx, input_bfd))
12974 goto error_ret_free_internal;
12975 hash = (struct ppc_link_hash_entry *) h;
12976
8843416a 12977 ok_dest = FALSE;
8387904d 12978 fdh = NULL;
7fe2b9a6 12979 sym_value = 0;
411e1bfb 12980 if (hash == NULL)
721956f4 12981 {
411e1bfb 12982 sym_value = sym->st_value;
c27b8c2a
AM
12983 if (sym_sec != NULL
12984 && sym_sec->output_section != NULL)
12985 ok_dest = TRUE;
721956f4 12986 }
7fe2b9a6
AM
12987 else if (hash->elf.root.type == bfd_link_hash_defined
12988 || hash->elf.root.type == bfd_link_hash_defweak)
12989 {
12990 sym_value = hash->elf.root.u.def.value;
12991 if (sym_sec->output_section != NULL)
12992 ok_dest = TRUE;
12993 }
12994 else if (hash->elf.root.type == bfd_link_hash_undefweak
12995 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 12996 {
99877b66 12997 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
12998 use the func descriptor sym instead if it is
12999 defined. */
ceb1f1ef 13000 if (hash->elf.root.root.string[0] == '.'
8c5b4e52 13001 && hash->oh != NULL)
8387904d 13002 {
8c5b4e52 13003 fdh = ppc_follow_link (hash->oh);
8387904d
AM
13004 if (fdh->elf.root.type == bfd_link_hash_defined
13005 || fdh->elf.root.type == bfd_link_hash_defweak)
13006 {
13007 sym_sec = fdh->elf.root.u.def.section;
13008 sym_value = fdh->elf.root.u.def.value;
13009 if (sym_sec->output_section != NULL)
13010 ok_dest = TRUE;
13011 }
99877b66
AM
13012 else
13013 fdh = NULL;
8387904d 13014 }
7fe2b9a6
AM
13015 }
13016 else
13017 {
13018 bfd_set_error (bfd_error_bad_value);
13019 goto error_ret_free_internal;
721956f4
AM
13020 }
13021
8843416a 13022 destination = 0;
6911b7dc 13023 local_off = 0;
8843416a
AM
13024 if (ok_dest)
13025 {
13026 sym_value += irela->r_addend;
13027 destination = (sym_value
13028 + sym_sec->output_offset
13029 + sym_sec->output_section->vma);
6911b7dc
AM
13030 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
13031 ? hash->elf.other
13032 : sym->st_other);
8843416a
AM
13033 }
13034
8387904d 13035 code_sec = sym_sec;
e054468f 13036 code_value = sym_value;
74f0fb50
AM
13037 opd = get_opd_info (sym_sec);
13038 if (opd != NULL)
8387904d
AM
13039 {
13040 bfd_vma dest;
13041
74f0fb50 13042 if (hash == NULL && opd->adjust != NULL)
8387904d 13043 {
51aecdc5 13044 long adjust = opd->adjust[OPD_NDX (sym_value)];
8387904d
AM
13045 if (adjust == -1)
13046 continue;
e054468f 13047 code_value += adjust;
8387904d
AM
13048 sym_value += adjust;
13049 }
13050 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 13051 &code_sec, &code_value, FALSE);
8387904d
AM
13052 if (dest != (bfd_vma) -1)
13053 {
13054 destination = dest;
13055 if (fdh != NULL)
13056 {
13057 /* Fixup old ABI sym to point at code
13058 entry. */
99877b66 13059 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 13060 hash->elf.root.u.def.section = code_sec;
e054468f 13061 hash->elf.root.u.def.value = code_value;
8387904d
AM
13062 }
13063 }
13064 }
13065
721956f4 13066 /* Determine what (if any) linker stub is needed. */
e054468f 13067 plt_ent = NULL;
721956f4 13068 stub_type = ppc_type_of_stub (section, irela, &hash,
6911b7dc
AM
13069 &plt_ent, destination,
13070 local_off);
ad8e1ba5 13071
05d0e962
AM
13072 if (r_type == R_PPC64_REL24_NOTOC)
13073 {
13074 if (stub_type == ppc_stub_plt_call)
13075 stub_type = ppc_stub_plt_call_notoc;
13076 else if (stub_type == ppc_stub_long_branch
13077 || (code_sec != NULL
13078 && code_sec->output_section != NULL
13079 && (((hash ? hash->elf.other : sym->st_other)
13080 & STO_PPC64_LOCAL_MASK)
4a4e7361 13081 > 1 << STO_PPC64_LOCAL_BIT)))
05d0e962
AM
13082 stub_type = ppc_stub_long_branch_notoc;
13083 }
13084 else if (stub_type != ppc_stub_plt_call)
ad8e1ba5
AM
13085 {
13086 /* Check whether we need a TOC adjusting stub.
13087 Since the linker pastes together pieces from
13088 different object files when creating the
13089 _init and _fini functions, it may be that a
13090 call to what looks like a local sym is in
13091 fact a call needing a TOC adjustment. */
33cb30a1
AM
13092 if ((code_sec != NULL
13093 && code_sec->output_section != NULL
13094 && (htab->sec_info[code_sec->id].toc_off
13095 != htab->sec_info[section->id].toc_off)
13096 && (code_sec->has_toc_reloc
13097 || code_sec->makes_toc_func_call))
13098 || (((hash ? hash->elf.other : sym->st_other)
13099 & STO_PPC64_LOCAL_MASK)
13100 == 1 << STO_PPC64_LOCAL_BIT))
ad8e1ba5
AM
13101 stub_type = ppc_stub_long_branch_r2off;
13102 }
13103
721956f4
AM
13104 if (stub_type == ppc_stub_none)
13105 continue;
13106
411e1bfb
AM
13107 /* __tls_get_addr calls might be eliminated. */
13108 if (stub_type != ppc_stub_plt_call
05d0e962 13109 && stub_type != ppc_stub_plt_call_notoc
411e1bfb 13110 && hash != NULL
8387904d
AM
13111 && (hash == htab->tls_get_addr
13112 || hash == htab->tls_get_addr_fd)
411e1bfb
AM
13113 && section->has_tls_reloc
13114 && irela != internal_relocs)
13115 {
13116 /* Get tls info. */
f961d9dd 13117 unsigned char *tls_mask;
411e1bfb 13118
3a71aa26 13119 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
13120 irela - 1, input_bfd))
13121 goto error_ret_free_internal;
a2bf3f0c
AM
13122 if ((*tls_mask & TLS_TLS) != 0
13123 && (*tls_mask & (TLS_GD | TLS_LD)) == 0)
411e1bfb
AM
13124 continue;
13125 }
13126
f378ab09 13127 if (stub_type == ppc_stub_plt_call)
794e51c0 13128 {
6e1816be
AM
13129 if (!htab->opd_abi
13130 && htab->params->plt_localentry0 != 0
13131 && is_elfv2_localentry0 (&hash->elf))
13132 htab->has_plt_localentry0 = 1;
13133 else if (irela + 1 < irelaend
13134 && irela[1].r_offset == irela->r_offset + 4
13135 && (ELF64_R_TYPE (irela[1].r_info)
13136 == R_PPC64_TOCSAVE))
f378ab09
AM
13137 {
13138 if (!tocsave_find (htab, INSERT,
13139 &local_syms, irela + 1, input_bfd))
13140 goto error_ret_free_internal;
13141 }
f378ab09
AM
13142 else
13143 stub_type = ppc_stub_plt_call_r2save;
794e51c0 13144 }
3b421ab3 13145
721956f4 13146 /* Support for grouping stub sections. */
6f20ed8a 13147 id_sec = htab->sec_info[section->id].u.group->link_sec;
721956f4
AM
13148
13149 /* Get the name of this stub. */
13150 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
13151 if (!stub_name)
13152 goto error_ret_free_internal;
13153
13154 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 13155 stub_name, FALSE, FALSE);
721956f4
AM
13156 if (stub_entry != NULL)
13157 {
05d0e962
AM
13158 enum ppc_stub_type old_type;
13159 /* A stub has already been created, but it may
13160 not be the required type. We shouldn't be
13161 transitioning from plt_call to long_branch
13162 stubs or vice versa, but we might be
13163 upgrading from plt_call to plt_call_r2save or
13164 from long_branch to long_branch_r2off. */
721956f4 13165 free (stub_name);
05d0e962
AM
13166 old_type = stub_entry->stub_type;
13167 switch (old_type)
13168 {
13169 default:
13170 abort ();
13171
13172 case ppc_stub_save_res:
13173 continue;
13174
13175 case ppc_stub_plt_call:
13176 case ppc_stub_plt_call_r2save:
13177 case ppc_stub_plt_call_notoc:
13178 case ppc_stub_plt_call_both:
13179 if (stub_type == ppc_stub_plt_call)
13180 continue;
13181 else if (stub_type == ppc_stub_plt_call_r2save)
13182 {
13183 if (old_type == ppc_stub_plt_call_notoc)
13184 stub_type = ppc_stub_plt_call_both;
13185 }
13186 else if (stub_type == ppc_stub_plt_call_notoc)
13187 {
13188 if (old_type == ppc_stub_plt_call_r2save)
13189 stub_type = ppc_stub_plt_call_both;
13190 }
13191 else
13192 abort ();
13193 break;
13194
13195 case ppc_stub_plt_branch:
13196 case ppc_stub_plt_branch_r2off:
13197 case ppc_stub_plt_branch_notoc:
13198 case ppc_stub_plt_branch_both:
13199 old_type += (ppc_stub_long_branch
13200 - ppc_stub_plt_branch);
13201 /* Fall through. */
13202 case ppc_stub_long_branch:
13203 case ppc_stub_long_branch_r2off:
13204 case ppc_stub_long_branch_notoc:
13205 case ppc_stub_long_branch_both:
13206 if (stub_type == ppc_stub_long_branch)
13207 continue;
13208 else if (stub_type == ppc_stub_long_branch_r2off)
13209 {
13210 if (old_type == ppc_stub_long_branch_notoc)
13211 stub_type = ppc_stub_long_branch_both;
13212 }
13213 else if (stub_type == ppc_stub_long_branch_notoc)
13214 {
13215 if (old_type == ppc_stub_long_branch_r2off)
13216 stub_type = ppc_stub_long_branch_both;
13217 }
13218 else
13219 abort ();
13220 break;
13221 }
13222 if (old_type < stub_type)
794e51c0 13223 stub_entry->stub_type = stub_type;
721956f4
AM
13224 continue;
13225 }
13226
25f53a85 13227 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
13228 if (stub_entry == NULL)
13229 {
13230 free (stub_name);
6cdc0ccc
AM
13231 error_ret_free_internal:
13232 if (elf_section_data (section)->relocs == NULL)
13233 free (internal_relocs);
13234 error_ret_free_local:
13235 if (local_syms != NULL
13236 && (symtab_hdr->contents
13237 != (unsigned char *) local_syms))
13238 free (local_syms);
b34976b6 13239 return FALSE;
721956f4
AM
13240 }
13241
ad8e1ba5 13242 stub_entry->stub_type = stub_type;
05d0e962
AM
13243 if (stub_type >= ppc_stub_plt_call
13244 && stub_type <= ppc_stub_plt_call_both)
e054468f 13245 {
05d0e962
AM
13246 stub_entry->target_value = sym_value;
13247 stub_entry->target_section = sym_sec;
e054468f
AM
13248 }
13249 else
13250 {
05d0e962
AM
13251 stub_entry->target_value = code_value;
13252 stub_entry->target_section = code_sec;
e054468f 13253 }
721956f4 13254 stub_entry->h = hash;
e054468f 13255 stub_entry->plt_ent = plt_ent;
2d7ad24e
AM
13256 stub_entry->symtype
13257 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
6911b7dc 13258 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95 13259
3d58e1fc
AM
13260 if (hash != NULL
13261 && (hash->elf.root.type == bfd_link_hash_defined
13262 || hash->elf.root.type == bfd_link_hash_defweak))
ee75fd95 13263 htab->stub_globals += 1;
721956f4
AM
13264 }
13265
13266 /* We're done with the internal relocs, free them. */
6cdc0ccc 13267 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 13268 free (internal_relocs);
721956f4 13269 }
6cdc0ccc
AM
13270
13271 if (local_syms != NULL
13272 && symtab_hdr->contents != (unsigned char *) local_syms)
13273 {
13274 if (!info->keep_memory)
13275 free (local_syms);
13276 else
13277 symtab_hdr->contents = (unsigned char *) local_syms;
13278 }
721956f4
AM
13279 }
13280
5c3dead3 13281 /* We may have added some stubs. Find out the new size of the
721956f4 13282 stub sections. */
d4aaa2a0 13283 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13284 {
13285 group->lr_restore = 0;
13286 group->eh_size = 0;
13287 if (group->stub_sec != NULL)
13288 {
13289 asection *stub_sec = group->stub_sec;
13290
13291 if (htab->stub_iteration <= STUB_SHRINK_ITER
13292 || stub_sec->rawsize < stub_sec->size)
13293 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
13294 stub_sec->rawsize = stub_sec->size;
13295 stub_sec->size = 0;
13296 stub_sec->reloc_count = 0;
13297 stub_sec->flags &= ~SEC_RELOC;
13298 }
13299 }
eea6121a 13300
ba21f564
AM
13301 if (htab->stub_iteration <= STUB_SHRINK_ITER
13302 || htab->brlt->rawsize < htab->brlt->size)
13303 htab->brlt->rawsize = htab->brlt->size;
eea6121a 13304 htab->brlt->size = 0;
84f5d08e
AM
13305 htab->brlt->reloc_count = 0;
13306 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 13307 if (htab->relbrlt != NULL)
eea6121a 13308 htab->relbrlt->size = 0;
721956f4 13309
63bc6f6c 13310 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 13311
a4b6fadd
AM
13312 for (group = htab->group; group != NULL; group = group->next)
13313 if (group->needs_save_res)
13314 group->stub_sec->size += htab->sfpr->size;
13315
176a0d42
AM
13316 if (info->emitrelocations
13317 && htab->glink != NULL && htab->glink->size != 0)
13318 {
13319 htab->glink->reloc_count = 1;
13320 htab->glink->flags |= SEC_RELOC;
13321 }
13322
58d180e8
AM
13323 if (htab->glink_eh_frame != NULL
13324 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
2d0d44d5 13325 && htab->glink_eh_frame->output_section->size > 8)
58d180e8 13326 {
2e0ce1c8 13327 size_t size = 0, align = 4;
58d180e8 13328
d4aaa2a0 13329 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13330 if (group->eh_size != 0)
13331 size += (group->eh_size + 17 + align - 1) & -align;
58d180e8 13332 if (htab->glink != NULL && htab->glink->size != 0)
2e0ce1c8 13333 size += (24 + align - 1) & -align;
58d180e8 13334 if (size != 0)
2e0ce1c8
AM
13335 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
13336 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
13337 size = (size + align - 1) & -align;
58d180e8
AM
13338 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
13339 htab->glink_eh_frame->size = size;
13340 }
13341
e7d1c40c 13342 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13343 for (group = htab->group; group != NULL; group = group->next)
13344 if (group->stub_sec != NULL)
691d2e9a
AM
13345 {
13346 int align = abs (htab->params->plt_stub_align);
13347 group->stub_sec->size
13348 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
13349 }
d4aaa2a0
AM
13350
13351 for (group = htab->group; group != NULL; group = group->next)
13352 if (group->stub_sec != NULL
13353 && group->stub_sec->rawsize != group->stub_sec->size
c9301e31 13354 && (htab->stub_iteration <= STUB_SHRINK_ITER
d4aaa2a0 13355 || group->stub_sec->rawsize < group->stub_sec->size))
5c3dead3
AM
13356 break;
13357
d4aaa2a0 13358 if (group == NULL
ba21f564
AM
13359 && (htab->brlt->rawsize == htab->brlt->size
13360 || (htab->stub_iteration > STUB_SHRINK_ITER
13361 && htab->brlt->rawsize > htab->brlt->size))
58d180e8
AM
13362 && (htab->glink_eh_frame == NULL
13363 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
5c3dead3
AM
13364 break;
13365
721956f4 13366 /* Ask the linker to do its stuff. */
e7d1c40c 13367 (*htab->params->layout_sections_again) ();
721956f4
AM
13368 }
13369
da44f4e5
AM
13370 if (htab->glink_eh_frame != NULL
13371 && htab->glink_eh_frame->size != 0)
13372 {
13373 bfd_vma val;
13374 bfd_byte *p, *last_fde;
13375 size_t last_fde_len, size, align, pad;
d4aaa2a0 13376 struct map_stub *group;
da44f4e5 13377
df136d64
AM
13378 /* It is necessary to at least have a rough outline of the
13379 linker generated CIEs and FDEs written before
13380 bfd_elf_discard_info is run, in order for these FDEs to be
13381 indexed in .eh_frame_hdr. */
da44f4e5
AM
13382 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
13383 if (p == NULL)
13384 return FALSE;
13385 htab->glink_eh_frame->contents = p;
13386 last_fde = p;
2e0ce1c8 13387 align = 4;
da44f4e5
AM
13388
13389 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
13390 /* CIE length (rewrite in case little-endian). */
2e0ce1c8 13391 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
da44f4e5 13392 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
2e0ce1c8 13393 p += last_fde_len + 4;
da44f4e5 13394
d4aaa2a0 13395 for (group = htab->group; group != NULL; group = group->next)
df136d64 13396 if (group->eh_size != 0)
da44f4e5 13397 {
df136d64 13398 group->eh_base = p - htab->glink_eh_frame->contents;
da44f4e5 13399 last_fde = p;
df136d64 13400 last_fde_len = ((group->eh_size + 17 + align - 1) & -align) - 4;
da44f4e5 13401 /* FDE length. */
2e0ce1c8 13402 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13403 p += 4;
13404 /* CIE pointer. */
13405 val = p - htab->glink_eh_frame->contents;
13406 bfd_put_32 (htab->elf.dynobj, val, p);
13407 p += 4;
13408 /* Offset to stub section, written later. */
13409 p += 4;
13410 /* stub section size. */
d4aaa2a0 13411 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
da44f4e5
AM
13412 p += 4;
13413 /* Augmentation. */
13414 p += 1;
df136d64
AM
13415 /* Make sure we don't have all nops. This is enough for
13416 elf-eh-frame.c to detect the last non-nop opcode. */
13417 p[group->eh_size - 1] = DW_CFA_advance_loc + 1;
d4aaa2a0 13418 p = last_fde + last_fde_len + 4;
da44f4e5
AM
13419 }
13420 if (htab->glink != NULL && htab->glink->size != 0)
13421 {
13422 last_fde = p;
2e0ce1c8 13423 last_fde_len = ((24 + align - 1) & -align) - 4;
da44f4e5 13424 /* FDE length. */
2e0ce1c8 13425 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13426 p += 4;
13427 /* CIE pointer. */
13428 val = p - htab->glink_eh_frame->contents;
13429 bfd_put_32 (htab->elf.dynobj, val, p);
13430 p += 4;
13431 /* Offset to .glink, written later. */
13432 p += 4;
13433 /* .glink size. */
13434 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
13435 p += 4;
13436 /* Augmentation. */
13437 p += 1;
13438
13439 *p++ = DW_CFA_advance_loc + 1;
13440 *p++ = DW_CFA_register;
13441 *p++ = 65;
9f08fa5c 13442 *p++ = htab->opd_abi ? 12 : 0;
15a3a14f 13443 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
da44f4e5
AM
13444 *p++ = DW_CFA_restore_extended;
13445 *p++ = 65;
2e0ce1c8 13446 p += ((24 + align - 1) & -align) - 24;
da44f4e5
AM
13447 }
13448 /* Subsume any padding into the last FDE if user .eh_frame
13449 sections are aligned more than glink_eh_frame. Otherwise any
13450 zero padding will be seen as a terminator. */
2e0ce1c8 13451 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
da44f4e5 13452 size = p - htab->glink_eh_frame->contents;
2e0ce1c8 13453 pad = ((size + align - 1) & -align) - size;
da44f4e5
AM
13454 htab->glink_eh_frame->size = size + pad;
13455 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
13456 }
13457
d969d15f
AM
13458 maybe_strip_output (info, htab->brlt);
13459 if (htab->glink_eh_frame != NULL)
13460 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 13461
b34976b6 13462 return TRUE;
721956f4
AM
13463}
13464
13465/* Called after we have determined section placement. If sections
805fc799 13466 move, we'll be called again. Provide a value for TOCstart. */
721956f4 13467
805fc799 13468bfd_vma
1c865ab2 13469ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 13470{
805fc799 13471 asection *s;
a27e685f 13472 bfd_vma TOCstart, adjust;
721956f4 13473
43417696
AM
13474 if (info != NULL)
13475 {
13476 struct elf_link_hash_entry *h;
13477 struct elf_link_hash_table *htab = elf_hash_table (info);
13478
13479 if (is_elf_hash_table (htab)
13480 && htab->hgot != NULL)
13481 h = htab->hgot;
13482 else
13483 {
13484 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
13485 if (is_elf_hash_table (htab))
13486 htab->hgot = h;
13487 }
13488 if (h != NULL
13489 && h->root.type == bfd_link_hash_defined
13490 && !h->root.linker_def
13491 && (!is_elf_hash_table (htab)
13492 || h->def_regular))
13493 {
13494 TOCstart = (h->root.u.def.value - TOC_BASE_OFF
13495 + h->root.u.def.section->output_offset
13496 + h->root.u.def.section->output_section->vma);
13497 _bfd_set_gp_value (obfd, TOCstart);
13498 return TOCstart;
13499 }
13500 }
13501
805fc799
AM
13502 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
13503 order. The TOC starts where the first of these sections starts. */
13504 s = bfd_get_section_by_name (obfd, ".got");
e054468f 13505 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13506 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 13507 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13508 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 13509 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13510 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 13511 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
13512 {
13513 /* This may happen for
13514 o references to TOC base (SYM@toc / TOC[tc0]) without a
13515 .toc directive
13516 o bad linker script
13517 o --gc-sections and empty TOC sections
13518
13519 FIXME: Warn user? */
13520
13521 /* Look for a likely section. We probably won't even be
13522 using TOCstart. */
13523 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13524 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
13525 | SEC_EXCLUDE))
805fc799
AM
13526 == (SEC_ALLOC | SEC_SMALL_DATA))
13527 break;
721956f4 13528 if (s == NULL)
805fc799 13529 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13530 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
13531 == (SEC_ALLOC | SEC_SMALL_DATA))
13532 break;
721956f4 13533 if (s == NULL)
805fc799 13534 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13535 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
13536 == SEC_ALLOC)
805fc799 13537 break;
721956f4 13538 if (s == NULL)
805fc799 13539 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13540 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
13541 break;
13542 }
721956f4 13543
805fc799
AM
13544 TOCstart = 0;
13545 if (s != NULL)
13546 TOCstart = s->output_section->vma + s->output_offset;
721956f4 13547
a27e685f
AM
13548 /* Force alignment. */
13549 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
13550 TOCstart -= adjust;
1c865ab2
AM
13551 _bfd_set_gp_value (obfd, TOCstart);
13552
810d4e75 13553 if (info != NULL && s != NULL)
1c865ab2
AM
13554 {
13555 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13556
810d4e75
AM
13557 if (htab != NULL)
13558 {
13559 if (htab->elf.hgot != NULL)
13560 {
a27e685f 13561 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
810d4e75
AM
13562 htab->elf.hgot->root.u.def.section = s;
13563 }
13564 }
13565 else
1c865ab2 13566 {
810d4e75
AM
13567 struct bfd_link_hash_entry *bh = NULL;
13568 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
a27e685f
AM
13569 s, TOC_BASE_OFF - adjust,
13570 NULL, FALSE, FALSE, &bh);
1c865ab2
AM
13571 }
13572 }
805fc799 13573 return TOCstart;
721956f4
AM
13574}
13575
a345bc8d 13576/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
49c09209 13577 write out any global entry stubs, and PLT relocations. */
a345bc8d
AM
13578
13579static bfd_boolean
49c09209 13580build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
a345bc8d
AM
13581{
13582 struct bfd_link_info *info;
13583 struct ppc_link_hash_table *htab;
49c09209 13584 struct plt_entry *ent;
a345bc8d
AM
13585 asection *s;
13586
13587 if (h->root.type == bfd_link_hash_indirect)
13588 return TRUE;
13589
49c09209
AM
13590 info = inf;
13591 htab = ppc_hash_table (info);
13592 if (htab == NULL)
13593 return FALSE;
13594
13595 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13596 if (ent->plt.offset != (bfd_vma) -1)
13597 {
13598 /* This symbol has an entry in the procedure linkage
13599 table. Set it up. */
13600 Elf_Internal_Rela rela;
2d7ad24e 13601 asection *plt, *relplt;
49c09209
AM
13602 bfd_byte *loc;
13603
13604 if (!htab->elf.dynamic_sections_created
13605 || h->dynindx == -1)
13606 {
13607 if (!(h->def_regular
13608 && (h->root.type == bfd_link_hash_defined
13609 || h->root.type == bfd_link_hash_defweak)))
13610 continue;
2d7ad24e
AM
13611 if (h->type == STT_GNU_IFUNC)
13612 {
13613 plt = htab->elf.iplt;
13614 relplt = htab->elf.irelplt;
13615 htab->local_ifunc_resolver = 1;
13616 if (htab->opd_abi)
13617 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13618 else
13619 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13620 }
49c09209 13621 else
2d7ad24e
AM
13622 {
13623 plt = htab->pltlocal;
13624 if (bfd_link_pic (info))
13625 {
13626 relplt = htab->relpltlocal;
13627 if (htab->opd_abi)
13628 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13629 else
13630 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13631 }
13632 else
13633 relplt = NULL;
13634 }
49c09209
AM
13635 rela.r_addend = (h->root.u.def.value
13636 + h->root.u.def.section->output_offset
13637 + h->root.u.def.section->output_section->vma
13638 + ent->addend);
2d7ad24e
AM
13639
13640 if (relplt == NULL)
13641 {
13642 loc = plt->contents + ent->plt.offset;
13643 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
13644 if (htab->opd_abi)
13645 {
13646 bfd_vma toc = elf_gp (info->output_bfd);
13647 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
13648 bfd_put_64 (info->output_bfd, toc, loc + 8);
13649 }
13650 }
13651 else
13652 {
13653 rela.r_offset = (plt->output_section->vma
13654 + plt->output_offset
13655 + ent->plt.offset);
13656 loc = relplt->contents + (relplt->reloc_count++
13657 * sizeof (Elf64_External_Rela));
13658 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13659 }
49c09209
AM
13660 }
13661 else
13662 {
13663 rela.r_offset = (htab->elf.splt->output_section->vma
13664 + htab->elf.splt->output_offset
13665 + ent->plt.offset);
13666 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13667 rela.r_addend = ent->addend;
13668 loc = (htab->elf.srelplt->contents
13669 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
13670 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
13671 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
13672 htab->maybe_local_ifunc_resolver = 1;
2d7ad24e 13673 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
49c09209 13674 }
49c09209
AM
13675 }
13676
a345bc8d
AM
13677 if (!h->pointer_equality_needed)
13678 return TRUE;
13679
13680 if (h->def_regular)
13681 return TRUE;
13682
9e390558 13683 s = htab->global_entry;
49c09209
AM
13684 if (s == NULL || s->size == 0)
13685 return TRUE;
13686
13687 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13688 if (ent->plt.offset != (bfd_vma) -1
13689 && ent->addend == 0)
a345bc8d
AM
13690 {
13691 bfd_byte *p;
13692 asection *plt;
13693 bfd_vma off;
13694
a345bc8d 13695 p = s->contents + h->root.u.def.value;
33e44f2e 13696 plt = htab->elf.splt;
a345bc8d
AM
13697 if (!htab->elf.dynamic_sections_created
13698 || h->dynindx == -1)
2d7ad24e
AM
13699 {
13700 if (h->type == STT_GNU_IFUNC)
13701 plt = htab->elf.iplt;
13702 else
13703 plt = htab->pltlocal;
13704 }
49c09209 13705 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
a345bc8d
AM
13706 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
13707
13708 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
13709 {
13710 info->callbacks->einfo
c1c8c1ef 13711 (_("%P: linkage table error against `%pT'\n"),
a345bc8d
AM
13712 h->root.root.string);
13713 bfd_set_error (bfd_error_bad_value);
13714 htab->stub_error = TRUE;
13715 }
13716
7341d5e2
AM
13717 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13718 if (htab->params->emit_stub_syms)
13719 {
13720 size_t len = strlen (h->root.root.string);
13721 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13722
13723 if (name == NULL)
13724 return FALSE;
13725
13726 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13727 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13728 if (h == NULL)
13729 return FALSE;
13730 if (h->root.type == bfd_link_hash_new)
13731 {
13732 h->root.type = bfd_link_hash_defined;
13733 h->root.u.def.section = s;
13734 h->root.u.def.value = p - s->contents;
13735 h->ref_regular = 1;
13736 h->def_regular = 1;
13737 h->ref_regular_nonweak = 1;
13738 h->forced_local = 1;
13739 h->non_elf = 0;
2ec55de3 13740 h->root.linker_def = 1;
7341d5e2
AM
13741 }
13742 }
13743
a345bc8d
AM
13744 if (PPC_HA (off) != 0)
13745 {
13746 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
13747 p += 4;
13748 }
13749 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
13750 p += 4;
13751 bfd_put_32 (s->owner, MTCTR_R12, p);
13752 p += 4;
407aa07c 13753 bfd_put_32 (s->owner, BCTR, p);
a345bc8d
AM
13754 break;
13755 }
13756 return TRUE;
13757}
13758
49c09209
AM
13759/* Write PLT relocs for locals. */
13760
13761static bfd_boolean
13762write_plt_relocs_for_local_syms (struct bfd_link_info *info)
13763{
13764 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13765 bfd *ibfd;
13766
13767 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
13768 {
13769 struct got_entry **lgot_ents, **end_lgot_ents;
13770 struct plt_entry **local_plt, **lplt, **end_local_plt;
13771 Elf_Internal_Shdr *symtab_hdr;
13772 bfd_size_type locsymcount;
13773 Elf_Internal_Sym *local_syms = NULL;
13774 struct plt_entry *ent;
13775
13776 if (!is_ppc64_elf (ibfd))
13777 continue;
13778
13779 lgot_ents = elf_local_got_ents (ibfd);
13780 if (!lgot_ents)
13781 continue;
13782
13783 symtab_hdr = &elf_symtab_hdr (ibfd);
13784 locsymcount = symtab_hdr->sh_info;
13785 end_lgot_ents = lgot_ents + locsymcount;
13786 local_plt = (struct plt_entry **) end_lgot_ents;
13787 end_local_plt = local_plt + locsymcount;
13788 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
13789 for (ent = *lplt; ent != NULL; ent = ent->next)
13790 if (ent->plt.offset != (bfd_vma) -1)
13791 {
13792 Elf_Internal_Sym *sym;
13793 asection *sym_sec;
13794 asection *plt, *relplt;
13795 bfd_byte *loc;
13796 bfd_vma val;
49c09209
AM
13797
13798 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
13799 lplt - local_plt, ibfd))
13800 {
13801 if (local_syms != NULL
13802 && symtab_hdr->contents != (unsigned char *) local_syms)
13803 free (local_syms);
13804 return FALSE;
13805 }
13806
13807 val = sym->st_value + ent->addend;
ba85c15d
AM
13808 if (ELF_ST_TYPE (sym->st_info) != STT_GNU_IFUNC)
13809 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
49c09209
AM
13810 if (sym_sec != NULL && sym_sec->output_section != NULL)
13811 val += sym_sec->output_offset + sym_sec->output_section->vma;
13812
2d7ad24e
AM
13813 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13814 {
13815 htab->local_ifunc_resolver = 1;
13816 plt = htab->elf.iplt;
13817 relplt = htab->elf.irelplt;
13818 }
13819 else
13820 {
13821 plt = htab->pltlocal;
13822 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
13823 }
49c09209 13824
2d7ad24e
AM
13825 if (relplt == NULL)
13826 {
13827 loc = plt->contents + ent->plt.offset;
13828 bfd_put_64 (info->output_bfd, val, loc);
13829 if (htab->opd_abi)
13830 {
13831 bfd_vma toc = elf_gp (ibfd);
13832 bfd_put_64 (info->output_bfd, toc, loc + 8);
13833 }
13834 }
49c09209 13835 else
2d7ad24e
AM
13836 {
13837 Elf_Internal_Rela rela;
13838 rela.r_offset = (ent->plt.offset
13839 + plt->output_offset
13840 + plt->output_section->vma);
13841 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13842 {
13843 if (htab->opd_abi)
13844 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13845 else
13846 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13847 }
13848 else
13849 {
13850 if (htab->opd_abi)
13851 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13852 else
13853 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13854 }
13855 rela.r_addend = val;
13856 loc = relplt->contents + (relplt->reloc_count++
13857 * sizeof (Elf64_External_Rela));
13858 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13859 }
49c09209
AM
13860 }
13861
13862 if (local_syms != NULL
13863 && symtab_hdr->contents != (unsigned char *) local_syms)
13864 {
13865 if (!info->keep_memory)
13866 free (local_syms);
13867 else
13868 symtab_hdr->contents = (unsigned char *) local_syms;
13869 }
13870 }
13871 return TRUE;
13872}
13873
721956f4
AM
13874/* Build all the stubs associated with the current output file.
13875 The stubs are kept in a hash table attached to the main linker
13876 hash table. This function is called via gldelf64ppc_finish. */
13877
b34976b6 13878bfd_boolean
e7d1c40c 13879ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 13880 char **stats)
5d1634d7
AM
13881{
13882 struct ppc_link_hash_table *htab = ppc_hash_table (info);
a4b6fadd 13883 struct map_stub *group;
721956f4 13884 asection *stub_sec;
5d1634d7 13885 bfd_byte *p;
e717da7e 13886 int stub_sec_count = 0;
5d1634d7 13887
4dfe6ac6
NC
13888 if (htab == NULL)
13889 return FALSE;
13890
eea6121a 13891 /* Allocate memory to hold the linker stubs. */
d4aaa2a0 13892 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13893 {
13894 group->eh_size = 0;
13895 group->lr_restore = 0;
13896 if ((stub_sec = group->stub_sec) != NULL
13897 && stub_sec->size != 0)
13898 {
13899 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd,
13900 stub_sec->size);
13901 if (stub_sec->contents == NULL)
13902 return FALSE;
13903 stub_sec->size = 0;
13904 }
13905 }
5d1634d7 13906
23eb7e01 13907 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 13908 {
9f951329 13909 unsigned int indx;
ad8e1ba5 13910 bfd_vma plt0;
9f951329 13911
721956f4 13912 /* Build the .glink plt call stub. */
e7d1c40c 13913 if (htab->params->emit_stub_syms)
97b639ba
AM
13914 {
13915 struct elf_link_hash_entry *h;
468392fb
AM
13916 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
13917 TRUE, FALSE, FALSE);
97b639ba
AM
13918 if (h == NULL)
13919 return FALSE;
13920 if (h->root.type == bfd_link_hash_new)
13921 {
13922 h->root.type = bfd_link_hash_defined;
13923 h->root.u.def.section = htab->glink;
ee4bf8d2 13924 h->root.u.def.value = 8;
f5385ebf
AM
13925 h->ref_regular = 1;
13926 h->def_regular = 1;
13927 h->ref_regular_nonweak = 1;
13928 h->forced_local = 1;
13929 h->non_elf = 0;
2ec55de3 13930 h->root.linker_def = 1;
97b639ba
AM
13931 }
13932 }
33e44f2e
AM
13933 plt0 = (htab->elf.splt->output_section->vma
13934 + htab->elf.splt->output_offset
13935 - 16);
176a0d42
AM
13936 if (info->emitrelocations)
13937 {
13938 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
13939 if (r == NULL)
13940 return FALSE;
13941 r->r_offset = (htab->glink->output_offset
13942 + htab->glink->output_section->vma);
13943 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
13944 r->r_addend = plt0;
13945 }
4ce794b7 13946 p = htab->glink->contents;
176a0d42 13947 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
13948 bfd_put_64 (htab->glink->owner, plt0, p);
13949 p += 8;
b9e5796b
AM
13950 if (htab->opd_abi)
13951 {
13952 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
13953 p += 4;
13954 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13955 p += 4;
13956 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13957 p += 4;
13958 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13959 p += 4;
13960 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
13961 p += 4;
13962 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13963 p += 4;
13964 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13965 p += 4;
13966 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
13967 p += 4;
13968 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13969 p += 4;
13970 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
13971 p += 4;
13972 }
13973 else
13974 {
13975 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
13976 p += 4;
13977 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13978 p += 4;
13979 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13980 p += 4;
f378ab09
AM
13981 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
13982 p += 4;
b9e5796b
AM
13983 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13984 p += 4;
13985 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
13986 p += 4;
13987 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
13988 p += 4;
13989 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13990 p += 4;
13991 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
13992 p += 4;
13993 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13994 p += 4;
13995 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
13996 p += 4;
13997 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13998 p += 4;
13999 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
14000 p += 4;
14001 }
407aa07c
AM
14002 bfd_put_32 (htab->glink->owner, BCTR, p);
14003 p += 4;
c75bc4f7 14004 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
ad8e1ba5 14005
9f951329
AM
14006 /* Build the .glink lazy link call stubs. */
14007 indx = 0;
9e390558 14008 while (p < htab->glink->contents + htab->glink->size)
9f951329 14009 {
b9e5796b 14010 if (htab->opd_abi)
9f951329 14011 {
b9e5796b
AM
14012 if (indx < 0x8000)
14013 {
14014 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
14015 p += 4;
14016 }
14017 else
14018 {
14019 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
14020 p += 4;
14021 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
14022 p);
14023 p += 4;
14024 }
9f951329 14025 }
4ce794b7 14026 bfd_put_32 (htab->glink->owner,
ee4bf8d2 14027 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 14028 indx++;
9f951329
AM
14029 p += 4;
14030 }
5d1634d7 14031 }
5d1634d7 14032
49c09209
AM
14033 /* Build .glink global entry stubs, and PLT relocs for globals. */
14034 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
14035
14036 if (!write_plt_relocs_for_local_syms (info))
14037 return FALSE;
9e390558 14038
7341d5e2 14039 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 14040 {
4ce794b7 14041 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 14042 htab->brlt->size);
4ce794b7 14043 if (htab->brlt->contents == NULL)
b34976b6 14044 return FALSE;
721956f4 14045 }
ee75fd95 14046 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
14047 {
14048 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 14049 htab->relbrlt->size);
63bc6f6c
AM
14050 if (htab->relbrlt->contents == NULL)
14051 return FALSE;
14052 }
5d1634d7 14053
721956f4
AM
14054 /* Build the stubs as directed by the stub hash table. */
14055 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 14056
a4b6fadd
AM
14057 for (group = htab->group; group != NULL; group = group->next)
14058 if (group->needs_save_res)
7dda8d3c 14059 group->stub_sec->size += htab->sfpr->size;
a4b6fadd 14060
aa8a7074
AM
14061 if (htab->relbrlt != NULL)
14062 htab->relbrlt->reloc_count = 0;
14063
e7d1c40c 14064 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
14065 for (group = htab->group; group != NULL; group = group->next)
14066 if ((stub_sec = group->stub_sec) != NULL)
691d2e9a
AM
14067 {
14068 int align = abs (htab->params->plt_stub_align);
14069 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
14070 }
794e51c0 14071
7dda8d3c
AM
14072 for (group = htab->group; group != NULL; group = group->next)
14073 if (group->needs_save_res)
14074 {
14075 stub_sec = group->stub_sec;
14076 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
14077 htab->sfpr->contents, htab->sfpr->size);
14078 if (htab->params->emit_stub_syms)
14079 {
14080 unsigned int i;
14081
14082 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
14083 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
14084 return FALSE;
14085 }
14086 }
14087
df136d64
AM
14088 if (htab->glink_eh_frame != NULL
14089 && htab->glink_eh_frame->size != 0)
14090 {
14091 bfd_vma val;
14092 size_t align = 4;
14093
14094 p = htab->glink_eh_frame->contents;
14095 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
14096
14097 for (group = htab->group; group != NULL; group = group->next)
14098 if (group->eh_size != 0)
14099 {
14100 /* Offset to stub section. */
14101 val = (group->stub_sec->output_section->vma
14102 + group->stub_sec->output_offset);
14103 val -= (htab->glink_eh_frame->output_section->vma
14104 + htab->glink_eh_frame->output_offset
14105 + (p + 8 - htab->glink_eh_frame->contents));
14106 if (val + 0x80000000 > 0xffffffff)
14107 {
14108 _bfd_error_handler
14109 (_("%s offset too large for .eh_frame sdata4 encoding"),
14110 group->stub_sec->name);
14111 return FALSE;
14112 }
14113 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14114 p += (group->eh_size + 17 + 3) & -4;
14115 }
14116 if (htab->glink != NULL && htab->glink->size != 0)
14117 {
14118 /* Offset to .glink. */
14119 val = (htab->glink->output_section->vma
14120 + htab->glink->output_offset
14121 + 8);
14122 val -= (htab->glink_eh_frame->output_section->vma
14123 + htab->glink_eh_frame->output_offset
14124 + (p + 8 - htab->glink_eh_frame->contents));
14125 if (val + 0x80000000 > 0xffffffff)
14126 {
14127 _bfd_error_handler
14128 (_("%s offset too large for .eh_frame sdata4 encoding"),
14129 htab->glink->name);
14130 return FALSE;
14131 }
14132 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14133 p += (24 + align - 1) & -align;
14134 }
14135 }
14136
d4aaa2a0
AM
14137 for (group = htab->group; group != NULL; group = group->next)
14138 if ((stub_sec = group->stub_sec) != NULL)
e717da7e
AM
14139 {
14140 stub_sec_count += 1;
c9301e31
AM
14141 if (stub_sec->rawsize != stub_sec->size
14142 && (htab->stub_iteration <= STUB_SHRINK_ITER
14143 || stub_sec->rawsize < stub_sec->size))
e717da7e
AM
14144 break;
14145 }
5d1634d7 14146
25516cc5 14147 if (group != NULL)
5d1634d7 14148 {
b34976b6 14149 htab->stub_error = TRUE;
cf97bcb0 14150 _bfd_error_handler (_("stubs don't match calculated size"));
5d1634d7 14151 }
721956f4 14152
d2a300cf
AM
14153 if (htab->stub_error)
14154 return FALSE;
14155
14156 if (stats != NULL)
14157 {
f7aec2b8
AM
14158 char *groupmsg;
14159 if (asprintf (&groupmsg,
14160 ngettext ("linker stubs in %u group\n",
14161 "linker stubs in %u groups\n",
14162 stub_sec_count),
14163 stub_sec_count) < 0)
14164 *stats = NULL;
14165 else
14166 {
14167 if (asprintf (stats, _("%s"
14168 " branch %lu\n"
14169 " branch toc adj %lu\n"
14170 " branch notoc %lu\n"
14171 " branch both %lu\n"
14172 " long branch %lu\n"
14173 " long toc adj %lu\n"
14174 " long notoc %lu\n"
14175 " long both %lu\n"
14176 " plt call %lu\n"
14177 " plt call save %lu\n"
14178 " plt call notoc %lu\n"
14179 " plt call both %lu\n"
14180 " global entry %lu"),
14181 groupmsg,
14182 htab->stub_count[ppc_stub_long_branch - 1],
14183 htab->stub_count[ppc_stub_long_branch_r2off - 1],
14184 htab->stub_count[ppc_stub_long_branch_notoc - 1],
14185 htab->stub_count[ppc_stub_long_branch_both - 1],
14186 htab->stub_count[ppc_stub_plt_branch - 1],
14187 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
14188 htab->stub_count[ppc_stub_plt_branch_notoc - 1],
14189 htab->stub_count[ppc_stub_plt_branch_both - 1],
14190 htab->stub_count[ppc_stub_plt_call - 1],
14191 htab->stub_count[ppc_stub_plt_call_r2save - 1],
14192 htab->stub_count[ppc_stub_plt_call_notoc - 1],
14193 htab->stub_count[ppc_stub_plt_call_both - 1],
14194 htab->stub_count[ppc_stub_global_entry - 1]) < 0)
14195 *stats = NULL;
14196 free (groupmsg);
14197 }
d2a300cf
AM
14198 }
14199 return TRUE;
5bd4f169
AM
14200}
14201
60124e18
AM
14202/* What to do when ld finds relocations against symbols defined in
14203 discarded sections. */
14204
14205static unsigned int
14206ppc64_elf_action_discarded (asection *sec)
14207{
14208 if (strcmp (".opd", sec->name) == 0)
14209 return 0;
14210
14211 if (strcmp (".toc", sec->name) == 0)
14212 return 0;
14213
bce50a28
JJ
14214 if (strcmp (".toc1", sec->name) == 0)
14215 return 0;
14216
60124e18
AM
14217 return _bfd_elf_default_action_discarded (sec);
14218}
14219
e59a1001
AM
14220/* These are the dynamic relocations supported by glibc. */
14221
14222static bfd_boolean
14223ppc64_glibc_dynamic_reloc (enum elf_ppc64_reloc_type r_type)
14224{
14225 switch (r_type)
14226 {
14227 case R_PPC64_RELATIVE:
14228 case R_PPC64_NONE:
14229 case R_PPC64_ADDR64:
14230 case R_PPC64_GLOB_DAT:
14231 case R_PPC64_IRELATIVE:
14232 case R_PPC64_JMP_IREL:
14233 case R_PPC64_JMP_SLOT:
14234 case R_PPC64_DTPMOD64:
14235 case R_PPC64_DTPREL64:
14236 case R_PPC64_TPREL64:
14237 case R_PPC64_TPREL16_LO_DS:
14238 case R_PPC64_TPREL16_DS:
14239 case R_PPC64_TPREL16:
14240 case R_PPC64_TPREL16_LO:
14241 case R_PPC64_TPREL16_HI:
14242 case R_PPC64_TPREL16_HIGH:
14243 case R_PPC64_TPREL16_HA:
14244 case R_PPC64_TPREL16_HIGHA:
14245 case R_PPC64_TPREL16_HIGHER:
14246 case R_PPC64_TPREL16_HIGHEST:
14247 case R_PPC64_TPREL16_HIGHERA:
14248 case R_PPC64_TPREL16_HIGHESTA:
14249 case R_PPC64_ADDR16_LO_DS:
14250 case R_PPC64_ADDR16_LO:
14251 case R_PPC64_ADDR16_HI:
14252 case R_PPC64_ADDR16_HIGH:
14253 case R_PPC64_ADDR16_HA:
14254 case R_PPC64_ADDR16_HIGHA:
14255 case R_PPC64_REL30:
14256 case R_PPC64_COPY:
14257 case R_PPC64_UADDR64:
14258 case R_PPC64_UADDR32:
14259 case R_PPC64_ADDR32:
14260 case R_PPC64_ADDR24:
14261 case R_PPC64_ADDR16:
14262 case R_PPC64_UADDR16:
14263 case R_PPC64_ADDR16_DS:
14264 case R_PPC64_ADDR16_HIGHER:
14265 case R_PPC64_ADDR16_HIGHEST:
14266 case R_PPC64_ADDR16_HIGHERA:
14267 case R_PPC64_ADDR16_HIGHESTA:
14268 case R_PPC64_ADDR14:
14269 case R_PPC64_ADDR14_BRTAKEN:
14270 case R_PPC64_ADDR14_BRNTAKEN:
14271 case R_PPC64_REL32:
14272 case R_PPC64_REL64:
14273 return TRUE;
14274
14275 default:
14276 return FALSE;
14277 }
14278}
14279
5bd4f169
AM
14280/* The RELOCATE_SECTION function is called by the ELF backend linker
14281 to handle the relocations for a section.
14282
14283 The relocs are always passed as Rela structures; if the section
14284 actually uses Rel structures, the r_addend field will always be
14285 zero.
14286
14287 This function is responsible for adjust the section contents as
14288 necessary, and (if using Rela relocs and generating a
1049f94e 14289 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
14290 necessary.
14291
14292 This function does not have to worry about setting the reloc
14293 address or the reloc symbol index.
14294
14295 LOCAL_SYMS is a pointer to the swapped in local symbols.
14296
14297 LOCAL_SECTIONS is an array giving the section in the input file
14298 corresponding to the st_shndx field of each local symbol.
14299
14300 The global hash table entry for the global symbols can be found
14301 via elf_sym_hashes (input_bfd).
14302
1049f94e 14303 When generating relocatable output, this function must handle
5bd4f169
AM
14304 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
14305 going to be the section symbol corresponding to the output
14306 section, which means that the addend must be adjusted
14307 accordingly. */
14308
b34976b6 14309static bfd_boolean
4ce794b7
AM
14310ppc64_elf_relocate_section (bfd *output_bfd,
14311 struct bfd_link_info *info,
14312 bfd *input_bfd,
14313 asection *input_section,
14314 bfd_byte *contents,
14315 Elf_Internal_Rela *relocs,
14316 Elf_Internal_Sym *local_syms,
14317 asection **local_sections)
5bd4f169 14318{
65f38f15 14319 struct ppc_link_hash_table *htab;
5bd4f169
AM
14320 Elf_Internal_Shdr *symtab_hdr;
14321 struct elf_link_hash_entry **sym_hashes;
5bd4f169 14322 Elf_Internal_Rela *rel;
c316a17c 14323 Elf_Internal_Rela *wrel;
5bd4f169 14324 Elf_Internal_Rela *relend;
411e1bfb
AM
14325 Elf_Internal_Rela outrel;
14326 bfd_byte *loc;
411e1bfb 14327 struct got_entry **local_got_ents;
5bd4f169 14328 bfd_vma TOCstart;
b34976b6
AM
14329 bfd_boolean ret = TRUE;
14330 bfd_boolean is_opd;
794e51c0
AM
14331 /* Assume 'at' branch hints. */
14332 bfd_boolean is_isa_v2 = TRUE;
e59a1001 14333 bfd_boolean warned_dynamic = FALSE;
95f0d0d2 14334 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
5bd4f169 14335
65f38f15 14336 /* Initialize howto table if needed. */
5bd4f169 14337 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
14338 ppc_howto_init ();
14339
65f38f15 14340 htab = ppc_hash_table (info);
4dfe6ac6
NC
14341 if (htab == NULL)
14342 return FALSE;
ee75fd95
AM
14343
14344 /* Don't relocate stub sections. */
e7d1c40c 14345 if (input_section->owner == htab->params->stub_bfd)
ee75fd95
AM
14346 return TRUE;
14347
7af5d5c4
AM
14348 if (!is_ppc64_elf (input_bfd))
14349 {
14350 bfd_set_error (bfd_error_wrong_format);
14351 return FALSE;
14352 }
0ffa91dd 14353
411e1bfb 14354 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 14355 TOCstart = elf_gp (output_bfd);
0ffa91dd 14356 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 14357 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 14358 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 14359
c316a17c 14360 rel = wrel = relocs;
5bd4f169 14361 relend = relocs + input_section->reloc_count;
c316a17c 14362 for (; rel < relend; wrel++, rel++)
5bd4f169 14363 {
04c9666a 14364 enum elf_ppc64_reloc_type r_type;
31c76678 14365 bfd_vma addend;
5bd4f169
AM
14366 bfd_reloc_status_type r;
14367 Elf_Internal_Sym *sym;
14368 asection *sec;
039b3fef
AM
14369 struct elf_link_hash_entry *h_elf;
14370 struct ppc_link_hash_entry *h;
14371 struct ppc_link_hash_entry *fdh;
5bd4f169 14372 const char *sym_name;
0d4792f7 14373 unsigned long r_symndx, toc_symndx;
3a71aa26 14374 bfd_vma toc_addend;
f961d9dd
AM
14375 unsigned char tls_mask, tls_gd, tls_type;
14376 unsigned char sym_type;
5bd4f169 14377 bfd_vma relocation;
23cedd1d 14378 bfd_boolean unresolved_reloc, save_unresolved_reloc;
b34976b6 14379 bfd_boolean warned;
bc30df16 14380 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 14381 unsigned int insn;
e11840f9 14382 unsigned int mask;
721956f4
AM
14383 struct ppc_stub_hash_entry *stub_entry;
14384 bfd_vma max_br_offset;
14385 bfd_vma from;
c316a17c 14386 Elf_Internal_Rela orig_rel;
b80eed39
AM
14387 reloc_howto_type *howto;
14388 struct reloc_howto_struct alt_howto;
4a421c53
AM
14389 uint64_t pinsn;
14390 bfd_vma offset;
5bd4f169 14391
c316a17c
AM
14392 again:
14393 orig_rel = *rel;
14394
4ce794b7 14395 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 14396 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
14397
14398 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
14399 symbol of the previous ADDR64 reloc. The symbol gives us the
14400 proper TOC base to use. */
14401 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
c316a17c
AM
14402 && wrel != relocs
14403 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
ee87f2da 14404 && is_opd)
c316a17c 14405 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
ee87f2da 14406
4ce794b7
AM
14407 sym = NULL;
14408 sec = NULL;
039b3fef 14409 h_elf = NULL;
4ce794b7 14410 sym_name = NULL;
b34976b6
AM
14411 unresolved_reloc = FALSE;
14412 warned = FALSE;
65f38f15 14413
0b13192e 14414 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
14415 {
14416 /* It's a local symbol. */
74f0fb50 14417 struct _opd_sec_data *opd;
4025353c 14418
5bd4f169
AM
14419 sym = local_syms + r_symndx;
14420 sec = local_sections[r_symndx];
26c61ae5 14421 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 14422 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 14423 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
14424 opd = get_opd_info (sec);
14425 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 14426 {
51aecdc5
AM
14427 long adjust = opd->adjust[OPD_NDX (sym->st_value
14428 + rel->r_addend)];
4025353c
AM
14429 if (adjust == -1)
14430 relocation = 0;
14431 else
4cc603a5
AM
14432 {
14433 /* If this is a relocation against the opd section sym
14434 and we have edited .opd, adjust the reloc addend so
14435 that ld -r and ld --emit-relocs output is correct.
14436 If it is a reloc against some other .opd symbol,
14437 then the symbol value will be adjusted later. */
14438 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
14439 rel->r_addend += adjust;
14440 else
14441 relocation += adjust;
14442 }
1e2f5b6e 14443 }
5bd4f169
AM
14444 }
14445 else
14446 {
62d887d4
L
14447 bfd_boolean ignored;
14448
b2a8e766
AM
14449 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
14450 r_symndx, symtab_hdr, sym_hashes,
039b3fef 14451 h_elf, sec, relocation,
62d887d4 14452 unresolved_reloc, warned, ignored);
039b3fef
AM
14453 sym_name = h_elf->root.root.string;
14454 sym_type = h_elf->type;
b69fdb4e
AM
14455 if (sec != NULL
14456 && sec->owner == output_bfd
14457 && strcmp (sec->name, ".opd") == 0)
14458 {
14459 /* This is a symbol defined in a linker script. All
14460 such are defined in output sections, even those
14461 defined by simple assignment from a symbol defined in
14462 an input section. Transfer the symbol to an
14463 appropriate input .opd section, so that a branch to
14464 this symbol will be mapped to the location specified
14465 by the opd entry. */
14466 struct bfd_link_order *lo;
14467 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
14468 if (lo->type == bfd_indirect_link_order)
14469 {
14470 asection *isec = lo->u.indirect.section;
14471 if (h_elf->root.u.def.value >= isec->output_offset
14472 && h_elf->root.u.def.value < (isec->output_offset
14473 + isec->size))
14474 {
14475 h_elf->root.u.def.value -= isec->output_offset;
14476 h_elf->root.u.def.section = isec;
14477 sec = isec;
14478 break;
14479 }
14480 }
14481 }
5bd4f169 14482 }
039b3fef 14483 h = (struct ppc_link_hash_entry *) h_elf;
5bd4f169 14484
dbaa2011 14485 if (sec != NULL && discarded_section (sec))
c316a17c
AM
14486 {
14487 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
14488 input_bfd, input_section,
0930cb30 14489 contents, rel->r_offset);
c316a17c
AM
14490 wrel->r_offset = rel->r_offset;
14491 wrel->r_info = 0;
14492 wrel->r_addend = 0;
14493
14494 /* For ld -r, remove relocations in debug sections against
dcd2b8a0 14495 symbols defined in discarded sections. Not done for
c316a17c
AM
14496 non-debug to preserve relocs in .eh_frame which the
14497 eh_frame editing code expects to be present. */
14498 if (bfd_link_relocatable (info)
14499 && (input_section->flags & SEC_DEBUGGING))
14500 wrel--;
14501
14502 continue;
14503 }
ab96bf03 14504
0e1862bb 14505 if (bfd_link_relocatable (info))
c316a17c 14506 goto copy_reloc;
ab96bf03 14507
f40da81b
AM
14508 if (h != NULL && &h->elf == htab->elf.hgot)
14509 {
6f20ed8a 14510 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
f40da81b
AM
14511 sec = bfd_abs_section_ptr;
14512 unresolved_reloc = FALSE;
14513 }
14514
951fd09b
AM
14515 /* TLS optimizations. Replace instruction sequences and relocs
14516 based on information we collected in tls_optimize. We edit
14517 RELOCS so that --emit-relocs will output something sensible
14518 for the final instruction stream. */
14519 tls_mask = 0;
14520 tls_gd = 0;
0d4792f7 14521 toc_symndx = 0;
727fc41e
AM
14522 if (h != NULL)
14523 tls_mask = h->tls_mask;
14524 else if (local_got_ents != NULL)
411e1bfb 14525 {
e054468f
AM
14526 struct plt_entry **local_plt = (struct plt_entry **)
14527 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 14528 unsigned char *lgot_masks = (unsigned char *)
e054468f 14529 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
14530 tls_mask = lgot_masks[r_symndx];
14531 }
37da22e5 14532 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
727fc41e
AM
14533 && (r_type == R_PPC64_TLS
14534 || r_type == R_PPC64_TLSGD
14535 || r_type == R_PPC64_TLSLD))
14536 {
14537 /* Check for toc tls entries. */
f961d9dd 14538 unsigned char *toc_tls;
0d4792f7 14539
727fc41e
AM
14540 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14541 &local_syms, rel, input_bfd))
14542 return FALSE;
0d4792f7 14543
727fc41e
AM
14544 if (toc_tls)
14545 tls_mask = *toc_tls;
0d4792f7
AM
14546 }
14547
14548 /* Check that tls relocs are used with tls syms, and non-tls
14549 relocs are used with non-tls syms. */
cf35638d 14550 if (r_symndx != STN_UNDEF
0d4792f7
AM
14551 && r_type != R_PPC64_NONE
14552 && (h == NULL
039b3fef
AM
14553 || h->elf.root.type == bfd_link_hash_defined
14554 || h->elf.root.type == bfd_link_hash_defweak)
71c4e95a 14555 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
0d4792f7 14556 {
37da22e5 14557 if ((tls_mask & TLS_TLS) != 0
727fc41e
AM
14558 && (r_type == R_PPC64_TLS
14559 || r_type == R_PPC64_TLSGD
14560 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
14561 /* R_PPC64_TLS is OK against a symbol in the TOC. */
14562 ;
14563 else
25f53a85 14564 info->callbacks->einfo
1d483afe 14565 (!IS_PPC64_TLS_RELOC (r_type)
695344c0 14566 /* xgettext:c-format */
c1c8c1ef 14567 ? _("%H: %s used with TLS symbol `%pT'\n")
695344c0 14568 /* xgettext:c-format */
c1c8c1ef 14569 : _("%H: %s used with non-TLS symbol `%pT'\n"),
25f53a85 14570 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
14571 ppc64_elf_howto_table[r_type]->name,
14572 sym_name);
411e1bfb
AM
14573 }
14574
14575 /* Ensure reloc mapping code below stays sane. */
14576 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
14577 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
14578 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
14579 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
14580 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
14581 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
14582 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
14583 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
14584 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
14585 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
14586 abort ();
0d4792f7 14587
411e1bfb
AM
14588 switch (r_type)
14589 {
14590 default:
411e1bfb
AM
14591 break;
14592
ba761f19 14593 case R_PPC64_LO_DS_OPT:
95f0d0d2 14594 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
2365f8d7 14595 if ((insn & (0x3fu << 26)) != 58u << 26)
ba761f19
AM
14596 abort ();
14597 insn += (14u << 26) - (58u << 26);
95f0d0d2 14598 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
ba761f19
AM
14599 r_type = R_PPC64_TOC16_LO;
14600 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14601 break;
14602
411e1bfb
AM
14603 case R_PPC64_TOC16:
14604 case R_PPC64_TOC16_LO:
14605 case R_PPC64_TOC16_DS:
14606 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
14607 {
14608 /* Check for toc tls entries. */
f961d9dd 14609 unsigned char *toc_tls;
951fd09b 14610 int retval;
411e1bfb 14611
3a71aa26
AM
14612 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14613 &local_syms, rel, input_bfd);
951fd09b 14614 if (retval == 0)
411e1bfb
AM
14615 return FALSE;
14616
14617 if (toc_tls)
14618 {
951fd09b 14619 tls_mask = *toc_tls;
411e1bfb
AM
14620 if (r_type == R_PPC64_TOC16_DS
14621 || r_type == R_PPC64_TOC16_LO_DS)
81407a69 14622 {
37da22e5 14623 if ((tls_mask & TLS_TLS) != 0
81407a69
AM
14624 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
14625 goto toctprel;
14626 }
411e1bfb 14627 else
951fd09b
AM
14628 {
14629 /* If we found a GD reloc pair, then we might be
14630 doing a GD->IE transition. */
14631 if (retval == 2)
14632 {
b00a0a86 14633 tls_gd = TLS_GDIE;
37da22e5
AM
14634 if ((tls_mask & TLS_TLS) != 0
14635 && (tls_mask & TLS_GD) == 0)
102890f0 14636 goto tls_ldgd_opt;
951fd09b
AM
14637 }
14638 else if (retval == 3)
14639 {
37da22e5
AM
14640 if ((tls_mask & TLS_TLS) != 0
14641 && (tls_mask & TLS_LD) == 0)
102890f0 14642 goto tls_ldgd_opt;
951fd09b
AM
14643 }
14644 }
411e1bfb
AM
14645 }
14646 }
14647 break;
14648
9d6ded02
AM
14649 case R_PPC64_GOT_TPREL16_HI:
14650 case R_PPC64_GOT_TPREL16_HA:
37da22e5 14651 if ((tls_mask & TLS_TLS) != 0
9d6ded02
AM
14652 && (tls_mask & TLS_TPREL) == 0)
14653 {
14654 rel->r_offset -= d_offset;
95f0d0d2 14655 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
9d6ded02
AM
14656 r_type = R_PPC64_NONE;
14657 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14658 }
14659 break;
14660
411e1bfb
AM
14661 case R_PPC64_GOT_TPREL16_DS:
14662 case R_PPC64_GOT_TPREL16_LO_DS:
37da22e5 14663 if ((tls_mask & TLS_TLS) != 0
951fd09b 14664 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14665 {
81407a69 14666 toctprel:
95f0d0d2 14667 insn = bfd_get_32 (input_bfd,
c316a17c 14668 contents + rel->r_offset - d_offset);
411e1bfb
AM
14669 insn &= 31 << 21;
14670 insn |= 0x3c0d0000; /* addis 0,13,0 */
95f0d0d2 14671 bfd_put_32 (input_bfd, insn,
c316a17c 14672 contents + rel->r_offset - d_offset);
411e1bfb 14673 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
14674 if (toc_symndx != 0)
14675 {
14676 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 14677 rel->r_addend = toc_addend;
0d4792f7
AM
14678 /* We changed the symbol. Start over in order to
14679 get h, sym, sec etc. right. */
c316a17c 14680 goto again;
0d4792f7
AM
14681 }
14682 else
14683 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14684 }
14685 break;
14686
c213164a
AM
14687 case R_PPC64_GOT_TPREL34:
14688 if ((tls_mask & TLS_TLS) != 0
14689 && (tls_mask & TLS_TPREL) == 0)
14690 {
14691 /* pld ra,sym@got@tprel@pcrel -> paddi ra,r13,sym@tprel */
14692 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14693 pinsn <<= 32;
14694 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14695 pinsn += ((2ULL << 56) + (-1ULL << 52)
14696 + (14ULL << 26) - (57ULL << 26) + (13ULL << 16));
14697 bfd_put_32 (input_bfd, pinsn >> 32,
14698 contents + rel->r_offset);
14699 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14700 contents + rel->r_offset + 4);
14701 r_type = R_PPC64_TPREL34;
14702 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14703 }
14704 break;
14705
411e1bfb 14706 case R_PPC64_TLS:
37da22e5 14707 if ((tls_mask & TLS_TLS) != 0
951fd09b 14708 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14709 {
c213164a 14710 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2d0f3896
AM
14711 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
14712 if (insn == 0)
c213164a
AM
14713 break;
14714 if ((rel->r_offset & 3) == 0)
0d4792f7 14715 {
c213164a
AM
14716 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
14717 /* Was PPC64_TLS which sits on insn boundary, now
14718 PPC64_TPREL16_LO which is at low-order half-word. */
14719 rel->r_offset += d_offset;
14720 r_type = R_PPC64_TPREL16_LO;
14721 if (toc_symndx != 0)
14722 {
14723 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
14724 rel->r_addend = toc_addend;
14725 /* We changed the symbol. Start over in order to
14726 get h, sym, sec etc. right. */
14727 goto again;
14728 }
14729 else
14730 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14731 }
14732 else if ((rel->r_offset & 3) == 1)
14733 {
14734 /* For pcrel IE to LE we already have the full
14735 offset and thus don't need an addi here. A nop
14736 or mr will do. */
2365f8d7 14737 if ((insn & (0x3fu << 26)) == 14 << 26)
c213164a
AM
14738 {
14739 /* Extract regs from addi rt,ra,si. */
14740 unsigned int rt = (insn >> 21) & 0x1f;
14741 unsigned int ra = (insn >> 16) & 0x1f;
14742 if (rt == ra)
14743 insn = NOP;
14744 else
14745 {
14746 /* Build or ra,rs,rb with rb==rs, ie. mr ra,rs. */
14747 insn = (rt << 16) | (ra << 21) | (ra << 11);
14748 insn |= (31u << 26) | (444u << 1);
14749 }
14750 }
14751 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - 1);
0d4792f7 14752 }
411e1bfb
AM
14753 }
14754 break;
14755
411e1bfb
AM
14756 case R_PPC64_GOT_TLSGD16_HI:
14757 case R_PPC64_GOT_TLSGD16_HA:
b00a0a86 14758 tls_gd = TLS_GDIE;
37da22e5 14759 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
951fd09b
AM
14760 goto tls_gdld_hi;
14761 break;
14762
411e1bfb
AM
14763 case R_PPC64_GOT_TLSLD16_HI:
14764 case R_PPC64_GOT_TLSLD16_HA:
37da22e5 14765 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 14766 {
951fd09b
AM
14767 tls_gdld_hi:
14768 if ((tls_mask & tls_gd) != 0)
14769 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14770 + R_PPC64_GOT_TPREL16_DS);
14771 else
411e1bfb 14772 {
4fe5ca5b 14773 rel->r_offset -= d_offset;
95f0d0d2 14774 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
951fd09b 14775 r_type = R_PPC64_NONE;
411e1bfb 14776 }
951fd09b 14777 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14778 }
14779 break;
14780
951fd09b
AM
14781 case R_PPC64_GOT_TLSGD16:
14782 case R_PPC64_GOT_TLSGD16_LO:
b00a0a86 14783 tls_gd = TLS_GDIE;
37da22e5 14784 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
102890f0 14785 goto tls_ldgd_opt;
951fd09b 14786 break;
411e1bfb 14787
951fd09b
AM
14788 case R_PPC64_GOT_TLSLD16:
14789 case R_PPC64_GOT_TLSLD16_LO:
37da22e5 14790 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
951fd09b 14791 {
b9f04fe0 14792 unsigned int insn1, insn2;
102890f0
AM
14793
14794 tls_ldgd_opt:
727fc41e
AM
14795 offset = (bfd_vma) -1;
14796 /* If not using the newer R_PPC64_TLSGD/LD to mark
14797 __tls_get_addr calls, we must trust that the call
14798 stays with its arg setup insns, ie. that the next
14799 reloc is the __tls_get_addr call associated with
14800 the current reloc. Edit both insns. */
9737e8af 14801 if (input_section->nomark_tls_get_addr
727fc41e
AM
14802 && rel + 1 < relend
14803 && branch_reloc_hash_match (input_bfd, rel + 1,
14804 htab->tls_get_addr,
14805 htab->tls_get_addr_fd))
14806 offset = rel[1].r_offset;
b86ac8e3
AM
14807 /* We read the low GOT_TLS (or TOC16) insn because we
14808 need to keep the destination reg. It may be
14809 something other than the usual r3, and moved to r3
14810 before the call by intervening code. */
95f0d0d2 14811 insn1 = bfd_get_32 (input_bfd,
b86ac8e3 14812 contents + rel->r_offset - d_offset);
102890f0 14813 if ((tls_mask & tls_gd) != 0)
411e1bfb 14814 {
102890f0 14815 /* IE */
b86ac8e3 14816 insn1 &= (0x1f << 21) | (0x1f << 16);
2365f8d7 14817 insn1 |= 58u << 26; /* ld */
102890f0 14818 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 14819 if (offset != (bfd_vma) -1)
f58d5a2d 14820 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
46e9995a
AM
14821 if (r_type == R_PPC64_TOC16
14822 || r_type == R_PPC64_TOC16_LO)
102890f0 14823 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
46e9995a
AM
14824 else
14825 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 1)) & 1)
14826 + R_PPC64_GOT_TPREL16_DS);
102890f0
AM
14827 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14828 }
14829 else
14830 {
14831 /* LE */
b86ac8e3
AM
14832 insn1 &= 0x1f << 21;
14833 insn1 |= 0x3c0d0000; /* addis r,13,0 */
102890f0
AM
14834 insn2 = 0x38630000; /* addi 3,3,0 */
14835 if (tls_gd == 0)
951fd09b 14836 {
102890f0 14837 /* Was an LD reloc. */
71c4e95a 14838 r_symndx = STN_UNDEF;
102890f0 14839 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
951fd09b 14840 }
102890f0 14841 else if (toc_symndx != 0)
3a71aa26
AM
14842 {
14843 r_symndx = toc_symndx;
14844 rel->r_addend = toc_addend;
14845 }
102890f0
AM
14846 r_type = R_PPC64_TPREL16_HA;
14847 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
14848 if (offset != (bfd_vma) -1)
14849 {
14850 rel[1].r_info = ELF64_R_INFO (r_symndx,
14851 R_PPC64_TPREL16_LO);
14852 rel[1].r_offset = offset + d_offset;
14853 rel[1].r_addend = rel->r_addend;
14854 }
102890f0 14855 }
95f0d0d2 14856 bfd_put_32 (input_bfd, insn1,
3a71aa26 14857 contents + rel->r_offset - d_offset);
727fc41e 14858 if (offset != (bfd_vma) -1)
c96e0573
AM
14859 {
14860 bfd_put_32 (input_bfd, insn2, contents + offset);
14861 if (offset + 8 <= input_section->size)
14862 {
14863 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
14864 if (insn2 == LD_R2_0R1 + STK_TOC (htab))
14865 bfd_put_32 (input_bfd, NOP, contents + offset + 4);
14866 }
14867 }
727fc41e
AM
14868 if ((tls_mask & tls_gd) == 0
14869 && (tls_gd == 0 || toc_symndx != 0))
14870 {
14871 /* We changed the symbol. Start over in order
14872 to get h, sym, sec etc. right. */
c316a17c 14873 goto again;
727fc41e
AM
14874 }
14875 }
14876 break;
14877
c213164a
AM
14878 case R_PPC64_GOT_TLSGD34:
14879 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
14880 {
14881 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14882 pinsn <<= 32;
14883 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14884 if ((tls_mask & TLS_GDIE) != 0)
14885 {
14886 /* IE, pla -> pld */
14887 pinsn += (-2ULL << 56) + (57ULL << 26) - (14ULL << 26);
14888 r_type = R_PPC64_GOT_TPREL34;
14889 }
14890 else
14891 {
14892 /* LE, pla pcrel -> paddi r13 */
14893 pinsn += (-1ULL << 52) + (13ULL << 16);
14894 r_type = R_PPC64_TPREL34;
14895 }
14896 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14897 bfd_put_32 (input_bfd, pinsn >> 32,
14898 contents + rel->r_offset);
14899 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14900 contents + rel->r_offset + 4);
14901 }
14902 break;
14903
14904 case R_PPC64_GOT_TLSLD34:
14905 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
14906 {
14907 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14908 pinsn <<= 32;
14909 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14910 pinsn += (-1ULL << 52) + (13ULL << 16);
14911 bfd_put_32 (input_bfd, pinsn >> 32,
14912 contents + rel->r_offset);
14913 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14914 contents + rel->r_offset + 4);
14915 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
14916 r_symndx = STN_UNDEF;
14917 r_type = R_PPC64_TPREL34;
14918 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14919 goto again;
14920 }
14921 break;
14922
727fc41e 14923 case R_PPC64_TLSGD:
37da22e5 14924 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
675e2809 14925 && rel + 1 < relend)
727fc41e 14926 {
b9f04fe0 14927 unsigned int insn2;
5663e321 14928 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 14929
4a421c53 14930 offset = rel->r_offset;
5663e321 14931 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
14932 {
14933 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
14934 if (r_type1 == R_PPC64_PLT_PCREL34
14935 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
14936 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
14937 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14938 break;
14939 }
14940
14941 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14942 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14943
b00a0a86 14944 if ((tls_mask & TLS_GDIE) != 0)
727fc41e
AM
14945 {
14946 /* IE */
14947 r_type = R_PPC64_NONE;
14948 insn2 = 0x7c636a14; /* add 3,3,13 */
14949 }
14950 else
14951 {
14952 /* LE */
14953 if (toc_symndx != 0)
14954 {
14955 r_symndx = toc_symndx;
14956 rel->r_addend = toc_addend;
14957 }
c213164a
AM
14958 if (r_type1 == R_PPC64_REL24_NOTOC
14959 || r_type1 == R_PPC64_PLTCALL_NOTOC)
14960 {
14961 r_type = R_PPC64_NONE;
14962 insn2 = NOP;
14963 }
14964 else
14965 {
14966 rel->r_offset = offset + d_offset;
14967 r_type = R_PPC64_TPREL16_LO;
14968 insn2 = 0x38630000; /* addi 3,3,0 */
14969 }
727fc41e
AM
14970 }
14971 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14972 /* Zap the reloc on the _tls_get_addr call too. */
14973 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14974 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 14975 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
14976 if ((tls_mask & TLS_GDIE) == 0
14977 && toc_symndx != 0
14978 && r_type != R_PPC64_NONE)
c316a17c 14979 goto again;
411e1bfb 14980 }
411e1bfb
AM
14981 break;
14982
727fc41e 14983 case R_PPC64_TLSLD:
37da22e5 14984 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
675e2809 14985 && rel + 1 < relend)
727fc41e 14986 {
b9f04fe0 14987 unsigned int insn2;
5663e321 14988 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 14989
4a421c53 14990 offset = rel->r_offset;
5663e321 14991 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
14992 {
14993 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
14994 if (r_type1 == R_PPC64_PLT_PCREL34
14995 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
14996 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
14997 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14998 break;
14999 }
15000
15001 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
15002 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
15003
c213164a
AM
15004 if (r_type1 == R_PPC64_REL24_NOTOC
15005 || r_type1 == R_PPC64_PLTCALL_NOTOC)
15006 {
15007 r_type = R_PPC64_NONE;
15008 insn2 = NOP;
15009 }
15010 else
15011 {
15012 rel->r_offset = offset + d_offset;
15013 r_symndx = STN_UNDEF;
15014 r_type = R_PPC64_TPREL16_LO;
15015 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
15016 insn2 = 0x38630000; /* addi 3,3,0 */
15017 }
727fc41e 15018 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
15019 /* Zap the reloc on the _tls_get_addr call too. */
15020 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 15021 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 15022 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
15023 if (r_type != R_PPC64_NONE)
15024 goto again;
727fc41e
AM
15025 }
15026 break;
15027
411e1bfb 15028 case R_PPC64_DTPMOD64:
951fd09b
AM
15029 if (rel + 1 < relend
15030 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
15031 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 15032 {
951fd09b
AM
15033 if ((tls_mask & TLS_GD) == 0)
15034 {
15035 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
b00a0a86 15036 if ((tls_mask & TLS_GDIE) != 0)
951fd09b
AM
15037 r_type = R_PPC64_TPREL64;
15038 else
15039 {
4ce794b7 15040 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
15041 r_type = R_PPC64_NONE;
15042 }
15043 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15044 }
15045 }
15046 else
15047 {
15048 if ((tls_mask & TLS_LD) == 0)
411e1bfb 15049 {
4ce794b7 15050 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 15051 r_type = R_PPC64_NONE;
951fd09b 15052 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 15053 }
411e1bfb
AM
15054 }
15055 break;
15056
15057 case R_PPC64_TPREL64:
951fd09b 15058 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
15059 {
15060 r_type = R_PPC64_NONE;
15061 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15062 }
15063 break;
52a82034 15064
006589cf
AM
15065 case R_PPC64_ENTRY:
15066 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
15067 if (!bfd_link_pic (info)
15068 && !info->traditional_format
15069 && relocation + 0x80008000 <= 0xffffffff)
15070 {
15071 unsigned int insn1, insn2;
15072
15073 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15074 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15075 if ((insn1 & ~0xfffc) == LD_R2_0R12
15076 && insn2 == ADD_R2_R2_R12)
15077 {
95f0d0d2 15078 bfd_put_32 (input_bfd,
006589cf
AM
15079 LIS_R2 + PPC_HA (relocation),
15080 contents + rel->r_offset);
95f0d0d2 15081 bfd_put_32 (input_bfd,
006589cf
AM
15082 ADDI_R2_R2 + PPC_LO (relocation),
15083 contents + rel->r_offset + 4);
15084 }
15085 }
15086 else
15087 {
15088 relocation -= (rel->r_offset
15089 + input_section->output_offset
15090 + input_section->output_section->vma);
15091 if (relocation + 0x80008000 <= 0xffffffff)
15092 {
15093 unsigned int insn1, insn2;
15094
15095 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15096 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15097 if ((insn1 & ~0xfffc) == LD_R2_0R12
15098 && insn2 == ADD_R2_R2_R12)
15099 {
95f0d0d2 15100 bfd_put_32 (input_bfd,
006589cf
AM
15101 ADDIS_R2_R12 + PPC_HA (relocation),
15102 contents + rel->r_offset);
95f0d0d2 15103 bfd_put_32 (input_bfd,
006589cf
AM
15104 ADDI_R2_R2 + PPC_LO (relocation),
15105 contents + rel->r_offset + 4);
15106 }
15107 }
15108 }
15109 break;
15110
52a82034
AM
15111 case R_PPC64_REL16_HA:
15112 /* If we are generating a non-PIC executable, edit
15113 . 0: addis 2,12,.TOC.-0b@ha
15114 . addi 2,2,.TOC.-0b@l
15115 used by ELFv2 global entry points to set up r2, to
15116 . lis 2,.TOC.@ha
15117 . addi 2,2,.TOC.@l
15118 if .TOC. is in range. */
0e1862bb 15119 if (!bfd_link_pic (info)
810d4e75 15120 && !info->traditional_format
006589cf 15121 && !htab->opd_abi
4f038ee5 15122 && rel->r_addend == d_offset
52a82034
AM
15123 && h != NULL && &h->elf == htab->elf.hgot
15124 && rel + 1 < relend
15125 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
15126 && rel[1].r_offset == rel->r_offset + 4
15127 && rel[1].r_addend == rel->r_addend + 4
15128 && relocation + 0x80008000 <= 0xffffffff)
15129 {
15130 unsigned int insn1, insn2;
4a421c53 15131 offset = rel->r_offset - d_offset;
95f0d0d2
AM
15132 insn1 = bfd_get_32 (input_bfd, contents + offset);
15133 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
006589cf
AM
15134 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
15135 && (insn2 & 0xffff0000) == ADDI_R2_R2)
52a82034
AM
15136 {
15137 r_type = R_PPC64_ADDR16_HA;
15138 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15139 rel->r_addend -= d_offset;
15140 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
15141 rel[1].r_addend -= d_offset + 4;
95f0d0d2 15142 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
52a82034
AM
15143 }
15144 }
15145 break;
411e1bfb
AM
15146 }
15147
15148 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 15149 insn = 0;
b25116a9
AM
15150 max_br_offset = 1 << 25;
15151 addend = rel->r_addend;
bc30df16 15152 reloc_dest = DEST_NORMAL;
65f38f15 15153 switch (r_type)
5bd4f169
AM
15154 {
15155 default:
65f38f15 15156 break;
5bd4f169 15157
3b421ab3
AM
15158 case R_PPC64_TOCSAVE:
15159 if (relocation + addend == (rel->r_offset
15160 + input_section->output_offset
15161 + input_section->output_section->vma)
15162 && tocsave_find (htab, NO_INSERT,
15163 &local_syms, rel, input_bfd))
15164 {
15165 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15166 if (insn == NOP
15167 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
15168 bfd_put_32 (input_bfd,
15169 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
15170 contents + rel->r_offset);
15171 }
15172 break;
15173
65f38f15
AM
15174 /* Branch taken prediction relocations. */
15175 case R_PPC64_ADDR14_BRTAKEN:
15176 case R_PPC64_REL14_BRTAKEN:
cedb70c5 15177 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
1a0670f3 15178 /* Fall through. */
65f38f15 15179
86c76c7b 15180 /* Branch not taken prediction relocations. */
65f38f15
AM
15181 case R_PPC64_ADDR14_BRNTAKEN:
15182 case R_PPC64_REL14_BRNTAKEN:
95f0d0d2 15183 insn |= bfd_get_32 (input_bfd,
411e1bfb 15184 contents + rel->r_offset) & ~(0x01 << 21);
1a0670f3 15185 /* Fall through. */
86c76c7b 15186
b25116a9
AM
15187 case R_PPC64_REL14:
15188 max_br_offset = 1 << 15;
1a0670f3 15189 /* Fall through. */
5bd4f169 15190
65f38f15 15191 case R_PPC64_REL24:
05d0e962 15192 case R_PPC64_REL24_NOTOC:
23cedd1d 15193 case R_PPC64_PLTCALL:
5663e321 15194 case R_PPC64_PLTCALL_NOTOC:
ad8e1ba5
AM
15195 /* Calls to functions with a different TOC, such as calls to
15196 shared objects, need to alter the TOC pointer. This is
15197 done using a linkage stub. A REL24 branching to these
15198 linkage stubs needs to be followed by a nop, as the nop
15199 will be replaced with an instruction to restore the TOC
15200 base pointer. */
8387904d 15201 fdh = h;
b31867b6
AM
15202 if (h != NULL
15203 && h->oh != NULL
15204 && h->oh->is_func_descriptor)
15205 fdh = ppc_follow_link (h->oh);
31c76678
DK
15206 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
15207 htab);
5663e321
AM
15208 if ((r_type == R_PPC64_PLTCALL
15209 || r_type == R_PPC64_PLTCALL_NOTOC)
23cedd1d 15210 && stub_entry != NULL
05d0e962
AM
15211 && stub_entry->stub_type >= ppc_stub_plt_call
15212 && stub_entry->stub_type <= ppc_stub_plt_call_both)
23cedd1d
AM
15213 stub_entry = NULL;
15214
6abec6bc 15215 if (stub_entry != NULL
d0abeec8
AM
15216 && ((stub_entry->stub_type >= ppc_stub_plt_call
15217 && stub_entry->stub_type <= ppc_stub_plt_call_both)
ad8e1ba5 15218 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
05d0e962
AM
15219 || stub_entry->stub_type == ppc_stub_plt_branch_both
15220 || stub_entry->stub_type == ppc_stub_long_branch_r2off
15221 || stub_entry->stub_type == ppc_stub_long_branch_both))
41bd81ab 15222 {
b25116a9 15223 bfd_boolean can_plt_call = FALSE;
721956f4 15224
6e1816be
AM
15225 if (stub_entry->stub_type == ppc_stub_plt_call
15226 && !htab->opd_abi
15227 && htab->params->plt_localentry0 != 0
15228 && is_elfv2_localentry0 (&h->elf))
15229 {
15230 /* The function doesn't use or change r2. */
15231 can_plt_call = TRUE;
15232 }
05d0e962
AM
15233 else if (r_type == R_PPC64_REL24_NOTOC)
15234 {
15235 /* NOTOC calls don't need to restore r2. */
15236 can_plt_call = TRUE;
15237 }
6e1816be 15238
f378ab09 15239 /* All of these stubs may modify r2, so there must be a
ba8ca3e7
AM
15240 branch and link followed by a nop. The nop is
15241 replaced by an insn to restore r2. */
6e1816be 15242 else if (rel->r_offset + 8 <= input_section->size)
41bd81ab 15243 {
ba8ca3e7
AM
15244 unsigned long br;
15245
15246 br = bfd_get_32 (input_bfd,
15247 contents + rel->r_offset);
15248 if ((br & 1) != 0)
41bd81ab 15249 {
ba8ca3e7
AM
15250 unsigned long nop;
15251
15252 nop = bfd_get_32 (input_bfd,
15253 contents + rel->r_offset + 4);
23cedd1d
AM
15254 if (nop == LD_R2_0R1 + STK_TOC (htab))
15255 can_plt_call = TRUE;
15256 else if (nop == NOP
15257 || nop == CROR_151515
15258 || nop == CROR_313131)
a7f2871e 15259 {
ba8ca3e7
AM
15260 if (h != NULL
15261 && (h == htab->tls_get_addr_fd
15262 || h == htab->tls_get_addr)
7c9cf415 15263 && htab->params->tls_get_addr_opt)
ba8ca3e7
AM
15264 {
15265 /* Special stub used, leave nop alone. */
15266 }
15267 else
a078d95a
AM
15268 bfd_put_32 (input_bfd,
15269 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7
AM
15270 contents + rel->r_offset + 4);
15271 can_plt_call = TRUE;
a7f2871e 15272 }
41bd81ab 15273 }
5bd4f169 15274 }
721956f4 15275
ba8ca3e7 15276 if (!can_plt_call && h != NULL)
721956f4 15277 {
ba8ca3e7
AM
15278 const char *name = h->elf.root.root.string;
15279
15280 if (*name == '.')
15281 ++name;
15282
15283 if (strncmp (name, "__libc_start_main", 17) == 0
15284 && (name[17] == 0 || name[17] == '@'))
6ab189d5 15285 {
ba8ca3e7
AM
15286 /* Allow crt1 branch to go via a toc adjusting
15287 stub. Other calls that never return could do
15288 the same, if we could detect such. */
b25116a9 15289 can_plt_call = TRUE;
6ab189d5 15290 }
ba8ca3e7
AM
15291 }
15292
15293 if (!can_plt_call)
15294 {
15295 /* g++ as of 20130507 emits self-calls without a
15296 following nop. This is arguably wrong since we
15297 have conflicting information. On the one hand a
15298 global symbol and on the other a local call
15299 sequence, but don't error for this special case.
15300 It isn't possible to cheaply verify we have
15301 exactly such a call. Allow all calls to the same
15302 section. */
15303 asection *code_sec = sec;
15304
15305 if (get_opd_info (sec) != NULL)
ad8e1ba5 15306 {
ba8ca3e7
AM
15307 bfd_vma off = (relocation + addend
15308 - sec->output_section->vma
15309 - sec->output_offset);
bc30df16 15310
ba8ca3e7 15311 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 15312 }
ba8ca3e7
AM
15313 if (code_sec == input_section)
15314 can_plt_call = TRUE;
15315 }
15316
15317 if (!can_plt_call)
15318 {
05d0e962
AM
15319 if (stub_entry->stub_type >= ppc_stub_plt_call
15320 && stub_entry->stub_type <= ppc_stub_plt_call_both)
4805fc55 15321 info->callbacks->einfo
695344c0 15322 /* xgettext:c-format */
c1c8c1ef 15323 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15324 "(plt call stub)\n"),
4805fc55
AM
15325 input_bfd, input_section, rel->r_offset, sym_name);
15326 else
15327 info->callbacks->einfo
695344c0 15328 /* xgettext:c-format */
c1c8c1ef 15329 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15330 "(toc save/adjust stub)\n"),
4805fc55 15331 input_bfd, input_section, rel->r_offset, sym_name);
ba8ca3e7
AM
15332
15333 bfd_set_error (bfd_error_bad_value);
15334 ret = FALSE;
721956f4
AM
15335 }
15336
b25116a9 15337 if (can_plt_call
05d0e962
AM
15338 && stub_entry->stub_type >= ppc_stub_plt_call
15339 && stub_entry->stub_type <= ppc_stub_plt_call_both)
b25116a9
AM
15340 unresolved_reloc = FALSE;
15341 }
15342
6abec6bc
AM
15343 if ((stub_entry == NULL
15344 || stub_entry->stub_type == ppc_stub_long_branch
15345 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
15346 && get_opd_info (sec) != NULL)
15347 {
15348 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
15349 bfd_vma off = (relocation + addend
15350 - sec->output_section->vma
15351 - sec->output_offset);
aef36ac1 15352 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
15353 if (dest != (bfd_vma) -1)
15354 {
15355 relocation = dest;
15356 addend = 0;
bc30df16 15357 reloc_dest = DEST_OPD;
8387904d
AM
15358 }
15359 }
15360
b25116a9
AM
15361 /* If the branch is out of reach we ought to have a long
15362 branch stub. */
15363 from = (rel->r_offset
15364 + input_section->output_offset
15365 + input_section->output_section->vma);
15366
6911b7dc
AM
15367 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
15368 ? fdh->elf.other
15369 : sym->st_other);
15370
6abec6bc
AM
15371 if (stub_entry != NULL
15372 && (stub_entry->stub_type == ppc_stub_long_branch
15373 || stub_entry->stub_type == ppc_stub_plt_branch)
15374 && (r_type == R_PPC64_ADDR14_BRTAKEN
15375 || r_type == R_PPC64_ADDR14_BRNTAKEN
15376 || (relocation + addend - from + max_br_offset
15377 < 2 * max_br_offset)))
15378 /* Don't use the stub if this branch is in range. */
15379 stub_entry = NULL;
b25116a9 15380
05d0e962
AM
15381 if (stub_entry != NULL
15382 && (stub_entry->stub_type == ppc_stub_long_branch_notoc
15383 || stub_entry->stub_type == ppc_stub_long_branch_both
15384 || stub_entry->stub_type == ppc_stub_plt_branch_notoc
15385 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15386 && (r_type != R_PPC64_REL24_NOTOC
15387 || ((fdh ? fdh->elf.other : sym->st_other)
4a4e7361 15388 & STO_PPC64_LOCAL_MASK) <= 1 << STO_PPC64_LOCAL_BIT)
05d0e962
AM
15389 && (relocation + addend - from + max_br_offset
15390 < 2 * max_br_offset))
15391 stub_entry = NULL;
15392
15393 if (stub_entry != NULL
15394 && (stub_entry->stub_type == ppc_stub_long_branch_r2off
15395 || stub_entry->stub_type == ppc_stub_long_branch_both
15396 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
15397 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15398 && r_type == R_PPC64_REL24_NOTOC
15399 && (relocation + addend - from + max_br_offset
15400 < 2 * max_br_offset))
15401 stub_entry = NULL;
15402
b25116a9
AM
15403 if (stub_entry != NULL)
15404 {
15405 /* Munge up the value and addend so that we call the stub
15406 rather than the procedure directly. */
a4b6fadd
AM
15407 asection *stub_sec = stub_entry->group->stub_sec;
15408
15409 if (stub_entry->stub_type == ppc_stub_save_res)
15410 relocation += (stub_sec->output_offset
15411 + stub_sec->output_section->vma
15412 + stub_sec->size - htab->sfpr->size
15413 - htab->sfpr->output_offset
15414 - htab->sfpr->output_section->vma);
15415 else
15416 relocation = (stub_entry->stub_offset
15417 + stub_sec->output_offset
15418 + stub_sec->output_section->vma);
b25116a9 15419 addend = 0;
bc30df16 15420 reloc_dest = DEST_STUB;
3b421ab3 15421
05d0e962
AM
15422 if (((stub_entry->stub_type == ppc_stub_plt_call
15423 && ALWAYS_EMIT_R2SAVE)
15424 || stub_entry->stub_type == ppc_stub_plt_call_r2save
15425 || stub_entry->stub_type == ppc_stub_plt_call_both)
e81b4c93
AM
15426 && !(h != NULL
15427 && (h == htab->tls_get_addr_fd
15428 || h == htab->tls_get_addr)
15429 && htab->params->tls_get_addr_opt)
3b421ab3
AM
15430 && rel + 1 < relend
15431 && rel[1].r_offset == rel->r_offset + 4
15432 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
15433 relocation += 4;
05d0e962
AM
15434 else if ((stub_entry->stub_type == ppc_stub_long_branch_both
15435 || stub_entry->stub_type == ppc_stub_plt_branch_both
15436 || stub_entry->stub_type == ppc_stub_plt_call_both)
15437 && r_type == R_PPC64_REL24_NOTOC)
15438 relocation += 4;
5663e321
AM
15439
15440 if (r_type == R_PPC64_REL24_NOTOC
15441 && (stub_entry->stub_type == ppc_stub_plt_call_notoc
15442 || stub_entry->stub_type == ppc_stub_plt_call_both))
15443 htab->notoc_plt = 1;
b25116a9
AM
15444 }
15445
15446 if (insn != 0)
15447 {
794e51c0 15448 if (is_isa_v2)
721956f4 15449 {
b25116a9
AM
15450 /* Set 'a' bit. This is 0b00010 in BO field for branch
15451 on CR(BI) insns (BO == 001at or 011at), and 0b01000
15452 for branch on CTR insns (BO == 1a00t or 1a01t). */
15453 if ((insn & (0x14 << 21)) == (0x04 << 21))
15454 insn |= 0x02 << 21;
15455 else if ((insn & (0x14 << 21)) == (0x10 << 21))
15456 insn |= 0x08 << 21;
15457 else
15458 break;
15459 }
15460 else
15461 {
15462 /* Invert 'y' bit if not the default. */
4cc603a5 15463 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 15464 insn ^= 0x01 << 21;
721956f4 15465 }
b25116a9 15466
95f0d0d2 15467 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
5bd4f169 15468 }
e86ce104 15469
06da1e8e
AM
15470 /* NOP out calls to undefined weak functions.
15471 We can thus call a weak function without first
15472 checking whether the function is defined. */
b25116a9 15473 else if (h != NULL
039b3fef 15474 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 15475 && h->elf.dynindx == -1
05d0e962
AM
15476 && (r_type == R_PPC64_REL24
15477 || r_type == R_PPC64_REL24_NOTOC)
b25116a9 15478 && relocation == 0
4cc603a5 15479 && addend == 0)
e86ce104 15480 {
95f0d0d2 15481 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
c316a17c 15482 goto copy_reloc;
e86ce104 15483 }
65f38f15 15484 break;
066f4018
AM
15485
15486 case R_PPC64_GOT16_DS:
15487 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15488 if (relocation + addend - from + 0x8000 < 0x10000
15489 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15490 {
15491 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15492 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15493 {
15494 insn += (14u << 26) - (58u << 26);
15495 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15496 r_type = R_PPC64_TOC16;
15497 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15498 }
15499 }
15500 break;
15501
15502 case R_PPC64_GOT16_LO_DS:
15503 case R_PPC64_GOT16_HA:
15504 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15505 if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
15506 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15507 {
15508 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15509 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15510 {
15511 insn += (14u << 26) - (58u << 26);
15512 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15513 r_type = R_PPC64_TOC16_LO;
15514 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15515 }
2365f8d7 15516 else if ((insn & (0x3fu << 26)) == 15u << 26 /* addis */)
066f4018
AM
15517 {
15518 r_type = R_PPC64_TOC16_HA;
15519 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15520 }
15521 }
15522 break;
4a421c53
AM
15523
15524 case R_PPC64_GOT_PCREL34:
15525 from = (rel->r_offset
15526 + input_section->output_section->vma
15527 + input_section->output_offset);
15528 if (relocation - from + (1ULL << 33) < 1ULL << 34
15529 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15530 {
15531 offset = rel->r_offset;
15532 pinsn = bfd_get_32 (input_bfd, contents + offset);
15533 pinsn <<= 32;
15534 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15535 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15536 == ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
15537 {
15538 /* Replace with paddi. */
15539 pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
15540 r_type = R_PPC64_PCREL34;
15541 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15542 bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
15543 bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
15544 goto pcrelopt;
15545 }
15546 }
15547 break;
15548
15549 case R_PPC64_PCREL34:
15550 if (SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15551 {
15552 offset = rel->r_offset;
15553 pinsn = bfd_get_32 (input_bfd, contents + offset);
15554 pinsn <<= 32;
15555 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15556 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15557 == ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
15558 | (14ULL << 26) /* paddi */))
15559 {
15560 pcrelopt:
15561 if (rel + 1 < relend
15562 && rel[1].r_offset == offset
15563 && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT))
15564 {
15565 bfd_vma off2 = rel[1].r_addend;
15566 if (off2 == 0)
15567 /* zero means next insn. */
15568 off2 = 8;
15569 off2 += offset;
15570 if (off2 + 4 <= input_section->size)
15571 {
15572 uint64_t pinsn2;
dd9b12c2 15573 bfd_signed_vma addend_off;
4a421c53
AM
15574 pinsn2 = bfd_get_32 (input_bfd, contents + off2);
15575 pinsn2 <<= 32;
15576 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
77486630
AM
15577 {
15578 if (off2 + 8 > input_section->size)
15579 break;
15580 pinsn2 |= bfd_get_32 (input_bfd,
15581 contents + off2 + 4);
15582 }
dd9b12c2 15583 if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
4a421c53 15584 {
dd9b12c2
AM
15585 addend += addend_off;
15586 rel->r_addend = addend;
4a421c53
AM
15587 bfd_put_32 (input_bfd, pinsn >> 32,
15588 contents + offset);
15589 bfd_put_32 (input_bfd, pinsn,
15590 contents + offset + 4);
15591 bfd_put_32 (input_bfd, pinsn2 >> 32,
15592 contents + off2);
77486630
AM
15593 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
15594 bfd_put_32 (input_bfd, pinsn2,
15595 contents + off2 + 4);
4a421c53
AM
15596 }
15597 }
15598 }
15599 }
15600 }
15601 break;
65f38f15 15602 }
5bd4f169 15603
411e1bfb 15604 tls_type = 0;
23cedd1d 15605 save_unresolved_reloc = unresolved_reloc;
65f38f15
AM
15606 switch (r_type)
15607 {
15608 default:
cf97bcb0
AM
15609 /* xgettext:c-format */
15610 _bfd_error_handler (_("%pB: %s unsupported"),
15611 input_bfd, ppc64_elf_howto_table[r_type]->name);
5bd4f169 15612
65f38f15 15613 bfd_set_error (bfd_error_bad_value);
b34976b6 15614 ret = FALSE;
c316a17c 15615 goto copy_reloc;
5bd4f169 15616
65f38f15 15617 case R_PPC64_NONE:
411e1bfb 15618 case R_PPC64_TLS:
727fc41e
AM
15619 case R_PPC64_TLSGD:
15620 case R_PPC64_TLSLD:
3b421ab3 15621 case R_PPC64_TOCSAVE:
04c9666a
AM
15622 case R_PPC64_GNU_VTINHERIT:
15623 case R_PPC64_GNU_VTENTRY:
006589cf 15624 case R_PPC64_ENTRY:
4a421c53 15625 case R_PPC64_PCREL_OPT:
c316a17c 15626 goto copy_reloc;
5bd4f169
AM
15627
15628 /* GOT16 relocations. Like an ADDR16 using the symbol's
15629 address in the GOT as relocation value instead of the
411e1bfb 15630 symbol's value itself. Also, create a GOT entry for the
5bd4f169 15631 symbol and put the symbol value there. */
411e1bfb
AM
15632 case R_PPC64_GOT_TLSGD16:
15633 case R_PPC64_GOT_TLSGD16_LO:
15634 case R_PPC64_GOT_TLSGD16_HI:
15635 case R_PPC64_GOT_TLSGD16_HA:
c213164a 15636 case R_PPC64_GOT_TLSGD34:
951fd09b 15637 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
15638 goto dogot;
15639
15640 case R_PPC64_GOT_TLSLD16:
15641 case R_PPC64_GOT_TLSLD16_LO:
15642 case R_PPC64_GOT_TLSLD16_HI:
15643 case R_PPC64_GOT_TLSLD16_HA:
c213164a 15644 case R_PPC64_GOT_TLSLD34:
951fd09b 15645 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
15646 goto dogot;
15647
15648 case R_PPC64_GOT_TPREL16_DS:
15649 case R_PPC64_GOT_TPREL16_LO_DS:
15650 case R_PPC64_GOT_TPREL16_HI:
15651 case R_PPC64_GOT_TPREL16_HA:
c213164a 15652 case R_PPC64_GOT_TPREL34:
411e1bfb
AM
15653 tls_type = TLS_TLS | TLS_TPREL;
15654 goto dogot;
15655
15656 case R_PPC64_GOT_DTPREL16_DS:
15657 case R_PPC64_GOT_DTPREL16_LO_DS:
15658 case R_PPC64_GOT_DTPREL16_HI:
15659 case R_PPC64_GOT_DTPREL16_HA:
c213164a 15660 case R_PPC64_GOT_DTPREL34:
411e1bfb
AM
15661 tls_type = TLS_TLS | TLS_DTPREL;
15662 goto dogot;
15663
65f38f15
AM
15664 case R_PPC64_GOT16:
15665 case R_PPC64_GOT16_LO:
15666 case R_PPC64_GOT16_HI:
15667 case R_PPC64_GOT16_HA:
15668 case R_PPC64_GOT16_DS:
15669 case R_PPC64_GOT16_LO_DS:
5663e321 15670 case R_PPC64_GOT_PCREL34:
411e1bfb 15671 dogot:
5bd4f169
AM
15672 {
15673 /* Relocation is to the entry for this symbol in the global
15674 offset table. */
e717da7e 15675 asection *got;
d881513a 15676 bfd_vma *offp;
5bd4f169 15677 bfd_vma off;
d881513a 15678 unsigned long indx = 0;
927be08e 15679 struct got_entry *ent;
65f38f15 15680
d881513a 15681 if (tls_type == (TLS_TLS | TLS_LD)
f749f26e 15682 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
927be08e 15683 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 15684 else
5bd4f169 15685 {
d881513a
AM
15686 if (h != NULL)
15687 {
f0158f44
AM
15688 if (!htab->elf.dynamic_sections_created
15689 || h->elf.dynindx == -1
15690 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
21d68fcd 15691 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
d881513a
AM
15692 /* This is actually a static link, or it is a
15693 -Bsymbolic link and the symbol is defined
15694 locally, or the symbol was forced to be local
15695 because of a version file. */
15696 ;
15697 else
15698 {
039b3fef 15699 indx = h->elf.dynindx;
d881513a
AM
15700 unresolved_reloc = FALSE;
15701 }
039b3fef 15702 ent = h->elf.got.glist;
d881513a 15703 }
411e1bfb 15704 else
5bd4f169 15705 {
d881513a
AM
15706 if (local_got_ents == NULL)
15707 abort ();
15708 ent = local_got_ents[r_symndx];
5bd4f169 15709 }
d881513a
AM
15710
15711 for (; ent != NULL; ent = ent->next)
133a1f60 15712 if (ent->addend == orig_rel.r_addend
e717da7e 15713 && ent->owner == input_bfd
d881513a
AM
15714 && ent->tls_type == tls_type)
15715 break;
5bd4f169 15716 }
411e1bfb 15717
927be08e
AM
15718 if (ent == NULL)
15719 abort ();
15720 if (ent->is_indirect)
15721 ent = ent->got.ent;
15722 offp = &ent->got.offset;
15723 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
15724 if (got == NULL)
15725 abort ();
15726
411e1bfb
AM
15727 /* The offset must always be a multiple of 8. We use the
15728 least significant bit to record whether we have already
15729 processed this entry. */
d881513a 15730 off = *offp;
411e1bfb
AM
15731 if ((off & 1) != 0)
15732 off &= ~1;
5bd4f169
AM
15733 else
15734 {
411e1bfb
AM
15735 /* Generate relocs for the dynamic linker, except in
15736 the case of TLSLD where we'll use one entry per
15737 module. */
25f23106
AM
15738 asection *relgot;
15739 bfd_boolean ifunc;
e717da7e 15740
d881513a 15741 *offp = off | 1;
25f23106
AM
15742 relgot = NULL;
15743 ifunc = (h != NULL
15744 ? h->elf.type == STT_GNU_IFUNC
15745 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 15746 if (ifunc)
82e66161
AM
15747 {
15748 relgot = htab->elf.irelplt;
15749 if (indx == 0)
15750 htab->local_ifunc_resolver = 1;
15751 else if (is_static_defined (&h->elf))
15752 htab->maybe_local_ifunc_resolver = 1;
15753 }
f0158f44
AM
15754 else if (indx != 0
15755 || (bfd_link_pic (info)
15756 && (h == NULL
f749f26e
AM
15757 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
15758 && !(tls_type != 0
f15d0b54
AM
15759 && bfd_link_executable (info)
15760 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
19e08130 15761 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 15762 if (relgot != NULL)
5bd4f169 15763 {
e717da7e
AM
15764 outrel.r_offset = (got->output_section->vma
15765 + got->output_offset
411e1bfb 15766 + off);
133a1f60 15767 outrel.r_addend = orig_rel.r_addend;
d881513a 15768 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 15769 {
411e1bfb 15770 outrel.r_addend = 0;
e515b051 15771 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
15772 if (tls_type == (TLS_TLS | TLS_GD))
15773 {
e717da7e
AM
15774 loc = relgot->contents;
15775 loc += (relgot->reloc_count++
d881513a
AM
15776 * sizeof (Elf64_External_Rela));
15777 bfd_elf64_swap_reloca_out (output_bfd,
15778 &outrel, loc);
e515b051 15779 outrel.r_offset += 8;
133a1f60 15780 outrel.r_addend = orig_rel.r_addend;
d881513a
AM
15781 outrel.r_info
15782 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 15783 }
411e1bfb 15784 }
951fd09b 15785 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 15786 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 15787 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 15788 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
15789 else if (indx != 0)
15790 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
15791 else
81407a69 15792 {
25f23106
AM
15793 if (ifunc)
15794 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15795 else
15796 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
15797
15798 /* Write the .got section contents for the sake
15799 of prelink. */
e717da7e 15800 loc = got->contents + off;
23fbd6fa
JJ
15801 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
15802 loc);
81407a69 15803 }
81407a69
AM
15804
15805 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
15806 {
15807 outrel.r_addend += relocation;
15808 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
989f9879
AM
15809 {
15810 if (htab->elf.tls_sec == NULL)
15811 outrel.r_addend = 0;
15812 else
15813 outrel.r_addend -= htab->elf.tls_sec->vma;
15814 }
e515b051 15815 }
e717da7e
AM
15816 loc = relgot->contents;
15817 loc += (relgot->reloc_count++
411e1bfb
AM
15818 * sizeof (Elf64_External_Rela));
15819 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
15820 }
15821
ad8e1ba5 15822 /* Init the .got section contents here if we're not
81407a69 15823 emitting a reloc. */
d881513a 15824 else
411e1bfb 15825 {
133a1f60 15826 relocation += orig_rel.r_addend;
f0158f44 15827 if (tls_type != 0)
411e1bfb 15828 {
989f9879
AM
15829 if (htab->elf.tls_sec == NULL)
15830 relocation = 0;
15831 else
15832 {
f0158f44
AM
15833 if (tls_type & TLS_LD)
15834 relocation = 0;
15835 else
15836 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
676ee2b5 15837 if (tls_type & TLS_TPREL)
989f9879
AM
15838 relocation += DTP_OFFSET - TP_OFFSET;
15839 }
5bd4f169 15840
f0158f44 15841 if (tls_type & (TLS_GD | TLS_LD))
7b609f53
AM
15842 {
15843 bfd_put_64 (output_bfd, relocation,
e717da7e 15844 got->contents + off + 8);
676ee2b5 15845 relocation = 1;
7b609f53 15846 }
411e1bfb
AM
15847 }
15848 bfd_put_64 (output_bfd, relocation,
e717da7e 15849 got->contents + off);
5bd4f169
AM
15850 }
15851 }
15852
65f38f15
AM
15853 if (off >= (bfd_vma) -2)
15854 abort ();
15855
bf102f86 15856 relocation = got->output_section->vma + got->output_offset + off;
133a1f60 15857 addend = 0;
c213164a
AM
15858 if (!(r_type == R_PPC64_GOT_PCREL34
15859 || r_type == R_PPC64_GOT_TLSGD34
15860 || r_type == R_PPC64_GOT_TLSLD34
15861 || r_type == R_PPC64_GOT_TPREL34
15862 || r_type == R_PPC64_GOT_DTPREL34))
5663e321 15863 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
5bd4f169 15864 }
65f38f15
AM
15865 break;
15866
15867 case R_PPC64_PLT16_HA:
15868 case R_PPC64_PLT16_HI:
15869 case R_PPC64_PLT16_LO:
08be3224 15870 case R_PPC64_PLT16_LO_DS:
5663e321
AM
15871 case R_PPC64_PLT_PCREL34:
15872 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
15873 case R_PPC64_PLT32:
15874 case R_PPC64_PLT64:
23cedd1d 15875 case R_PPC64_PLTSEQ:
5663e321 15876 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d 15877 case R_PPC64_PLTCALL:
5663e321 15878 case R_PPC64_PLTCALL_NOTOC:
65f38f15
AM
15879 /* Relocation is to the entry for this symbol in the
15880 procedure linkage table. */
23cedd1d 15881 unresolved_reloc = TRUE;
cbf95972
AM
15882 {
15883 struct plt_entry **plt_list = NULL;
15884 if (h != NULL)
15885 plt_list = &h->elf.plt.plist;
15886 else if (local_got_ents != NULL)
15887 {
15888 struct plt_entry **local_plt = (struct plt_entry **)
15889 (local_got_ents + symtab_hdr->sh_info);
2d7ad24e 15890 plt_list = local_plt + r_symndx;
cbf95972
AM
15891 }
15892 if (plt_list)
15893 {
15894 struct plt_entry *ent;
65f38f15 15895
cbf95972
AM
15896 for (ent = *plt_list; ent != NULL; ent = ent->next)
15897 if (ent->plt.offset != (bfd_vma) -1
133a1f60 15898 && ent->addend == orig_rel.r_addend)
cbf95972
AM
15899 {
15900 asection *plt;
08be3224 15901 bfd_vma got;
cbf95972
AM
15902
15903 plt = htab->elf.splt;
15904 if (!htab->elf.dynamic_sections_created
15905 || h == NULL
15906 || h->elf.dynindx == -1)
2d7ad24e
AM
15907 {
15908 if (h != NULL
15909 ? h->elf.type == STT_GNU_IFUNC
15910 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15911 plt = htab->elf.iplt;
15912 else
15913 plt = htab->pltlocal;
15914 }
15915 relocation = (plt->output_section->vma
15916 + plt->output_offset
15917 + ent->plt.offset);
08be3224 15918 if (r_type == R_PPC64_PLT16_HA
2cdcc330
AM
15919 || r_type == R_PPC64_PLT16_HI
15920 || r_type == R_PPC64_PLT16_LO
15921 || r_type == R_PPC64_PLT16_LO_DS)
08be3224
AM
15922 {
15923 got = (elf_gp (output_bfd)
15924 + htab->sec_info[input_section->id].toc_off);
15925 relocation -= got;
15926 }
133a1f60 15927 addend = 0;
cbf95972
AM
15928 unresolved_reloc = FALSE;
15929 break;
15930 }
15931 }
15932 }
65f38f15 15933 break;
5bd4f169 15934
0b13192e
AM
15935 case R_PPC64_TOC:
15936 /* Relocation value is TOC base. */
15937 relocation = TOCstart;
cf35638d 15938 if (r_symndx == STN_UNDEF)
6f20ed8a 15939 relocation += htab->sec_info[input_section->id].toc_off;
8517fae7
AM
15940 else if (unresolved_reloc)
15941 ;
6f20ed8a
AM
15942 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
15943 relocation += htab->sec_info[sec->id].toc_off;
0b13192e
AM
15944 else
15945 unresolved_reloc = TRUE;
ab96bf03 15946 goto dodyn;
0b13192e 15947
5bd4f169
AM
15948 /* TOC16 relocs. We want the offset relative to the TOC base,
15949 which is the address of the start of the TOC plus 0x8000.
15950 The TOC consists of sections .got, .toc, .tocbss, and .plt,
15951 in this order. */
65f38f15
AM
15952 case R_PPC64_TOC16:
15953 case R_PPC64_TOC16_LO:
15954 case R_PPC64_TOC16_HI:
15955 case R_PPC64_TOC16_DS:
15956 case R_PPC64_TOC16_LO_DS:
15957 case R_PPC64_TOC16_HA:
6f20ed8a 15958 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
1bdd8fac
AM
15959 if (h != NULL)
15960 goto dodyn;
5bd4f169
AM
15961 break;
15962
15963 /* Relocate against the beginning of the section. */
65f38f15
AM
15964 case R_PPC64_SECTOFF:
15965 case R_PPC64_SECTOFF_LO:
15966 case R_PPC64_SECTOFF_HI:
15967 case R_PPC64_SECTOFF_DS:
15968 case R_PPC64_SECTOFF_LO_DS:
15969 case R_PPC64_SECTOFF_HA:
4ce794b7 15970 if (sec != NULL)
65f38f15 15971 addend -= sec->output_section->vma;
5bd4f169
AM
15972 break;
15973
25f23106
AM
15974 case R_PPC64_REL16:
15975 case R_PPC64_REL16_LO:
15976 case R_PPC64_REL16_HI:
15977 case R_PPC64_REL16_HA:
4a969973
AM
15978 case R_PPC64_REL16_HIGH:
15979 case R_PPC64_REL16_HIGHA:
15980 case R_PPC64_REL16_HIGHER:
15981 case R_PPC64_REL16_HIGHERA:
15982 case R_PPC64_REL16_HIGHEST:
15983 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
15984 case R_PPC64_REL16_HIGHER34:
15985 case R_PPC64_REL16_HIGHERA34:
15986 case R_PPC64_REL16_HIGHEST34:
15987 case R_PPC64_REL16_HIGHESTA34:
a680de9a 15988 case R_PPC64_REL16DX_HA:
721956f4
AM
15989 case R_PPC64_REL14:
15990 case R_PPC64_REL14_BRNTAKEN:
15991 case R_PPC64_REL14_BRTAKEN:
5d1634d7 15992 case R_PPC64_REL24:
05d0e962 15993 case R_PPC64_REL24_NOTOC:
5663e321
AM
15994 case R_PPC64_PCREL34:
15995 case R_PPC64_PCREL28:
5d1634d7
AM
15996 break;
15997
411e1bfb
AM
15998 case R_PPC64_TPREL16:
15999 case R_PPC64_TPREL16_LO:
16000 case R_PPC64_TPREL16_HI:
16001 case R_PPC64_TPREL16_HA:
16002 case R_PPC64_TPREL16_DS:
16003 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
16004 case R_PPC64_TPREL16_HIGH:
16005 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
16006 case R_PPC64_TPREL16_HIGHER:
16007 case R_PPC64_TPREL16_HIGHERA:
16008 case R_PPC64_TPREL16_HIGHEST:
16009 case R_PPC64_TPREL16_HIGHESTA:
c213164a 16010 case R_PPC64_TPREL34:
766bc656
AM
16011 if (h != NULL
16012 && h->elf.root.type == bfd_link_hash_undefweak
16013 && h->elf.dynindx == -1)
16014 {
16015 /* Make this relocation against an undefined weak symbol
16016 resolve to zero. This is really just a tweak, since
16017 code using weak externs ought to check that they are
16018 defined before using them. */
16019 bfd_byte *p = contents + rel->r_offset - d_offset;
16020
95f0d0d2 16021 insn = bfd_get_32 (input_bfd, p);
766bc656
AM
16022 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
16023 if (insn != 0)
95f0d0d2 16024 bfd_put_32 (input_bfd, insn, p);
766bc656
AM
16025 break;
16026 }
989f9879
AM
16027 if (htab->elf.tls_sec != NULL)
16028 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7c8bbca5
AM
16029 /* The TPREL16 relocs shouldn't really be used in shared
16030 libs or with non-local symbols as that will result in
16031 DT_TEXTREL being set, but support them anyway. */
16032 goto dodyn;
411e1bfb
AM
16033
16034 case R_PPC64_DTPREL16:
16035 case R_PPC64_DTPREL16_LO:
16036 case R_PPC64_DTPREL16_HI:
16037 case R_PPC64_DTPREL16_HA:
16038 case R_PPC64_DTPREL16_DS:
16039 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
16040 case R_PPC64_DTPREL16_HIGH:
16041 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
16042 case R_PPC64_DTPREL16_HIGHER:
16043 case R_PPC64_DTPREL16_HIGHERA:
16044 case R_PPC64_DTPREL16_HIGHEST:
16045 case R_PPC64_DTPREL16_HIGHESTA:
c213164a 16046 case R_PPC64_DTPREL34:
989f9879
AM
16047 if (htab->elf.tls_sec != NULL)
16048 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
16049 break;
16050
45965137
AM
16051 case R_PPC64_ADDR64_LOCAL:
16052 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
16053 ? h->elf.other
16054 : sym->st_other);
16055 break;
16056
e515b051
AM
16057 case R_PPC64_DTPMOD64:
16058 relocation = 1;
16059 addend = 0;
16060 goto dodyn;
16061
411e1bfb 16062 case R_PPC64_TPREL64:
989f9879
AM
16063 if (htab->elf.tls_sec != NULL)
16064 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
16065 goto dodyn;
16066
16067 case R_PPC64_DTPREL64:
989f9879
AM
16068 if (htab->elf.tls_sec != NULL)
16069 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
1a0670f3 16070 /* Fall through. */
411e1bfb 16071
65f38f15
AM
16072 /* Relocations that may need to be propagated if this is a
16073 dynamic object. */
04c9666a 16074 case R_PPC64_REL30:
65f38f15
AM
16075 case R_PPC64_REL32:
16076 case R_PPC64_REL64:
16077 case R_PPC64_ADDR14:
16078 case R_PPC64_ADDR14_BRNTAKEN:
16079 case R_PPC64_ADDR14_BRTAKEN:
16080 case R_PPC64_ADDR16:
16081 case R_PPC64_ADDR16_DS:
16082 case R_PPC64_ADDR16_HA:
16083 case R_PPC64_ADDR16_HI:
f9c6b907
AM
16084 case R_PPC64_ADDR16_HIGH:
16085 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16086 case R_PPC64_ADDR16_HIGHER:
16087 case R_PPC64_ADDR16_HIGHERA:
16088 case R_PPC64_ADDR16_HIGHEST:
16089 case R_PPC64_ADDR16_HIGHESTA:
16090 case R_PPC64_ADDR16_LO:
16091 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
16092 case R_PPC64_ADDR16_HIGHER34:
16093 case R_PPC64_ADDR16_HIGHERA34:
16094 case R_PPC64_ADDR16_HIGHEST34:
16095 case R_PPC64_ADDR16_HIGHESTA34:
65f38f15 16096 case R_PPC64_ADDR24:
65f38f15
AM
16097 case R_PPC64_ADDR32:
16098 case R_PPC64_ADDR64:
16099 case R_PPC64_UADDR16:
16100 case R_PPC64_UADDR32:
16101 case R_PPC64_UADDR64:
5663e321
AM
16102 case R_PPC64_D34:
16103 case R_PPC64_D34_LO:
16104 case R_PPC64_D34_HI30:
16105 case R_PPC64_D34_HA30:
16106 case R_PPC64_D28:
411e1bfb 16107 dodyn:
5d1634d7 16108 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
16109 break;
16110
41bd81ab
AM
16111 if (NO_OPD_RELOCS && is_opd)
16112 break;
16113
8a9e8e72 16114 if (bfd_link_pic (info)
b1b07054
AM
16115 ? ((h == NULL
16116 || h->dyn_relocs != NULL)
16117 && ((h != NULL && pc_dynrelocs (h))
16118 || must_be_dyn_reloc (info, r_type)))
8a9e8e72
AM
16119 : (h != NULL
16120 ? h->dyn_relocs != NULL
d311bc8b 16121 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
65f38f15 16122 {
b34976b6 16123 bfd_boolean skip, relocate;
65f38f15 16124 asection *sreloc;
1cf1f670 16125 bfd_vma out_off;
82e66161 16126 long indx = 0;
65f38f15
AM
16127
16128 /* When generating a dynamic object, these relocations
16129 are copied into the output file to be resolved at run
16130 time. */
16131
b34976b6
AM
16132 skip = FALSE;
16133 relocate = FALSE;
65f38f15 16134
1cf1f670
AM
16135 out_off = _bfd_elf_section_offset (output_bfd, info,
16136 input_section, rel->r_offset);
16137 if (out_off == (bfd_vma) -1)
b34976b6 16138 skip = TRUE;
1cf1f670 16139 else if (out_off == (bfd_vma) -2)
b34976b6 16140 skip = TRUE, relocate = TRUE;
1cf1f670
AM
16141 out_off += (input_section->output_section->vma
16142 + input_section->output_offset);
16143 outrel.r_offset = out_off;
411e1bfb 16144 outrel.r_addend = rel->r_addend;
65f38f15 16145
1cf1f670
AM
16146 /* Optimize unaligned reloc use. */
16147 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
16148 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
16149 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
16150 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
16151 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
16152 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
16153 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
16154 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
16155 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
16156
65f38f15 16157 if (skip)
0bb2d96a 16158 memset (&outrel, 0, sizeof outrel);
afe397ea 16159 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
16160 && !is_opd
16161 && r_type != R_PPC64_TOC)
14acf4dc 16162 {
82e66161
AM
16163 indx = h->elf.dynindx;
16164 BFD_ASSERT (indx != -1);
16165 outrel.r_info = ELF64_R_INFO (indx, r_type);
14acf4dc 16166 }
65f38f15
AM
16167 else
16168 {
41bd81ab
AM
16169 /* This symbol is local, or marked to become local,
16170 or this is an opd section reloc which must point
16171 at a local function. */
65f38f15 16172 outrel.r_addend += relocation;
e86ce104 16173 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 16174 {
3fad3c7c 16175 if (is_opd && h != NULL)
afbe61cf
AM
16176 {
16177 /* Lie about opd entries. This case occurs
16178 when building shared libraries and we
16179 reference a function in another shared
3fad3c7c
AM
16180 lib. The same thing happens for a weak
16181 definition in an application that's
16182 overridden by a strong definition in a
16183 shared lib. (I believe this is a generic
16184 bug in binutils handling of weak syms.)
16185 In these cases we won't use the opd
1e2f5b6e 16186 entry in this lib. */
b34976b6 16187 unresolved_reloc = FALSE;
afbe61cf 16188 }
25f23106
AM
16189 if (!is_opd
16190 && r_type == R_PPC64_ADDR64
16191 && (h != NULL
16192 ? h->elf.type == STT_GNU_IFUNC
16193 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
16194 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
16195 else
16196 {
16197 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 16198
25f23106
AM
16199 /* We need to relocate .opd contents for ld.so.
16200 Prelink also wants simple and consistent rules
16201 for relocs. This make all RELATIVE relocs have
16202 *r_offset equal to r_addend. */
16203 relocate = TRUE;
16204 }
65f38f15
AM
16205 }
16206 else
16207 {
25f23106
AM
16208 if (h != NULL
16209 ? h->elf.type == STT_GNU_IFUNC
16210 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
16211 {
25f53a85 16212 info->callbacks->einfo
695344c0 16213 /* xgettext:c-format */
174d0a74 16214 (_("%H: %s for indirect "
c1c8c1ef 16215 "function `%pT' unsupported\n"),
25f53a85 16216 input_bfd, input_section, rel->r_offset,
25f23106
AM
16217 ppc64_elf_howto_table[r_type]->name,
16218 sym_name);
16219 ret = FALSE;
16220 }
cf35638d 16221 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
16222 ;
16223 else if (sec == NULL || sec->owner == NULL)
16224 {
16225 bfd_set_error (bfd_error_bad_value);
b34976b6 16226 return FALSE;
65f38f15
AM
16227 }
16228 else
16229 {
f26a3287 16230 asection *osec = sec->output_section;
65f38f15 16231
f26a3287
AM
16232 if ((osec->flags & SEC_THREAD_LOCAL) != 0)
16233 {
16234 /* TLS symbol values are relative to the
16235 TLS segment. Dynamic relocations for
16236 local TLS symbols therefore can't be
16237 reduced to a relocation against their
16238 section symbol because it holds the
16239 address of the section, not a value
16240 relative to the TLS segment. We could
16241 change the .tdata dynamic section symbol
16242 to be zero value but STN_UNDEF works
16243 and is used elsewhere, eg. for TPREL64
16244 GOT relocs against local TLS symbols. */
16245 osec = htab->elf.tls_sec;
16246 indx = 0;
16247 }
16248 else
74541ad4 16249 {
74541ad4 16250 indx = elf_section_data (osec)->dynindx;
f26a3287
AM
16251 if (indx == 0)
16252 {
16253 if ((osec->flags & SEC_READONLY) == 0
16254 && htab->elf.data_index_section != NULL)
16255 osec = htab->elf.data_index_section;
16256 else
16257 osec = htab->elf.text_index_section;
16258 indx = elf_section_data (osec)->dynindx;
16259 }
16260 BFD_ASSERT (indx != 0);
74541ad4 16261 }
74541ad4 16262
65f38f15
AM
16263 /* We are turning this relocation into one
16264 against a section symbol, so subtract out
16265 the output section's address but not the
16266 offset of the input section in the output
16267 section. */
16268 outrel.r_addend -= osec->vma;
16269 }
16270
16271 outrel.r_info = ELF64_R_INFO (indx, r_type);
16272 }
16273 }
16274
16275 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
16276 if (h != NULL
16277 ? h->elf.type == STT_GNU_IFUNC
16278 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
82e66161
AM
16279 {
16280 sreloc = htab->elf.irelplt;
16281 if (indx == 0)
16282 htab->local_ifunc_resolver = 1;
16283 else if (is_static_defined (&h->elf))
16284 htab->maybe_local_ifunc_resolver = 1;
16285 }
65f38f15
AM
16286 if (sreloc == NULL)
16287 abort ();
16288
dfbb6ac9
AM
16289 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
16290 >= sreloc->size)
16291 abort ();
947216bf
AM
16292 loc = sreloc->contents;
16293 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
16294 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
16295
e59a1001
AM
16296 if (!warned_dynamic
16297 && !ppc64_glibc_dynamic_reloc (ELF64_R_TYPE (outrel.r_info)))
16298 {
16299 info->callbacks->einfo
16300 /* xgettext:c-format */
16301 (_("%X%P: %pB: %s against %pT "
16302 "is not supported by glibc as a dynamic relocation\n"),
16303 input_bfd,
16304 ppc64_elf_howto_table[ELF64_R_TYPE (outrel.r_info)]->name,
16305 sym_name);
16306 warned_dynamic = TRUE;
16307 }
16308
65f38f15
AM
16309 /* If this reloc is against an external symbol, it will
16310 be computed at runtime, so there's no need to do
81407a69
AM
16311 anything now. However, for the sake of prelink ensure
16312 that the section contents are a known value. */
2cdcc330 16313 if (!relocate)
81407a69
AM
16314 {
16315 unresolved_reloc = FALSE;
16316 /* The value chosen here is quite arbitrary as ld.so
16317 ignores section contents except for the special
16318 case of .opd where the contents might be accessed
16319 before relocation. Choose zero, as that won't
16320 cause reloc overflow. */
16321 relocation = 0;
16322 addend = 0;
16323 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
16324 to improve backward compatibility with older
16325 versions of ld. */
16326 if (r_type == R_PPC64_ADDR64)
16327 addend = outrel.r_addend;
16328 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 16329 else if (ppc64_elf_howto_table[r_type]->pc_relative)
f0158f44 16330 addend = outrel.r_offset;
81407a69 16331 }
65f38f15 16332 }
5bd4f169
AM
16333 break;
16334
65f38f15
AM
16335 case R_PPC64_COPY:
16336 case R_PPC64_GLOB_DAT:
16337 case R_PPC64_JMP_SLOT:
25f23106 16338 case R_PPC64_JMP_IREL:
65f38f15
AM
16339 case R_PPC64_RELATIVE:
16340 /* We shouldn't ever see these dynamic relocs in relocatable
16341 files. */
ae9a127f 16342 /* Fall through. */
65f38f15
AM
16343
16344 case R_PPC64_PLTGOT16:
16345 case R_PPC64_PLTGOT16_DS:
16346 case R_PPC64_PLTGOT16_HA:
16347 case R_PPC64_PLTGOT16_HI:
16348 case R_PPC64_PLTGOT16_LO:
16349 case R_PPC64_PLTGOT16_LO_DS:
16350 case R_PPC64_PLTREL32:
16351 case R_PPC64_PLTREL64:
16352 /* These ones haven't been implemented yet. */
16353
25f53a85 16354 info->callbacks->einfo
695344c0 16355 /* xgettext:c-format */
c1c8c1ef 16356 (_("%P: %pB: %s is not supported for `%pT'\n"),
d003868e 16357 input_bfd,
4ce794b7 16358 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
16359
16360 bfd_set_error (bfd_error_invalid_operation);
b34976b6 16361 ret = FALSE;
c316a17c 16362 goto copy_reloc;
65f38f15 16363 }
5bd4f169 16364
67f0cbdb
AM
16365 /* Multi-instruction sequences that access the TOC can be
16366 optimized, eg. addis ra,r2,0; addi rb,ra,x;
07d6d2b8 16367 to nop; addi rb,r2,x; */
67f0cbdb
AM
16368 switch (r_type)
16369 {
16370 default:
16371 break;
16372
16373 case R_PPC64_GOT_TLSLD16_HI:
16374 case R_PPC64_GOT_TLSGD16_HI:
16375 case R_PPC64_GOT_TPREL16_HI:
16376 case R_PPC64_GOT_DTPREL16_HI:
16377 case R_PPC64_GOT16_HI:
16378 case R_PPC64_TOC16_HI:
16379 /* These relocs would only be useful if building up an
16380 offset to later add to r2, perhaps in an indexed
16381 addressing mode instruction. Don't try to optimize.
16382 Unfortunately, the possibility of someone building up an
16383 offset like this or even with the HA relocs, means that
16384 we need to check the high insn when optimizing the low
16385 insn. */
16386 break;
16387
5663e321
AM
16388 case R_PPC64_PLTCALL_NOTOC:
16389 if (!unresolved_reloc)
16390 htab->notoc_plt = 1;
16391 /* Fall through. */
23cedd1d
AM
16392 case R_PPC64_PLTCALL:
16393 if (unresolved_reloc)
16394 {
16395 /* No plt entry. Make this into a direct call. */
16396 bfd_byte *p = contents + rel->r_offset;
16397 insn = bfd_get_32 (input_bfd, p);
16398 insn &= 1;
16399 bfd_put_32 (input_bfd, B_DOT | insn, p);
5663e321
AM
16400 if (r_type == R_PPC64_PLTCALL)
16401 bfd_put_32 (input_bfd, NOP, p + 4);
23cedd1d
AM
16402 unresolved_reloc = save_unresolved_reloc;
16403 r_type = R_PPC64_REL24;
16404 }
16405 break;
16406
5663e321 16407 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d
AM
16408 case R_PPC64_PLTSEQ:
16409 if (unresolved_reloc)
16410 {
16411 unresolved_reloc = FALSE;
16412 goto nop_it;
16413 }
16414 break;
16415
5663e321
AM
16416 case R_PPC64_PLT_PCREL34_NOTOC:
16417 if (!unresolved_reloc)
16418 htab->notoc_plt = 1;
16419 /* Fall through. */
16420 case R_PPC64_PLT_PCREL34:
16421 if (unresolved_reloc)
16422 {
16423 bfd_byte *p = contents + rel->r_offset;
16424 bfd_put_32 (input_bfd, PNOP >> 32, p);
16425 bfd_put_32 (input_bfd, PNOP, p + 4);
16426 unresolved_reloc = FALSE;
16427 goto copy_reloc;
16428 }
16429 break;
16430
23cedd1d
AM
16431 case R_PPC64_PLT16_HA:
16432 if (unresolved_reloc)
16433 {
16434 unresolved_reloc = FALSE;
16435 goto nop_it;
16436 }
16437 /* Fall through. */
67f0cbdb
AM
16438 case R_PPC64_GOT_TLSLD16_HA:
16439 case R_PPC64_GOT_TLSGD16_HA:
16440 case R_PPC64_GOT_TPREL16_HA:
16441 case R_PPC64_GOT_DTPREL16_HA:
16442 case R_PPC64_GOT16_HA:
16443 case R_PPC64_TOC16_HA:
98528052 16444 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16445 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052 16446 {
23cedd1d
AM
16447 bfd_byte *p;
16448 nop_it:
16449 p = contents + (rel->r_offset & ~3);
98528052 16450 bfd_put_32 (input_bfd, NOP, p);
d830549d 16451 goto copy_reloc;
98528052 16452 }
67f0cbdb
AM
16453 break;
16454
23cedd1d
AM
16455 case R_PPC64_PLT16_LO:
16456 case R_PPC64_PLT16_LO_DS:
16457 if (unresolved_reloc)
16458 {
16459 unresolved_reloc = FALSE;
16460 goto nop_it;
16461 }
16462 /* Fall through. */
67f0cbdb
AM
16463 case R_PPC64_GOT_TLSLD16_LO:
16464 case R_PPC64_GOT_TLSGD16_LO:
16465 case R_PPC64_GOT_TPREL16_LO_DS:
16466 case R_PPC64_GOT_DTPREL16_LO_DS:
16467 case R_PPC64_GOT16_LO:
16468 case R_PPC64_GOT16_LO_DS:
16469 case R_PPC64_TOC16_LO:
16470 case R_PPC64_TOC16_LO_DS:
98528052 16471 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16472 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
16473 {
16474 bfd_byte *p = contents + (rel->r_offset & ~3);
16475 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16476 if ((insn & (0x3fu << 26)) == 12u << 26 /* addic */)
560c8763
AM
16477 {
16478 /* Transform addic to addi when we change reg. */
2365f8d7 16479 insn &= ~((0x3fu << 26) | (0x1f << 16));
560c8763
AM
16480 insn |= (14u << 26) | (2 << 16);
16481 }
16482 else
67f0cbdb 16483 {
98528052
AM
16484 insn &= ~(0x1f << 16);
16485 insn |= 2 << 16;
67f0cbdb 16486 }
560c8763 16487 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
16488 }
16489 break;
9a23f96e
AM
16490
16491 case R_PPC64_TPREL16_HA:
16492 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16493 {
16494 bfd_byte *p = contents + (rel->r_offset & ~3);
93b9bf16
AM
16495 bfd_put_32 (input_bfd, NOP, p);
16496 goto copy_reloc;
9a23f96e
AM
16497 }
16498 break;
16499
16500 case R_PPC64_TPREL16_LO:
16501 case R_PPC64_TPREL16_LO_DS:
16502 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16503 {
16504 bfd_byte *p = contents + (rel->r_offset & ~3);
16505 insn = bfd_get_32 (input_bfd, p);
16506 insn &= ~(0x1f << 16);
16507 insn |= 13 << 16;
16508 bfd_put_32 (input_bfd, insn, p);
16509 }
16510 break;
67f0cbdb
AM
16511 }
16512
65f38f15
AM
16513 /* Do any further special processing. */
16514 switch (r_type)
16515 {
16516 default:
16517 break;
16518
25f23106 16519 case R_PPC64_REL16_HA:
4a969973
AM
16520 case R_PPC64_REL16_HIGHA:
16521 case R_PPC64_REL16_HIGHERA:
16522 case R_PPC64_REL16_HIGHESTA:
a680de9a 16523 case R_PPC64_REL16DX_HA:
f9c6b907
AM
16524 case R_PPC64_ADDR16_HA:
16525 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16526 case R_PPC64_ADDR16_HIGHERA:
16527 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
16528 case R_PPC64_TOC16_HA:
16529 case R_PPC64_SECTOFF_HA:
411e1bfb 16530 case R_PPC64_TPREL16_HA:
f9c6b907 16531 case R_PPC64_TPREL16_HIGHA:
411e1bfb 16532 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 16533 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
16534 case R_PPC64_DTPREL16_HA:
16535 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 16536 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 16537 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
16538 /* It's just possible that this symbol is a weak symbol
16539 that's not actually defined anywhere. In that case,
16540 'sec' would be NULL, and we should leave the symbol
16541 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
16542 if (sec == NULL)
16543 break;
1a0670f3 16544 /* Fall through. */
5c5f6e17
AM
16545
16546 case R_PPC64_GOT16_HA:
16547 case R_PPC64_PLTGOT16_HA:
16548 case R_PPC64_PLT16_HA:
16549 case R_PPC64_GOT_TLSGD16_HA:
16550 case R_PPC64_GOT_TLSLD16_HA:
16551 case R_PPC64_GOT_TPREL16_HA:
16552 case R_PPC64_GOT_DTPREL16_HA:
16553 /* Add 0x10000 if sign bit in 0:15 is set.
16554 Bits 0:15 are not used. */
16555 addend += 0x8000;
65f38f15
AM
16556 break;
16557
5663e321
AM
16558 case R_PPC64_D34_HA30:
16559 case R_PPC64_ADDR16_HIGHERA34:
16560 case R_PPC64_ADDR16_HIGHESTA34:
16561 case R_PPC64_REL16_HIGHERA34:
16562 case R_PPC64_REL16_HIGHESTA34:
16563 if (sec != NULL)
16564 addend += 1ULL << 33;
16565 break;
16566
65f38f15
AM
16567 case R_PPC64_ADDR16_DS:
16568 case R_PPC64_ADDR16_LO_DS:
16569 case R_PPC64_GOT16_DS:
16570 case R_PPC64_GOT16_LO_DS:
16571 case R_PPC64_PLT16_LO_DS:
16572 case R_PPC64_SECTOFF_DS:
16573 case R_PPC64_SECTOFF_LO_DS:
16574 case R_PPC64_TOC16_DS:
16575 case R_PPC64_TOC16_LO_DS:
16576 case R_PPC64_PLTGOT16_DS:
16577 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
16578 case R_PPC64_GOT_TPREL16_DS:
16579 case R_PPC64_GOT_TPREL16_LO_DS:
16580 case R_PPC64_GOT_DTPREL16_DS:
16581 case R_PPC64_GOT_DTPREL16_LO_DS:
16582 case R_PPC64_TPREL16_DS:
16583 case R_PPC64_TPREL16_LO_DS:
16584 case R_PPC64_DTPREL16_DS:
16585 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
16586 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
16587 mask = 3;
a680de9a
PB
16588 /* If this reloc is against an lq, lxv, or stxv insn, then
16589 the value must be a multiple of 16. This is somewhat of
16590 a hack, but the "correct" way to do this by defining _DQ
16591 forms of all the _DS relocs bloats all reloc switches in
16592 this file. It doesn't make much sense to use these
16593 relocs in data, so testing the insn should be safe. */
2365f8d7
AM
16594 if ((insn & (0x3fu << 26)) == (56u << 26)
16595 || ((insn & (0x3fu << 26)) == (61u << 26) && (insn & 3) == 1))
adadcc0c 16596 mask = 15;
a680de9a
PB
16597 relocation += addend;
16598 addend = insn & (mask ^ 3);
16599 if ((relocation & mask) != 0)
65f38f15 16600 {
a680de9a 16601 relocation ^= relocation & mask;
25f53a85 16602 info->callbacks->einfo
695344c0 16603 /* xgettext:c-format */
174d0a74 16604 (_("%H: error: %s not a multiple of %u\n"),
25f53a85 16605 input_bfd, input_section, rel->r_offset,
d830549d 16606 ppc64_elf_howto_table[r_type]->name,
adadcc0c 16607 mask + 1);
65f38f15 16608 bfd_set_error (bfd_error_bad_value);
b34976b6 16609 ret = FALSE;
c316a17c 16610 goto copy_reloc;
65f38f15
AM
16611 }
16612 break;
5bd4f169
AM
16613 }
16614
239e1f3a
AM
16615 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
16616 because such sections are not SEC_ALLOC and thus ld.so will
16617 not process them. */
d830549d 16618 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15 16619 if (unresolved_reloc
239e1f3a 16620 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
16621 && h->elf.def_dynamic)
16622 && _bfd_elf_section_offset (output_bfd, info, input_section,
16623 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 16624 {
25f53a85 16625 info->callbacks->einfo
695344c0 16626 /* xgettext:c-format */
c1c8c1ef 16627 (_("%H: unresolvable %s against `%pT'\n"),
25f53a85 16628 input_bfd, input_section, rel->r_offset,
b80eed39 16629 howto->name,
039b3fef 16630 h->elf.root.root.string);
b34976b6 16631 ret = FALSE;
9c07fe7c 16632 }
5bd4f169 16633
b80eed39
AM
16634 /* 16-bit fields in insns mostly have signed values, but a
16635 few insns have 16-bit unsigned values. Really, we should
16636 have different reloc types. */
16637 if (howto->complain_on_overflow != complain_overflow_dont
16638 && howto->dst_mask == 0xffff
16639 && (input_section->flags & SEC_CODE) != 0)
16640 {
16641 enum complain_overflow complain = complain_overflow_signed;
16642
16643 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 16644 if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */)
a47622ac
AM
16645 complain = complain_overflow_bitfield;
16646 else if (howto->rightshift == 0
2365f8d7
AM
16647 ? ((insn & (0x3fu << 26)) == 28u << 26 /* andi */
16648 || (insn & (0x3fu << 26)) == 24u << 26 /* ori */
16649 || (insn & (0x3fu << 26)) == 26u << 26 /* xori */)
16650 : ((insn & (0x3fu << 26)) == 29u << 26 /* andis */
16651 || (insn & (0x3fu << 26)) == 25u << 26 /* oris */
16652 || (insn & (0x3fu << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
16653 complain = complain_overflow_unsigned;
16654 if (howto->complain_on_overflow != complain)
16655 {
16656 alt_howto = *howto;
16657 alt_howto.complain_on_overflow = complain;
16658 howto = &alt_howto;
16659 }
16660 }
16661
5663e321 16662 switch (r_type)
a680de9a 16663 {
5663e321
AM
16664 /* Split field relocs aren't handled by _bfd_final_link_relocate. */
16665 case R_PPC64_D34:
16666 case R_PPC64_D34_LO:
16667 case R_PPC64_D34_HI30:
16668 case R_PPC64_D34_HA30:
16669 case R_PPC64_PCREL34:
16670 case R_PPC64_GOT_PCREL34:
c213164a
AM
16671 case R_PPC64_TPREL34:
16672 case R_PPC64_DTPREL34:
16673 case R_PPC64_GOT_TLSGD34:
16674 case R_PPC64_GOT_TLSLD34:
16675 case R_PPC64_GOT_TPREL34:
16676 case R_PPC64_GOT_DTPREL34:
5663e321
AM
16677 case R_PPC64_PLT_PCREL34:
16678 case R_PPC64_PLT_PCREL34_NOTOC:
16679 case R_PPC64_D28:
16680 case R_PPC64_PCREL28:
16681 if (rel->r_offset + 8 > input_section->size)
16682 r = bfd_reloc_outofrange;
16683 else
16684 {
5663e321
AM
16685 relocation += addend;
16686 if (howto->pc_relative)
16687 relocation -= (rel->r_offset
16688 + input_section->output_offset
16689 + input_section->output_section->vma);
16690 relocation >>= howto->rightshift;
16691
16692 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16693 pinsn <<= 32;
16694 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
16695
16696 pinsn &= ~howto->dst_mask;
16697 pinsn |= (((relocation << 16) | (relocation & 0xffff))
16698 & howto->dst_mask);
16699 bfd_put_32 (input_bfd, pinsn >> 32, contents + rel->r_offset);
16700 bfd_put_32 (input_bfd, pinsn, contents + rel->r_offset + 4);
16701 r = bfd_reloc_ok;
16702 if (howto->complain_on_overflow == complain_overflow_signed
16703 && (relocation + (1ULL << (howto->bitsize - 1))
16704 >= 1ULL << howto->bitsize))
16705 r = bfd_reloc_overflow;
16706 }
16707 break;
16708
16709 case R_PPC64_REL16DX_HA:
a680de9a
PB
16710 if (rel->r_offset + 4 > input_section->size)
16711 r = bfd_reloc_outofrange;
16712 else
16713 {
16714 relocation += addend;
16715 relocation -= (rel->r_offset
16716 + input_section->output_offset
16717 + input_section->output_section->vma);
3de43e7b 16718 relocation = (bfd_signed_vma) relocation >> 16;
a680de9a
PB
16719 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16720 insn &= ~0x1fffc1;
3de43e7b 16721 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
a680de9a
PB
16722 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
16723 r = bfd_reloc_ok;
3de43e7b 16724 if (relocation + 0x8000 > 0xffff)
a680de9a
PB
16725 r = bfd_reloc_overflow;
16726 }
5663e321
AM
16727 break;
16728
16729 default:
16730 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
16731 contents, rel->r_offset,
16732 relocation, addend);
a680de9a 16733 }
5bd4f169 16734
ef60b7ff 16735 if (r != bfd_reloc_ok)
5bd4f169 16736 {
bc30df16 16737 char *more_info = NULL;
b80eed39 16738 const char *reloc_name = howto->name;
bc30df16
AM
16739
16740 if (reloc_dest != DEST_NORMAL)
16741 {
16742 more_info = bfd_malloc (strlen (reloc_name) + 8);
16743 if (more_info != NULL)
16744 {
16745 strcpy (more_info, reloc_name);
16746 strcat (more_info, (reloc_dest == DEST_OPD
16747 ? " (OPD)" : " (stub)"));
16748 reloc_name = more_info;
16749 }
16750 }
16751
cd27b276 16752 if (r == bfd_reloc_overflow)
5bd4f169 16753 {
8131c122
AM
16754 /* On code like "if (foo) foo();" don't report overflow
16755 on a branch to zero when foo is undefined. */
16756 if (!warned
16757 && (reloc_dest == DEST_STUB
16758 || !(h != NULL
16759 && (h->elf.root.type == bfd_link_hash_undefweak
16760 || h->elf.root.type == bfd_link_hash_undefined)
16761 && is_branch_reloc (r_type))))
1a72702b
AM
16762 info->callbacks->reloc_overflow (info, &h->elf.root,
16763 sym_name, reloc_name,
16764 orig_rel.r_addend,
16765 input_bfd, input_section,
16766 rel->r_offset);
ef60b7ff
AM
16767 }
16768 else
16769 {
25f53a85 16770 info->callbacks->einfo
695344c0 16771 /* xgettext:c-format */
c1c8c1ef 16772 (_("%H: %s against `%pT': error %d\n"),
25f53a85 16773 input_bfd, input_section, rel->r_offset,
bc30df16 16774 reloc_name, sym_name, (int) r);
b34976b6 16775 ret = FALSE;
ef60b7ff 16776 }
bc30df16
AM
16777 if (more_info != NULL)
16778 free (more_info);
5bd4f169 16779 }
c316a17c
AM
16780 copy_reloc:
16781 if (wrel != rel)
16782 *wrel = *rel;
16783 }
16784
16785 if (wrel != rel)
16786 {
16787 Elf_Internal_Shdr *rel_hdr;
16788 size_t deleted = rel - wrel;
16789
16790 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
16791 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
16792 if (rel_hdr->sh_size == 0)
16793 {
16794 /* It is too late to remove an empty reloc section. Leave
16795 one NONE reloc.
16796 ??? What is wrong with an empty section??? */
16797 rel_hdr->sh_size = rel_hdr->sh_entsize;
16798 deleted -= 1;
16799 }
16800 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
16801 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
16802 input_section->reloc_count -= deleted;
5bd4f169
AM
16803 }
16804
645ea6a9
AM
16805 /* If we're emitting relocations, then shortly after this function
16806 returns, reloc offsets and addends for this section will be
16807 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
16808 file rather than the input. Save a copy of the relocs for
16809 opd_entry_value. */
0e1862bb 16810 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
8860955f
AM
16811 {
16812 bfd_size_type amt;
16813 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
16814 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
16815 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
16816 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
16817 if (rel == NULL)
16818 return FALSE;
16819 memcpy (rel, relocs, amt);
16820 }
5bd4f169
AM
16821 return ret;
16822}
16823
754021d0
AM
16824/* Adjust the value of any local symbols in opd sections. */
16825
6e0b88f1 16826static int
754021d0
AM
16827ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
16828 const char *name ATTRIBUTE_UNUSED,
16829 Elf_Internal_Sym *elfsym,
16830 asection *input_sec,
16831 struct elf_link_hash_entry *h)
16832{
74f0fb50
AM
16833 struct _opd_sec_data *opd;
16834 long adjust;
754021d0
AM
16835 bfd_vma value;
16836
4025353c 16837 if (h != NULL)
6e0b88f1 16838 return 1;
4025353c 16839
74f0fb50
AM
16840 opd = get_opd_info (input_sec);
16841 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 16842 return 1;
754021d0
AM
16843
16844 value = elfsym->st_value - input_sec->output_offset;
0e1862bb 16845 if (!bfd_link_relocatable (info))
754021d0
AM
16846 value -= input_sec->output_section->vma;
16847
51aecdc5 16848 adjust = opd->adjust[OPD_NDX (value)];
4025353c 16849 if (adjust == -1)
6e0b88f1
AM
16850 return 2;
16851
16852 elfsym->st_value += adjust;
16853 return 1;
754021d0
AM
16854}
16855
5bd4f169
AM
16856/* Finish up dynamic symbol handling. We set the contents of various
16857 dynamic sections here. */
16858
b34976b6 16859static bfd_boolean
4ce794b7
AM
16860ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
16861 struct bfd_link_info *info,
16862 struct elf_link_hash_entry *h,
4aef7643 16863 Elf_Internal_Sym *sym)
5bd4f169 16864{
65f38f15 16865 struct ppc_link_hash_table *htab;
8387904d 16866 struct plt_entry *ent;
5bd4f169 16867
65f38f15 16868 htab = ppc_hash_table (info);
4dfe6ac6
NC
16869 if (htab == NULL)
16870 return FALSE;
5bd4f169 16871
49c09209
AM
16872 if (!htab->opd_abi && !h->def_regular)
16873 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
16874 if (ent->plt.offset != (bfd_vma) -1)
16875 {
16876 /* Mark the symbol as undefined, rather than as
16877 defined in glink. Leave the value if there were
16878 any relocations where pointer equality matters
16879 (this is a clue for the dynamic linker, to make
16880 function pointer comparisons work between an
16881 application and shared library), otherwise set it
16882 to zero. */
16883 sym->st_shndx = SHN_UNDEF;
16884 if (!h->pointer_equality_needed)
16885 sym->st_value = 0;
16886 else if (!h->ref_regular_nonweak)
16887 {
16888 /* This breaks function pointer comparisons, but
16889 that is better than breaking tests for a NULL
16890 function pointer. */
16891 sym->st_value = 0;
16892 }
16893 break;
16894 }
5bd4f169 16895
1bdd8fac
AM
16896 if (h->needs_copy
16897 && (h->root.type == bfd_link_hash_defined
16898 || h->root.type == bfd_link_hash_defweak)
16899 && (h->root.u.def.section == htab->elf.sdynbss
16900 || h->root.u.def.section == htab->elf.sdynrelro))
5bd4f169 16901 {
65f38f15 16902 /* This symbol needs a copy reloc. Set it up. */
49c09209 16903 Elf_Internal_Rela rela;
5474d94f 16904 asection *srel;
49c09209 16905 bfd_byte *loc;
5bd4f169 16906
1bdd8fac 16907 if (h->dynindx == -1)
65f38f15 16908 abort ();
5bd4f169
AM
16909
16910 rela.r_offset = (h->root.u.def.value
16911 + h->root.u.def.section->output_section->vma
16912 + h->root.u.def.section->output_offset);
16913 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
16914 rela.r_addend = 0;
afbf7e8e 16915 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
16916 srel = htab->elf.sreldynrelro;
16917 else
16918 srel = htab->elf.srelbss;
16919 loc = srel->contents;
16920 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 16921 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
16922 }
16923
b34976b6 16924 return TRUE;
5bd4f169
AM
16925}
16926
65f38f15
AM
16927/* Used to decide how to sort relocs in an optimal manner for the
16928 dynamic linker, before writing them out. */
16929
16930static enum elf_reloc_type_class
7e612e98
AM
16931ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
16932 const asection *rel_sec,
16933 const Elf_Internal_Rela *rela)
65f38f15 16934{
04c9666a 16935 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
16936 struct ppc_link_hash_table *htab = ppc_hash_table (info);
16937
33e44f2e 16938 if (rel_sec == htab->elf.irelplt)
7e612e98 16939 return reloc_class_ifunc;
a33d1f77 16940
4ce794b7 16941 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 16942 switch (r_type)
65f38f15
AM
16943 {
16944 case R_PPC64_RELATIVE:
16945 return reloc_class_relative;
16946 case R_PPC64_JMP_SLOT:
16947 return reloc_class_plt;
16948 case R_PPC64_COPY:
16949 return reloc_class_copy;
16950 default:
16951 return reloc_class_normal;
16952 }
16953}
16954
5bd4f169
AM
16955/* Finish up the dynamic sections. */
16956
b34976b6 16957static bfd_boolean
4ce794b7
AM
16958ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
16959 struct bfd_link_info *info)
5bd4f169 16960{
65f38f15
AM
16961 struct ppc_link_hash_table *htab;
16962 bfd *dynobj;
5bd4f169 16963 asection *sdyn;
5bd4f169 16964
65f38f15 16965 htab = ppc_hash_table (info);
4dfe6ac6
NC
16966 if (htab == NULL)
16967 return FALSE;
16968
65f38f15 16969 dynobj = htab->elf.dynobj;
3d4d4302 16970 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 16971
65f38f15 16972 if (htab->elf.dynamic_sections_created)
5bd4f169 16973 {
5bd4f169
AM
16974 Elf64_External_Dyn *dyncon, *dynconend;
16975
33e44f2e 16976 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 16977 abort ();
5bd4f169
AM
16978
16979 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 16980 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
16981 for (; dyncon < dynconend; dyncon++)
16982 {
16983 Elf_Internal_Dyn dyn;
19397422 16984 asection *s;
5bd4f169
AM
16985
16986 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
16987
16988 switch (dyn.d_tag)
16989 {
65f38f15
AM
16990 default:
16991 continue;
5bd4f169 16992
5d1634d7 16993 case DT_PPC64_GLINK:
4ce794b7 16994 s = htab->glink;
6348e046 16995 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
16996 /* We stupidly defined DT_PPC64_GLINK to be the start
16997 of glink rather than the first entry point, which is
16998 what ld.so needs, and now have a bigger stub to
16999 support automatic multiple TOCs. */
9e390558 17000 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
5d1634d7
AM
17001 break;
17002
19397422
AM
17003 case DT_PPC64_OPD:
17004 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
17005 if (s == NULL)
17006 continue;
17007 dyn.d_un.d_ptr = s->vma;
19397422
AM
17008 break;
17009
e8910a83 17010 case DT_PPC64_OPT:
5663e321
AM
17011 if ((htab->do_multi_toc && htab->multi_toc_needed)
17012 || htab->notoc_plt)
e8910a83 17013 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
f378ab09
AM
17014 if (htab->has_plt_localentry0)
17015 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
e8910a83
AM
17016 break;
17017
19397422
AM
17018 case DT_PPC64_OPDSZ:
17019 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
17020 if (s == NULL)
17021 continue;
eea6121a 17022 dyn.d_un.d_val = s->size;
19397422
AM
17023 break;
17024
65f38f15 17025 case DT_PLTGOT:
33e44f2e 17026 s = htab->elf.splt;
6348e046 17027 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
17028 break;
17029
17030 case DT_JMPREL:
33e44f2e 17031 s = htab->elf.srelplt;
6348e046 17032 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 17033 break;
5bd4f169 17034
65f38f15 17035 case DT_PLTRELSZ:
33e44f2e 17036 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7 17037 break;
82e66161
AM
17038
17039 case DT_TEXTREL:
17040 if (htab->local_ifunc_resolver)
17041 info->callbacks->einfo
17042 (_("%X%P: text relocations and GNU indirect "
17043 "functions will result in a segfault at runtime\n"));
17044 else if (htab->maybe_local_ifunc_resolver)
17045 info->callbacks->einfo
17046 (_("%P: warning: text relocations and GNU indirect "
17047 "functions may result in a segfault at runtime\n"));
17048 continue;
5bd4f169 17049 }
5bd4f169 17050
65f38f15 17051 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 17052 }
5bd4f169
AM
17053 }
17054
6528b6eb
AM
17055 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
17056 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17057 {
17058 /* Fill in the first entry in the global offset table.
17059 We use it to hold the link-time TOCbase. */
17060 bfd_put_64 (output_bfd,
60ee0d4a 17061 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 17062 htab->elf.sgot->contents);
5d1634d7
AM
17063
17064 /* Set .got entry size. */
2cdcc330
AM
17065 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
17066 = 8;
5d1634d7
AM
17067 }
17068
6528b6eb
AM
17069 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
17070 && htab->elf.splt->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17071 {
17072 /* Set .plt entry size. */
33e44f2e 17073 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 17074 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
17075 }
17076
84f5d08e
AM
17077 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
17078 brlt ourselves if emitrelocations. */
17079 if (htab->brlt != NULL
17080 && htab->brlt->reloc_count != 0
17081 && !_bfd_elf_link_output_relocs (output_bfd,
17082 htab->brlt,
d4730f92 17083 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
17084 elf_section_data (htab->brlt)->relocs,
17085 NULL))
17086 return FALSE;
17087
176a0d42
AM
17088 if (htab->glink != NULL
17089 && htab->glink->reloc_count != 0
17090 && !_bfd_elf_link_output_relocs (output_bfd,
17091 htab->glink,
d4730f92 17092 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
17093 elf_section_data (htab->glink)->relocs,
17094 NULL))
17095 return FALSE;
17096
da44f4e5 17097
df136d64
AM
17098 if (htab->glink_eh_frame != NULL
17099 && htab->glink_eh_frame->size != 0
17100 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
17101 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
17102 htab->glink_eh_frame,
17103 htab->glink_eh_frame->contents))
17104 return FALSE;
58d180e8 17105
e717da7e 17106 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
17107 since we didn't add them to DYNOBJ. We know dynobj is the first
17108 bfd. */
c72f2fb2 17109 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
17110 {
17111 asection *s;
7b53ace3 17112
0c8d6e5c 17113 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
17114 continue;
17115
e717da7e
AM
17116 s = ppc64_elf_tdata (dynobj)->got;
17117 if (s != NULL
eea6121a 17118 && s->size != 0
e717da7e
AM
17119 && s->output_section != bfd_abs_section_ptr
17120 && !bfd_set_section_contents (output_bfd, s->output_section,
17121 s->contents, s->output_offset,
eea6121a 17122 s->size))
e717da7e
AM
17123 return FALSE;
17124 s = ppc64_elf_tdata (dynobj)->relgot;
17125 if (s != NULL
eea6121a 17126 && s->size != 0
e717da7e
AM
17127 && s->output_section != bfd_abs_section_ptr
17128 && !bfd_set_section_contents (output_bfd, s->output_section,
17129 s->contents, s->output_offset,
eea6121a 17130 s->size))
e717da7e
AM
17131 return FALSE;
17132 }
f6c52c13 17133
b34976b6 17134 return TRUE;
5bd4f169
AM
17135}
17136
5bd4f169 17137#include "elf64-target.h"
7b8e7dad
AM
17138
17139/* FreeBSD support */
17140
17141#undef TARGET_LITTLE_SYM
17142#undef TARGET_LITTLE_NAME
17143
17144#undef TARGET_BIG_SYM
6d00b590 17145#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
17146#undef TARGET_BIG_NAME
17147#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
17148
17149#undef ELF_OSABI
17150#define ELF_OSABI ELFOSABI_FREEBSD
17151
17152#undef elf64_bed
17153#define elf64_bed elf64_powerpc_fbsd_bed
17154
17155#include "elf64-target.h"