PowerPC64 __tls_get_addr_desc
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
b3adc24a 2 Copyright (C) 1999-2020 Free Software Foundation, Inc.
5bd4f169
AM
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
32ca9640 5 Largely rewritten by Alan Modra.
5bd4f169 6
ae9a127f 7 This file is part of BFD, the Binary File Descriptor library.
5bd4f169 8
ae9a127f
NC
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
cd123cb7 11 the Free Software Foundation; either version 3 of the License, or
ae9a127f 12 (at your option) any later version.
5bd4f169 13
ae9a127f
NC
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
5bd4f169 18
4ce794b7
AM
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
3e110533 21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
5bd4f169 22
cd123cb7 23
4ce794b7
AM
24/* The 64-bit PowerPC ELF ABI may be found at
25 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
5bd4f169 27
3db64b00 28#include "sysdep.h"
183e98be 29#include <stdarg.h>
5bd4f169 30#include "bfd.h"
5bd4f169
AM
31#include "bfdlink.h"
32#include "libbfd.h"
33#include "elf-bfd.h"
04c9666a 34#include "elf/ppc64.h"
5d1634d7 35#include "elf64-ppc.h"
58d180e8 36#include "dwarf2.h"
5bd4f169 37
bb294208
AM
38/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */
39#define OCTETS_PER_BYTE(ABFD, SEC) 1
40
805fc799 41static bfd_reloc_status_type ppc64_elf_ha_reloc
4ce794b7 42 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
43static bfd_reloc_status_type ppc64_elf_branch_reloc
44 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 45static bfd_reloc_status_type ppc64_elf_brtaken_reloc
4ce794b7 46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 47static bfd_reloc_status_type ppc64_elf_sectoff_reloc
4ce794b7 48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 49static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
4ce794b7 50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 51static bfd_reloc_status_type ppc64_elf_toc_reloc
4ce794b7 52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 53static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
4ce794b7 54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 55static bfd_reloc_status_type ppc64_elf_toc64_reloc
4ce794b7 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
5663e321
AM
57static bfd_reloc_status_type ppc64_elf_prefix_reloc
58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 59static bfd_reloc_status_type ppc64_elf_unhandled_reloc
4ce794b7 60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016 61static bfd_vma opd_entry_value
aef36ac1 62 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
5bd4f169 63
6d00b590 64#define TARGET_LITTLE_SYM powerpc_elf64_le_vec
ad8e1ba5 65#define TARGET_LITTLE_NAME "elf64-powerpcle"
6d00b590 66#define TARGET_BIG_SYM powerpc_elf64_vec
ad8e1ba5
AM
67#define TARGET_BIG_NAME "elf64-powerpc"
68#define ELF_ARCH bfd_arch_powerpc
ae95ffa6 69#define ELF_TARGET_ID PPC64_ELF_DATA
ad8e1ba5
AM
70#define ELF_MACHINE_CODE EM_PPC64
71#define ELF_MAXPAGESIZE 0x10000
702d1671
AM
72#define ELF_COMMONPAGESIZE 0x1000
73#define ELF_RELROPAGESIZE ELF_MAXPAGESIZE
ad8e1ba5
AM
74#define elf_info_to_howto ppc64_elf_info_to_howto
75
76#define elf_backend_want_got_sym 0
77#define elf_backend_want_plt_sym 0
78#define elf_backend_plt_alignment 3
79#define elf_backend_plt_not_loaded 1
ad8e1ba5 80#define elf_backend_got_header_size 8
5474d94f 81#define elf_backend_want_dynrelro 1
ad8e1ba5
AM
82#define elf_backend_can_gc_sections 1
83#define elf_backend_can_refcount 1
84#define elf_backend_rela_normal 1
64f52338 85#define elf_backend_dtrel_excludes_plt 1
6bfdb61b 86#define elf_backend_default_execstack 0
ad8e1ba5 87
e717da7e 88#define bfd_elf64_mkobject ppc64_elf_mkobject
ad8e1ba5 89#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
aa374f67 90#define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
ee67d69a
AM
91#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
92#define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
ad8e1ba5
AM
93#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
94#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
90e3cdf2 95#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
aa374f67 96#define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
8c5b4e52 97#define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
ad8e1ba5
AM
98
99#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
100#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
101#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
183e98be 102#define elf_backend_write_core_note ppc64_elf_write_core_note
9d19e4fd 103#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
ad8e1ba5 104#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 105#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
f6c7c3e8 106#define elf_backend_check_directives ppc64_elf_before_check_relocs
e5034e59 107#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
8387904d 108#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5 109#define elf_backend_check_relocs ppc64_elf_check_relocs
c0e331c7 110#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
74f0fb50 111#define elf_backend_gc_keep ppc64_elf_gc_keep
64d03ab5 112#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
ad8e1ba5 113#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
ad8e1ba5
AM
114#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
115#define elf_backend_hide_symbol ppc64_elf_hide_symbol
9f296da3 116#define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
ad8e1ba5
AM
117#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
118#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
a345bc8d 119#define elf_backend_hash_symbol ppc64_elf_hash_symbol
74541ad4 120#define elf_backend_init_index_section _bfd_elf_init_2_index_sections
60124e18 121#define elf_backend_action_discarded ppc64_elf_action_discarded
ad8e1ba5
AM
122#define elf_backend_relocate_section ppc64_elf_relocate_section
123#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
124#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
125#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 126#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
29ef7005 127#define elf_backend_special_sections ppc64_elf_special_sections
6911b7dc 128#define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
8c5b4e52 129#define elf_backend_merge_symbol ppc64_elf_merge_symbol
bce964aa 130#define elf_backend_get_reloc_section bfd_get_section_by_name
ad8e1ba5 131
5bd4f169
AM
132/* The name of the dynamic interpreter. This is put in the .interp
133 section. */
134#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
135
136/* The size in bytes of an entry in the procedure linkage table. */
b9e5796b 137#define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
2d7ad24e 138#define LOCAL_PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 16 : 8)
5bd4f169
AM
139
140/* The initial size of the plt reserved for the dynamic linker. */
b9e5796b 141#define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
5bd4f169 142
a078d95a
AM
143/* Offsets to some stack save slots. */
144#define STK_LR 16
145#define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
eb8d7fda 146/* This one is dodgy. ELFv2 does not have a linker word, so use the
a078d95a
AM
147 CR save slot. Used only by optimised __tls_get_addr call stub,
148 relying on __tls_get_addr_opt not saving CR.. */
149#define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
150
5bd4f169 151/* TOC base pointers offset from start of TOC. */
411e1bfb 152#define TOC_BASE_OFF 0x8000
a27e685f
AM
153/* TOC base alignment. */
154#define TOC_BASE_ALIGN 256
411e1bfb
AM
155
156/* Offset of tp and dtp pointers from start of TLS block. */
157#define TP_OFFSET 0x7000
158#define DTP_OFFSET 0x8000
5bd4f169 159
ad8e1ba5
AM
160/* .plt call stub instructions. The normal stub is like this, but
161 sometimes the .plt entry crosses a 64k boundary and we need to
71a39c98 162 insert an addi to adjust r11. */
a078d95a 163#define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
71a39c98
AM
164#define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
165#define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
166#define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
167#define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
168#define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
5d1634d7
AM
169#define BCTR 0x4e800420 /* bctr */
170
07d6d2b8 171#define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
05d0e962
AM
172#define ADDI_R12_R11 0x398b0000 /* addi %r12,%r11,off@l */
173#define ADDI_R12_R12 0x398c0000 /* addi %r12,%r12,off@l */
07d6d2b8
AM
174#define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
175#define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
176
177#define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
178#define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
179#define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
180#define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
181#define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
182#define BNECTR 0x4ca20420 /* bnectr+ */
183#define BNECTR_P4 0x4ce20420 /* bnectr+ */
794e51c0 184
71a39c98 185#define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
ac2df442 186#define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
07d6d2b8 187#define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
ac2df442 188
07d6d2b8
AM
189#define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
190#define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */
191#define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */
ad8e1ba5 192
04bdff6a 193#define LI_R11_0 0x39600000 /* li %r11,0 */
07d6d2b8 194#define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */
04bdff6a 195#define LIS_R11 0x3d600000 /* lis %r11,xxx@ha */
05d0e962 196#define LIS_R12 0x3d800000 /* lis %r12,xxx@ha */
006589cf
AM
197#define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */
198#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
05d0e962 199#define ADDIS_R12_R11 0x3d8b0000 /* addis %r12,%r11,xxx@ha */
a345bc8d 200#define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
05d0e962 201#define ORIS_R12_R12_0 0x658c0000 /* oris %r12,%r12,xxx@hi */
04bdff6a 202#define ORI_R11_R11_0 0x616b0000 /* ori %r11,%r11,xxx@l */
05d0e962 203#define ORI_R12_R12_0 0x618c0000 /* ori %r12,%r12,xxx@l */
07d6d2b8 204#define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
04bdff6a 205#define SLDI_R11_R11_34 0x796b1746 /* sldi %r11,%r11,34 */
05d0e962
AM
206#define SLDI_R12_R12_32 0x799c07c6 /* sldi %r12,%r12,32 */
207#define LDX_R12_R11_R12 0x7d8b602a /* ldx %r12,%r11,%r12 */
208#define ADD_R12_R11_R12 0x7d8b6214 /* add %r12,%r11,%r12 */
04bdff6a
AM
209#define PADDI_R12_PC 0x0610000039800000ULL
210#define PLD_R12_PC 0x04100000e5800000ULL
5663e321 211#define PNOP 0x0700000000000000ULL
a345bc8d 212
9e390558
AM
213/* __glink_PLTresolve stub instructions. We enter with the index in R0. */
214#define GLINK_PLTRESOLVE_SIZE(htab) \
407aa07c 215 (8u + (htab->opd_abi ? 11 * 4 : 14 * 4))
ee4bf8d2
AM
216 /* 0: */
217 /* .quad plt0-1f */
218 /* __glink: */
219#define MFLR_R12 0x7d8802a6 /* mflr %12 */
220#define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
221 /* 1: */
222#define MFLR_R11 0x7d6802a6 /* mflr %11 */
71a39c98 223 /* ld %2,(0b-1b)(%11) */
ee4bf8d2 224#define MTLR_R12 0x7d8803a6 /* mtlr %12 */
71a39c98
AM
225#define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
226 /* ld %12,0(%11) */
227 /* ld %2,8(%11) */
228 /* mtctr %12 */
229 /* ld %11,16(%11) */
ee4bf8d2 230 /* bctr */
b9e5796b
AM
231#define MFLR_R0 0x7c0802a6 /* mflr %r0 */
232#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
233#define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
234#define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
235#define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
5d1634d7
AM
236
237/* Pad with this. */
238#define NOP 0x60000000
239
721956f4
AM
240/* Some other nops. */
241#define CROR_151515 0x4def7b82
242#define CROR_313131 0x4ffffb82
243
cedb70c5 244/* .glink entries for the first 32k functions are two instructions. */
5d1634d7
AM
245#define LI_R0_0 0x38000000 /* li %r0,0 */
246#define B_DOT 0x48000000 /* b . */
247
248/* After that, we need two instructions to load the index, followed by
249 a branch. */
250#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 251#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 252
deb0e272
AM
253/* Instructions used by the save and restore reg functions. */
254#define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
255#define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
256#define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
257#define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
82bd7b59
AM
258#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
259#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
deb0e272
AM
260#define LI_R12_0 0x39800000 /* li %r12,0 */
261#define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
262#define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
263#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
82bd7b59
AM
264#define BLR 0x4e800020 /* blr */
265
41bd81ab
AM
266/* Since .opd is an array of descriptors and each entry will end up
267 with identical R_PPC64_RELATIVE relocs, there is really no need to
268 propagate .opd relocs; The dynamic linker should be taught to
1e2f5b6e 269 relocate .opd without reloc entries. */
41bd81ab
AM
270#ifndef NO_OPD_RELOCS
271#define NO_OPD_RELOCS 0
272#endif
810d4e75 273
a4b6fadd
AM
274#ifndef ARRAY_SIZE
275#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
276#endif
277
810d4e75
AM
278static inline int
279abiversion (bfd *abfd)
280{
281 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
282}
283
284static inline void
285set_abiversion (bfd *abfd, int ver)
286{
287 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
288 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
289}
5bd4f169
AM
290\f
291/* Relocation HOWTO's. */
46807bf4
AM
292/* Like other ELF RELA targets that don't apply multiple
293 field-altering relocations to the same localation, src_mask is
294 always zero and pcrel_offset is the same as pc_relative.
295 PowerPC can always use a zero bitpos, even when the field is not at
296 the LSB. For example, a REL24 could use rightshift=2, bisize=24
297 and bitpos=2 which matches the ABI description, or as we do here,
298 rightshift=0, bitsize=26 and bitpos=0. */
299#define HOW(type, size, bitsize, mask, rightshift, pc_relative, \
300 complain, special_func) \
301 HOWTO (type, rightshift, size, bitsize, pc_relative, 0, \
302 complain_overflow_ ## complain, special_func, \
303 #type, FALSE, 0, mask, pc_relative)
304
04c9666a 305static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
5bd4f169 306
f3185997
NC
307static reloc_howto_type ppc64_elf_howto_raw[] =
308{
5bd4f169 309 /* This reloc does nothing. */
46807bf4
AM
310 HOW (R_PPC64_NONE, 3, 0, 0, 0, FALSE, dont,
311 bfd_elf_generic_reloc),
5bd4f169
AM
312
313 /* A standard 32 bit relocation. */
46807bf4
AM
314 HOW (R_PPC64_ADDR32, 2, 32, 0xffffffff, 0, FALSE, bitfield,
315 bfd_elf_generic_reloc),
5bd4f169
AM
316
317 /* An absolute 26 bit branch; the lower two bits must be zero.
318 FIXME: we don't check that, we just clear them. */
46807bf4
AM
319 HOW (R_PPC64_ADDR24, 2, 26, 0x03fffffc, 0, FALSE, bitfield,
320 bfd_elf_generic_reloc),
5bd4f169
AM
321
322 /* A standard 16 bit relocation. */
46807bf4
AM
323 HOW (R_PPC64_ADDR16, 1, 16, 0xffff, 0, FALSE, bitfield,
324 bfd_elf_generic_reloc),
5bd4f169
AM
325
326 /* A 16 bit relocation without overflow. */
46807bf4
AM
327 HOW (R_PPC64_ADDR16_LO, 1, 16, 0xffff, 0, FALSE, dont,
328 bfd_elf_generic_reloc),
5bd4f169
AM
329
330 /* Bits 16-31 of an address. */
46807bf4
AM
331 HOW (R_PPC64_ADDR16_HI, 1, 16, 0xffff, 16, FALSE, signed,
332 bfd_elf_generic_reloc),
5bd4f169
AM
333
334 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
335 bits, treated as a signed number, is negative. */
46807bf4
AM
336 HOW (R_PPC64_ADDR16_HA, 1, 16, 0xffff, 16, FALSE, signed,
337 ppc64_elf_ha_reloc),
5bd4f169
AM
338
339 /* An absolute 16 bit branch; the lower two bits must be zero.
340 FIXME: we don't check that, we just clear them. */
46807bf4
AM
341 HOW (R_PPC64_ADDR14, 2, 16, 0x0000fffc, 0, FALSE, signed,
342 ppc64_elf_branch_reloc),
5bd4f169
AM
343
344 /* An absolute 16 bit branch, for which bit 10 should be set to
345 indicate that the branch is expected to be taken. The lower two
346 bits must be zero. */
46807bf4
AM
347 HOW (R_PPC64_ADDR14_BRTAKEN, 2, 16, 0x0000fffc, 0, FALSE, signed,
348 ppc64_elf_brtaken_reloc),
5bd4f169
AM
349
350 /* An absolute 16 bit branch, for which bit 10 should be set to
351 indicate that the branch is not expected to be taken. The lower
352 two bits must be zero. */
46807bf4
AM
353 HOW (R_PPC64_ADDR14_BRNTAKEN, 2, 16, 0x0000fffc, 0, FALSE, signed,
354 ppc64_elf_brtaken_reloc),
5bd4f169
AM
355
356 /* A relative 26 bit branch; the lower two bits must be zero. */
46807bf4
AM
357 HOW (R_PPC64_REL24, 2, 26, 0x03fffffc, 0, TRUE, signed,
358 ppc64_elf_branch_reloc),
5bd4f169 359
05d0e962 360 /* A variant of R_PPC64_REL24, used when r2 is not the toc pointer. */
46807bf4
AM
361 HOW (R_PPC64_REL24_NOTOC, 2, 26, 0x03fffffc, 0, TRUE, signed,
362 ppc64_elf_branch_reloc),
05d0e962 363
5bd4f169 364 /* A relative 16 bit branch; the lower two bits must be zero. */
46807bf4
AM
365 HOW (R_PPC64_REL14, 2, 16, 0x0000fffc, 0, TRUE, signed,
366 ppc64_elf_branch_reloc),
5bd4f169
AM
367
368 /* A relative 16 bit branch. Bit 10 should be set to indicate that
369 the branch is expected to be taken. The lower two bits must be
370 zero. */
46807bf4
AM
371 HOW (R_PPC64_REL14_BRTAKEN, 2, 16, 0x0000fffc, 0, TRUE, signed,
372 ppc64_elf_brtaken_reloc),
5bd4f169
AM
373
374 /* A relative 16 bit branch. Bit 10 should be set to indicate that
375 the branch is not expected to be taken. The lower two bits must
376 be zero. */
46807bf4
AM
377 HOW (R_PPC64_REL14_BRNTAKEN, 2, 16, 0x0000fffc, 0, TRUE, signed,
378 ppc64_elf_brtaken_reloc),
5bd4f169
AM
379
380 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
381 symbol. */
46807bf4
AM
382 HOW (R_PPC64_GOT16, 1, 16, 0xffff, 0, FALSE, signed,
383 ppc64_elf_unhandled_reloc),
5bd4f169
AM
384
385 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
386 the symbol. */
46807bf4
AM
387 HOW (R_PPC64_GOT16_LO, 1, 16, 0xffff, 0, FALSE, dont,
388 ppc64_elf_unhandled_reloc),
5bd4f169
AM
389
390 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
391 the symbol. */
46807bf4
AM
392 HOW (R_PPC64_GOT16_HI, 1, 16, 0xffff, 16, FALSE, signed,
393 ppc64_elf_unhandled_reloc),
5bd4f169
AM
394
395 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
396 the symbol. */
46807bf4
AM
397 HOW (R_PPC64_GOT16_HA, 1, 16, 0xffff, 16, FALSE, signed,
398 ppc64_elf_unhandled_reloc),
5bd4f169
AM
399
400 /* This is used only by the dynamic linker. The symbol should exist
401 both in the object being run and in some shared library. The
402 dynamic linker copies the data addressed by the symbol from the
403 shared library into the object, because the object being
404 run has to have the data at some particular address. */
46807bf4
AM
405 HOW (R_PPC64_COPY, 0, 0, 0, 0, FALSE, dont,
406 ppc64_elf_unhandled_reloc),
5bd4f169
AM
407
408 /* Like R_PPC64_ADDR64, but used when setting global offset table
409 entries. */
46807bf4
AM
410 HOW (R_PPC64_GLOB_DAT, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
411 ppc64_elf_unhandled_reloc),
5bd4f169
AM
412
413 /* Created by the link editor. Marks a procedure linkage table
414 entry for a symbol. */
46807bf4
AM
415 HOW (R_PPC64_JMP_SLOT, 0, 0, 0, 0, FALSE, dont,
416 ppc64_elf_unhandled_reloc),
5bd4f169
AM
417
418 /* Used only by the dynamic linker. When the object is run, this
419 doubleword64 is set to the load address of the object, plus the
420 addend. */
46807bf4
AM
421 HOW (R_PPC64_RELATIVE, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
422 bfd_elf_generic_reloc),
5bd4f169
AM
423
424 /* Like R_PPC64_ADDR32, but may be unaligned. */
46807bf4
AM
425 HOW (R_PPC64_UADDR32, 2, 32, 0xffffffff, 0, FALSE, bitfield,
426 bfd_elf_generic_reloc),
5bd4f169
AM
427
428 /* Like R_PPC64_ADDR16, but may be unaligned. */
46807bf4
AM
429 HOW (R_PPC64_UADDR16, 1, 16, 0xffff, 0, FALSE, bitfield,
430 bfd_elf_generic_reloc),
5bd4f169
AM
431
432 /* 32-bit PC relative. */
46807bf4
AM
433 HOW (R_PPC64_REL32, 2, 32, 0xffffffff, 0, TRUE, signed,
434 bfd_elf_generic_reloc),
5bd4f169 435
10ed1bba 436 /* 32-bit relocation to the symbol's procedure linkage table. */
46807bf4
AM
437 HOW (R_PPC64_PLT32, 2, 32, 0xffffffff, 0, FALSE, bitfield,
438 ppc64_elf_unhandled_reloc),
5bd4f169
AM
439
440 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
441 FIXME: R_PPC64_PLTREL32 not supported. */
46807bf4
AM
442 HOW (R_PPC64_PLTREL32, 2, 32, 0xffffffff, 0, TRUE, signed,
443 ppc64_elf_unhandled_reloc),
5bd4f169
AM
444
445 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
446 the symbol. */
46807bf4
AM
447 HOW (R_PPC64_PLT16_LO, 1, 16, 0xffff, 0, FALSE, dont,
448 ppc64_elf_unhandled_reloc),
5bd4f169
AM
449
450 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
451 the symbol. */
46807bf4
AM
452 HOW (R_PPC64_PLT16_HI, 1, 16, 0xffff, 16, FALSE, signed,
453 ppc64_elf_unhandled_reloc),
5bd4f169
AM
454
455 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
456 the symbol. */
46807bf4
AM
457 HOW (R_PPC64_PLT16_HA, 1, 16, 0xffff, 16, FALSE, signed,
458 ppc64_elf_unhandled_reloc),
5bd4f169 459
c061c2d8 460 /* 16-bit section relative relocation. */
46807bf4
AM
461 HOW (R_PPC64_SECTOFF, 1, 16, 0xffff, 0, FALSE, signed,
462 ppc64_elf_sectoff_reloc),
5bd4f169 463
c061c2d8 464 /* Like R_PPC64_SECTOFF, but no overflow warning. */
46807bf4
AM
465 HOW (R_PPC64_SECTOFF_LO, 1, 16, 0xffff, 0, FALSE, dont,
466 ppc64_elf_sectoff_reloc),
5bd4f169
AM
467
468 /* 16-bit upper half section relative relocation. */
46807bf4
AM
469 HOW (R_PPC64_SECTOFF_HI, 1, 16, 0xffff, 16, FALSE, signed,
470 ppc64_elf_sectoff_reloc),
5bd4f169
AM
471
472 /* 16-bit upper half adjusted section relative relocation. */
46807bf4
AM
473 HOW (R_PPC64_SECTOFF_HA, 1, 16, 0xffff, 16, FALSE, signed,
474 ppc64_elf_sectoff_ha_reloc),
5bd4f169 475
04c9666a 476 /* Like R_PPC64_REL24 without touching the two least significant bits. */
46807bf4
AM
477 HOW (R_PPC64_REL30, 2, 30, 0xfffffffc, 2, TRUE, dont,
478 bfd_elf_generic_reloc),
5bd4f169
AM
479
480 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
481
482 /* A standard 64-bit relocation. */
46807bf4
AM
483 HOW (R_PPC64_ADDR64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
484 bfd_elf_generic_reloc),
5bd4f169
AM
485
486 /* The bits 32-47 of an address. */
46807bf4
AM
487 HOW (R_PPC64_ADDR16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont,
488 bfd_elf_generic_reloc),
5bd4f169
AM
489
490 /* The bits 32-47 of an address, plus 1 if the contents of the low
491 16 bits, treated as a signed number, is negative. */
46807bf4
AM
492 HOW (R_PPC64_ADDR16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont,
493 ppc64_elf_ha_reloc),
5bd4f169
AM
494
495 /* The bits 48-63 of an address. */
46807bf4
AM
496 HOW (R_PPC64_ADDR16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont,
497 bfd_elf_generic_reloc),
5bd4f169
AM
498
499 /* The bits 48-63 of an address, plus 1 if the contents of the low
500 16 bits, treated as a signed number, is negative. */
46807bf4
AM
501 HOW (R_PPC64_ADDR16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont,
502 ppc64_elf_ha_reloc),
5bd4f169
AM
503
504 /* Like ADDR64, but may be unaligned. */
46807bf4
AM
505 HOW (R_PPC64_UADDR64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
506 bfd_elf_generic_reloc),
5bd4f169
AM
507
508 /* 64-bit relative relocation. */
46807bf4
AM
509 HOW (R_PPC64_REL64, 4, 64, 0xffffffffffffffffULL, 0, TRUE, dont,
510 bfd_elf_generic_reloc),
5bd4f169 511
cedb70c5 512 /* 64-bit relocation to the symbol's procedure linkage table. */
46807bf4
AM
513 HOW (R_PPC64_PLT64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
514 ppc64_elf_unhandled_reloc),
5bd4f169
AM
515
516 /* 64-bit PC relative relocation to the symbol's procedure linkage
517 table. */
518 /* FIXME: R_PPC64_PLTREL64 not supported. */
46807bf4
AM
519 HOW (R_PPC64_PLTREL64, 4, 64, 0xffffffffffffffffULL, 0, TRUE, dont,
520 ppc64_elf_unhandled_reloc),
5bd4f169
AM
521
522 /* 16 bit TOC-relative relocation. */
5bd4f169 523 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
46807bf4
AM
524 HOW (R_PPC64_TOC16, 1, 16, 0xffff, 0, FALSE, signed,
525 ppc64_elf_toc_reloc),
5bd4f169
AM
526
527 /* 16 bit TOC-relative relocation without overflow. */
5bd4f169 528 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
46807bf4
AM
529 HOW (R_PPC64_TOC16_LO, 1, 16, 0xffff, 0, FALSE, dont,
530 ppc64_elf_toc_reloc),
5bd4f169
AM
531
532 /* 16 bit TOC-relative relocation, high 16 bits. */
5bd4f169 533 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
46807bf4
AM
534 HOW (R_PPC64_TOC16_HI, 1, 16, 0xffff, 16, FALSE, signed,
535 ppc64_elf_toc_reloc),
5bd4f169
AM
536
537 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
538 contents of the low 16 bits, treated as a signed number, is
539 negative. */
5bd4f169 540 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
46807bf4
AM
541 HOW (R_PPC64_TOC16_HA, 1, 16, 0xffff, 16, FALSE, signed,
542 ppc64_elf_toc_ha_reloc),
5bd4f169
AM
543
544 /* 64-bit relocation; insert value of TOC base (.TOC.). */
5bd4f169 545 /* R_PPC64_TOC 51 doubleword64 .TOC. */
46807bf4
AM
546 HOW (R_PPC64_TOC, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
547 ppc64_elf_toc64_reloc),
5bd4f169
AM
548
549 /* Like R_PPC64_GOT16, but also informs the link editor that the
550 value to relocate may (!) refer to a PLT entry which the link
551 editor (a) may replace with the symbol value. If the link editor
552 is unable to fully resolve the symbol, it may (b) create a PLT
553 entry and store the address to the new PLT entry in the GOT.
554 This permits lazy resolution of function symbols at run time.
555 The link editor may also skip all of this and just (c) emit a
556 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
557 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
46807bf4
AM
558 HOW (R_PPC64_PLTGOT16, 1, 16, 0xffff, 0, FALSE,signed,
559 ppc64_elf_unhandled_reloc),
411e1bfb
AM
560
561 /* Like R_PPC64_PLTGOT16, but without overflow. */
562 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
46807bf4
AM
563 HOW (R_PPC64_PLTGOT16_LO, 1, 16, 0xffff, 0, FALSE, dont,
564 ppc64_elf_unhandled_reloc),
411e1bfb
AM
565
566 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
567 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
46807bf4
AM
568 HOW (R_PPC64_PLTGOT16_HI, 1, 16, 0xffff, 16, FALSE, signed,
569 ppc64_elf_unhandled_reloc),
411e1bfb
AM
570
571 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
572 1 if the contents of the low 16 bits, treated as a signed number,
573 is negative. */
574 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
46807bf4
AM
575 HOW (R_PPC64_PLTGOT16_HA, 1, 16, 0xffff, 16, FALSE, signed,
576 ppc64_elf_unhandled_reloc),
411e1bfb
AM
577
578 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
46807bf4
AM
579 HOW (R_PPC64_ADDR16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
580 bfd_elf_generic_reloc),
411e1bfb
AM
581
582 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
46807bf4
AM
583 HOW (R_PPC64_ADDR16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
584 bfd_elf_generic_reloc),
411e1bfb
AM
585
586 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
46807bf4
AM
587 HOW (R_PPC64_GOT16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
588 ppc64_elf_unhandled_reloc),
411e1bfb
AM
589
590 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
46807bf4
AM
591 HOW (R_PPC64_GOT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
592 ppc64_elf_unhandled_reloc),
411e1bfb
AM
593
594 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
46807bf4
AM
595 HOW (R_PPC64_PLT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
596 ppc64_elf_unhandled_reloc),
411e1bfb
AM
597
598 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
46807bf4
AM
599 HOW (R_PPC64_SECTOFF_DS, 1, 16, 0xfffc, 0, FALSE, signed,
600 ppc64_elf_sectoff_reloc),
411e1bfb
AM
601
602 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
46807bf4
AM
603 HOW (R_PPC64_SECTOFF_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
604 ppc64_elf_sectoff_reloc),
411e1bfb
AM
605
606 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
46807bf4
AM
607 HOW (R_PPC64_TOC16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
608 ppc64_elf_toc_reloc),
411e1bfb
AM
609
610 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
46807bf4
AM
611 HOW (R_PPC64_TOC16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
612 ppc64_elf_toc_reloc),
411e1bfb
AM
613
614 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
615 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
46807bf4
AM
616 HOW (R_PPC64_PLTGOT16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
617 ppc64_elf_unhandled_reloc),
411e1bfb
AM
618
619 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
620 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
46807bf4
AM
621 HOW (R_PPC64_PLTGOT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
622 ppc64_elf_unhandled_reloc),
411e1bfb 623
727fc41e 624 /* Marker relocs for TLS. */
46807bf4
AM
625 HOW (R_PPC64_TLS, 2, 32, 0, 0, FALSE, dont,
626 bfd_elf_generic_reloc),
627
628 HOW (R_PPC64_TLSGD, 2, 32, 0, 0, FALSE, dont,
629 bfd_elf_generic_reloc),
630
631 HOW (R_PPC64_TLSLD, 2, 32, 0, 0, FALSE, dont,
632 bfd_elf_generic_reloc),
727fc41e 633
23cedd1d
AM
634 /* Marker reloc for optimizing r2 save in prologue rather than on
635 each plt call stub. */
46807bf4
AM
636 HOW (R_PPC64_TOCSAVE, 2, 32, 0, 0, FALSE, dont,
637 bfd_elf_generic_reloc),
3b421ab3 638
23cedd1d 639 /* Marker relocs on inline plt call instructions. */
46807bf4
AM
640 HOW (R_PPC64_PLTSEQ, 2, 32, 0, 0, FALSE, dont,
641 bfd_elf_generic_reloc),
642
643 HOW (R_PPC64_PLTCALL, 2, 32, 0, 0, FALSE, dont,
644 bfd_elf_generic_reloc),
23cedd1d 645
411e1bfb
AM
646 /* Computes the load module index of the load module that contains the
647 definition of its TLS sym. */
46807bf4
AM
648 HOW (R_PPC64_DTPMOD64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
649 ppc64_elf_unhandled_reloc),
411e1bfb
AM
650
651 /* Computes a dtv-relative displacement, the difference between the value
652 of sym+add and the base address of the thread-local storage block that
653 contains the definition of sym, minus 0x8000. */
46807bf4
AM
654 HOW (R_PPC64_DTPREL64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
655 ppc64_elf_unhandled_reloc),
411e1bfb
AM
656
657 /* A 16 bit dtprel reloc. */
46807bf4
AM
658 HOW (R_PPC64_DTPREL16, 1, 16, 0xffff, 0, FALSE, signed,
659 ppc64_elf_unhandled_reloc),
411e1bfb
AM
660
661 /* Like DTPREL16, but no overflow. */
46807bf4
AM
662 HOW (R_PPC64_DTPREL16_LO, 1, 16, 0xffff, 0, FALSE, dont,
663 ppc64_elf_unhandled_reloc),
411e1bfb
AM
664
665 /* Like DTPREL16_LO, but next higher group of 16 bits. */
46807bf4
AM
666 HOW (R_PPC64_DTPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
667 ppc64_elf_unhandled_reloc),
411e1bfb
AM
668
669 /* Like DTPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
670 HOW (R_PPC64_DTPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
671 ppc64_elf_unhandled_reloc),
411e1bfb
AM
672
673 /* Like DTPREL16_HI, but next higher group of 16 bits. */
46807bf4
AM
674 HOW (R_PPC64_DTPREL16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont,
675 ppc64_elf_unhandled_reloc),
411e1bfb
AM
676
677 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
46807bf4
AM
678 HOW (R_PPC64_DTPREL16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont,
679 ppc64_elf_unhandled_reloc),
411e1bfb
AM
680
681 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
46807bf4
AM
682 HOW (R_PPC64_DTPREL16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont,
683 ppc64_elf_unhandled_reloc),
411e1bfb
AM
684
685 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
46807bf4
AM
686 HOW (R_PPC64_DTPREL16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont,
687 ppc64_elf_unhandled_reloc),
411e1bfb
AM
688
689 /* Like DTPREL16, but for insns with a DS field. */
46807bf4
AM
690 HOW (R_PPC64_DTPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
691 ppc64_elf_unhandled_reloc),
411e1bfb
AM
692
693 /* Like DTPREL16_DS, but no overflow. */
46807bf4
AM
694 HOW (R_PPC64_DTPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
695 ppc64_elf_unhandled_reloc),
411e1bfb
AM
696
697 /* Computes a tp-relative displacement, the difference between the value of
698 sym+add and the value of the thread pointer (r13). */
46807bf4
AM
699 HOW (R_PPC64_TPREL64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
700 ppc64_elf_unhandled_reloc),
411e1bfb
AM
701
702 /* A 16 bit tprel reloc. */
46807bf4
AM
703 HOW (R_PPC64_TPREL16, 1, 16, 0xffff, 0, FALSE, signed,
704 ppc64_elf_unhandled_reloc),
411e1bfb
AM
705
706 /* Like TPREL16, but no overflow. */
46807bf4
AM
707 HOW (R_PPC64_TPREL16_LO, 1, 16, 0xffff, 0, FALSE, dont,
708 ppc64_elf_unhandled_reloc),
411e1bfb
AM
709
710 /* Like TPREL16_LO, but next higher group of 16 bits. */
46807bf4
AM
711 HOW (R_PPC64_TPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
712 ppc64_elf_unhandled_reloc),
411e1bfb
AM
713
714 /* Like TPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
715 HOW (R_PPC64_TPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
716 ppc64_elf_unhandled_reloc),
411e1bfb
AM
717
718 /* Like TPREL16_HI, but next higher group of 16 bits. */
46807bf4
AM
719 HOW (R_PPC64_TPREL16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont,
720 ppc64_elf_unhandled_reloc),
411e1bfb
AM
721
722 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
46807bf4
AM
723 HOW (R_PPC64_TPREL16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont,
724 ppc64_elf_unhandled_reloc),
411e1bfb
AM
725
726 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
46807bf4
AM
727 HOW (R_PPC64_TPREL16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont,
728 ppc64_elf_unhandled_reloc),
411e1bfb
AM
729
730 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
46807bf4
AM
731 HOW (R_PPC64_TPREL16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont,
732 ppc64_elf_unhandled_reloc),
411e1bfb
AM
733
734 /* Like TPREL16, but for insns with a DS field. */
46807bf4
AM
735 HOW (R_PPC64_TPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
736 ppc64_elf_unhandled_reloc),
411e1bfb
AM
737
738 /* Like TPREL16_DS, but no overflow. */
46807bf4
AM
739 HOW (R_PPC64_TPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
740 ppc64_elf_unhandled_reloc),
411e1bfb
AM
741
742 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
743 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
744 to the first entry relative to the TOC base (r2). */
46807bf4
AM
745 HOW (R_PPC64_GOT_TLSGD16, 1, 16, 0xffff, 0, FALSE, signed,
746 ppc64_elf_unhandled_reloc),
5bd4f169 747
411e1bfb 748 /* Like GOT_TLSGD16, but no overflow. */
46807bf4
AM
749 HOW (R_PPC64_GOT_TLSGD16_LO, 1, 16, 0xffff, 0, FALSE, dont,
750 ppc64_elf_unhandled_reloc),
5bd4f169 751
411e1bfb 752 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
46807bf4
AM
753 HOW (R_PPC64_GOT_TLSGD16_HI, 1, 16, 0xffff, 16, FALSE, signed,
754 ppc64_elf_unhandled_reloc),
5bd4f169 755
411e1bfb 756 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
46807bf4
AM
757 HOW (R_PPC64_GOT_TLSGD16_HA, 1, 16, 0xffff, 16, FALSE, signed,
758 ppc64_elf_unhandled_reloc),
5bd4f169 759
411e1bfb
AM
760 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
761 with values (sym+add)@dtpmod and zero, and computes the offset to the
762 first entry relative to the TOC base (r2). */
46807bf4
AM
763 HOW (R_PPC64_GOT_TLSLD16, 1, 16, 0xffff, 0, FALSE, signed,
764 ppc64_elf_unhandled_reloc),
5bd4f169 765
411e1bfb 766 /* Like GOT_TLSLD16, but no overflow. */
46807bf4
AM
767 HOW (R_PPC64_GOT_TLSLD16_LO, 1, 16, 0xffff, 0, FALSE, dont,
768 ppc64_elf_unhandled_reloc),
5bd4f169 769
411e1bfb 770 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
46807bf4
AM
771 HOW (R_PPC64_GOT_TLSLD16_HI, 1, 16, 0xffff, 16, FALSE, signed,
772 ppc64_elf_unhandled_reloc),
5bd4f169 773
411e1bfb 774 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
46807bf4
AM
775 HOW (R_PPC64_GOT_TLSLD16_HA, 1, 16, 0xffff, 16, FALSE, signed,
776 ppc64_elf_unhandled_reloc),
5bd4f169 777
411e1bfb
AM
778 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
779 the offset to the entry relative to the TOC base (r2). */
46807bf4
AM
780 HOW (R_PPC64_GOT_DTPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
781 ppc64_elf_unhandled_reloc),
5bd4f169 782
411e1bfb 783 /* Like GOT_DTPREL16_DS, but no overflow. */
46807bf4
AM
784 HOW (R_PPC64_GOT_DTPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
785 ppc64_elf_unhandled_reloc),
5bd4f169 786
411e1bfb 787 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
46807bf4
AM
788 HOW (R_PPC64_GOT_DTPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
789 ppc64_elf_unhandled_reloc),
5bd4f169 790
411e1bfb 791 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
792 HOW (R_PPC64_GOT_DTPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
793 ppc64_elf_unhandled_reloc),
411e1bfb
AM
794
795 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
796 offset to the entry relative to the TOC base (r2). */
46807bf4
AM
797 HOW (R_PPC64_GOT_TPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed,
798 ppc64_elf_unhandled_reloc),
5bd4f169 799
411e1bfb 800 /* Like GOT_TPREL16_DS, but no overflow. */
46807bf4
AM
801 HOW (R_PPC64_GOT_TPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont,
802 ppc64_elf_unhandled_reloc),
5bd4f169 803
411e1bfb 804 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
46807bf4
AM
805 HOW (R_PPC64_GOT_TPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed,
806 ppc64_elf_unhandled_reloc),
5bd4f169 807
411e1bfb 808 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
46807bf4
AM
809 HOW (R_PPC64_GOT_TPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed,
810 ppc64_elf_unhandled_reloc),
811
812 HOW (R_PPC64_JMP_IREL, 0, 0, 0, 0, FALSE, dont,
813 ppc64_elf_unhandled_reloc),
814
815 HOW (R_PPC64_IRELATIVE, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
816 bfd_elf_generic_reloc),
e054468f 817
25f23106 818 /* A 16 bit relative relocation. */
46807bf4
AM
819 HOW (R_PPC64_REL16, 1, 16, 0xffff, 0, TRUE, signed,
820 bfd_elf_generic_reloc),
25f23106
AM
821
822 /* A 16 bit relative relocation without overflow. */
46807bf4
AM
823 HOW (R_PPC64_REL16_LO, 1, 16, 0xffff, 0, TRUE, dont,
824 bfd_elf_generic_reloc),
25f23106
AM
825
826 /* The high order 16 bits of a relative address. */
46807bf4
AM
827 HOW (R_PPC64_REL16_HI, 1, 16, 0xffff, 16, TRUE, signed,
828 bfd_elf_generic_reloc),
25f23106
AM
829
830 /* The high order 16 bits of a relative address, plus 1 if the contents of
831 the low 16 bits, treated as a signed number, is negative. */
46807bf4
AM
832 HOW (R_PPC64_REL16_HA, 1, 16, 0xffff, 16, TRUE, signed,
833 ppc64_elf_ha_reloc),
25f23106 834
4a969973
AM
835 HOW (R_PPC64_REL16_HIGH, 1, 16, 0xffff, 16, TRUE, dont,
836 bfd_elf_generic_reloc),
837
838 HOW (R_PPC64_REL16_HIGHA, 1, 16, 0xffff, 16, TRUE, dont,
839 ppc64_elf_ha_reloc),
840
841 HOW (R_PPC64_REL16_HIGHER, 1, 16, 0xffff, 32, TRUE, dont,
842 bfd_elf_generic_reloc),
843
844 HOW (R_PPC64_REL16_HIGHERA, 1, 16, 0xffff, 32, TRUE, dont,
845 ppc64_elf_ha_reloc),
846
847 HOW (R_PPC64_REL16_HIGHEST, 1, 16, 0xffff, 48, TRUE, dont,
848 bfd_elf_generic_reloc),
849
850 HOW (R_PPC64_REL16_HIGHESTA, 1, 16, 0xffff, 48, TRUE, dont,
851 ppc64_elf_ha_reloc),
852
a680de9a 853 /* Like R_PPC64_REL16_HA but for split field in addpcis. */
46807bf4
AM
854 HOW (R_PPC64_REL16DX_HA, 2, 16, 0x1fffc1, 16, TRUE, signed,
855 ppc64_elf_ha_reloc),
a680de9a 856
7ba71655 857 /* A split-field reloc for addpcis, non-relative (gas internal use only). */
46807bf4
AM
858 HOW (R_PPC64_16DX_HA, 2, 16, 0x1fffc1, 16, FALSE, signed,
859 ppc64_elf_ha_reloc),
7ba71655 860
f9c6b907 861 /* Like R_PPC64_ADDR16_HI, but no overflow. */
46807bf4
AM
862 HOW (R_PPC64_ADDR16_HIGH, 1, 16, 0xffff, 16, FALSE, dont,
863 bfd_elf_generic_reloc),
f9c6b907
AM
864
865 /* Like R_PPC64_ADDR16_HA, but no overflow. */
46807bf4
AM
866 HOW (R_PPC64_ADDR16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont,
867 ppc64_elf_ha_reloc),
f9c6b907
AM
868
869 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
46807bf4
AM
870 HOW (R_PPC64_DTPREL16_HIGH, 1, 16, 0xffff, 16, FALSE, dont,
871 ppc64_elf_unhandled_reloc),
f9c6b907
AM
872
873 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
46807bf4
AM
874 HOW (R_PPC64_DTPREL16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont,
875 ppc64_elf_unhandled_reloc),
f9c6b907
AM
876
877 /* Like R_PPC64_TPREL16_HI, but no overflow. */
46807bf4
AM
878 HOW (R_PPC64_TPREL16_HIGH, 1, 16, 0xffff, 16, FALSE, dont,
879 ppc64_elf_unhandled_reloc),
f9c6b907
AM
880
881 /* Like R_PPC64_TPREL16_HA, but no overflow. */
46807bf4
AM
882 HOW (R_PPC64_TPREL16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont,
883 ppc64_elf_unhandled_reloc),
f9c6b907 884
006589cf 885 /* Marker reloc on ELFv2 large-model function entry. */
46807bf4
AM
886 HOW (R_PPC64_ENTRY, 2, 32, 0, 0, FALSE, dont,
887 bfd_elf_generic_reloc),
006589cf 888
45965137 889 /* Like ADDR64, but use local entry point of function. */
46807bf4
AM
890 HOW (R_PPC64_ADDR64_LOCAL, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont,
891 bfd_elf_generic_reloc),
45965137 892
5663e321
AM
893 HOW (R_PPC64_PLTSEQ_NOTOC, 2, 32, 0, 0, FALSE, dont,
894 bfd_elf_generic_reloc),
895
896 HOW (R_PPC64_PLTCALL_NOTOC, 2, 32, 0, 0, FALSE, dont,
897 bfd_elf_generic_reloc),
898
899 HOW (R_PPC64_PCREL_OPT, 2, 32, 0, 0, FALSE, dont,
900 bfd_elf_generic_reloc),
901
902 HOW (R_PPC64_D34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed,
903 ppc64_elf_prefix_reloc),
904
905 HOW (R_PPC64_D34_LO, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, dont,
906 ppc64_elf_prefix_reloc),
907
908 HOW (R_PPC64_D34_HI30, 4, 34, 0x3ffff0000ffffULL, 34, FALSE, dont,
909 ppc64_elf_prefix_reloc),
910
911 HOW (R_PPC64_D34_HA30, 4, 34, 0x3ffff0000ffffULL, 34, FALSE, dont,
912 ppc64_elf_prefix_reloc),
913
914 HOW (R_PPC64_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
915 ppc64_elf_prefix_reloc),
916
917 HOW (R_PPC64_GOT_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
918 ppc64_elf_unhandled_reloc),
919
920 HOW (R_PPC64_PLT_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
921 ppc64_elf_unhandled_reloc),
922
923 HOW (R_PPC64_PLT_PCREL34_NOTOC, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
924 ppc64_elf_unhandled_reloc),
925
c213164a
AM
926 HOW (R_PPC64_TPREL34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed,
927 ppc64_elf_unhandled_reloc),
928
929 HOW (R_PPC64_DTPREL34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed,
930 ppc64_elf_unhandled_reloc),
931
932 HOW (R_PPC64_GOT_TLSGD34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
933 ppc64_elf_unhandled_reloc),
934
935 HOW (R_PPC64_GOT_TLSLD34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
936 ppc64_elf_unhandled_reloc),
937
938 HOW (R_PPC64_GOT_TPREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
939 ppc64_elf_unhandled_reloc),
940
941 HOW (R_PPC64_GOT_DTPREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed,
942 ppc64_elf_unhandled_reloc),
943
5663e321
AM
944 HOW (R_PPC64_ADDR16_HIGHER34, 1, 16, 0xffff, 34, FALSE, dont,
945 bfd_elf_generic_reloc),
946
947 HOW (R_PPC64_ADDR16_HIGHERA34, 1, 16, 0xffff, 34, FALSE, dont,
948 ppc64_elf_ha_reloc),
949
950 HOW (R_PPC64_ADDR16_HIGHEST34, 1, 16, 0xffff, 50, FALSE, dont,
951 bfd_elf_generic_reloc),
952
953 HOW (R_PPC64_ADDR16_HIGHESTA34, 1, 16, 0xffff, 50, FALSE, dont,
954 ppc64_elf_ha_reloc),
955
956 HOW (R_PPC64_REL16_HIGHER34, 1, 16, 0xffff, 34, TRUE, dont,
957 bfd_elf_generic_reloc),
958
959 HOW (R_PPC64_REL16_HIGHERA34, 1, 16, 0xffff, 34, TRUE, dont,
960 ppc64_elf_ha_reloc),
961
962 HOW (R_PPC64_REL16_HIGHEST34, 1, 16, 0xffff, 50, TRUE, dont,
963 bfd_elf_generic_reloc),
964
965 HOW (R_PPC64_REL16_HIGHESTA34, 1, 16, 0xffff, 50, TRUE, dont,
966 ppc64_elf_ha_reloc),
967
968 HOW (R_PPC64_D28, 4, 28, 0xfff0000ffffULL, 0, FALSE, signed,
969 ppc64_elf_prefix_reloc),
970
971 HOW (R_PPC64_PCREL28, 4, 28, 0xfff0000ffffULL, 0, TRUE, signed,
972 ppc64_elf_prefix_reloc),
973
5bd4f169 974 /* GNU extension to record C++ vtable hierarchy. */
46807bf4
AM
975 HOW (R_PPC64_GNU_VTINHERIT, 0, 0, 0, 0, FALSE, dont,
976 NULL),
5bd4f169
AM
977
978 /* GNU extension to record C++ vtable member usage. */
46807bf4
AM
979 HOW (R_PPC64_GNU_VTENTRY, 0, 0, 0, 0, FALSE, dont,
980 NULL),
5bd4f169
AM
981};
982
983\f
984/* Initialize the ppc64_elf_howto_table, so that linear accesses can
985 be done. */
986
987static void
4ce794b7 988ppc_howto_init (void)
5bd4f169
AM
989{
990 unsigned int i, type;
991
a4b6fadd 992 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
5bd4f169
AM
993 {
994 type = ppc64_elf_howto_raw[i].type;
a4b6fadd 995 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table));
5bd4f169
AM
996 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
997 }
998}
999
1000static reloc_howto_type *
f3185997 1001ppc64_elf_reloc_type_lookup (bfd *abfd,
4ce794b7 1002 bfd_reloc_code_real_type code)
5bd4f169 1003{
411e1bfb 1004 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
5bd4f169
AM
1005
1006 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1007 /* Initialize howto table if needed. */
1008 ppc_howto_init ();
1009
4ce794b7 1010 switch (code)
5bd4f169
AM
1011 {
1012 default:
f3185997 1013 /* xgettext:c-format */
2cdcc330
AM
1014 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd,
1015 (int) code);
f3185997 1016 bfd_set_error (bfd_error_bad_value);
4ce794b7 1017 return NULL;
5bd4f169 1018
411e1bfb
AM
1019 case BFD_RELOC_NONE: r = R_PPC64_NONE;
1020 break;
1021 case BFD_RELOC_32: r = R_PPC64_ADDR32;
1022 break;
1023 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
1024 break;
1025 case BFD_RELOC_16: r = R_PPC64_ADDR16;
1026 break;
1027 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
1028 break;
1029 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
1030 break;
f9c6b907
AM
1031 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
1032 break;
411e1bfb 1033 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
5bd4f169 1034 break;
f9c6b907
AM
1035 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
1036 break;
411e1bfb 1037 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
5bd4f169 1038 break;
411e1bfb 1039 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
5bd4f169 1040 break;
411e1bfb 1041 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
5bd4f169 1042 break;
411e1bfb 1043 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
5bd4f169 1044 break;
05d0e962
AM
1045 case BFD_RELOC_PPC64_REL24_NOTOC: r = R_PPC64_REL24_NOTOC;
1046 break;
411e1bfb 1047 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
5bd4f169 1048 break;
411e1bfb 1049 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
5bd4f169 1050 break;
411e1bfb 1051 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
5bd4f169 1052 break;
411e1bfb 1053 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
5bd4f169 1054 break;
411e1bfb 1055 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
5bd4f169 1056 break;
411e1bfb 1057 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
5bd4f169 1058 break;
411e1bfb 1059 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
5bd4f169 1060 break;
411e1bfb 1061 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
5bd4f169 1062 break;
411e1bfb 1063 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
5bd4f169 1064 break;
411e1bfb 1065 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
5bd4f169 1066 break;
411e1bfb 1067 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
5bd4f169 1068 break;
411e1bfb 1069 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
5bd4f169 1070 break;
411e1bfb 1071 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
5bd4f169 1072 break;
411e1bfb 1073 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
5bd4f169 1074 break;
411e1bfb 1075 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
5bd4f169 1076 break;
411e1bfb 1077 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
5bd4f169 1078 break;
411e1bfb 1079 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
5bd4f169 1080 break;
411e1bfb 1081 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
5bd4f169 1082 break;
411e1bfb 1083 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
5bd4f169 1084 break;
411e1bfb 1085 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
5bd4f169 1086 break;
411e1bfb 1087 case BFD_RELOC_64: r = R_PPC64_ADDR64;
5bd4f169 1088 break;
411e1bfb 1089 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
5bd4f169 1090 break;
411e1bfb 1091 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
5bd4f169 1092 break;
411e1bfb 1093 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
5bd4f169 1094 break;
411e1bfb 1095 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
5bd4f169 1096 break;
411e1bfb 1097 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
5bd4f169 1098 break;
411e1bfb 1099 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
5bd4f169 1100 break;
411e1bfb 1101 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
5bd4f169 1102 break;
411e1bfb 1103 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
5bd4f169 1104 break;
411e1bfb 1105 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
5bd4f169 1106 break;
411e1bfb 1107 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
5bd4f169 1108 break;
411e1bfb 1109 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
5bd4f169 1110 break;
411e1bfb 1111 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
5bd4f169 1112 break;
411e1bfb 1113 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
5bd4f169 1114 break;
411e1bfb 1115 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
5bd4f169 1116 break;
411e1bfb 1117 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
5bd4f169 1118 break;
411e1bfb 1119 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
5bd4f169 1120 break;
411e1bfb 1121 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
5bd4f169 1122 break;
411e1bfb 1123 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
5bd4f169 1124 break;
411e1bfb 1125 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
5bd4f169 1126 break;
411e1bfb 1127 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
5bd4f169 1128 break;
411e1bfb 1129 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
5bd4f169 1130 break;
411e1bfb 1131 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
5bd4f169 1132 break;
411e1bfb 1133 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
5bd4f169 1134 break;
411e1bfb 1135 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
5bd4f169 1136 break;
411e1bfb 1137 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
5bd4f169 1138 break;
411e1bfb 1139 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
5bd4f169 1140 break;
411e1bfb 1141 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
5bd4f169 1142 break;
c213164a 1143 case BFD_RELOC_PPC64_TLS_PCREL:
411e1bfb 1144 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
5bd4f169 1145 break;
727fc41e
AM
1146 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
1147 break;
1148 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
1149 break;
411e1bfb 1150 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
5bd4f169 1151 break;
411e1bfb 1152 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
5bd4f169 1153 break;
411e1bfb 1154 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
5bd4f169 1155 break;
411e1bfb 1156 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
5bd4f169 1157 break;
f9c6b907
AM
1158 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
1159 break;
411e1bfb 1160 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
5bd4f169 1161 break;
f9c6b907
AM
1162 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
1163 break;
411e1bfb 1164 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
5bd4f169 1165 break;
411e1bfb
AM
1166 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
1167 break;
1168 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
1169 break;
1170 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
1171 break;
f9c6b907
AM
1172 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
1173 break;
411e1bfb
AM
1174 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
1175 break;
f9c6b907
AM
1176 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
1177 break;
411e1bfb
AM
1178 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
1179 break;
1180 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
1181 break;
1182 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
1183 break;
1184 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
1185 break;
1186 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
1187 break;
1188 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
1189 break;
1190 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
1191 break;
1192 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
1193 break;
1194 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
1195 break;
1196 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
1197 break;
1198 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
1199 break;
1200 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
1201 break;
1202 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
1203 break;
1204 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
1205 break;
1206 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
1207 break;
1208 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
1209 break;
1210 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
1211 break;
1212 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
1213 break;
1214 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
1215 break;
1216 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
1217 break;
1218 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
1219 break;
1220 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
1221 break;
1222 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
1223 break;
1224 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
1225 break;
1226 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
1227 break;
1228 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
1229 break;
1230 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
1231 break;
1232 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
1233 break;
1234 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
1235 break;
25f23106
AM
1236 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
1237 break;
1238 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
1239 break;
1240 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
1241 break;
1242 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
1243 break;
4a969973
AM
1244 case BFD_RELOC_PPC64_REL16_HIGH: r = R_PPC64_REL16_HIGH;
1245 break;
1246 case BFD_RELOC_PPC64_REL16_HIGHA: r = R_PPC64_REL16_HIGHA;
1247 break;
1248 case BFD_RELOC_PPC64_REL16_HIGHER: r = R_PPC64_REL16_HIGHER;
1249 break;
1250 case BFD_RELOC_PPC64_REL16_HIGHERA: r = R_PPC64_REL16_HIGHERA;
1251 break;
1252 case BFD_RELOC_PPC64_REL16_HIGHEST: r = R_PPC64_REL16_HIGHEST;
1253 break;
1254 case BFD_RELOC_PPC64_REL16_HIGHESTA: r = R_PPC64_REL16_HIGHESTA;
1255 break;
7ba71655
AM
1256 case BFD_RELOC_PPC_16DX_HA: r = R_PPC64_16DX_HA;
1257 break;
a680de9a
PB
1258 case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA;
1259 break;
006589cf
AM
1260 case BFD_RELOC_PPC64_ENTRY: r = R_PPC64_ENTRY;
1261 break;
45965137
AM
1262 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
1263 break;
5663e321
AM
1264 case BFD_RELOC_PPC64_D34: r = R_PPC64_D34;
1265 break;
1266 case BFD_RELOC_PPC64_D34_LO: r = R_PPC64_D34_LO;
1267 break;
1268 case BFD_RELOC_PPC64_D34_HI30: r = R_PPC64_D34_HI30;
1269 break;
1270 case BFD_RELOC_PPC64_D34_HA30: r = R_PPC64_D34_HA30;
1271 break;
1272 case BFD_RELOC_PPC64_PCREL34: r = R_PPC64_PCREL34;
1273 break;
1274 case BFD_RELOC_PPC64_GOT_PCREL34: r = R_PPC64_GOT_PCREL34;
1275 break;
1276 case BFD_RELOC_PPC64_PLT_PCREL34: r = R_PPC64_PLT_PCREL34;
1277 break;
c213164a
AM
1278 case BFD_RELOC_PPC64_TPREL34: r = R_PPC64_TPREL34;
1279 break;
1280 case BFD_RELOC_PPC64_DTPREL34: r = R_PPC64_DTPREL34;
1281 break;
1282 case BFD_RELOC_PPC64_GOT_TLSGD34: r = R_PPC64_GOT_TLSGD34;
1283 break;
1284 case BFD_RELOC_PPC64_GOT_TLSLD34: r = R_PPC64_GOT_TLSLD34;
1285 break;
1286 case BFD_RELOC_PPC64_GOT_TPREL34: r = R_PPC64_GOT_TPREL34;
1287 break;
1288 case BFD_RELOC_PPC64_GOT_DTPREL34: r = R_PPC64_GOT_DTPREL34;
1289 break;
5663e321
AM
1290 case BFD_RELOC_PPC64_ADDR16_HIGHER34: r = R_PPC64_ADDR16_HIGHER34;
1291 break;
1292 case BFD_RELOC_PPC64_ADDR16_HIGHERA34: r = R_PPC64_ADDR16_HIGHERA34;
1293 break;
1294 case BFD_RELOC_PPC64_ADDR16_HIGHEST34: r = R_PPC64_ADDR16_HIGHEST34;
1295 break;
1296 case BFD_RELOC_PPC64_ADDR16_HIGHESTA34: r = R_PPC64_ADDR16_HIGHESTA34;
1297 break;
1298 case BFD_RELOC_PPC64_REL16_HIGHER34: r = R_PPC64_REL16_HIGHER34;
1299 break;
1300 case BFD_RELOC_PPC64_REL16_HIGHERA34: r = R_PPC64_REL16_HIGHERA34;
1301 break;
1302 case BFD_RELOC_PPC64_REL16_HIGHEST34: r = R_PPC64_REL16_HIGHEST34;
1303 break;
1304 case BFD_RELOC_PPC64_REL16_HIGHESTA34: r = R_PPC64_REL16_HIGHESTA34;
1305 break;
1306 case BFD_RELOC_PPC64_D28: r = R_PPC64_D28;
1307 break;
1308 case BFD_RELOC_PPC64_PCREL28: r = R_PPC64_PCREL28;
1309 break;
411e1bfb
AM
1310 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
1311 break;
1312 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
5bd4f169
AM
1313 break;
1314 }
1315
4ce794b7 1316 return ppc64_elf_howto_table[r];
5bd4f169
AM
1317};
1318
157090f7
AM
1319static reloc_howto_type *
1320ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1321 const char *r_name)
1322{
1323 unsigned int i;
1324
a4b6fadd 1325 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
157090f7
AM
1326 if (ppc64_elf_howto_raw[i].name != NULL
1327 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
1328 return &ppc64_elf_howto_raw[i];
1329
1330 return NULL;
1331}
1332
5bd4f169
AM
1333/* Set the howto pointer for a PowerPC ELF reloc. */
1334
f3185997 1335static bfd_boolean
4aef7643 1336ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
4ce794b7 1337 Elf_Internal_Rela *dst)
5bd4f169 1338{
65f38f15
AM
1339 unsigned int type;
1340
ef60b7ff 1341 /* Initialize howto table if needed. */
5bd4f169 1342 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
1343 ppc_howto_init ();
1344
65f38f15 1345 type = ELF64_R_TYPE (dst->r_info);
a4b6fadd 1346 if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
d0fb9a8d 1347 {
695344c0 1348 /* xgettext:c-format */
0aa13fee 1349 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
cf97bcb0 1350 abfd, type);
f3185997
NC
1351 bfd_set_error (bfd_error_bad_value);
1352 return FALSE;
d0fb9a8d 1353 }
65f38f15 1354 cache_ptr->howto = ppc64_elf_howto_table[type];
f3185997
NC
1355 if (cache_ptr->howto == NULL || cache_ptr->howto->name == NULL)
1356 {
1357 /* xgettext:c-format */
1358 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1359 abfd, type);
1360 bfd_set_error (bfd_error_bad_value);
1361 return FALSE;
1362 }
2cdcc330 1363
f3185997 1364 return TRUE;
5bd4f169
AM
1365}
1366
04c9666a 1367/* Handle the R_PPC64_ADDR16_HA and similar relocs. */
5bd4f169
AM
1368
1369static bfd_reloc_status_type
4ce794b7
AM
1370ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1371 void *data, asection *input_section,
1372 bfd *output_bfd, char **error_message)
5bd4f169 1373{
a680de9a
PB
1374 enum elf_ppc64_reloc_type r_type;
1375 long insn;
1376 bfd_size_type octets;
3de43e7b 1377 bfd_vma value;
a680de9a 1378
805fc799
AM
1379 /* If this is a relocatable link (output_bfd test tells us), just
1380 call the generic function. Any adjustment will be done at final
1381 link time. */
1382 if (output_bfd != NULL)
cedb70c5 1383 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1384 input_section, output_bfd, error_message);
1385
5663e321
AM
1386 /* Adjust the addend for sign extension of the low 16 (or 34) bits.
1387 We won't actually be using the low bits, so trashing them
805fc799 1388 doesn't matter. */
a680de9a 1389 r_type = reloc_entry->howto->type;
5663e321
AM
1390 if (r_type == R_PPC64_ADDR16_HIGHERA34
1391 || r_type == R_PPC64_ADDR16_HIGHESTA34
1392 || r_type == R_PPC64_REL16_HIGHERA34
1393 || r_type == R_PPC64_REL16_HIGHESTA34)
1394 reloc_entry->addend += 1ULL << 33;
1395 else
1396 reloc_entry->addend += 1U << 15;
a680de9a
PB
1397 if (r_type != R_PPC64_REL16DX_HA)
1398 return bfd_reloc_continue;
1399
1400 value = 0;
1401 if (!bfd_is_com_section (symbol->section))
1402 value = symbol->value;
1403 value += (reloc_entry->addend
1404 + symbol->section->output_offset
1405 + symbol->section->output_section->vma);
1406 value -= (reloc_entry->address
1407 + input_section->output_offset
1408 + input_section->output_section->vma);
3de43e7b 1409 value = (bfd_signed_vma) value >> 16;
a680de9a 1410
bb294208 1411 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
a680de9a
PB
1412 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
1413 insn &= ~0x1fffc1;
3de43e7b 1414 insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
a680de9a 1415 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
3de43e7b 1416 if (value + 0x8000 > 0xffff)
a680de9a
PB
1417 return bfd_reloc_overflow;
1418 return bfd_reloc_ok;
805fc799 1419}
5bd4f169 1420
2441e016
AM
1421static bfd_reloc_status_type
1422ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1423 void *data, asection *input_section,
1424 bfd *output_bfd, char **error_message)
1425{
1426 if (output_bfd != NULL)
1427 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1428 input_section, output_bfd, error_message);
1429
699733f6
AM
1430 if (strcmp (symbol->section->name, ".opd") == 0
1431 && (symbol->section->owner->flags & DYNAMIC) == 0)
2441e016
AM
1432 {
1433 bfd_vma dest = opd_entry_value (symbol->section,
1434 symbol->value + reloc_entry->addend,
aef36ac1 1435 NULL, NULL, FALSE);
2441e016
AM
1436 if (dest != (bfd_vma) -1)
1437 reloc_entry->addend = dest - (symbol->value
1438 + symbol->section->output_section->vma
1439 + symbol->section->output_offset);
1440 }
810d4e75
AM
1441 else
1442 {
1443 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
1444
1445 if (symbol->section->owner != abfd
9f284bf9 1446 && symbol->section->owner != NULL
810d4e75
AM
1447 && abiversion (symbol->section->owner) >= 2)
1448 {
1449 unsigned int i;
1450
1451 for (i = 0; i < symbol->section->owner->symcount; ++i)
1452 {
1453 asymbol *symdef = symbol->section->owner->outsymbols[i];
1454
1455 if (strcmp (symdef->name, symbol->name) == 0)
1456 {
1457 elfsym = (elf_symbol_type *) symdef;
1458 break;
1459 }
1460 }
1461 }
1462 reloc_entry->addend
1463 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
1464 }
2441e016
AM
1465 return bfd_reloc_continue;
1466}
1467
805fc799 1468static bfd_reloc_status_type
4ce794b7
AM
1469ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1470 void *data, asection *input_section,
1471 bfd *output_bfd, char **error_message)
805fc799
AM
1472{
1473 long insn;
04c9666a 1474 enum elf_ppc64_reloc_type r_type;
805fc799 1475 bfd_size_type octets;
794e51c0
AM
1476 /* Assume 'at' branch hints. */
1477 bfd_boolean is_isa_v2 = TRUE;
805fc799
AM
1478
1479 /* If this is a relocatable link (output_bfd test tells us), just
1480 call the generic function. Any adjustment will be done at final
1481 link time. */
5bd4f169 1482 if (output_bfd != NULL)
cedb70c5 1483 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1484 input_section, output_bfd, error_message);
1485
bb294208 1486 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
805fc799
AM
1487 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
1488 insn &= ~(0x01 << 21);
4ce794b7 1489 r_type = reloc_entry->howto->type;
805fc799
AM
1490 if (r_type == R_PPC64_ADDR14_BRTAKEN
1491 || r_type == R_PPC64_REL14_BRTAKEN)
cedb70c5 1492 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
805fc799 1493
794e51c0 1494 if (is_isa_v2)
5bd4f169 1495 {
805fc799
AM
1496 /* Set 'a' bit. This is 0b00010 in BO field for branch
1497 on CR(BI) insns (BO == 001at or 011at), and 0b01000
1498 for branch on CTR insns (BO == 1a00t or 1a01t). */
1499 if ((insn & (0x14 << 21)) == (0x04 << 21))
1500 insn |= 0x02 << 21;
1501 else if ((insn & (0x14 << 21)) == (0x10 << 21))
1502 insn |= 0x08 << 21;
1503 else
2441e016 1504 goto out;
5bd4f169 1505 }
805fc799
AM
1506 else
1507 {
1508 bfd_vma target = 0;
1509 bfd_vma from;
5bd4f169 1510
805fc799
AM
1511 if (!bfd_is_com_section (symbol->section))
1512 target = symbol->value;
1513 target += symbol->section->output_section->vma;
1514 target += symbol->section->output_offset;
1515 target += reloc_entry->addend;
5bd4f169 1516
805fc799
AM
1517 from = (reloc_entry->address
1518 + input_section->output_offset
1519 + input_section->output_section->vma);
5bd4f169 1520
805fc799
AM
1521 /* Invert 'y' bit if not the default. */
1522 if ((bfd_signed_vma) (target - from) < 0)
1523 insn ^= 0x01 << 21;
1524 }
4ce794b7 1525 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2441e016
AM
1526 out:
1527 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
1528 input_section, output_bfd, error_message);
805fc799 1529}
5bd4f169 1530
805fc799 1531static bfd_reloc_status_type
4ce794b7
AM
1532ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1533 void *data, asection *input_section,
1534 bfd *output_bfd, char **error_message)
805fc799
AM
1535{
1536 /* If this is a relocatable link (output_bfd test tells us), just
1537 call the generic function. Any adjustment will be done at final
1538 link time. */
1539 if (output_bfd != NULL)
cedb70c5 1540 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799 1541 input_section, output_bfd, error_message);
5bd4f169 1542
805fc799
AM
1543 /* Subtract the symbol section base address. */
1544 reloc_entry->addend -= symbol->section->output_section->vma;
5bd4f169
AM
1545 return bfd_reloc_continue;
1546}
1547
805fc799 1548static bfd_reloc_status_type
4ce794b7
AM
1549ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1550 void *data, asection *input_section,
1551 bfd *output_bfd, char **error_message)
805fc799
AM
1552{
1553 /* If this is a relocatable link (output_bfd test tells us), just
1554 call the generic function. Any adjustment will be done at final
1555 link time. */
1556 if (output_bfd != NULL)
cedb70c5 1557 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1558 input_section, output_bfd, error_message);
1559
1560 /* Subtract the symbol section base address. */
1561 reloc_entry->addend -= symbol->section->output_section->vma;
1562
1563 /* Adjust the addend for sign extension of the low 16 bits. */
1564 reloc_entry->addend += 0x8000;
1565 return bfd_reloc_continue;
1566}
1567
1568static bfd_reloc_status_type
4ce794b7
AM
1569ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1570 void *data, asection *input_section,
1571 bfd *output_bfd, char **error_message)
805fc799
AM
1572{
1573 bfd_vma TOCstart;
1574
1575 /* If this is a relocatable link (output_bfd test tells us), just
1576 call the generic function. Any adjustment will be done at final
1577 link time. */
1578 if (output_bfd != NULL)
cedb70c5 1579 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1580 input_section, output_bfd, error_message);
1581
1582 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1583 if (TOCstart == 0)
1c865ab2 1584 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
1585
1586 /* Subtract the TOC base address. */
1587 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
1588 return bfd_reloc_continue;
1589}
1590
1591static bfd_reloc_status_type
4ce794b7
AM
1592ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1593 void *data, asection *input_section,
1594 bfd *output_bfd, char **error_message)
805fc799
AM
1595{
1596 bfd_vma TOCstart;
1597
1598 /* If this is a relocatable link (output_bfd test tells us), just
1599 call the generic function. Any adjustment will be done at final
1600 link time. */
1601 if (output_bfd != NULL)
cedb70c5 1602 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1603 input_section, output_bfd, error_message);
1604
1605 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1606 if (TOCstart == 0)
1c865ab2 1607 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
1608
1609 /* Subtract the TOC base address. */
1610 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
1611
1612 /* Adjust the addend for sign extension of the low 16 bits. */
1613 reloc_entry->addend += 0x8000;
1614 return bfd_reloc_continue;
1615}
1616
1617static bfd_reloc_status_type
4ce794b7
AM
1618ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1619 void *data, asection *input_section,
1620 bfd *output_bfd, char **error_message)
805fc799
AM
1621{
1622 bfd_vma TOCstart;
1623 bfd_size_type octets;
1624
1625 /* If this is a relocatable link (output_bfd test tells us), just
1626 call the generic function. Any adjustment will be done at final
1627 link time. */
1628 if (output_bfd != NULL)
cedb70c5 1629 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1630 input_section, output_bfd, error_message);
1631
1632 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1633 if (TOCstart == 0)
1c865ab2 1634 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799 1635
bb294208 1636 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
805fc799
AM
1637 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
1638 return bfd_reloc_ok;
1639}
1640
5663e321
AM
1641static bfd_reloc_status_type
1642ppc64_elf_prefix_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1643 void *data, asection *input_section,
1644 bfd *output_bfd, char **error_message)
1645{
1646 uint64_t insn;
1647 bfd_vma targ;
1648
1649 if (output_bfd != NULL)
1650 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1651 input_section, output_bfd, error_message);
1652
1653 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1654 insn <<= 32;
1655 insn |= bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address + 4);
1656
1657 targ = (symbol->section->output_section->vma
1658 + symbol->section->output_offset
1659 + reloc_entry->addend);
1660 if (!bfd_is_com_section (symbol->section))
1661 targ += symbol->value;
1662 if (reloc_entry->howto->type == R_PPC64_D34_HA30)
1663 targ += 1ULL << 33;
1664 if (reloc_entry->howto->pc_relative)
1665 {
1666 bfd_vma from = (reloc_entry->address
1667 + input_section->output_offset
1668 + input_section->output_section->vma);
1669 targ -=from;
1670 }
1671 targ >>= reloc_entry->howto->rightshift;
1672 insn &= ~reloc_entry->howto->dst_mask;
1673 insn |= ((targ << 16) | (targ & 0xffff)) & reloc_entry->howto->dst_mask;
1674 bfd_put_32 (abfd, insn >> 32, (bfd_byte *) data + reloc_entry->address);
1675 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address + 4);
1676 if (reloc_entry->howto->complain_on_overflow == complain_overflow_signed
1677 && (targ + (1ULL << (reloc_entry->howto->bitsize - 1))
1678 >= 1ULL << reloc_entry->howto->bitsize))
1679 return bfd_reloc_overflow;
1680 return bfd_reloc_ok;
1681}
1682
805fc799 1683static bfd_reloc_status_type
4ce794b7
AM
1684ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1685 void *data, asection *input_section,
1686 bfd *output_bfd, char **error_message)
805fc799
AM
1687{
1688 /* If this is a relocatable link (output_bfd test tells us), just
1689 call the generic function. Any adjustment will be done at final
1690 link time. */
1691 if (output_bfd != NULL)
cedb70c5 1692 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1693 input_section, output_bfd, error_message);
1694
1695 if (error_message != NULL)
1696 {
1697 static char buf[60];
1698 sprintf (buf, "generic linker can't handle %s",
1699 reloc_entry->howto->name);
1700 *error_message = buf;
1701 }
1702 return bfd_reloc_dangerous;
1703}
1704
927be08e
AM
1705/* Track GOT entries needed for a given symbol. We might need more
1706 than one got entry per symbol. */
1707struct got_entry
1708{
1709 struct got_entry *next;
1710
1711 /* The symbol addend that we'll be placing in the GOT. */
1712 bfd_vma addend;
1713
1714 /* Unlike other ELF targets, we use separate GOT entries for the same
1715 symbol referenced from different input files. This is to support
1716 automatic multiple TOC/GOT sections, where the TOC base can vary
1717 from one input file to another. After partitioning into TOC groups
1718 we merge entries within the group.
1719
1720 Point to the BFD owning this GOT entry. */
1721 bfd *owner;
1722
1723 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
1724 TLS_TPREL or TLS_DTPREL for tls entries. */
f961d9dd 1725 unsigned char tls_type;
927be08e
AM
1726
1727 /* Non-zero if got.ent points to real entry. */
f961d9dd 1728 unsigned char is_indirect;
927be08e
AM
1729
1730 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
1731 union
2cdcc330
AM
1732 {
1733 bfd_signed_vma refcount;
1734 bfd_vma offset;
1735 struct got_entry *ent;
1736 } got;
927be08e
AM
1737};
1738
1739/* The same for PLT. */
1740struct plt_entry
1741{
1742 struct plt_entry *next;
1743
1744 bfd_vma addend;
1745
1746 union
2cdcc330
AM
1747 {
1748 bfd_signed_vma refcount;
1749 bfd_vma offset;
1750 } plt;
927be08e
AM
1751};
1752
e717da7e
AM
1753struct ppc64_elf_obj_tdata
1754{
1755 struct elf_obj_tdata elf;
1756
1757 /* Shortcuts to dynamic linker sections. */
1758 asection *got;
1759 asection *relgot;
1760
b3fac117
AM
1761 /* Used during garbage collection. We attach global symbols defined
1762 on removed .opd entries to this section so that the sym is removed. */
1763 asection *deleted_section;
81688140 1764
927be08e 1765 /* TLS local dynamic got entry handling. Support for multiple GOT
e717da7e 1766 sections means we potentially need one of these for each input bfd. */
927be08e 1767 struct got_entry tlsld_got;
8860955f 1768
2cdcc330
AM
1769 union
1770 {
729eabd5
AM
1771 /* A copy of relocs before they are modified for --emit-relocs. */
1772 Elf_Internal_Rela *relocs;
1773
1774 /* Section contents. */
1775 bfd_byte *contents;
1776 } opd;
d77c8a4b
AM
1777
1778 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
1779 the reloc to be in the range -32768 to 32767. */
98528052
AM
1780 unsigned int has_small_toc_reloc : 1;
1781
560c8763
AM
1782 /* Set if toc/got ha relocs detected not using r2, or lo reloc
1783 instruction not one we handle. */
1784 unsigned int unexpected_toc_insn : 1;
066f4018 1785
903b777d
AM
1786 /* Set if PLT/GOT/TOC relocs that can be optimised are present in
1787 this file. */
1788 unsigned int has_optrel : 1;
e717da7e
AM
1789};
1790
1791#define ppc64_elf_tdata(bfd) \
1792 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
1793
1794#define ppc64_tlsld_got(bfd) \
1795 (&ppc64_elf_tdata (bfd)->tlsld_got)
1796
0c8d6e5c
AM
1797#define is_ppc64_elf(bfd) \
1798 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
4dfe6ac6 1799 && elf_object_id (bfd) == PPC64_ELF_DATA)
0c8d6e5c 1800
e717da7e
AM
1801/* Override the generic function because we store some extras. */
1802
1803static bfd_boolean
1804ppc64_elf_mkobject (bfd *abfd)
1805{
0ffa91dd 1806 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
4dfe6ac6 1807 PPC64_ELF_DATA);
e717da7e
AM
1808}
1809
feee612b 1810/* Fix bad default arch selected for a 64 bit input bfd when the
14b57c7c 1811 default is 32 bit. Also select arch based on apuinfo. */
feee612b 1812
b34976b6 1813static bfd_boolean
4ce794b7 1814ppc64_elf_object_p (bfd *abfd)
feee612b 1815{
14b57c7c
AM
1816 if (!abfd->arch_info->the_default)
1817 return TRUE;
1818
1819 if (abfd->arch_info->bits_per_word == 32)
feee612b
AM
1820 {
1821 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
1822
1823 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
1824 {
1825 /* Relies on arch after 32 bit default being 64 bit default. */
1826 abfd->arch_info = abfd->arch_info->next;
1827 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
1828 }
1829 }
14b57c7c 1830 return _bfd_elf_ppc_set_arch (abfd);
feee612b
AM
1831}
1832
d37c89e5
AM
1833/* Support for core dump NOTE sections. */
1834
1835static bfd_boolean
1836ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1837{
eea6121a 1838 size_t offset, size;
d37c89e5
AM
1839
1840 if (note->descsz != 504)
1841 return FALSE;
1842
1843 /* pr_cursig */
228e534f 1844 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
d37c89e5
AM
1845
1846 /* pr_pid */
228e534f 1847 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
d37c89e5
AM
1848
1849 /* pr_reg */
1850 offset = 112;
eea6121a 1851 size = 384;
d37c89e5
AM
1852
1853 /* Make a ".reg/999" section. */
1854 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 1855 size, note->descpos + offset);
d37c89e5
AM
1856}
1857
1858static bfd_boolean
1859ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1860{
1861 if (note->descsz != 136)
1862 return FALSE;
1863
228e534f 1864 elf_tdata (abfd)->core->pid
bc989cdc 1865 = bfd_get_32 (abfd, note->descdata + 24);
228e534f 1866 elf_tdata (abfd)->core->program
d37c89e5 1867 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
228e534f 1868 elf_tdata (abfd)->core->command
d37c89e5
AM
1869 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
1870
1871 return TRUE;
1872}
1873
183e98be
AM
1874static char *
1875ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
1876 ...)
1877{
1878 switch (note_type)
1879 {
1880 default:
1881 return NULL;
1882
1883 case NT_PRPSINFO:
1884 {
9ef6d1e3 1885 char data[136] ATTRIBUTE_NONSTRING;
183e98be
AM
1886 va_list ap;
1887
1888 va_start (ap, note_type);
75cd47ed 1889 memset (data, 0, sizeof (data));
183e98be 1890 strncpy (data + 40, va_arg (ap, const char *), 16);
be3e27bb 1891#if GCC_VERSION == 8000 || GCC_VERSION == 8001
95da9854 1892 DIAGNOSTIC_PUSH;
be3e27bb 1893 /* GCC 8.0 and 8.1 warn about 80 equals destination size with
95da9854
L
1894 -Wstringop-truncation:
1895 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
1896 */
95da9854
L
1897 DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
1898#endif
183e98be 1899 strncpy (data + 56, va_arg (ap, const char *), 80);
be3e27bb 1900#if GCC_VERSION == 8000 || GCC_VERSION == 8001
95da9854 1901 DIAGNOSTIC_POP;
fe75810f 1902#endif
183e98be
AM
1903 va_end (ap);
1904 return elfcore_write_note (abfd, buf, bufsiz,
1905 "CORE", note_type, data, sizeof (data));
1906 }
1907
1908 case NT_PRSTATUS:
1909 {
1910 char data[504];
1911 va_list ap;
1912 long pid;
1913 int cursig;
1914 const void *greg;
1915
1916 va_start (ap, note_type);
1917 memset (data, 0, 112);
1918 pid = va_arg (ap, long);
1919 bfd_put_32 (abfd, pid, data + 32);
1920 cursig = va_arg (ap, int);
1921 bfd_put_16 (abfd, cursig, data + 12);
1922 greg = va_arg (ap, const void *);
1923 memcpy (data + 112, greg, 384);
1924 memset (data + 496, 0, 8);
1925 va_end (ap);
1926 return elfcore_write_note (abfd, buf, bufsiz,
1927 "CORE", note_type, data, sizeof (data));
1928 }
1929 }
1930}
1931
5d35169e
AM
1932/* Add extra PPC sections. */
1933
2cdcc330 1934static const struct bfd_elf_special_section ppc64_elf_special_sections[] =
7f4d3958 1935{
07d6d2b8
AM
1936 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
1937 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 1938 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
1939 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
1940 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 1941 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8 1942 { NULL, 0, 0, 0, 0 }
5d35169e
AM
1943};
1944
7c8fe5c4
AM
1945enum _ppc64_sec_type {
1946 sec_normal = 0,
1947 sec_opd = 1,
1948 sec_toc = 2
1949};
1950
f0abc2a1
AM
1951struct _ppc64_elf_section_data
1952{
1953 struct bfd_elf_section_data elf;
411e1bfb 1954
f0abc2a1
AM
1955 union
1956 {
51aecdc5
AM
1957 /* An array with one entry for each opd function descriptor,
1958 and some spares since opd entries may be either 16 or 24 bytes. */
1959#define OPD_NDX(OFF) ((OFF) >> 4)
74f0fb50
AM
1960 struct _opd_sec_data
1961 {
1962 /* Points to the function code section for local opd entries. */
1963 asection **func_sec;
1964
1965 /* After editing .opd, adjust references to opd local syms. */
1966 long *adjust;
1967 } opd;
7c8fe5c4 1968
3a71aa26
AM
1969 /* An array for toc sections, indexed by offset/8. */
1970 struct _toc_sec_data
1971 {
1972 /* Specifies the relocation symbol index used at a given toc offset. */
1973 unsigned *symndx;
1974
1975 /* And the relocation addend. */
1976 bfd_vma *add;
1977 } toc;
7c8fe5c4
AM
1978 } u;
1979
1980 enum _ppc64_sec_type sec_type:2;
411e1bfb 1981
7c8fe5c4
AM
1982 /* Flag set when small branches are detected. Used to
1983 select suitable defaults for the stub group size. */
1984 unsigned int has_14bit_branch:1;
3e04d765
AM
1985
1986 /* Flag set when PLTCALL relocs are detected. */
1987 unsigned int has_pltcall:1;
066f4018 1988
903b777d
AM
1989 /* Flag set when section has PLT/GOT/TOC relocations that can be
1990 optimised. */
1991 unsigned int has_optrel:1;
f0abc2a1
AM
1992};
1993
1994#define ppc64_elf_section_data(sec) \
411e1bfb 1995 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
f0abc2a1
AM
1996
1997static bfd_boolean
4ce794b7 1998ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 1999{
f592407e
AM
2000 if (!sec->used_by_bfd)
2001 {
2002 struct _ppc64_elf_section_data *sdata;
2003 bfd_size_type amt = sizeof (*sdata);
f0abc2a1 2004
f592407e
AM
2005 sdata = bfd_zalloc (abfd, amt);
2006 if (sdata == NULL)
2007 return FALSE;
2008 sec->used_by_bfd = sdata;
2009 }
f0abc2a1
AM
2010
2011 return _bfd_elf_new_section_hook (abfd, sec);
2012}
4025353c 2013
74f0fb50 2014static struct _opd_sec_data *
4025353c
AM
2015get_opd_info (asection * sec)
2016{
2017 if (sec != NULL
2018 && ppc64_elf_section_data (sec) != NULL
7c8fe5c4 2019 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
74f0fb50 2020 return &ppc64_elf_section_data (sec)->u.opd;
4025353c
AM
2021 return NULL;
2022}
90e3cdf2
JJ
2023\f
2024/* Parameters for the qsort hook. */
90e3cdf2 2025static bfd_boolean synthetic_relocatable;
cd285db5 2026static asection *synthetic_opd;
90e3cdf2 2027
699733f6 2028/* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
90e3cdf2
JJ
2029
2030static int
2031compare_symbols (const void *ap, const void *bp)
2032{
2cdcc330
AM
2033 const asymbol *a = *(const asymbol **) ap;
2034 const asymbol *b = *(const asymbol **) bp;
90e3cdf2 2035
699733f6
AM
2036 /* Section symbols first. */
2037 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
90e3cdf2 2038 return -1;
699733f6 2039 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
90e3cdf2
JJ
2040 return 1;
2041
699733f6 2042 /* then .opd symbols. */
cd285db5
AM
2043 if (synthetic_opd != NULL)
2044 {
2045 if (strcmp (a->section->name, ".opd") == 0
2046 && strcmp (b->section->name, ".opd") != 0)
2047 return -1;
2048 if (strcmp (a->section->name, ".opd") != 0
2049 && strcmp (b->section->name, ".opd") == 0)
2050 return 1;
2051 }
90e3cdf2 2052
699733f6 2053 /* then other code symbols. */
2cdcc330
AM
2054 if (((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2055 == (SEC_CODE | SEC_ALLOC))
2056 && ((b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2057 != (SEC_CODE | SEC_ALLOC)))
90e3cdf2
JJ
2058 return -1;
2059
2cdcc330
AM
2060 if (((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2061 != (SEC_CODE | SEC_ALLOC))
2062 && ((b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2063 == (SEC_CODE | SEC_ALLOC)))
90e3cdf2
JJ
2064 return 1;
2065
2066 if (synthetic_relocatable)
2067 {
2068 if (a->section->id < b->section->id)
2069 return -1;
2070
2071 if (a->section->id > b->section->id)
2072 return 1;
2073 }
2074
2075 if (a->value + a->section->vma < b->value + b->section->vma)
2076 return -1;
2077
2078 if (a->value + a->section->vma > b->value + b->section->vma)
2079 return 1;
2080
4d35a0aa
AM
2081 /* For syms with the same value, prefer strong dynamic global function
2082 syms over other syms. */
2083 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
2084 return -1;
2085
2086 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
2087 return 1;
2088
2089 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
2090 return -1;
2091
2092 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
2093 return 1;
2094
2095 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
2096 return -1;
2097
2098 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
2099 return 1;
2100
2101 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
2102 return -1;
2103
2104 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
2105 return 1;
2106
dcea6a95
AM
2107 /* Finally, sort on where the symbol is in memory. The symbols will
2108 be in at most two malloc'd blocks, one for static syms, one for
2109 dynamic syms, and we distinguish the two blocks above by testing
2110 BSF_DYNAMIC. Since we are sorting the symbol pointers which were
2111 originally in the same order as the symbols (and we're not
2112 sorting the symbols themselves), this ensures a stable sort. */
2113 if (a < b)
2114 return -1;
2115 if (a > b)
2116 return 1;
2117 return 0;
90e3cdf2
JJ
2118}
2119
699733f6 2120/* Search SYMS for a symbol of the given VALUE. */
90e3cdf2 2121
699733f6 2122static asymbol *
9ad9b810
AM
2123sym_exists_at (asymbol **syms, size_t lo, size_t hi, unsigned int id,
2124 bfd_vma value)
90e3cdf2 2125{
9ad9b810 2126 size_t mid;
90e3cdf2 2127
7292b3ac 2128 if (id == (unsigned) -1)
699733f6
AM
2129 {
2130 while (lo < hi)
2131 {
2132 mid = (lo + hi) >> 1;
2133 if (syms[mid]->value + syms[mid]->section->vma < value)
2134 lo = mid + 1;
2135 else if (syms[mid]->value + syms[mid]->section->vma > value)
2136 hi = mid;
2137 else
2138 return syms[mid];
2139 }
2140 }
2141 else
2142 {
2143 while (lo < hi)
2144 {
2145 mid = (lo + hi) >> 1;
2146 if (syms[mid]->section->id < id)
2147 lo = mid + 1;
2148 else if (syms[mid]->section->id > id)
2149 hi = mid;
2150 else if (syms[mid]->value < value)
2151 lo = mid + 1;
2152 else if (syms[mid]->value > value)
2153 hi = mid;
2154 else
2155 return syms[mid];
2156 }
2157 }
2158 return NULL;
90e3cdf2
JJ
2159}
2160
468392fb
AM
2161static bfd_boolean
2162section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
2163{
2164 bfd_vma vma = *(bfd_vma *) ptr;
2165 return ((section->flags & SEC_ALLOC) != 0
2166 && section->vma <= vma
2167 && vma < section->vma + section->size);
2168}
2169
699733f6 2170/* Create synthetic symbols, effectively restoring "dot-symbol" function
c4b0b099
AM
2171 entry syms. Also generate @plt symbols for the glink branch table.
2172 Returns count of synthetic symbols in RET or -1 on error. */
90e3cdf2
JJ
2173
2174static long
a7535cf3
AM
2175ppc64_elf_get_synthetic_symtab (bfd *abfd,
2176 long static_count, asymbol **static_syms,
2177 long dyn_count, asymbol **dyn_syms,
c9727e01 2178 asymbol **ret)
90e3cdf2
JJ
2179{
2180 asymbol *s;
0ccf57bd 2181 size_t i, j, count;
90e3cdf2 2182 char *names;
0ccf57bd 2183 size_t symcount, codesecsym, codesecsymend, secsymend, opdsymend;
ee67d69a 2184 asection *opd = NULL;
90e3cdf2 2185 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 2186 asymbol **syms;
ee67d69a 2187 int abi = abiversion (abfd);
90e3cdf2
JJ
2188
2189 *ret = NULL;
2190
ee67d69a
AM
2191 if (abi < 2)
2192 {
2193 opd = bfd_get_section_by_name (abfd, ".opd");
2194 if (opd == NULL && abi == 1)
2195 return 0;
2196 }
90e3cdf2 2197
a5259595
AM
2198 syms = NULL;
2199 codesecsym = 0;
2200 codesecsymend = 0;
2201 secsymend = 0;
2202 opdsymend = 0;
2203 symcount = 0;
2204 if (opd != NULL)
c9727e01 2205 {
a5259595
AM
2206 symcount = static_count;
2207 if (!relocatable)
2208 symcount += dyn_count;
2209 if (symcount == 0)
2210 return 0;
c9727e01 2211
a5259595
AM
2212 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2213 if (syms == NULL)
2214 return -1;
90e3cdf2 2215
a5259595
AM
2216 if (!relocatable && static_count != 0 && dyn_count != 0)
2217 {
2218 /* Use both symbol tables. */
2219 memcpy (syms, static_syms, static_count * sizeof (*syms));
2220 memcpy (syms + static_count, dyn_syms,
2221 (dyn_count + 1) * sizeof (*syms));
2222 }
2223 else if (!relocatable && static_count == 0)
2224 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
2225 else
2226 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
90e3cdf2 2227
0ccf57bd
AM
2228 /* Trim uninteresting symbols. Interesting symbols are section,
2229 function, and notype symbols. */
2230 for (i = 0, j = 0; i < symcount; ++i)
2231 if ((syms[i]->flags & (BSF_FILE | BSF_OBJECT | BSF_THREAD_LOCAL
2232 | BSF_RELC | BSF_SRELC)) == 0)
2233 syms[j++] = syms[i];
2234 symcount = j;
2235
a5259595
AM
2236 synthetic_relocatable = relocatable;
2237 synthetic_opd = opd;
2238 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 2239
a5259595
AM
2240 if (!relocatable && symcount > 1)
2241 {
bfa5bd2a
PA
2242 /* Trim duplicate syms, since we may have merged the normal
2243 and dynamic symbols. Actually, we only care about syms
2244 that have different values, so trim any with the same
2245 value. Don't consider ifunc and ifunc resolver symbols
2246 duplicates however, because GDB wants to know whether a
2247 text symbol is an ifunc resolver. */
a5259595 2248 for (i = 1, j = 1; i < symcount; ++i)
bfa5bd2a
PA
2249 {
2250 const asymbol *s0 = syms[i - 1];
2251 const asymbol *s1 = syms[i];
2252
2253 if ((s0->value + s0->section->vma
2254 != s1->value + s1->section->vma)
2255 || ((s0->flags & BSF_GNU_INDIRECT_FUNCTION)
2256 != (s1->flags & BSF_GNU_INDIRECT_FUNCTION)))
2257 syms[j++] = syms[i];
2258 }
a5259595
AM
2259 symcount = j;
2260 }
699733f6 2261
a5259595
AM
2262 i = 0;
2263 /* Note that here and in compare_symbols we can't compare opd and
2264 sym->section directly. With separate debug info files, the
2265 symbols will be extracted from the debug file while abfd passed
2266 to this function is the real binary. */
0ccf57bd 2267 if (strcmp (syms[i]->section->name, ".opd") == 0)
a5259595
AM
2268 ++i;
2269 codesecsym = i;
2270
2271 for (; i < symcount; ++i)
2272 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC
2273 | SEC_THREAD_LOCAL))
2274 != (SEC_CODE | SEC_ALLOC))
2275 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
2276 break;
2277 codesecsymend = i;
2278
2279 for (; i < symcount; ++i)
2280 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2281 break;
2282 secsymend = i;
2283
2284 for (; i < symcount; ++i)
2285 if (strcmp (syms[i]->section->name, ".opd") != 0)
2286 break;
2287 opdsymend = i;
2288
2289 for (; i < symcount; ++i)
2cdcc330
AM
2290 if (((syms[i]->section->flags
2291 & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL)))
a5259595
AM
2292 != (SEC_CODE | SEC_ALLOC))
2293 break;
2294 symcount = i;
2295 }
c9727e01 2296 count = 0;
90e3cdf2 2297
699733f6 2298 if (relocatable)
90e3cdf2 2299 {
699733f6
AM
2300 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2301 arelent *r;
2302 size_t size;
0ccf57bd 2303 size_t relcount;
90e3cdf2 2304
468392fb
AM
2305 if (opdsymend == secsymend)
2306 goto done;
2307
699733f6 2308 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2 2309 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
7356fed5 2310 if (relcount == 0)
c9727e01 2311 goto done;
90e3cdf2 2312
7356fed5
AM
2313 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
2314 {
2315 count = -1;
2316 goto done;
2317 }
2318
699733f6 2319 size = 0;
595da8c5 2320 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
2321 {
2322 asymbol *sym;
90e3cdf2 2323
595da8c5 2324 while (r < opd->relocation + relcount
699733f6
AM
2325 && r->address < syms[i]->value + opd->vma)
2326 ++r;
90e3cdf2 2327
595da8c5 2328 if (r == opd->relocation + relcount)
699733f6 2329 break;
90e3cdf2 2330
699733f6
AM
2331 if (r->address != syms[i]->value + opd->vma)
2332 continue;
90e3cdf2 2333
699733f6
AM
2334 if (r->howto->type != R_PPC64_ADDR64)
2335 continue;
90e3cdf2 2336
699733f6
AM
2337 sym = *r->sym_ptr_ptr;
2338 if (!sym_exists_at (syms, opdsymend, symcount,
2339 sym->section->id, sym->value + r->addend))
2340 {
2341 ++count;
2342 size += sizeof (asymbol);
2343 size += strlen (syms[i]->name) + 2;
2344 }
2345 }
90e3cdf2 2346
c4b0b099
AM
2347 if (size == 0)
2348 goto done;
699733f6
AM
2349 s = *ret = bfd_malloc (size);
2350 if (s == NULL)
2351 {
7356fed5 2352 count = -1;
c9727e01 2353 goto done;
699733f6 2354 }
90e3cdf2 2355
699733f6 2356 names = (char *) (s + count);
90e3cdf2 2357
595da8c5 2358 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 2359 {
699733f6 2360 asymbol *sym;
90e3cdf2 2361
595da8c5 2362 while (r < opd->relocation + relcount
699733f6
AM
2363 && r->address < syms[i]->value + opd->vma)
2364 ++r;
90e3cdf2 2365
595da8c5 2366 if (r == opd->relocation + relcount)
699733f6
AM
2367 break;
2368
2369 if (r->address != syms[i]->value + opd->vma)
2370 continue;
2371
2372 if (r->howto->type != R_PPC64_ADDR64)
2373 continue;
90e3cdf2 2374
699733f6
AM
2375 sym = *r->sym_ptr_ptr;
2376 if (!sym_exists_at (syms, opdsymend, symcount,
2377 sym->section->id, sym->value + r->addend))
2378 {
2379 size_t len;
2380
2381 *s = *syms[i];
6ba2a415 2382 s->flags |= BSF_SYNTHETIC;
699733f6
AM
2383 s->section = sym->section;
2384 s->value = sym->value + r->addend;
2385 s->name = names;
2386 *names++ = '.';
2387 len = strlen (syms[i]->name);
2388 memcpy (names, syms[i]->name, len + 1);
2389 names += len + 1;
6f610d07
UW
2390 /* Have udata.p point back to the original symbol this
2391 synthetic symbol was derived from. */
2392 s->udata.p = syms[i];
699733f6
AM
2393 s++;
2394 }
2395 }
2396 }
2397 else
90e3cdf2 2398 {
468392fb 2399 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
ee67d69a 2400 bfd_byte *contents = NULL;
699733f6 2401 size_t size;
0ccf57bd 2402 size_t plt_count = 0;
468392fb
AM
2403 bfd_vma glink_vma = 0, resolv_vma = 0;
2404 asection *dynamic, *glink = NULL, *relplt = NULL;
2405 arelent *p;
90e3cdf2 2406
ee67d69a 2407 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
699733f6 2408 {
c4b0b099
AM
2409 free_contents_and_exit_err:
2410 count = -1;
ee67d69a 2411 free_contents_and_exit:
699733f6 2412 if (contents)
ee67d69a 2413 free (contents);
c9727e01 2414 goto done;
699733f6 2415 }
90e3cdf2 2416
699733f6
AM
2417 size = 0;
2418 for (i = secsymend; i < opdsymend; ++i)
2419 {
2420 bfd_vma ent;
90e3cdf2 2421
5ef11c02
AM
2422 /* Ignore bogus symbols. */
2423 if (syms[i]->value > opd->size - 8)
2424 continue;
2425
699733f6
AM
2426 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2427 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2428 {
2429 ++count;
2430 size += sizeof (asymbol);
2431 size += strlen (syms[i]->name) + 2;
2432 }
2433 }
90e3cdf2 2434
468392fb 2435 /* Get start of .glink stubs from DT_PPC64_GLINK. */
066ee829
AM
2436 if (dyn_count != 0
2437 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
468392fb
AM
2438 {
2439 bfd_byte *dynbuf, *extdyn, *extdynend;
2440 size_t extdynsize;
2441 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
2442
2443 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
c4b0b099 2444 goto free_contents_and_exit_err;
468392fb
AM
2445
2446 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
2447 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
2448
2449 extdyn = dynbuf;
2450 extdynend = extdyn + dynamic->size;
2451 for (; extdyn < extdynend; extdyn += extdynsize)
2452 {
2453 Elf_Internal_Dyn dyn;
2454 (*swap_dyn_in) (abfd, extdyn, &dyn);
2455
2456 if (dyn.d_tag == DT_NULL)
2457 break;
2458
2459 if (dyn.d_tag == DT_PPC64_GLINK)
2460 {
9e390558
AM
2461 /* The first glink stub starts at DT_PPC64_GLINK plus 32.
2462 See comment in ppc64_elf_finish_dynamic_sections. */
2463 glink_vma = dyn.d_un.d_val + 8 * 4;
468392fb
AM
2464 /* The .glink section usually does not survive the final
2465 link; search for the section (usually .text) where the
2466 glink stubs now reside. */
2467 glink = bfd_sections_find_if (abfd, section_covers_vma,
2468 &glink_vma);
2469 break;
2470 }
2471 }
2472
2473 free (dynbuf);
2474 }
2475
2476 if (glink != NULL)
2477 {
2478 /* Determine __glink trampoline by reading the relative branch
2479 from the first glink stub. */
2480 bfd_byte buf[4];
b9e5796b
AM
2481 unsigned int off = 0;
2482
2483 while (bfd_get_section_contents (abfd, glink, buf,
2484 glink_vma + off - glink->vma, 4))
468392fb
AM
2485 {
2486 unsigned int insn = bfd_get_32 (abfd, buf);
2487 insn ^= B_DOT;
2488 if ((insn & ~0x3fffffc) == 0)
b9e5796b 2489 {
2cdcc330
AM
2490 resolv_vma
2491 = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
b9e5796b
AM
2492 break;
2493 }
2494 off += 4;
2495 if (off > 4)
2496 break;
468392fb
AM
2497 }
2498
2499 if (resolv_vma)
2500 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
468392fb 2501
066ee829
AM
2502 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2503 if (relplt != NULL)
2504 {
2505 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2cdcc330 2506 if (!(*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
c4b0b099 2507 goto free_contents_and_exit_err;
68ffbac6 2508
066ee829
AM
2509 plt_count = relplt->size / sizeof (Elf64_External_Rela);
2510 size += plt_count * sizeof (asymbol);
468392fb 2511
066ee829
AM
2512 p = relplt->relocation;
2513 for (i = 0; i < plt_count; i++, p++)
e054468f
AM
2514 {
2515 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
2516 if (p->addend != 0)
2517 size += sizeof ("+0x") - 1 + 16;
2518 }
066ee829 2519 }
468392fb
AM
2520 }
2521
c4b0b099
AM
2522 if (size == 0)
2523 goto free_contents_and_exit;
699733f6
AM
2524 s = *ret = bfd_malloc (size);
2525 if (s == NULL)
c4b0b099 2526 goto free_contents_and_exit_err;
90e3cdf2 2527
468392fb 2528 names = (char *) (s + count + plt_count + (resolv_vma != 0));
90e3cdf2 2529
699733f6 2530 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 2531 {
699733f6 2532 bfd_vma ent;
90e3cdf2 2533
5ef11c02
AM
2534 if (syms[i]->value > opd->size - 8)
2535 continue;
2536
699733f6
AM
2537 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2538 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 2539 {
0ccf57bd 2540 size_t lo, hi;
699733f6 2541 size_t len;
c9727e01 2542 asection *sec = abfd->sections;
90e3cdf2 2543
699733f6
AM
2544 *s = *syms[i];
2545 lo = codesecsym;
2546 hi = codesecsymend;
2547 while (lo < hi)
2548 {
0ccf57bd 2549 size_t mid = (lo + hi) >> 1;
699733f6
AM
2550 if (syms[mid]->section->vma < ent)
2551 lo = mid + 1;
2552 else if (syms[mid]->section->vma > ent)
2553 hi = mid;
2554 else
c9727e01
AM
2555 {
2556 sec = syms[mid]->section;
2557 break;
2558 }
699733f6
AM
2559 }
2560
c9727e01 2561 if (lo >= hi && lo > codesecsym)
699733f6 2562 sec = syms[lo - 1]->section;
699733f6
AM
2563
2564 for (; sec != NULL; sec = sec->next)
2565 {
2566 if (sec->vma > ent)
2567 break;
63524580
JK
2568 /* SEC_LOAD may not be set if SEC is from a separate debug
2569 info file. */
2570 if ((sec->flags & SEC_ALLOC) == 0)
699733f6
AM
2571 break;
2572 if ((sec->flags & SEC_CODE) != 0)
2573 s->section = sec;
2574 }
6ba2a415 2575 s->flags |= BSF_SYNTHETIC;
699733f6
AM
2576 s->value = ent - s->section->vma;
2577 s->name = names;
2578 *names++ = '.';
2579 len = strlen (syms[i]->name);
2580 memcpy (names, syms[i]->name, len + 1);
2581 names += len + 1;
6f610d07
UW
2582 /* Have udata.p point back to the original symbol this
2583 synthetic symbol was derived from. */
2584 s->udata.p = syms[i];
699733f6 2585 s++;
90e3cdf2 2586 }
90e3cdf2 2587 }
699733f6 2588 free (contents);
468392fb
AM
2589
2590 if (glink != NULL && relplt != NULL)
2591 {
2592 if (resolv_vma)
2593 {
2594 /* Add a symbol for the main glink trampoline. */
86a4952b 2595 memset (s, 0, sizeof *s);
468392fb 2596 s->the_bfd = abfd;
6ba2a415 2597 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
468392fb
AM
2598 s->section = glink;
2599 s->value = resolv_vma - glink->vma;
2600 s->name = names;
2cdcc330
AM
2601 memcpy (names, "__glink_PLTresolve",
2602 sizeof ("__glink_PLTresolve"));
468392fb
AM
2603 names += sizeof ("__glink_PLTresolve");
2604 s++;
2605 count++;
2606 }
2607
2608 /* FIXME: It would be very much nicer to put sym@plt on the
2609 stub rather than on the glink branch table entry. The
2610 objdump disassembler would then use a sensible symbol
2611 name on plt calls. The difficulty in doing so is
2612 a) finding the stubs, and,
2613 b) matching stubs against plt entries, and,
2614 c) there can be multiple stubs for a given plt entry.
2615
2616 Solving (a) could be done by code scanning, but older
2617 ppc64 binaries used different stubs to current code.
2618 (b) is the tricky one since you need to known the toc
2619 pointer for at least one function that uses a pic stub to
2620 be able to calculate the plt address referenced.
2621 (c) means gdb would need to set multiple breakpoints (or
2622 find the glink branch itself) when setting breakpoints
2623 for pending shared library loads. */
2624 p = relplt->relocation;
2625 for (i = 0; i < plt_count; i++, p++)
2626 {
2627 size_t len;
2628
2629 *s = **p->sym_ptr_ptr;
2630 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
2631 we are defining a symbol, ensure one of them is set. */
2632 if ((s->flags & BSF_LOCAL) == 0)
2633 s->flags |= BSF_GLOBAL;
6ba2a415 2634 s->flags |= BSF_SYNTHETIC;
468392fb
AM
2635 s->section = glink;
2636 s->value = glink_vma - glink->vma;
2637 s->name = names;
2638 s->udata.p = NULL;
2639 len = strlen ((*p->sym_ptr_ptr)->name);
2640 memcpy (names, (*p->sym_ptr_ptr)->name, len);
2641 names += len;
e054468f
AM
2642 if (p->addend != 0)
2643 {
2644 memcpy (names, "+0x", sizeof ("+0x") - 1);
2645 names += sizeof ("+0x") - 1;
2646 bfd_sprintf_vma (abfd, names, p->addend);
2647 names += strlen (names);
2648 }
468392fb
AM
2649 memcpy (names, "@plt", sizeof ("@plt"));
2650 names += sizeof ("@plt");
2651 s++;
b9e5796b
AM
2652 if (abi < 2)
2653 {
2654 glink_vma += 8;
2655 if (i >= 0x8000)
2656 glink_vma += 4;
2657 }
2658 else
468392fb
AM
2659 glink_vma += 4;
2660 }
2661 count += plt_count;
2662 }
90e3cdf2
JJ
2663 }
2664
c9727e01 2665 done:
a7535cf3 2666 free (syms);
90e3cdf2
JJ
2667 return count;
2668}
5bd4f169 2669\f
65f38f15
AM
2670/* The following functions are specific to the ELF linker, while
2671 functions above are used generally. Those named ppc64_elf_* are
2672 called by the main ELF linker code. They appear in this file more
2673 or less in the order in which they are called. eg.
2674 ppc64_elf_check_relocs is called early in the link process,
2675 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
2676 called.
2677
2678 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2679 functions have both a function code symbol and a function descriptor
2680 symbol. A call to foo in a relocatable object file looks like:
2681
2682 . .text
2683 . x:
2684 . bl .foo
2685 . nop
2686
2687 The function definition in another object file might be:
2688
2689 . .section .opd
2690 . foo: .quad .foo
2691 . .quad .TOC.@tocbase
2692 . .quad 0
2693 .
2694 . .text
2695 . .foo: blr
2696
2697 When the linker resolves the call during a static link, the branch
2698 unsurprisingly just goes to .foo and the .opd information is unused.
2699 If the function definition is in a shared library, things are a little
2700 different: The call goes via a plt call stub, the opd information gets
2701 copied to the plt, and the linker patches the nop.
2702
2703 . x:
2704 . bl .foo_stub
2705 . ld 2,40(1)
2706 .
2707 .
2708 . .foo_stub:
71a39c98
AM
2709 . std 2,40(1) # in practice, the call stub
2710 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
2711 . addi 11,11,Lfoo@toc@l # this is the general idea
2712 . ld 12,0(11)
2713 . ld 2,8(11)
2714 . mtctr 12
2715 . ld 11,16(11)
e86ce104
AM
2716 . bctr
2717 .
2718 . .section .plt
2719 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
2720
2721 The "reloc ()" notation is supposed to indicate that the linker emits
2722 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
2723 copying.
2724
2725 What are the difficulties here? Well, firstly, the relocations
2726 examined by the linker in check_relocs are against the function code
2727 sym .foo, while the dynamic relocation in the plt is emitted against
2728 the function descriptor symbol, foo. Somewhere along the line, we need
2729 to carefully copy dynamic link information from one symbol to the other.
2730 Secondly, the generic part of the elf linker will make .foo a dynamic
2731 symbol as is normal for most other backends. We need foo dynamic
2732 instead, at least for an application final link. However, when
2733 creating a shared library containing foo, we need to have both symbols
2734 dynamic so that references to .foo are satisfied during the early
2735 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
2736 definition from some other object, eg. a static library.
2737
2738 Update: As of August 2004, we support a new convention. Function
2739 calls may use the function descriptor symbol, ie. "bl foo". This
2740 behaves exactly as "bl .foo". */
65f38f15 2741
7c8bbca5
AM
2742/* Of those relocs that might be copied as dynamic relocs, this
2743 function selects those that must be copied when linking a shared
2744 library or PIE, even when the symbol is local. */
65f38f15 2745
1d483afe
AM
2746static int
2747must_be_dyn_reloc (struct bfd_link_info *info,
2748 enum elf_ppc64_reloc_type r_type)
2749{
2750 switch (r_type)
2751 {
2752 default:
7c8bbca5
AM
2753 /* Only relative relocs can be resolved when the object load
2754 address isn't fixed. DTPREL64 is excluded because the
2755 dynamic linker needs to differentiate global dynamic from
2756 local dynamic __tls_index pairs when PPC64_OPT_TLS is set. */
1d483afe
AM
2757 return 1;
2758
2759 case R_PPC64_REL32:
2760 case R_PPC64_REL64:
2761 case R_PPC64_REL30:
1bdd8fac
AM
2762 case R_PPC64_TOC16:
2763 case R_PPC64_TOC16_DS:
2764 case R_PPC64_TOC16_LO:
2765 case R_PPC64_TOC16_HI:
2766 case R_PPC64_TOC16_HA:
2767 case R_PPC64_TOC16_LO_DS:
1d483afe
AM
2768 return 0;
2769
2770 case R_PPC64_TPREL16:
2771 case R_PPC64_TPREL16_LO:
2772 case R_PPC64_TPREL16_HI:
2773 case R_PPC64_TPREL16_HA:
2774 case R_PPC64_TPREL16_DS:
2775 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
2776 case R_PPC64_TPREL16_HIGH:
2777 case R_PPC64_TPREL16_HIGHA:
1d483afe
AM
2778 case R_PPC64_TPREL16_HIGHER:
2779 case R_PPC64_TPREL16_HIGHERA:
2780 case R_PPC64_TPREL16_HIGHEST:
2781 case R_PPC64_TPREL16_HIGHESTA:
2782 case R_PPC64_TPREL64:
c213164a 2783 case R_PPC64_TPREL34:
7c8bbca5
AM
2784 /* These relocations are relative but in a shared library the
2785 linker doesn't know the thread pointer base. */
2786 return bfd_link_dll (info);
1d483afe
AM
2787 }
2788}
65f38f15 2789
f4656909 2790/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
e1c6cf61 2791 copying dynamic variables from a shared lib into an app's .dynbss
f4656909 2792 section, and instead use a dynamic relocation to point into the
e1c6cf61
AM
2793 shared lib. With code that gcc generates it is vital that this be
2794 enabled; In the PowerPC64 ELFv1 ABI the address of a function is
2795 actually the address of a function descriptor which resides in the
2796 .opd section. gcc uses the descriptor directly rather than going
2797 via the GOT as some other ABIs do, which means that initialized
2798 function pointers reference the descriptor. Thus, a function
2799 pointer initialized to the address of a function in a shared
2800 library will either require a .dynbss copy and a copy reloc, or a
2801 dynamic reloc. Using a .dynbss copy redefines the function
2802 descriptor symbol to point to the copy. This presents a problem as
2803 a PLT entry for that function is also initialized from the function
2804 descriptor symbol and the copy may not be initialized first. */
a23b6845 2805#define ELIMINATE_COPY_RELOCS 1
f4656909 2806
721956f4 2807/* Section name for stubs is the associated section name plus this
29942be8
NC
2808 string. */
2809#define STUB_SUFFIX ".stub"
721956f4
AM
2810
2811/* Linker stubs.
2812 ppc_stub_long_branch:
2813 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
2814 destination, but a 24 bit branch in a stub section will reach.
2815 . b dest
2816
2817 ppc_stub_plt_branch:
2818 Similar to the above, but a 24 bit branch in the stub section won't
2819 reach its destination.
71a39c98
AM
2820 . addis %r11,%r2,xxx@toc@ha
2821 . ld %r12,xxx@toc@l(%r11)
2822 . mtctr %r12
721956f4
AM
2823 . bctr
2824
2825 ppc_stub_plt_call:
2c66dc6c
AM
2826 Used to call a function in a shared library. If it so happens that
2827 the plt entry referenced crosses a 64k boundary, then an extra
71a39c98 2828 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
05d0e962 2829 ppc_stub_plt_call_r2save starts with "std %r2,40(%r1)".
71a39c98
AM
2830 . addis %r11,%r2,xxx@toc@ha
2831 . ld %r12,xxx+0@toc@l(%r11)
2832 . mtctr %r12
2833 . ld %r2,xxx+8@toc@l(%r11)
2834 . ld %r11,xxx+16@toc@l(%r11)
721956f4 2835 . bctr
ad8e1ba5
AM
2836
2837 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
2838 code to adjust the value and save r2 to support multiple toc sections.
2839 A ppc_stub_long_branch with an r2 offset looks like:
2840 . std %r2,40(%r1)
2841 . addis %r2,%r2,off@ha
2842 . addi %r2,%r2,off@l
2843 . b dest
2844
2845 A ppc_stub_plt_branch with an r2 offset looks like:
2846 . std %r2,40(%r1)
71a39c98
AM
2847 . addis %r11,%r2,xxx@toc@ha
2848 . ld %r12,xxx@toc@l(%r11)
ad8e1ba5
AM
2849 . addis %r2,%r2,off@ha
2850 . addi %r2,%r2,off@l
71a39c98 2851 . mtctr %r12
ad8e1ba5 2852 . bctr
ac2df442 2853
05d0e962
AM
2854 All of the above stubs are shown as their ELFv1 variants. ELFv2
2855 variants exist too, simpler for plt calls since a new toc pointer
2856 and static chain are not loaded by the stub. In addition, ELFv2
2857 has some more complex stubs to handle calls marked with NOTOC
2858 relocs from functions where r2 is not a valid toc pointer. These
2859 come in two flavours, the ones shown below, and _both variants that
2860 start with "std %r2,24(%r1)" to save r2 in the unlikely event that
2861 one call is from a function where r2 is used as the toc pointer but
2862 needs a toc adjusting stub for small-model multi-toc, and another
2863 call is from a function where r2 is not valid.
2864 ppc_stub_long_branch_notoc:
2865 . mflr %r12
2866 . bcl 20,31,1f
2867 . 1:
2868 . mflr %r11
2869 . mtlr %r12
2cdcc330
AM
2870 . addis %r12,%r11,dest-1b@ha
2871 . addi %r12,%r12,dest-1b@l
05d0e962
AM
2872 . b dest
2873
2874 ppc_stub_plt_branch_notoc:
2875 . mflr %r12
2876 . bcl 20,31,1f
2877 . 1:
2878 . mflr %r11
2879 . mtlr %r12
2880 . lis %r12,xxx-1b@highest
f891966f 2881 . ori %r12,%r12,xxx-1b@higher
05d0e962 2882 . sldi %r12,%r12,32
f891966f 2883 . oris %r12,%r12,xxx-1b@high
05d0e962
AM
2884 . ori %r12,%r12,xxx-1b@l
2885 . add %r12,%r11,%r12
2886 . mtctr %r12
2887 . bctr
2888
2889 ppc_stub_plt_call_notoc:
2890 . mflr %r12
2891 . bcl 20,31,1f
2892 . 1:
2893 . mflr %r11
2894 . mtlr %r12
2895 . lis %r12,xxx-1b@highest
f891966f 2896 . ori %r12,%r12,xxx-1b@higher
05d0e962 2897 . sldi %r12,%r12,32
f891966f 2898 . oris %r12,%r12,xxx-1b@high
05d0e962
AM
2899 . ori %r12,%r12,xxx-1b@l
2900 . ldx %r12,%r11,%r12
2901 . mtctr %r12
2902 . bctr
2903
04bdff6a
AM
2904 There are also ELFv1 powerxx variants of these stubs.
2905 ppc_stub_long_branch_notoc:
d4b87b1e 2906 . pla %r12,dest@pcrel
04bdff6a
AM
2907 . b dest
2908 ppc_stub_plt_branch_notoc:
2909 . lis %r11,(dest-1f)@highesta34
2910 . ori %r11,%r11,(dest-1f)@highera34
2911 . sldi %r11,%r11,34
d4b87b1e 2912 . 1: pla %r12,dest@pcrel
04bdff6a
AM
2913 . add %r12,%r11,%r12
2914 . mtctr %r12
2915 . bctr
2916 ppc_stub_plt_call_notoc:
2917 . lis %r11,(xxx-1f)@highesta34
2918 . ori %r11,%r11,(xxx-1f)@highera34
2919 . sldi %r11,%r11,34
d4b87b1e 2920 . 1: pla %r12,xxx@pcrel
04bdff6a
AM
2921 . ldx %r12,%r11,%r12
2922 . mtctr %r12
2923 . bctr
2924
05d0e962
AM
2925 In cases where the high instructions would add zero, they are
2926 omitted and following instructions modified in some cases.
04bdff6a
AM
2927 For example, a powerxx ppc_stub_plt_call_notoc might simplify down
2928 to
2929 . pld %r12,xxx@pcrel
2930 . mtctr %r12
2931 . bctr
05d0e962
AM
2932
2933 For a given stub group (a set of sections all using the same toc
2934 pointer value) there will be just one stub type used for any
2935 particular function symbol. For example, if printf is called from
2936 code with the tocsave optimization (ie. r2 saved in function
2937 prologue) and therefore calls use a ppc_stub_plt_call linkage stub,
2938 and from other code without the tocsave optimization requiring a
2939 ppc_stub_plt_call_r2save linkage stub, a single stub of the latter
2940 type will be created. Calls with the tocsave optimization will
2941 enter this stub after the instruction saving r2. A similar
2942 situation exists when calls are marked with R_PPC64_REL24_NOTOC
2943 relocations. These require a ppc_stub_plt_call_notoc linkage stub
2944 to call an external function like printf. If other calls to printf
2945 require a ppc_stub_plt_call linkage stub then a single
2946 ppc_stub_plt_call_notoc linkage stub will be used for both types of
2947 call. If other calls to printf require a ppc_stub_plt_call_r2save
2948 linkage stub then a single ppc_stub_plt_call_both linkage stub will
2949 be created and calls not requiring r2 to be saved will enter the
2950 stub after the r2 save instruction. There is an analogous
2951 hierarchy of long branch and plt branch stubs for local call
2952 linkage. */
721956f4 2953
2cdcc330
AM
2954enum ppc_stub_type
2955{
721956f4
AM
2956 ppc_stub_none,
2957 ppc_stub_long_branch,
ad8e1ba5 2958 ppc_stub_long_branch_r2off,
05d0e962
AM
2959 ppc_stub_long_branch_notoc,
2960 ppc_stub_long_branch_both, /* r2off and notoc variants both needed. */
721956f4 2961 ppc_stub_plt_branch,
ad8e1ba5 2962 ppc_stub_plt_branch_r2off,
05d0e962
AM
2963 ppc_stub_plt_branch_notoc,
2964 ppc_stub_plt_branch_both,
794e51c0 2965 ppc_stub_plt_call,
7341d5e2 2966 ppc_stub_plt_call_r2save,
05d0e962
AM
2967 ppc_stub_plt_call_notoc,
2968 ppc_stub_plt_call_both,
a4b6fadd
AM
2969 ppc_stub_global_entry,
2970 ppc_stub_save_res
721956f4
AM
2971};
2972
6f20ed8a
AM
2973/* Information on stub grouping. */
2974struct map_stub
2975{
2976 /* The stub section. */
2977 asection *stub_sec;
2978 /* This is the section to which stubs in the group will be attached. */
2979 asection *link_sec;
a4b6fadd
AM
2980 /* Next group. */
2981 struct map_stub *next;
2982 /* Whether to emit a copy of register save/restore functions in this
2983 group. */
2984 int needs_save_res;
df136d64
AM
2985 /* Current offset within stubs after the insn restoring lr in a
2986 _notoc or _both stub using bcl for pc-relative addressing, or
2987 after the insn restoring lr in a __tls_get_addr_opt plt stub. */
2988 unsigned int lr_restore;
2989 /* Accumulated size of EH info emitted to describe return address
2990 if stubs modify lr. Does not include 17 byte FDE header. */
2991 unsigned int eh_size;
2992 /* Offset in glink_eh_frame to the start of EH info for this group. */
2993 unsigned int eh_base;
6f20ed8a
AM
2994};
2995
2cdcc330
AM
2996struct ppc_stub_hash_entry
2997{
721956f4
AM
2998 /* Base hash table entry structure. */
2999 struct bfd_hash_entry root;
3000
ad8e1ba5
AM
3001 enum ppc_stub_type stub_type;
3002
6f20ed8a
AM
3003 /* Group information. */
3004 struct map_stub *group;
721956f4
AM
3005
3006 /* Offset within stub_sec of the beginning of this stub. */
3007 bfd_vma stub_offset;
3008
3009 /* Given the symbol's value and its section we can determine its final
3010 value when building the stubs (so the stub knows where to jump. */
3011 bfd_vma target_value;
3012 asection *target_section;
3013
721956f4
AM
3014 /* The symbol table entry, if any, that this was derived from. */
3015 struct ppc_link_hash_entry *h;
e054468f 3016 struct plt_entry *plt_ent;
721956f4 3017
2d7ad24e
AM
3018 /* Symbol type. */
3019 unsigned char symtype;
3020
6911b7dc
AM
3021 /* Symbol st_other. */
3022 unsigned char other;
721956f4
AM
3023};
3024
2cdcc330
AM
3025struct ppc_branch_hash_entry
3026{
721956f4
AM
3027 /* Base hash table entry structure. */
3028 struct bfd_hash_entry root;
3029
c456f082 3030 /* Offset within branch lookup table. */
721956f4
AM
3031 unsigned int offset;
3032
3033 /* Generation marker. */
3034 unsigned int iter;
3035};
65f38f15 3036
19e08130
AM
3037/* Used to track dynamic relocations for local symbols. */
3038struct ppc_dyn_relocs
3039{
3040 struct ppc_dyn_relocs *next;
3041
3042 /* The input section of the reloc. */
3043 asection *sec;
3044
3045 /* Total number of relocs copied for the input section. */
3046 unsigned int count : 31;
3047
3048 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3049 unsigned int ifunc : 1;
3050};
3051
65f38f15
AM
3052struct ppc_link_hash_entry
3053{
3054 struct elf_link_hash_entry elf;
3055
2cdcc330
AM
3056 union
3057 {
b3fac117
AM
3058 /* A pointer to the most recently used stub hash entry against this
3059 symbol. */
3060 struct ppc_stub_hash_entry *stub_cache;
3061
3062 /* A pointer to the next symbol starting with a '.' */
3063 struct ppc_link_hash_entry *next_dot_sym;
3064 } u;
721956f4 3065
65f38f15 3066 /* Track dynamic relocs copied for this symbol. */
6061a67d 3067 struct elf_dyn_relocs *dyn_relocs;
e86ce104 3068
721956f4 3069 /* Link between function code and descriptor symbols. */
34814b9f 3070 struct ppc_link_hash_entry *oh;
721956f4 3071
e86ce104
AM
3072 /* Flag function code and descriptor symbols. */
3073 unsigned int is_func:1;
3074 unsigned int is_func_descriptor:1;
908b32fc 3075 unsigned int fake:1;
411e1bfb 3076
c5614fa4
AM
3077 /* Whether global opd/toc sym has been adjusted or not.
3078 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3079 should be set for all globals defined in any opd/toc section. */
754021d0
AM
3080 unsigned int adjust_done:1;
3081
a4b6fadd
AM
3082 /* Set if this is an out-of-line register save/restore function,
3083 with non-standard calling convention. */
3084 unsigned int save_res:1;
3085
8b5f1ed8
AM
3086 /* Set if a duplicate symbol with non-zero localentry is detected,
3087 even when the duplicate symbol does not provide a definition. */
3088 unsigned int non_zero_localentry:1;
3089
411e1bfb 3090 /* Contexts in which symbol is used in the GOT (or TOC).
37da22e5
AM
3091 Bits are or'd into the mask as the corresponding relocs are
3092 encountered during check_relocs, with TLS_TLS being set when any
3093 of the other TLS bits are set. tls_optimize clears bits when
3094 optimizing to indicate the corresponding GOT entry type is not
3095 needed. If set, TLS_TLS is never cleared. tls_optimize may also
b00a0a86 3096 set TLS_GDIE when a GD reloc turns into an IE one.
37da22e5
AM
3097 These flags are also kept for local symbols. */
3098#define TLS_TLS 1 /* Any TLS reloc. */
3099#define TLS_GD 2 /* GD reloc. */
3100#define TLS_LD 4 /* LD reloc. */
3101#define TLS_TPREL 8 /* TPREL reloc, => IE. */
3102#define TLS_DTPREL 16 /* DTPREL reloc, => LD. */
3103#define TLS_MARK 32 /* __tls_get_addr call marked. */
b00a0a86 3104#define TLS_GDIE 64 /* GOT TPREL reloc resulting from GD->IE. */
46e9995a 3105#define TLS_EXPLICIT 256 /* TOC section TLS reloc, not stored. */
f961d9dd 3106 unsigned char tls_mask;
37da22e5
AM
3107
3108 /* The above field is also used to mark function symbols. In which
3109 case TLS_TLS will be 0. */
3110#define PLT_IFUNC 2 /* STT_GNU_IFUNC. */
2d7ad24e 3111#define PLT_KEEP 4 /* inline plt call requires plt entry. */
37da22e5 3112#define NON_GOT 256 /* local symbol plt, not stored. */
65f38f15
AM
3113};
3114
ed7007c1
AM
3115static inline struct ppc_link_hash_entry *
3116ppc_elf_hash_entry (struct elf_link_hash_entry *ent)
3117{
3118 return (struct ppc_link_hash_entry *) ent;
3119}
3120
65f38f15
AM
3121/* ppc64 ELF linker hash table. */
3122
3123struct ppc_link_hash_table
3124{
3125 struct elf_link_hash_table elf;
3126
721956f4
AM
3127 /* The stub hash table. */
3128 struct bfd_hash_table stub_hash_table;
3129
3130 /* Another hash table for plt_branch stubs. */
3131 struct bfd_hash_table branch_hash_table;
3132
3b421ab3
AM
3133 /* Hash table for function prologue tocsave. */
3134 htab_t tocsave_htab;
3135
e7d1c40c
AM
3136 /* Various options and other info passed from the linker. */
3137 struct ppc64_elf_params *params;
721956f4 3138
6f20ed8a
AM
3139 /* The size of sec_info below. */
3140 unsigned int sec_info_arr_size;
3141
3142 /* Per-section array of extra section info. Done this way rather
3143 than as part of ppc64_elf_section_data so we have the info for
3144 non-ppc64 sections. */
3145 struct
3146 {
3147 /* Along with elf_gp, specifies the TOC pointer used by this section. */
ad8e1ba5 3148 bfd_vma toc_off;
6f20ed8a
AM
3149
3150 union
3151 {
3152 /* The section group that this section belongs to. */
3153 struct map_stub *group;
3154 /* A temp section list pointer. */
3155 asection *list;
3156 } u;
3157 } *sec_info;
721956f4 3158
a4b6fadd
AM
3159 /* Linked list of groups. */
3160 struct map_stub *group;
3161
ad8e1ba5
AM
3162 /* Temp used when calculating TOC pointers. */
3163 bfd_vma toc_curr;
bf102f86
AM
3164 bfd *toc_bfd;
3165 asection *toc_first_sec;
ad8e1ba5 3166
b3fac117
AM
3167 /* Used when adding symbols. */
3168 struct ppc_link_hash_entry *dot_syms;
3169
33e44f2e 3170 /* Shortcuts to get to dynamic linker sections. */
4ce794b7 3171 asection *glink;
9e390558 3172 asection *global_entry;
82bd7b59 3173 asection *sfpr;
2d7ad24e
AM
3174 asection *pltlocal;
3175 asection *relpltlocal;
4ce794b7
AM
3176 asection *brlt;
3177 asection *relbrlt;
58d180e8 3178 asection *glink_eh_frame;
ec338859 3179
8387904d
AM
3180 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3181 struct ppc_link_hash_entry *tls_get_addr;
3182 struct ppc_link_hash_entry *tls_get_addr_fd;
9e7028aa
AM
3183 struct ppc_link_hash_entry *tga_desc;
3184 struct ppc_link_hash_entry *tga_desc_fd;
411e1bfb 3185
927be08e
AM
3186 /* The size of reliplt used by got entry relocs. */
3187 bfd_size_type got_reli_size;
3188
9b5ecbd0 3189 /* Statistics. */
7341d5e2 3190 unsigned long stub_count[ppc_stub_global_entry];
9b5ecbd0 3191
ee75fd95
AM
3192 /* Number of stubs against global syms. */
3193 unsigned long stub_globals;
3194
ee67d69a
AM
3195 /* Set if we're linking code with function descriptors. */
3196 unsigned int opd_abi:1;
3197
4c52953f 3198 /* Support for multiple toc sections. */
33c0ec9d 3199 unsigned int do_multi_toc:1;
4c52953f 3200 unsigned int multi_toc_needed:1;
927be08e 3201 unsigned int second_toc_pass:1;
67f0cbdb 3202 unsigned int do_toc_opt:1;
4c52953f 3203
9a23f96e
AM
3204 /* Set if tls optimization is enabled. */
3205 unsigned int do_tls_opt:1;
3206
3e04d765
AM
3207 /* Set if inline plt calls should be converted to direct calls. */
3208 unsigned int can_convert_all_inline_plt:1;
3209
5d1634d7 3210 /* Set on error. */
99877b66 3211 unsigned int stub_error:1;
721956f4 3212
8c5b4e52
AM
3213 /* Whether func_desc_adjust needs to be run over symbols. */
3214 unsigned int need_func_desc_adj:1;
721956f4 3215
82e66161
AM
3216 /* Whether there exist local gnu indirect function resolvers,
3217 referenced by dynamic relocations. */
3218 unsigned int local_ifunc_resolver:1;
3219 unsigned int maybe_local_ifunc_resolver:1;
3220
f378ab09
AM
3221 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
3222 unsigned int has_plt_localentry0:1;
3223
5663e321
AM
3224 /* Whether calls are made via the PLT from NOTOC functions. */
3225 unsigned int notoc_plt:1;
3226
04bdff6a
AM
3227 /* Whether to use powerxx instructions in linkage stubs. */
3228 unsigned int powerxx_stubs:1;
3229
721956f4
AM
3230 /* Incremented every time we size stubs. */
3231 unsigned int stub_iteration;
5d1634d7 3232
87d72d41
AM
3233 /* Small local sym cache. */
3234 struct sym_cache sym_cache;
65f38f15
AM
3235};
3236
4c52953f
AM
3237/* Rename some of the generic section flags to better document how they
3238 are used here. */
b0dddeec
AM
3239
3240/* Nonzero if this section has TLS related relocations. */
3241#define has_tls_reloc sec_flg0
3242
9737e8af
AM
3243/* Nonzero if this section has a call to __tls_get_addr lacking marker
3244 relocations. */
3245#define nomark_tls_get_addr sec_flg1
b0dddeec
AM
3246
3247/* Nonzero if this section has any toc or got relocs. */
3248#define has_toc_reloc sec_flg2
3249
3250/* Nonzero if this section has a call to another section that uses
3251 the toc or got. */
d77c8a4b 3252#define makes_toc_func_call sec_flg3
b0dddeec
AM
3253
3254/* Recursion protection when determining above flag. */
d77c8a4b 3255#define call_check_in_progress sec_flg4
70cc837d 3256#define call_check_done sec_flg5
4c52953f 3257
65f38f15
AM
3258/* Get the ppc64 ELF linker hash table from a link_info structure. */
3259
3260#define ppc_hash_table(p) \
4dfe6ac6
NC
3261 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3262 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
65f38f15 3263
721956f4
AM
3264#define ppc_stub_hash_lookup(table, string, create, copy) \
3265 ((struct ppc_stub_hash_entry *) \
3266 bfd_hash_lookup ((table), (string), (create), (copy)))
3267
3268#define ppc_branch_hash_lookup(table, string, create, copy) \
3269 ((struct ppc_branch_hash_entry *) \
3270 bfd_hash_lookup ((table), (string), (create), (copy)))
3271
3272/* Create an entry in the stub hash table. */
3273
3274static struct bfd_hash_entry *
4ce794b7
AM
3275stub_hash_newfunc (struct bfd_hash_entry *entry,
3276 struct bfd_hash_table *table,
3277 const char *string)
721956f4
AM
3278{
3279 /* Allocate the structure if it has not already been allocated by a
3280 subclass. */
3281 if (entry == NULL)
3282 {
3283 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3284 if (entry == NULL)
3285 return entry;
3286 }
3287
3288 /* Call the allocation method of the superclass. */
3289 entry = bfd_hash_newfunc (entry, table, string);
3290 if (entry != NULL)
3291 {
3292 struct ppc_stub_hash_entry *eh;
3293
3294 /* Initialize the local fields. */
3295 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 3296 eh->stub_type = ppc_stub_none;
6f20ed8a 3297 eh->group = NULL;
721956f4
AM
3298 eh->stub_offset = 0;
3299 eh->target_value = 0;
3300 eh->target_section = NULL;
721956f4 3301 eh->h = NULL;
6911b7dc 3302 eh->plt_ent = NULL;
6911b7dc 3303 eh->other = 0;
721956f4
AM
3304 }
3305
3306 return entry;
3307}
3308
3309/* Create an entry in the branch hash table. */
3310
3311static struct bfd_hash_entry *
4ce794b7
AM
3312branch_hash_newfunc (struct bfd_hash_entry *entry,
3313 struct bfd_hash_table *table,
3314 const char *string)
721956f4
AM
3315{
3316 /* Allocate the structure if it has not already been allocated by a
3317 subclass. */
3318 if (entry == NULL)
3319 {
3320 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3321 if (entry == NULL)
3322 return entry;
3323 }
3324
3325 /* Call the allocation method of the superclass. */
3326 entry = bfd_hash_newfunc (entry, table, string);
3327 if (entry != NULL)
3328 {
3329 struct ppc_branch_hash_entry *eh;
3330
3331 /* Initialize the local fields. */
3332 eh = (struct ppc_branch_hash_entry *) entry;
3333 eh->offset = 0;
3334 eh->iter = 0;
3335 }
3336
3337 return entry;
3338}
3339
65f38f15
AM
3340/* Create an entry in a ppc64 ELF linker hash table. */
3341
3342static struct bfd_hash_entry *
4ce794b7
AM
3343link_hash_newfunc (struct bfd_hash_entry *entry,
3344 struct bfd_hash_table *table,
3345 const char *string)
65f38f15
AM
3346{
3347 /* Allocate the structure if it has not already been allocated by a
3348 subclass. */
3349 if (entry == NULL)
3350 {
3351 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3352 if (entry == NULL)
3353 return entry;
3354 }
3355
3356 /* Call the allocation method of the superclass. */
3357 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3358 if (entry != NULL)
3359 {
3360 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3361
b3fac117 3362 memset (&eh->u.stub_cache, 0,
908b32fc 3363 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
3364 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3365
3366 /* When making function calls, old ABI code references function entry
3367 points (dot symbols), while new ABI code references the function
3368 descriptor symbol. We need to make any combination of reference and
3369 definition work together, without breaking archive linking.
3370
3371 For a defined function "foo" and an undefined call to "bar":
3372 An old object defines "foo" and ".foo", references ".bar" (possibly
3373 "bar" too).
3374 A new object defines "foo" and references "bar".
3375
3376 A new object thus has no problem with its undefined symbols being
3377 satisfied by definitions in an old object. On the other hand, the
3378 old object won't have ".bar" satisfied by a new object.
3379
3380 Keep a list of newly added dot-symbols. */
3381
3382 if (string[0] == '.')
3383 {
3384 struct ppc_link_hash_table *htab;
3385
3386 htab = (struct ppc_link_hash_table *) table;
3387 eh->u.next_dot_sym = htab->dot_syms;
3388 htab->dot_syms = eh;
3389 }
65f38f15
AM
3390 }
3391
3392 return entry;
3393}
3394
2cdcc330
AM
3395struct tocsave_entry
3396{
3b421ab3
AM
3397 asection *sec;
3398 bfd_vma offset;
3399};
3400
3401static hashval_t
3402tocsave_htab_hash (const void *p)
3403{
3404 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4aef7643 3405 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
3b421ab3
AM
3406}
3407
3408static int
3409tocsave_htab_eq (const void *p1, const void *p2)
3410{
3411 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
3412 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
3413 return e1->sec == e2->sec && e1->offset == e2->offset;
3414}
3415
68faa637
AM
3416/* Destroy a ppc64 ELF linker hash table. */
3417
3418static void
d495ab0d 3419ppc64_elf_link_hash_table_free (bfd *obfd)
68faa637 3420{
d495ab0d 3421 struct ppc_link_hash_table *htab;
68faa637 3422
d495ab0d 3423 htab = (struct ppc_link_hash_table *) obfd->link.hash;
68faa637
AM
3424 if (htab->tocsave_htab)
3425 htab_delete (htab->tocsave_htab);
d495ab0d
AM
3426 bfd_hash_table_free (&htab->branch_hash_table);
3427 bfd_hash_table_free (&htab->stub_hash_table);
3428 _bfd_elf_link_hash_table_free (obfd);
68faa637
AM
3429}
3430
65f38f15
AM
3431/* Create a ppc64 ELF linker hash table. */
3432
3433static struct bfd_link_hash_table *
4ce794b7 3434ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
3435{
3436 struct ppc_link_hash_table *htab;
3437 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3438
4ce794b7 3439 htab = bfd_zmalloc (amt);
65f38f15
AM
3440 if (htab == NULL)
3441 return NULL;
3442
66eb6687 3443 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
3444 sizeof (struct ppc_link_hash_entry),
3445 PPC64_ELF_DATA))
65f38f15 3446 {
e2d34d7d 3447 free (htab);
65f38f15
AM
3448 return NULL;
3449 }
3450
721956f4 3451 /* Init the stub hash table too. */
66eb6687
AM
3452 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
3453 sizeof (struct ppc_stub_hash_entry)))
2915c55b 3454 {
d495ab0d 3455 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3456 return NULL;
3457 }
721956f4
AM
3458
3459 /* And the branch hash table. */
66eb6687
AM
3460 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
3461 sizeof (struct ppc_branch_hash_entry)))
2915c55b
JK
3462 {
3463 bfd_hash_table_free (&htab->stub_hash_table);
d495ab0d 3464 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3465 return NULL;
3466 }
721956f4 3467
3b421ab3
AM
3468 htab->tocsave_htab = htab_try_create (1024,
3469 tocsave_htab_hash,
3470 tocsave_htab_eq,
3471 NULL);
3472 if (htab->tocsave_htab == NULL)
2915c55b 3473 {
d495ab0d 3474 ppc64_elf_link_hash_table_free (abfd);
2915c55b
JK
3475 return NULL;
3476 }
d495ab0d 3477 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
3b421ab3 3478
3254fd24
AM
3479 /* Initializing two fields of the union is just cosmetic. We really
3480 only care about glist, but when compiled on a 32-bit host the
3481 bfd_vma fields are larger. Setting the bfd_vma to zero makes
3482 debugger inspection of these fields look nicer. */
a6aa5195
AM
3483 htab->elf.init_got_refcount.refcount = 0;
3484 htab->elf.init_got_refcount.glist = NULL;
3485 htab->elf.init_plt_refcount.refcount = 0;
3486 htab->elf.init_plt_refcount.glist = NULL;
3487 htab->elf.init_got_offset.offset = 0;
3488 htab->elf.init_got_offset.glist = NULL;
3489 htab->elf.init_plt_offset.offset = 0;
3490 htab->elf.init_plt_offset.glist = NULL;
3254fd24 3491
65f38f15
AM
3492 return &htab->elf.root;
3493}
3494
bfeb4a28
AM
3495/* Create sections for linker generated code. */
3496
3497static bfd_boolean
3498create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3499{
3500 struct ppc_link_hash_table *htab;
3501 flagword flags;
3502
3503 htab = ppc_hash_table (info);
3504
bfeb4a28
AM
3505 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3506 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
b32547cd
AM
3507 if (htab->params->save_restore_funcs)
3508 {
3509 /* Create .sfpr for code to save and restore fp regs. */
3510 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
3511 flags);
3512 if (htab->sfpr == NULL
fd361982 3513 || !bfd_set_section_alignment (htab->sfpr, 2))
b32547cd
AM
3514 return FALSE;
3515 }
3516
3517 if (bfd_link_relocatable (info))
3518 return TRUE;
bfeb4a28
AM
3519
3520 /* Create .glink for lazy dynamic linking support. */
3521 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3522 flags);
3523 if (htab->glink == NULL
fd361982 3524 || !bfd_set_section_alignment (htab->glink, 3))
bfeb4a28
AM
3525 return FALSE;
3526
9e390558
AM
3527 /* The part of .glink used by global entry stubs, separate so that
3528 it can be aligned appropriately without affecting htab->glink. */
3529 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3530 flags);
3531 if (htab->global_entry == NULL
fd361982 3532 || !bfd_set_section_alignment (htab->global_entry, 2))
9e390558
AM
3533 return FALSE;
3534
bfeb4a28
AM
3535 if (!info->no_ld_generated_unwind_info)
3536 {
3537 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
3538 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3539 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
3540 ".eh_frame",
3541 flags);
3542 if (htab->glink_eh_frame == NULL
fd361982 3543 || !bfd_set_section_alignment (htab->glink_eh_frame, 2))
bfeb4a28
AM
3544 return FALSE;
3545 }
3546
3547 flags = SEC_ALLOC | SEC_LINKER_CREATED;
33e44f2e
AM
3548 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
3549 if (htab->elf.iplt == NULL
fd361982 3550 || !bfd_set_section_alignment (htab->elf.iplt, 3))
bfeb4a28
AM
3551 return FALSE;
3552
3553 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3554 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
33e44f2e
AM
3555 htab->elf.irelplt
3556 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
3557 if (htab->elf.irelplt == NULL
fd361982 3558 || !bfd_set_section_alignment (htab->elf.irelplt, 3))
bfeb4a28
AM
3559 return FALSE;
3560
3561 /* Create branch lookup table for plt_branch stubs. */
3562 flags = (SEC_ALLOC | SEC_LOAD
3563 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3564 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3565 flags);
3566 if (htab->brlt == NULL
fd361982 3567 || !bfd_set_section_alignment (htab->brlt, 3))
bfeb4a28
AM
3568 return FALSE;
3569
2d7ad24e
AM
3570 /* Local plt entries, put in .branch_lt but a separate section for
3571 convenience. */
3572 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3573 flags);
3574 if (htab->pltlocal == NULL
fd361982 3575 || !bfd_set_section_alignment (htab->pltlocal, 3))
2d7ad24e
AM
3576 return FALSE;
3577
0e1862bb 3578 if (!bfd_link_pic (info))
bfeb4a28
AM
3579 return TRUE;
3580
3581 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3582 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2d7ad24e
AM
3583 htab->relbrlt
3584 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
bfeb4a28 3585 if (htab->relbrlt == NULL
fd361982 3586 || !bfd_set_section_alignment (htab->relbrlt, 3))
bfeb4a28
AM
3587 return FALSE;
3588
2d7ad24e
AM
3589 htab->relpltlocal
3590 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
3591 if (htab->relpltlocal == NULL
fd361982 3592 || !bfd_set_section_alignment (htab->relpltlocal, 3))
2d7ad24e
AM
3593 return FALSE;
3594
bfeb4a28
AM
3595 return TRUE;
3596}
3597
e717da7e
AM
3598/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
3599
bfeb4a28 3600bfd_boolean
e7d1c40c
AM
3601ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
3602 struct ppc64_elf_params *params)
e717da7e
AM
3603{
3604 struct ppc_link_hash_table *htab;
3605
e7d1c40c 3606 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
e717da7e
AM
3607
3608/* Always hook our dynamic sections into the first bfd, which is the
3609 linker created stub bfd. This ensures that the GOT header is at
3610 the start of the output TOC section. */
3611 htab = ppc_hash_table (info);
e7d1c40c
AM
3612 htab->elf.dynobj = params->stub_bfd;
3613 htab->params = params;
bfeb4a28 3614
bfeb4a28 3615 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
3616}
3617
721956f4
AM
3618/* Build a name for an entry in the stub hash table. */
3619
3620static char *
4ce794b7
AM
3621ppc_stub_name (const asection *input_section,
3622 const asection *sym_sec,
3623 const struct ppc_link_hash_entry *h,
3624 const Elf_Internal_Rela *rel)
721956f4
AM
3625{
3626 char *stub_name;
bcaa2f82 3627 ssize_t len;
721956f4
AM
3628
3629 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3630 offsets from a sym as a branch target? In fact, we could
3631 probably assume the addend is always zero. */
3632 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3633
3634 if (h)
3635 {
3636 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3637 stub_name = bfd_malloc (len);
46de2a7c
AM
3638 if (stub_name == NULL)
3639 return stub_name;
3640
bcaa2f82
AM
3641 len = sprintf (stub_name, "%08x.%s+%x",
3642 input_section->id & 0xffffffff,
3643 h->elf.root.root.string,
3644 (int) rel->r_addend & 0xffffffff);
721956f4
AM
3645 }
3646 else
3647 {
ad8e1ba5 3648 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 3649 stub_name = bfd_malloc (len);
46de2a7c
AM
3650 if (stub_name == NULL)
3651 return stub_name;
3652
bcaa2f82
AM
3653 len = sprintf (stub_name, "%08x.%x:%x+%x",
3654 input_section->id & 0xffffffff,
3655 sym_sec->id & 0xffffffff,
3656 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3657 (int) rel->r_addend & 0xffffffff);
721956f4 3658 }
bcaa2f82 3659 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 3660 stub_name[len - 2] = 0;
721956f4
AM
3661 return stub_name;
3662}
3663
3664/* Look up an entry in the stub hash. Stub entries are cached because
3665 creating the stub name takes a bit of time. */
3666
3667static struct ppc_stub_hash_entry *
4ce794b7
AM
3668ppc_get_stub_entry (const asection *input_section,
3669 const asection *sym_sec,
039b3fef 3670 struct ppc_link_hash_entry *h,
4ce794b7
AM
3671 const Elf_Internal_Rela *rel,
3672 struct ppc_link_hash_table *htab)
721956f4
AM
3673{
3674 struct ppc_stub_hash_entry *stub_entry;
6f20ed8a 3675 struct map_stub *group;
721956f4
AM
3676
3677 /* If this input section is part of a group of sections sharing one
3678 stub section, then use the id of the first section in the group.
3679 Stub names need to include a section id, as there may well be
3680 more than one stub used to reach say, printf, and we need to
3681 distinguish between them. */
6f20ed8a 3682 group = htab->sec_info[input_section->id].u.group;
89d77b8a
AM
3683 if (group == NULL)
3684 return NULL;
721956f4 3685
b3fac117
AM
3686 if (h != NULL && h->u.stub_cache != NULL
3687 && h->u.stub_cache->h == h
6f20ed8a 3688 && h->u.stub_cache->group == group)
721956f4 3689 {
b3fac117 3690 stub_entry = h->u.stub_cache;
721956f4
AM
3691 }
3692 else
3693 {
3694 char *stub_name;
3695
6f20ed8a 3696 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
721956f4
AM
3697 if (stub_name == NULL)
3698 return NULL;
3699
3700 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 3701 stub_name, FALSE, FALSE);
721956f4 3702 if (h != NULL)
b3fac117 3703 h->u.stub_cache = stub_entry;
721956f4
AM
3704
3705 free (stub_name);
3706 }
3707
3708 return stub_entry;
3709}
3710
3711/* Add a new stub entry to the stub hash. Not all fields of the new
3712 stub entry are initialised. */
3713
3714static struct ppc_stub_hash_entry *
4ce794b7
AM
3715ppc_add_stub (const char *stub_name,
3716 asection *section,
25f53a85 3717 struct bfd_link_info *info)
721956f4 3718{
25f53a85 3719 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 3720 struct map_stub *group;
721956f4
AM
3721 asection *link_sec;
3722 asection *stub_sec;
3723 struct ppc_stub_hash_entry *stub_entry;
3724
6f20ed8a
AM
3725 group = htab->sec_info[section->id].u.group;
3726 link_sec = group->link_sec;
3727 stub_sec = group->stub_sec;
721956f4
AM
3728 if (stub_sec == NULL)
3729 {
6f20ed8a
AM
3730 size_t namelen;
3731 bfd_size_type len;
3732 char *s_name;
721956f4 3733
6f20ed8a
AM
3734 namelen = strlen (link_sec->name);
3735 len = namelen + sizeof (STUB_SUFFIX);
3736 s_name = bfd_alloc (htab->params->stub_bfd, len);
3737 if (s_name == NULL)
3738 return NULL;
721956f4 3739
6f20ed8a
AM
3740 memcpy (s_name, link_sec->name, namelen);
3741 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3742 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
3743 if (stub_sec == NULL)
3744 return NULL;
3745 group->stub_sec = stub_sec;
721956f4
AM
3746 }
3747
3748 /* Enter this entry into the linker stub hash table. */
3749 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 3750 TRUE, FALSE);
721956f4
AM
3751 if (stub_entry == NULL)
3752 {
695344c0 3753 /* xgettext:c-format */
cf97bcb0
AM
3754 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
3755 section->owner, stub_name);
721956f4
AM
3756 return NULL;
3757 }
3758
6f20ed8a 3759 stub_entry->group = group;
721956f4 3760 stub_entry->stub_offset = 0;
721956f4
AM
3761 return stub_entry;
3762}
3763
e717da7e
AM
3764/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3765 not already done. */
65f38f15 3766
b34976b6 3767static bfd_boolean
e717da7e 3768create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 3769{
e717da7e
AM
3770 asection *got, *relgot;
3771 flagword flags;
3772 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 3773
0c8d6e5c 3774 if (!is_ppc64_elf (abfd))
0ffa91dd 3775 return FALSE;
4dfe6ac6
NC
3776 if (htab == NULL)
3777 return FALSE;
0ffa91dd 3778
33e44f2e
AM
3779 if (!htab->elf.sgot
3780 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
3781 return FALSE;
e717da7e
AM
3782
3783 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3784 | SEC_LINKER_CREATED);
3785
c456f082 3786 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 3787 if (!got
fd361982 3788 || !bfd_set_section_alignment (got, 3))
e717da7e 3789 return FALSE;
65f38f15 3790
c456f082
AM
3791 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
3792 flags | SEC_READONLY);
e717da7e 3793 if (!relgot
fd361982 3794 || !bfd_set_section_alignment (relgot, 3))
b34976b6 3795 return FALSE;
e717da7e
AM
3796
3797 ppc64_elf_tdata (abfd)->got = got;
3798 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 3799 return TRUE;
65f38f15 3800}
5bd4f169 3801
b31867b6
AM
3802/* Follow indirect and warning symbol links. */
3803
3804static inline struct bfd_link_hash_entry *
3805follow_link (struct bfd_link_hash_entry *h)
3806{
3807 while (h->type == bfd_link_hash_indirect
3808 || h->type == bfd_link_hash_warning)
3809 h = h->u.i.link;
3810 return h;
3811}
3812
3813static inline struct elf_link_hash_entry *
3814elf_follow_link (struct elf_link_hash_entry *h)
3815{
3816 return (struct elf_link_hash_entry *) follow_link (&h->root);
3817}
3818
3819static inline struct ppc_link_hash_entry *
3820ppc_follow_link (struct ppc_link_hash_entry *h)
3821{
ed7007c1 3822 return ppc_elf_hash_entry (elf_follow_link (&h->elf));
b31867b6
AM
3823}
3824
40d16e0b
AM
3825/* Merge PLT info on FROM with that on TO. */
3826
3827static void
3828move_plt_plist (struct ppc_link_hash_entry *from,
3829 struct ppc_link_hash_entry *to)
3830{
3831 if (from->elf.plt.plist != NULL)
3832 {
3833 if (to->elf.plt.plist != NULL)
3834 {
3835 struct plt_entry **entp;
3836 struct plt_entry *ent;
3837
3838 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
3839 {
3840 struct plt_entry *dent;
3841
3842 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
3843 if (dent->addend == ent->addend)
3844 {
3845 dent->plt.refcount += ent->plt.refcount;
3846 *entp = ent->next;
3847 break;
3848 }
3849 if (dent == NULL)
3850 entp = &ent->next;
3851 }
3852 *entp = to->elf.plt.plist;
3853 }
3854
3855 to->elf.plt.plist = from->elf.plt.plist;
3856 from->elf.plt.plist = NULL;
3857 }
3858}
3859
65f38f15
AM
3860/* Copy the extra info we tack onto an elf_link_hash_entry. */
3861
3862static void
fcfa13d2
AM
3863ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
3864 struct elf_link_hash_entry *dir,
3865 struct elf_link_hash_entry *ind)
65f38f15
AM
3866{
3867 struct ppc_link_hash_entry *edir, *eind;
3868
ed7007c1
AM
3869 edir = ppc_elf_hash_entry (dir);
3870 eind = ppc_elf_hash_entry (ind);
65f38f15 3871
c79d6685
AM
3872 edir->is_func |= eind->is_func;
3873 edir->is_func_descriptor |= eind->is_func_descriptor;
3874 edir->tls_mask |= eind->tls_mask;
3875 if (eind->oh != NULL)
3876 edir->oh = ppc_follow_link (eind->oh);
3877
474436e6 3878 if (edir->elf.versioned != versioned_hidden)
e81830c5
AM
3879 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
3880 edir->elf.ref_regular |= eind->elf.ref_regular;
3881 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4a7e5234 3882 edir->elf.non_got_ref |= eind->elf.non_got_ref;
e81830c5
AM
3883 edir->elf.needs_plt |= eind->elf.needs_plt;
3884 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
c79d6685 3885
d311bc8b
AM
3886 /* If we were called to copy over info for a weak sym, don't copy
3887 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
3888 in order to simplify readonly_dynrelocs and save a field in the
3889 symbol hash entry, but that means dyn_relocs can't be used in any
3890 tests about a specific symbol, or affect other symbol flags which
ab2477e1 3891 are then tested. */
d311bc8b 3892 if (eind->elf.root.type != bfd_link_hash_indirect)
ab2477e1 3893 return;
d311bc8b 3894
411e1bfb 3895 /* Copy over any dynamic relocs we may have on the indirect sym. */
bbd7ec4a 3896 if (eind->dyn_relocs != NULL)
65f38f15 3897 {
bbd7ec4a
AM
3898 if (edir->dyn_relocs != NULL)
3899 {
6061a67d
AM
3900 struct elf_dyn_relocs **pp;
3901 struct elf_dyn_relocs *p;
bbd7ec4a 3902
fcfa13d2 3903 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a
AM
3904 list. Merge any entries against the same section. */
3905 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3906 {
6061a67d 3907 struct elf_dyn_relocs *q;
bbd7ec4a
AM
3908
3909 for (q = edir->dyn_relocs; q != NULL; q = q->next)
3910 if (q->sec == p->sec)
3911 {
3912 q->pc_count += p->pc_count;
3913 q->count += p->count;
3914 *pp = p->next;
3915 break;
3916 }
3917 if (q == NULL)
3918 pp = &p->next;
3919 }
3920 *pp = edir->dyn_relocs;
3921 }
3922
65f38f15
AM
3923 edir->dyn_relocs = eind->dyn_relocs;
3924 eind->dyn_relocs = NULL;
3925 }
65f38f15 3926
81848ca0
AM
3927 /* Copy over got entries that we may have already seen to the
3928 symbol which just became indirect. */
411e1bfb
AM
3929 if (eind->elf.got.glist != NULL)
3930 {
3931 if (edir->elf.got.glist != NULL)
3932 {
3933 struct got_entry **entp;
3934 struct got_entry *ent;
3935
3936 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3937 {
3938 struct got_entry *dent;
3939
3940 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3941 if (dent->addend == ent->addend
e717da7e 3942 && dent->owner == ent->owner
411e1bfb
AM
3943 && dent->tls_type == ent->tls_type)
3944 {
3945 dent->got.refcount += ent->got.refcount;
3946 *entp = ent->next;
3947 break;
3948 }
3949 if (dent == NULL)
3950 entp = &ent->next;
3951 }
3952 *entp = edir->elf.got.glist;
3953 }
3954
3955 edir->elf.got.glist = eind->elf.got.glist;
3956 eind->elf.got.glist = NULL;
3957 }
3958
3959 /* And plt entries. */
40d16e0b 3960 move_plt_plist (eind, edir);
411e1bfb 3961
fcfa13d2 3962 if (eind->elf.dynindx != -1)
411e1bfb 3963 {
fcfa13d2
AM
3964 if (edir->elf.dynindx != -1)
3965 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3966 edir->elf.dynstr_index);
411e1bfb
AM
3967 edir->elf.dynindx = eind->elf.dynindx;
3968 edir->elf.dynstr_index = eind->elf.dynstr_index;
3969 eind->elf.dynindx = -1;
3970 eind->elf.dynstr_index = 0;
3971 }
411e1bfb
AM
3972}
3973
8387904d
AM
3974/* Find the function descriptor hash entry from the given function code
3975 hash entry FH. Link the entries via their OH fields. */
3976
3977static struct ppc_link_hash_entry *
b31867b6 3978lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
3979{
3980 struct ppc_link_hash_entry *fdh = fh->oh;
3981
3982 if (fdh == NULL)
3983 {
3984 const char *fd_name = fh->elf.root.root.string + 1;
3985
ed7007c1
AM
3986 fdh = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, fd_name,
3987 FALSE, FALSE, FALSE));
b31867b6
AM
3988 if (fdh == NULL)
3989 return fdh;
3990
3991 fdh->is_func_descriptor = 1;
3992 fdh->oh = fh;
3993 fh->is_func = 1;
3994 fh->oh = fdh;
8387904d
AM
3995 }
3996
8c5b4e52
AM
3997 fdh = ppc_follow_link (fdh);
3998 fdh->is_func_descriptor = 1;
3999 fdh->oh = fh;
4000 return fdh;
8387904d
AM
4001}
4002
8c5b4e52 4003/* Make a fake function descriptor sym for the undefined code sym FH. */
bb700d78
AM
4004
4005static struct ppc_link_hash_entry *
4006make_fdh (struct bfd_link_info *info,
908b32fc 4007 struct ppc_link_hash_entry *fh)
bb700d78 4008{
8c5b4e52
AM
4009 bfd *abfd = fh->elf.root.u.undef.abfd;
4010 struct bfd_link_hash_entry *bh = NULL;
bb700d78 4011 struct ppc_link_hash_entry *fdh;
8c5b4e52
AM
4012 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4013 ? BSF_WEAK
4014 : BSF_GLOBAL);
4015
4016 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4017 fh->elf.root.root.string + 1,
4018 flags, bfd_und_section_ptr, 0,
4019 NULL, FALSE, FALSE, &bh))
bb700d78
AM
4020 return NULL;
4021
4022 fdh = (struct ppc_link_hash_entry *) bh;
4023 fdh->elf.non_elf = 0;
908b32fc
AM
4024 fdh->fake = 1;
4025 fdh->is_func_descriptor = 1;
4026 fdh->oh = fh;
4027 fh->is_func = 1;
4028 fh->oh = fdh;
bb700d78
AM
4029 return fdh;
4030}
4031
8387904d
AM
4032/* Fix function descriptor symbols defined in .opd sections to be
4033 function type. */
555cd476
AM
4034
4035static bfd_boolean
c16153ae 4036ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 4037 struct bfd_link_info *info,
555cd476 4038 Elf_Internal_Sym *isym,
6911b7dc 4039 const char **name,
555cd476
AM
4040 flagword *flags ATTRIBUTE_UNUSED,
4041 asection **sec,
b53dfeb2 4042 bfd_vma *value)
555cd476 4043{
b53dfeb2 4044 if (*sec != NULL
f1885d1e 4045 && strcmp ((*sec)->name, ".opd") == 0)
b53dfeb2
AM
4046 {
4047 asection *code_sec;
4048
4049 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4050 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4051 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4052
4053 /* If the symbol is a function defined in .opd, and the function
4054 code is in a discarded group, let it appear to be undefined. */
0e1862bb 4055 if (!bfd_link_relocatable (info)
b53dfeb2
AM
4056 && (*sec)->reloc_count != 0
4057 && opd_entry_value (*sec, *value, &code_sec, NULL,
4058 FALSE) != (bfd_vma) -1
4059 && discarded_section (code_sec))
4060 {
4061 *sec = bfd_und_section_ptr;
4062 isym->st_shndx = SHN_UNDEF;
4063 }
4064 }
dbd1e97e
AM
4065 else if (*sec != NULL
4066 && strcmp ((*sec)->name, ".toc") == 0
4067 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4068 {
4069 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4070 if (htab != NULL)
4071 htab->params->object_in_toc = 1;
4072 }
433817dd 4073
6911b7dc
AM
4074 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4075 {
4076 if (abiversion (ibfd) == 0)
4077 set_abiversion (ibfd, 2);
4078 else if (abiversion (ibfd) == 1)
4079 {
cf97bcb0
AM
4080 _bfd_error_handler (_("symbol '%s' has invalid st_other"
4081 " for ABI version 1"), *name);
6911b7dc
AM
4082 bfd_set_error (bfd_error_bad_value);
4083 return FALSE;
4084 }
4085 }
4086
555cd476
AM
4087 return TRUE;
4088}
4089
6911b7dc
AM
4090/* Merge non-visibility st_other attributes: local entry point. */
4091
4092static void
4093ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4094 const Elf_Internal_Sym *isym,
4095 bfd_boolean definition,
4096 bfd_boolean dynamic)
4097{
f378ab09 4098 if (definition && (!dynamic || !h->def_regular))
6911b7dc
AM
4099 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4100 | ELF_ST_VISIBILITY (h->other));
4101}
4102
8c5b4e52
AM
4103/* Hook called on merging a symbol. We use this to clear "fake" since
4104 we now have a real symbol. */
4105
4106static bfd_boolean
4107ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
8b5f1ed8 4108 const Elf_Internal_Sym *isym,
8c5b4e52
AM
4109 asection **psec ATTRIBUTE_UNUSED,
4110 bfd_boolean newdef ATTRIBUTE_UNUSED,
4111 bfd_boolean olddef ATTRIBUTE_UNUSED,
4112 bfd *oldbfd ATTRIBUTE_UNUSED,
4113 const asection *oldsec ATTRIBUTE_UNUSED)
4114{
ed7007c1 4115 ppc_elf_hash_entry (h)->fake = 0;
8b5f1ed8 4116 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
ed7007c1 4117 ppc_elf_hash_entry (h)->non_zero_localentry = 1;
8c5b4e52
AM
4118 return TRUE;
4119}
4120
8387904d 4121/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
4122 inclusion of a new ABI object archive that defines "bar".
4123 NAME is a symbol defined in an archive. Return a symbol in the hash
4124 table that might be satisfied by the archive symbols. */
8387904d
AM
4125
4126static struct elf_link_hash_entry *
4127ppc64_elf_archive_symbol_lookup (bfd *abfd,
4128 struct bfd_link_info *info,
4129 const char *name)
4130{
4131 struct elf_link_hash_entry *h;
4132 char *dot_name;
4133 size_t len;
4134
4135 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
4136 if (h != NULL
4137 /* Don't return this sym if it is a fake function descriptor
4138 created by add_symbol_adjust. */
ed7007c1 4139 && !ppc_elf_hash_entry (h)->fake)
8387904d
AM
4140 return h;
4141
4142 if (name[0] == '.')
4143 return h;
4144
4145 len = strlen (name);
4146 dot_name = bfd_alloc (abfd, len + 2);
4147 if (dot_name == NULL)
e99955cd 4148 return (struct elf_link_hash_entry *) -1;
8387904d
AM
4149 dot_name[0] = '.';
4150 memcpy (dot_name + 1, name, len + 1);
4151 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4152 bfd_release (abfd, dot_name);
4153 return h;
4154}
4155
4156/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
4157 new ABI object defines "bar". Well, at least, undefined dot symbols
4158 are made weak. This stops later archive searches from including an
4159 object if we already have a function descriptor definition. It also
35b0ce59
AM
4160 prevents the linker complaining about undefined symbols.
4161 We also check and correct mismatched symbol visibility here. The
4162 most restrictive visibility of the function descriptor and the
4163 function entry symbol is used. */
8387904d
AM
4164
4165static bfd_boolean
b3fac117 4166add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 4167{
8387904d
AM
4168 struct ppc_link_hash_table *htab;
4169 struct ppc_link_hash_entry *fdh;
4170
b3fac117
AM
4171 if (eh->elf.root.type == bfd_link_hash_warning)
4172 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 4173
8400d40d
AM
4174 if (eh->elf.root.type == bfd_link_hash_indirect)
4175 return TRUE;
4176
b3fac117
AM
4177 if (eh->elf.root.root.string[0] != '.')
4178 abort ();
8387904d 4179
b3fac117 4180 htab = ppc_hash_table (info);
4dfe6ac6
NC
4181 if (htab == NULL)
4182 return FALSE;
4183
b31867b6 4184 fdh = lookup_fdh (eh, htab);
8c5b4e52
AM
4185 if (fdh == NULL
4186 && !bfd_link_relocatable (info)
4187 && (eh->elf.root.type == bfd_link_hash_undefined
4188 || eh->elf.root.type == bfd_link_hash_undefweak)
4189 && eh->elf.ref_regular)
4190 {
4191 /* Make an undefined function descriptor sym, in order to
4192 pull in an --as-needed shared lib. Archives are handled
4193 elsewhere. */
4194 fdh = make_fdh (info, eh);
4195 if (fdh == NULL)
4196 return FALSE;
bb700d78 4197 }
8c5b4e52
AM
4198
4199 if (fdh != NULL)
8387904d 4200 {
35b0ce59
AM
4201 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4202 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
8c5b4e52
AM
4203
4204 /* Make both descriptor and entry symbol have the most
4205 constraining visibility of either symbol. */
35b0ce59
AM
4206 if (entry_vis < descr_vis)
4207 fdh->elf.other += entry_vis - descr_vis;
4208 else if (entry_vis > descr_vis)
4209 eh->elf.other += descr_vis - entry_vis;
4210
8c5b4e52
AM
4211 /* Propagate reference flags from entry symbol to function
4212 descriptor symbol. */
bc4e12de 4213 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
4070765b 4214 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
8c5b4e52
AM
4215 fdh->elf.ref_regular |= eh->elf.ref_regular;
4216 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
4217
4218 if (!fdh->elf.forced_local
4219 && fdh->elf.dynindx == -1
4220 && fdh->elf.versioned != versioned_hidden
4221 && (bfd_link_dll (info)
4222 || fdh->elf.def_dynamic
4223 || fdh->elf.ref_dynamic)
4224 && (eh->elf.ref_regular
4225 || eh->elf.def_regular))
4226 {
2cdcc330 4227 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
8c5b4e52 4228 return FALSE;
35b0ce59 4229 }
8387904d 4230 }
99877b66 4231
8387904d
AM
4232 return TRUE;
4233}
4234
f6c7c3e8
AM
4235/* Set up opd section info and abiversion for IBFD, and process list
4236 of dot-symbols we made in link_hash_newfunc. */
b3fac117 4237
8387904d 4238static bfd_boolean
f6c7c3e8 4239ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
8387904d 4240{
99877b66 4241 struct ppc_link_hash_table *htab;
b3fac117 4242 struct ppc_link_hash_entry **p, *eh;
459609d6 4243 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
433817dd 4244
459609d6 4245 if (opd != NULL && opd->size != 0)
b3fac117 4246 {
b9399fcf
AM
4247 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
4248 ppc64_elf_section_data (opd)->sec_type = sec_opd;
4249
459609d6
AM
4250 if (abiversion (ibfd) == 0)
4251 set_abiversion (ibfd, 1);
8a2058b5 4252 else if (abiversion (ibfd) >= 2)
f6c7c3e8 4253 {
695344c0 4254 /* xgettext:c-format */
cf97bcb0
AM
4255 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"),
4256 ibfd, abiversion (ibfd));
459609d6
AM
4257 bfd_set_error (bfd_error_bad_value);
4258 return FALSE;
f6c7c3e8 4259 }
b9399fcf 4260 }
f6c7c3e8 4261
b9399fcf
AM
4262 if (is_ppc64_elf (info->output_bfd))
4263 {
4264 /* For input files without an explicit abiversion in e_flags
4265 we should have flagged any with symbol st_other bits set
4266 as ELFv1 and above flagged those with .opd as ELFv2.
4267 Set the output abiversion if not yet set, and for any input
4268 still ambiguous, take its abiversion from the output.
4269 Differences in ABI are reported later. */
4270 if (abiversion (info->output_bfd) == 0)
4271 set_abiversion (info->output_bfd, abiversion (ibfd));
4272 else if (abiversion (ibfd) == 0)
4273 set_abiversion (ibfd, abiversion (info->output_bfd));
b3fac117
AM
4274 }
4275
459609d6
AM
4276 htab = ppc_hash_table (info);
4277 if (htab == NULL)
b9399fcf 4278 return TRUE;
459609d6 4279
b9399fcf
AM
4280 if (opd != NULL && opd->size != 0
4281 && (ibfd->flags & DYNAMIC) == 0
4282 && (opd->flags & SEC_RELOC) != 0
4283 && opd->reloc_count != 0
4284 && !bfd_is_abs_section (opd->output_section)
4285 && info->gc_sections)
4286 {
4287 /* Garbage collection needs some extra help with .opd sections.
4288 We don't want to necessarily keep everything referenced by
4289 relocs in .opd, as that would keep all functions. Instead,
4290 if we reference an .opd symbol (a function descriptor), we
4291 want to keep the function code symbol's section. This is
4292 easy for global symbols, but for local syms we need to keep
4293 information about the associated function section. */
4294 bfd_size_type amt;
4295 asection **opd_sym_map;
4296 Elf_Internal_Shdr *symtab_hdr;
4297 Elf_Internal_Rela *relocs, *rel_end, *rel;
4298
4299 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
4300 opd_sym_map = bfd_zalloc (ibfd, amt);
4301 if (opd_sym_map == NULL)
4302 return FALSE;
4303 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
4304 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
4305 info->keep_memory);
4306 if (relocs == NULL)
4307 return FALSE;
4308 symtab_hdr = &elf_symtab_hdr (ibfd);
4309 rel_end = relocs + opd->reloc_count - 1;
4310 for (rel = relocs; rel < rel_end; rel++)
4311 {
4312 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
4313 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
4314
4315 if (r_type == R_PPC64_ADDR64
4316 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
4317 && r_symndx < symtab_hdr->sh_info)
4318 {
4319 Elf_Internal_Sym *isym;
4320 asection *s;
4321
4322 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
4323 if (isym == NULL)
4324 {
4325 if (elf_section_data (opd)->relocs != relocs)
4326 free (relocs);
4327 return FALSE;
4328 }
4329
4330 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
4331 if (s != NULL && s != opd)
4332 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
4333 }
4334 }
4335 if (elf_section_data (opd)->relocs != relocs)
4336 free (relocs);
4337 }
459609d6
AM
4338
4339 p = &htab->dot_syms;
4340 while ((eh = *p) != NULL)
4341 {
4342 *p = NULL;
4343 if (&eh->elf == htab->elf.hgot)
4344 ;
4345 else if (htab->elf.hgot == NULL
4346 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4347 htab->elf.hgot = &eh->elf;
8c5b4e52
AM
4348 else if (abiversion (ibfd) <= 1)
4349 {
4350 htab->need_func_desc_adj = 1;
4351 if (!add_symbol_adjust (eh, info))
4352 return FALSE;
4353 }
459609d6
AM
4354 p = &eh->u.next_dot_sym;
4355 }
b3fac117 4356 return TRUE;
8387904d
AM
4357}
4358
97fed1c9
JJ
4359/* Undo hash table changes when an --as-needed input file is determined
4360 not to be needed. */
4361
4362static bfd_boolean
e5034e59
AM
4363ppc64_elf_notice_as_needed (bfd *ibfd,
4364 struct bfd_link_info *info,
4365 enum notice_asneeded_action act)
97fed1c9 4366{
e5034e59
AM
4367 if (act == notice_not_needed)
4368 {
4369 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 4370
e5034e59
AM
4371 if (htab == NULL)
4372 return FALSE;
4dfe6ac6 4373
e5034e59
AM
4374 htab->dot_syms = NULL;
4375 }
4376 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
4377}
4378
aa374f67
AM
4379/* If --just-symbols against a final linked binary, then assume we need
4380 toc adjusting stubs when calling functions defined there. */
4381
4382static void
4383ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4384{
4385 if ((sec->flags & SEC_CODE) != 0
4386 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4387 && is_ppc64_elf (sec->owner))
4388 {
2c3f079f
AM
4389 if (abiversion (sec->owner) >= 2
4390 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
aa374f67
AM
4391 sec->has_toc_reloc = 1;
4392 }
4393 _bfd_elf_link_just_syms (sec, info);
4394}
4395
e054468f 4396static struct plt_entry **
4ce794b7
AM
4397update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4398 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
4399{
4400 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 4401 struct plt_entry **local_plt;
f961d9dd 4402 unsigned char *local_got_tls_masks;
411e1bfb
AM
4403
4404 if (local_got_ents == NULL)
4405 {
4406 bfd_size_type size = symtab_hdr->sh_info;
4407
e054468f
AM
4408 size *= (sizeof (*local_got_ents)
4409 + sizeof (*local_plt)
4410 + sizeof (*local_got_tls_masks));
4ce794b7 4411 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 4412 if (local_got_ents == NULL)
e054468f 4413 return NULL;
411e1bfb
AM
4414 elf_local_got_ents (abfd) = local_got_ents;
4415 }
4416
37da22e5 4417 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0)
411e1bfb
AM
4418 {
4419 struct got_entry *ent;
4420
4421 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
4422 if (ent->addend == r_addend
4423 && ent->owner == abfd
4424 && ent->tls_type == tls_type)
411e1bfb
AM
4425 break;
4426 if (ent == NULL)
4427 {
4428 bfd_size_type amt = sizeof (*ent);
4ce794b7 4429 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4430 if (ent == NULL)
4431 return FALSE;
4432 ent->next = local_got_ents[r_symndx];
4433 ent->addend = r_addend;
e717da7e 4434 ent->owner = abfd;
411e1bfb 4435 ent->tls_type = tls_type;
927be08e 4436 ent->is_indirect = FALSE;
411e1bfb
AM
4437 ent->got.refcount = 0;
4438 local_got_ents[r_symndx] = ent;
4439 }
4440 ent->got.refcount += 1;
4441 }
4442
e054468f 4443 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 4444 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
37da22e5 4445 local_got_tls_masks[r_symndx] |= tls_type & 0xff;
e054468f
AM
4446
4447 return local_plt + r_symndx;
65f38f15
AM
4448}
4449
411e1bfb 4450static bfd_boolean
e054468f 4451update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 4452{
411e1bfb 4453 struct plt_entry *ent;
1e2f5b6e 4454
e054468f 4455 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
4456 if (ent->addend == addend)
4457 break;
4458 if (ent == NULL)
1e2f5b6e 4459 {
411e1bfb 4460 bfd_size_type amt = sizeof (*ent);
4ce794b7 4461 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4462 if (ent == NULL)
4463 return FALSE;
e054468f 4464 ent->next = *plist;
411e1bfb
AM
4465 ent->addend = addend;
4466 ent->plt.refcount = 0;
e054468f 4467 *plist = ent;
1e2f5b6e 4468 }
411e1bfb 4469 ent->plt.refcount += 1;
b34976b6 4470 return TRUE;
1e2f5b6e
AM
4471}
4472
e054468f
AM
4473static bfd_boolean
4474is_branch_reloc (enum elf_ppc64_reloc_type r_type)
4475{
4476 return (r_type == R_PPC64_REL24
05d0e962 4477 || r_type == R_PPC64_REL24_NOTOC
e054468f
AM
4478 || r_type == R_PPC64_REL14
4479 || r_type == R_PPC64_REL14_BRTAKEN
4480 || r_type == R_PPC64_REL14_BRNTAKEN
4481 || r_type == R_PPC64_ADDR24
4482 || r_type == R_PPC64_ADDR14
4483 || r_type == R_PPC64_ADDR14_BRTAKEN
23cedd1d 4484 || r_type == R_PPC64_ADDR14_BRNTAKEN
5663e321
AM
4485 || r_type == R_PPC64_PLTCALL
4486 || r_type == R_PPC64_PLTCALL_NOTOC);
23cedd1d
AM
4487}
4488
4489/* Relocs on inline plt call sequence insns prior to the call. */
4490
4491static bfd_boolean
4492is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type)
4493{
4494 return (r_type == R_PPC64_PLT16_HA
4495 || r_type == R_PPC64_PLT16_HI
4496 || r_type == R_PPC64_PLT16_LO
4497 || r_type == R_PPC64_PLT16_LO_DS
5663e321
AM
4498 || r_type == R_PPC64_PLT_PCREL34
4499 || r_type == R_PPC64_PLT_PCREL34_NOTOC
4500 || r_type == R_PPC64_PLTSEQ
4501 || r_type == R_PPC64_PLTSEQ_NOTOC);
e054468f
AM
4502}
4503
5bd4f169 4504/* Look through the relocs for a section during the first phase, and
65f38f15 4505 calculate needed space in the global offset table, procedure
5d1634d7 4506 linkage table, and dynamic reloc sections. */
5bd4f169 4507
b34976b6 4508static bfd_boolean
4ce794b7
AM
4509ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4510 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 4511{
65f38f15 4512 struct ppc_link_hash_table *htab;
5bd4f169 4513 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 4514 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
4515 const Elf_Internal_Rela *rel;
4516 const Elf_Internal_Rela *rel_end;
5bd4f169 4517 asection *sreloc;
3a71aa26 4518 struct elf_link_hash_entry *tga, *dottga;
b9399fcf 4519 bfd_boolean is_opd;
5bd4f169 4520
0e1862bb 4521 if (bfd_link_relocatable (info))
b34976b6 4522 return TRUE;
5bd4f169 4523
680a3378
AM
4524 /* Don't do anything special with non-loaded, non-alloced sections.
4525 In particular, any relocs in such sections should not affect GOT
4526 and PLT reference counting (ie. we don't allow them to create GOT
4527 or PLT entries), there's no possibility or desire to optimize TLS
4528 relocs, and there's not much point in propagating relocs to shared
4529 libs that the dynamic linker won't relocate. */
4530 if ((sec->flags & SEC_ALLOC) == 0)
4531 return TRUE;
4532
0c8d6e5c 4533 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 4534
65f38f15 4535 htab = ppc_hash_table (info);
4dfe6ac6
NC
4536 if (htab == NULL)
4537 return FALSE;
4538
3a71aa26
AM
4539 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4540 FALSE, FALSE, TRUE);
4541 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
4542 FALSE, FALSE, TRUE);
0ffa91dd 4543 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 4544 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 4545 sreloc = NULL;
b9399fcf 4546 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5bd4f169
AM
4547 rel_end = relocs + sec->reloc_count;
4548 for (rel = relocs; rel < rel_end; rel++)
4549 {
4550 unsigned long r_symndx;
4551 struct elf_link_hash_entry *h;
04c9666a 4552 enum elf_ppc64_reloc_type r_type;
727fc41e 4553 int tls_type;
7c8fe5c4 4554 struct _ppc64_elf_section_data *ppc64_sec;
cbf95972 4555 struct plt_entry **ifunc, **plt_list;
5bd4f169
AM
4556
4557 r_symndx = ELF64_R_SYM (rel->r_info);
4558 if (r_symndx < symtab_hdr->sh_info)
4559 h = NULL;
4560 else
973a3492
L
4561 {
4562 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 4563 h = elf_follow_link (h);
1c865ab2
AM
4564
4565 if (h == htab->elf.hgot)
4566 sec->has_toc_reloc = 1;
973a3492 4567 }
5bd4f169 4568
5663e321
AM
4569 r_type = ELF64_R_TYPE (rel->r_info);
4570 switch (r_type)
4571 {
04bdff6a
AM
4572 case R_PPC64_D34:
4573 case R_PPC64_D34_LO:
4574 case R_PPC64_D34_HI30:
4575 case R_PPC64_D34_HA30:
4576 case R_PPC64_D28:
c213164a
AM
4577 case R_PPC64_TPREL34:
4578 case R_PPC64_DTPREL34:
04bdff6a 4579 case R_PPC64_PCREL34:
5663e321 4580 case R_PPC64_GOT_PCREL34:
c213164a
AM
4581 case R_PPC64_GOT_TLSGD34:
4582 case R_PPC64_GOT_TLSLD34:
4583 case R_PPC64_GOT_TPREL34:
4584 case R_PPC64_GOT_DTPREL34:
5663e321
AM
4585 case R_PPC64_PLT_PCREL34:
4586 case R_PPC64_PLT_PCREL34_NOTOC:
04bdff6a
AM
4587 case R_PPC64_PCREL28:
4588 htab->powerxx_stubs = 1;
133a1f60
AM
4589 break;
4590 default:
5663e321
AM
4591 break;
4592 }
903b777d
AM
4593
4594 switch (r_type)
4595 {
4596 case R_PPC64_PLT16_HA:
4597 case R_PPC64_GOT_TLSLD16_HA:
4598 case R_PPC64_GOT_TLSGD16_HA:
4599 case R_PPC64_GOT_TPREL16_HA:
4600 case R_PPC64_GOT_DTPREL16_HA:
4601 case R_PPC64_GOT16_HA:
4602 case R_PPC64_TOC16_HA:
4603 case R_PPC64_PLT16_LO:
4604 case R_PPC64_PLT16_LO_DS:
4605 case R_PPC64_GOT_TLSLD16_LO:
4606 case R_PPC64_GOT_TLSGD16_LO:
4607 case R_PPC64_GOT_TPREL16_LO_DS:
4608 case R_PPC64_GOT_DTPREL16_LO_DS:
4609 case R_PPC64_GOT16_LO:
4610 case R_PPC64_GOT16_LO_DS:
4611 case R_PPC64_TOC16_LO:
4612 case R_PPC64_TOC16_LO_DS:
4613 case R_PPC64_GOT_PCREL34:
4614 ppc64_elf_tdata (abfd)->has_optrel = 1;
4615 ppc64_elf_section_data (sec)->has_optrel = 1;
4616 break;
4617 default:
4618 break;
4619 }
4620
f749f26e 4621 ifunc = NULL;
25f23106
AM
4622 if (h != NULL)
4623 {
4624 if (h->type == STT_GNU_IFUNC)
4625 {
4626 h->needs_plt = 1;
4627 ifunc = &h->plt.plist;
4628 }
4629 }
4630 else
4631 {
4632 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4633 abfd, r_symndx);
4634 if (isym == NULL)
4635 return FALSE;
4636
4637 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4638 {
4639 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4640 rel->r_addend,
37da22e5 4641 NON_GOT | PLT_IFUNC);
25f23106
AM
4642 if (ifunc == NULL)
4643 return FALSE;
4644 }
4645 }
727fc41e 4646
f749f26e 4647 tls_type = 0;
a33d1f77 4648 switch (r_type)
5bd4f169 4649 {
727fc41e
AM
4650 case R_PPC64_TLSGD:
4651 case R_PPC64_TLSLD:
4652 /* These special tls relocs tie a call to __tls_get_addr with
4653 its parameter symbol. */
37da22e5 4654 if (h != NULL)
ed7007c1 4655 ppc_elf_hash_entry (h)->tls_mask |= TLS_TLS | TLS_MARK;
37da22e5
AM
4656 else
4657 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4658 rel->r_addend,
37da22e5
AM
4659 NON_GOT | TLS_TLS | TLS_MARK))
4660 return FALSE;
4661 sec->has_tls_reloc = 1;
727fc41e
AM
4662 break;
4663
411e1bfb
AM
4664 case R_PPC64_GOT_TLSLD16:
4665 case R_PPC64_GOT_TLSLD16_LO:
4666 case R_PPC64_GOT_TLSLD16_HI:
4667 case R_PPC64_GOT_TLSLD16_HA:
c213164a 4668 case R_PPC64_GOT_TLSLD34:
951fd09b 4669 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
4670 goto dogottls;
4671
4672 case R_PPC64_GOT_TLSGD16:
4673 case R_PPC64_GOT_TLSGD16_LO:
4674 case R_PPC64_GOT_TLSGD16_HI:
4675 case R_PPC64_GOT_TLSGD16_HA:
c213164a 4676 case R_PPC64_GOT_TLSGD34:
951fd09b 4677 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
4678 goto dogottls;
4679
4680 case R_PPC64_GOT_TPREL16_DS:
4681 case R_PPC64_GOT_TPREL16_LO_DS:
4682 case R_PPC64_GOT_TPREL16_HI:
4683 case R_PPC64_GOT_TPREL16_HA:
c213164a 4684 case R_PPC64_GOT_TPREL34:
7c8bbca5 4685 if (bfd_link_dll (info))
411e1bfb
AM
4686 info->flags |= DF_STATIC_TLS;
4687 tls_type = TLS_TLS | TLS_TPREL;
4688 goto dogottls;
4689
4690 case R_PPC64_GOT_DTPREL16_DS:
4691 case R_PPC64_GOT_DTPREL16_LO_DS:
4692 case R_PPC64_GOT_DTPREL16_HI:
4693 case R_PPC64_GOT_DTPREL16_HA:
c213164a 4694 case R_PPC64_GOT_DTPREL34:
411e1bfb
AM
4695 tls_type = TLS_TLS | TLS_DTPREL;
4696 dogottls:
4697 sec->has_tls_reloc = 1;
066f4018 4698 goto dogot;
411e1bfb 4699
903b777d
AM
4700 case R_PPC64_GOT16:
4701 case R_PPC64_GOT16_LO:
4702 case R_PPC64_GOT16_HI:
65f38f15 4703 case R_PPC64_GOT16_HA:
903b777d 4704 case R_PPC64_GOT16_DS:
066f4018 4705 case R_PPC64_GOT16_LO_DS:
4a421c53 4706 case R_PPC64_GOT_PCREL34:
066f4018 4707 dogot:
65f38f15 4708 /* This symbol requires a global offset table entry. */
4c52953f 4709 sec->has_toc_reloc = 1;
33c0ec9d
AM
4710 if (r_type == R_PPC64_GOT_TLSLD16
4711 || r_type == R_PPC64_GOT_TLSGD16
4712 || r_type == R_PPC64_GOT_TPREL16_DS
4713 || r_type == R_PPC64_GOT_DTPREL16_DS
4714 || r_type == R_PPC64_GOT16
4715 || r_type == R_PPC64_GOT16_DS)
4716 {
4717 htab->do_multi_toc = 1;
d77c8a4b 4718 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
4719 }
4720
e717da7e
AM
4721 if (ppc64_elf_tdata (abfd)->got == NULL
4722 && !create_got_section (abfd, info))
b34976b6 4723 return FALSE;
5bd4f169
AM
4724
4725 if (h != NULL)
4726 {
411e1bfb
AM
4727 struct ppc_link_hash_entry *eh;
4728 struct got_entry *ent;
65f38f15 4729
ed7007c1 4730 eh = ppc_elf_hash_entry (h);
411e1bfb 4731 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
133a1f60 4732 if (ent->addend == rel->r_addend
e717da7e 4733 && ent->owner == abfd
411e1bfb
AM
4734 && ent->tls_type == tls_type)
4735 break;
4736 if (ent == NULL)
5bd4f169 4737 {
411e1bfb 4738 bfd_size_type amt = sizeof (*ent);
4ce794b7 4739 ent = bfd_alloc (abfd, amt);
411e1bfb 4740 if (ent == NULL)
b34976b6 4741 return FALSE;
411e1bfb 4742 ent->next = eh->elf.got.glist;
133a1f60 4743 ent->addend = rel->r_addend;
e717da7e 4744 ent->owner = abfd;
411e1bfb 4745 ent->tls_type = tls_type;
927be08e 4746 ent->is_indirect = FALSE;
411e1bfb
AM
4747 ent->got.refcount = 0;
4748 eh->elf.got.glist = ent;
5bd4f169 4749 }
411e1bfb 4750 ent->got.refcount += 1;
e7b938ca 4751 eh->tls_mask |= tls_type;
5bd4f169 4752 }
411e1bfb
AM
4753 else
4754 /* This is a global offset table entry for a local symbol. */
4755 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4756 rel->r_addend, tls_type))
411e1bfb 4757 return FALSE;
a345bc8d
AM
4758
4759 /* We may also need a plt entry if the symbol turns out to be
4760 an ifunc. */
0e1862bb 4761 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
a345bc8d 4762 {
133a1f60 4763 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
a345bc8d
AM
4764 return FALSE;
4765 }
5bd4f169
AM
4766 break;
4767
5bd4f169 4768 case R_PPC64_PLT16_HA:
65f38f15
AM
4769 case R_PPC64_PLT16_HI:
4770 case R_PPC64_PLT16_LO:
08be3224 4771 case R_PPC64_PLT16_LO_DS:
5663e321
AM
4772 case R_PPC64_PLT_PCREL34:
4773 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
4774 case R_PPC64_PLT32:
4775 case R_PPC64_PLT64:
cbf95972
AM
4776 /* This symbol requires a procedure linkage table entry. */
4777 plt_list = ifunc;
4778 if (h != NULL)
e054468f 4779 {
e054468f
AM
4780 h->needs_plt = 1;
4781 if (h->root.root.string[0] == '.'
4782 && h->root.root.string[1] != '\0')
ed7007c1
AM
4783 ppc_elf_hash_entry (h)->is_func = 1;
4784 ppc_elf_hash_entry (h)->tls_mask |= PLT_KEEP;
cbf95972
AM
4785 plt_list = &h->plt.plist;
4786 }
4787 if (plt_list == NULL)
2d7ad24e 4788 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4789 rel->r_addend,
2d7ad24e 4790 NON_GOT | PLT_KEEP);
133a1f60 4791 if (!update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4792 return FALSE;
5bd4f169
AM
4793 break;
4794
4795 /* The following relocations don't need to propagate the
4796 relocation if linking a shared object since they are
4797 section relative. */
4798 case R_PPC64_SECTOFF:
4799 case R_PPC64_SECTOFF_LO:
4800 case R_PPC64_SECTOFF_HI:
4801 case R_PPC64_SECTOFF_HA:
4802 case R_PPC64_SECTOFF_DS:
4803 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
4804 case R_PPC64_DTPREL16:
4805 case R_PPC64_DTPREL16_LO:
4806 case R_PPC64_DTPREL16_HI:
4807 case R_PPC64_DTPREL16_HA:
4808 case R_PPC64_DTPREL16_DS:
4809 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
4810 case R_PPC64_DTPREL16_HIGH:
4811 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
4812 case R_PPC64_DTPREL16_HIGHER:
4813 case R_PPC64_DTPREL16_HIGHERA:
4814 case R_PPC64_DTPREL16_HIGHEST:
4815 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
4816 break;
4817
ad8e1ba5 4818 /* Nor do these. */
25f23106
AM
4819 case R_PPC64_REL16:
4820 case R_PPC64_REL16_LO:
4821 case R_PPC64_REL16_HI:
4822 case R_PPC64_REL16_HA:
4a969973
AM
4823 case R_PPC64_REL16_HIGH:
4824 case R_PPC64_REL16_HIGHA:
4825 case R_PPC64_REL16_HIGHER:
4826 case R_PPC64_REL16_HIGHERA:
4827 case R_PPC64_REL16_HIGHEST:
4828 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
4829 case R_PPC64_REL16_HIGHER34:
4830 case R_PPC64_REL16_HIGHERA34:
4831 case R_PPC64_REL16_HIGHEST34:
4832 case R_PPC64_REL16_HIGHESTA34:
a680de9a 4833 case R_PPC64_REL16DX_HA:
25f23106
AM
4834 break;
4835
45965137
AM
4836 /* Not supported as a dynamic relocation. */
4837 case R_PPC64_ADDR64_LOCAL:
0e1862bb 4838 if (bfd_link_pic (info))
45965137
AM
4839 {
4840 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
4841 ppc_howto_init ();
695344c0 4842 /* xgettext:c-format */
174d0a74 4843 info->callbacks->einfo (_("%H: %s reloc unsupported "
cf97bcb0 4844 "in shared libraries and PIEs\n"),
45965137
AM
4845 abfd, sec, rel->r_offset,
4846 ppc64_elf_howto_table[r_type]->name);
4847 bfd_set_error (bfd_error_bad_value);
4848 return FALSE;
4849 }
4850 break;
4851
ad8e1ba5 4852 case R_PPC64_TOC16:
33c0ec9d
AM
4853 case R_PPC64_TOC16_DS:
4854 htab->do_multi_toc = 1;
d77c8a4b 4855 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
1a0670f3 4856 /* Fall through. */
ad8e1ba5
AM
4857 case R_PPC64_TOC16_LO:
4858 case R_PPC64_TOC16_HI:
4859 case R_PPC64_TOC16_HA:
ad8e1ba5 4860 case R_PPC64_TOC16_LO_DS:
4c52953f 4861 sec->has_toc_reloc = 1;
ec73ddcd 4862 if (h != NULL && bfd_link_executable (info))
1bdd8fac
AM
4863 {
4864 /* We may need a copy reloc. */
4865 h->non_got_ref = 1;
4866 /* Strongly prefer a copy reloc over a dynamic reloc.
4867 glibc ld.so as of 2019-08 will error out if one of
4868 these relocations is emitted. */
4869 h->needs_copy = 1;
4870 goto dodyn;
4871 }
ad8e1ba5
AM
4872 break;
4873
006589cf
AM
4874 /* Marker reloc. */
4875 case R_PPC64_ENTRY:
4876 break;
4877
5bd4f169
AM
4878 /* This relocation describes the C++ object vtable hierarchy.
4879 Reconstruct it for later use during GC. */
4880 case R_PPC64_GNU_VTINHERIT:
c152c796 4881 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 4882 return FALSE;
5bd4f169
AM
4883 break;
4884
4885 /* This relocation describes which C++ vtable entries are actually
4886 used. Record for later use during GC. */
4887 case R_PPC64_GNU_VTENTRY:
a0ea3a14 4888 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 4889 return FALSE;
5bd4f169
AM
4890 break;
4891
721956f4
AM
4892 case R_PPC64_REL14:
4893 case R_PPC64_REL14_BRTAKEN:
4894 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
4895 {
4896 asection *dest = NULL;
4897
4898 /* Heuristic: If jumping outside our section, chances are
4899 we are going to need a stub. */
4900 if (h != NULL)
4901 {
4902 /* If the sym is weak it may be overridden later, so
4903 don't assume we know where a weak sym lives. */
4904 if (h->root.type == bfd_link_hash_defined)
4905 dest = h->root.u.def.section;
4906 }
4907 else
87d72d41
AM
4908 {
4909 Elf_Internal_Sym *isym;
4910
4911 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4912 abfd, r_symndx);
4913 if (isym == NULL)
4914 return FALSE;
4915
4916 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
4917 }
4918
220c76dd 4919 if (dest != sec)
7c8fe5c4 4920 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 4921 }
3e04d765
AM
4922 goto rel24;
4923
4924 case R_PPC64_PLTCALL:
5663e321 4925 case R_PPC64_PLTCALL_NOTOC:
3e04d765 4926 ppc64_elf_section_data (sec)->has_pltcall = 1;
721956f4
AM
4927 /* Fall through. */
4928
5d1634d7 4929 case R_PPC64_REL24:
05d0e962 4930 case R_PPC64_REL24_NOTOC:
3e04d765 4931 rel24:
cbf95972
AM
4932 plt_list = ifunc;
4933 if (h != NULL)
5d1634d7 4934 {
e054468f
AM
4935 h->needs_plt = 1;
4936 if (h->root.root.string[0] == '.'
4937 && h->root.root.string[1] != '\0')
ed7007c1 4938 ppc_elf_hash_entry (h)->is_func = 1;
cbf95972 4939
3a71aa26 4940 if (h == tga || h == dottga)
cbf95972
AM
4941 {
4942 sec->has_tls_reloc = 1;
4943 if (rel != relocs
4944 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
4945 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
4946 /* We have a new-style __tls_get_addr call with
4947 a marker reloc. */
4948 ;
4949 else
4950 /* Mark this section as having an old-style call. */
9737e8af 4951 sec->nomark_tls_get_addr = 1;
cbf95972
AM
4952 }
4953 plt_list = &h->plt.plist;
411e1bfb 4954 }
cbf95972
AM
4955
4956 /* We may need a .plt entry if the function this reloc
4957 refers to is in a shared lib. */
4958 if (plt_list
133a1f60 4959 && !update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4960 return FALSE;
411e1bfb
AM
4961 break;
4962
cbf95972
AM
4963 case R_PPC64_ADDR14:
4964 case R_PPC64_ADDR14_BRNTAKEN:
4965 case R_PPC64_ADDR14_BRTAKEN:
4966 case R_PPC64_ADDR24:
4967 goto dodyn;
4968
411e1bfb
AM
4969 case R_PPC64_TPREL64:
4970 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
7c8bbca5 4971 if (bfd_link_dll (info))
411e1bfb
AM
4972 info->flags |= DF_STATIC_TLS;
4973 goto dotlstoc;
4974
4975 case R_PPC64_DTPMOD64:
4976 if (rel + 1 < rel_end
4977 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4978 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 4979 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 4980 else
951fd09b 4981 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
4982 goto dotlstoc;
4983
4984 case R_PPC64_DTPREL64:
4985 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4986 if (rel != relocs
4987 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4988 && rel[-1].r_offset == rel->r_offset - 8)
4989 /* This is the second reloc of a dtpmod, dtprel pair.
4990 Don't mark with TLS_DTPREL. */
4991 goto dodyn;
4992
4993 dotlstoc:
4994 sec->has_tls_reloc = 1;
4995 if (h != NULL)
ed7007c1 4996 ppc_elf_hash_entry (h)->tls_mask |= tls_type & 0xff;
411e1bfb
AM
4997 else
4998 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4999 rel->r_addend, tls_type))
411e1bfb
AM
5000 return FALSE;
5001
7c8fe5c4
AM
5002 ppc64_sec = ppc64_elf_section_data (sec);
5003 if (ppc64_sec->sec_type != sec_toc)
411e1bfb 5004 {
3a71aa26
AM
5005 bfd_size_type amt;
5006
e7b938ca 5007 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5008 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5009 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5010 if (ppc64_sec->u.toc.symndx == NULL)
5011 return FALSE;
5012 amt = sec->size * sizeof (bfd_vma) / 8;
5013 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5014 if (ppc64_sec->u.toc.add == NULL)
411e1bfb 5015 return FALSE;
7c8fe5c4
AM
5016 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5017 ppc64_sec->sec_type = sec_toc;
411e1bfb
AM
5018 }
5019 BFD_ASSERT (rel->r_offset % 8 == 0);
3a71aa26 5020 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
133a1f60 5021 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5022
5023 /* Mark the second slot of a GD or LD entry.
5024 -1 to indicate GD and -2 to indicate LD. */
5025 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5026 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5027 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5028 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5029 goto dodyn;
5030
5031 case R_PPC64_TPREL16:
5032 case R_PPC64_TPREL16_LO:
5033 case R_PPC64_TPREL16_HI:
5034 case R_PPC64_TPREL16_HA:
5035 case R_PPC64_TPREL16_DS:
5036 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
5037 case R_PPC64_TPREL16_HIGH:
5038 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5039 case R_PPC64_TPREL16_HIGHER:
5040 case R_PPC64_TPREL16_HIGHERA:
5041 case R_PPC64_TPREL16_HIGHEST:
5042 case R_PPC64_TPREL16_HIGHESTA:
c213164a 5043 case R_PPC64_TPREL34:
7c8bbca5
AM
5044 if (bfd_link_dll (info))
5045 info->flags |= DF_STATIC_TLS;
5046 goto dodyn;
5d1634d7 5047
e86ce104 5048 case R_PPC64_ADDR64:
b9399fcf 5049 if (is_opd
1e2f5b6e 5050 && rel + 1 < rel_end
4ce794b7 5051 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 5052 {
8387904d 5053 if (h != NULL)
ed7007c1 5054 ppc_elf_hash_entry (h)->is_func = 1;
1e2f5b6e 5055 }
e86ce104
AM
5056 /* Fall through. */
5057
65f38f15
AM
5058 case R_PPC64_ADDR16:
5059 case R_PPC64_ADDR16_DS:
5060 case R_PPC64_ADDR16_HA:
5061 case R_PPC64_ADDR16_HI:
f9c6b907
AM
5062 case R_PPC64_ADDR16_HIGH:
5063 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
5064 case R_PPC64_ADDR16_HIGHER:
5065 case R_PPC64_ADDR16_HIGHERA:
5066 case R_PPC64_ADDR16_HIGHEST:
5067 case R_PPC64_ADDR16_HIGHESTA:
5068 case R_PPC64_ADDR16_LO:
5069 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
5070 case R_PPC64_D34:
5071 case R_PPC64_D34_LO:
5072 case R_PPC64_D34_HI30:
5073 case R_PPC64_D34_HA30:
5074 case R_PPC64_ADDR16_HIGHER34:
5075 case R_PPC64_ADDR16_HIGHERA34:
5076 case R_PPC64_ADDR16_HIGHEST34:
5077 case R_PPC64_ADDR16_HIGHESTA34:
5078 case R_PPC64_D28:
0e1862bb 5079 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
a345bc8d
AM
5080 && rel->r_addend == 0)
5081 {
5082 /* We may need a .plt entry if this reloc refers to a
5083 function in a shared lib. */
5663e321 5084 if (!update_plt_info (abfd, &h->plt.plist, 0))
a345bc8d
AM
5085 return FALSE;
5086 h->pointer_equality_needed = 1;
5087 }
5088 /* Fall through. */
5089
5090 case R_PPC64_REL30:
5091 case R_PPC64_REL32:
5092 case R_PPC64_REL64:
65f38f15 5093 case R_PPC64_ADDR32:
65f38f15
AM
5094 case R_PPC64_UADDR16:
5095 case R_PPC64_UADDR32:
5096 case R_PPC64_UADDR64:
5bd4f169 5097 case R_PPC64_TOC:
ec73ddcd 5098 if (h != NULL && bfd_link_executable (info))
81848ca0 5099 /* We may need a copy reloc. */
f5385ebf 5100 h->non_got_ref = 1;
81848ca0 5101
41bd81ab 5102 /* Don't propagate .opd relocs. */
b9399fcf 5103 if (NO_OPD_RELOCS && is_opd)
e86ce104 5104 break;
e86ce104 5105
65f38f15
AM
5106 /* If we are creating a shared library, and this is a reloc
5107 against a global symbol, or a non PC relative reloc
5108 against a local symbol, then we need to copy the reloc
5109 into the shared library. However, if we are linking with
5110 -Bsymbolic, we do not need to copy a reloc against a
5111 global symbol which is defined in an object we are
5112 including in the link (i.e., DEF_REGULAR is set). At
5113 this point we have not seen all the input files, so it is
5114 possible that DEF_REGULAR is not set now but will be set
5115 later (it is never cleared). In case of a weak definition,
5116 DEF_REGULAR may be cleared later by a strong definition in
5117 a shared library. We account for that possibility below by
f4656909 5118 storing information in the dyn_relocs field of the hash
65f38f15
AM
5119 table entry. A similar situation occurs when creating
5120 shared libraries and symbol visibility changes render the
5121 symbol local.
5122
5123 If on the other hand, we are creating an executable, we
5124 may need to keep relocations for symbols satisfied by a
5125 dynamic library if we manage to avoid copy relocs for the
5126 symbol. */
411e1bfb 5127 dodyn:
ec73ddcd
AM
5128 if ((h != NULL
5129 && (h->root.type == bfd_link_hash_defweak
5130 || !h->def_regular))
5131 || (h != NULL
5132 && !bfd_link_executable (info)
5133 && !SYMBOLIC_BIND (info, h))
5134 || (bfd_link_pic (info)
5135 && must_be_dyn_reloc (info, r_type))
0e1862bb 5136 || (!bfd_link_pic (info)
25f23106 5137 && ifunc != NULL))
5bd4f169 5138 {
65f38f15
AM
5139 /* We must copy these reloc types into the output file.
5140 Create a reloc section in dynobj and make room for
5141 this reloc. */
5bd4f169
AM
5142 if (sreloc == NULL)
5143 {
83bac4b0
NC
5144 sreloc = _bfd_elf_make_dynamic_reloc_section
5145 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
65f38f15 5146
5bd4f169 5147 if (sreloc == NULL)
83bac4b0 5148 return FALSE;
5bd4f169
AM
5149 }
5150
65f38f15
AM
5151 /* If this is a global symbol, we count the number of
5152 relocations we need for this symbol. */
5153 if (h != NULL)
5154 {
19e08130
AM
5155 struct elf_dyn_relocs *p;
5156 struct elf_dyn_relocs **head;
5157
ed7007c1 5158 head = &ppc_elf_hash_entry (h)->dyn_relocs;
19e08130
AM
5159 p = *head;
5160 if (p == NULL || p->sec != sec)
5161 {
5162 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5163 if (p == NULL)
5164 return FALSE;
5165 p->next = *head;
5166 *head = p;
5167 p->sec = sec;
5168 p->count = 0;
5169 p->pc_count = 0;
5170 }
5171 p->count += 1;
5172 if (!must_be_dyn_reloc (info, r_type))
5173 p->pc_count += 1;
65f38f15
AM
5174 }
5175 else
5176 {
ec338859
AM
5177 /* Track dynamic relocs needed for local syms too.
5178 We really need local syms available to do this
5179 easily. Oh well. */
19e08130
AM
5180 struct ppc_dyn_relocs *p;
5181 struct ppc_dyn_relocs **head;
5182 bfd_boolean is_ifunc;
ec338859 5183 asection *s;
6edfbbad 5184 void *vpp;
87d72d41 5185 Elf_Internal_Sym *isym;
6edfbbad 5186
87d72d41
AM
5187 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5188 abfd, r_symndx);
5189 if (isym == NULL)
b34976b6 5190 return FALSE;
ec338859 5191
87d72d41
AM
5192 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5193 if (s == NULL)
5194 s = sec;
5195
6edfbbad 5196 vpp = &elf_section_data (s)->local_dynrel;
19e08130
AM
5197 head = (struct ppc_dyn_relocs **) vpp;
5198 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5199 p = *head;
5200 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5201 p = p->next;
5202 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5203 {
5204 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5205 if (p == NULL)
5206 return FALSE;
5207 p->next = *head;
5208 *head = p;
5209 p->sec = sec;
5210 p->ifunc = is_ifunc;
5211 p->count = 0;
5212 }
5213 p->count += 1;
ec338859 5214 }
65f38f15 5215 }
5bd4f169 5216 break;
65f38f15
AM
5217
5218 default:
96e0dda4 5219 break;
5bd4f169
AM
5220 }
5221 }
5222
b34976b6 5223 return TRUE;
5bd4f169
AM
5224}
5225
ee67d69a
AM
5226/* Merge backend specific data from an object file to the output
5227 object file when linking. */
5228
5229static bfd_boolean
50e03d47 5230ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
ee67d69a 5231{
50e03d47 5232 bfd *obfd = info->output_bfd;
ee67d69a
AM
5233 unsigned long iflags, oflags;
5234
5235 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5236 return TRUE;
5237
5238 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5239 return TRUE;
5240
50e03d47 5241 if (!_bfd_generic_verify_endian_match (ibfd, info))
ee67d69a
AM
5242 return FALSE;
5243
5244 iflags = elf_elfheader (ibfd)->e_flags;
5245 oflags = elf_elfheader (obfd)->e_flags;
5246
f6c7c3e8 5247 if (iflags & ~EF_PPC64_ABI)
ee67d69a 5248 {
4eca0228 5249 _bfd_error_handler
695344c0 5250 /* xgettext:c-format */
871b3ab2 5251 (_("%pB uses unknown e_flags 0x%lx"), ibfd, iflags);
ee67d69a
AM
5252 bfd_set_error (bfd_error_bad_value);
5253 return FALSE;
5254 }
f6c7c3e8 5255 else if (iflags != oflags && iflags != 0)
ee67d69a 5256 {
4eca0228 5257 _bfd_error_handler
695344c0 5258 /* xgettext:c-format */
871b3ab2 5259 (_("%pB: ABI version %ld is not compatible with ABI version %ld output"),
ee67d69a
AM
5260 ibfd, iflags, oflags);
5261 bfd_set_error (bfd_error_bad_value);
5262 return FALSE;
5263 }
5264
4a91d0ba
AM
5265 if (!_bfd_elf_ppc_merge_fp_attributes (ibfd, info))
5266 return FALSE;
005d79fd 5267
ee67d69a 5268 /* Merge Tag_compatibility attributes and any common GNU ones. */
8d2c8c3d 5269 return _bfd_elf_merge_object_attributes (ibfd, info);
ee67d69a
AM
5270}
5271
5272static bfd_boolean
5273ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5274{
5275 /* Print normal ELF private data. */
5276 _bfd_elf_print_private_bfd_data (abfd, ptr);
5277
5278 if (elf_elfheader (abfd)->e_flags != 0)
5279 {
5280 FILE *file = ptr;
5281
ee67d69a
AM
5282 fprintf (file, _("private flags = 0x%lx:"),
5283 elf_elfheader (abfd)->e_flags);
5284
5285 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5286 fprintf (file, _(" [abiv%ld]"),
5287 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5288 fputc ('\n', file);
5289 }
5290
5291 return TRUE;
5292}
5293
8387904d 5294/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
b53dfeb2
AM
5295 of the code entry point, and its section, which must be in the same
5296 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
8387904d
AM
5297
5298static bfd_vma
5299opd_entry_value (asection *opd_sec,
5300 bfd_vma offset,
5301 asection **code_sec,
aef36ac1
AM
5302 bfd_vma *code_off,
5303 bfd_boolean in_code_sec)
8387904d
AM
5304{
5305 bfd *opd_bfd = opd_sec->owner;
8860955f 5306 Elf_Internal_Rela *relocs;
8387904d 5307 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 5308 bfd_vma val;
8387904d 5309
9f296da3
AM
5310 /* No relocs implies we are linking a --just-symbols object, or looking
5311 at a final linked executable with addr2line or somesuch. */
4b85d634
AM
5312 if (opd_sec->reloc_count == 0)
5313 {
729eabd5 5314 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
3b36f7e6 5315
729eabd5
AM
5316 if (contents == NULL)
5317 {
5318 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5319 return (bfd_vma) -1;
5320 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5321 }
ee1e4ede 5322
dbb3fbbb 5323 /* PR 17512: file: 64b9dfbb. */
451dfd38 5324 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
dbb3fbbb
NC
5325 return (bfd_vma) -1;
5326
729eabd5 5327 val = bfd_get_64 (opd_bfd, contents + offset);
aef36ac1
AM
5328 if (code_sec != NULL)
5329 {
5330 asection *sec, *likely = NULL;
ee1e4ede 5331
aef36ac1 5332 if (in_code_sec)
4b85d634 5333 {
aef36ac1
AM
5334 sec = *code_sec;
5335 if (sec->vma <= val
5336 && val < sec->vma + sec->size)
5337 likely = sec;
5338 else
5339 val = -1;
5340 }
5341 else
5342 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5343 if (sec->vma <= val
5344 && (sec->flags & SEC_LOAD) != 0
5345 && (sec->flags & SEC_ALLOC) != 0)
5346 likely = sec;
5347 if (likely != NULL)
5348 {
5349 *code_sec = likely;
5350 if (code_off != NULL)
5351 *code_off = val - likely->vma;
4b85d634
AM
5352 }
5353 }
aef36ac1 5354 return val;
4b85d634
AM
5355 }
5356
0c8d6e5c 5357 BFD_ASSERT (is_ppc64_elf (opd_bfd));
0ffa91dd 5358
729eabd5 5359 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
8860955f
AM
5360 if (relocs == NULL)
5361 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
877a8638
NC
5362 /* PR 17512: file: df8e1fd6. */
5363 if (relocs == NULL)
5364 return (bfd_vma) -1;
645ea6a9 5365
8387904d 5366 /* Go find the opd reloc at the sym address. */
8860955f 5367 lo = relocs;
8387904d 5368 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 5369 val = (bfd_vma) -1;
8387904d
AM
5370 while (lo < hi)
5371 {
5372 look = lo + (hi - lo) / 2;
5373 if (look->r_offset < offset)
5374 lo = look + 1;
5375 else if (look->r_offset > offset)
5376 hi = look;
5377 else
5378 {
0ffa91dd
NC
5379 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5380
8387904d
AM
5381 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5382 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5383 {
5384 unsigned long symndx = ELF64_R_SYM (look->r_info);
b53dfeb2 5385 asection *sec = NULL;
8387904d 5386
b53dfeb2
AM
5387 if (symndx >= symtab_hdr->sh_info
5388 && elf_sym_hashes (opd_bfd) != NULL)
8387904d
AM
5389 {
5390 struct elf_link_hash_entry **sym_hashes;
5391 struct elf_link_hash_entry *rh;
5392
5393 sym_hashes = elf_sym_hashes (opd_bfd);
5394 rh = sym_hashes[symndx - symtab_hdr->sh_info];
128205bb
AM
5395 if (rh != NULL)
5396 {
5397 rh = elf_follow_link (rh);
bb854a36
AM
5398 if (rh->root.type != bfd_link_hash_defined
5399 && rh->root.type != bfd_link_hash_defweak)
5400 break;
5401 if (rh->root.u.def.section->owner == opd_bfd)
b53dfeb2 5402 {
bb854a36
AM
5403 val = rh->root.u.def.value;
5404 sec = rh->root.u.def.section;
b53dfeb2
AM
5405 }
5406 }
5407 }
5408
5409 if (sec == NULL)
5410 {
5411 Elf_Internal_Sym *sym;
5412
5413 if (symndx < symtab_hdr->sh_info)
5414 {
5415 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5416 if (sym == NULL)
5417 {
5418 size_t symcnt = symtab_hdr->sh_info;
5419 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5420 symcnt, 0,
5421 NULL, NULL, NULL);
5422 if (sym == NULL)
5423 break;
5424 symtab_hdr->contents = (bfd_byte *) sym;
5425 }
5426 sym += symndx;
128205bb
AM
5427 }
5428 else
5429 {
b53dfeb2
AM
5430 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5431 1, symndx,
5432 NULL, NULL, NULL);
128205bb
AM
5433 if (sym == NULL)
5434 break;
128205bb 5435 }
b53dfeb2
AM
5436 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5437 if (sec == NULL)
5438 break;
5439 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5440 val = sym->st_value;
8387904d 5441 }
b53dfeb2 5442
8387904d
AM
5443 val += look->r_addend;
5444 if (code_off != NULL)
5445 *code_off = val;
5446 if (code_sec != NULL)
aef36ac1
AM
5447 {
5448 if (in_code_sec && *code_sec != sec)
5449 return -1;
5450 else
5451 *code_sec = sec;
5452 }
b53dfeb2 5453 if (sec->output_section != NULL)
8387904d 5454 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
5455 }
5456 break;
5457 }
5458 }
645ea6a9 5459
645ea6a9 5460 return val;
8387904d
AM
5461}
5462
aef36ac1
AM
5463/* If the ELF symbol SYM might be a function in SEC, return the
5464 function size and set *CODE_OFF to the function's entry point,
5465 otherwise return zero. */
9f296da3 5466
aef36ac1
AM
5467static bfd_size_type
5468ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
5469 bfd_vma *code_off)
9f296da3 5470{
aef36ac1
AM
5471 bfd_size_type size;
5472
5473 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
5474 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
5475 return 0;
5476
5477 size = 0;
5478 if (!(sym->flags & BSF_SYNTHETIC))
5479 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
5480
5481 if (strcmp (sym->section->name, ".opd") == 0)
9f296da3 5482 {
b07bca4e
AM
5483 struct _opd_sec_data *opd = get_opd_info (sym->section);
5484 bfd_vma symval = sym->value;
5485
5486 if (opd != NULL
5487 && opd->adjust != NULL
5488 && elf_section_data (sym->section)->relocs != NULL)
5489 {
5490 /* opd_entry_value will use cached relocs that have been
5491 adjusted, but with raw symbols. That means both local
5492 and global symbols need adjusting. */
5493 long adjust = opd->adjust[OPD_NDX (symval)];
5494 if (adjust == -1)
5495 return 0;
5496 symval += adjust;
5497 }
5498
5499 if (opd_entry_value (sym->section, symval,
aef36ac1
AM
5500 &sec, code_off, TRUE) == (bfd_vma) -1)
5501 return 0;
5502 /* An old ABI binary with dot-syms has a size of 24 on the .opd
5503 symbol. This size has nothing to do with the code size of the
5504 function, which is what we're supposed to return, but the
5505 code size isn't available without looking up the dot-sym.
5506 However, doing that would be a waste of time particularly
5507 since elf_find_function will look at the dot-sym anyway.
5508 Now, elf_find_function will keep the largest size of any
5509 function sym found at the code address of interest, so return
5510 1 here to avoid it incorrectly caching a larger function size
5511 for a small function. This does mean we return the wrong
5512 size for a new-ABI function of size 24, but all that does is
5513 disable caching for such functions. */
5514 if (size == 24)
5515 size = 1;
9f296da3 5516 }
aef36ac1
AM
5517 else
5518 {
5519 if (sym->section != sec)
5520 return 0;
5521 *code_off = sym->value;
5522 }
5523 if (size == 0)
5524 size = 1;
5525 return size;
9f296da3
AM
5526}
5527
f378ab09
AM
5528/* Return true if symbol is a strong function defined in an ELFv2
5529 object with st_other localentry bits of zero, ie. its local entry
5530 point coincides with its global entry point. */
5531
5532static bfd_boolean
5533is_elfv2_localentry0 (struct elf_link_hash_entry *h)
5534{
5535 return (h != NULL
5536 && h->type == STT_FUNC
5537 && h->root.type == bfd_link_hash_defined
5538 && (STO_PPC64_LOCAL_MASK & h->other) == 0
ed7007c1 5539 && !ppc_elf_hash_entry (h)->non_zero_localentry
f378ab09
AM
5540 && is_ppc64_elf (h->root.u.def.section->owner)
5541 && abiversion (h->root.u.def.section->owner) >= 2);
5542}
5543
854b41e7
AM
5544/* Return true if symbol is defined in a regular object file. */
5545
5546static bfd_boolean
5547is_static_defined (struct elf_link_hash_entry *h)
5548{
5549 return ((h->root.type == bfd_link_hash_defined
5550 || h->root.type == bfd_link_hash_defweak)
5551 && h->root.u.def.section != NULL
5552 && h->root.u.def.section->output_section != NULL);
5553}
5554
b31867b6
AM
5555/* If FDH is a function descriptor symbol, return the associated code
5556 entry symbol if it is defined. Return NULL otherwise. */
5557
5558static struct ppc_link_hash_entry *
5559defined_code_entry (struct ppc_link_hash_entry *fdh)
5560{
5561 if (fdh->is_func_descriptor)
5562 {
5563 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
5564 if (fh->elf.root.type == bfd_link_hash_defined
5565 || fh->elf.root.type == bfd_link_hash_defweak)
5566 return fh;
5567 }
5568 return NULL;
5569}
5570
5571/* If FH is a function code entry symbol, return the associated
5572 function descriptor symbol if it is defined. Return NULL otherwise. */
5573
5574static struct ppc_link_hash_entry *
5575defined_func_desc (struct ppc_link_hash_entry *fh)
5576{
5577 if (fh->oh != NULL
5578 && fh->oh->is_func_descriptor)
5579 {
5580 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
5581 if (fdh->elf.root.type == bfd_link_hash_defined
5582 || fdh->elf.root.type == bfd_link_hash_defweak)
5583 return fdh;
5584 }
5585 return NULL;
5586}
5587
ed7007c1
AM
5588/* Given H is a symbol that satisfies is_static_defined, return the
5589 value in the output file. */
5590
5591static bfd_vma
5592defined_sym_val (struct elf_link_hash_entry *h)
5593{
5594 return (h->root.u.def.section->output_section->vma
5595 + h->root.u.def.section->output_offset
5596 + h->root.u.def.value);
5597}
5598
5599/* Return true if H matches __tls_get_addr or one of its variants. */
5600
5601static bfd_boolean
5602is_tls_get_addr (struct elf_link_hash_entry *h,
5603 struct ppc_link_hash_table *htab)
5604{
9e7028aa
AM
5605 return (h == &htab->tls_get_addr_fd->elf || h == &htab->tga_desc_fd->elf
5606 || h == &htab->tls_get_addr->elf || h == &htab->tga_desc->elf);
ed7007c1
AM
5607}
5608
8c5b4e52
AM
5609static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
5610
5611/* Garbage collect sections, after first dealing with dot-symbols. */
5612
5613static bfd_boolean
5614ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
5615{
5616 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5617
5618 if (htab != NULL && htab->need_func_desc_adj)
5619 {
5620 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5621 htab->need_func_desc_adj = 0;
5622 }
5623 return bfd_elf_gc_sections (abfd, info);
5624}
5625
74f0fb50
AM
5626/* Mark all our entry sym sections, both opd and code section. */
5627
5628static void
5629ppc64_elf_gc_keep (struct bfd_link_info *info)
5630{
5631 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5632 struct bfd_sym_chain *sym;
5633
4dfe6ac6
NC
5634 if (htab == NULL)
5635 return;
5636
74f0fb50
AM
5637 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5638 {
b31867b6 5639 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
5640 asection *sec;
5641
ed7007c1
AM
5642 eh = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, sym->name,
5643 FALSE, FALSE, TRUE));
74f0fb50
AM
5644 if (eh == NULL)
5645 continue;
5646 if (eh->elf.root.type != bfd_link_hash_defined
5647 && eh->elf.root.type != bfd_link_hash_defweak)
5648 continue;
5649
b31867b6
AM
5650 fh = defined_code_entry (eh);
5651 if (fh != NULL)
74f0fb50 5652 {
b31867b6 5653 sec = fh->elf.root.u.def.section;
74f0fb50
AM
5654 sec->flags |= SEC_KEEP;
5655 }
5656 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5657 && opd_entry_value (eh->elf.root.u.def.section,
5658 eh->elf.root.u.def.value,
aef36ac1 5659 &sec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50
AM
5660 sec->flags |= SEC_KEEP;
5661
5662 sec = eh->elf.root.u.def.section;
5663 sec->flags |= SEC_KEEP;
5664 }
5665}
5666
64d03ab5
AM
5667/* Mark sections containing dynamically referenced symbols. When
5668 building shared libraries, we must assume that any visible symbol is
5669 referenced. */
5670
5671static bfd_boolean
5672ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5673{
5674 struct bfd_link_info *info = (struct bfd_link_info *) inf;
ed7007c1 5675 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
b31867b6 5676 struct ppc_link_hash_entry *fdh;
b407645f 5677 struct bfd_elf_dynamic_list *d = info->dynamic_list;
64d03ab5 5678
64d03ab5 5679 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
5680 fdh = defined_func_desc (eh);
5681 if (fdh != NULL)
5682 eh = fdh;
64d03ab5
AM
5683
5684 if ((eh->elf.root.type == bfd_link_hash_defined
5685 || eh->elf.root.type == bfd_link_hash_defweak)
87e79a65 5686 && ((eh->elf.ref_dynamic && !eh->elf.forced_local)
1c9177d9 5687 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
64d03ab5 5688 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8 5689 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
0e1862bb 5690 && (!bfd_link_executable (info)
e278ae05 5691 || info->gc_keep_exported
b407645f
AM
5692 || info->export_dynamic
5693 || (eh->elf.dynamic
5694 && d != NULL
2cdcc330
AM
5695 && (*d->match) (&d->head, NULL,
5696 eh->elf.root.root.string)))
e278ae05 5697 && (eh->elf.versioned >= versioned
4c58e0d8
AM
5698 || !bfd_hide_sym_by_version (info->version_info,
5699 eh->elf.root.root.string)))))
64d03ab5
AM
5700 {
5701 asection *code_sec;
b31867b6 5702 struct ppc_link_hash_entry *fh;
64d03ab5
AM
5703
5704 eh->elf.root.u.def.section->flags |= SEC_KEEP;
5705
5706 /* Function descriptor syms cause the associated
5707 function code sym section to be marked. */
b31867b6
AM
5708 fh = defined_code_entry (eh);
5709 if (fh != NULL)
5710 {
5711 code_sec = fh->elf.root.u.def.section;
5712 code_sec->flags |= SEC_KEEP;
5713 }
64d03ab5
AM
5714 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5715 && opd_entry_value (eh->elf.root.u.def.section,
5716 eh->elf.root.u.def.value,
aef36ac1 5717 &code_sec, NULL, FALSE) != (bfd_vma) -1)
64d03ab5
AM
5718 code_sec->flags |= SEC_KEEP;
5719 }
5720
5721 return TRUE;
5722}
5723
5bd4f169
AM
5724/* Return the section that should be marked against GC for a given
5725 relocation. */
5726
5727static asection *
4ce794b7 5728ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 5729 struct bfd_link_info *info,
4ce794b7
AM
5730 Elf_Internal_Rela *rel,
5731 struct elf_link_hash_entry *h,
5732 Elf_Internal_Sym *sym)
5bd4f169 5733{
ccfa59ea
AM
5734 asection *rsec;
5735
ccfa59ea
AM
5736 /* Syms return NULL if we're marking .opd, so we avoid marking all
5737 function sections, as all functions are referenced in .opd. */
5738 rsec = NULL;
5739 if (get_opd_info (sec) != NULL)
5740 return rsec;
1e2f5b6e 5741
5bd4f169
AM
5742 if (h != NULL)
5743 {
04c9666a 5744 enum elf_ppc64_reloc_type r_type;
b31867b6 5745 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 5746
4ce794b7 5747 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 5748 switch (r_type)
5bd4f169
AM
5749 {
5750 case R_PPC64_GNU_VTINHERIT:
5751 case R_PPC64_GNU_VTENTRY:
5752 break;
5753
5754 default:
5755 switch (h->root.type)
5756 {
5757 case bfd_link_hash_defined:
5758 case bfd_link_hash_defweak:
ed7007c1 5759 eh = ppc_elf_hash_entry (h);
b31867b6
AM
5760 fdh = defined_func_desc (eh);
5761 if (fdh != NULL)
8c5b4e52
AM
5762 {
5763 /* -mcall-aixdesc code references the dot-symbol on
5764 a call reloc. Mark the function descriptor too
5765 against garbage collection. */
5766 fdh->elf.mark = 1;
60d67dc8
AM
5767 if (fdh->elf.is_weakalias)
5768 weakdef (&fdh->elf)->mark = 1;
8c5b4e52
AM
5769 eh = fdh;
5770 }
1e2f5b6e
AM
5771
5772 /* Function descriptor syms cause the associated
5773 function code sym section to be marked. */
b31867b6
AM
5774 fh = defined_code_entry (eh);
5775 if (fh != NULL)
ccfa59ea
AM
5776 {
5777 /* They also mark their opd section. */
74f0fb50 5778 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5779
b31867b6 5780 rsec = fh->elf.root.u.def.section;
ccfa59ea 5781 }
8387904d
AM
5782 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5783 && opd_entry_value (eh->elf.root.u.def.section,
5784 eh->elf.root.u.def.value,
aef36ac1 5785 &rsec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50 5786 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5787 else
1e2f5b6e
AM
5788 rsec = h->root.u.def.section;
5789 break;
5bd4f169
AM
5790
5791 case bfd_link_hash_common:
1e2f5b6e
AM
5792 rsec = h->root.u.c.p->section;
5793 break;
5bd4f169
AM
5794
5795 default:
fb34365b 5796 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
5797 }
5798 }
5799 }
5800 else
5801 {
74f0fb50 5802 struct _opd_sec_data *opd;
1e2f5b6e
AM
5803
5804 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
5805 opd = get_opd_info (rsec);
5806 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 5807 {
74f0fb50 5808 rsec->gc_mark = 1;
ccfa59ea 5809
51aecdc5 5810 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
ccfa59ea 5811 }
5bd4f169
AM
5812 }
5813
1e2f5b6e 5814 return rsec;
5bd4f169
AM
5815}
5816
deb0e272
AM
5817/* The maximum size of .sfpr. */
5818#define SFPR_MAX (218*4)
5819
5820struct sfpr_def_parms
5821{
699733f6
AM
5822 const char name[12];
5823 unsigned char lo, hi;
2cdcc330
AM
5824 bfd_byte *(*write_ent) (bfd *, bfd_byte *, int);
5825 bfd_byte *(*write_tail) (bfd *, bfd_byte *, int);
deb0e272
AM
5826};
5827
a4b6fadd
AM
5828/* Auto-generate _save*, _rest* functions in .sfpr.
5829 If STUB_SEC is non-null, define alias symbols in STUB_SEC
5830 instead. */
deb0e272 5831
4dfe6ac6 5832static bfd_boolean
a4b6fadd
AM
5833sfpr_define (struct bfd_link_info *info,
5834 const struct sfpr_def_parms *parm,
5835 asection *stub_sec)
deb0e272
AM
5836{
5837 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5838 unsigned int i;
5839 size_t len = strlen (parm->name);
5840 bfd_boolean writing = FALSE;
699733f6 5841 char sym[16];
deb0e272 5842
4dfe6ac6
NC
5843 if (htab == NULL)
5844 return FALSE;
5845
deb0e272
AM
5846 memcpy (sym, parm->name, len);
5847 sym[len + 2] = 0;
5848
5849 for (i = parm->lo; i <= parm->hi; i++)
5850 {
a4b6fadd 5851 struct ppc_link_hash_entry *h;
deb0e272
AM
5852
5853 sym[len + 0] = i / 10 + '0';
5854 sym[len + 1] = i % 10 + '0';
ed7007c1
AM
5855 h = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, sym,
5856 writing, TRUE, TRUE));
a4b6fadd 5857 if (stub_sec != NULL)
deb0e272 5858 {
a4b6fadd
AM
5859 if (h != NULL
5860 && h->elf.root.type == bfd_link_hash_defined
5861 && h->elf.root.u.def.section == htab->sfpr)
5862 {
5863 struct elf_link_hash_entry *s;
5864 char buf[32];
5865 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
5866 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
5867 if (s == NULL)
5868 return FALSE;
779f2ae7 5869 if (s->root.type == bfd_link_hash_new)
a4b6fadd
AM
5870 {
5871 s->root.type = bfd_link_hash_defined;
5872 s->root.u.def.section = stub_sec;
7dda8d3c 5873 s->root.u.def.value = (stub_sec->size - htab->sfpr->size
a4b6fadd
AM
5874 + h->elf.root.u.def.value);
5875 s->ref_regular = 1;
5876 s->def_regular = 1;
5877 s->ref_regular_nonweak = 1;
5878 s->forced_local = 1;
5879 s->non_elf = 0;
5880 s->root.linker_def = 1;
5881 }
5882 }
5883 continue;
5884 }
5885 if (h != NULL)
5886 {
5887 h->save_res = 1;
5888 if (!h->elf.def_regular)
deb0e272 5889 {
a4b6fadd
AM
5890 h->elf.root.type = bfd_link_hash_defined;
5891 h->elf.root.u.def.section = htab->sfpr;
5892 h->elf.root.u.def.value = htab->sfpr->size;
5893 h->elf.type = STT_FUNC;
5894 h->elf.def_regular = 1;
b32547cd 5895 h->elf.non_elf = 0;
a4b6fadd
AM
5896 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
5897 writing = TRUE;
deb0e272 5898 if (htab->sfpr->contents == NULL)
a4b6fadd 5899 {
2cdcc330
AM
5900 htab->sfpr->contents
5901 = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
a4b6fadd
AM
5902 if (htab->sfpr->contents == NULL)
5903 return FALSE;
5904 }
deb0e272
AM
5905 }
5906 }
5907 if (writing)
5908 {
5909 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5910 if (i != parm->hi)
5911 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5912 else
5913 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5914 htab->sfpr->size = p - htab->sfpr->contents;
5915 }
5916 }
5917
5918 return TRUE;
5919}
5920
5921static bfd_byte *
5922savegpr0 (bfd *abfd, bfd_byte *p, int r)
5923{
5924 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5925 return p + 4;
5926}
5927
5928static bfd_byte *
5929savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5930{
5931 p = savegpr0 (abfd, p, r);
a078d95a 5932 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
5933 p = p + 4;
5934 bfd_put_32 (abfd, BLR, p);
5935 return p + 4;
5936}
5937
5938static bfd_byte *
5939restgpr0 (bfd *abfd, bfd_byte *p, int r)
5940{
5941 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5942 return p + 4;
5943}
5944
5945static bfd_byte *
5946restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5947{
a078d95a 5948 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
5949 p = p + 4;
5950 p = restgpr0 (abfd, p, r);
5951 bfd_put_32 (abfd, MTLR_R0, p);
5952 p = p + 4;
5953 if (r == 29)
5954 {
5955 p = restgpr0 (abfd, p, 30);
5956 p = restgpr0 (abfd, p, 31);
5957 }
5958 bfd_put_32 (abfd, BLR, p);
5959 return p + 4;
5960}
5961
5962static bfd_byte *
5963savegpr1 (bfd *abfd, bfd_byte *p, int r)
5964{
5965 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5966 return p + 4;
5967}
5968
5969static bfd_byte *
5970savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5971{
5972 p = savegpr1 (abfd, p, r);
5973 bfd_put_32 (abfd, BLR, p);
5974 return p + 4;
5975}
5976
5977static bfd_byte *
5978restgpr1 (bfd *abfd, bfd_byte *p, int r)
5979{
5980 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5981 return p + 4;
5982}
5983
5984static bfd_byte *
5985restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5986{
5987 p = restgpr1 (abfd, p, r);
5988 bfd_put_32 (abfd, BLR, p);
5989 return p + 4;
5990}
5991
5992static bfd_byte *
5993savefpr (bfd *abfd, bfd_byte *p, int r)
5994{
5995 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5996 return p + 4;
5997}
5998
5999static bfd_byte *
6000savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6001{
6002 p = savefpr (abfd, p, r);
a078d95a 6003 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6004 p = p + 4;
6005 bfd_put_32 (abfd, BLR, p);
6006 return p + 4;
6007}
6008
6009static bfd_byte *
6010restfpr (bfd *abfd, bfd_byte *p, int r)
6011{
6012 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6013 return p + 4;
6014}
6015
6016static bfd_byte *
6017restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6018{
a078d95a 6019 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6020 p = p + 4;
6021 p = restfpr (abfd, p, r);
6022 bfd_put_32 (abfd, MTLR_R0, p);
6023 p = p + 4;
6024 if (r == 29)
6025 {
6026 p = restfpr (abfd, p, 30);
6027 p = restfpr (abfd, p, 31);
6028 }
6029 bfd_put_32 (abfd, BLR, p);
6030 return p + 4;
6031}
6032
6033static bfd_byte *
6034savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6035{
6036 p = savefpr (abfd, p, r);
6037 bfd_put_32 (abfd, BLR, p);
6038 return p + 4;
6039}
6040
6041static bfd_byte *
6042restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6043{
6044 p = restfpr (abfd, p, r);
6045 bfd_put_32 (abfd, BLR, p);
6046 return p + 4;
6047}
6048
6049static bfd_byte *
6050savevr (bfd *abfd, bfd_byte *p, int r)
6051{
6052 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6053 p = p + 4;
6054 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6055 return p + 4;
6056}
6057
6058static bfd_byte *
6059savevr_tail (bfd *abfd, bfd_byte *p, int r)
6060{
6061 p = savevr (abfd, p, r);
6062 bfd_put_32 (abfd, BLR, p);
6063 return p + 4;
6064}
6065
6066static bfd_byte *
6067restvr (bfd *abfd, bfd_byte *p, int r)
6068{
6069 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6070 p = p + 4;
6071 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6072 return p + 4;
6073}
6074
6075static bfd_byte *
6076restvr_tail (bfd *abfd, bfd_byte *p, int r)
6077{
6078 p = restvr (abfd, p, r);
6079 bfd_put_32 (abfd, BLR, p);
6080 return p + 4;
6081}
6082
9e7028aa
AM
6083#define STDU_R1_0R1 0xf8210001
6084#define ADDI_R1_R1 0x38210000
6085
6086/* Emit prologue of wrapper preserving regs around a call to
6087 __tls_get_addr_opt. */
6088
6089static bfd_byte *
6090tls_get_addr_prologue (bfd *obfd, bfd_byte *p, struct ppc_link_hash_table *htab)
6091{
6092 unsigned int i;
6093
6094 bfd_put_32 (obfd, MFLR_R0, p);
6095 p += 4;
6096 bfd_put_32 (obfd, STD_R0_0R1 + 16, p);
6097 p += 4;
6098
6099 if (htab->opd_abi)
6100 {
6101 for (i = 4; i < 12; i++)
6102 {
6103 bfd_put_32 (obfd,
6104 STD_R0_0R1 | i << 21 | (-(13 - i) * 8 & 0xffff), p);
6105 p += 4;
6106 }
6107 bfd_put_32 (obfd, STDU_R1_0R1 | (-128 & 0xffff), p);
6108 p += 4;
6109 }
6110 else
6111 {
6112 for (i = 4; i < 12; i++)
6113 {
6114 bfd_put_32 (obfd,
6115 STD_R0_0R1 | i << 21 | (-(12 - i) * 8 & 0xffff), p);
6116 p += 4;
6117 }
6118 bfd_put_32 (obfd, STDU_R1_0R1 | (-96 & 0xffff), p);
6119 p += 4;
6120 }
6121 return p;
6122}
6123
6124/* Emit epilogue of wrapper preserving regs around a call to
6125 __tls_get_addr_opt. */
6126
6127static bfd_byte *
6128tls_get_addr_epilogue (bfd *obfd, bfd_byte *p, struct ppc_link_hash_table *htab)
6129{
6130 unsigned int i;
6131
6132 if (htab->opd_abi)
6133 {
6134 for (i = 4; i < 12; i++)
6135 {
6136 bfd_put_32 (obfd, LD_R0_0R1 | i << 21 | (128 - (13 - i) * 8), p);
6137 p += 4;
6138 }
6139 bfd_put_32 (obfd, ADDI_R1_R1 | 128, p);
6140 p += 4;
6141 }
6142 else
6143 {
6144 for (i = 4; i < 12; i++)
6145 {
6146 bfd_put_32 (obfd, LD_R0_0R1 | i << 21 | (96 - (12 - i) * 8), p);
6147 p += 4;
6148 }
6149 bfd_put_32 (obfd, ADDI_R1_R1 | 96, p);
6150 p += 4;
6151 }
6152 bfd_put_32 (obfd, LD_R0_0R1 | 16, p);
6153 p += 4;
6154 bfd_put_32 (obfd, MTLR_R0, p);
6155 p += 4;
6156 bfd_put_32 (obfd, BLR, p);
6157 p += 4;
6158 return p;
6159}
6160
e86ce104
AM
6161/* Called via elf_link_hash_traverse to transfer dynamic linking
6162 information on function code symbol entries to their corresponding
6163 function descriptor symbol entries. */
deb0e272 6164
b34976b6 6165static bfd_boolean
4ce794b7 6166func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6167{
e86ce104 6168 struct bfd_link_info *info;
65f38f15 6169 struct ppc_link_hash_table *htab;
50bc7936
AM
6170 struct ppc_link_hash_entry *fh;
6171 struct ppc_link_hash_entry *fdh;
6172 bfd_boolean force_local;
5bd4f169 6173
ed7007c1 6174 fh = ppc_elf_hash_entry (h);
50bc7936 6175 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 6176 return TRUE;
e86ce104 6177
8c5b4e52
AM
6178 if (!fh->is_func)
6179 return TRUE;
6180
6181 if (fh->elf.root.root.string[0] != '.'
6182 || fh->elf.root.root.string[1] == '\0')
6183 return TRUE;
6184
4ce794b7 6185 info = inf;
65f38f15 6186 htab = ppc_hash_table (info);
4dfe6ac6
NC
6187 if (htab == NULL)
6188 return FALSE;
5bd4f169 6189
8c5b4e52
AM
6190 /* Find the corresponding function descriptor symbol. */
6191 fdh = lookup_fdh (fh, htab);
6192
c09bdfe5
AM
6193 /* Resolve undefined references to dot-symbols as the value
6194 in the function descriptor, if we have one in a regular object.
6195 This is to satisfy cases like ".quad .foo". Calls to functions
6196 in dynamic objects are handled elsewhere. */
8c5b4e52
AM
6197 if ((fh->elf.root.type == bfd_link_hash_undefined
6198 || fh->elf.root.type == bfd_link_hash_undefweak)
6199 && (fdh->elf.root.type == bfd_link_hash_defined
6200 || fdh->elf.root.type == bfd_link_hash_defweak)
b31867b6
AM
6201 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6202 && opd_entry_value (fdh->elf.root.u.def.section,
6203 fdh->elf.root.u.def.value,
c09bdfe5 6204 &fh->elf.root.u.def.section,
aef36ac1 6205 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
c09bdfe5 6206 {
b31867b6 6207 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 6208 fh->elf.forced_local = 1;
b31867b6
AM
6209 fh->elf.def_regular = fdh->elf.def_regular;
6210 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
6211 }
6212
8c5b4e52
AM
6213 if (!fh->elf.dynamic)
6214 {
6215 struct plt_entry *ent;
5bd4f169 6216
8c5b4e52
AM
6217 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6218 if (ent->plt.refcount > 0)
6219 break;
6220 if (ent == NULL)
6221 return TRUE;
6222 }
5bd4f169 6223
8c5b4e52 6224 /* Create a descriptor as undefined if necessary. */
50bc7936 6225 if (fdh == NULL
0e1862bb 6226 && !bfd_link_executable (info)
50bc7936
AM
6227 && (fh->elf.root.type == bfd_link_hash_undefined
6228 || fh->elf.root.type == bfd_link_hash_undefweak))
6229 {
908b32fc 6230 fdh = make_fdh (info, fh);
bb700d78
AM
6231 if (fdh == NULL)
6232 return FALSE;
50bc7936 6233 }
648cca2c 6234
8c5b4e52 6235 /* We can't support overriding of symbols on a fake descriptor. */
908b32fc
AM
6236 if (fdh != NULL
6237 && fdh->fake
8c5b4e52
AM
6238 && (fh->elf.root.type == bfd_link_hash_defined
6239 || fh->elf.root.type == bfd_link_hash_defweak))
6240 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
908b32fc 6241
8c5b4e52
AM
6242 /* Transfer dynamic linking information to the function descriptor. */
6243 if (fdh != NULL)
6244 {
f5385ebf
AM
6245 fdh->elf.ref_regular |= fh->elf.ref_regular;
6246 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6247 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6248 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
8c5b4e52
AM
6249 fdh->elf.dynamic |= fh->elf.dynamic;
6250 fdh->elf.needs_plt |= (fh->elf.needs_plt
6251 || fh->elf.type == STT_FUNC
6252 || fh->elf.type == STT_GNU_IFUNC);
6253 move_plt_plist (fh, fdh);
6254
6255 if (!fdh->elf.forced_local
6256 && fh->elf.dynindx != -1)
6257 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6258 return FALSE;
e86ce104
AM
6259 }
6260
50bc7936
AM
6261 /* Now that the info is on the function descriptor, clear the
6262 function code sym info. Any function code syms for which we
6263 don't have a definition in a regular file, we force local.
6264 This prevents a shared library from exporting syms that have
6265 been imported from another library. Function code syms that
6266 are really in the library we must leave global to prevent the
6267 linker dragging in a definition from a static library. */
93f3fa99
AM
6268 force_local = (!fh->elf.def_regular
6269 || fdh == NULL
6270 || !fdh->elf.def_regular
6271 || fdh->elf.forced_local);
50bc7936
AM
6272 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6273
b34976b6 6274 return TRUE;
e86ce104 6275}
40b8271b 6276
a4b6fadd
AM
6277static const struct sfpr_def_parms save_res_funcs[] =
6278 {
6279 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6280 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6281 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6282 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6283 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6284 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6285 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6286 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6287 { "._savef", 14, 31, savefpr, savefpr1_tail },
6288 { "._restf", 14, 31, restfpr, restfpr1_tail },
6289 { "_savevr_", 20, 31, savevr, savevr_tail },
6290 { "_restvr_", 20, 31, restvr, restvr_tail }
6291 };
6292
e86ce104 6293/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
6294 this hook to a) provide some gcc support functions, and b) transfer
6295 dynamic linking information gathered so far on function code symbol
6296 entries, to their corresponding function descriptor symbol entries. */
deb0e272 6297
b34976b6 6298static bfd_boolean
4ce794b7
AM
6299ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6300 struct bfd_link_info *info)
e86ce104
AM
6301{
6302 struct ppc_link_hash_table *htab;
6303
6304 htab = ppc_hash_table (info);
4dfe6ac6
NC
6305 if (htab == NULL)
6306 return FALSE;
6307
b32547cd
AM
6308 /* Provide any missing _save* and _rest* functions. */
6309 if (htab->sfpr != NULL)
6310 {
6311 unsigned int i;
6312
6313 htab->sfpr->size = 0;
6314 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
6315 if (!sfpr_define (info, &save_res_funcs[i], NULL))
6316 return FALSE;
6317 if (htab->sfpr->size == 0)
6318 htab->sfpr->flags |= SEC_EXCLUDE;
6319 }
6320
6321 if (bfd_link_relocatable (info))
6322 return TRUE;
6323
6324 if (htab->elf.hgot != NULL)
dba6fa9b
AM
6325 {
6326 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
6327 /* Make .TOC. defined so as to prevent it being made dynamic.
6328 The wrong value here is fixed later in ppc64_elf_set_toc. */
43417696
AM
6329 if (!htab->elf.hgot->def_regular
6330 || htab->elf.hgot->root.type != bfd_link_hash_defined)
6331 {
6332 htab->elf.hgot->root.type = bfd_link_hash_defined;
6333 htab->elf.hgot->root.u.def.value = 0;
6334 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
6335 htab->elf.hgot->def_regular = 1;
6336 htab->elf.hgot->root.linker_def = 1;
6337 }
dba6fa9b 6338 htab->elf.hgot->type = STT_OBJECT;
2cdcc330
AM
6339 htab->elf.hgot->other
6340 = (htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
dba6fa9b 6341 }
c66bb0ee 6342
8c5b4e52
AM
6343 if (htab->need_func_desc_adj)
6344 {
6345 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6346 htab->need_func_desc_adj = 0;
6347 }
805fc799 6348
b34976b6 6349 return TRUE;
e86ce104
AM
6350}
6351
98bbb1b8 6352/* Find dynamic relocs for H that apply to read-only sections. */
a345bc8d 6353
98bbb1b8 6354static asection *
a345bc8d
AM
6355readonly_dynrelocs (struct elf_link_hash_entry *h)
6356{
ed7007c1 6357 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
a345bc8d
AM
6358 struct elf_dyn_relocs *p;
6359
a345bc8d
AM
6360 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6361 {
6362 asection *s = p->sec->output_section;
6363
6364 if (s != NULL && (s->flags & SEC_READONLY) != 0)
98bbb1b8 6365 return p->sec;
a345bc8d 6366 }
98bbb1b8 6367 return NULL;
a345bc8d
AM
6368}
6369
d311bc8b 6370/* Return true if we have dynamic relocs against H or any of its weak
ab2477e1
AM
6371 aliases, that apply to read-only sections. Cannot be used after
6372 size_dynamic_sections. */
d311bc8b
AM
6373
6374static bfd_boolean
6375alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
6376{
ed7007c1 6377 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
d311bc8b
AM
6378 do
6379 {
6380 if (readonly_dynrelocs (&eh->elf))
6381 return TRUE;
ed7007c1 6382 eh = ppc_elf_hash_entry (eh->elf.u.alias);
2cdcc330
AM
6383 }
6384 while (eh != NULL && &eh->elf != h);
d311bc8b
AM
6385
6386 return FALSE;
6387}
8a2058b5 6388
8a9e8e72
AM
6389/* Return whether EH has pc-relative dynamic relocs. */
6390
6391static bfd_boolean
6392pc_dynrelocs (struct ppc_link_hash_entry *eh)
6393{
6394 struct elf_dyn_relocs *p;
6395
6396 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6397 if (p->pc_count != 0)
6398 return TRUE;
6399 return FALSE;
6400}
6401
8a2058b5
AM
6402/* Return true if a global entry stub will be created for H. Valid
6403 for ELFv2 before plt entries have been allocated. */
6404
6405static bfd_boolean
6406global_entry_stub (struct elf_link_hash_entry *h)
6407{
6408 struct plt_entry *pent;
6409
6410 if (!h->pointer_equality_needed
6411 || h->def_regular)
6412 return FALSE;
6413
6414 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
6415 if (pent->plt.refcount > 0
6416 && pent->addend == 0)
6417 return TRUE;
6418
6419 return FALSE;
6420}
6421
e86ce104
AM
6422/* Adjust a symbol defined by a dynamic object and referenced by a
6423 regular object. The current definition is in some section of the
6424 dynamic object, but we're not including those sections. We have to
6425 change the definition to something the rest of the link can
6426 understand. */
6427
b34976b6 6428static bfd_boolean
4ce794b7
AM
6429ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6430 struct elf_link_hash_entry *h)
e86ce104
AM
6431{
6432 struct ppc_link_hash_table *htab;
5474d94f 6433 asection *s, *srel;
e86ce104
AM
6434
6435 htab = ppc_hash_table (info);
4dfe6ac6
NC
6436 if (htab == NULL)
6437 return FALSE;
e86ce104
AM
6438
6439 /* Deal with function syms. */
6440 if (h->type == STT_FUNC
e054468f 6441 || h->type == STT_GNU_IFUNC
f5385ebf 6442 || h->needs_plt)
e86ce104 6443 {
ed7007c1 6444 bfd_boolean local = (ppc_elf_hash_entry (h)->save_res
529fe20e
AM
6445 || SYMBOL_CALLS_LOCAL (info, h)
6446 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
6447 /* Discard dyn_relocs when non-pic if we've decided that a
6448 function symbol is local and not an ifunc. We keep dynamic
6449 relocs for ifuncs when local rather than always emitting a
6450 plt call stub for them and defining the symbol on the call
6451 stub. We can't do that for ELFv1 anyway (a function symbol
6452 is defined on a descriptor, not code) and it can be faster at
6453 run-time due to not needing to bounce through a stub. The
6454 dyn_relocs for ifuncs will be applied even in a static
6455 executable. */
6456 if (!bfd_link_pic (info)
6457 && h->type != STT_GNU_IFUNC
6458 && local)
ed7007c1 6459 ppc_elf_hash_entry (h)->dyn_relocs = NULL;
529fe20e 6460
e86ce104
AM
6461 /* Clear procedure linkage table information for any symbol that
6462 won't need a .plt entry. */
411e1bfb
AM
6463 struct plt_entry *ent;
6464 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6465 if (ent->plt.refcount > 0)
6466 break;
8387904d 6467 if (ent == NULL
2d7ad24e
AM
6468 || (h->type != STT_GNU_IFUNC
6469 && local
3e04d765 6470 && (htab->can_convert_all_inline_plt
ed7007c1 6471 || (ppc_elf_hash_entry (h)->tls_mask
3e04d765 6472 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
40b8271b 6473 {
411e1bfb 6474 h->plt.plist = NULL;
f5385ebf 6475 h->needs_plt = 0;
d1eca1e4 6476 h->pointer_equality_needed = 0;
40b8271b 6477 }
8a2058b5 6478 else if (abiversion (info->output_bfd) >= 2)
a345bc8d 6479 {
d1eca1e4
AM
6480 /* Taking a function's address in a read/write section
6481 doesn't require us to define the function symbol in the
6482 executable on a global entry stub. A dynamic reloc can
8a2058b5
AM
6483 be used instead. The reason we prefer a few more dynamic
6484 relocs is that calling via a global entry stub costs a
6485 few more instructions, and pointer_equality_needed causes
6486 extra work in ld.so when resolving these symbols. */
529fe20e 6487 if (global_entry_stub (h))
d1eca1e4 6488 {
ab2477e1 6489 if (!readonly_dynrelocs (h))
529fe20e
AM
6490 {
6491 h->pointer_equality_needed = 0;
04383fd1
AM
6492 /* If we haven't seen a branch reloc and the symbol
6493 isn't an ifunc then we don't need a plt entry. */
529fe20e
AM
6494 if (!h->needs_plt)
6495 h->plt.plist = NULL;
6496 }
6497 else if (!bfd_link_pic (info))
6498 /* We are going to be defining the function symbol on the
6499 plt stub, so no dyn_relocs needed when non-pic. */
ed7007c1 6500 ppc_elf_hash_entry (h)->dyn_relocs = NULL;
d1eca1e4
AM
6501 }
6502
3988aed5
AM
6503 /* ELFv2 function symbols can't have copy relocs. */
6504 return TRUE;
6505 }
6506 else if (!h->needs_plt
ab2477e1 6507 && !readonly_dynrelocs (h))
3988aed5 6508 {
04383fd1
AM
6509 /* If we haven't seen a branch reloc and the symbol isn't an
6510 ifunc then we don't need a plt entry. */
3988aed5
AM
6511 h->plt.plist = NULL;
6512 h->pointer_equality_needed = 0;
a345bc8d
AM
6513 return TRUE;
6514 }
5bd4f169 6515 }
bbd7ec4a 6516 else
411e1bfb 6517 h->plt.plist = NULL;
5bd4f169
AM
6518
6519 /* If this is a weak symbol, and there is a real definition, the
6520 processor independent code will have arranged for us to see the
6521 real definition first, and we can just use the same value. */
60d67dc8 6522 if (h->is_weakalias)
5bd4f169 6523 {
60d67dc8
AM
6524 struct elf_link_hash_entry *def = weakdef (h);
6525 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
6526 h->root.u.def.section = def->root.u.def.section;
6527 h->root.u.def.value = def->root.u.def.value;
4a7e5234
AM
6528 if (def->root.u.def.section == htab->elf.sdynbss
6529 || def->root.u.def.section == htab->elf.sdynrelro)
ed7007c1 6530 ppc_elf_hash_entry (h)->dyn_relocs = NULL;
b34976b6 6531 return TRUE;
5bd4f169
AM
6532 }
6533
5bd4f169
AM
6534 /* If we are creating a shared library, we must presume that the
6535 only references to the symbol are via the global offset table.
6536 For such cases we need not do anything here; the relocations will
6537 be handled correctly by relocate_section. */
ec73ddcd 6538 if (!bfd_link_executable (info))
b34976b6 6539 return TRUE;
5bd4f169 6540
65f38f15
AM
6541 /* If there are no references to this symbol that do not use the
6542 GOT, we don't need to generate a copy reloc. */
f5385ebf 6543 if (!h->non_got_ref)
b34976b6 6544 return TRUE;
65f38f15 6545
b186458a 6546 /* Don't generate a copy reloc for symbols defined in the executable. */
d93d1c80 6547 if (!h->def_dynamic || !h->ref_regular || h->def_regular
b186458a 6548
d93d1c80
AM
6549 /* If -z nocopyreloc was given, don't generate them either. */
6550 || info->nocopyreloc
a127494f 6551
dce2246a 6552 /* If we don't find any dynamic relocs in read-only sections, then
d93d1c80 6553 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1bdd8fac
AM
6554 || (ELIMINATE_COPY_RELOCS
6555 && !h->needs_copy
6556 && !alias_readonly_dynrelocs (h))
65f38f15 6557
d93d1c80
AM
6558 /* Protected variables do not work with .dynbss. The copy in
6559 .dynbss won't be used by the shared library with the protected
6560 definition for the variable. Text relocations are preferable
6561 to an incorrect program. */
6562 || h->protected_def)
529fe20e 6563 return TRUE;
a127494f 6564
e1c6cf61
AM
6565 if (h->type == STT_FUNC
6566 || h->type == STT_GNU_IFUNC)
97b639ba 6567 {
e1c6cf61
AM
6568 /* .dynbss copies of function symbols only work if we have
6569 ELFv1 dot-symbols. ELFv1 compilers since 2004 default to not
6570 use dot-symbols and set the function symbol size to the text
6571 size of the function rather than the size of the descriptor.
6572 That's wrong for copying a descriptor. */
ed7007c1 6573 if (ppc_elf_hash_entry (h)->oh == NULL
e1c6cf61
AM
6574 || !(h->size == 24 || h->size == 16))
6575 return TRUE;
6576
6577 /* We should never get here, but unfortunately there are old
6578 versions of gcc (circa gcc-3.2) that improperly for the
6579 ELFv1 ABI put initialized function pointers, vtable refs and
6580 suchlike in read-only sections. Allow them to proceed, but
6581 warn that this might break at runtime. */
25f53a85 6582 info->callbacks->einfo
c1c8c1ef 6583 (_("%P: copy reloc against `%pT' requires lazy plt linking; "
25f53a85 6584 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
6585 h->root.root.string);
6586 }
5d35169e
AM
6587
6588 /* This is a reference to a symbol defined by a dynamic object which
6589 is not a function. */
6590
5bd4f169
AM
6591 /* We must allocate the symbol in our .dynbss section, which will
6592 become part of the .bss section of the executable. There will be
6593 an entry for this symbol in the .dynsym section. The dynamic
6594 object will contain position independent code, so all references
6595 from the dynamic object to this symbol will go through the global
6596 offset table. The dynamic linker will use the .dynsym entry to
6597 determine the address it must put in the global offset table, so
6598 both the dynamic object and the regular object will refer to the
6599 same memory location for the variable. */
5474d94f
AM
6600 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6601 {
6602 s = htab->elf.sdynrelro;
6603 srel = htab->elf.sreldynrelro;
6604 }
6605 else
6606 {
6607 s = htab->elf.sdynbss;
6608 srel = htab->elf.srelbss;
6609 }
1d7e9d18 6610 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 6611 {
4a7e5234
AM
6612 /* We must generate a R_PPC64_COPY reloc to tell the dynamic
6613 linker to copy the initial value out of the dynamic object
6614 and into the runtime process image. */
5474d94f 6615 srel->size += sizeof (Elf64_External_Rela);
f5385ebf 6616 h->needs_copy = 1;
5bd4f169
AM
6617 }
6618
529fe20e 6619 /* We no longer want dyn_relocs. */
ed7007c1 6620 ppc_elf_hash_entry (h)->dyn_relocs = NULL;
6cabe1ea 6621 return _bfd_elf_adjust_dynamic_copy (info, h, s);
5bd4f169
AM
6622}
6623
e86ce104
AM
6624/* If given a function descriptor symbol, hide both the function code
6625 sym and the descriptor. */
6626static void
4ce794b7
AM
6627ppc64_elf_hide_symbol (struct bfd_link_info *info,
6628 struct elf_link_hash_entry *h,
6629 bfd_boolean force_local)
e86ce104 6630{
34814b9f 6631 struct ppc_link_hash_entry *eh;
e86ce104
AM
6632 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6633
87469ba2
AM
6634 if (ppc_hash_table (info) == NULL)
6635 return;
6636
ed7007c1 6637 eh = ppc_elf_hash_entry (h);
34814b9f 6638 if (eh->is_func_descriptor)
e86ce104 6639 {
34814b9f 6640 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 6641
721956f4 6642 if (fh == NULL)
d1329ca3
AM
6643 {
6644 const char *p, *q;
b8ac2841 6645 struct elf_link_hash_table *htab = elf_hash_table (info);
d1329ca3
AM
6646 char save;
6647
6648 /* We aren't supposed to use alloca in BFD because on
6649 systems which do not have alloca the version in libiberty
6650 calls xmalloc, which might cause the program to crash
6651 when it runs out of memory. This function doesn't have a
6652 return status, so there's no way to gracefully return an
6653 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
6654 accessed; It's either a string in an ELF string table,
6655 or allocated in an objalloc structure. */
d1329ca3 6656
34814b9f 6657 p = eh->elf.root.root.string - 1;
d1329ca3
AM
6658 save = *p;
6659 *(char *) p = '.';
ed7007c1
AM
6660 fh = ppc_elf_hash_entry (elf_link_hash_lookup (htab, p, FALSE,
6661 FALSE, FALSE));
d1329ca3
AM
6662 *(char *) p = save;
6663
6664 /* Unfortunately, if it so happens that the string we were
6665 looking for was allocated immediately before this string,
6666 then we overwrote the string terminator. That's the only
6667 reason the lookup should fail. */
6668 if (fh == NULL)
6669 {
34814b9f
AM
6670 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6671 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 6672 --q, --p;
34814b9f 6673 if (q < eh->elf.root.root.string && *p == '.')
ed7007c1
AM
6674 fh = ppc_elf_hash_entry (elf_link_hash_lookup (htab, p, FALSE,
6675 FALSE, FALSE));
d1329ca3
AM
6676 }
6677 if (fh != NULL)
6678 {
34814b9f
AM
6679 eh->oh = fh;
6680 fh->oh = eh;
d1329ca3
AM
6681 }
6682 }
e86ce104 6683 if (fh != NULL)
34814b9f 6684 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
6685 }
6686}
6687
411e1bfb 6688static bfd_boolean
8843416a
AM
6689get_sym_h (struct elf_link_hash_entry **hp,
6690 Elf_Internal_Sym **symp,
6691 asection **symsecp,
f961d9dd 6692 unsigned char **tls_maskp,
8843416a
AM
6693 Elf_Internal_Sym **locsymsp,
6694 unsigned long r_symndx,
6695 bfd *ibfd)
411e1bfb 6696{
0ffa91dd 6697 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
6698
6699 if (r_symndx >= symtab_hdr->sh_info)
6700 {
6701 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6702 struct elf_link_hash_entry *h;
6703
6704 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 6705 h = elf_follow_link (h);
411e1bfb
AM
6706
6707 if (hp != NULL)
6708 *hp = h;
6709
6710 if (symp != NULL)
6711 *symp = NULL;
6712
6713 if (symsecp != NULL)
6714 {
6715 asection *symsec = NULL;
6716 if (h->root.type == bfd_link_hash_defined
6717 || h->root.type == bfd_link_hash_defweak)
6718 symsec = h->root.u.def.section;
6719 *symsecp = symsec;
6720 }
6721
e7b938ca 6722 if (tls_maskp != NULL)
ed7007c1 6723 *tls_maskp = &ppc_elf_hash_entry (h)->tls_mask;
411e1bfb
AM
6724 }
6725 else
6726 {
6727 Elf_Internal_Sym *sym;
6728 Elf_Internal_Sym *locsyms = *locsymsp;
6729
6730 if (locsyms == NULL)
6731 {
6732 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6733 if (locsyms == NULL)
6734 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6735 symtab_hdr->sh_info,
6736 0, NULL, NULL, NULL);
6737 if (locsyms == NULL)
6738 return FALSE;
6739 *locsymsp = locsyms;
6740 }
6741 sym = locsyms + r_symndx;
6742
6743 if (hp != NULL)
6744 *hp = NULL;
6745
6746 if (symp != NULL)
6747 *symp = sym;
6748
6749 if (symsecp != NULL)
cb33740c 6750 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 6751
e7b938ca 6752 if (tls_maskp != NULL)
411e1bfb
AM
6753 {
6754 struct got_entry **lgot_ents;
f961d9dd 6755 unsigned char *tls_mask;
411e1bfb 6756
e7b938ca 6757 tls_mask = NULL;
411e1bfb
AM
6758 lgot_ents = elf_local_got_ents (ibfd);
6759 if (lgot_ents != NULL)
6760 {
e054468f
AM
6761 struct plt_entry **local_plt = (struct plt_entry **)
6762 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 6763 unsigned char *lgot_masks = (unsigned char *)
e054468f 6764 (local_plt + symtab_hdr->sh_info);
e7b938ca 6765 tls_mask = &lgot_masks[r_symndx];
411e1bfb 6766 }
e7b938ca 6767 *tls_maskp = tls_mask;
411e1bfb
AM
6768 }
6769 }
6770 return TRUE;
6771}
6772
e7b938ca 6773/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 6774 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 6775 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
6776
6777static int
f961d9dd 6778get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
6779 unsigned long *toc_symndx,
6780 bfd_vma *toc_addend,
0d4792f7 6781 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
6782 const Elf_Internal_Rela *rel,
6783 bfd *ibfd)
411e1bfb
AM
6784{
6785 unsigned long r_symndx;
0d4792f7 6786 int next_r;
411e1bfb
AM
6787 struct elf_link_hash_entry *h;
6788 Elf_Internal_Sym *sym;
6789 asection *sec;
6790 bfd_vma off;
6791
6792 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 6793 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 6794 return 0;
411e1bfb 6795
37da22e5
AM
6796 if ((*tls_maskp != NULL
6797 && (**tls_maskp & TLS_TLS) != 0
6798 && **tls_maskp != (TLS_TLS | TLS_MARK))
411e1bfb 6799 || sec == NULL
6bee8834 6800 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 6801 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 6802 return 1;
411e1bfb
AM
6803
6804 /* Look inside a TOC section too. */
6805 if (h != NULL)
6806 {
6807 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
6808 off = h->root.u.def.value;
6809 }
6810 else
6811 off = sym->st_value;
6812 off += rel->r_addend;
6813 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
6814 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
6815 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
6816 if (toc_symndx != NULL)
6817 *toc_symndx = r_symndx;
3a71aa26
AM
6818 if (toc_addend != NULL)
6819 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
6820 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6821 return 0;
854b41e7 6822 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
6823 && (next_r == -1 || next_r == -2))
6824 return 1 - next_r;
951fd09b 6825 return 1;
411e1bfb
AM
6826}
6827
3b421ab3
AM
6828/* Find (or create) an entry in the tocsave hash table. */
6829
6830static struct tocsave_entry *
6831tocsave_find (struct ppc_link_hash_table *htab,
6832 enum insert_option insert,
6833 Elf_Internal_Sym **local_syms,
6834 const Elf_Internal_Rela *irela,
6835 bfd *ibfd)
6836{
6837 unsigned long r_indx;
6838 struct elf_link_hash_entry *h;
6839 Elf_Internal_Sym *sym;
6840 struct tocsave_entry ent, *p;
6841 hashval_t hash;
6842 struct tocsave_entry **slot;
6843
6844 r_indx = ELF64_R_SYM (irela->r_info);
6845 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
6846 return NULL;
6847 if (ent.sec == NULL || ent.sec->output_section == NULL)
6848 {
4eca0228 6849 _bfd_error_handler
871b3ab2 6850 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
3b421ab3
AM
6851 return NULL;
6852 }
6853
6854 if (h != NULL)
6855 ent.offset = h->root.u.def.value;
6856 else
6857 ent.offset = sym->st_value;
6858 ent.offset += irela->r_addend;
6859
6860 hash = tocsave_htab_hash (&ent);
6861 slot = ((struct tocsave_entry **)
6862 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
6863 if (slot == NULL)
6864 return NULL;
6865
6866 if (*slot == NULL)
6867 {
6868 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
6869 if (p == NULL)
6870 return NULL;
6871 *p = ent;
6872 *slot = p;
6873 }
6874 return *slot;
6875}
6876
754021d0 6877/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 6878 code for the old ABI, these will already have been done. */
754021d0
AM
6879
6880static bfd_boolean
6881adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
6882{
6883 struct ppc_link_hash_entry *eh;
6884 asection *sym_sec;
74f0fb50 6885 struct _opd_sec_data *opd;
754021d0
AM
6886
6887 if (h->root.type == bfd_link_hash_indirect)
6888 return TRUE;
6889
754021d0
AM
6890 if (h->root.type != bfd_link_hash_defined
6891 && h->root.type != bfd_link_hash_defweak)
6892 return TRUE;
6893
ed7007c1 6894 eh = ppc_elf_hash_entry (h);
754021d0
AM
6895 if (eh->adjust_done)
6896 return TRUE;
6897
6898 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
6899 opd = get_opd_info (sym_sec);
6900 if (opd != NULL && opd->adjust != NULL)
754021d0 6901 {
51aecdc5 6902 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
4025353c
AM
6903 if (adjust == -1)
6904 {
6905 /* This entry has been deleted. */
b3fac117 6906 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
6907 if (dsec == NULL)
6908 {
6909 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 6910 if (discarded_section (dsec))
81688140 6911 {
b3fac117 6912 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
6913 break;
6914 }
6915 }
4025353c 6916 eh->elf.root.u.def.value = 0;
81688140 6917 eh->elf.root.u.def.section = dsec;
4025353c
AM
6918 }
6919 else
6920 eh->elf.root.u.def.value += adjust;
754021d0
AM
6921 eh->adjust_done = 1;
6922 }
6923 return TRUE;
6924}
6925
8c1d1bb8 6926/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 6927 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
6928 have already been determined. */
6929
6930static bfd_boolean
6931dec_dynrel_count (bfd_vma r_info,
6932 asection *sec,
6933 struct bfd_link_info *info,
6934 Elf_Internal_Sym **local_syms,
6935 struct elf_link_hash_entry *h,
19e08130 6936 Elf_Internal_Sym *sym)
8c1d1bb8
AM
6937{
6938 enum elf_ppc64_reloc_type r_type;
19e08130 6939 asection *sym_sec = NULL;
8c1d1bb8
AM
6940
6941 /* Can this reloc be dynamic? This switch, and later tests here
6942 should be kept in sync with the code in check_relocs. */
6943 r_type = ELF64_R_TYPE (r_info);
6944 switch (r_type)
6945 {
6946 default:
6947 return TRUE;
6948
1bdd8fac
AM
6949 case R_PPC64_TOC16:
6950 case R_PPC64_TOC16_DS:
6951 case R_PPC64_TOC16_LO:
6952 case R_PPC64_TOC16_HI:
6953 case R_PPC64_TOC16_HA:
6954 case R_PPC64_TOC16_LO_DS:
6955 if (h == NULL)
6956 return TRUE;
6957 break;
6958
8c1d1bb8
AM
6959 case R_PPC64_TPREL16:
6960 case R_PPC64_TPREL16_LO:
6961 case R_PPC64_TPREL16_HI:
6962 case R_PPC64_TPREL16_HA:
6963 case R_PPC64_TPREL16_DS:
6964 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
6965 case R_PPC64_TPREL16_HIGH:
6966 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
6967 case R_PPC64_TPREL16_HIGHER:
6968 case R_PPC64_TPREL16_HIGHERA:
6969 case R_PPC64_TPREL16_HIGHEST:
6970 case R_PPC64_TPREL16_HIGHESTA:
8c1d1bb8 6971 case R_PPC64_TPREL64:
c213164a 6972 case R_PPC64_TPREL34:
8c1d1bb8
AM
6973 case R_PPC64_DTPMOD64:
6974 case R_PPC64_DTPREL64:
6975 case R_PPC64_ADDR64:
6976 case R_PPC64_REL30:
6977 case R_PPC64_REL32:
6978 case R_PPC64_REL64:
6979 case R_PPC64_ADDR14:
6980 case R_PPC64_ADDR14_BRNTAKEN:
6981 case R_PPC64_ADDR14_BRTAKEN:
6982 case R_PPC64_ADDR16:
6983 case R_PPC64_ADDR16_DS:
6984 case R_PPC64_ADDR16_HA:
6985 case R_PPC64_ADDR16_HI:
f9c6b907
AM
6986 case R_PPC64_ADDR16_HIGH:
6987 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
6988 case R_PPC64_ADDR16_HIGHER:
6989 case R_PPC64_ADDR16_HIGHERA:
6990 case R_PPC64_ADDR16_HIGHEST:
6991 case R_PPC64_ADDR16_HIGHESTA:
6992 case R_PPC64_ADDR16_LO:
6993 case R_PPC64_ADDR16_LO_DS:
6994 case R_PPC64_ADDR24:
6995 case R_PPC64_ADDR32:
6996 case R_PPC64_UADDR16:
6997 case R_PPC64_UADDR32:
6998 case R_PPC64_UADDR64:
6999 case R_PPC64_TOC:
5663e321
AM
7000 case R_PPC64_D34:
7001 case R_PPC64_D34_LO:
7002 case R_PPC64_D34_HI30:
7003 case R_PPC64_D34_HA30:
7004 case R_PPC64_ADDR16_HIGHER34:
7005 case R_PPC64_ADDR16_HIGHERA34:
7006 case R_PPC64_ADDR16_HIGHEST34:
7007 case R_PPC64_ADDR16_HIGHESTA34:
7008 case R_PPC64_D28:
8c1d1bb8
AM
7009 break;
7010 }
7011
7012 if (local_syms != NULL)
7013 {
7014 unsigned long r_symndx;
8c1d1bb8
AM
7015 bfd *ibfd = sec->owner;
7016
7017 r_symndx = ELF64_R_SYM (r_info);
7018 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7019 return FALSE;
7020 }
7021
ec73ddcd
AM
7022 if ((h != NULL
7023 && (h->root.type == bfd_link_hash_defweak
7024 || !h->def_regular))
7025 || (h != NULL
7026 && !bfd_link_executable (info)
7027 && !SYMBOLIC_BIND (info, h))
7028 || (bfd_link_pic (info)
7029 && must_be_dyn_reloc (info, r_type))
7030 || (!bfd_link_pic (info)
7031 && (h != NULL
7032 ? h->type == STT_GNU_IFUNC
7033 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
8c1d1bb8
AM
7034 ;
7035 else
7036 return TRUE;
7037
7038 if (h != NULL)
6edfbbad 7039 {
19e08130
AM
7040 struct elf_dyn_relocs *p;
7041 struct elf_dyn_relocs **pp;
ed7007c1 7042 pp = &ppc_elf_hash_entry (h)->dyn_relocs;
19e08130
AM
7043
7044 /* elf_gc_sweep may have already removed all dyn relocs associated
7045 with local syms for a given section. Also, symbol flags are
7046 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7047 report a dynreloc miscount. */
7048 if (*pp == NULL && info->gc_sections)
7049 return TRUE;
7050
7051 while ((p = *pp) != NULL)
60124e18 7052 {
19e08130
AM
7053 if (p->sec == sec)
7054 {
7055 if (!must_be_dyn_reloc (info, r_type))
7056 p->pc_count -= 1;
7057 p->count -= 1;
7058 if (p->count == 0)
7059 *pp = p->next;
7060 return TRUE;
7061 }
7062 pp = &p->next;
60124e18 7063 }
6edfbbad 7064 }
19e08130
AM
7065 else
7066 {
7067 struct ppc_dyn_relocs *p;
7068 struct ppc_dyn_relocs **pp;
7069 void *vpp;
7070 bfd_boolean is_ifunc;
8c1d1bb8 7071
19e08130
AM
7072 if (local_syms == NULL)
7073 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7074 if (sym_sec == NULL)
7075 sym_sec = sec;
c57da1a7 7076
19e08130
AM
7077 vpp = &elf_section_data (sym_sec)->local_dynrel;
7078 pp = (struct ppc_dyn_relocs **) vpp;
7079
7080 if (*pp == NULL && info->gc_sections)
7081 return TRUE;
7082
7083 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7084 while ((p = *pp) != NULL)
8c1d1bb8 7085 {
19e08130
AM
7086 if (p->sec == sec && p->ifunc == is_ifunc)
7087 {
7088 p->count -= 1;
7089 if (p->count == 0)
7090 *pp = p->next;
7091 return TRUE;
7092 }
7093 pp = &p->next;
8c1d1bb8 7094 }
8c1d1bb8
AM
7095 }
7096
695344c0 7097 /* xgettext:c-format */
cf97bcb0
AM
7098 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"),
7099 sec->owner, sec);
8c1d1bb8
AM
7100 bfd_set_error (bfd_error_bad_value);
7101 return FALSE;
7102}
7103
754021d0
AM
7104/* Remove unused Official Procedure Descriptor entries. Currently we
7105 only remove those associated with functions in discarded link-once
7106 sections, or weakly defined functions that have been overridden. It
7107 would be possible to remove many more entries for statically linked
7108 applications. */
7109
b34976b6 7110bfd_boolean
e7d1c40c 7111ppc64_elf_edit_opd (struct bfd_link_info *info)
1e2f5b6e
AM
7112{
7113 bfd *ibfd;
754021d0 7114 bfd_boolean some_edited = FALSE;
3f764659 7115 asection *need_pad = NULL;
e7d1c40c
AM
7116 struct ppc_link_hash_table *htab;
7117
7118 htab = ppc_hash_table (info);
7119 if (htab == NULL)
7120 return FALSE;
1e2f5b6e 7121
c72f2fb2 7122 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1e2f5b6e
AM
7123 {
7124 asection *sec;
7125 Elf_Internal_Rela *relstart, *rel, *relend;
7126 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7127 Elf_Internal_Sym *local_syms;
74f0fb50 7128 struct _opd_sec_data *opd;
51aecdc5 7129 bfd_boolean need_edit, add_aux_fields, broken;
3f764659 7130 bfd_size_type cnt_16b = 0;
1e2f5b6e 7131
854b41e7
AM
7132 if (!is_ppc64_elf (ibfd))
7133 continue;
7134
1e2f5b6e 7135 sec = bfd_get_section_by_name (ibfd, ".opd");
46de2a7c 7136 if (sec == NULL || sec->size == 0)
1e2f5b6e
AM
7137 continue;
7138
dbaa2011 7139 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7140 continue;
7141
1e2f5b6e
AM
7142 if (sec->output_section == bfd_abs_section_ptr)
7143 continue;
7144
7145 /* Look through the section relocs. */
7146 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7147 continue;
7148
6cdc0ccc 7149 local_syms = NULL;
0ffa91dd 7150 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7151
7152 /* Read the relocations. */
4ce794b7 7153 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7154 info->keep_memory);
1e2f5b6e 7155 if (relstart == NULL)
b34976b6 7156 return FALSE;
1e2f5b6e
AM
7157
7158 /* First run through the relocs to check they are sane, and to
7159 determine whether we need to edit this opd section. */
b34976b6 7160 need_edit = FALSE;
51aecdc5 7161 broken = FALSE;
3f764659 7162 need_pad = sec;
1e2f5b6e 7163 relend = relstart + sec->reloc_count;
50bc7936 7164 for (rel = relstart; rel < relend; )
1e2f5b6e 7165 {
04c9666a 7166 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7167 unsigned long r_symndx;
7168 asection *sym_sec;
7169 struct elf_link_hash_entry *h;
7170 Elf_Internal_Sym *sym;
51aecdc5 7171 bfd_vma offset;
1e2f5b6e 7172
51aecdc5 7173 /* .opd contains an array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7174 only interested in the reloc pointing to a function entry
7175 point. */
51aecdc5
AM
7176 offset = rel->r_offset;
7177 if (rel + 1 == relend
7178 || rel[1].r_offset != offset + 8)
1e2f5b6e
AM
7179 {
7180 /* If someone messes with .opd alignment then after a
7181 "ld -r" we might have padding in the middle of .opd.
7182 Also, there's nothing to prevent someone putting
7183 something silly in .opd with the assembler. No .opd
b34976b6 7184 optimization for them! */
3f764659 7185 broken_opd:
4eca0228 7186 _bfd_error_handler
871b3ab2 7187 (_("%pB: .opd is not a regular array of opd entries"), ibfd);
51aecdc5 7188 broken = TRUE;
1e2f5b6e
AM
7189 break;
7190 }
7191
50bc7936
AM
7192 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7193 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7194 {
4eca0228 7195 _bfd_error_handler
695344c0 7196 /* xgettext:c-format */
871b3ab2 7197 (_("%pB: unexpected reloc type %u in .opd section"),
d003868e 7198 ibfd, r_type);
51aecdc5 7199 broken = TRUE;
50bc7936
AM
7200 break;
7201 }
7202
1e2f5b6e 7203 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7204 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7205 r_symndx, ibfd))
50bc7936 7206 goto error_ret;
1e2f5b6e
AM
7207
7208 if (sym_sec == NULL || sym_sec->owner == NULL)
7209 {
411e1bfb
AM
7210 const char *sym_name;
7211 if (h != NULL)
7212 sym_name = h->root.root.string;
7213 else
26c61ae5
L
7214 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7215 sym_sec);
411e1bfb 7216
4eca0228 7217 _bfd_error_handler
695344c0 7218 /* xgettext:c-format */
871b3ab2 7219 (_("%pB: undefined sym `%s' in .opd section"),
d003868e 7220 ibfd, sym_name);
51aecdc5 7221 broken = TRUE;
1e2f5b6e
AM
7222 break;
7223 }
7224
51020317
AM
7225 /* opd entries are always for functions defined in the
7226 current input bfd. If the symbol isn't defined in the
7227 input bfd, then we won't be using the function in this
7228 bfd; It must be defined in a linkonce section in another
7229 bfd, or is weak. It's also possible that we are
7230 discarding the function due to a linker script /DISCARD/,
7231 which we test for via the output_section. */
7232 if (sym_sec->owner != ibfd
7233 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 7234 need_edit = TRUE;
1e2f5b6e 7235
50bc7936 7236 rel += 2;
51aecdc5
AM
7237 if (rel + 1 == relend
7238 || (rel + 2 < relend
7239 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
7240 ++rel;
7241
7242 if (rel == relend)
3f764659
JJ
7243 {
7244 if (sec->size == offset + 24)
7245 {
7246 need_pad = NULL;
7247 break;
7248 }
51aecdc5 7249 if (sec->size == offset + 16)
3f764659
JJ
7250 {
7251 cnt_16b++;
7252 break;
7253 }
7254 goto broken_opd;
7255 }
3f764659
JJ
7256 else if (rel + 1 < relend
7257 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7258 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7259 {
51aecdc5
AM
7260 if (rel[0].r_offset == offset + 16)
7261 cnt_16b++;
7262 else if (rel[0].r_offset != offset + 24)
7263 goto broken_opd;
3f764659
JJ
7264 }
7265 else
7266 goto broken_opd;
1e2f5b6e
AM
7267 }
7268
e7d1c40c 7269 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
3f764659 7270
51aecdc5 7271 if (!broken && (need_edit || add_aux_fields))
1e2f5b6e
AM
7272 {
7273 Elf_Internal_Rela *write_rel;
d4730f92 7274 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 7275 bfd_byte *rptr, *wptr;
983bddc8 7276 bfd_byte *new_contents;
74f0fb50
AM
7277 bfd_size_type amt;
7278
983bddc8 7279 new_contents = NULL;
51aecdc5 7280 amt = OPD_NDX (sec->size) * sizeof (long);
74f0fb50 7281 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 7282 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50
AM
7283 if (opd->adjust == NULL)
7284 return FALSE;
1e2f5b6e
AM
7285
7286 /* This seems a waste of time as input .opd sections are all
7287 zeros as generated by gcc, but I suppose there's no reason
7288 this will always be so. We might start putting something in
7289 the third word of .opd entries. */
7290 if ((sec->flags & SEC_IN_MEMORY) == 0)
7291 {
eea6121a
AM
7292 bfd_byte *loc;
7293 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 7294 {
eea6121a
AM
7295 if (loc != NULL)
7296 free (loc);
50bc7936 7297 error_ret:
6cdc0ccc
AM
7298 if (local_syms != NULL
7299 && symtab_hdr->contents != (unsigned char *) local_syms)
7300 free (local_syms);
6cdc0ccc
AM
7301 if (elf_section_data (sec)->relocs != relstart)
7302 free (relstart);
b34976b6 7303 return FALSE;
6cdc0ccc 7304 }
1e2f5b6e
AM
7305 sec->contents = loc;
7306 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7307 }
7308
7309 elf_section_data (sec)->relocs = relstart;
7310
3f764659 7311 new_contents = sec->contents;
3f764659
JJ
7312 if (add_aux_fields)
7313 {
7314 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7315 if (new_contents == NULL)
7316 return FALSE;
51aecdc5 7317 need_pad = NULL;
3f764659 7318 }
b4f4e59f
AM
7319 wptr = new_contents;
7320 rptr = sec->contents;
1e2f5b6e 7321 write_rel = relstart;
51aecdc5 7322 for (rel = relstart; rel < relend; )
1e2f5b6e 7323 {
50bc7936
AM
7324 unsigned long r_symndx;
7325 asection *sym_sec;
7326 struct elf_link_hash_entry *h;
51aecdc5 7327 struct ppc_link_hash_entry *fdh = NULL;
50bc7936 7328 Elf_Internal_Sym *sym;
51aecdc5
AM
7329 long opd_ent_size;
7330 Elf_Internal_Rela *next_rel;
7331 bfd_boolean skip;
50bc7936
AM
7332
7333 r_symndx = ELF64_R_SYM (rel->r_info);
7334 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 7335 r_symndx, ibfd))
50bc7936
AM
7336 goto error_ret;
7337
51aecdc5
AM
7338 next_rel = rel + 2;
7339 if (next_rel + 1 == relend
7340 || (next_rel + 2 < relend
7341 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
7342 ++next_rel;
7343
7344 /* See if the .opd entry is full 24 byte or
7345 16 byte (with fd_aux entry overlapped with next
7346 fd_func). */
7347 opd_ent_size = 24;
7348 if (next_rel == relend)
1e2f5b6e 7349 {
51aecdc5 7350 if (sec->size == rel->r_offset + 16)
3f764659 7351 opd_ent_size = 16;
51aecdc5
AM
7352 }
7353 else if (next_rel->r_offset == rel->r_offset + 16)
7354 opd_ent_size = 16;
3f764659 7355
51aecdc5
AM
7356 if (h != NULL
7357 && h->root.root.string[0] == '.')
7358 {
ed7007c1 7359 fdh = ppc_elf_hash_entry (h)->oh;
8c5b4e52
AM
7360 if (fdh != NULL)
7361 {
7362 fdh = ppc_follow_link (fdh);
7363 if (fdh->elf.root.type != bfd_link_hash_defined
7364 && fdh->elf.root.type != bfd_link_hash_defweak)
7365 fdh = NULL;
7366 }
51aecdc5 7367 }
1e2f5b6e 7368
51aecdc5
AM
7369 skip = (sym_sec->owner != ibfd
7370 || sym_sec->output_section == bfd_abs_section_ptr);
7371 if (skip)
7372 {
7373 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7 7374 {
51aecdc5
AM
7375 /* Arrange for the function descriptor sym
7376 to be dropped. */
7377 fdh->elf.root.u.def.value = 0;
7378 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 7379 }
51aecdc5 7380 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
1e2f5b6e 7381
0e1862bb 7382 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
51aecdc5
AM
7383 rel = next_rel;
7384 else
7385 while (1)
7386 {
7387 if (!dec_dynrel_count (rel->r_info, sec, info,
7388 NULL, h, sym))
7389 goto error_ret;
754021d0 7390
51aecdc5
AM
7391 if (++rel == next_rel)
7392 break;
1e2f5b6e 7393
51aecdc5
AM
7394 r_symndx = ELF64_R_SYM (rel->r_info);
7395 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7396 r_symndx, ibfd))
7397 goto error_ret;
7398 }
50bc7936
AM
7399 }
7400 else
1e2f5b6e 7401 {
51aecdc5
AM
7402 /* We'll be keeping this opd entry. */
7403 long adjust;
7404
7405 if (fdh != NULL)
7406 {
7407 /* Redefine the function descriptor symbol to
7408 this location in the opd section. It is
7409 necessary to update the value here rather
7410 than using an array of adjustments as we do
7411 for local symbols, because various places
7412 in the generic ELF code use the value
7413 stored in u.def.value. */
7414 fdh->elf.root.u.def.value = wptr - new_contents;
7415 fdh->adjust_done = 1;
7416 }
7417
7418 /* Local syms are a bit tricky. We could
7419 tweak them as they can be cached, but
7420 we'd need to look through the local syms
7421 for the function descriptor sym which we
7422 don't have at the moment. So keep an
7423 array of adjustments. */
7424 adjust = (wptr - new_contents) - (rptr - sec->contents);
7425 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
7426
7427 if (wptr != rptr)
7428 memcpy (wptr, rptr, opd_ent_size);
7429 wptr += opd_ent_size;
7430 if (add_aux_fields && opd_ent_size == 16)
7431 {
7432 memset (wptr, '\0', 8);
7433 wptr += 8;
7434 }
7435
50bc7936 7436 /* We need to adjust any reloc offsets to point to the
51aecdc5
AM
7437 new opd entries. */
7438 for ( ; rel != next_rel; ++rel)
7439 {
7440 rel->r_offset += adjust;
7441 if (write_rel != rel)
7442 memcpy (write_rel, rel, sizeof (*rel));
7443 ++write_rel;
7444 }
1e2f5b6e 7445 }
51aecdc5
AM
7446
7447 rptr += opd_ent_size;
1e2f5b6e
AM
7448 }
7449
3f764659 7450 sec->size = wptr - new_contents;
1e2f5b6e 7451 sec->reloc_count = write_rel - relstart;
3f764659
JJ
7452 if (add_aux_fields)
7453 {
7454 free (sec->contents);
7455 sec->contents = new_contents;
7456 }
7457
05bf9422 7458 /* Fudge the header size too, as this is used later in
cdcf6e38 7459 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
7460 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7461 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
754021d0 7462 some_edited = TRUE;
1e2f5b6e 7463 }
6cdc0ccc 7464 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 7465 free (relstart);
6cdc0ccc 7466
411e1bfb
AM
7467 if (local_syms != NULL
7468 && symtab_hdr->contents != (unsigned char *) local_syms)
7469 {
7470 if (!info->keep_memory)
7471 free (local_syms);
7472 else
7473 symtab_hdr->contents = (unsigned char *) local_syms;
7474 }
7475 }
7476
754021d0
AM
7477 if (some_edited)
7478 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7479
3f764659
JJ
7480 /* If we are doing a final link and the last .opd entry is just 16 byte
7481 long, add a 8 byte padding after it. */
0e1862bb 7482 if (need_pad != NULL && !bfd_link_relocatable (info))
3f764659
JJ
7483 {
7484 bfd_byte *p;
7485
7486 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7487 {
7488 BFD_ASSERT (need_pad->size > 0);
7489
7490 p = bfd_malloc (need_pad->size + 8);
7491 if (p == NULL)
7492 return FALSE;
699733f6 7493
2cdcc330
AM
7494 if (!bfd_get_section_contents (need_pad->owner, need_pad,
7495 p, 0, need_pad->size))
3f764659
JJ
7496 return FALSE;
7497
7498 need_pad->contents = p;
7499 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7500 }
7501 else
7502 {
7503 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7504 if (p == NULL)
7505 return FALSE;
7506
7507 need_pad->contents = p;
7508 }
7509
7510 memset (need_pad->contents + need_pad->size, 0, 8);
7511 need_pad->size += 8;
7512 }
7513
411e1bfb
AM
7514 return TRUE;
7515}
7516
3e04d765
AM
7517/* Analyze inline PLT call relocations to see whether calls to locally
7518 defined functions can be converted to direct calls. */
7519
7520bfd_boolean
7521ppc64_elf_inline_plt (struct bfd_link_info *info)
7522{
7523 struct ppc_link_hash_table *htab;
7524 bfd *ibfd;
7525 asection *sec;
7526 bfd_vma low_vma, high_vma, limit;
7527
7528 htab = ppc_hash_table (info);
7529 if (htab == NULL)
7530 return FALSE;
7531
7532 /* A bl insn can reach -0x2000000 to 0x1fffffc. The limit is
7533 reduced somewhat to cater for possible stubs that might be added
7534 between the call and its destination. */
7535 if (htab->params->group_size < 0)
7536 {
7537 limit = -htab->params->group_size;
7538 if (limit == 1)
7539 limit = 0x1e00000;
7540 }
7541 else
7542 {
7543 limit = htab->params->group_size;
7544 if (limit == 1)
7545 limit = 0x1c00000;
7546 }
7547
7548 low_vma = -1;
7549 high_vma = 0;
7550 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
7551 if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
7552 {
7553 if (low_vma > sec->vma)
7554 low_vma = sec->vma;
7555 if (high_vma < sec->vma + sec->size)
7556 high_vma = sec->vma + sec->size;
7557 }
7558
7559 /* If a "bl" can reach anywhere in local code sections, then we can
7560 convert all inline PLT sequences to direct calls when the symbol
7561 is local. */
7562 if (high_vma - low_vma < limit)
7563 {
7564 htab->can_convert_all_inline_plt = 1;
7565 return TRUE;
7566 }
7567
7568 /* Otherwise, go looking through relocs for cases where a direct
7569 call won't reach. Mark the symbol on any such reloc to disable
7570 the optimization and keep the PLT entry as it seems likely that
7571 this will be better than creating trampolines. Note that this
7572 will disable the optimization for all inline PLT calls to a
7573 particular symbol, not just those that won't reach. The
7574 difficulty in doing a more precise optimization is that the
7575 linker needs to make a decision depending on whether a
7576 particular R_PPC64_PLTCALL insn can be turned into a direct
7577 call, for each of the R_PPC64_PLTSEQ and R_PPC64_PLT16* insns in
7578 the sequence, and there is nothing that ties those relocs
7579 together except their symbol. */
7580
7581 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7582 {
7583 Elf_Internal_Shdr *symtab_hdr;
7584 Elf_Internal_Sym *local_syms;
7585
7586 if (!is_ppc64_elf (ibfd))
7587 continue;
7588
7589 local_syms = NULL;
7590 symtab_hdr = &elf_symtab_hdr (ibfd);
7591
7592 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7593 if (ppc64_elf_section_data (sec)->has_pltcall
7594 && !bfd_is_abs_section (sec->output_section))
7595 {
7596 Elf_Internal_Rela *relstart, *rel, *relend;
7597
7598 /* Read the relocations. */
7599 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7600 info->keep_memory);
7601 if (relstart == NULL)
7602 return FALSE;
7603
7604 relend = relstart + sec->reloc_count;
7605 for (rel = relstart; rel < relend; )
7606 {
7607 enum elf_ppc64_reloc_type r_type;
7608 unsigned long r_symndx;
7609 asection *sym_sec;
7610 struct elf_link_hash_entry *h;
7611 Elf_Internal_Sym *sym;
7612 unsigned char *tls_maskp;
7613
7614 r_type = ELF64_R_TYPE (rel->r_info);
5663e321
AM
7615 if (r_type != R_PPC64_PLTCALL
7616 && r_type != R_PPC64_PLTCALL_NOTOC)
3e04d765
AM
7617 continue;
7618
7619 r_symndx = ELF64_R_SYM (rel->r_info);
7620 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
7621 r_symndx, ibfd))
7622 {
7623 if (elf_section_data (sec)->relocs != relstart)
7624 free (relstart);
7625 if (local_syms != NULL
2cdcc330 7626 && symtab_hdr->contents != (bfd_byte *) local_syms)
3e04d765
AM
7627 free (local_syms);
7628 return FALSE;
7629 }
7630
7631 if (sym_sec != NULL && sym_sec->output_section != NULL)
7632 {
7633 bfd_vma from, to;
7634 if (h != NULL)
7635 to = h->root.u.def.value;
7636 else
7637 to = sym->st_value;
7638 to += (rel->r_addend
7639 + sym_sec->output_offset
7640 + sym_sec->output_section->vma);
7641 from = (rel->r_offset
7642 + sec->output_offset
7643 + sec->output_section->vma);
5663e321
AM
7644 if (to - from + limit < 2 * limit
7645 && !(r_type == R_PPC64_PLTCALL_NOTOC
7646 && (((h ? h->other : sym->st_other)
7647 & STO_PPC64_LOCAL_MASK)
4a4e7361 7648 > 1 << STO_PPC64_LOCAL_BIT)))
3e04d765
AM
7649 *tls_maskp &= ~PLT_KEEP;
7650 }
7651 }
7652 if (elf_section_data (sec)->relocs != relstart)
7653 free (relstart);
7654 }
7655
7656 if (local_syms != NULL
7657 && symtab_hdr->contents != (unsigned char *) local_syms)
7658 {
7659 if (!info->keep_memory)
7660 free (local_syms);
7661 else
7662 symtab_hdr->contents = (unsigned char *) local_syms;
7663 }
7664 }
7665
7666 return TRUE;
7667}
7668
e1918d23 7669/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 7670
e1918d23 7671asection *
e7d1c40c 7672ppc64_elf_tls_setup (struct bfd_link_info *info)
411e1bfb 7673{
411e1bfb 7674 struct ppc_link_hash_table *htab;
9e7028aa 7675 struct elf_link_hash_entry *tga, *tga_fd, *desc, *desc_fd;
411e1bfb 7676
411e1bfb 7677 htab = ppc_hash_table (info);
4dfe6ac6
NC
7678 if (htab == NULL)
7679 return NULL;
7680
ee67d69a
AM
7681 if (abiversion (info->output_bfd) == 1)
7682 htab->opd_abi = 1;
7683
e7d1c40c 7684 if (htab->params->no_multi_toc)
33c0ec9d
AM
7685 htab->do_multi_toc = 0;
7686 else if (!htab->do_multi_toc)
e7d1c40c 7687 htab->params->no_multi_toc = 1;
33c0ec9d 7688
8b5f1ed8
AM
7689 /* Default to --no-plt-localentry, as this option can cause problems
7690 with symbol interposition. For example, glibc libpthread.so and
7691 libc.so duplicate many pthread symbols, with a fallback
7692 implementation in libc.so. In some cases the fallback does more
7693 work than the pthread implementation. __pthread_condattr_destroy
7694 is one such symbol: the libpthread.so implementation is
7695 localentry:0 while the libc.so implementation is localentry:8.
7696 An app that "cleverly" uses dlopen to only load necessary
7697 libraries at runtime may omit loading libpthread.so when not
7698 running multi-threaded, which then results in the libc.so
7699 fallback symbols being used and ld.so complaining. Now there
7700 are workarounds in ld (see non_zero_localentry) to detect the
7701 pthread situation, but that may not be the only case where
7702 --plt-localentry can cause trouble. */
f378ab09 7703 if (htab->params->plt_localentry0 < 0)
8b5f1ed8 7704 htab->params->plt_localentry0 = 0;
d44c746a
AM
7705 if (htab->params->plt_localentry0
7706 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
7707 FALSE, FALSE, FALSE) == NULL)
cf97bcb0
AM
7708 _bfd_error_handler
7709 (_("warning: --plt-localentry is especially dangerous without "
7710 "ld.so support to detect ABI violations"));
f378ab09 7711
9e7028aa
AM
7712 tga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7713 FALSE, FALSE, TRUE);
7714 htab->tls_get_addr = ppc_elf_hash_entry (tga);
7715
a7f2871e 7716 /* Move dynamic linking info to the function descriptor sym. */
9e7028aa
AM
7717 if (tga != NULL)
7718 func_desc_adjust (tga, info);
7719 tga_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7720 FALSE, FALSE, TRUE);
7721 htab->tls_get_addr_fd = ppc_elf_hash_entry (tga_fd);
7722
7723 desc = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_desc",
7724 FALSE, FALSE, TRUE);
7725 htab->tga_desc = ppc_elf_hash_entry (desc);
7726 if (desc != NULL)
7727 func_desc_adjust (desc, info);
7728 desc_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_desc",
7729 FALSE, FALSE, TRUE);
7730 htab->tga_desc_fd = ppc_elf_hash_entry (desc_fd);
7731
7c9cf415 7732 if (htab->params->tls_get_addr_opt)
a7f2871e 7733 {
9e7028aa 7734 struct elf_link_hash_entry *opt, *opt_fd;
a7f2871e
AM
7735
7736 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7737 FALSE, FALSE, TRUE);
7738 if (opt != NULL)
7739 func_desc_adjust (opt, info);
7740 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7741 FALSE, FALSE, TRUE);
7742 if (opt_fd != NULL
7743 && (opt_fd->root.type == bfd_link_hash_defined
7744 || opt_fd->root.type == bfd_link_hash_defweak))
7745 {
7746 /* If glibc supports an optimized __tls_get_addr call stub,
7747 signalled by the presence of __tls_get_addr_opt, and we'll
7748 be calling __tls_get_addr via a plt call stub, then
7749 make __tls_get_addr point to __tls_get_addr_opt. */
9e7028aa
AM
7750 if (!(htab->elf.dynamic_sections_created
7751 && tga_fd != NULL
7752 && (tga_fd->type == STT_FUNC
7753 || tga_fd->needs_plt)
7754 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
7755 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd))))
7756 tga_fd = NULL;
7757 if (!(htab->elf.dynamic_sections_created
7758 && desc_fd != NULL
7759 && (desc_fd->type == STT_FUNC
7760 || desc_fd->needs_plt)
7761 && !(SYMBOL_CALLS_LOCAL (info, desc_fd)
7762 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, desc_fd))))
7763 desc_fd = NULL;
7764
7765 if (tga_fd != NULL || desc_fd != NULL)
7766 {
7767 struct plt_entry *ent = NULL;
7768
7769 if (tga_fd != NULL)
7770 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7771 if (ent->plt.refcount > 0)
7772 break;
7773 if (ent == NULL && desc_fd != NULL)
7774 for (ent = desc_fd->plt.plist; ent != NULL; ent = ent->next)
7775 if (ent->plt.refcount > 0)
7776 break;
a7f2871e
AM
7777 if (ent != NULL)
7778 {
9e7028aa
AM
7779 if (tga_fd != NULL)
7780 {
7781 tga_fd->root.type = bfd_link_hash_indirect;
7782 tga_fd->root.u.i.link = &opt_fd->root;
7783 tga_fd->root.u.i.warning = NULL;
7784 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
7785 }
7786 if (desc_fd != NULL)
7787 {
7788 desc_fd->root.type = bfd_link_hash_indirect;
7789 desc_fd->root.u.i.link = &opt_fd->root;
7790 desc_fd->root.u.i.warning = NULL;
7791 ppc64_elf_copy_indirect_symbol (info, opt_fd, desc_fd);
7792 }
b531344c 7793 opt_fd->mark = 1;
a7f2871e
AM
7794 if (opt_fd->dynindx != -1)
7795 {
7796 /* Use __tls_get_addr_opt in dynamic relocations. */
7797 opt_fd->dynindx = -1;
7798 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7799 opt_fd->dynstr_index);
7800 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
854b41e7 7801 return NULL;
a7f2871e 7802 }
9e7028aa 7803 if (tga_fd != NULL)
a7f2871e 7804 {
9e7028aa
AM
7805 htab->tls_get_addr_fd = ppc_elf_hash_entry (opt_fd);
7806 tga = &htab->tls_get_addr->elf;
7807 if (opt != NULL && tga != NULL)
7808 {
7809 tga->root.type = bfd_link_hash_indirect;
7810 tga->root.u.i.link = &opt->root;
7811 tga->root.u.i.warning = NULL;
7812 ppc64_elf_copy_indirect_symbol (info, opt, tga);
7813 opt->mark = 1;
7814 _bfd_elf_link_hash_hide_symbol (info, opt,
7815 tga->forced_local);
7816 htab->tls_get_addr = ppc_elf_hash_entry (opt);
7817 }
7818 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7819 htab->tls_get_addr_fd->is_func_descriptor = 1;
7820 if (htab->tls_get_addr != NULL)
7821 {
7822 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7823 htab->tls_get_addr->is_func = 1;
7824 }
a7f2871e 7825 }
9e7028aa 7826 if (desc_fd != NULL)
a7f2871e 7827 {
9e7028aa
AM
7828 htab->tga_desc_fd = ppc_elf_hash_entry (opt_fd);
7829 if (opt != NULL && desc != NULL)
7830 {
7831 desc->root.type = bfd_link_hash_indirect;
7832 desc->root.u.i.link = &opt->root;
7833 desc->root.u.i.warning = NULL;
7834 ppc64_elf_copy_indirect_symbol (info, opt, desc);
7835 opt->mark = 1;
7836 _bfd_elf_link_hash_hide_symbol (info, opt,
7837 desc->forced_local);
7838 htab->tga_desc = ppc_elf_hash_entry (opt);
7839 }
7840 htab->tga_desc_fd->oh = htab->tga_desc;
7841 htab->tga_desc_fd->is_func_descriptor = 1;
7842 if (htab->tga_desc != NULL)
7843 {
7844 htab->tga_desc->oh = htab->tga_desc_fd;
7845 htab->tga_desc->is_func = 1;
7846 }
a7f2871e
AM
7847 }
7848 }
7849 }
7850 }
7c9cf415
AM
7851 else if (htab->params->tls_get_addr_opt < 0)
7852 htab->params->tls_get_addr_opt = 0;
a7f2871e 7853 }
9e7028aa
AM
7854
7855 if (htab->tga_desc_fd != NULL
7856 && htab->params->tls_get_addr_opt
7857 && htab->params->no_tls_get_addr_regsave == -1)
7858 htab->params->no_tls_get_addr_regsave = 0;
7859
33c0ec9d 7860 return _bfd_elf_tls_setup (info->output_bfd, info);
3a71aa26 7861}
8387904d 7862
3a71aa26 7863/* Return TRUE iff REL is a branch reloc with a global symbol matching
9e7028aa 7864 any of HASH1, HASH2, HASH3, or HASH4. */
8387904d 7865
3a71aa26
AM
7866static bfd_boolean
7867branch_reloc_hash_match (const bfd *ibfd,
7868 const Elf_Internal_Rela *rel,
7869 const struct ppc_link_hash_entry *hash1,
9e7028aa
AM
7870 const struct ppc_link_hash_entry *hash2,
7871 const struct ppc_link_hash_entry *hash3,
7872 const struct ppc_link_hash_entry *hash4)
3a71aa26
AM
7873{
7874 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7875 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7876 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7877
e054468f 7878 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 7879 {
3a71aa26
AM
7880 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7881 struct elf_link_hash_entry *h;
8387904d 7882
3a71aa26 7883 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7884 h = elf_follow_link (h);
9e7028aa
AM
7885 if (h == &hash1->elf || h == &hash2->elf
7886 || h == &hash3->elf || h == &hash4->elf)
3a71aa26 7887 return TRUE;
a48ebf4d 7888 }
3a71aa26 7889 return FALSE;
951fd09b 7890}
411e1bfb 7891
951fd09b
AM
7892/* Run through all the TLS relocs looking for optimization
7893 opportunities. The linker has been hacked (see ppc64elf.em) to do
7894 a preliminary section layout so that we know the TLS segment
7895 offsets. We can't optimize earlier because some optimizations need
7896 to know the tp offset, and we need to optimize before allocating
7897 dynamic relocations. */
7898
7899bfd_boolean
33c0ec9d 7900ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
7901{
7902 bfd *ibfd;
7903 asection *sec;
7904 struct ppc_link_hash_table *htab;
663a1470 7905 unsigned char *toc_ref;
102890f0 7906 int pass;
951fd09b 7907
3cbc1e5e 7908 if (!bfd_link_executable (info))
411e1bfb
AM
7909 return TRUE;
7910
951fd09b 7911 htab = ppc_hash_table (info);
4dfe6ac6
NC
7912 if (htab == NULL)
7913 return FALSE;
7914
663a1470
AM
7915 /* Make two passes over the relocs. On the first pass, mark toc
7916 entries involved with tls relocs, and check that tls relocs
7917 involved in setting up a tls_get_addr call are indeed followed by
7918 such a call. If they are not, we can't do any tls optimization.
7919 On the second pass twiddle tls_mask flags to notify
7920 relocate_section that optimization can be done, and adjust got
7921 and plt refcounts. */
7922 toc_ref = NULL;
7923 for (pass = 0; pass < 2; ++pass)
c72f2fb2 7924 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
663a1470
AM
7925 {
7926 Elf_Internal_Sym *locsyms = NULL;
7927 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7928
102890f0
AM
7929 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7930 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7931 {
7932 Elf_Internal_Rela *relstart, *rel, *relend;
663a1470 7933 bfd_boolean found_tls_get_addr_arg = 0;
411e1bfb 7934
102890f0
AM
7935 /* Read the relocations. */
7936 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7937 info->keep_memory);
7938 if (relstart == NULL)
2915c55b
JK
7939 {
7940 free (toc_ref);
7941 return FALSE;
7942 }
411e1bfb 7943
102890f0
AM
7944 relend = relstart + sec->reloc_count;
7945 for (rel = relstart; rel < relend; rel++)
7946 {
7947 enum elf_ppc64_reloc_type r_type;
7948 unsigned long r_symndx;
7949 struct elf_link_hash_entry *h;
7950 Elf_Internal_Sym *sym;
7951 asection *sym_sec;
f961d9dd 7952 unsigned char *tls_mask;
46e9995a 7953 unsigned int tls_set, tls_clear, tls_type = 0;
102890f0
AM
7954 bfd_vma value;
7955 bfd_boolean ok_tprel, is_local;
7956 long toc_ref_index = 0;
7957 int expecting_tls_get_addr = 0;
663a1470 7958 bfd_boolean ret = FALSE;
411e1bfb 7959
102890f0
AM
7960 r_symndx = ELF64_R_SYM (rel->r_info);
7961 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
7962 r_symndx, ibfd))
7963 {
7964 err_free_rel:
7965 if (elf_section_data (sec)->relocs != relstart)
7966 free (relstart);
7967 if (toc_ref != NULL)
7968 free (toc_ref);
7969 if (locsyms != NULL
0ffa91dd 7970 && (elf_symtab_hdr (ibfd).contents
102890f0
AM
7971 != (unsigned char *) locsyms))
7972 free (locsyms);
663a1470 7973 return ret;
102890f0 7974 }
411e1bfb 7975
102890f0
AM
7976 if (h != NULL)
7977 {
766bc656
AM
7978 if (h->root.type == bfd_link_hash_defined
7979 || h->root.type == bfd_link_hash_defweak)
7980 value = h->root.u.def.value;
7981 else if (h->root.type == bfd_link_hash_undefweak)
7982 value = 0;
7983 else
663a1470
AM
7984 {
7985 found_tls_get_addr_arg = 0;
7986 continue;
7987 }
102890f0
AM
7988 }
7989 else
7990 /* Symbols referenced by TLS relocs must be of type
7991 STT_TLS. So no need for .opd local sym adjust. */
7992 value = sym->st_value;
7993
7994 ok_tprel = FALSE;
f749f26e
AM
7995 is_local = SYMBOL_REFERENCES_LOCAL (info, h);
7996 if (is_local)
102890f0 7997 {
766bc656
AM
7998 if (h != NULL
7999 && h->root.type == bfd_link_hash_undefweak)
8000 ok_tprel = TRUE;
c27b8c2a
AM
8001 else if (sym_sec != NULL
8002 && sym_sec->output_section != NULL)
766bc656
AM
8003 {
8004 value += sym_sec->output_offset;
8005 value += sym_sec->output_section->vma;
0b147428 8006 value -= htab->elf.tls_sec->vma + TP_OFFSET;
c213164a
AM
8007 /* Note that even though the prefix insns
8008 allow a 1<<33 offset we use the same test
8009 as for addis;addi. There may be a mix of
8010 pcrel and non-pcrel code and the decision
8011 to optimise is per symbol, not per TLS
8012 sequence. */
0b147428 8013 ok_tprel = value + 0x80008000ULL < 1ULL << 32;
766bc656 8014 }
102890f0 8015 }
951fd09b 8016
102890f0 8017 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
8018 /* If this section has old-style __tls_get_addr calls
8019 without marker relocs, then check that each
8020 __tls_get_addr call reloc is preceded by a reloc
8021 that conceivably belongs to the __tls_get_addr arg
8022 setup insn. If we don't find matching arg setup
8023 relocs, don't do any tls optimization. */
8024 if (pass == 0
9737e8af 8025 && sec->nomark_tls_get_addr
663a1470 8026 && h != NULL
ed7007c1 8027 && is_tls_get_addr (h, htab)
663a1470
AM
8028 && !found_tls_get_addr_arg
8029 && is_branch_reloc (r_type))
8030 {
25f53a85 8031 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
8032 "TLS optimization disabled\n"),
8033 ibfd, sec, rel->r_offset);
8034 ret = TRUE;
8035 goto err_free_rel;
8036 }
8037
8038 found_tls_get_addr_arg = 0;
102890f0
AM
8039 switch (r_type)
8040 {
8041 case R_PPC64_GOT_TLSLD16:
8042 case R_PPC64_GOT_TLSLD16_LO:
c213164a 8043 case R_PPC64_GOT_TLSLD34:
102890f0 8044 expecting_tls_get_addr = 1;
663a1470 8045 found_tls_get_addr_arg = 1;
1a0670f3 8046 /* Fall through. */
102890f0
AM
8047
8048 case R_PPC64_GOT_TLSLD16_HI:
8049 case R_PPC64_GOT_TLSLD16_HA:
8050 /* These relocs should never be against a symbol
8051 defined in a shared lib. Leave them alone if
8052 that turns out to be the case. */
8053 if (!is_local)
8054 continue;
411e1bfb 8055
102890f0 8056 /* LD -> LE */
411e1bfb 8057 tls_set = 0;
102890f0
AM
8058 tls_clear = TLS_LD;
8059 tls_type = TLS_TLS | TLS_LD;
8060 break;
411e1bfb 8061
102890f0
AM
8062 case R_PPC64_GOT_TLSGD16:
8063 case R_PPC64_GOT_TLSGD16_LO:
c213164a 8064 case R_PPC64_GOT_TLSGD34:
102890f0 8065 expecting_tls_get_addr = 1;
663a1470 8066 found_tls_get_addr_arg = 1;
1a0670f3 8067 /* Fall through. */
102890f0
AM
8068
8069 case R_PPC64_GOT_TLSGD16_HI:
8070 case R_PPC64_GOT_TLSGD16_HA:
8071 if (ok_tprel)
8072 /* GD -> LE */
411e1bfb 8073 tls_set = 0;
102890f0
AM
8074 else
8075 /* GD -> IE */
b00a0a86 8076 tls_set = TLS_TLS | TLS_GDIE;
102890f0
AM
8077 tls_clear = TLS_GD;
8078 tls_type = TLS_TLS | TLS_GD;
8079 break;
8080
c213164a 8081 case R_PPC64_GOT_TPREL34:
102890f0
AM
8082 case R_PPC64_GOT_TPREL16_DS:
8083 case R_PPC64_GOT_TPREL16_LO_DS:
8084 case R_PPC64_GOT_TPREL16_HI:
8085 case R_PPC64_GOT_TPREL16_HA:
8086 if (ok_tprel)
8087 {
8088 /* IE -> LE */
8089 tls_set = 0;
8090 tls_clear = TLS_TPREL;
8091 tls_type = TLS_TLS | TLS_TPREL;
8092 break;
8093 }
411e1bfb
AM
8094 continue;
8095
727fc41e 8096 case R_PPC64_TLSLD:
7d04a20a
AM
8097 if (!is_local)
8098 continue;
8099 /* Fall through. */
8100 case R_PPC64_TLSGD:
23cedd1d
AM
8101 if (rel + 1 < relend
8102 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
8103 {
8104 if (pass != 0
2cdcc330 8105 && (ELF64_R_TYPE (rel[1].r_info)
5663e321
AM
8106 != R_PPC64_PLTSEQ)
8107 && (ELF64_R_TYPE (rel[1].r_info)
8108 != R_PPC64_PLTSEQ_NOTOC))
23cedd1d
AM
8109 {
8110 r_symndx = ELF64_R_SYM (rel[1].r_info);
8111 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms,
2cdcc330 8112 r_symndx, ibfd))
23cedd1d
AM
8113 goto err_free_rel;
8114 if (h != NULL)
8115 {
8116 struct plt_entry *ent = NULL;
8117
8118 for (ent = h->plt.plist;
8119 ent != NULL;
8120 ent = ent->next)
8121 if (ent->addend == rel[1].r_addend)
8122 break;
8123
8124 if (ent != NULL
8125 && ent->plt.refcount > 0)
8126 ent->plt.refcount -= 1;
8127 }
8128 }
8129 continue;
8130 }
663a1470 8131 found_tls_get_addr_arg = 1;
1a0670f3 8132 /* Fall through. */
663a1470
AM
8133
8134 case R_PPC64_TLS:
8135 case R_PPC64_TOC16:
8136 case R_PPC64_TOC16_LO:
102890f0
AM
8137 if (sym_sec == NULL || sym_sec != toc)
8138 continue;
8139
8140 /* Mark this toc entry as referenced by a TLS
8141 code sequence. We can do that now in the
8142 case of R_PPC64_TLS, and after checking for
8143 tls_get_addr for the TOC16 relocs. */
8144 if (toc_ref == NULL)
2cdcc330
AM
8145 toc_ref
8146 = bfd_zmalloc (toc->output_section->rawsize / 8);
663a1470
AM
8147 if (toc_ref == NULL)
8148 goto err_free_rel;
8149
102890f0
AM
8150 if (h != NULL)
8151 value = h->root.u.def.value;
8152 else
8153 value = sym->st_value;
8154 value += rel->r_addend;
73242275
AM
8155 if (value % 8 != 0)
8156 continue;
8157 BFD_ASSERT (value < toc->size
8158 && toc->output_offset % 8 == 0);
663a1470 8159 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
8160 if (r_type == R_PPC64_TLS
8161 || r_type == R_PPC64_TLSGD
8162 || r_type == R_PPC64_TLSLD)
102890f0
AM
8163 {
8164 toc_ref[toc_ref_index] = 1;
8165 continue;
8166 }
8167
8168 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8169 continue;
8170
8171 tls_set = 0;
8172 tls_clear = 0;
8173 expecting_tls_get_addr = 2;
8174 break;
8175
8176 case R_PPC64_TPREL64:
8177 if (pass == 0
8178 || sec != toc
8179 || toc_ref == NULL
663a1470 8180 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8181 continue;
8182 if (ok_tprel)
8183 {
8184 /* IE -> LE */
8185 tls_set = TLS_EXPLICIT;
8186 tls_clear = TLS_TPREL;
8187 break;
8188 }
8189 continue;
8190
8191 case R_PPC64_DTPMOD64:
8192 if (pass == 0
8193 || sec != toc
8194 || toc_ref == NULL
663a1470 8195 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8196 continue;
8197 if (rel + 1 < relend
8198 && (rel[1].r_info
8199 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8200 && rel[1].r_offset == rel->r_offset + 8)
8201 {
8202 if (ok_tprel)
8203 /* GD -> LE */
8204 tls_set = TLS_EXPLICIT | TLS_GD;
8205 else
8206 /* GD -> IE */
b00a0a86 8207 tls_set = TLS_EXPLICIT | TLS_GD | TLS_GDIE;
102890f0
AM
8208 tls_clear = TLS_GD;
8209 }
8210 else
8211 {
8212 if (!is_local)
8213 continue;
8214
8215 /* LD -> LE */
8216 tls_set = TLS_EXPLICIT;
8217 tls_clear = TLS_LD;
8218 }
8219 break;
8220
8221 default:
8222 continue;
8223 }
8224
8225 if (pass == 0)
8226 {
727fc41e 8227 if (!expecting_tls_get_addr
9737e8af 8228 || !sec->nomark_tls_get_addr)
102890f0
AM
8229 continue;
8230
3a71aa26
AM
8231 if (rel + 1 < relend
8232 && branch_reloc_hash_match (ibfd, rel + 1,
9e7028aa
AM
8233 htab->tls_get_addr_fd,
8234 htab->tga_desc_fd,
3a71aa26 8235 htab->tls_get_addr,
9e7028aa 8236 htab->tga_desc))
102890f0 8237 {
3a71aa26 8238 if (expecting_tls_get_addr == 2)
102890f0 8239 {
3a71aa26 8240 /* Check for toc tls entries. */
f961d9dd 8241 unsigned char *toc_tls;
3a71aa26
AM
8242 int retval;
8243
8244 retval = get_tls_mask (&toc_tls, NULL, NULL,
8245 &locsyms,
8246 rel, ibfd);
8247 if (retval == 0)
8248 goto err_free_rel;
663a1470
AM
8249 if (toc_tls != NULL)
8250 {
37da22e5
AM
8251 if ((*toc_tls & TLS_TLS) != 0
8252 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0))
663a1470
AM
8253 found_tls_get_addr_arg = 1;
8254 if (retval > 1)
8255 toc_ref[toc_ref_index] = 1;
8256 }
102890f0 8257 }
3a71aa26 8258 continue;
102890f0
AM
8259 }
8260
102890f0
AM
8261 /* Uh oh, we didn't find the expected call. We
8262 could just mark this symbol to exclude it
8263 from tls optimization but it's safer to skip
663a1470 8264 the entire optimization. */
695344c0 8265 /* xgettext:c-format */
25f53a85 8266 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8267 "TLS optimization disabled\n"),
8268 ibfd, sec, rel->r_offset);
8269 ret = TRUE;
8270 goto err_free_rel;
102890f0
AM
8271 }
8272
37da22e5
AM
8273 /* If we don't have old-style __tls_get_addr calls
8274 without TLSGD/TLSLD marker relocs, and we haven't
8275 found a new-style __tls_get_addr call with a
8276 marker for this symbol, then we either have a
8277 broken object file or an -mlongcall style
8278 indirect call to __tls_get_addr without a marker.
8279 Disable optimization in this case. */
8280 if ((tls_clear & (TLS_GD | TLS_LD)) != 0
8281 && (tls_set & TLS_EXPLICIT) == 0
9737e8af 8282 && !sec->nomark_tls_get_addr
37da22e5
AM
8283 && ((*tls_mask & (TLS_TLS | TLS_MARK))
8284 != (TLS_TLS | TLS_MARK)))
8285 continue;
8286
7d04a20a 8287 if (expecting_tls_get_addr == 1 + !sec->nomark_tls_get_addr)
102890f0 8288 {
23cedd1d
AM
8289 struct plt_entry *ent = NULL;
8290
9e7028aa
AM
8291 if (htab->tls_get_addr_fd != NULL)
8292 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8293 ent != NULL;
8294 ent = ent->next)
8295 if (ent->addend == 0)
8296 break;
8297
8298 if (ent == NULL && htab->tga_desc_fd != NULL)
8299 for (ent = htab->tga_desc_fd->elf.plt.plist;
8300 ent != NULL;
8301 ent = ent->next)
8302 if (ent->addend == 0)
8303 break;
8304
8305 if (ent == NULL && htab->tls_get_addr != NULL)
23cedd1d
AM
8306 for (ent = htab->tls_get_addr->elf.plt.plist;
8307 ent != NULL;
8308 ent = ent->next)
8309 if (ent->addend == 0)
102890f0 8310 break;
411e1bfb 8311
9e7028aa
AM
8312 if (ent == NULL && htab->tga_desc != NULL)
8313 for (ent = htab->tga_desc->elf.plt.plist;
23cedd1d
AM
8314 ent != NULL;
8315 ent = ent->next)
8316 if (ent->addend == 0)
102890f0 8317 break;
23cedd1d
AM
8318
8319 if (ent != NULL
8320 && ent->plt.refcount > 0)
8321 ent->plt.refcount -= 1;
102890f0 8322 }
411e1bfb 8323
102890f0 8324 if (tls_clear == 0)
30038c59
AM
8325 continue;
8326
102890f0
AM
8327 if ((tls_set & TLS_EXPLICIT) == 0)
8328 {
8329 struct got_entry *ent;
411e1bfb 8330
102890f0
AM
8331 /* Adjust got entry for this reloc. */
8332 if (h != NULL)
8333 ent = h->got.glist;
8334 else
8335 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 8336
102890f0
AM
8337 for (; ent != NULL; ent = ent->next)
8338 if (ent->addend == rel->r_addend
8339 && ent->owner == ibfd
8340 && ent->tls_type == tls_type)
8341 break;
8342 if (ent == NULL)
8343 abort ();
411e1bfb 8344
102890f0
AM
8345 if (tls_set == 0)
8346 {
8347 /* We managed to get rid of a got entry. */
8348 if (ent->got.refcount > 0)
8349 ent->got.refcount -= 1;
8350 }
8351 }
8352 else
8353 {
8354 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8355 we'll lose one or two dyn relocs. */
8356 if (!dec_dynrel_count (rel->r_info, sec, info,
19e08130 8357 NULL, h, sym))
102890f0 8358 return FALSE;
411e1bfb 8359
102890f0
AM
8360 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8361 {
8362 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
19e08130 8363 NULL, h, sym))
102890f0
AM
8364 return FALSE;
8365 }
8366 }
411e1bfb 8367
46e9995a 8368 *tls_mask |= tls_set & 0xff;
102890f0
AM
8369 *tls_mask &= ~tls_clear;
8370 }
8c1d1bb8 8371
102890f0
AM
8372 if (elf_section_data (sec)->relocs != relstart)
8373 free (relstart);
8374 }
411e1bfb 8375
663a1470
AM
8376 if (locsyms != NULL
8377 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8378 {
8379 if (!info->keep_memory)
8380 free (locsyms);
8381 else
8382 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8383 }
8384 }
411e1bfb 8385
663a1470
AM
8386 if (toc_ref != NULL)
8387 free (toc_ref);
9a23f96e 8388 htab->do_tls_opt = 1;
b34976b6 8389 return TRUE;
1e2f5b6e 8390}
b34976b6 8391
c5614fa4
AM
8392/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8393 the values of any global symbols in a toc section that has been
8394 edited. Globals in toc sections should be a rarity, so this function
8395 sets a flag if any are found in toc sections other than the one just
de194d85 8396 edited, so that further hash table traversals can be avoided. */
c5614fa4
AM
8397
8398struct adjust_toc_info
8399{
8400 asection *toc;
8401 unsigned long *skip;
8402 bfd_boolean global_toc_syms;
8403};
8404
ba761f19
AM
8405enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8406
c5614fa4
AM
8407static bfd_boolean
8408adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8409{
8410 struct ppc_link_hash_entry *eh;
8411 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 8412 unsigned long i;
c5614fa4 8413
c5614fa4
AM
8414 if (h->root.type != bfd_link_hash_defined
8415 && h->root.type != bfd_link_hash_defweak)
8416 return TRUE;
8417
ed7007c1 8418 eh = ppc_elf_hash_entry (h);
c5614fa4
AM
8419 if (eh->adjust_done)
8420 return TRUE;
8421
8422 if (eh->elf.root.u.def.section == toc_inf->toc)
8423 {
854b41e7
AM
8424 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8425 i = toc_inf->toc->rawsize >> 3;
c5614fa4 8426 else
854b41e7
AM
8427 i = eh->elf.root.u.def.value >> 3;
8428
ba761f19 8429 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4 8430 {
4eca0228 8431 _bfd_error_handler
854b41e7
AM
8432 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8433 do
8434 ++i;
ba761f19 8435 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 8436 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 8437 }
854b41e7
AM
8438
8439 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
8440 eh->adjust_done = 1;
8441 }
8442 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8443 toc_inf->global_toc_syms = TRUE;
8444
8445 return TRUE;
8446}
8447
39eeab25
AM
8448/* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8449 on a _LO variety toc/got reloc. */
560c8763
AM
8450
8451static bfd_boolean
39eeab25 8452ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
560c8763 8453{
2365f8d7
AM
8454 return ((insn & (0x3fu << 26)) == 12u << 26 /* addic */
8455 || (insn & (0x3fu << 26)) == 14u << 26 /* addi */
8456 || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */
8457 || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */
8458 || (insn & (0x3fu << 26)) == 36u << 26 /* stw */
8459 || (insn & (0x3fu << 26)) == 38u << 26 /* stb */
8460 || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */
8461 || (insn & (0x3fu << 26)) == 42u << 26 /* lha */
8462 || (insn & (0x3fu << 26)) == 44u << 26 /* sth */
8463 || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */
8464 || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */
8465 || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */
8466 || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */
8467 || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */
8468 || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */
8469 || (insn & (0x3fu << 26)) == 56u << 26 /* lq,lfq */
8470 || ((insn & (0x3fu << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
39eeab25
AM
8471 /* Exclude lfqu by testing reloc. If relocs are ever
8472 defined for the reduced D field in psq_lu then those
8473 will need testing too. */
8474 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8475 || ((insn & (0x3fu << 26)) == 58u << 26 /* ld,lwa */
39eeab25 8476 && (insn & 1) == 0)
2365f8d7
AM
8477 || (insn & (0x3fu << 26)) == 60u << 26 /* stfq */
8478 || ((insn & (0x3fu << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
39eeab25
AM
8479 /* Exclude stfqu. psq_stu as above for psq_lu. */
8480 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8481 || ((insn & (0x3fu << 26)) == 62u << 26 /* std,stq */
39eeab25 8482 && (insn & 1) == 0));
560c8763
AM
8483}
8484
4a421c53
AM
8485/* PCREL_OPT in one instance flags to the linker that a pair of insns:
8486 pld ra,symbol@got@pcrel
dd9b12c2 8487 load/store rt,off(ra)
4a421c53 8488 or
d4b87b1e 8489 pla ra,symbol@pcrel
dd9b12c2 8490 load/store rt,off(ra)
4a421c53 8491 may be translated to
dd9b12c2 8492 pload/pstore rt,symbol+off@pcrel
4a421c53
AM
8493 nop.
8494 This function returns true if the optimization is possible, placing
dd9b12c2 8495 the prefix insn in *PINSN1, a NOP in *PINSN2 and the offset in *POFF.
4a421c53
AM
8496
8497 On entry to this function, the linker has already determined that
d4b87b1e 8498 the pld can be replaced with pla: *PINSN1 is that pla insn,
4a421c53
AM
8499 while *PINSN2 is the second instruction. */
8500
8501static bfd_boolean
dd9b12c2 8502xlate_pcrel_opt (uint64_t *pinsn1, uint64_t *pinsn2, bfd_signed_vma *poff)
4a421c53 8503{
77486630
AM
8504 uint64_t insn1 = *pinsn1;
8505 uint64_t insn2 = *pinsn2;
dd9b12c2 8506 bfd_signed_vma off;
4a421c53 8507
77486630
AM
8508 if ((insn2 & (63ULL << 58)) == 1ULL << 58)
8509 {
8510 /* Check that regs match. */
8511 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
8512 return FALSE;
8513
8514 /* P8LS or PMLS form, non-pcrel. */
8515 if ((insn2 & (-1ULL << 50) & ~(1ULL << 56)) != (1ULL << 58))
8516 return FALSE;
8517
8518 *pinsn1 = (insn2 & ~(31 << 16) & ~0x3ffff0000ffffULL) | (1ULL << 52);
8519 *pinsn2 = PNOP;
8520 off = ((insn2 >> 16) & 0x3ffff0000ULL) | (insn2 & 0xffff);
8521 *poff = (off ^ 0x200000000ULL) - 0x200000000ULL;
8522 return TRUE;
8523 }
8524
8525 insn2 >>= 32;
8526
4a421c53 8527 /* Check that regs match. */
77486630 8528 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
4a421c53
AM
8529 return FALSE;
8530
8531 switch ((insn2 >> 26) & 63)
8532 {
8533 default:
8534 return FALSE;
8535
8536 case 32: /* lwz */
8537 case 34: /* lbz */
8538 case 36: /* stw */
8539 case 38: /* stb */
8540 case 40: /* lhz */
8541 case 42: /* lha */
8542 case 44: /* sth */
8543 case 48: /* lfs */
8544 case 50: /* lfd */
8545 case 52: /* stfs */
8546 case 54: /* stfd */
8547 /* These are the PMLS cases, where we just need to tack a prefix
dd9b12c2 8548 on the insn. */
77486630 8549 insn1 = ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
4a421c53 8550 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8551 off = insn2 & 0xffff;
4a421c53
AM
8552 break;
8553
8554 case 58: /* lwa, ld */
dd9b12c2 8555 if ((insn2 & 1) != 0)
4a421c53 8556 return FALSE;
77486630 8557 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8558 | (insn2 & 2 ? 41ULL << 26 : 57ULL << 26)
8559 | (insn2 & (31ULL << 21)));
dd9b12c2 8560 off = insn2 & 0xfffc;
4a421c53
AM
8561 break;
8562
8563 case 57: /* lxsd, lxssp */
dd9b12c2 8564 if ((insn2 & 3) < 2)
4a421c53 8565 return FALSE;
77486630 8566 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8567 | ((40ULL | (insn2 & 3)) << 26)
8568 | (insn2 & (31ULL << 21)));
dd9b12c2 8569 off = insn2 & 0xfffc;
4a421c53
AM
8570 break;
8571
8572 case 61: /* stxsd, stxssp, lxv, stxv */
8573 if ((insn2 & 3) == 0)
8574 return FALSE;
8575 else if ((insn2 & 3) >= 2)
8576 {
77486630 8577 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8578 | ((44ULL | (insn2 & 3)) << 26)
8579 | (insn2 & (31ULL << 21)));
dd9b12c2 8580 off = insn2 & 0xfffc;
4a421c53
AM
8581 }
8582 else
8583 {
77486630 8584 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8585 | ((50ULL | (insn2 & 4) | ((insn2 & 8) >> 3)) << 26)
8586 | (insn2 & (31ULL << 21)));
dd9b12c2 8587 off = insn2 & 0xfff0;
4a421c53
AM
8588 }
8589 break;
8590
8591 case 56: /* lq */
77486630 8592 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53 8593 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8594 off = insn2 & 0xffff;
4a421c53
AM
8595 break;
8596
8597 case 62: /* std, stq */
dd9b12c2 8598 if ((insn2 & 1) != 0)
4a421c53 8599 return FALSE;
77486630 8600 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8601 | ((insn2 & 2) == 0 ? 61ULL << 26 : 60ULL << 26)
8602 | (insn2 & (31ULL << 21)));
dd9b12c2 8603 off = insn2 & 0xfffc;
4a421c53
AM
8604 break;
8605 }
8606
77486630 8607 *pinsn1 = insn1;
4a421c53 8608 *pinsn2 = (uint64_t) NOP << 32;
dd9b12c2 8609 *poff = (off ^ 0x8000) - 0x8000;
4a421c53
AM
8610 return TRUE;
8611}
8612
c5614fa4
AM
8613/* Examine all relocs referencing .toc sections in order to remove
8614 unused .toc entries. */
8615
8616bfd_boolean
33c0ec9d 8617ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
8618{
8619 bfd *ibfd;
8620 struct adjust_toc_info toc_inf;
67f0cbdb 8621 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 8622
67f0cbdb 8623 htab->do_toc_opt = 1;
c5614fa4 8624 toc_inf.global_toc_syms = TRUE;
c72f2fb2 8625 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
c5614fa4
AM
8626 {
8627 asection *toc, *sec;
8628 Elf_Internal_Shdr *symtab_hdr;
8629 Elf_Internal_Sym *local_syms;
425b145b 8630 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
8631 unsigned long *skip, *drop;
8632 unsigned char *used;
8633 unsigned char *keep, last, some_unused;
8634
854b41e7
AM
8635 if (!is_ppc64_elf (ibfd))
8636 continue;
8637
c5614fa4
AM
8638 toc = bfd_get_section_by_name (ibfd, ".toc");
8639 if (toc == NULL
92b7a70f 8640 || toc->size == 0
dbaa2011
AM
8641 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8642 || discarded_section (toc))
c5614fa4
AM
8643 continue;
8644
425b145b 8645 toc_relocs = NULL;
c5614fa4 8646 local_syms = NULL;
0ffa91dd 8647 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
8648
8649 /* Look at sections dropped from the final link. */
8650 skip = NULL;
8651 relstart = NULL;
8652 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8653 {
8654 if (sec->reloc_count == 0
dbaa2011 8655 || !discarded_section (sec)
c5614fa4
AM
8656 || get_opd_info (sec)
8657 || (sec->flags & SEC_ALLOC) == 0
8658 || (sec->flags & SEC_DEBUGGING) != 0)
8659 continue;
8660
8661 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8662 if (relstart == NULL)
8663 goto error_ret;
8664
8665 /* Run through the relocs to see which toc entries might be
8666 unused. */
8667 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8668 {
8669 enum elf_ppc64_reloc_type r_type;
8670 unsigned long r_symndx;
8671 asection *sym_sec;
8672 struct elf_link_hash_entry *h;
8673 Elf_Internal_Sym *sym;
8674 bfd_vma val;
8675
8676 r_type = ELF64_R_TYPE (rel->r_info);
8677 switch (r_type)
8678 {
8679 default:
8680 continue;
8681
8682 case R_PPC64_TOC16:
8683 case R_PPC64_TOC16_LO:
8684 case R_PPC64_TOC16_HI:
8685 case R_PPC64_TOC16_HA:
8686 case R_PPC64_TOC16_DS:
8687 case R_PPC64_TOC16_LO_DS:
8688 break;
8689 }
8690
8691 r_symndx = ELF64_R_SYM (rel->r_info);
8692 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8693 r_symndx, ibfd))
8694 goto error_ret;
8695
8696 if (sym_sec != toc)
8697 continue;
8698
8699 if (h != NULL)
8700 val = h->root.u.def.value;
8701 else
8702 val = sym->st_value;
8703 val += rel->r_addend;
8704
8705 if (val >= toc->size)
8706 continue;
8707
8708 /* Anything in the toc ought to be aligned to 8 bytes.
8709 If not, don't mark as unused. */
8710 if (val & 7)
8711 continue;
8712
8713 if (skip == NULL)
8714 {
854b41e7 8715 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
8716 if (skip == NULL)
8717 goto error_ret;
8718 }
8719
ba761f19 8720 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
8721 }
8722
8723 if (elf_section_data (sec)->relocs != relstart)
8724 free (relstart);
8725 }
8726
ba761f19
AM
8727 /* For largetoc loads of address constants, we can convert
8728 . addis rx,2,addr@got@ha
8729 . ld ry,addr@got@l(rx)
8730 to
8731 . addis rx,2,addr@toc@ha
8732 . addi ry,rx,addr@toc@l
8733 when addr is within 2G of the toc pointer. This then means
8734 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 8735
ba761f19
AM
8736 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8737 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8738 && toc->reloc_count != 0)
8739 {
8740 /* Read toc relocs. */
425b145b
AM
8741 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8742 info->keep_memory);
8743 if (toc_relocs == NULL)
ba761f19
AM
8744 goto error_ret;
8745
425b145b 8746 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
8747 {
8748 enum elf_ppc64_reloc_type r_type;
8749 unsigned long r_symndx;
8750 asection *sym_sec;
8751 struct elf_link_hash_entry *h;
8752 Elf_Internal_Sym *sym;
8753 bfd_vma val, addr;
8754
8755 r_type = ELF64_R_TYPE (rel->r_info);
8756 if (r_type != R_PPC64_ADDR64)
8757 continue;
8758
8759 r_symndx = ELF64_R_SYM (rel->r_info);
8760 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8761 r_symndx, ibfd))
8762 goto error_ret;
8763
425b145b 8764 if (sym_sec == NULL
c27b8c2a 8765 || sym_sec->output_section == NULL
dbaa2011 8766 || discarded_section (sym_sec))
425b145b
AM
8767 continue;
8768
afe397ea 8769 if (!SYMBOL_REFERENCES_LOCAL (info, h))
ba761f19
AM
8770 continue;
8771
8772 if (h != NULL)
bddc25c9
AM
8773 {
8774 if (h->type == STT_GNU_IFUNC)
8775 continue;
8776 val = h->root.u.def.value;
8777 }
ba761f19 8778 else
bddc25c9
AM
8779 {
8780 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8781 continue;
8782 val = sym->st_value;
8783 }
ba761f19
AM
8784 val += rel->r_addend;
8785 val += sym_sec->output_section->vma + sym_sec->output_offset;
8786
8787 /* We don't yet know the exact toc pointer value, but we
8788 know it will be somewhere in the toc section. Don't
8789 optimize if the difference from any possible toc
8790 pointer is outside [ff..f80008000, 7fff7fff]. */
8791 addr = toc->output_section->vma + TOC_BASE_OFF;
8792 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8793 continue;
8794
8795 addr = toc->output_section->vma + toc->output_section->rawsize;
8796 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8797 continue;
8798
8799 if (skip == NULL)
8800 {
8801 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8802 if (skip == NULL)
8803 goto error_ret;
8804 }
8805
8806 skip[rel->r_offset >> 3]
425b145b 8807 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 8808 }
ba761f19
AM
8809 }
8810
c5614fa4
AM
8811 if (skip == NULL)
8812 continue;
8813
8814 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8815 if (used == NULL)
8816 {
8817 error_ret:
8818 if (local_syms != NULL
8819 && symtab_hdr->contents != (unsigned char *) local_syms)
8820 free (local_syms);
8821 if (sec != NULL
8822 && relstart != NULL
8823 && elf_section_data (sec)->relocs != relstart)
8824 free (relstart);
425b145b
AM
8825 if (toc_relocs != NULL
8826 && elf_section_data (toc)->relocs != toc_relocs)
8827 free (toc_relocs);
c5614fa4
AM
8828 if (skip != NULL)
8829 free (skip);
8830 return FALSE;
8831 }
8832
30038c59
AM
8833 /* Now check all kept sections that might reference the toc.
8834 Check the toc itself last. */
8835 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8836 : ibfd->sections);
c5614fa4 8837 sec != NULL;
c5614fa4 8838 sec = (sec == toc ? NULL
c5614fa4 8839 : sec->next == NULL ? toc
30038c59 8840 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
8841 : sec->next))
8842 {
8843 int repeat;
8844
8845 if (sec->reloc_count == 0
dbaa2011 8846 || discarded_section (sec)
c5614fa4
AM
8847 || get_opd_info (sec)
8848 || (sec->flags & SEC_ALLOC) == 0
8849 || (sec->flags & SEC_DEBUGGING) != 0)
8850 continue;
8851
854b41e7
AM
8852 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8853 info->keep_memory);
c5614fa4 8854 if (relstart == NULL)
2915c55b
JK
8855 {
8856 free (used);
8857 goto error_ret;
8858 }
c5614fa4
AM
8859
8860 /* Mark toc entries referenced as used. */
c5614fa4 8861 do
d4f1ee75
AM
8862 {
8863 repeat = 0;
8864 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8865 {
8866 enum elf_ppc64_reloc_type r_type;
8867 unsigned long r_symndx;
8868 asection *sym_sec;
8869 struct elf_link_hash_entry *h;
8870 Elf_Internal_Sym *sym;
8871 bfd_vma val;
98528052 8872
d4f1ee75 8873 r_type = ELF64_R_TYPE (rel->r_info);
d4f1ee75
AM
8874 switch (r_type)
8875 {
8876 case R_PPC64_TOC16:
8877 case R_PPC64_TOC16_LO:
8878 case R_PPC64_TOC16_HI:
8879 case R_PPC64_TOC16_HA:
8880 case R_PPC64_TOC16_DS:
8881 case R_PPC64_TOC16_LO_DS:
8882 /* In case we're taking addresses of toc entries. */
8883 case R_PPC64_ADDR64:
8884 break;
c5614fa4 8885
d4f1ee75
AM
8886 default:
8887 continue;
8888 }
c5614fa4 8889
d4f1ee75
AM
8890 r_symndx = ELF64_R_SYM (rel->r_info);
8891 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8892 r_symndx, ibfd))
8893 {
8894 free (used);
8895 goto error_ret;
8896 }
c5614fa4 8897
d4f1ee75
AM
8898 if (sym_sec != toc)
8899 continue;
c5614fa4 8900
d4f1ee75
AM
8901 if (h != NULL)
8902 val = h->root.u.def.value;
8903 else
8904 val = sym->st_value;
8905 val += rel->r_addend;
ba761f19 8906
d4f1ee75
AM
8907 if (val >= toc->size)
8908 continue;
ba761f19 8909
d4f1ee75
AM
8910 if ((skip[val >> 3] & can_optimize) != 0)
8911 {
8912 bfd_vma off;
8913 unsigned char opc;
8914
8915 switch (r_type)
8916 {
8917 case R_PPC64_TOC16_HA:
ba761f19 8918 break;
ba761f19 8919
d4f1ee75
AM
8920 case R_PPC64_TOC16_LO_DS:
8921 off = rel->r_offset;
8922 off += (bfd_big_endian (ibfd) ? -2 : 3);
8923 if (!bfd_get_section_contents (ibfd, sec, &opc,
8924 off, 1))
8925 {
8926 free (used);
8927 goto error_ret;
8928 }
8929 if ((opc & (0x3f << 2)) == (58u << 2))
8930 break;
1a0670f3 8931 /* Fall through. */
ba761f19 8932
d4f1ee75
AM
8933 default:
8934 /* Wrong sort of reloc, or not a ld. We may
8935 as well clear ref_from_discarded too. */
8936 skip[val >> 3] = 0;
8937 }
8938 }
8939
8940 if (sec != toc)
8941 used[val >> 3] = 1;
8942 /* For the toc section, we only mark as used if this
8943 entry itself isn't unused. */
8944 else if ((used[rel->r_offset >> 3]
8945 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
8946 && !used[val >> 3])
8947 {
8948 /* Do all the relocs again, to catch reference
8949 chains. */
8950 repeat = 1;
8951 used[val >> 3] = 1;
8952 }
8953 }
8954 }
c5614fa4 8955 while (repeat);
854b41e7
AM
8956
8957 if (elf_section_data (sec)->relocs != relstart)
8958 free (relstart);
c5614fa4
AM
8959 }
8960
8961 /* Merge the used and skip arrays. Assume that TOC
8962 doublewords not appearing as either used or unused belong
de194d85 8963 to an entry more than one doubleword in size. */
c5614fa4
AM
8964 for (drop = skip, keep = used, last = 0, some_unused = 0;
8965 drop < skip + (toc->size + 7) / 8;
8966 ++drop, ++keep)
8967 {
8968 if (*keep)
8969 {
ba761f19
AM
8970 *drop &= ~ref_from_discarded;
8971 if ((*drop & can_optimize) != 0)
8972 some_unused = 1;
c5614fa4
AM
8973 last = 0;
8974 }
b140b010 8975 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
8976 {
8977 some_unused = 1;
ba761f19 8978 last = ref_from_discarded;
c5614fa4
AM
8979 }
8980 else
8981 *drop = last;
8982 }
8983
8984 free (used);
8985
8986 if (some_unused)
8987 {
8988 bfd_byte *contents, *src;
8989 unsigned long off;
d62b3684 8990 Elf_Internal_Sym *sym;
ba761f19 8991 bfd_boolean local_toc_syms = FALSE;
c5614fa4
AM
8992
8993 /* Shuffle the toc contents, and at the same time convert the
8994 skip array from booleans into offsets. */
8995 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8996 goto error_ret;
8997
8998 elf_section_data (toc)->this_hdr.contents = contents;
8999
9000 for (src = contents, off = 0, drop = skip;
9001 src < contents + toc->size;
9002 src += 8, ++drop)
9003 {
ba761f19
AM
9004 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9005 off += 8;
c5614fa4
AM
9006 else if (off != 0)
9007 {
9008 *drop = off;
9009 memcpy (src - off, src, 8);
9010 }
9011 }
854b41e7 9012 *drop = off;
c5614fa4
AM
9013 toc->rawsize = toc->size;
9014 toc->size = src - contents - off;
9015
ba761f19
AM
9016 /* Adjust addends for relocs against the toc section sym,
9017 and optimize any accesses we can. */
c5614fa4
AM
9018 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9019 {
9020 if (sec->reloc_count == 0
dbaa2011 9021 || discarded_section (sec))
c5614fa4
AM
9022 continue;
9023
9024 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 9025 info->keep_memory);
c5614fa4
AM
9026 if (relstart == NULL)
9027 goto error_ret;
9028
9029 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9030 {
9031 enum elf_ppc64_reloc_type r_type;
9032 unsigned long r_symndx;
9033 asection *sym_sec;
9034 struct elf_link_hash_entry *h;
854b41e7 9035 bfd_vma val;
c5614fa4
AM
9036
9037 r_type = ELF64_R_TYPE (rel->r_info);
9038 switch (r_type)
9039 {
9040 default:
9041 continue;
9042
9043 case R_PPC64_TOC16:
9044 case R_PPC64_TOC16_LO:
9045 case R_PPC64_TOC16_HI:
9046 case R_PPC64_TOC16_HA:
9047 case R_PPC64_TOC16_DS:
9048 case R_PPC64_TOC16_LO_DS:
9049 case R_PPC64_ADDR64:
9050 break;
9051 }
9052
9053 r_symndx = ELF64_R_SYM (rel->r_info);
9054 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9055 r_symndx, ibfd))
9056 goto error_ret;
9057
ba761f19 9058 if (sym_sec != toc)
c5614fa4
AM
9059 continue;
9060
ba761f19
AM
9061 if (h != NULL)
9062 val = h->root.u.def.value;
9063 else
9064 {
9065 val = sym->st_value;
9066 if (val != 0)
9067 local_toc_syms = TRUE;
9068 }
9069
9070 val += rel->r_addend;
854b41e7
AM
9071
9072 if (val > toc->rawsize)
9073 val = toc->rawsize;
ba761f19
AM
9074 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9075 continue;
9076 else if ((skip[val >> 3] & can_optimize) != 0)
9077 {
9078 Elf_Internal_Rela *tocrel
425b145b 9079 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
9080 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9081
9082 switch (r_type)
9083 {
9084 case R_PPC64_TOC16_HA:
9085 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9086 break;
9087
9088 case R_PPC64_TOC16_LO_DS:
9089 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9090 break;
9091
9092 default:
28942f62
AM
9093 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9094 ppc_howto_init ();
b140b010 9095 info->callbacks->einfo
695344c0 9096 /* xgettext:c-format */
174d0a74 9097 (_("%H: %s references "
b140b010
AM
9098 "optimized away TOC entry\n"),
9099 ibfd, sec, rel->r_offset,
9100 ppc64_elf_howto_table[r_type]->name);
9101 bfd_set_error (bfd_error_bad_value);
9102 goto error_ret;
ba761f19
AM
9103 }
9104 rel->r_addend = tocrel->r_addend;
9105 elf_section_data (sec)->relocs = relstart;
9106 continue;
9107 }
9108
9109 if (h != NULL || sym->st_value != 0)
9110 continue;
854b41e7
AM
9111
9112 rel->r_addend -= skip[val >> 3];
9113 elf_section_data (sec)->relocs = relstart;
c5614fa4 9114 }
854b41e7
AM
9115
9116 if (elf_section_data (sec)->relocs != relstart)
9117 free (relstart);
c5614fa4
AM
9118 }
9119
9120 /* We shouldn't have local or global symbols defined in the TOC,
9121 but handle them anyway. */
df22d223
AM
9122 if (local_syms != NULL)
9123 for (sym = local_syms;
9124 sym < local_syms + symtab_hdr->sh_info;
9125 ++sym)
9126 if (sym->st_value != 0
9127 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9128 {
9129 unsigned long i;
854b41e7 9130
df22d223
AM
9131 if (sym->st_value > toc->rawsize)
9132 i = toc->rawsize >> 3;
9133 else
9134 i = sym->st_value >> 3;
854b41e7 9135
df22d223
AM
9136 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9137 {
9138 if (local_toc_syms)
4eca0228 9139 _bfd_error_handler
df22d223
AM
9140 (_("%s defined on removed toc entry"),
9141 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9142 do
9143 ++i;
9144 while ((skip[i] & (ref_from_discarded | can_optimize)));
9145 sym->st_value = (bfd_vma) i << 3;
9146 }
d62b3684 9147
df22d223
AM
9148 sym->st_value -= skip[i];
9149 symtab_hdr->contents = (unsigned char *) local_syms;
9150 }
c5614fa4 9151
854b41e7 9152 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
9153 if (toc_inf.global_toc_syms)
9154 {
9155 toc_inf.toc = toc;
9156 toc_inf.skip = skip;
9157 toc_inf.global_toc_syms = FALSE;
9158 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9159 &toc_inf);
9160 }
854b41e7
AM
9161
9162 if (toc->reloc_count != 0)
9163 {
d4730f92 9164 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
9165 Elf_Internal_Rela *wrel;
9166 bfd_size_type sz;
9167
854b41e7 9168 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
9169 if (toc_relocs == NULL)
9170 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9171 info->keep_memory);
9172 if (toc_relocs == NULL)
9173 goto error_ret;
9174
425b145b
AM
9175 wrel = toc_relocs;
9176 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9177 if ((skip[rel->r_offset >> 3]
9178 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
9179 {
9180 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9181 wrel->r_info = rel->r_info;
9182 wrel->r_addend = rel->r_addend;
9183 ++wrel;
9184 }
9185 else if (!dec_dynrel_count (rel->r_info, toc, info,
9186 &local_syms, NULL, NULL))
9187 goto error_ret;
9188
425b145b
AM
9189 elf_section_data (toc)->relocs = toc_relocs;
9190 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
9191 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9192 sz = rel_hdr->sh_entsize;
9193 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9194 }
c5614fa4 9195 }
28be611c
AM
9196 else if (toc_relocs != NULL
9197 && elf_section_data (toc)->relocs != toc_relocs)
425b145b 9198 free (toc_relocs);
c5614fa4
AM
9199
9200 if (local_syms != NULL
9201 && symtab_hdr->contents != (unsigned char *) local_syms)
9202 {
9203 if (!info->keep_memory)
9204 free (local_syms);
9205 else
9206 symtab_hdr->contents = (unsigned char *) local_syms;
9207 }
9208 free (skip);
9209 }
9210
066f4018 9211 /* Look for cases where we can change an indirect GOT access to
4a421c53
AM
9212 a GOT relative or PC relative access, possibly reducing the
9213 number of GOT entries. */
066f4018
AM
9214 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9215 {
9216 asection *sec;
9217 Elf_Internal_Shdr *symtab_hdr;
9218 Elf_Internal_Sym *local_syms;
9219 Elf_Internal_Rela *relstart, *rel;
9220 bfd_vma got;
9221
9222 if (!is_ppc64_elf (ibfd))
9223 continue;
9224
903b777d 9225 if (!ppc64_elf_tdata (ibfd)->has_optrel)
066f4018
AM
9226 continue;
9227
9228 sec = ppc64_elf_tdata (ibfd)->got;
903b777d
AM
9229 got = 0;
9230 if (sec != NULL)
9231 got = sec->output_section->vma + sec->output_offset + 0x8000;
066f4018
AM
9232
9233 local_syms = NULL;
9234 symtab_hdr = &elf_symtab_hdr (ibfd);
9235
9236 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9237 {
9238 if (sec->reloc_count == 0
903b777d 9239 || !ppc64_elf_section_data (sec)->has_optrel
066f4018
AM
9240 || discarded_section (sec))
9241 continue;
9242
9243 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9244 info->keep_memory);
9245 if (relstart == NULL)
9246 {
9247 got_error_ret:
9248 if (local_syms != NULL
9249 && symtab_hdr->contents != (unsigned char *) local_syms)
9250 free (local_syms);
9251 if (sec != NULL
9252 && relstart != NULL
9253 && elf_section_data (sec)->relocs != relstart)
9254 free (relstart);
9255 return FALSE;
9256 }
9257
9258 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9259 {
9260 enum elf_ppc64_reloc_type r_type;
9261 unsigned long r_symndx;
9262 Elf_Internal_Sym *sym;
9263 asection *sym_sec;
9264 struct elf_link_hash_entry *h;
9265 struct got_entry *ent;
133a1f60 9266 bfd_vma val, pc;
4a421c53 9267 unsigned char buf[8];
066f4018 9268 unsigned int insn;
903b777d 9269 enum {no_check, check_lo, check_ha} insn_check;
066f4018
AM
9270
9271 r_type = ELF64_R_TYPE (rel->r_info);
903b777d
AM
9272 switch (r_type)
9273 {
9274 default:
9275 insn_check = no_check;
9276 break;
9277
9278 case R_PPC64_PLT16_HA:
9279 case R_PPC64_GOT_TLSLD16_HA:
9280 case R_PPC64_GOT_TLSGD16_HA:
9281 case R_PPC64_GOT_TPREL16_HA:
9282 case R_PPC64_GOT_DTPREL16_HA:
9283 case R_PPC64_GOT16_HA:
9284 case R_PPC64_TOC16_HA:
9285 insn_check = check_ha;
9286 break;
9287
9288 case R_PPC64_PLT16_LO:
9289 case R_PPC64_PLT16_LO_DS:
9290 case R_PPC64_GOT_TLSLD16_LO:
9291 case R_PPC64_GOT_TLSGD16_LO:
9292 case R_PPC64_GOT_TPREL16_LO_DS:
9293 case R_PPC64_GOT_DTPREL16_LO_DS:
9294 case R_PPC64_GOT16_LO:
9295 case R_PPC64_GOT16_LO_DS:
9296 case R_PPC64_TOC16_LO:
9297 case R_PPC64_TOC16_LO_DS:
9298 insn_check = check_lo;
9299 break;
9300 }
9301
9302 if (insn_check != no_check)
9303 {
9304 bfd_vma off = rel->r_offset & ~3;
9305
9306 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9307 goto got_error_ret;
9308
9309 insn = bfd_get_32 (ibfd, buf);
9310 if (insn_check == check_lo
9311 ? !ok_lo_toc_insn (insn, r_type)
2365f8d7 9312 : ((insn & ((0x3fu << 26) | 0x1f << 16))
903b777d
AM
9313 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9314 {
9315 char str[12];
9316
9317 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9318 sprintf (str, "%#08x", insn);
9319 info->callbacks->einfo
9320 /* xgettext:c-format */
9321 (_("%H: got/toc optimization is not supported for"
9322 " %s instruction\n"),
9323 ibfd, sec, rel->r_offset & ~3, str);
9324 continue;
9325 }
9326 }
9327
066f4018
AM
9328 switch (r_type)
9329 {
bb22a418
AM
9330 /* Note that we don't delete GOT entries for
9331 R_PPC64_GOT16_DS since we'd need a lot more
9332 analysis. For starters, the preliminary layout is
9333 before the GOT, PLT, dynamic sections and stubs are
9334 laid out. Then we'd need to allow for changes in
9335 distance between sections caused by alignment. */
066f4018
AM
9336 default:
9337 continue;
9338
066f4018
AM
9339 case R_PPC64_GOT16_HA:
9340 case R_PPC64_GOT16_LO_DS:
4a421c53 9341 case R_PPC64_GOT_PCREL34:
066f4018
AM
9342 break;
9343 }
9344
9345 r_symndx = ELF64_R_SYM (rel->r_info);
9346 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9347 r_symndx, ibfd))
9348 goto got_error_ret;
9349
6d5554a6
AM
9350 if (sym_sec == NULL
9351 || sym_sec->output_section == NULL
9352 || discarded_section (sym_sec))
9353 continue;
9354
066f4018
AM
9355 if (!SYMBOL_REFERENCES_LOCAL (info, h))
9356 continue;
9357
9358 if (h != NULL)
9359 val = h->root.u.def.value;
9360 else
9361 val = sym->st_value;
133a1f60 9362 val += rel->r_addend;
066f4018
AM
9363 val += sym_sec->output_section->vma + sym_sec->output_offset;
9364
bb22a418
AM
9365/* Fudge factor to allow for the fact that the preliminary layout
9366 isn't exact. Reduce limits by this factor. */
9367#define LIMIT_ADJUST(LIMIT) ((LIMIT) - (LIMIT) / 16)
9368
066f4018
AM
9369 switch (r_type)
9370 {
9371 default:
9372 continue;
9373
066f4018 9374 case R_PPC64_GOT16_HA:
bb22a418
AM
9375 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9376 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9377 continue;
9378
9379 if (!bfd_get_section_contents (ibfd, sec, buf,
9380 rel->r_offset & ~3, 4))
9381 goto got_error_ret;
9382 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9383 if (((insn & ((0x3fu << 26) | 0x1f << 16))
066f4018
AM
9384 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9385 continue;
9386 break;
9387
9388 case R_PPC64_GOT16_LO_DS:
bb22a418
AM
9389 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9390 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9391 continue;
9392 if (!bfd_get_section_contents (ibfd, sec, buf,
9393 rel->r_offset & ~3, 4))
9394 goto got_error_ret;
9395 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9396 if ((insn & (0x3fu << 26 | 0x3)) != 58u << 26 /* ld */)
066f4018
AM
9397 continue;
9398 break;
4a421c53
AM
9399
9400 case R_PPC64_GOT_PCREL34:
9401 pc = rel->r_offset;
9402 pc += sec->output_section->vma + sec->output_offset;
bb22a418
AM
9403 if (val - pc + LIMIT_ADJUST (1ULL << 33)
9404 >= LIMIT_ADJUST (1ULL << 34))
4a421c53
AM
9405 continue;
9406 if (!bfd_get_section_contents (ibfd, sec, buf,
9407 rel->r_offset & ~3, 8))
9408 goto got_error_ret;
9409 insn = bfd_get_32 (ibfd, buf);
9410 if ((insn & (-1u << 18)) != ((1u << 26) | (1u << 20)))
9411 continue;
9412 insn = bfd_get_32 (ibfd, buf + 4);
2365f8d7 9413 if ((insn & (0x3fu << 26)) != 57u << 26)
4a421c53
AM
9414 continue;
9415 break;
066f4018 9416 }
bb22a418 9417#undef LIMIT_ADJUST
066f4018
AM
9418
9419 if (h != NULL)
9420 ent = h->got.glist;
9421 else
9422 {
9423 struct got_entry **local_got_ents = elf_local_got_ents (ibfd);
9424 ent = local_got_ents[r_symndx];
9425 }
9426 for (; ent != NULL; ent = ent->next)
133a1f60 9427 if (ent->addend == rel->r_addend
066f4018
AM
9428 && ent->owner == ibfd
9429 && ent->tls_type == 0)
9430 break;
9431 BFD_ASSERT (ent && ent->got.refcount > 0);
9432 ent->got.refcount -= 1;
9433 }
9434
9435 if (elf_section_data (sec)->relocs != relstart)
9436 free (relstart);
9437 }
9438
9439 if (local_syms != NULL
9440 && symtab_hdr->contents != (unsigned char *) local_syms)
9441 {
9442 if (!info->keep_memory)
9443 free (local_syms);
9444 else
9445 symtab_hdr->contents = (unsigned char *) local_syms;
9446 }
9447 }
9448
c5614fa4
AM
9449 return TRUE;
9450}
9451
1bbe0902
AM
9452/* Return true iff input section I references the TOC using
9453 instructions limited to +/-32k offsets. */
9454
9455bfd_boolean
9456ppc64_elf_has_small_toc_reloc (asection *i)
9457{
9458 return (is_ppc64_elf (i->owner)
9459 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9460}
9461
927be08e
AM
9462/* Allocate space for one GOT entry. */
9463
9464static void
9465allocate_got (struct elf_link_hash_entry *h,
9466 struct bfd_link_info *info,
9467 struct got_entry *gent)
9468{
9469 struct ppc_link_hash_table *htab = ppc_hash_table (info);
ed7007c1 9470 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
927be08e
AM
9471 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9472 ? 16 : 8);
9473 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9474 ? 2 : 1) * sizeof (Elf64_External_Rela);
9475 asection *got = ppc64_elf_tdata (gent->owner)->got;
9476
9477 gent->got.offset = got->size;
9478 got->size += entsize;
9479
19e08130 9480 if (h->type == STT_GNU_IFUNC)
927be08e 9481 {
33e44f2e 9482 htab->elf.irelplt->size += rentsize;
19e08130 9483 htab->got_reli_size += rentsize;
927be08e 9484 }
f15d0b54 9485 else if (((bfd_link_pic (info)
f749f26e 9486 && !(gent->tls_type != 0
f15d0b54
AM
9487 && bfd_link_executable (info)
9488 && SYMBOL_REFERENCES_LOCAL (info, h)))
f0158f44
AM
9489 || (htab->elf.dynamic_sections_created
9490 && h->dynindx != -1
9491 && !SYMBOL_REFERENCES_LOCAL (info, h)))
21d68fcd 9492 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
927be08e 9493 {
19e08130 9494 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9495 relgot->size += rentsize;
927be08e
AM
9496 }
9497}
9498
7865406b
AM
9499/* This function merges got entries in the same toc group. */
9500
9501static void
9502merge_got_entries (struct got_entry **pent)
9503{
9504 struct got_entry *ent, *ent2;
9505
9506 for (ent = *pent; ent != NULL; ent = ent->next)
9507 if (!ent->is_indirect)
9508 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9509 if (!ent2->is_indirect
9510 && ent2->addend == ent->addend
9511 && ent2->tls_type == ent->tls_type
9512 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9513 {
9514 ent2->is_indirect = TRUE;
9515 ent2->got.ent = ent;
9516 }
9517}
9518
46434633 9519/* If H is undefined, make it dynamic if that makes sense. */
f0158f44
AM
9520
9521static bfd_boolean
46434633
AM
9522ensure_undef_dynamic (struct bfd_link_info *info,
9523 struct elf_link_hash_entry *h)
f0158f44
AM
9524{
9525 struct elf_link_hash_table *htab = elf_hash_table (info);
9526
9527 if (htab->dynamic_sections_created
46434633
AM
9528 && ((info->dynamic_undefined_weak != 0
9529 && h->root.type == bfd_link_hash_undefweak)
9530 || h->root.type == bfd_link_hash_undefined)
f0158f44
AM
9531 && h->dynindx == -1
9532 && !h->forced_local
9533 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9534 return bfd_elf_link_record_dynamic_symbol (info, h);
9535 return TRUE;
9536}
9537
65f38f15
AM
9538/* Allocate space in .plt, .got and associated reloc sections for
9539 dynamic relocs. */
5bd4f169 9540
b34976b6 9541static bfd_boolean
4ce794b7 9542allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9543{
65f38f15
AM
9544 struct bfd_link_info *info;
9545 struct ppc_link_hash_table *htab;
5bd4f169 9546 asection *s;
65f38f15 9547 struct ppc_link_hash_entry *eh;
0b8bcf0d 9548 struct got_entry **pgent, *gent;
5bd4f169 9549
e92d460e 9550 if (h->root.type == bfd_link_hash_indirect)
b34976b6 9551 return TRUE;
5bd4f169 9552
65f38f15
AM
9553 info = (struct bfd_link_info *) inf;
9554 htab = ppc_hash_table (info);
4dfe6ac6
NC
9555 if (htab == NULL)
9556 return FALSE;
5bd4f169 9557
ed7007c1 9558 eh = ppc_elf_hash_entry (h);
951fd09b
AM
9559 /* Run through the TLS GD got entries first if we're changing them
9560 to TPREL. */
b00a0a86 9561 if ((eh->tls_mask & (TLS_TLS | TLS_GDIE)) == (TLS_TLS | TLS_GDIE))
951fd09b
AM
9562 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9563 if (gent->got.refcount > 0
9564 && (gent->tls_type & TLS_GD) != 0)
9565 {
9566 /* This was a GD entry that has been converted to TPREL. If
9567 there happens to be a TPREL entry we can use that one. */
9568 struct got_entry *ent;
9569 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9570 if (ent->got.refcount > 0
9571 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9572 && ent->addend == gent->addend
9573 && ent->owner == gent->owner)
951fd09b
AM
9574 {
9575 gent->got.refcount = 0;
9576 break;
9577 }
9578
9579 /* If not, then we'll be using our own TPREL entry. */
9580 if (gent->got.refcount != 0)
9581 gent->tls_type = TLS_TLS | TLS_TPREL;
9582 }
9583
7865406b
AM
9584 /* Remove any list entry that won't generate a word in the GOT before
9585 we call merge_got_entries. Otherwise we risk merging to empty
9586 entries. */
0b8bcf0d
AM
9587 pgent = &h->got.glist;
9588 while ((gent = *pgent) != NULL)
411e1bfb 9589 if (gent->got.refcount > 0)
7865406b
AM
9590 {
9591 if ((gent->tls_type & TLS_LD) != 0
f749f26e 9592 && SYMBOL_REFERENCES_LOCAL (info, h))
7865406b
AM
9593 {
9594 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9595 *pgent = gent->next;
9596 }
9597 else
9598 pgent = &gent->next;
9599 }
9600 else
9601 *pgent = gent->next;
9602
9603 if (!htab->do_multi_toc)
9604 merge_got_entries (&h->got.glist);
9605
9606 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9607 if (!gent->is_indirect)
411e1bfb 9608 {
ec73ddcd
AM
9609 /* Ensure we catch all the cases where this symbol should
9610 be made dynamic. */
46434633 9611 if (!ensure_undef_dynamic (info, h))
f0158f44 9612 return FALSE;
65f38f15 9613
0c8d6e5c 9614 if (!is_ppc64_elf (gent->owner))
927be08e 9615 abort ();
0ffa91dd 9616
927be08e 9617 allocate_got (h, info, gent);
411e1bfb 9618 }
65f38f15 9619
954b63d4
AM
9620 /* If no dynamic sections we can't have dynamic relocs, except for
9621 IFUNCs which are handled even in static executables. */
8a2058b5
AM
9622 if (!htab->elf.dynamic_sections_created
9623 && h->type != STT_GNU_IFUNC)
9624 eh->dyn_relocs = NULL;
9625
529fe20e
AM
9626 /* Discard relocs on undefined symbols that must be local. */
9627 else if (h->root.type == bfd_link_hash_undefined
9628 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9629 eh->dyn_relocs = NULL;
9630
954b63d4
AM
9631 /* Also discard relocs on undefined weak syms with non-default
9632 visibility, or when dynamic_undefined_weak says so. */
21d68fcd 9633 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
954b63d4
AM
9634 eh->dyn_relocs = NULL;
9635
8a2058b5 9636 if (eh->dyn_relocs != NULL)
65f38f15 9637 {
8a2058b5
AM
9638 struct elf_dyn_relocs *p, **pp;
9639
57e7d118
AM
9640 /* In the shared -Bsymbolic case, discard space allocated for
9641 dynamic pc-relative relocs against symbols which turn out to
9642 be defined in regular objects. For the normal shared case,
9643 discard space for relocs that have become local due to symbol
9644 visibility changes. */
57e7d118 9645 if (bfd_link_pic (info))
65f38f15 9646 {
57e7d118
AM
9647 /* Relocs that use pc_count are those that appear on a call
9648 insn, or certain REL relocs (see must_be_dyn_reloc) that
9649 can be generated via assembly. We want calls to
9650 protected symbols to resolve directly to the function
9651 rather than going via the plt. If people want function
9652 pointer comparisons to work as expected then they should
9653 avoid writing weird assembly. */
9654 if (SYMBOL_CALLS_LOCAL (info, h))
9655 {
57e7d118
AM
9656 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9657 {
9658 p->count -= p->pc_count;
9659 p->pc_count = 0;
9660 if (p->count == 0)
9661 *pp = p->next;
9662 else
9663 pp = &p->next;
9664 }
9665 }
65f38f15 9666
954b63d4 9667 if (eh->dyn_relocs != NULL)
5bd4f169 9668 {
ec73ddcd
AM
9669 /* Ensure we catch all the cases where this symbol
9670 should be made dynamic. */
46434633 9671 if (!ensure_undef_dynamic (info, h))
f0158f44 9672 return FALSE;
5bd4f169 9673 }
65f38f15 9674 }
ec73ddcd
AM
9675
9676 /* For a fixed position executable, discard space for
9677 relocs against symbols which are not dynamic. */
9678 else if (h->type != STT_GNU_IFUNC)
57e7d118 9679 {
529fe20e
AM
9680 if (h->dynamic_adjusted
9681 && !h->def_regular
9682 && !ELF_COMMON_DEF_P (h))
f0158f44 9683 {
ec73ddcd
AM
9684 /* Ensure we catch all the cases where this symbol
9685 should be made dynamic. */
46434633 9686 if (!ensure_undef_dynamic (info, h))
f0158f44 9687 return FALSE;
dfbb6ac9 9688
ec73ddcd 9689 /* But if that didn't work out, discard dynamic relocs. */
f0158f44
AM
9690 if (h->dynindx == -1)
9691 eh->dyn_relocs = NULL;
9692 }
9693 else
8a2058b5 9694 eh->dyn_relocs = NULL;
57e7d118
AM
9695 }
9696
9697 /* Finally, allocate space. */
9698 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9699 {
9700 asection *sreloc = elf_section_data (p->sec)->sreloc;
9701 if (eh->elf.type == STT_GNU_IFUNC)
9702 sreloc = htab->elf.irelplt;
9703 sreloc->size += p->count * sizeof (Elf64_External_Rela);
dfbb6ac9 9704 }
65f38f15 9705 }
57e7d118 9706
2d7ad24e
AM
9707 /* We might need a PLT entry when the symbol
9708 a) is dynamic, or
9709 b) is an ifunc, or
9710 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
9711 d) has plt16 relocs and we are linking statically. */
9712 if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
9713 || h->type == STT_GNU_IFUNC
9714 || (h->needs_plt && h->dynamic_adjusted)
9715 || (h->needs_plt
9716 && h->def_regular
9717 && !htab->elf.dynamic_sections_created
3e04d765 9718 && !htab->can_convert_all_inline_plt
ed7007c1 9719 && (ppc_elf_hash_entry (h)->tls_mask
2d7ad24e 9720 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
65f38f15 9721 {
57e7d118
AM
9722 struct plt_entry *pent;
9723 bfd_boolean doneone = FALSE;
9724 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9725 if (pent->plt.refcount > 0)
9726 {
9727 if (!htab->elf.dynamic_sections_created
9728 || h->dynindx == -1)
9729 {
2d7ad24e
AM
9730 if (h->type == STT_GNU_IFUNC)
9731 {
9732 s = htab->elf.iplt;
9733 pent->plt.offset = s->size;
9734 s->size += PLT_ENTRY_SIZE (htab);
9735 s = htab->elf.irelplt;
9736 }
9737 else
9738 {
9739 s = htab->pltlocal;
9740 pent->plt.offset = s->size;
9741 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
9742 s = bfd_link_pic (info) ? htab->relpltlocal : NULL;
9743 }
57e7d118
AM
9744 }
9745 else
9746 {
9747 /* If this is the first .plt entry, make room for the special
9748 first entry. */
9749 s = htab->elf.splt;
9750 if (s->size == 0)
9751 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
65f38f15 9752
57e7d118 9753 pent->plt.offset = s->size;
65f38f15 9754
57e7d118
AM
9755 /* Make room for this entry. */
9756 s->size += PLT_ENTRY_SIZE (htab);
65f38f15 9757
57e7d118
AM
9758 /* Make room for the .glink code. */
9759 s = htab->glink;
9760 if (s->size == 0)
9e390558 9761 s->size += GLINK_PLTRESOLVE_SIZE (htab);
57e7d118
AM
9762 if (htab->opd_abi)
9763 {
9764 /* We need bigger stubs past index 32767. */
9e390558 9765 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4)
57e7d118
AM
9766 s->size += 4;
9767 s->size += 2*4;
9768 }
9769 else
9770 s->size += 4;
65f38f15 9771
57e7d118
AM
9772 /* We also need to make an entry in the .rela.plt section. */
9773 s = htab->elf.srelplt;
9774 }
2d7ad24e
AM
9775 if (s != NULL)
9776 s->size += sizeof (Elf64_External_Rela);
57e7d118
AM
9777 doneone = TRUE;
9778 }
9779 else
9780 pent->plt.offset = (bfd_vma) -1;
9781 if (!doneone)
9782 {
9783 h->plt.plist = NULL;
9784 h->needs_plt = 0;
9785 }
65f38f15 9786 }
57e7d118 9787 else
65f38f15 9788 {
57e7d118
AM
9789 h->plt.plist = NULL;
9790 h->needs_plt = 0;
65f38f15
AM
9791 }
9792
b34976b6 9793 return TRUE;
65f38f15
AM
9794}
9795
9e390558
AM
9796#define PPC_LO(v) ((v) & 0xffff)
9797#define PPC_HI(v) (((v) >> 16) & 0xffff)
9798#define PPC_HA(v) PPC_HI ((v) + 0x8000)
04bdff6a
AM
9799#define D34(v) \
9800 ((((v) & 0x3ffff0000ULL) << 16) | (v & 0xffff))
9801#define HA34(v) ((v + (1ULL << 33)) >> 34)
9e390558 9802
a345bc8d
AM
9803/* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9804 to set up space for global entry stubs. These are put in glink,
9805 after the branch table. */
65f38f15 9806
b34976b6 9807static bfd_boolean
a345bc8d 9808size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
65f38f15 9809{
a345bc8d
AM
9810 struct bfd_link_info *info;
9811 struct ppc_link_hash_table *htab;
9812 struct plt_entry *pent;
9e390558 9813 asection *s, *plt;
65f38f15 9814
a345bc8d
AM
9815 if (h->root.type == bfd_link_hash_indirect)
9816 return TRUE;
65f38f15 9817
a345bc8d
AM
9818 if (!h->pointer_equality_needed)
9819 return TRUE;
65f38f15 9820
a345bc8d
AM
9821 if (h->def_regular)
9822 return TRUE;
65f38f15 9823
a345bc8d
AM
9824 info = inf;
9825 htab = ppc_hash_table (info);
9826 if (htab == NULL)
9827 return FALSE;
9828
9e390558
AM
9829 s = htab->global_entry;
9830 plt = htab->elf.splt;
a345bc8d
AM
9831 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9832 if (pent->plt.offset != (bfd_vma) -1
9833 && pent->addend == 0)
9834 {
afe397ea
AM
9835 /* For ELFv2, if this symbol is not defined in a regular file
9836 and we are not generating a shared library or pie, then we
9837 need to define the symbol in the executable on a call stub.
9838 This is to avoid text relocations. */
9e390558
AM
9839 bfd_vma off, stub_align, stub_off, stub_size;
9840 unsigned int align_power;
9841
9842 stub_size = 16;
9843 stub_off = s->size;
9844 if (htab->params->plt_stub_align >= 0)
9845 align_power = htab->params->plt_stub_align;
9846 else
9847 align_power = -htab->params->plt_stub_align;
9848 /* Setting section alignment is delayed until we know it is
9849 non-empty. Otherwise the .text output section will be
9850 aligned at least to plt_stub_align even when no global
9851 entry stubs are needed. */
9852 if (s->alignment_power < align_power)
9853 s->alignment_power = align_power;
9854 stub_align = (bfd_vma) 1 << align_power;
9855 if (htab->params->plt_stub_align >= 0
9856 || ((((stub_off + stub_size - 1) & -stub_align)
9857 - (stub_off & -stub_align))
9858 > ((stub_size - 1) & -stub_align)))
9859 stub_off = (stub_off + stub_align - 1) & -stub_align;
9860 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
9861 off -= stub_off + s->output_offset + s->output_section->vma;
9862 /* Note that for --plt-stub-align negative we have a possible
9863 dependency between stub offset and size. Break that
9864 dependency by assuming the max stub size when calculating
9865 the stub offset. */
9866 if (PPC_HA (off) == 0)
9867 stub_size -= 4;
8a2058b5 9868 h->root.type = bfd_link_hash_defined;
afe397ea 9869 h->root.u.def.section = s;
9e390558
AM
9870 h->root.u.def.value = stub_off;
9871 s->size = stub_off + stub_size;
a345bc8d
AM
9872 break;
9873 }
9874 return TRUE;
9875}
9876
9877/* Set DF_TEXTREL if we find any dynamic relocs that apply to
9878 read-only sections. */
9879
9880static bfd_boolean
98bbb1b8 9881maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
a345bc8d 9882{
98bbb1b8
AM
9883 asection *sec;
9884
a345bc8d
AM
9885 if (h->root.type == bfd_link_hash_indirect)
9886 return TRUE;
9887
98bbb1b8
AM
9888 sec = readonly_dynrelocs (h);
9889 if (sec != NULL)
a345bc8d 9890 {
98bbb1b8
AM
9891 struct bfd_link_info *info = (struct bfd_link_info *) inf;
9892
9893 info->flags |= DF_TEXTREL;
2cdcc330
AM
9894 info->callbacks->minfo (_("%pB: dynamic relocation against `%pT'"
9895 " in read-only section `%pA'\n"),
9896 sec->owner, h->root.root.string, sec);
a345bc8d
AM
9897
9898 /* Not an error, just cut short the traversal. */
9899 return FALSE;
65f38f15 9900 }
b34976b6 9901 return TRUE;
65f38f15
AM
9902}
9903
9904/* Set the sizes of the dynamic sections. */
9905
b34976b6 9906static bfd_boolean
ee67d69a 9907ppc64_elf_size_dynamic_sections (bfd *output_bfd,
4ce794b7 9908 struct bfd_link_info *info)
65f38f15
AM
9909{
9910 struct ppc_link_hash_table *htab;
9911 bfd *dynobj;
9912 asection *s;
b34976b6 9913 bfd_boolean relocs;
65f38f15 9914 bfd *ibfd;
7865406b 9915 struct got_entry *first_tlsld;
65f38f15
AM
9916
9917 htab = ppc_hash_table (info);
4dfe6ac6
NC
9918 if (htab == NULL)
9919 return FALSE;
9920
65f38f15
AM
9921 dynobj = htab->elf.dynobj;
9922 if (dynobj == NULL)
9923 abort ();
9924
9925 if (htab->elf.dynamic_sections_created)
9926 {
9927 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 9928 if (bfd_link_executable (info) && !info->nointerp)
65f38f15 9929 {
3d4d4302 9930 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
9931 if (s == NULL)
9932 abort ();
eea6121a 9933 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
9934 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9935 }
9936 }
9937
9938 /* Set up .got offsets for local syms, and space for local dynamic
9939 relocs. */
c72f2fb2 9940 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
65f38f15 9941 {
411e1bfb
AM
9942 struct got_entry **lgot_ents;
9943 struct got_entry **end_lgot_ents;
e054468f
AM
9944 struct plt_entry **local_plt;
9945 struct plt_entry **end_local_plt;
f961d9dd 9946 unsigned char *lgot_masks;
65f38f15
AM
9947 bfd_size_type locsymcount;
9948 Elf_Internal_Shdr *symtab_hdr;
65f38f15 9949
0c8d6e5c 9950 if (!is_ppc64_elf (ibfd))
65f38f15
AM
9951 continue;
9952
9953 for (s = ibfd->sections; s != NULL; s = s->next)
9954 {
19e08130 9955 struct ppc_dyn_relocs *p;
65f38f15 9956
6edfbbad 9957 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 9958 {
ec338859
AM
9959 if (!bfd_is_abs_section (p->sec)
9960 && bfd_is_abs_section (p->sec->output_section))
9961 {
9962 /* Input section has been discarded, either because
9963 it is a copy of a linkonce section or due to
9964 linker script /DISCARD/, so we'll be discarding
9965 the relocs too. */
9966 }
248866a8 9967 else if (p->count != 0)
ec338859 9968 {
19e08130
AM
9969 asection *srel = elf_section_data (p->sec)->sreloc;
9970 if (p->ifunc)
33e44f2e 9971 srel = htab->elf.irelplt;
eea6121a 9972 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
9973 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9974 info->flags |= DF_TEXTREL;
ec338859 9975 }
65f38f15
AM
9976 }
9977 }
9978
411e1bfb
AM
9979 lgot_ents = elf_local_got_ents (ibfd);
9980 if (!lgot_ents)
65f38f15
AM
9981 continue;
9982
0ffa91dd 9983 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 9984 locsymcount = symtab_hdr->sh_info;
411e1bfb 9985 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
9986 local_plt = (struct plt_entry **) end_lgot_ents;
9987 end_local_plt = local_plt + locsymcount;
f961d9dd 9988 lgot_masks = (unsigned char *) end_local_plt;
e717da7e 9989 s = ppc64_elf_tdata (ibfd)->got;
e7b938ca 9990 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 9991 {
0b8bcf0d 9992 struct got_entry **pent, *ent;
411e1bfb 9993
0b8bcf0d
AM
9994 pent = lgot_ents;
9995 while ((ent = *pent) != NULL)
411e1bfb
AM
9996 if (ent->got.refcount > 0)
9997 {
e7b938ca 9998 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 9999 {
927be08e 10000 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 10001 *pent = ent->next;
411e1bfb
AM
10002 }
10003 else
10004 {
19e08130
AM
10005 unsigned int ent_size = 8;
10006 unsigned int rel_size = sizeof (Elf64_External_Rela);
10007
eea6121a 10008 ent->got.offset = s->size;
e7b938ca 10009 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 10010 {
19e08130
AM
10011 ent_size *= 2;
10012 rel_size *= 2;
10013 }
10014 s->size += ent_size;
37da22e5 10015 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 10016 {
33e44f2e 10017 htab->elf.irelplt->size += rel_size;
19e08130
AM
10018 htab->got_reli_size += rel_size;
10019 }
93370e8e
AM
10020 else if (bfd_link_pic (info)
10021 && !(ent->tls_type != 0
10022 && bfd_link_executable (info)))
19e08130
AM
10023 {
10024 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10025 srel->size += rel_size;
927be08e 10026 }
0b8bcf0d 10027 pent = &ent->next;
411e1bfb
AM
10028 }
10029 }
10030 else
0b8bcf0d 10031 *pent = ent->next;
65f38f15 10032 }
e054468f 10033
2d7ad24e
AM
10034 /* Allocate space for plt calls to local syms. */
10035 lgot_masks = (unsigned char *) end_local_plt;
10036 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
e054468f
AM
10037 {
10038 struct plt_entry *ent;
10039
10040 for (ent = *local_plt; ent != NULL; ent = ent->next)
10041 if (ent->plt.refcount > 0)
10042 {
2d7ad24e
AM
10043 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
10044 {
10045 s = htab->elf.iplt;
10046 ent->plt.offset = s->size;
10047 s->size += PLT_ENTRY_SIZE (htab);
10048 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
10049 }
3e04d765
AM
10050 else if (htab->can_convert_all_inline_plt
10051 || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
2d7ad24e
AM
10052 ent->plt.offset = (bfd_vma) -1;
10053 else
10054 {
10055 s = htab->pltlocal;
10056 ent->plt.offset = s->size;
10057 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
10058 if (bfd_link_pic (info))
10059 htab->relpltlocal->size += sizeof (Elf64_External_Rela);
10060 }
e054468f
AM
10061 }
10062 else
10063 ent->plt.offset = (bfd_vma) -1;
10064 }
65f38f15
AM
10065 }
10066
10067 /* Allocate global sym .plt and .got entries, and space for global
10068 sym dynamic relocs. */
4ce794b7 10069 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
a345bc8d 10070
0e1862bb 10071 if (!htab->opd_abi && !bfd_link_pic (info))
a345bc8d 10072 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
65f38f15 10073
7865406b 10074 first_tlsld = NULL;
c72f2fb2 10075 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
102890f0 10076 {
7865406b
AM
10077 struct got_entry *ent;
10078
0c8d6e5c 10079 if (!is_ppc64_elf (ibfd))
102890f0
AM
10080 continue;
10081
7865406b
AM
10082 ent = ppc64_tlsld_got (ibfd);
10083 if (ent->got.refcount > 0)
102890f0 10084 {
7865406b 10085 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 10086 {
7865406b
AM
10087 ent->is_indirect = TRUE;
10088 ent->got.ent = first_tlsld;
10089 }
10090 else
10091 {
10092 if (first_tlsld == NULL)
10093 first_tlsld = ent;
10094 s = ppc64_elf_tdata (ibfd)->got;
10095 ent->got.offset = s->size;
10096 ent->owner = ibfd;
10097 s->size += 16;
f749f26e 10098 if (bfd_link_dll (info))
7865406b
AM
10099 {
10100 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10101 srel->size += sizeof (Elf64_External_Rela);
10102 }
102890f0
AM
10103 }
10104 }
10105 else
7865406b 10106 ent->got.offset = (bfd_vma) -1;
102890f0
AM
10107 }
10108
65f38f15
AM
10109 /* We now have determined the sizes of the various dynamic sections.
10110 Allocate memory for them. */
b34976b6 10111 relocs = FALSE;
65f38f15
AM
10112 for (s = dynobj->sections; s != NULL; s = s->next)
10113 {
10114 if ((s->flags & SEC_LINKER_CREATED) == 0)
10115 continue;
10116
4ce794b7 10117 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
10118 /* These haven't been allocated yet; don't strip. */
10119 continue;
33e44f2e
AM
10120 else if (s == htab->elf.sgot
10121 || s == htab->elf.splt
10122 || s == htab->elf.iplt
2d7ad24e 10123 || s == htab->pltlocal
c456f082 10124 || s == htab->glink
9e390558 10125 || s == htab->global_entry
5474d94f
AM
10126 || s == htab->elf.sdynbss
10127 || s == htab->elf.sdynrelro)
65f38f15
AM
10128 {
10129 /* Strip this section if we don't need it; see the
10130 comment below. */
5bd4f169 10131 }
58d180e8
AM
10132 else if (s == htab->glink_eh_frame)
10133 {
10134 if (!bfd_is_abs_section (s->output_section))
10135 /* Not sized yet. */
10136 continue;
10137 }
70cc837d 10138 else if (CONST_STRNEQ (s->name, ".rela"))
5bd4f169 10139 {
c456f082 10140 if (s->size != 0)
5bd4f169 10141 {
33e44f2e 10142 if (s != htab->elf.srelplt)
b34976b6 10143 relocs = TRUE;
5bd4f169
AM
10144
10145 /* We use the reloc_count field as a counter if we need
10146 to copy relocs into the output file. */
10147 s->reloc_count = 0;
10148 }
10149 }
65f38f15 10150 else
5bd4f169
AM
10151 {
10152 /* It's not one of our sections, so don't allocate space. */
10153 continue;
10154 }
10155
eea6121a 10156 if (s->size == 0)
5bd4f169 10157 {
c456f082
AM
10158 /* If we don't need this section, strip it from the
10159 output file. This is mostly to handle .rela.bss and
10160 .rela.plt. We must create both sections in
10161 create_dynamic_sections, because they must be created
10162 before the linker maps input sections to output
10163 sections. The linker does that before
10164 adjust_dynamic_symbol is called, and it is that
10165 function which decides whether anything needs to go
10166 into these sections. */
8423293d 10167 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
10168 continue;
10169 }
10170
06bcf541
AM
10171 if (bfd_is_abs_section (s->output_section))
10172 _bfd_error_handler (_("warning: discarding dynamic section %s"),
10173 s->name);
10174
c456f082 10175 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
10176 continue;
10177
65f38f15
AM
10178 /* Allocate memory for the section contents. We use bfd_zalloc
10179 here in case unused entries are not reclaimed before the
10180 section's contents are written out. This should not happen,
411e1bfb
AM
10181 but this way if it does we get a R_PPC64_NONE reloc in .rela
10182 sections instead of garbage.
10183 We also rely on the section contents being zero when writing
5474d94f 10184 the GOT and .dynrelro. */
eea6121a 10185 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 10186 if (s->contents == NULL)
b34976b6 10187 return FALSE;
5bd4f169
AM
10188 }
10189
c72f2fb2 10190 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
e717da7e 10191 {
0c8d6e5c 10192 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
10193 continue;
10194
e717da7e 10195 s = ppc64_elf_tdata (ibfd)->got;
33e44f2e 10196 if (s != NULL && s != htab->elf.sgot)
e717da7e 10197 {
eea6121a 10198 if (s->size == 0)
8423293d 10199 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10200 else
10201 {
eea6121a 10202 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10203 if (s->contents == NULL)
10204 return FALSE;
10205 }
10206 }
10207 s = ppc64_elf_tdata (ibfd)->relgot;
10208 if (s != NULL)
10209 {
eea6121a 10210 if (s->size == 0)
8423293d 10211 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10212 else
10213 {
eea6121a 10214 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10215 if (s->contents == NULL)
10216 return FALSE;
10217 relocs = TRUE;
10218 s->reloc_count = 0;
10219 }
10220 }
10221 }
10222
e86ce104 10223 if (htab->elf.dynamic_sections_created)
5bd4f169 10224 {
e8910a83
AM
10225 bfd_boolean tls_opt;
10226
5bd4f169
AM
10227 /* Add some entries to the .dynamic section. We fill in the
10228 values later, in ppc64_elf_finish_dynamic_sections, but we
10229 must add the entries now so that we get the correct size for
10230 the .dynamic section. The DT_DEBUG entry is filled in by the
10231 dynamic linker and used by the debugger. */
dc810e39 10232#define add_dynamic_entry(TAG, VAL) \
5a580b3a 10233 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 10234
0e1862bb 10235 if (bfd_link_executable (info))
5bd4f169 10236 {
dc810e39 10237 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 10238 return FALSE;
5bd4f169
AM
10239 }
10240
33e44f2e 10241 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5bd4f169 10242 {
dc810e39
AM
10243 if (!add_dynamic_entry (DT_PLTGOT, 0)
10244 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10245 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
10246 || !add_dynamic_entry (DT_JMPREL, 0)
10247 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 10248 return FALSE;
5bd4f169
AM
10249 }
10250
ee67d69a 10251 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
10252 {
10253 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10254 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 10255 return FALSE;
19397422
AM
10256 }
10257
7c9cf415 10258 tls_opt = (htab->params->tls_get_addr_opt
9e7028aa
AM
10259 && ((htab->tls_get_addr_fd != NULL
10260 && htab->tls_get_addr_fd->elf.plt.plist != NULL)
10261 || (htab->tga_desc_fd != NULL
10262 && htab->tga_desc_fd->elf.plt.plist != NULL)));
e8910a83
AM
10263 if (tls_opt || !htab->opd_abi)
10264 {
10265 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10266 return FALSE;
10267 }
a7f2871e 10268
5bd4f169
AM
10269 if (relocs)
10270 {
dc810e39
AM
10271 if (!add_dynamic_entry (DT_RELA, 0)
10272 || !add_dynamic_entry (DT_RELASZ, 0)
10273 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 10274 return FALSE;
5bd4f169 10275
65f38f15
AM
10276 /* If any dynamic relocs apply to a read-only section,
10277 then we need a DT_TEXTREL entry. */
248866a8 10278 if ((info->flags & DF_TEXTREL) == 0)
a345bc8d 10279 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
5bd4f169 10280
65f38f15 10281 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 10282 {
65f38f15 10283 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 10284 return FALSE;
5bd4f169 10285 }
5bd4f169 10286 }
5bd4f169 10287 }
65f38f15 10288#undef add_dynamic_entry
5bd4f169 10289
b34976b6 10290 return TRUE;
5bd4f169
AM
10291}
10292
a345bc8d
AM
10293/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10294
10295static bfd_boolean
10296ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10297{
10298 if (h->plt.plist != NULL
10299 && !h->def_regular
10300 && !h->pointer_equality_needed)
10301 return FALSE;
10302
10303 return _bfd_elf_hash_symbol (h);
10304}
10305
721956f4 10306/* Determine the type of stub needed, if any, for a call. */
5bd4f169 10307
4ce794b7
AM
10308static inline enum ppc_stub_type
10309ppc_type_of_stub (asection *input_sec,
10310 const Elf_Internal_Rela *rel,
10311 struct ppc_link_hash_entry **hash,
e054468f 10312 struct plt_entry **plt_ent,
6911b7dc
AM
10313 bfd_vma destination,
10314 unsigned long local_off)
5bd4f169 10315{
721956f4
AM
10316 struct ppc_link_hash_entry *h = *hash;
10317 bfd_vma location;
10318 bfd_vma branch_offset;
10319 bfd_vma max_branch_offset;
4ce794b7 10320 enum elf_ppc64_reloc_type r_type;
5bd4f169 10321
721956f4
AM
10322 if (h != NULL)
10323 {
e054468f 10324 struct plt_entry *ent;
7fe2b9a6 10325 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
10326 if (h->oh != NULL
10327 && h->oh->is_func_descriptor)
7b8f6675
AM
10328 {
10329 fdh = ppc_follow_link (h->oh);
10330 *hash = fdh;
10331 }
8387904d 10332
e054468f
AM
10333 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10334 if (ent->addend == rel->r_addend
10335 && ent->plt.offset != (bfd_vma) -1)
10336 {
e054468f
AM
10337 *plt_ent = ent;
10338 return ppc_stub_plt_call;
10339 }
5bd4f169 10340
7fe2b9a6
AM
10341 /* Here, we know we don't have a plt entry. If we don't have a
10342 either a defined function descriptor or a defined entry symbol
10343 in a regular object file, then it is pointless trying to make
10344 any other type of stub. */
854b41e7
AM
10345 if (!is_static_defined (&fdh->elf)
10346 && !is_static_defined (&h->elf))
721956f4 10347 return ppc_stub_none;
5d1634d7 10348 }
e054468f
AM
10349 else if (elf_local_got_ents (input_sec->owner) != NULL)
10350 {
10351 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10352 struct plt_entry **local_plt = (struct plt_entry **)
10353 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10354 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10355
10356 if (local_plt[r_symndx] != NULL)
10357 {
10358 struct plt_entry *ent;
10359
10360 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10361 if (ent->addend == rel->r_addend
10362 && ent->plt.offset != (bfd_vma) -1)
10363 {
10364 *plt_ent = ent;
10365 return ppc_stub_plt_call;
10366 }
10367 }
10368 }
5d1634d7 10369
721956f4
AM
10370 /* Determine where the call point is. */
10371 location = (input_sec->output_offset
10372 + input_sec->output_section->vma
10373 + rel->r_offset);
5d1634d7 10374
721956f4
AM
10375 branch_offset = destination - location;
10376 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 10377
721956f4
AM
10378 /* Determine if a long branch stub is needed. */
10379 max_branch_offset = 1 << 25;
23cedd1d
AM
10380 if (r_type == R_PPC64_REL14
10381 || r_type == R_PPC64_REL14_BRTAKEN
10382 || r_type == R_PPC64_REL14_BRNTAKEN)
721956f4 10383 max_branch_offset = 1 << 15;
5d1634d7 10384
6911b7dc 10385 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
721956f4
AM
10386 /* We need a stub. Figure out whether a long_branch or plt_branch
10387 is needed later. */
10388 return ppc_stub_long_branch;
5d1634d7 10389
721956f4 10390 return ppc_stub_none;
5d1634d7
AM
10391}
10392
f891966f
AM
10393/* Gets the address of a label (1:) in r11 and builds an offset in r12,
10394 then adds it to r11 (LOAD false) or loads r12 from r11+r12 (LOAD true).
10395 . mflr %r12
10396 . bcl 20,31,1f
10397 .1: mflr %r11
10398 . mtlr %r12
05d0e962 10399 . lis %r12,xxx-1b@highest
f891966f 10400 . ori %r12,%r12,xxx-1b@higher
05d0e962 10401 . sldi %r12,%r12,32
f891966f 10402 . oris %r12,%r12,xxx-1b@high
05d0e962 10403 . ori %r12,%r12,xxx-1b@l
f891966f 10404 . add/ldx %r12,%r11,%r12 */
05d0e962
AM
10405
10406static bfd_byte *
10407build_offset (bfd *abfd, bfd_byte *p, bfd_vma off, bfd_boolean load)
10408{
f891966f
AM
10409 bfd_put_32 (abfd, MFLR_R12, p);
10410 p += 4;
10411 bfd_put_32 (abfd, BCL_20_31, p);
10412 p += 4;
10413 bfd_put_32 (abfd, MFLR_R11, p);
10414 p += 4;
10415 bfd_put_32 (abfd, MTLR_R12, p);
10416 p += 4;
05d0e962
AM
10417 if (off + 0x8000 < 0x10000)
10418 {
10419 if (load)
10420 bfd_put_32 (abfd, LD_R12_0R11 + PPC_LO (off), p);
10421 else
10422 bfd_put_32 (abfd, ADDI_R12_R11 + PPC_LO (off), p);
10423 p += 4;
10424 }
10425 else if (off + 0x80008000ULL < 0x100000000ULL)
10426 {
10427 bfd_put_32 (abfd, ADDIS_R12_R11 + PPC_HA (off), p);
10428 p += 4;
10429 if (load)
10430 bfd_put_32 (abfd, LD_R12_0R12 + PPC_LO (off), p);
10431 else
10432 bfd_put_32 (abfd, ADDI_R12_R12 + PPC_LO (off), p);
10433 p += 4;
10434 }
10435 else
10436 {
10437 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10438 {
10439 bfd_put_32 (abfd, LI_R12_0 + ((off >> 32) & 0xffff), p);
10440 p += 4;
10441 }
10442 else
10443 {
10444 bfd_put_32 (abfd, LIS_R12 + ((off >> 48) & 0xffff), p);
10445 p += 4;
10446 if (((off >> 32) & 0xffff) != 0)
10447 {
10448 bfd_put_32 (abfd, ORI_R12_R12_0 + ((off >> 32) & 0xffff), p);
10449 p += 4;
10450 }
10451 }
10452 if (((off >> 32) & 0xffffffffULL) != 0)
10453 {
10454 bfd_put_32 (abfd, SLDI_R12_R12_32, p);
10455 p += 4;
10456 }
10457 if (PPC_HI (off) != 0)
10458 {
10459 bfd_put_32 (abfd, ORIS_R12_R12_0 + PPC_HI (off), p);
10460 p += 4;
10461 }
10462 if (PPC_LO (off) != 0)
10463 {
10464 bfd_put_32 (abfd, ORI_R12_R12_0 + PPC_LO (off), p);
10465 p += 4;
10466 }
10467 if (load)
10468 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10469 else
10470 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10471 p += 4;
10472 }
10473 return p;
10474}
10475
10476static unsigned int
10477size_offset (bfd_vma off)
10478{
10479 unsigned int size;
10480 if (off + 0x8000 < 0x10000)
10481 size = 4;
10482 else if (off + 0x80008000ULL < 0x100000000ULL)
10483 size = 8;
10484 else
10485 {
10486 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10487 size = 4;
10488 else
10489 {
10490 size = 4;
10491 if (((off >> 32) & 0xffff) != 0)
10492 size += 4;
10493 }
10494 if (((off >> 32) & 0xffffffffULL) != 0)
10495 size += 4;
10496 if (PPC_HI (off) != 0)
10497 size += 4;
10498 if (PPC_LO (off) != 0)
10499 size += 4;
10500 size += 4;
10501 }
f891966f 10502 return size + 16;
05d0e962
AM
10503}
10504
3d58e1fc
AM
10505static unsigned int
10506num_relocs_for_offset (bfd_vma off)
10507{
10508 unsigned int num_rel;
10509 if (off + 0x8000 < 0x10000)
10510 num_rel = 1;
10511 else if (off + 0x80008000ULL < 0x100000000ULL)
10512 num_rel = 2;
10513 else
10514 {
10515 num_rel = 1;
10516 if (off + 0x800000000000ULL >= 0x1000000000000ULL
10517 && ((off >> 32) & 0xffff) != 0)
10518 num_rel += 1;
10519 if (PPC_HI (off) != 0)
10520 num_rel += 1;
10521 if (PPC_LO (off) != 0)
10522 num_rel += 1;
10523 }
10524 return num_rel;
10525}
10526
10527static Elf_Internal_Rela *
10528emit_relocs_for_offset (struct bfd_link_info *info, Elf_Internal_Rela *r,
10529 bfd_vma roff, bfd_vma targ, bfd_vma off)
10530{
10531 bfd_vma relative_targ = targ - (roff - 8);
10532 if (bfd_big_endian (info->output_bfd))
10533 roff += 2;
10534 r->r_offset = roff;
10535 r->r_addend = relative_targ + roff;
10536 if (off + 0x8000 < 0x10000)
10537 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16);
10538 else if (off + 0x80008000ULL < 0x100000000ULL)
10539 {
10540 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HA);
10541 ++r;
10542 roff += 4;
10543 r->r_offset = roff;
10544 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10545 r->r_addend = relative_targ + roff;
10546 }
10547 else
10548 {
10549 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10550 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10551 else
10552 {
10553 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHEST);
10554 if (((off >> 32) & 0xffff) != 0)
10555 {
10556 ++r;
10557 roff += 4;
10558 r->r_offset = roff;
10559 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10560 r->r_addend = relative_targ + roff;
10561 }
10562 }
10563 if (((off >> 32) & 0xffffffffULL) != 0)
10564 roff += 4;
10565 if (PPC_HI (off) != 0)
10566 {
10567 ++r;
10568 roff += 4;
10569 r->r_offset = roff;
10570 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGH);
10571 r->r_addend = relative_targ + roff;
10572 }
10573 if (PPC_LO (off) != 0)
10574 {
10575 ++r;
10576 roff += 4;
10577 r->r_offset = roff;
10578 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10579 r->r_addend = relative_targ + roff;
10580 }
10581 }
10582 return r;
10583}
10584
04bdff6a
AM
10585static bfd_byte *
10586build_powerxx_offset (bfd *abfd, bfd_byte *p, bfd_vma off, int odd,
10587 bfd_boolean load)
10588{
10589 uint64_t insn;
10590 if (off - odd + (1ULL << 33) < 1ULL << 34)
10591 {
10592 off -= odd;
10593 if (odd)
10594 {
10595 bfd_put_32 (abfd, NOP, p);
10596 p += 4;
10597 }
10598 if (load)
10599 insn = PLD_R12_PC;
10600 else
10601 insn = PADDI_R12_PC;
10602 insn |= D34 (off);
10603 bfd_put_32 (abfd, insn >> 32, p);
10604 p += 4;
10605 bfd_put_32 (abfd, insn, p);
10606 }
10607 /* The minimum value for paddi is -0x200000000. The minimum value
10608 for li is -0x8000, which when shifted by 34 and added gives a
10609 minimum value of -0x2000200000000. The maximum value is
10610 0x1ffffffff+0x7fff<<34 which is 0x2000200000000-1. */
10611 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10612 {
10613 off -= 8 - odd;
10614 bfd_put_32 (abfd, LI_R11_0 | (HA34 (off) & 0xffff), p);
10615 p += 4;
10616 if (!odd)
10617 {
10618 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10619 p += 4;
10620 }
10621 insn = PADDI_R12_PC | D34 (off);
10622 bfd_put_32 (abfd, insn >> 32, p);
10623 p += 4;
10624 bfd_put_32 (abfd, insn, p);
10625 p += 4;
10626 if (odd)
10627 {
10628 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10629 p += 4;
10630 }
10631 if (load)
10632 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10633 else
10634 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10635 }
10636 else
10637 {
10638 off -= odd + 8;
10639 bfd_put_32 (abfd, LIS_R11 | ((HA34 (off) >> 16) & 0x3fff), p);
10640 p += 4;
10641 bfd_put_32 (abfd, ORI_R11_R11_0 | (HA34 (off) & 0xffff), p);
10642 p += 4;
10643 if (odd)
10644 {
10645 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10646 p += 4;
10647 }
10648 insn = PADDI_R12_PC | D34 (off);
10649 bfd_put_32 (abfd, insn >> 32, p);
10650 p += 4;
10651 bfd_put_32 (abfd, insn, p);
10652 p += 4;
10653 if (!odd)
10654 {
10655 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10656 p += 4;
10657 }
10658 if (load)
10659 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10660 else
10661 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10662 }
10663 p += 4;
10664 return p;
10665}
10666
10667static unsigned int
10668size_powerxx_offset (bfd_vma off, int odd)
10669{
10670 if (off - odd + (1ULL << 33) < 1ULL << 34)
10671 return odd + 8;
10672 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10673 return 20;
10674 else
10675 return 24;
10676}
10677
10678static unsigned int
10679num_relocs_for_powerxx_offset (bfd_vma off, int odd)
10680{
10681 if (off - odd + (1ULL << 33) < 1ULL << 34)
10682 return 1;
10683 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10684 return 2;
10685 else
10686 return 3;
10687}
10688
10689static Elf_Internal_Rela *
10690emit_relocs_for_powerxx_offset (struct bfd_link_info *info,
10691 Elf_Internal_Rela *r, bfd_vma roff,
10692 bfd_vma targ, bfd_vma off, int odd)
10693{
10694 if (off - odd + (1ULL << 33) < 1ULL << 34)
10695 roff += odd;
10696 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10697 {
10698 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10699 r->r_offset = roff + d_offset;
10700 r->r_addend = targ + 8 - odd - d_offset;
10701 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10702 ++r;
10703 roff += 8 - odd;
10704 }
10705 else
10706 {
10707 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10708 r->r_offset = roff + d_offset;
10709 r->r_addend = targ + 8 + odd - d_offset;
10710 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHESTA34);
10711 ++r;
10712 roff += 4;
10713 r->r_offset = roff + d_offset;
10714 r->r_addend = targ + 4 + odd - d_offset;
10715 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10716 ++r;
10717 roff += 4 + odd;
10718 }
10719 r->r_offset = roff;
10720 r->r_addend = targ;
10721 r->r_info = ELF64_R_INFO (0, R_PPC64_PCREL34);
10722 return r;
10723}
10724
df136d64
AM
10725/* Emit .eh_frame opcode to advance pc by DELTA. */
10726
10727static bfd_byte *
10728eh_advance (bfd *abfd, bfd_byte *eh, unsigned int delta)
10729{
10730 delta /= 4;
10731 if (delta < 64)
10732 *eh++ = DW_CFA_advance_loc + delta;
10733 else if (delta < 256)
10734 {
10735 *eh++ = DW_CFA_advance_loc1;
10736 *eh++ = delta;
10737 }
10738 else if (delta < 65536)
10739 {
10740 *eh++ = DW_CFA_advance_loc2;
10741 bfd_put_16 (abfd, delta, eh);
10742 eh += 2;
10743 }
10744 else
10745 {
10746 *eh++ = DW_CFA_advance_loc4;
10747 bfd_put_32 (abfd, delta, eh);
10748 eh += 4;
10749 }
10750 return eh;
10751}
10752
10753/* Size of required .eh_frame opcode to advance pc by DELTA. */
10754
10755static unsigned int
10756eh_advance_size (unsigned int delta)
10757{
10758 if (delta < 64 * 4)
10759 /* DW_CFA_advance_loc+[1..63]. */
10760 return 1;
10761 if (delta < 256 * 4)
10762 /* DW_CFA_advance_loc1, byte. */
10763 return 2;
10764 if (delta < 65536 * 4)
10765 /* DW_CFA_advance_loc2, 2 bytes. */
10766 return 3;
10767 /* DW_CFA_advance_loc4, 4 bytes. */
10768 return 5;
10769}
10770
794e51c0
AM
10771/* With power7 weakly ordered memory model, it is possible for ld.so
10772 to update a plt entry in one thread and have another thread see a
10773 stale zero toc entry. To avoid this we need some sort of acquire
10774 barrier in the call stub. One solution is to make the load of the
10775 toc word seem to appear to depend on the load of the function entry
10776 word. Another solution is to test for r2 being zero, and branch to
10777 the appropriate glink entry if so.
10778
10779 . fake dep barrier compare
71a39c98
AM
10780 . ld 12,xxx(2) ld 12,xxx(2)
10781 . mtctr 12 mtctr 12
10782 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
10783 . add 2,2,11 cmpldi 2,0
10784 . ld 2,xxx+8(2) bnectr+
10785 . bctr b <glink_entry>
10786
10787 The solution involving the compare turns out to be faster, so
10788 that's what we use unless the branch won't reach. */
10789
10790#define ALWAYS_USE_FAKE_DEP 0
10791#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 10792
794e51c0
AM
10793static inline unsigned int
10794plt_stub_size (struct ppc_link_hash_table *htab,
10795 struct ppc_stub_hash_entry *stub_entry,
10796 bfd_vma off)
10797{
05d0e962 10798 unsigned size;
b9e5796b 10799
05d0e962
AM
10800 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
10801 {
04bdff6a
AM
10802 if (htab->powerxx_stubs)
10803 {
10804 bfd_vma start = (stub_entry->stub_offset
10805 + stub_entry->group->stub_sec->output_offset
10806 + stub_entry->group->stub_sec->output_section->vma);
10807 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10808 start += 4;
10809 size = 8 + size_powerxx_offset (off, start & 4);
10810 }
10811 else
10812 size = 8 + size_offset (off - 8);
05d0e962
AM
10813 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10814 size += 4;
10815 return size;
10816 }
10817
10818 size = 12;
b9e5796b
AM
10819 if (ALWAYS_EMIT_R2SAVE
10820 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10821 size += 4;
10822 if (PPC_HA (off) != 0)
794e51c0 10823 size += 4;
b9e5796b
AM
10824 if (htab->opd_abi)
10825 {
10826 size += 4;
e7d1c40c 10827 if (htab->params->plt_static_chain)
b9e5796b 10828 size += 4;
bd4d2eaa
AM
10829 if (htab->params->plt_thread_safe
10830 && htab->elf.dynamic_sections_created
10831 && stub_entry->h != NULL
10832 && stub_entry->h->elf.dynindx != -1)
b9e5796b 10833 size += 8;
e7d1c40c 10834 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
b9e5796b
AM
10835 size += 4;
10836 }
794e51c0 10837 if (stub_entry->h != NULL
ed7007c1 10838 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 10839 && htab->params->tls_get_addr_opt)
f378ab09 10840 {
9e7028aa
AM
10841 if (htab->params->no_tls_get_addr_regsave)
10842 {
10843 size += 7 * 4;
10844 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
10845 size += 6 * 4;
10846 }
10847 else
10848 {
10849 size += 30 * 4;
10850 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
10851 size += 4;
10852 }
f378ab09 10853 }
794e51c0
AM
10854 return size;
10855}
10856
2420fff6
AM
10857/* Depending on the sign of plt_stub_align:
10858 If positive, return the padding to align to a 2**plt_stub_align
10859 boundary.
10860 If negative, if this stub would cross fewer 2**plt_stub_align
10861 boundaries if we align, then return the padding needed to do so. */
10862
794e51c0
AM
10863static inline unsigned int
10864plt_stub_pad (struct ppc_link_hash_table *htab,
10865 struct ppc_stub_hash_entry *stub_entry,
10866 bfd_vma plt_off)
10867{
2420fff6 10868 int stub_align;
1aa42141 10869 unsigned stub_size;
6f20ed8a 10870 bfd_vma stub_off = stub_entry->group->stub_sec->size;
794e51c0 10871
2420fff6
AM
10872 if (htab->params->plt_stub_align >= 0)
10873 {
10874 stub_align = 1 << htab->params->plt_stub_align;
10875 if ((stub_off & (stub_align - 1)) != 0)
10876 return stub_align - (stub_off & (stub_align - 1));
10877 return 0;
10878 }
10879
10880 stub_align = 1 << -htab->params->plt_stub_align;
1aa42141 10881 stub_size = plt_stub_size (htab, stub_entry, plt_off);
794e51c0 10882 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
e05fa0ba 10883 > ((stub_size - 1) & -stub_align))
794e51c0
AM
10884 return stub_align - (stub_off & (stub_align - 1));
10885 return 0;
10886}
10887
10888/* Build a .plt call stub. */
10889
10890static inline bfd_byte *
10891build_plt_stub (struct ppc_link_hash_table *htab,
10892 struct ppc_stub_hash_entry *stub_entry,
10893 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10894{
e7d1c40c 10895 bfd *obfd = htab->params->stub_bfd;
b9e5796b 10896 bfd_boolean plt_load_toc = htab->opd_abi;
e7d1c40c 10897 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
bd4d2eaa
AM
10898 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10899 && htab->elf.dynamic_sections_created
10900 && stub_entry->h != NULL
10901 && stub_entry->h->elf.dynindx != -1);
794e51c0
AM
10902 bfd_boolean use_fake_dep = plt_thread_safe;
10903 bfd_vma cmp_branch_off = 0;
10904
10905 if (!ALWAYS_USE_FAKE_DEP
b9e5796b 10906 && plt_load_toc
794e51c0 10907 && plt_thread_safe
ed7007c1 10908 && !(is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 10909 && htab->params->tls_get_addr_opt))
794e51c0
AM
10910 {
10911 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
b9e5796b
AM
10912 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10913 / PLT_ENTRY_SIZE (htab));
9e390558 10914 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8;
794e51c0
AM
10915 bfd_vma to, from;
10916
68d62958
AM
10917 if (pltindex > 32768)
10918 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
10919 to = (glinkoff
10920 + htab->glink->output_offset
10921 + htab->glink->output_section->vma);
6f20ed8a 10922 from = (p - stub_entry->group->stub_sec->contents
794e51c0
AM
10923 + 4 * (ALWAYS_EMIT_R2SAVE
10924 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10925 + 4 * (PPC_HA (offset) != 0)
10926 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10927 != PPC_HA (offset))
10928 + 4 * (plt_static_chain != 0)
10929 + 20
6f20ed8a
AM
10930 + stub_entry->group->stub_sec->output_offset
10931 + stub_entry->group->stub_sec->output_section->vma);
794e51c0
AM
10932 cmp_branch_off = to - from;
10933 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10934 }
10935
ac2df442
AM
10936 if (PPC_HA (offset) != 0)
10937 {
176a0d42
AM
10938 if (r != NULL)
10939 {
794e51c0
AM
10940 if (ALWAYS_EMIT_R2SAVE
10941 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10942 r[0].r_offset += 4;
176a0d42 10943 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 10944 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
10945 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10946 r[1].r_addend = r[0].r_addend;
b9e5796b 10947 if (plt_load_toc)
176a0d42 10948 {
b9e5796b 10949 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10950 {
b9e5796b
AM
10951 r[2].r_offset = r[1].r_offset + 4;
10952 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10953 r[2].r_addend = r[0].r_addend;
10954 }
10955 else
10956 {
10957 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10958 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10959 r[2].r_addend = r[0].r_addend + 8;
10960 if (plt_static_chain)
10961 {
10962 r[3].r_offset = r[2].r_offset + 4;
10963 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10964 r[3].r_addend = r[0].r_addend + 16;
10965 }
c7131b65 10966 }
176a0d42
AM
10967 }
10968 }
794e51c0
AM
10969 if (ALWAYS_EMIT_R2SAVE
10970 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10971 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
397998fc
AM
10972 if (plt_load_toc)
10973 {
10974 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10975 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10976 }
10977 else
10978 {
10979 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10980 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10981 }
b9e5796b
AM
10982 if (plt_load_toc
10983 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 10984 {
71a39c98 10985 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
10986 offset = 0;
10987 }
71a39c98 10988 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10989 if (plt_load_toc)
794e51c0 10990 {
b9e5796b
AM
10991 if (use_fake_dep)
10992 {
10993 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10994 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10995 }
10996 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10997 if (plt_static_chain)
10998 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
794e51c0 10999 }
ac2df442
AM
11000 }
11001 else
11002 {
176a0d42
AM
11003 if (r != NULL)
11004 {
794e51c0
AM
11005 if (ALWAYS_EMIT_R2SAVE
11006 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
11007 r[0].r_offset += 4;
176a0d42 11008 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
b9e5796b 11009 if (plt_load_toc)
176a0d42 11010 {
b9e5796b 11011 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 11012 {
b9e5796b
AM
11013 r[1].r_offset = r[0].r_offset + 4;
11014 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
11015 r[1].r_addend = r[0].r_addend;
11016 }
11017 else
11018 {
11019 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
11020 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
11021 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
11022 if (plt_static_chain)
11023 {
11024 r[2].r_offset = r[1].r_offset + 4;
11025 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
11026 r[2].r_addend = r[0].r_addend + 8;
11027 }
c7131b65 11028 }
176a0d42
AM
11029 }
11030 }
794e51c0
AM
11031 if (ALWAYS_EMIT_R2SAVE
11032 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 11033 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
71a39c98 11034 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
b9e5796b
AM
11035 if (plt_load_toc
11036 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
11037 {
11038 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
11039 offset = 0;
11040 }
71a39c98 11041 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 11042 if (plt_load_toc)
794e51c0 11043 {
b9e5796b
AM
11044 if (use_fake_dep)
11045 {
11046 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
11047 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
11048 }
11049 if (plt_static_chain)
11050 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
11051 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
794e51c0 11052 }
ac2df442 11053 }
b9e5796b 11054 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
794e51c0
AM
11055 {
11056 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
11057 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 11058 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
11059 }
11060 else
407aa07c 11061 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
11062 return p;
11063}
11064
a7f2871e
AM
11065/* Build a special .plt call stub for __tls_get_addr. */
11066
b9ca1af6 11067#define LD_R0_0R3 0xe8030000
a7f2871e
AM
11068#define LD_R12_0R3 0xe9830000
11069#define MR_R0_R3 0x7c601b78
b9ca1af6 11070#define CMPDI_R0_0 0x2c200000
a7f2871e
AM
11071#define ADD_R3_R12_R13 0x7c6c6a14
11072#define BEQLR 0x4d820020
11073#define MR_R3_R0 0x7c030378
a7f2871e 11074#define BCTRL 0x4e800421
a7f2871e
AM
11075
11076static inline bfd_byte *
794e51c0
AM
11077build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
11078 struct ppc_stub_hash_entry *stub_entry,
11079 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 11080{
e7d1c40c 11081 bfd *obfd = htab->params->stub_bfd;
df136d64 11082 bfd_byte *loc = p;
9e7028aa 11083 unsigned int i;
794e51c0 11084
b9ca1af6 11085 bfd_put_32 (obfd, LD_R0_0R3 + 0, p), p += 4;
a7f2871e 11086 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
b9ca1af6 11087 bfd_put_32 (obfd, CMPDI_R0_0, p), p += 4;
a7f2871e 11088 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
a7f2871e
AM
11089 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
11090 bfd_put_32 (obfd, BEQLR, p), p += 4;
11091 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
9e7028aa
AM
11092 if (htab->params->no_tls_get_addr_regsave)
11093 {
11094 if (r != NULL)
11095 r[0].r_offset += 7 * 4;
11096 if (stub_entry->stub_type != ppc_stub_plt_call_r2save)
11097 return build_plt_stub (htab, stub_entry, p, offset, r);
11098
11099 bfd_put_32 (obfd, MFLR_R0, p);
11100 p += 4;
11101 bfd_put_32 (obfd, STD_R0_0R1 + STK_LINKER (htab), p);
11102 p += 4;
11103
11104 if (r != NULL)
11105 r[0].r_offset += 2 * 4;
11106 p = build_plt_stub (htab, stub_entry, p, offset, r);
11107 bfd_put_32 (obfd, BCTRL, p - 4);
11108
11109 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p);
11110 p += 4;
11111 bfd_put_32 (obfd, LD_R0_0R1 + STK_LINKER (htab), p);
11112 p += 4;
11113 bfd_put_32 (obfd, MTLR_R0, p);
11114 p += 4;
11115 bfd_put_32 (obfd, BLR, p);
11116 p += 4;
11117 }
11118 else
11119 {
11120 p = tls_get_addr_prologue (obfd, p, htab);
f378ab09 11121
9e7028aa
AM
11122 if (r != NULL)
11123 r[0].r_offset += 18 * 4;
a7f2871e 11124
9e7028aa
AM
11125 p = build_plt_stub (htab, stub_entry, p, offset, r);
11126 bfd_put_32 (obfd, BCTRL, p - 4);
11127
11128 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
11129 {
11130 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p);
11131 p += 4;
11132 }
a7f2871e 11133
9e7028aa
AM
11134 p = tls_get_addr_epilogue (obfd, p, htab);
11135 }
a7f2871e 11136
df136d64
AM
11137 if (htab->glink_eh_frame != NULL
11138 && htab->glink_eh_frame->size != 0)
11139 {
11140 bfd_byte *base, *eh;
df136d64
AM
11141
11142 base = htab->glink_eh_frame->contents + stub_entry->group->eh_base + 17;
11143 eh = base + stub_entry->group->eh_size;
9e7028aa
AM
11144 if (htab->params->no_tls_get_addr_regsave)
11145 {
11146 unsigned int lr_used, delta;
11147 lr_used = stub_entry->stub_offset + (p - 20 - loc);
11148 delta = lr_used - stub_entry->group->lr_restore;
11149 stub_entry->group->lr_restore = lr_used + 16;
11150 eh = eh_advance (htab->elf.dynobj, eh, delta);
11151 *eh++ = DW_CFA_offset_extended_sf;
11152 *eh++ = 65;
11153 *eh++ = -(STK_LINKER (htab) / 8) & 0x7f;
11154 *eh++ = DW_CFA_advance_loc + 4;
11155 }
11156 else
11157 {
11158 unsigned int cfa_updt, delta;
11159 /* After the bctrl, lr has been modified so we need to emit
11160 .eh_frame info saying the return address is on the stack. In
11161 fact we must put the EH info at or before the call rather
11162 than after it, because the EH info for a call needs to be
11163 specified by that point.
11164 See libgcc/unwind-dw2.c execute_cfa_program.
11165 Any stack pointer update must be described immediately after
11166 the instruction making the change, and since the stdu occurs
11167 after saving regs we put all the reg saves and the cfa
11168 change there. */
11169 cfa_updt = stub_entry->stub_offset + 18 * 4;
11170 delta = cfa_updt - stub_entry->group->lr_restore;
11171 stub_entry->group->lr_restore
11172 = stub_entry->stub_offset + (p - loc) - 4;
11173 eh = eh_advance (htab->elf.dynobj, eh, delta);
11174 *eh++ = DW_CFA_def_cfa_offset;
11175 if (htab->opd_abi)
11176 {
11177 *eh++ = 128;
11178 *eh++ = 1;
11179 }
11180 else
11181 *eh++ = 96;
11182 *eh++ = DW_CFA_offset_extended_sf;
11183 *eh++ = 65;
11184 *eh++ = (-16 / 8) & 0x7f;
11185 for (i = 4; i < 12; i++)
11186 {
11187 *eh++ = DW_CFA_offset + i;
11188 *eh++ = (htab->opd_abi ? 13 : 12) - i;
11189 }
11190 *eh++ = (DW_CFA_advance_loc
11191 + (stub_entry->group->lr_restore - 8 - cfa_updt) / 4);
11192 *eh++ = DW_CFA_def_cfa_offset;
11193 *eh++ = 0;
11194 for (i = 4; i < 12; i++)
11195 *eh++ = DW_CFA_restore + i;
11196 *eh++ = DW_CFA_advance_loc + 2;
11197 }
df136d64
AM
11198 *eh++ = DW_CFA_restore_extended;
11199 *eh++ = 65;
11200 stub_entry->group->eh_size = eh - base;
11201 }
a7f2871e
AM
11202 return p;
11203}
11204
176a0d42
AM
11205static Elf_Internal_Rela *
11206get_relocs (asection *sec, int count)
11207{
11208 Elf_Internal_Rela *relocs;
11209 struct bfd_elf_section_data *elfsec_data;
11210
11211 elfsec_data = elf_section_data (sec);
11212 relocs = elfsec_data->relocs;
11213 if (relocs == NULL)
11214 {
11215 bfd_size_type relsize;
11216 relsize = sec->reloc_count * sizeof (*relocs);
11217 relocs = bfd_alloc (sec->owner, relsize);
11218 if (relocs == NULL)
11219 return NULL;
11220 elfsec_data->relocs = relocs;
d4730f92
BS
11221 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
11222 sizeof (Elf_Internal_Shdr));
11223 if (elfsec_data->rela.hdr == NULL)
11224 return NULL;
11225 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
11226 * sizeof (Elf64_External_Rela));
11227 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
11228 sec->reloc_count = 0;
11229 }
11230 relocs += sec->reloc_count;
11231 sec->reloc_count += count;
11232 return relocs;
11233}
11234
3d58e1fc
AM
11235/* Convert the relocs R[0] thru R[-NUM_REL+1], which are all no-symbol
11236 forms, to the equivalent relocs against the global symbol given by
11237 STUB_ENTRY->H. */
11238
11239static bfd_boolean
11240use_global_in_relocs (struct ppc_link_hash_table *htab,
11241 struct ppc_stub_hash_entry *stub_entry,
11242 Elf_Internal_Rela *r, unsigned int num_rel)
11243{
11244 struct elf_link_hash_entry **hashes;
11245 unsigned long symndx;
11246 struct ppc_link_hash_entry *h;
11247 bfd_vma symval;
11248
11249 /* Relocs are always against symbols in their own object file. Fake
11250 up global sym hashes for the stub bfd (which has no symbols). */
11251 hashes = elf_sym_hashes (htab->params->stub_bfd);
11252 if (hashes == NULL)
11253 {
11254 bfd_size_type hsize;
11255
11256 /* When called the first time, stub_globals will contain the
11257 total number of symbols seen during stub sizing. After
11258 allocating, stub_globals is used as an index to fill the
11259 hashes array. */
11260 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
11261 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
11262 if (hashes == NULL)
11263 return FALSE;
11264 elf_sym_hashes (htab->params->stub_bfd) = hashes;
11265 htab->stub_globals = 1;
11266 }
11267 symndx = htab->stub_globals++;
11268 h = stub_entry->h;
11269 hashes[symndx] = &h->elf;
11270 if (h->oh != NULL && h->oh->is_func)
11271 h = ppc_follow_link (h->oh);
11272 BFD_ASSERT (h->elf.root.type == bfd_link_hash_defined
11273 || h->elf.root.type == bfd_link_hash_defweak);
ed7007c1 11274 symval = defined_sym_val (&h->elf);
3d58e1fc
AM
11275 while (num_rel-- != 0)
11276 {
11277 r->r_info = ELF64_R_INFO (symndx, ELF64_R_TYPE (r->r_info));
11278 if (h->elf.root.u.def.section != stub_entry->target_section)
11279 {
11280 /* H is an opd symbol. The addend must be zero, and the
11281 branch reloc is the only one we can convert. */
11282 r->r_addend = 0;
11283 break;
11284 }
11285 else
11286 r->r_addend -= symval;
11287 --r;
11288 }
11289 return TRUE;
11290}
11291
aa374f67 11292static bfd_vma
25f53a85 11293get_r2off (struct bfd_link_info *info,
aa374f67
AM
11294 struct ppc_stub_hash_entry *stub_entry)
11295{
25f53a85 11296 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 11297 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
aa374f67
AM
11298
11299 if (r2off == 0)
11300 {
11301 /* Support linking -R objects. Get the toc pointer from the
11302 opd entry. */
11303 char buf[8];
b9e5796b
AM
11304 if (!htab->opd_abi)
11305 return r2off;
aa374f67
AM
11306 asection *opd = stub_entry->h->elf.root.u.def.section;
11307 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
11308
11309 if (strcmp (opd->name, ".opd") != 0
11310 || opd->reloc_count != 0)
11311 {
2cdcc330
AM
11312 info->callbacks->einfo
11313 (_("%P: cannot find opd entry toc for `%pT'\n"),
11314 stub_entry->h->elf.root.root.string);
aa374f67 11315 bfd_set_error (bfd_error_bad_value);
a7c49797 11316 return (bfd_vma) -1;
aa374f67
AM
11317 }
11318 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
a7c49797 11319 return (bfd_vma) -1;
aa374f67 11320 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 11321 r2off -= elf_gp (info->output_bfd);
aa374f67 11322 }
6f20ed8a 11323 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
aa374f67
AM
11324 return r2off;
11325}
11326
b34976b6 11327static bfd_boolean
4ce794b7 11328ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 11329{
721956f4
AM
11330 struct ppc_stub_hash_entry *stub_entry;
11331 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
11332 struct bfd_link_info *info;
11333 struct ppc_link_hash_table *htab;
721956f4 11334 bfd_byte *loc;
3d58e1fc 11335 bfd_byte *p, *relp;
1aa42141 11336 bfd_vma targ, off;
176a0d42 11337 Elf_Internal_Rela *r;
e054468f 11338 asection *plt;
3d58e1fc 11339 int num_rel;
04bdff6a 11340 int odd;
5d1634d7 11341
721956f4
AM
11342 /* Massage our args to the form they really have. */
11343 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 11344 info = in_arg;
5d1634d7 11345
5d1634d7 11346 htab = ppc_hash_table (info);
4dfe6ac6
NC
11347 if (htab == NULL)
11348 return FALSE;
5d1634d7 11349
1aa42141 11350 BFD_ASSERT (stub_entry->stub_offset >= stub_entry->group->stub_sec->size);
6f20ed8a 11351 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
721956f4 11352
4ce794b7 11353 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 11354 switch (stub_entry->stub_type)
5d1634d7 11355 {
721956f4 11356 case ppc_stub_long_branch:
ad8e1ba5 11357 case ppc_stub_long_branch_r2off:
721956f4 11358 /* Branches are relative. This is where we are going to. */
1aa42141 11359 targ = (stub_entry->target_value
6911b7dc
AM
11360 + stub_entry->target_section->output_offset
11361 + stub_entry->target_section->output_section->vma);
1aa42141 11362 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
5d1634d7 11363
721956f4 11364 /* And this is where we are coming from. */
1aa42141
AM
11365 off = (stub_entry->stub_offset
11366 + stub_entry->group->stub_sec->output_offset
11367 + stub_entry->group->stub_sec->output_section->vma);
11368 off = targ - off;
e86ce104 11369
9e390558 11370 p = loc;
ac2df442 11371 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 11372 {
25f53a85 11373 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 11374
a7c49797 11375 if (r2off == (bfd_vma) -1)
aa374f67
AM
11376 {
11377 htab->stub_error = TRUE;
11378 return FALSE;
11379 }
9e390558
AM
11380 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11381 p += 4;
ac2df442
AM
11382 if (PPC_HA (r2off) != 0)
11383 {
e7d1c40c 11384 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11385 ADDIS_R2_R2 | PPC_HA (r2off), p);
11386 p += 4;
a7c49797
AM
11387 }
11388 if (PPC_LO (r2off) != 0)
11389 {
11390 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11391 ADDI_R2_R2 | PPC_LO (r2off), p);
11392 p += 4;
ac2df442 11393 }
9e390558 11394 off -= p - loc;
ad8e1ba5 11395 }
9e390558
AM
11396 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p);
11397 p += 4;
ad8e1ba5 11398
5c3dead3
AM
11399 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11400 {
cf97bcb0
AM
11401 _bfd_error_handler
11402 (_("long branch stub `%s' offset overflow"),
bc30df16 11403 stub_entry->root.string);
5c3dead3
AM
11404 htab->stub_error = TRUE;
11405 return FALSE;
11406 }
ee75fd95
AM
11407
11408 if (info->emitrelocations)
11409 {
6f20ed8a 11410 r = get_relocs (stub_entry->group->stub_sec, 1);
176a0d42
AM
11411 if (r == NULL)
11412 return FALSE;
9e390558 11413 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
ee75fd95 11414 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
1aa42141 11415 r->r_addend = targ;
3d58e1fc
AM
11416 if (stub_entry->h != NULL
11417 && !use_global_in_relocs (htab, stub_entry, r, 1))
11418 return FALSE;
ee75fd95 11419 }
721956f4 11420 break;
e86ce104 11421
721956f4 11422 case ppc_stub_plt_branch:
ad8e1ba5 11423 case ppc_stub_plt_branch_r2off:
721956f4
AM
11424 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11425 stub_entry->root.string + 9,
b34976b6 11426 FALSE, FALSE);
721956f4
AM
11427 if (br_entry == NULL)
11428 {
cf97bcb0
AM
11429 _bfd_error_handler (_("can't find branch stub `%s'"),
11430 stub_entry->root.string);
b34976b6
AM
11431 htab->stub_error = TRUE;
11432 return FALSE;
721956f4
AM
11433 }
11434
1aa42141 11435 targ = (stub_entry->target_value
176a0d42
AM
11436 + stub_entry->target_section->output_offset
11437 + stub_entry->target_section->output_section->vma);
6911b7dc 11438 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
1aa42141 11439 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 11440
1aa42141 11441 bfd_put_64 (htab->brlt->owner, targ,
4ce794b7 11442 htab->brlt->contents + br_entry->offset);
721956f4 11443
f94498ff 11444 if (br_entry->iter == htab->stub_iteration)
721956f4 11445 {
f94498ff 11446 br_entry->iter = 0;
84f5d08e 11447
f94498ff 11448 if (htab->relbrlt != NULL)
84f5d08e 11449 {
f94498ff
AM
11450 /* Create a reloc for the branch lookup table entry. */
11451 Elf_Internal_Rela rela;
11452 bfd_byte *rl;
11453
11454 rela.r_offset = (br_entry->offset
11455 + htab->brlt->output_offset
11456 + htab->brlt->output_section->vma);
11457 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11458 rela.r_addend = targ;
f94498ff
AM
11459
11460 rl = htab->relbrlt->contents;
11461 rl += (htab->relbrlt->reloc_count++
11462 * sizeof (Elf64_External_Rela));
11463 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
11464 }
11465 else if (info->emitrelocations)
11466 {
176a0d42
AM
11467 r = get_relocs (htab->brlt, 1);
11468 if (r == NULL)
11469 return FALSE;
11470 /* brlt, being SEC_LINKER_CREATED does not go through the
11471 normal reloc processing. Symbols and offsets are not
11472 translated from input file to output file form, so
11473 set up the offset per the output file. */
f94498ff
AM
11474 r->r_offset = (br_entry->offset
11475 + htab->brlt->output_offset
11476 + htab->brlt->output_section->vma);
11477 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11478 r->r_addend = targ;
84f5d08e 11479 }
84f5d08e 11480 }
721956f4 11481
1aa42141 11482 targ = (br_entry->offset
176a0d42
AM
11483 + htab->brlt->output_offset
11484 + htab->brlt->output_section->vma);
11485
1aa42141
AM
11486 off = (elf_gp (info->output_bfd)
11487 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11488 off = targ - off;
721956f4 11489
ad8e1ba5 11490 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 11491 {
25f53a85 11492 info->callbacks->einfo
c1c8c1ef 11493 (_("%P: linkage table error against `%pT'\n"),
721956f4 11494 stub_entry->root.string);
5d1634d7 11495 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11496 htab->stub_error = TRUE;
11497 return FALSE;
5d1634d7 11498 }
41bd81ab 11499
176a0d42
AM
11500 if (info->emitrelocations)
11501 {
6f20ed8a 11502 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
176a0d42
AM
11503 if (r == NULL)
11504 return FALSE;
6f20ed8a 11505 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11506 if (bfd_big_endian (info->output_bfd))
11507 r[0].r_offset += 2;
00f412ee 11508 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
176a0d42
AM
11509 r[0].r_offset += 4;
11510 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
1aa42141 11511 r[0].r_addend = targ;
176a0d42
AM
11512 if (PPC_HA (off) != 0)
11513 {
11514 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11515 r[1].r_offset = r[0].r_offset + 4;
11516 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11517 r[1].r_addend = r[0].r_addend;
11518 }
11519 }
11520
9e390558 11521 p = loc;
00f412ee 11522 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ad8e1ba5 11523 {
176a0d42 11524 if (PPC_HA (off) != 0)
ac2df442 11525 {
e7d1c40c 11526 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11527 ADDIS_R12_R2 | PPC_HA (off), p);
11528 p += 4;
e7d1c40c 11529 bfd_put_32 (htab->params->stub_bfd,
9e390558 11530 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11531 }
11532 else
9e390558
AM
11533 bfd_put_32 (htab->params->stub_bfd,
11534 LD_R12_0R2 | PPC_LO (off), p);
ad8e1ba5
AM
11535 }
11536 else
11537 {
25f53a85 11538 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 11539
a7c49797 11540 if (r2off == (bfd_vma) -1)
aa374f67
AM
11541 {
11542 htab->stub_error = TRUE;
11543 return FALSE;
11544 }
ad8e1ba5 11545
9e390558
AM
11546 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11547 p += 4;
176a0d42 11548 if (PPC_HA (off) != 0)
ac2df442 11549 {
e7d1c40c 11550 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11551 ADDIS_R12_R2 | PPC_HA (off), p);
11552 p += 4;
e7d1c40c 11553 bfd_put_32 (htab->params->stub_bfd,
9e390558 11554 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11555 }
11556 else
9e390558 11557 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p);
ac2df442
AM
11558
11559 if (PPC_HA (r2off) != 0)
11560 {
9e390558 11561 p += 4;
e7d1c40c 11562 bfd_put_32 (htab->params->stub_bfd,
9e390558 11563 ADDIS_R2_R2 | PPC_HA (r2off), p);
00f412ee
AM
11564 }
11565 if (PPC_LO (r2off) != 0)
11566 {
9e390558 11567 p += 4;
e7d1c40c 11568 bfd_put_32 (htab->params->stub_bfd,
9e390558 11569 ADDI_R2_R2 | PPC_LO (r2off), p);
ac2df442 11570 }
ad8e1ba5 11571 }
9e390558
AM
11572 p += 4;
11573 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11574 p += 4;
407aa07c
AM
11575 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11576 p += 4;
721956f4 11577 break;
5d1634d7 11578
05d0e962
AM
11579 case ppc_stub_long_branch_notoc:
11580 case ppc_stub_long_branch_both:
11581 case ppc_stub_plt_branch_notoc:
11582 case ppc_stub_plt_branch_both:
11583 case ppc_stub_plt_call_notoc:
11584 case ppc_stub_plt_call_both:
11585 p = loc;
f891966f 11586 off = (stub_entry->stub_offset
05d0e962
AM
11587 + stub_entry->group->stub_sec->output_offset
11588 + stub_entry->group->stub_sec->output_section->vma);
11589 if (stub_entry->stub_type == ppc_stub_long_branch_both
11590 || stub_entry->stub_type == ppc_stub_plt_branch_both
11591 || stub_entry->stub_type == ppc_stub_plt_call_both)
11592 {
11593 off += 4;
11594 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11595 p += 4;
11596 }
11597 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
11598 {
11599 targ = stub_entry->plt_ent->plt.offset & ~1;
11600 if (targ >= (bfd_vma) -2)
11601 abort ();
11602
11603 plt = htab->elf.splt;
11604 if (!htab->elf.dynamic_sections_created
11605 || stub_entry->h == NULL
11606 || stub_entry->h->elf.dynindx == -1)
11607 {
11608 if (stub_entry->symtype == STT_GNU_IFUNC)
11609 plt = htab->elf.iplt;
11610 else
11611 plt = htab->pltlocal;
11612 }
11613 targ += plt->output_offset + plt->output_section->vma;
11614 }
11615 else
11616 targ = (stub_entry->target_value
11617 + stub_entry->target_section->output_offset
11618 + stub_entry->target_section->output_section->vma);
04bdff6a 11619 odd = off & 4;
05d0e962 11620 off = targ - off;
f891966f 11621
3d58e1fc
AM
11622 relp = p;
11623 num_rel = 0;
04bdff6a
AM
11624 if (htab->powerxx_stubs)
11625 {
11626 bfd_boolean load = stub_entry->stub_type >= ppc_stub_plt_call_notoc;
11627 p = build_powerxx_offset (htab->params->stub_bfd, p, off, odd, load);
11628 }
11629 else
11630 {
11631 /* The notoc stubs calculate their target (either a PLT entry or
11632 the global entry point of a function) relative to the PC
11633 returned by the "bcl" two instructions past the start of the
11634 sequence emitted by build_offset. The offset is therefore 8
11635 less than calculated from the start of the sequence. */
11636 off -= 8;
11637 p = build_offset (htab->params->stub_bfd, p, off,
11638 stub_entry->stub_type >= ppc_stub_plt_call_notoc);
11639 }
11640
f891966f 11641 if (stub_entry->stub_type <= ppc_stub_long_branch_both)
05d0e962 11642 {
f891966f 11643 bfd_vma from;
3d58e1fc 11644 num_rel = 1;
f891966f
AM
11645 from = (stub_entry->stub_offset
11646 + stub_entry->group->stub_sec->output_offset
11647 + stub_entry->group->stub_sec->output_section->vma
11648 + (p - loc));
05d0e962 11649 bfd_put_32 (htab->params->stub_bfd,
f891966f 11650 B_DOT | ((targ - from) & 0x3fffffc), p);
05d0e962
AM
11651 }
11652 else
11653 {
11654 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11655 p += 4;
11656 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11657 }
11658 p += 4;
df136d64 11659
3d58e1fc
AM
11660 if (info->emitrelocations)
11661 {
04bdff6a
AM
11662 bfd_vma roff = relp - stub_entry->group->stub_sec->contents;
11663 if (htab->powerxx_stubs)
11664 num_rel += num_relocs_for_powerxx_offset (off, odd);
11665 else
11666 {
11667 num_rel += num_relocs_for_offset (off);
11668 roff += 16;
11669 }
3d58e1fc
AM
11670 r = get_relocs (stub_entry->group->stub_sec, num_rel);
11671 if (r == NULL)
11672 return FALSE;
04bdff6a
AM
11673 if (htab->powerxx_stubs)
11674 r = emit_relocs_for_powerxx_offset (info, r, roff, targ, off, odd);
11675 else
11676 r = emit_relocs_for_offset (info, r, roff, targ, off);
3d58e1fc
AM
11677 if (stub_entry->stub_type == ppc_stub_long_branch_notoc
11678 || stub_entry->stub_type == ppc_stub_long_branch_both)
11679 {
11680 ++r;
11681 roff = p - 4 - stub_entry->group->stub_sec->contents;
11682 r->r_offset = roff;
11683 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
11684 r->r_addend = targ;
11685 if (stub_entry->h != NULL
11686 && !use_global_in_relocs (htab, stub_entry, r, num_rel))
11687 return FALSE;
11688 }
11689 }
11690
04bdff6a
AM
11691 if (!htab->powerxx_stubs
11692 && htab->glink_eh_frame != NULL
11693 && htab->glink_eh_frame->size != 0)
df136d64
AM
11694 {
11695 bfd_byte *base, *eh;
11696 unsigned int lr_used, delta;
11697
11698 base = (htab->glink_eh_frame->contents
11699 + stub_entry->group->eh_base + 17);
11700 eh = base + stub_entry->group->eh_size;
11701 lr_used = stub_entry->stub_offset + 8;
11702 if (stub_entry->stub_type == ppc_stub_long_branch_both
11703 || stub_entry->stub_type == ppc_stub_plt_branch_both
11704 || stub_entry->stub_type == ppc_stub_plt_call_both)
11705 lr_used += 4;
11706 delta = lr_used - stub_entry->group->lr_restore;
11707 stub_entry->group->lr_restore = lr_used + 8;
11708 eh = eh_advance (htab->elf.dynobj, eh, delta);
11709 *eh++ = DW_CFA_register;
11710 *eh++ = 65;
11711 *eh++ = 12;
11712 *eh++ = DW_CFA_advance_loc + 2;
11713 *eh++ = DW_CFA_restore_extended;
11714 *eh++ = 65;
11715 stub_entry->group->eh_size = eh - base;
11716 }
05d0e962
AM
11717 break;
11718
721956f4 11719 case ppc_stub_plt_call:
794e51c0 11720 case ppc_stub_plt_call_r2save:
e054468f 11721 if (stub_entry->h != NULL
b31867b6
AM
11722 && stub_entry->h->is_func_descriptor
11723 && stub_entry->h->oh != NULL)
c862ae31 11724 {
b31867b6
AM
11725 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11726
11727 /* If the old-ABI "dot-symbol" is undefined make it weak so
6f20ed8a 11728 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
8c5b4e52
AM
11729 if (fh->elf.root.type == bfd_link_hash_undefined
11730 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11731 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
b31867b6 11732 fh->elf.root.type = bfd_link_hash_undefweak;
c862ae31
AM
11733 }
11734
721956f4 11735 /* Now build the stub. */
1aa42141
AM
11736 targ = stub_entry->plt_ent->plt.offset & ~1;
11737 if (targ >= (bfd_vma) -2)
721956f4
AM
11738 abort ();
11739
33e44f2e 11740 plt = htab->elf.splt;
25f23106
AM
11741 if (!htab->elf.dynamic_sections_created
11742 || stub_entry->h == NULL
11743 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11744 {
11745 if (stub_entry->symtype == STT_GNU_IFUNC)
11746 plt = htab->elf.iplt;
11747 else
11748 plt = htab->pltlocal;
11749 }
1aa42141 11750 targ += plt->output_offset + plt->output_section->vma;
e054468f 11751
1aa42141
AM
11752 off = (elf_gp (info->output_bfd)
11753 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11754 off = targ - off;
721956f4 11755
ad8e1ba5 11756 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 11757 {
25f53a85 11758 info->callbacks->einfo
695344c0 11759 /* xgettext:c-format */
c1c8c1ef 11760 (_("%P: linkage table error against `%pT'\n"),
e054468f
AM
11761 stub_entry->h != NULL
11762 ? stub_entry->h->elf.root.root.string
11763 : "<local sym>");
721956f4 11764 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11765 htab->stub_error = TRUE;
11766 return FALSE;
721956f4
AM
11767 }
11768
176a0d42
AM
11769 r = NULL;
11770 if (info->emitrelocations)
11771 {
6f20ed8a 11772 r = get_relocs (stub_entry->group->stub_sec,
3ba720c7
AM
11773 ((PPC_HA (off) != 0)
11774 + (htab->opd_abi
e7d1c40c 11775 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
11776 && PPC_HA (off + 16) == PPC_HA (off))
11777 : 1)));
176a0d42
AM
11778 if (r == NULL)
11779 return FALSE;
6f20ed8a 11780 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11781 if (bfd_big_endian (info->output_bfd))
11782 r[0].r_offset += 2;
1aa42141 11783 r[0].r_addend = targ;
176a0d42 11784 }
a7f2871e 11785 if (stub_entry->h != NULL
ed7007c1 11786 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 11787 && htab->params->tls_get_addr_opt)
794e51c0 11788 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 11789 else
794e51c0 11790 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
11791 break;
11792
a4b6fadd
AM
11793 case ppc_stub_save_res:
11794 return TRUE;
11795
721956f4
AM
11796 default:
11797 BFD_FAIL ();
b34976b6 11798 return FALSE;
721956f4
AM
11799 }
11800
1aa42141 11801 stub_entry->group->stub_sec->size = stub_entry->stub_offset + (p - loc);
97b639ba 11802
e7d1c40c 11803 if (htab->params->emit_stub_syms)
97b639ba
AM
11804 {
11805 struct elf_link_hash_entry *h;
ee75fd95
AM
11806 size_t len1, len2;
11807 char *name;
11808 const char *const stub_str[] = { "long_branch",
05d0e962
AM
11809 "long_branch",
11810 "long_branch",
3f6ff479
AM
11811 "long_branch",
11812 "plt_branch",
ee75fd95 11813 "plt_branch",
05d0e962
AM
11814 "plt_branch",
11815 "plt_branch",
11816 "plt_call",
11817 "plt_call",
794e51c0 11818 "plt_call",
ee75fd95
AM
11819 "plt_call" };
11820
11821 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11822 len2 = strlen (stub_entry->root.string);
11823 name = bfd_malloc (len1 + len2 + 2);
11824 if (name == NULL)
11825 return FALSE;
11826 memcpy (name, stub_entry->root.string, 9);
11827 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11828 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11829 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
11830 if (h == NULL)
11831 return FALSE;
11832 if (h->root.type == bfd_link_hash_new)
11833 {
11834 h->root.type = bfd_link_hash_defined;
6f20ed8a 11835 h->root.u.def.section = stub_entry->group->stub_sec;
97b639ba 11836 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
11837 h->ref_regular = 1;
11838 h->def_regular = 1;
11839 h->ref_regular_nonweak = 1;
11840 h->forced_local = 1;
11841 h->non_elf = 0;
2ec55de3 11842 h->root.linker_def = 1;
97b639ba
AM
11843 }
11844 }
11845
b34976b6 11846 return TRUE;
721956f4
AM
11847}
11848
11849/* As above, but don't actually build the stub. Just bump offset so
11850 we know stub section sizes, and select plt_branch stubs where
11851 long_branch stubs won't do. */
11852
b34976b6 11853static bfd_boolean
4ce794b7 11854ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
11855{
11856 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 11857 struct bfd_link_info *info;
721956f4 11858 struct ppc_link_hash_table *htab;
f891966f
AM
11859 asection *plt;
11860 bfd_vma targ, off, r2off;
04bdff6a 11861 unsigned int size, extra, lr_used, delta, odd;
721956f4
AM
11862
11863 /* Massage our args to the form they really have. */
11864 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
11865 info = in_arg;
11866
11867 htab = ppc_hash_table (info);
4dfe6ac6
NC
11868 if (htab == NULL)
11869 return FALSE;
721956f4 11870
1aa42141
AM
11871 /* Make a note of the offset within the stubs for this entry. */
11872 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11873
a4b6fadd
AM
11874 if (stub_entry->h != NULL
11875 && stub_entry->h->save_res
11876 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11877 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11878 {
11879 /* Don't make stubs to out-of-line register save/restore
11880 functions. Instead, emit copies of the functions. */
11881 stub_entry->group->needs_save_res = 1;
11882 stub_entry->stub_type = ppc_stub_save_res;
11883 return TRUE;
11884 }
11885
f891966f 11886 switch (stub_entry->stub_type)
721956f4 11887 {
f891966f
AM
11888 case ppc_stub_plt_branch:
11889 case ppc_stub_plt_branch_r2off:
11890 /* Reset the stub type from the plt branch variant in case we now
11891 can reach with a shorter stub. */
11892 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11893 /* Fall through. */
11894 case ppc_stub_long_branch:
11895 case ppc_stub_long_branch_r2off:
1aa42141
AM
11896 targ = (stub_entry->target_value
11897 + stub_entry->target_section->output_offset
11898 + stub_entry->target_section->output_section->vma);
f891966f 11899 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
1aa42141
AM
11900 off = (stub_entry->stub_offset
11901 + stub_entry->group->stub_sec->output_offset
11902 + stub_entry->group->stub_sec->output_section->vma);
721956f4 11903
ad8e1ba5 11904 size = 4;
f891966f 11905 r2off = 0;
ad8e1ba5
AM
11906 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11907 {
25f53a85 11908 r2off = get_r2off (info, stub_entry);
a7c49797 11909 if (r2off == (bfd_vma) -1)
aa374f67
AM
11910 {
11911 htab->stub_error = TRUE;
11912 return FALSE;
11913 }
a7c49797 11914 size = 8;
ac2df442 11915 if (PPC_HA (r2off) != 0)
a7c49797
AM
11916 size += 4;
11917 if (PPC_LO (r2off) != 0)
11918 size += 4;
1aa42141 11919 off += size - 4;
ad8e1ba5 11920 }
1aa42141 11921 off = targ - off;
ad8e1ba5 11922
f891966f
AM
11923 /* If the branch offset is too big, use a ppc_stub_plt_branch.
11924 Do the same for -R objects without function descriptors. */
11925 if ((stub_entry->stub_type == ppc_stub_long_branch_r2off
11926 && r2off == 0
11927 && htab->sec_info[stub_entry->target_section->id].toc_off == 0)
11928 || off + (1 << 25) >= (bfd_vma) (1 << 26))
721956f4 11929 {
f891966f 11930 struct ppc_branch_hash_entry *br_entry;
df136d64 11931
f891966f
AM
11932 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11933 stub_entry->root.string + 9,
11934 TRUE, FALSE);
11935 if (br_entry == NULL)
721956f4 11936 {
f891966f
AM
11937 _bfd_error_handler (_("can't build branch stub `%s'"),
11938 stub_entry->root.string);
11939 htab->stub_error = TRUE;
11940 return FALSE;
721956f4
AM
11941 }
11942
f891966f 11943 if (br_entry->iter != htab->stub_iteration)
721956f4 11944 {
f891966f
AM
11945 br_entry->iter = htab->stub_iteration;
11946 br_entry->offset = htab->brlt->size;
11947 htab->brlt->size += 8;
63bc6f6c 11948
f891966f
AM
11949 if (htab->relbrlt != NULL)
11950 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11951 else if (info->emitrelocations)
84f5d08e 11952 {
f891966f
AM
11953 htab->brlt->reloc_count += 1;
11954 htab->brlt->flags |= SEC_RELOC;
05d0e962 11955 }
f891966f 11956 }
ac2df442 11957
f891966f
AM
11958 targ = (br_entry->offset
11959 + htab->brlt->output_offset
11960 + htab->brlt->output_section->vma);
11961 off = (elf_gp (info->output_bfd)
11962 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11963 off = targ - off;
176a0d42 11964
f891966f
AM
11965 if (info->emitrelocations)
11966 {
11967 stub_entry->group->stub_sec->reloc_count
11968 += 1 + (PPC_HA (off) != 0);
11969 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11970 }
05d0e962 11971
f891966f
AM
11972 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11973 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11974 {
11975 size = 12;
11976 if (PPC_HA (off) != 0)
11977 size = 16;
ac2df442 11978 }
f891966f 11979 else
ac2df442 11980 {
f891966f
AM
11981 size = 16;
11982 if (PPC_HA (off) != 0)
11983 size += 4;
11984
11985 if (PPC_HA (r2off) != 0)
11986 size += 4;
11987 if (PPC_LO (r2off) != 0)
11988 size += 4;
ac2df442 11989 }
721956f4 11990 }
f891966f
AM
11991 else if (info->emitrelocations)
11992 {
11993 stub_entry->group->stub_sec->reloc_count += 1;
11994 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11995 }
11996 break;
11997
11998 case ppc_stub_plt_branch_notoc:
11999 case ppc_stub_plt_branch_both:
12000 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
12001 /* Fall through. */
12002 case ppc_stub_long_branch_notoc:
12003 case ppc_stub_long_branch_both:
12004 off = (stub_entry->stub_offset
12005 + stub_entry->group->stub_sec->output_offset
12006 + stub_entry->group->stub_sec->output_section->vma);
12007 size = 0;
12008 if (stub_entry->stub_type == ppc_stub_long_branch_both)
12009 size = 4;
12010 off += size;
12011 targ = (stub_entry->target_value
12012 + stub_entry->target_section->output_offset
12013 + stub_entry->target_section->output_section->vma);
04bdff6a 12014 odd = off & 4;
f891966f
AM
12015 off = targ - off;
12016
3d58e1fc
AM
12017 if (info->emitrelocations)
12018 {
04bdff6a
AM
12019 unsigned int num_rel;
12020 if (htab->powerxx_stubs)
12021 num_rel = num_relocs_for_powerxx_offset (off, odd);
12022 else
12023 num_rel = num_relocs_for_offset (off - 8);
12024 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
12025 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12026 }
12027
04bdff6a
AM
12028 if (htab->powerxx_stubs)
12029 extra = size_powerxx_offset (off, odd);
12030 else
12031 extra = size_offset (off - 8);
f891966f
AM
12032 /* Include branch insn plus those in the offset sequence. */
12033 size += 4 + extra;
12034 /* The branch insn is at the end, or "extra" bytes along. So
12035 its offset will be "extra" bytes less that that already
12036 calculated. */
12037 off -= extra;
12038
04bdff6a
AM
12039 if (!htab->powerxx_stubs)
12040 {
12041 /* After the bcl, lr has been modified so we need to emit
12042 .eh_frame info saying the return address is in r12. */
12043 lr_used = stub_entry->stub_offset + 8;
12044 if (stub_entry->stub_type == ppc_stub_long_branch_both)
12045 lr_used += 4;
12046 /* The eh_frame info will consist of a DW_CFA_advance_loc or
12047 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
12048 DW_CFA_restore_extended 65. */
12049 delta = lr_used - stub_entry->group->lr_restore;
12050 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12051 stub_entry->group->lr_restore = lr_used + 8;
12052 }
f891966f
AM
12053
12054 /* If the branch can't reach, use a plt_branch. */
12055 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
12056 {
12057 stub_entry->stub_type += (ppc_stub_plt_branch_notoc
12058 - ppc_stub_long_branch_notoc);
12059 size += 4;
12060 }
3d58e1fc
AM
12061 else if (info->emitrelocations)
12062 stub_entry->group->stub_sec->reloc_count +=1;
f891966f
AM
12063 break;
12064
12065 case ppc_stub_plt_call_notoc:
12066 case ppc_stub_plt_call_both:
12067 off = (stub_entry->stub_offset
12068 + stub_entry->group->stub_sec->output_offset
12069 + stub_entry->group->stub_sec->output_section->vma);
12070 if (stub_entry->stub_type == ppc_stub_plt_call_both)
12071 off += 4;
12072 targ = stub_entry->plt_ent->plt.offset & ~1;
12073 if (targ >= (bfd_vma) -2)
12074 abort ();
12075
12076 plt = htab->elf.splt;
12077 if (!htab->elf.dynamic_sections_created
12078 || stub_entry->h == NULL
12079 || stub_entry->h->elf.dynindx == -1)
12080 {
12081 if (stub_entry->symtype == STT_GNU_IFUNC)
12082 plt = htab->elf.iplt;
12083 else
12084 plt = htab->pltlocal;
12085 }
12086 targ += plt->output_offset + plt->output_section->vma;
04bdff6a 12087 odd = off & 4;
f891966f
AM
12088 off = targ - off;
12089
12090 if (htab->params->plt_stub_align != 0)
12091 {
12092 unsigned pad = plt_stub_pad (htab, stub_entry, off);
12093
12094 stub_entry->group->stub_sec->size += pad;
12095 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
12096 off -= pad;
12097 }
12098
3d58e1fc
AM
12099 if (info->emitrelocations)
12100 {
04bdff6a
AM
12101 unsigned int num_rel;
12102 if (htab->powerxx_stubs)
12103 num_rel = num_relocs_for_powerxx_offset (off, odd);
12104 else
12105 num_rel = num_relocs_for_offset (off - 8);
12106 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
12107 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12108 }
12109
f891966f
AM
12110 size = plt_stub_size (htab, stub_entry, off);
12111
04bdff6a
AM
12112 if (!htab->powerxx_stubs)
12113 {
12114 /* After the bcl, lr has been modified so we need to emit
12115 .eh_frame info saying the return address is in r12. */
12116 lr_used = stub_entry->stub_offset + 8;
12117 if (stub_entry->stub_type == ppc_stub_plt_call_both)
12118 lr_used += 4;
12119 /* The eh_frame info will consist of a DW_CFA_advance_loc or
12120 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
12121 DW_CFA_restore_extended 65. */
12122 delta = lr_used - stub_entry->group->lr_restore;
12123 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12124 stub_entry->group->lr_restore = lr_used + 8;
12125 }
f891966f
AM
12126 break;
12127
12128 case ppc_stub_plt_call:
12129 case ppc_stub_plt_call_r2save:
12130 targ = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
12131 if (targ >= (bfd_vma) -2)
12132 abort ();
12133 plt = htab->elf.splt;
12134 if (!htab->elf.dynamic_sections_created
12135 || stub_entry->h == NULL
12136 || stub_entry->h->elf.dynindx == -1)
12137 {
12138 if (stub_entry->symtype == STT_GNU_IFUNC)
12139 plt = htab->elf.iplt;
12140 else
12141 plt = htab->pltlocal;
12142 }
12143 targ += plt->output_offset + plt->output_section->vma;
12144
12145 off = (elf_gp (info->output_bfd)
12146 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
12147 off = targ - off;
12148
12149 if (htab->params->plt_stub_align != 0)
12150 {
12151 unsigned pad = plt_stub_pad (htab, stub_entry, off);
12152
12153 stub_entry->group->stub_sec->size += pad;
12154 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
12155 }
12156
12157 if (info->emitrelocations)
12158 {
12159 stub_entry->group->stub_sec->reloc_count
12160 += ((PPC_HA (off) != 0)
12161 + (htab->opd_abi
12162 ? 2 + (htab->params->plt_static_chain
12163 && PPC_HA (off + 16) == PPC_HA (off))
12164 : 1));
12165 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12166 }
12167
12168 size = plt_stub_size (htab, stub_entry, off);
12169
12170 if (stub_entry->h != NULL
ed7007c1 12171 && is_tls_get_addr (&stub_entry->h->elf, htab)
f891966f
AM
12172 && htab->params->tls_get_addr_opt
12173 && stub_entry->stub_type == ppc_stub_plt_call_r2save)
12174 {
9e7028aa
AM
12175 if (htab->params->no_tls_get_addr_regsave)
12176 {
12177 lr_used = stub_entry->stub_offset + size - 20;
12178 /* The eh_frame info will consist of a DW_CFA_advance_loc
12179 or variant, DW_CFA_offset_externed_sf, 65, -stackoff,
12180 DW_CFA_advance_loc+4, DW_CFA_restore_extended, 65. */
12181 delta = lr_used - stub_entry->group->lr_restore;
12182 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12183 }
12184 else
12185 {
12186 /* Adjustments to r1 need to be described. */
12187 unsigned int cfa_updt = stub_entry->stub_offset + 18 * 4;
12188 delta = cfa_updt - stub_entry->group->lr_restore;
12189 stub_entry->group->eh_size += eh_advance_size (delta);
12190 stub_entry->group->eh_size += htab->opd_abi ? 36 : 35;
12191 }
f891966f
AM
12192 stub_entry->group->lr_restore = size - 4;
12193 }
12194 break;
12195
12196 default:
12197 BFD_FAIL ();
12198 return FALSE;
721956f4
AM
12199 }
12200
6f20ed8a 12201 stub_entry->group->stub_sec->size += size;
b34976b6 12202 return TRUE;
721956f4
AM
12203}
12204
12205/* Set up various things so that we can make a list of input sections
12206 for each output section included in the link. Returns -1 on error,
cedb70c5 12207 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
12208
12209int
e7d1c40c 12210ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4 12211{
6f20ed8a 12212 unsigned int id;
721956f4
AM
12213 bfd_size_type amt;
12214 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12215
4dfe6ac6
NC
12216 if (htab == NULL)
12217 return -1;
4c52953f 12218
7cf7fcc8 12219 htab->sec_info_arr_size = _bfd_section_id;
6f20ed8a
AM
12220 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
12221 htab->sec_info = bfd_zmalloc (amt);
12222 if (htab->sec_info == NULL)
721956f4
AM
12223 return -1;
12224
3d6f9012
AM
12225 /* Set toc_off for com, und, abs and ind sections. */
12226 for (id = 0; id < 3; id++)
6f20ed8a 12227 htab->sec_info[id].toc_off = TOC_BASE_OFF;
734b6cf9 12228
721956f4
AM
12229 return 1;
12230}
12231
927be08e
AM
12232/* Set up for first pass at multitoc partitioning. */
12233
12234void
12235ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
12236{
12237 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12238
1c865ab2 12239 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
12240 htab->toc_bfd = NULL;
12241 htab->toc_first_sec = NULL;
12242}
12243
e717da7e
AM
12244/* The linker repeatedly calls this function for each TOC input section
12245 and linker generated GOT section. Group input bfds such that the toc
927be08e 12246 within a group is less than 64k in size. */
ad8e1ba5 12247
927be08e 12248bfd_boolean
4ce794b7 12249ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
12250{
12251 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 12252 bfd_vma addr, off, limit;
ad8e1ba5 12253
4dfe6ac6
NC
12254 if (htab == NULL)
12255 return FALSE;
12256
927be08e 12257 if (!htab->second_toc_pass)
4c52953f 12258 {
927be08e 12259 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
12260 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
12261
12262 if (new_bfd)
bf102f86
AM
12263 {
12264 htab->toc_bfd = isec->owner;
12265 htab->toc_first_sec = isec;
12266 }
927be08e 12267
bf102f86
AM
12268 addr = isec->output_offset + isec->output_section->vma;
12269 off = addr - htab->toc_curr;
d77c8a4b
AM
12270 limit = 0x80008000;
12271 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
12272 limit = 0x10000;
12273 if (off + isec->size > limit)
bf102f86
AM
12274 {
12275 addr = (htab->toc_first_sec->output_offset
12276 + htab->toc_first_sec->output_section->vma);
12277 htab->toc_curr = addr;
a27e685f 12278 htab->toc_curr &= -TOC_BASE_ALIGN;
bf102f86 12279 }
99877b66 12280
927be08e
AM
12281 /* toc_curr is the base address of this toc group. Set elf_gp
12282 for the input section to be the offset relative to the
12283 output toc base plus 0x8000. Making the input elf_gp an
12284 offset allows us to move the toc as a whole without
12285 recalculating input elf_gp. */
06bcf541 12286 off = htab->toc_curr - elf_gp (info->output_bfd);
927be08e
AM
12287 off += TOC_BASE_OFF;
12288
12289 /* Die if someone uses a linker script that doesn't keep input
12290 file .toc and .got together. */
a4fd3de5
AM
12291 if (new_bfd
12292 && elf_gp (isec->owner) != 0
927be08e
AM
12293 && elf_gp (isec->owner) != off)
12294 return FALSE;
12295
12296 elf_gp (isec->owner) = off;
12297 return TRUE;
4c52953f 12298 }
927be08e
AM
12299
12300 /* During the second pass toc_first_sec points to the start of
12301 a toc group, and toc_curr is used to track the old elf_gp.
12302 We use toc_bfd to ensure we only look at each bfd once. */
12303 if (htab->toc_bfd == isec->owner)
12304 return TRUE;
12305 htab->toc_bfd = isec->owner;
12306
12307 if (htab->toc_first_sec == NULL
12308 || htab->toc_curr != elf_gp (isec->owner))
12309 {
12310 htab->toc_curr = elf_gp (isec->owner);
12311 htab->toc_first_sec = isec;
12312 }
12313 addr = (htab->toc_first_sec->output_offset
12314 + htab->toc_first_sec->output_section->vma);
06bcf541 12315 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
927be08e
AM
12316 elf_gp (isec->owner) = off;
12317
12318 return TRUE;
ad8e1ba5
AM
12319}
12320
927be08e
AM
12321/* Called via elf_link_hash_traverse to merge GOT entries for global
12322 symbol H. */
12323
12324static bfd_boolean
12325merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12326{
12327 if (h->root.type == bfd_link_hash_indirect)
12328 return TRUE;
12329
927be08e
AM
12330 merge_got_entries (&h->got.glist);
12331
12332 return TRUE;
12333}
12334
12335/* Called via elf_link_hash_traverse to allocate GOT entries for global
12336 symbol H. */
12337
12338static bfd_boolean
12339reallocate_got (struct elf_link_hash_entry *h, void *inf)
12340{
12341 struct got_entry *gent;
12342
12343 if (h->root.type == bfd_link_hash_indirect)
12344 return TRUE;
12345
927be08e
AM
12346 for (gent = h->got.glist; gent != NULL; gent = gent->next)
12347 if (!gent->is_indirect)
12348 allocate_got (h, (struct bfd_link_info *) inf, gent);
12349 return TRUE;
12350}
12351
12352/* Called on the first multitoc pass after the last call to
12353 ppc64_elf_next_toc_section. This function removes duplicate GOT
12354 entries. */
12355
12356bfd_boolean
12357ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
12358{
12359 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
12360 struct bfd *ibfd, *ibfd2;
12361 bfd_boolean done_something;
12362
12363 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 12364
7865406b
AM
12365 if (!htab->do_multi_toc)
12366 return FALSE;
12367
d0fae19d 12368 /* Merge global sym got entries within a toc group. */
927be08e
AM
12369 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
12370
12371 /* And tlsld_got. */
c72f2fb2 12372 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12373 {
12374 struct got_entry *ent, *ent2;
12375
12376 if (!is_ppc64_elf (ibfd))
12377 continue;
12378
12379 ent = ppc64_tlsld_got (ibfd);
12380 if (!ent->is_indirect
12381 && ent->got.offset != (bfd_vma) -1)
12382 {
c72f2fb2 12383 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
12384 {
12385 if (!is_ppc64_elf (ibfd2))
12386 continue;
12387
12388 ent2 = ppc64_tlsld_got (ibfd2);
12389 if (!ent2->is_indirect
12390 && ent2->got.offset != (bfd_vma) -1
12391 && elf_gp (ibfd2) == elf_gp (ibfd))
12392 {
12393 ent2->is_indirect = TRUE;
12394 ent2->got.ent = ent;
12395 }
12396 }
12397 }
12398 }
12399
12400 /* Zap sizes of got sections. */
33e44f2e
AM
12401 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
12402 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
12403 htab->got_reli_size = 0;
12404
c72f2fb2 12405 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12406 {
12407 asection *got, *relgot;
12408
12409 if (!is_ppc64_elf (ibfd))
12410 continue;
12411
12412 got = ppc64_elf_tdata (ibfd)->got;
12413 if (got != NULL)
12414 {
12415 got->rawsize = got->size;
12416 got->size = 0;
12417 relgot = ppc64_elf_tdata (ibfd)->relgot;
12418 relgot->rawsize = relgot->size;
12419 relgot->size = 0;
12420 }
12421 }
12422
12423 /* Now reallocate the got, local syms first. We don't need to
12424 allocate section contents again since we never increase size. */
c72f2fb2 12425 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12426 {
12427 struct got_entry **lgot_ents;
12428 struct got_entry **end_lgot_ents;
12429 struct plt_entry **local_plt;
12430 struct plt_entry **end_local_plt;
f961d9dd 12431 unsigned char *lgot_masks;
927be08e
AM
12432 bfd_size_type locsymcount;
12433 Elf_Internal_Shdr *symtab_hdr;
19e08130 12434 asection *s;
927be08e
AM
12435
12436 if (!is_ppc64_elf (ibfd))
12437 continue;
12438
12439 lgot_ents = elf_local_got_ents (ibfd);
12440 if (!lgot_ents)
12441 continue;
12442
12443 symtab_hdr = &elf_symtab_hdr (ibfd);
12444 locsymcount = symtab_hdr->sh_info;
12445 end_lgot_ents = lgot_ents + locsymcount;
12446 local_plt = (struct plt_entry **) end_lgot_ents;
12447 end_local_plt = local_plt + locsymcount;
f961d9dd 12448 lgot_masks = (unsigned char *) end_local_plt;
927be08e 12449 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
12450 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
12451 {
12452 struct got_entry *ent;
12453
12454 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 12455 {
19e08130
AM
12456 unsigned int ent_size = 8;
12457 unsigned int rel_size = sizeof (Elf64_External_Rela);
12458
d0fae19d
AM
12459 ent->got.offset = s->size;
12460 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 12461 {
19e08130
AM
12462 ent_size *= 2;
12463 rel_size *= 2;
12464 }
12465 s->size += ent_size;
37da22e5 12466 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 12467 {
33e44f2e 12468 htab->elf.irelplt->size += rel_size;
19e08130
AM
12469 htab->got_reli_size += rel_size;
12470 }
6a3858a6 12471 else if (bfd_link_pic (info)
f749f26e 12472 && !(ent->tls_type != 0
6a3858a6 12473 && bfd_link_executable (info)))
19e08130
AM
12474 {
12475 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12476 srel->size += rel_size;
d0fae19d
AM
12477 }
12478 }
927be08e
AM
12479 }
12480 }
12481
12482 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
12483
c72f2fb2 12484 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12485 {
12486 struct got_entry *ent;
12487
12488 if (!is_ppc64_elf (ibfd))
12489 continue;
12490
12491 ent = ppc64_tlsld_got (ibfd);
12492 if (!ent->is_indirect
12493 && ent->got.offset != (bfd_vma) -1)
12494 {
12495 asection *s = ppc64_elf_tdata (ibfd)->got;
12496 ent->got.offset = s->size;
12497 s->size += 16;
f749f26e 12498 if (bfd_link_dll (info))
927be08e
AM
12499 {
12500 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12501 srel->size += sizeof (Elf64_External_Rela);
12502 }
12503 }
12504 }
12505
33e44f2e 12506 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 12507 if (!done_something)
c72f2fb2 12508 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12509 {
12510 asection *got;
12511
12512 if (!is_ppc64_elf (ibfd))
12513 continue;
12514
12515 got = ppc64_elf_tdata (ibfd)->got;
12516 if (got != NULL)
12517 {
12518 done_something = got->rawsize != got->size;
12519 if (done_something)
12520 break;
12521 }
12522 }
12523
12524 if (done_something)
e7d1c40c 12525 (*htab->params->layout_sections_again) ();
927be08e
AM
12526
12527 /* Set up for second pass over toc sections to recalculate elf_gp
12528 on input sections. */
12529 htab->toc_bfd = NULL;
12530 htab->toc_first_sec = NULL;
12531 htab->second_toc_pass = TRUE;
12532 return done_something;
12533}
12534
12535/* Called after second pass of multitoc partitioning. */
12536
12537void
12538ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
12539{
12540 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12541
12542 /* After the second pass, toc_curr tracks the TOC offset used
12543 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 12544 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
12545}
12546
9b5ecbd0
AM
12547/* No toc references were found in ISEC. If the code in ISEC makes no
12548 calls, then there's no need to use toc adjusting stubs when branching
12549 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
12550 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
12551 needed, and 2 if a cyclical call-graph was found but no other reason
12552 for a stub was detected. If called from the top level, a return of
12553 2 means the same as a return of 0. */
9b5ecbd0
AM
12554
12555static int
4ce794b7 12556toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 12557{
9b5ecbd0 12558 int ret;
70cc837d
AM
12559
12560 /* Mark this section as checked. */
12561 isec->call_check_done = 1;
9b5ecbd0 12562
772119ce
AM
12563 /* We know none of our code bearing sections will need toc stubs. */
12564 if ((isec->flags & SEC_LINKER_CREATED) != 0)
12565 return 0;
12566
eea6121a 12567 if (isec->size == 0)
082c50f8
AM
12568 return 0;
12569
4c52953f
AM
12570 if (isec->output_section == NULL)
12571 return 0;
12572
4c52953f 12573 ret = 0;
70cc837d 12574 if (isec->reloc_count != 0)
9b5ecbd0 12575 {
70cc837d
AM
12576 Elf_Internal_Rela *relstart, *rel;
12577 Elf_Internal_Sym *local_syms;
12578 struct ppc_link_hash_table *htab;
2917689a 12579
70cc837d
AM
12580 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
12581 info->keep_memory);
12582 if (relstart == NULL)
12583 return -1;
90aecf7a 12584
70cc837d
AM
12585 /* Look for branches to outside of this section. */
12586 local_syms = NULL;
12587 htab = ppc_hash_table (info);
12588 if (htab == NULL)
12589 return -1;
4c52953f 12590
70cc837d 12591 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 12592 {
70cc837d
AM
12593 enum elf_ppc64_reloc_type r_type;
12594 unsigned long r_symndx;
12595 struct elf_link_hash_entry *h;
12596 struct ppc_link_hash_entry *eh;
12597 Elf_Internal_Sym *sym;
12598 asection *sym_sec;
12599 struct _opd_sec_data *opd;
12600 bfd_vma sym_value;
12601 bfd_vma dest;
12602
12603 r_type = ELF64_R_TYPE (rel->r_info);
12604 if (r_type != R_PPC64_REL24
05d0e962 12605 && r_type != R_PPC64_REL24_NOTOC
70cc837d
AM
12606 && r_type != R_PPC64_REL14
12607 && r_type != R_PPC64_REL14_BRTAKEN
23cedd1d 12608 && r_type != R_PPC64_REL14_BRNTAKEN
5663e321
AM
12609 && r_type != R_PPC64_PLTCALL
12610 && r_type != R_PPC64_PLTCALL_NOTOC)
70cc837d 12611 continue;
4c52953f 12612
70cc837d
AM
12613 r_symndx = ELF64_R_SYM (rel->r_info);
12614 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
12615 isec->owner))
4c52953f 12616 {
70cc837d
AM
12617 ret = -1;
12618 break;
12619 }
4c52953f 12620
70cc837d
AM
12621 /* Calls to dynamic lib functions go through a plt call stub
12622 that uses r2. */
ed7007c1 12623 eh = ppc_elf_hash_entry (h);
70cc837d
AM
12624 if (eh != NULL
12625 && (eh->elf.plt.plist != NULL
12626 || (eh->oh != NULL
12627 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
12628 {
12629 ret = 1;
12630 break;
4c52953f
AM
12631 }
12632
70cc837d
AM
12633 if (sym_sec == NULL)
12634 /* Ignore other undefined symbols. */
4c52953f 12635 continue;
4c52953f 12636
70cc837d
AM
12637 /* Assume branches to other sections not included in the
12638 link need stubs too, to cover -R and absolute syms. */
12639 if (sym_sec->output_section == NULL)
12640 {
12641 ret = 1;
12642 break;
12643 }
4c52953f 12644
70cc837d
AM
12645 if (h == NULL)
12646 sym_value = sym->st_value;
12647 else
12648 {
12649 if (h->root.type != bfd_link_hash_defined
12650 && h->root.type != bfd_link_hash_defweak)
12651 abort ();
12652 sym_value = h->root.u.def.value;
12653 }
12654 sym_value += rel->r_addend;
4c52953f 12655
70cc837d
AM
12656 /* If this branch reloc uses an opd sym, find the code section. */
12657 opd = get_opd_info (sym_sec);
12658 if (opd != NULL)
12659 {
12660 if (h == NULL && opd->adjust != NULL)
12661 {
12662 long adjust;
4c52953f 12663
92a9c616 12664 adjust = opd->adjust[OPD_NDX (sym_value)];
70cc837d
AM
12665 if (adjust == -1)
12666 /* Assume deleted functions won't ever be called. */
12667 continue;
12668 sym_value += adjust;
12669 }
4c52953f 12670
aef36ac1
AM
12671 dest = opd_entry_value (sym_sec, sym_value,
12672 &sym_sec, NULL, FALSE);
70cc837d
AM
12673 if (dest == (bfd_vma) -1)
12674 continue;
12675 }
12676 else
12677 dest = (sym_value
12678 + sym_sec->output_offset
12679 + sym_sec->output_section->vma);
4c52953f 12680
70cc837d
AM
12681 /* Ignore branch to self. */
12682 if (sym_sec == isec)
12683 continue;
4c52953f 12684
70cc837d
AM
12685 /* If the called function uses the toc, we need a stub. */
12686 if (sym_sec->has_toc_reloc
12687 || sym_sec->makes_toc_func_call)
4c52953f 12688 {
70cc837d 12689 ret = 1;
4c52953f
AM
12690 break;
12691 }
70cc837d
AM
12692
12693 /* Assume any branch that needs a long branch stub might in fact
12694 need a plt_branch stub. A plt_branch stub uses r2. */
12695 else if (dest - (isec->output_offset
12696 + isec->output_section->vma
6911b7dc
AM
12697 + rel->r_offset) + (1 << 25)
12698 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
12699 ? h->other
12700 : sym->st_other))
4c52953f 12701 {
70cc837d
AM
12702 ret = 1;
12703 break;
12704 }
12705
12706 /* If calling back to a section in the process of being
12707 tested, we can't say for sure that no toc adjusting stubs
12708 are needed, so don't return zero. */
12709 else if (sym_sec->call_check_in_progress)
12710 ret = 2;
12711
12712 /* Branches to another section that itself doesn't have any TOC
12713 references are OK. Recursively call ourselves to check. */
12714 else if (!sym_sec->call_check_done)
12715 {
12716 int recur;
12717
12718 /* Mark current section as indeterminate, so that other
12719 sections that call back to current won't be marked as
12720 known. */
12721 isec->call_check_in_progress = 1;
12722 recur = toc_adjusting_stub_needed (info, sym_sec);
12723 isec->call_check_in_progress = 0;
12724
4c52953f
AM
12725 if (recur != 0)
12726 {
70cc837d
AM
12727 ret = recur;
12728 if (recur != 2)
12729 break;
4c52953f
AM
12730 }
12731 }
4c52953f 12732 }
70cc837d
AM
12733
12734 if (local_syms != NULL
12735 && (elf_symtab_hdr (isec->owner).contents
12736 != (unsigned char *) local_syms))
12737 free (local_syms);
12738 if (elf_section_data (isec)->relocs != relstart)
12739 free (relstart);
9b5ecbd0
AM
12740 }
12741
70cc837d
AM
12742 if ((ret & 1) == 0
12743 && isec->map_head.s != NULL
12744 && (strcmp (isec->output_section->name, ".init") == 0
12745 || strcmp (isec->output_section->name, ".fini") == 0))
12746 {
12747 if (isec->map_head.s->has_toc_reloc
12748 || isec->map_head.s->makes_toc_func_call)
12749 ret = 1;
12750 else if (!isec->map_head.s->call_check_done)
12751 {
12752 int recur;
12753 isec->call_check_in_progress = 1;
12754 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
12755 isec->call_check_in_progress = 0;
12756 if (recur != 0)
12757 ret = recur;
12758 }
12759 }
12760
12761 if (ret == 1)
12762 isec->makes_toc_func_call = 1;
4c52953f 12763
9b5ecbd0
AM
12764 return ret;
12765}
12766
721956f4
AM
12767/* The linker repeatedly calls this function for each input section,
12768 in the order that input sections are linked into output sections.
12769 Build lists of input sections to determine groupings between which
12770 we may insert linker stubs. */
12771
9b5ecbd0 12772bfd_boolean
4ce794b7 12773ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
12774{
12775 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12776
4dfe6ac6
NC
12777 if (htab == NULL)
12778 return FALSE;
12779
734b6cf9 12780 if ((isec->output_section->flags & SEC_CODE) != 0
6f20ed8a 12781 && isec->output_section->id < htab->sec_info_arr_size)
721956f4 12782 {
3d6f9012
AM
12783 /* This happens to make the list in reverse order,
12784 which is what we want. */
6f20ed8a
AM
12785 htab->sec_info[isec->id].u.list
12786 = htab->sec_info[isec->output_section->id].u.list;
12787 htab->sec_info[isec->output_section->id].u.list = isec;
721956f4 12788 }
ad8e1ba5 12789
4c52953f 12790 if (htab->multi_toc_needed)
9b5ecbd0 12791 {
8b974ba3
AM
12792 /* Analyse sections that aren't already flagged as needing a
12793 valid toc pointer. Exclude .fixup for the linux kernel.
12794 .fixup contains branches, but only back to the function that
12795 hit an exception. */
12796 if (!(isec->has_toc_reloc
12797 || (isec->flags & SEC_CODE) == 0
12798 || strcmp (isec->name, ".fixup") == 0
12799 || isec->call_check_done))
12800 {
12801 if (toc_adjusting_stub_needed (info, isec) < 0)
6683a28d 12802 return FALSE;
8b974ba3
AM
12803 }
12804 /* Make all sections use the TOC assigned for this object file.
12805 This will be wrong for pasted sections; We fix that in
12806 check_pasted_section(). */
12807 if (elf_gp (isec->owner) != 0)
12808 htab->toc_curr = elf_gp (isec->owner);
12809 }
12810
6f20ed8a 12811 htab->sec_info[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 12812 return TRUE;
721956f4
AM
12813}
12814
70cc837d
AM
12815/* Check that all .init and .fini sections use the same toc, if they
12816 have toc relocs. */
12817
12818static bfd_boolean
12819check_pasted_section (struct bfd_link_info *info, const char *name)
12820{
12821 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12822
12823 if (o != NULL)
12824 {
12825 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12826 bfd_vma toc_off = 0;
12827 asection *i;
12828
12829 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12830 if (i->has_toc_reloc)
12831 {
12832 if (toc_off == 0)
6f20ed8a
AM
12833 toc_off = htab->sec_info[i->id].toc_off;
12834 else if (toc_off != htab->sec_info[i->id].toc_off)
70cc837d
AM
12835 return FALSE;
12836 }
6683a28d
AM
12837
12838 if (toc_off == 0)
12839 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12840 if (i->makes_toc_func_call)
12841 {
6f20ed8a 12842 toc_off = htab->sec_info[i->id].toc_off;
6683a28d
AM
12843 break;
12844 }
12845
70cc837d
AM
12846 /* Make sure the whole pasted function uses the same toc offset. */
12847 if (toc_off != 0)
12848 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
6f20ed8a 12849 htab->sec_info[i->id].toc_off = toc_off;
70cc837d
AM
12850 }
12851 return TRUE;
12852}
12853
12854bfd_boolean
12855ppc64_elf_check_init_fini (struct bfd_link_info *info)
12856{
12857 return (check_pasted_section (info, ".init")
12858 & check_pasted_section (info, ".fini"));
12859}
12860
721956f4
AM
12861/* See whether we can group stub sections together. Grouping stub
12862 sections may result in fewer stubs. More importantly, we need to
12863 put all .init* and .fini* stubs at the beginning of the .init or
12864 .fini output sections respectively, because glibc splits the
12865 _init and _fini functions into multiple parts. Putting a stub in
12866 the middle of a function is not a good idea. */
12867
6f20ed8a
AM
12868static bfd_boolean
12869group_sections (struct bfd_link_info *info,
4ce794b7
AM
12870 bfd_size_type stub_group_size,
12871 bfd_boolean stubs_always_before_branch)
721956f4 12872{
6f20ed8a
AM
12873 struct ppc_link_hash_table *htab;
12874 asection *osec;
7c8fe5c4
AM
12875 bfd_boolean suppress_size_errors;
12876
6f20ed8a
AM
12877 htab = ppc_hash_table (info);
12878 if (htab == NULL)
12879 return FALSE;
12880
7c8fe5c4 12881 suppress_size_errors = FALSE;
7c8fe5c4
AM
12882 if (stub_group_size == 1)
12883 {
12884 /* Default values. */
12885 if (stubs_always_before_branch)
09f92717 12886 stub_group_size = 0x1e00000;
7c8fe5c4 12887 else
09f92717 12888 stub_group_size = 0x1c00000;
7c8fe5c4
AM
12889 suppress_size_errors = TRUE;
12890 }
12891
6f20ed8a 12892 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
721956f4 12893 {
6f20ed8a
AM
12894 asection *tail;
12895
12896 if (osec->id >= htab->sec_info_arr_size)
12897 continue;
12898
12899 tail = htab->sec_info[osec->id].u.list;
734b6cf9 12900 while (tail != NULL)
721956f4 12901 {
734b6cf9
AM
12902 asection *curr;
12903 asection *prev;
12904 bfd_size_type total;
12905 bfd_boolean big_sec;
12906 bfd_vma curr_toc;
6f20ed8a 12907 struct map_stub *group;
09f92717 12908 bfd_size_type group_size;
734b6cf9
AM
12909
12910 curr = tail;
eea6121a 12911 total = tail->size;
09f92717
AM
12912 group_size = (ppc64_elf_section_data (tail) != NULL
12913 && ppc64_elf_section_data (tail)->has_14bit_branch
12914 ? stub_group_size >> 10 : stub_group_size);
12915
12916 big_sec = total > group_size;
7c8fe5c4 12917 if (big_sec && !suppress_size_errors)
695344c0 12918 /* xgettext:c-format */
871b3ab2 12919 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
4eca0228 12920 tail->owner, tail);
6f20ed8a 12921 curr_toc = htab->sec_info[tail->id].toc_off;
734b6cf9 12922
6f20ed8a 12923 while ((prev = htab->sec_info[curr->id].u.list) != NULL
734b6cf9 12924 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
12925 < (ppc64_elf_section_data (prev) != NULL
12926 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12927 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12928 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12929 curr = prev;
12930
12931 /* OK, the size from the start of CURR to the end is less
09f92717 12932 than group_size and thus can be handled by one stub
734b6cf9 12933 section. (or the tail section is itself larger than
09f92717
AM
12934 group_size, in which case we may be toast.) We should
12935 really be keeping track of the total size of stubs added
12936 here, as stubs contribute to the final output section
12937 size. That's a little tricky, and this way will only
12938 break if stubs added make the total size more than 2^25,
12939 ie. for the default stub_group_size, if stubs total more
12940 than 2097152 bytes, or nearly 75000 plt call stubs. */
6f20ed8a
AM
12941 group = bfd_alloc (curr->owner, sizeof (*group));
12942 if (group == NULL)
12943 return FALSE;
12944 group->link_sec = curr;
12945 group->stub_sec = NULL;
a4b6fadd 12946 group->needs_save_res = 0;
df136d64
AM
12947 group->lr_restore = 0;
12948 group->eh_size = 0;
12949 group->eh_base = 0;
a4b6fadd
AM
12950 group->next = htab->group;
12951 htab->group = group;
734b6cf9 12952 do
721956f4 12953 {
6f20ed8a 12954 prev = htab->sec_info[tail->id].u.list;
734b6cf9 12955 /* Set up this stub group. */
6f20ed8a 12956 htab->sec_info[tail->id].u.group = group;
721956f4 12957 }
734b6cf9
AM
12958 while (tail != curr && (tail = prev) != NULL);
12959
09f92717 12960 /* But wait, there's more! Input sections up to group_size
734b6cf9
AM
12961 bytes before the stub section can be handled by it too.
12962 Don't do this if we have a really large section after the
12963 stubs, as adding more stubs increases the chance that
12964 branches may not reach into the stub section. */
12965 if (!stubs_always_before_branch && !big_sec)
12966 {
12967 total = 0;
12968 while (prev != NULL
12969 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
12970 < (ppc64_elf_section_data (prev) != NULL
12971 && ppc64_elf_section_data (prev)->has_14bit_branch
2cdcc330
AM
12972 ? (group_size = stub_group_size >> 10)
12973 : group_size))
6f20ed8a 12974 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12975 {
12976 tail = prev;
6f20ed8a
AM
12977 prev = htab->sec_info[tail->id].u.list;
12978 htab->sec_info[tail->id].u.group = group;
734b6cf9
AM
12979 }
12980 }
12981 tail = prev;
721956f4
AM
12982 }
12983 }
6f20ed8a 12984 return TRUE;
721956f4
AM
12985}
12986
58d180e8
AM
12987static const unsigned char glink_eh_frame_cie[] =
12988{
12989 0, 0, 0, 16, /* length. */
12990 0, 0, 0, 0, /* id. */
12991 1, /* CIE version. */
12992 'z', 'R', 0, /* Augmentation string. */
12993 4, /* Code alignment. */
12994 0x78, /* Data alignment. */
12995 65, /* RA reg. */
12996 1, /* Augmentation size. */
12997 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
2e0ce1c8 12998 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
58d180e8
AM
12999};
13000
d969d15f
AM
13001/* Stripping output sections is normally done before dynamic section
13002 symbols have been allocated. This function is called later, and
13003 handles cases like htab->brlt which is mapped to its own output
13004 section. */
13005
13006static void
13007maybe_strip_output (struct bfd_link_info *info, asection *isec)
13008{
13009 if (isec->size == 0
13010 && isec->output_section->size == 0
53d8967a 13011 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
13012 && !bfd_section_removed_from_list (info->output_bfd,
13013 isec->output_section)
13014 && elf_section_data (isec->output_section)->dynindx == 0)
13015 {
13016 isec->output_section->flags |= SEC_EXCLUDE;
13017 bfd_section_list_remove (info->output_bfd, isec->output_section);
13018 info->output_bfd->section_count--;
13019 }
13020}
13021
721956f4
AM
13022/* Determine and set the size of the stub section for a final link.
13023
13024 The basic idea here is to examine all the relocations looking for
13025 PC-relative calls to a target that is unreachable with a "bl"
13026 instruction. */
13027
b34976b6 13028bfd_boolean
e7d1c40c 13029ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
13030{
13031 bfd_size_type stub_group_size;
b34976b6 13032 bfd_boolean stubs_always_before_branch;
721956f4
AM
13033 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13034
4dfe6ac6
NC
13035 if (htab == NULL)
13036 return FALSE;
13037
0e1862bb 13038 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
e7d1c40c 13039 htab->params->plt_thread_safe = 1;
b9e5796b 13040 if (!htab->opd_abi)
e7d1c40c
AM
13041 htab->params->plt_thread_safe = 0;
13042 else if (htab->params->plt_thread_safe == -1)
794e51c0 13043 {
e2458743 13044 static const char *const thread_starter[] =
794e51c0
AM
13045 {
13046 "pthread_create",
13047 /* libstdc++ */
13048 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
13049 /* librt */
13050 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
13051 "mq_notify", "create_timer",
13052 /* libanl */
13053 "getaddrinfo_a",
13054 /* libgomp */
2300b5a1 13055 "GOMP_parallel",
794e51c0 13056 "GOMP_parallel_start",
2300b5a1 13057 "GOMP_parallel_loop_static",
794e51c0 13058 "GOMP_parallel_loop_static_start",
2300b5a1 13059 "GOMP_parallel_loop_dynamic",
794e51c0 13060 "GOMP_parallel_loop_dynamic_start",
2300b5a1 13061 "GOMP_parallel_loop_guided",
794e51c0 13062 "GOMP_parallel_loop_guided_start",
2300b5a1 13063 "GOMP_parallel_loop_runtime",
794e51c0 13064 "GOMP_parallel_loop_runtime_start",
2300b5a1 13065 "GOMP_parallel_sections",
68ffbac6 13066 "GOMP_parallel_sections_start",
f9dffbf0
AM
13067 /* libgo */
13068 "__go_go",
794e51c0
AM
13069 };
13070 unsigned i;
13071
a4b6fadd 13072 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
794e51c0
AM
13073 {
13074 struct elf_link_hash_entry *h;
13075 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
13076 FALSE, FALSE, TRUE);
e7d1c40c
AM
13077 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
13078 if (htab->params->plt_thread_safe)
794e51c0
AM
13079 break;
13080 }
13081 }
e7d1c40c
AM
13082 stubs_always_before_branch = htab->params->group_size < 0;
13083 if (htab->params->group_size < 0)
13084 stub_group_size = -htab->params->group_size;
721956f4 13085 else
e7d1c40c 13086 stub_group_size = htab->params->group_size;
721956f4 13087
6f20ed8a
AM
13088 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
13089 return FALSE;
721956f4 13090
c9301e31
AM
13091#define STUB_SHRINK_ITER 20
13092 /* Loop until no stubs added. After iteration 20 of this loop we may
13093 exit on a stub section shrinking. This is to break out of a
13094 pathological case where adding stubs on one iteration decreases
13095 section gaps (perhaps due to alignment), which then requires
13096 fewer or smaller stubs on the next iteration. */
13097
721956f4
AM
13098 while (1)
13099 {
13100 bfd *input_bfd;
13101 unsigned int bfd_indx;
a4b6fadd 13102 struct map_stub *group;
721956f4
AM
13103
13104 htab->stub_iteration += 1;
721956f4
AM
13105
13106 for (input_bfd = info->input_bfds, bfd_indx = 0;
13107 input_bfd != NULL;
c72f2fb2 13108 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
13109 {
13110 Elf_Internal_Shdr *symtab_hdr;
13111 asection *section;
6cdc0ccc 13112 Elf_Internal_Sym *local_syms = NULL;
721956f4 13113
0c8d6e5c 13114 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
13115 continue;
13116
721956f4 13117 /* We'll need the symbol table in a second. */
0ffa91dd 13118 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
13119 if (symtab_hdr->sh_info == 0)
13120 continue;
13121
721956f4
AM
13122 /* Walk over each section attached to the input bfd. */
13123 for (section = input_bfd->sections;
13124 section != NULL;
13125 section = section->next)
13126 {
721956f4 13127 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
13128
13129 /* If there aren't any relocs, then there's nothing more
13130 to do. */
13131 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
13132 || (section->flags & SEC_ALLOC) == 0
13133 || (section->flags & SEC_LOAD) == 0
13134 || (section->flags & SEC_CODE) == 0
721956f4
AM
13135 || section->reloc_count == 0)
13136 continue;
13137
13138 /* If this section is a link-once section that will be
13139 discarded, then don't create any stubs. */
13140 if (section->output_section == NULL
927be08e 13141 || section->output_section->owner != info->output_bfd)
721956f4
AM
13142 continue;
13143
1e2f5b6e
AM
13144 /* Get the relocs. */
13145 internal_relocs
4ce794b7 13146 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 13147 info->keep_memory);
721956f4 13148 if (internal_relocs == NULL)
1e2f5b6e 13149 goto error_ret_free_local;
721956f4
AM
13150
13151 /* Now examine each relocation. */
13152 irela = internal_relocs;
13153 irelaend = irela + section->reloc_count;
13154 for (; irela < irelaend; irela++)
13155 {
4ce794b7
AM
13156 enum elf_ppc64_reloc_type r_type;
13157 unsigned int r_indx;
721956f4
AM
13158 enum ppc_stub_type stub_type;
13159 struct ppc_stub_hash_entry *stub_entry;
8387904d 13160 asection *sym_sec, *code_sec;
e054468f 13161 bfd_vma sym_value, code_value;
721956f4 13162 bfd_vma destination;
6911b7dc 13163 unsigned long local_off;
8843416a 13164 bfd_boolean ok_dest;
721956f4 13165 struct ppc_link_hash_entry *hash;
8387904d 13166 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
13167 struct elf_link_hash_entry *h;
13168 Elf_Internal_Sym *sym;
721956f4
AM
13169 char *stub_name;
13170 const asection *id_sec;
74f0fb50 13171 struct _opd_sec_data *opd;
e054468f 13172 struct plt_entry *plt_ent;
721956f4
AM
13173
13174 r_type = ELF64_R_TYPE (irela->r_info);
13175 r_indx = ELF64_R_SYM (irela->r_info);
13176
4ce794b7 13177 if (r_type >= R_PPC64_max)
721956f4
AM
13178 {
13179 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 13180 goto error_ret_free_internal;
721956f4
AM
13181 }
13182
13183 /* Only look for stubs on branch instructions. */
4ce794b7 13184 if (r_type != R_PPC64_REL24
05d0e962 13185 && r_type != R_PPC64_REL24_NOTOC
4ce794b7
AM
13186 && r_type != R_PPC64_REL14
13187 && r_type != R_PPC64_REL14_BRTAKEN
13188 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
13189 continue;
13190
13191 /* Now determine the call target, its name, value,
13192 section. */
411e1bfb
AM
13193 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
13194 r_indx, input_bfd))
13195 goto error_ret_free_internal;
ed7007c1 13196 hash = ppc_elf_hash_entry (h);
411e1bfb 13197
8843416a 13198 ok_dest = FALSE;
8387904d 13199 fdh = NULL;
7fe2b9a6 13200 sym_value = 0;
411e1bfb 13201 if (hash == NULL)
721956f4 13202 {
411e1bfb 13203 sym_value = sym->st_value;
c27b8c2a
AM
13204 if (sym_sec != NULL
13205 && sym_sec->output_section != NULL)
13206 ok_dest = TRUE;
721956f4 13207 }
7fe2b9a6
AM
13208 else if (hash->elf.root.type == bfd_link_hash_defined
13209 || hash->elf.root.type == bfd_link_hash_defweak)
13210 {
13211 sym_value = hash->elf.root.u.def.value;
13212 if (sym_sec->output_section != NULL)
13213 ok_dest = TRUE;
13214 }
13215 else if (hash->elf.root.type == bfd_link_hash_undefweak
13216 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 13217 {
99877b66 13218 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
13219 use the func descriptor sym instead if it is
13220 defined. */
ceb1f1ef 13221 if (hash->elf.root.root.string[0] == '.'
8c5b4e52 13222 && hash->oh != NULL)
8387904d 13223 {
8c5b4e52 13224 fdh = ppc_follow_link (hash->oh);
8387904d
AM
13225 if (fdh->elf.root.type == bfd_link_hash_defined
13226 || fdh->elf.root.type == bfd_link_hash_defweak)
13227 {
13228 sym_sec = fdh->elf.root.u.def.section;
13229 sym_value = fdh->elf.root.u.def.value;
13230 if (sym_sec->output_section != NULL)
13231 ok_dest = TRUE;
13232 }
99877b66
AM
13233 else
13234 fdh = NULL;
8387904d 13235 }
7fe2b9a6
AM
13236 }
13237 else
13238 {
13239 bfd_set_error (bfd_error_bad_value);
13240 goto error_ret_free_internal;
721956f4
AM
13241 }
13242
8843416a 13243 destination = 0;
6911b7dc 13244 local_off = 0;
8843416a
AM
13245 if (ok_dest)
13246 {
13247 sym_value += irela->r_addend;
13248 destination = (sym_value
13249 + sym_sec->output_offset
13250 + sym_sec->output_section->vma);
6911b7dc
AM
13251 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
13252 ? hash->elf.other
13253 : sym->st_other);
8843416a
AM
13254 }
13255
8387904d 13256 code_sec = sym_sec;
e054468f 13257 code_value = sym_value;
74f0fb50
AM
13258 opd = get_opd_info (sym_sec);
13259 if (opd != NULL)
8387904d
AM
13260 {
13261 bfd_vma dest;
13262
74f0fb50 13263 if (hash == NULL && opd->adjust != NULL)
8387904d 13264 {
51aecdc5 13265 long adjust = opd->adjust[OPD_NDX (sym_value)];
8387904d
AM
13266 if (adjust == -1)
13267 continue;
e054468f 13268 code_value += adjust;
8387904d
AM
13269 sym_value += adjust;
13270 }
13271 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 13272 &code_sec, &code_value, FALSE);
8387904d
AM
13273 if (dest != (bfd_vma) -1)
13274 {
13275 destination = dest;
13276 if (fdh != NULL)
13277 {
13278 /* Fixup old ABI sym to point at code
13279 entry. */
99877b66 13280 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 13281 hash->elf.root.u.def.section = code_sec;
e054468f 13282 hash->elf.root.u.def.value = code_value;
8387904d
AM
13283 }
13284 }
13285 }
13286
721956f4 13287 /* Determine what (if any) linker stub is needed. */
e054468f 13288 plt_ent = NULL;
721956f4 13289 stub_type = ppc_type_of_stub (section, irela, &hash,
6911b7dc
AM
13290 &plt_ent, destination,
13291 local_off);
ad8e1ba5 13292
05d0e962
AM
13293 if (r_type == R_PPC64_REL24_NOTOC)
13294 {
13295 if (stub_type == ppc_stub_plt_call)
13296 stub_type = ppc_stub_plt_call_notoc;
13297 else if (stub_type == ppc_stub_long_branch
13298 || (code_sec != NULL
13299 && code_sec->output_section != NULL
13300 && (((hash ? hash->elf.other : sym->st_other)
13301 & STO_PPC64_LOCAL_MASK)
4a4e7361 13302 > 1 << STO_PPC64_LOCAL_BIT)))
05d0e962
AM
13303 stub_type = ppc_stub_long_branch_notoc;
13304 }
13305 else if (stub_type != ppc_stub_plt_call)
ad8e1ba5
AM
13306 {
13307 /* Check whether we need a TOC adjusting stub.
13308 Since the linker pastes together pieces from
13309 different object files when creating the
13310 _init and _fini functions, it may be that a
13311 call to what looks like a local sym is in
13312 fact a call needing a TOC adjustment. */
33cb30a1
AM
13313 if ((code_sec != NULL
13314 && code_sec->output_section != NULL
13315 && (htab->sec_info[code_sec->id].toc_off
13316 != htab->sec_info[section->id].toc_off)
13317 && (code_sec->has_toc_reloc
13318 || code_sec->makes_toc_func_call))
13319 || (((hash ? hash->elf.other : sym->st_other)
13320 & STO_PPC64_LOCAL_MASK)
13321 == 1 << STO_PPC64_LOCAL_BIT))
ad8e1ba5
AM
13322 stub_type = ppc_stub_long_branch_r2off;
13323 }
13324
721956f4
AM
13325 if (stub_type == ppc_stub_none)
13326 continue;
13327
411e1bfb
AM
13328 /* __tls_get_addr calls might be eliminated. */
13329 if (stub_type != ppc_stub_plt_call
05d0e962 13330 && stub_type != ppc_stub_plt_call_notoc
411e1bfb 13331 && hash != NULL
ed7007c1 13332 && is_tls_get_addr (&hash->elf, htab)
411e1bfb
AM
13333 && section->has_tls_reloc
13334 && irela != internal_relocs)
13335 {
13336 /* Get tls info. */
f961d9dd 13337 unsigned char *tls_mask;
411e1bfb 13338
3a71aa26 13339 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
13340 irela - 1, input_bfd))
13341 goto error_ret_free_internal;
abc489c6
AM
13342 if ((*tls_mask & TLS_TLS) != 0
13343 && (*tls_mask & (TLS_GD | TLS_LD)) == 0)
411e1bfb
AM
13344 continue;
13345 }
13346
f378ab09 13347 if (stub_type == ppc_stub_plt_call)
794e51c0 13348 {
6e1816be
AM
13349 if (!htab->opd_abi
13350 && htab->params->plt_localentry0 != 0
13351 && is_elfv2_localentry0 (&hash->elf))
13352 htab->has_plt_localentry0 = 1;
13353 else if (irela + 1 < irelaend
13354 && irela[1].r_offset == irela->r_offset + 4
13355 && (ELF64_R_TYPE (irela[1].r_info)
13356 == R_PPC64_TOCSAVE))
f378ab09
AM
13357 {
13358 if (!tocsave_find (htab, INSERT,
13359 &local_syms, irela + 1, input_bfd))
13360 goto error_ret_free_internal;
13361 }
f378ab09
AM
13362 else
13363 stub_type = ppc_stub_plt_call_r2save;
794e51c0 13364 }
3b421ab3 13365
721956f4 13366 /* Support for grouping stub sections. */
6f20ed8a 13367 id_sec = htab->sec_info[section->id].u.group->link_sec;
721956f4
AM
13368
13369 /* Get the name of this stub. */
13370 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
13371 if (!stub_name)
13372 goto error_ret_free_internal;
13373
13374 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 13375 stub_name, FALSE, FALSE);
721956f4
AM
13376 if (stub_entry != NULL)
13377 {
05d0e962
AM
13378 enum ppc_stub_type old_type;
13379 /* A stub has already been created, but it may
13380 not be the required type. We shouldn't be
13381 transitioning from plt_call to long_branch
13382 stubs or vice versa, but we might be
13383 upgrading from plt_call to plt_call_r2save or
13384 from long_branch to long_branch_r2off. */
721956f4 13385 free (stub_name);
05d0e962
AM
13386 old_type = stub_entry->stub_type;
13387 switch (old_type)
13388 {
13389 default:
13390 abort ();
13391
13392 case ppc_stub_save_res:
13393 continue;
13394
13395 case ppc_stub_plt_call:
13396 case ppc_stub_plt_call_r2save:
13397 case ppc_stub_plt_call_notoc:
13398 case ppc_stub_plt_call_both:
13399 if (stub_type == ppc_stub_plt_call)
13400 continue;
13401 else if (stub_type == ppc_stub_plt_call_r2save)
13402 {
13403 if (old_type == ppc_stub_plt_call_notoc)
13404 stub_type = ppc_stub_plt_call_both;
13405 }
13406 else if (stub_type == ppc_stub_plt_call_notoc)
13407 {
13408 if (old_type == ppc_stub_plt_call_r2save)
13409 stub_type = ppc_stub_plt_call_both;
13410 }
13411 else
13412 abort ();
13413 break;
13414
13415 case ppc_stub_plt_branch:
13416 case ppc_stub_plt_branch_r2off:
13417 case ppc_stub_plt_branch_notoc:
13418 case ppc_stub_plt_branch_both:
13419 old_type += (ppc_stub_long_branch
13420 - ppc_stub_plt_branch);
13421 /* Fall through. */
13422 case ppc_stub_long_branch:
13423 case ppc_stub_long_branch_r2off:
13424 case ppc_stub_long_branch_notoc:
13425 case ppc_stub_long_branch_both:
13426 if (stub_type == ppc_stub_long_branch)
13427 continue;
13428 else if (stub_type == ppc_stub_long_branch_r2off)
13429 {
13430 if (old_type == ppc_stub_long_branch_notoc)
13431 stub_type = ppc_stub_long_branch_both;
13432 }
13433 else if (stub_type == ppc_stub_long_branch_notoc)
13434 {
13435 if (old_type == ppc_stub_long_branch_r2off)
13436 stub_type = ppc_stub_long_branch_both;
13437 }
13438 else
13439 abort ();
13440 break;
13441 }
13442 if (old_type < stub_type)
794e51c0 13443 stub_entry->stub_type = stub_type;
721956f4
AM
13444 continue;
13445 }
13446
25f53a85 13447 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
13448 if (stub_entry == NULL)
13449 {
13450 free (stub_name);
6cdc0ccc
AM
13451 error_ret_free_internal:
13452 if (elf_section_data (section)->relocs == NULL)
13453 free (internal_relocs);
13454 error_ret_free_local:
13455 if (local_syms != NULL
13456 && (symtab_hdr->contents
13457 != (unsigned char *) local_syms))
13458 free (local_syms);
b34976b6 13459 return FALSE;
721956f4
AM
13460 }
13461
ad8e1ba5 13462 stub_entry->stub_type = stub_type;
05d0e962
AM
13463 if (stub_type >= ppc_stub_plt_call
13464 && stub_type <= ppc_stub_plt_call_both)
e054468f 13465 {
05d0e962
AM
13466 stub_entry->target_value = sym_value;
13467 stub_entry->target_section = sym_sec;
e054468f
AM
13468 }
13469 else
13470 {
05d0e962
AM
13471 stub_entry->target_value = code_value;
13472 stub_entry->target_section = code_sec;
e054468f 13473 }
721956f4 13474 stub_entry->h = hash;
e054468f 13475 stub_entry->plt_ent = plt_ent;
2d7ad24e
AM
13476 stub_entry->symtype
13477 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
6911b7dc 13478 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95 13479
3d58e1fc
AM
13480 if (hash != NULL
13481 && (hash->elf.root.type == bfd_link_hash_defined
13482 || hash->elf.root.type == bfd_link_hash_defweak))
ee75fd95 13483 htab->stub_globals += 1;
721956f4
AM
13484 }
13485
13486 /* We're done with the internal relocs, free them. */
6cdc0ccc 13487 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 13488 free (internal_relocs);
721956f4 13489 }
6cdc0ccc
AM
13490
13491 if (local_syms != NULL
13492 && symtab_hdr->contents != (unsigned char *) local_syms)
13493 {
13494 if (!info->keep_memory)
13495 free (local_syms);
13496 else
13497 symtab_hdr->contents = (unsigned char *) local_syms;
13498 }
721956f4
AM
13499 }
13500
5c3dead3 13501 /* We may have added some stubs. Find out the new size of the
721956f4 13502 stub sections. */
d4aaa2a0 13503 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13504 {
13505 group->lr_restore = 0;
13506 group->eh_size = 0;
13507 if (group->stub_sec != NULL)
13508 {
13509 asection *stub_sec = group->stub_sec;
13510
13511 if (htab->stub_iteration <= STUB_SHRINK_ITER
13512 || stub_sec->rawsize < stub_sec->size)
13513 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
13514 stub_sec->rawsize = stub_sec->size;
13515 stub_sec->size = 0;
13516 stub_sec->reloc_count = 0;
13517 stub_sec->flags &= ~SEC_RELOC;
13518 }
13519 }
eea6121a 13520
ba21f564
AM
13521 if (htab->stub_iteration <= STUB_SHRINK_ITER
13522 || htab->brlt->rawsize < htab->brlt->size)
13523 htab->brlt->rawsize = htab->brlt->size;
eea6121a 13524 htab->brlt->size = 0;
84f5d08e
AM
13525 htab->brlt->reloc_count = 0;
13526 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 13527 if (htab->relbrlt != NULL)
eea6121a 13528 htab->relbrlt->size = 0;
721956f4 13529
63bc6f6c 13530 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 13531
a4b6fadd
AM
13532 for (group = htab->group; group != NULL; group = group->next)
13533 if (group->needs_save_res)
13534 group->stub_sec->size += htab->sfpr->size;
13535
176a0d42
AM
13536 if (info->emitrelocations
13537 && htab->glink != NULL && htab->glink->size != 0)
13538 {
13539 htab->glink->reloc_count = 1;
13540 htab->glink->flags |= SEC_RELOC;
13541 }
13542
58d180e8
AM
13543 if (htab->glink_eh_frame != NULL
13544 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
2d0d44d5 13545 && htab->glink_eh_frame->output_section->size > 8)
58d180e8 13546 {
2e0ce1c8 13547 size_t size = 0, align = 4;
58d180e8 13548
d4aaa2a0 13549 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13550 if (group->eh_size != 0)
13551 size += (group->eh_size + 17 + align - 1) & -align;
58d180e8 13552 if (htab->glink != NULL && htab->glink->size != 0)
2e0ce1c8 13553 size += (24 + align - 1) & -align;
58d180e8 13554 if (size != 0)
2e0ce1c8
AM
13555 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
13556 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
13557 size = (size + align - 1) & -align;
58d180e8
AM
13558 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
13559 htab->glink_eh_frame->size = size;
13560 }
13561
e7d1c40c 13562 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13563 for (group = htab->group; group != NULL; group = group->next)
13564 if (group->stub_sec != NULL)
691d2e9a
AM
13565 {
13566 int align = abs (htab->params->plt_stub_align);
13567 group->stub_sec->size
13568 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
13569 }
d4aaa2a0
AM
13570
13571 for (group = htab->group; group != NULL; group = group->next)
13572 if (group->stub_sec != NULL
13573 && group->stub_sec->rawsize != group->stub_sec->size
c9301e31 13574 && (htab->stub_iteration <= STUB_SHRINK_ITER
d4aaa2a0 13575 || group->stub_sec->rawsize < group->stub_sec->size))
5c3dead3
AM
13576 break;
13577
d4aaa2a0 13578 if (group == NULL
ba21f564
AM
13579 && (htab->brlt->rawsize == htab->brlt->size
13580 || (htab->stub_iteration > STUB_SHRINK_ITER
13581 && htab->brlt->rawsize > htab->brlt->size))
58d180e8
AM
13582 && (htab->glink_eh_frame == NULL
13583 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
5c3dead3
AM
13584 break;
13585
721956f4 13586 /* Ask the linker to do its stuff. */
e7d1c40c 13587 (*htab->params->layout_sections_again) ();
721956f4
AM
13588 }
13589
da44f4e5
AM
13590 if (htab->glink_eh_frame != NULL
13591 && htab->glink_eh_frame->size != 0)
13592 {
13593 bfd_vma val;
13594 bfd_byte *p, *last_fde;
13595 size_t last_fde_len, size, align, pad;
d4aaa2a0 13596 struct map_stub *group;
da44f4e5 13597
df136d64
AM
13598 /* It is necessary to at least have a rough outline of the
13599 linker generated CIEs and FDEs written before
13600 bfd_elf_discard_info is run, in order for these FDEs to be
13601 indexed in .eh_frame_hdr. */
da44f4e5
AM
13602 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
13603 if (p == NULL)
13604 return FALSE;
13605 htab->glink_eh_frame->contents = p;
13606 last_fde = p;
2e0ce1c8 13607 align = 4;
da44f4e5
AM
13608
13609 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
13610 /* CIE length (rewrite in case little-endian). */
2e0ce1c8 13611 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
da44f4e5 13612 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
2e0ce1c8 13613 p += last_fde_len + 4;
da44f4e5 13614
d4aaa2a0 13615 for (group = htab->group; group != NULL; group = group->next)
df136d64 13616 if (group->eh_size != 0)
da44f4e5 13617 {
df136d64 13618 group->eh_base = p - htab->glink_eh_frame->contents;
da44f4e5 13619 last_fde = p;
df136d64 13620 last_fde_len = ((group->eh_size + 17 + align - 1) & -align) - 4;
da44f4e5 13621 /* FDE length. */
2e0ce1c8 13622 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13623 p += 4;
13624 /* CIE pointer. */
13625 val = p - htab->glink_eh_frame->contents;
13626 bfd_put_32 (htab->elf.dynobj, val, p);
13627 p += 4;
13628 /* Offset to stub section, written later. */
13629 p += 4;
13630 /* stub section size. */
d4aaa2a0 13631 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
da44f4e5
AM
13632 p += 4;
13633 /* Augmentation. */
13634 p += 1;
df136d64
AM
13635 /* Make sure we don't have all nops. This is enough for
13636 elf-eh-frame.c to detect the last non-nop opcode. */
13637 p[group->eh_size - 1] = DW_CFA_advance_loc + 1;
d4aaa2a0 13638 p = last_fde + last_fde_len + 4;
da44f4e5
AM
13639 }
13640 if (htab->glink != NULL && htab->glink->size != 0)
13641 {
13642 last_fde = p;
2e0ce1c8 13643 last_fde_len = ((24 + align - 1) & -align) - 4;
da44f4e5 13644 /* FDE length. */
2e0ce1c8 13645 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13646 p += 4;
13647 /* CIE pointer. */
13648 val = p - htab->glink_eh_frame->contents;
13649 bfd_put_32 (htab->elf.dynobj, val, p);
13650 p += 4;
13651 /* Offset to .glink, written later. */
13652 p += 4;
13653 /* .glink size. */
13654 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
13655 p += 4;
13656 /* Augmentation. */
13657 p += 1;
13658
13659 *p++ = DW_CFA_advance_loc + 1;
13660 *p++ = DW_CFA_register;
13661 *p++ = 65;
9f08fa5c 13662 *p++ = htab->opd_abi ? 12 : 0;
15a3a14f 13663 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
da44f4e5
AM
13664 *p++ = DW_CFA_restore_extended;
13665 *p++ = 65;
2e0ce1c8 13666 p += ((24 + align - 1) & -align) - 24;
da44f4e5
AM
13667 }
13668 /* Subsume any padding into the last FDE if user .eh_frame
13669 sections are aligned more than glink_eh_frame. Otherwise any
13670 zero padding will be seen as a terminator. */
2e0ce1c8 13671 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
da44f4e5 13672 size = p - htab->glink_eh_frame->contents;
2e0ce1c8 13673 pad = ((size + align - 1) & -align) - size;
da44f4e5
AM
13674 htab->glink_eh_frame->size = size + pad;
13675 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
13676 }
13677
d969d15f
AM
13678 maybe_strip_output (info, htab->brlt);
13679 if (htab->glink_eh_frame != NULL)
13680 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 13681
b34976b6 13682 return TRUE;
721956f4
AM
13683}
13684
13685/* Called after we have determined section placement. If sections
805fc799 13686 move, we'll be called again. Provide a value for TOCstart. */
721956f4 13687
805fc799 13688bfd_vma
1c865ab2 13689ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 13690{
805fc799 13691 asection *s;
a27e685f 13692 bfd_vma TOCstart, adjust;
721956f4 13693
43417696
AM
13694 if (info != NULL)
13695 {
13696 struct elf_link_hash_entry *h;
13697 struct elf_link_hash_table *htab = elf_hash_table (info);
13698
13699 if (is_elf_hash_table (htab)
13700 && htab->hgot != NULL)
13701 h = htab->hgot;
13702 else
13703 {
13704 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
13705 if (is_elf_hash_table (htab))
13706 htab->hgot = h;
13707 }
13708 if (h != NULL
13709 && h->root.type == bfd_link_hash_defined
13710 && !h->root.linker_def
13711 && (!is_elf_hash_table (htab)
13712 || h->def_regular))
13713 {
ed7007c1 13714 TOCstart = defined_sym_val (h) - TOC_BASE_OFF;
43417696
AM
13715 _bfd_set_gp_value (obfd, TOCstart);
13716 return TOCstart;
13717 }
13718 }
13719
805fc799
AM
13720 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
13721 order. The TOC starts where the first of these sections starts. */
13722 s = bfd_get_section_by_name (obfd, ".got");
e054468f 13723 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13724 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 13725 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13726 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 13727 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13728 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 13729 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
13730 {
13731 /* This may happen for
13732 o references to TOC base (SYM@toc / TOC[tc0]) without a
13733 .toc directive
13734 o bad linker script
13735 o --gc-sections and empty TOC sections
13736
13737 FIXME: Warn user? */
13738
13739 /* Look for a likely section. We probably won't even be
13740 using TOCstart. */
13741 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13742 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
13743 | SEC_EXCLUDE))
805fc799
AM
13744 == (SEC_ALLOC | SEC_SMALL_DATA))
13745 break;
721956f4 13746 if (s == NULL)
805fc799 13747 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13748 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
13749 == (SEC_ALLOC | SEC_SMALL_DATA))
13750 break;
721956f4 13751 if (s == NULL)
805fc799 13752 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13753 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
13754 == SEC_ALLOC)
805fc799 13755 break;
721956f4 13756 if (s == NULL)
805fc799 13757 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13758 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
13759 break;
13760 }
721956f4 13761
805fc799
AM
13762 TOCstart = 0;
13763 if (s != NULL)
13764 TOCstart = s->output_section->vma + s->output_offset;
721956f4 13765
a27e685f
AM
13766 /* Force alignment. */
13767 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
13768 TOCstart -= adjust;
1c865ab2
AM
13769 _bfd_set_gp_value (obfd, TOCstart);
13770
810d4e75 13771 if (info != NULL && s != NULL)
1c865ab2
AM
13772 {
13773 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13774
810d4e75
AM
13775 if (htab != NULL)
13776 {
13777 if (htab->elf.hgot != NULL)
13778 {
a27e685f 13779 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
810d4e75
AM
13780 htab->elf.hgot->root.u.def.section = s;
13781 }
13782 }
13783 else
1c865ab2 13784 {
810d4e75
AM
13785 struct bfd_link_hash_entry *bh = NULL;
13786 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
a27e685f
AM
13787 s, TOC_BASE_OFF - adjust,
13788 NULL, FALSE, FALSE, &bh);
1c865ab2
AM
13789 }
13790 }
805fc799 13791 return TOCstart;
721956f4
AM
13792}
13793
a345bc8d 13794/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
49c09209 13795 write out any global entry stubs, and PLT relocations. */
a345bc8d
AM
13796
13797static bfd_boolean
49c09209 13798build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
a345bc8d
AM
13799{
13800 struct bfd_link_info *info;
13801 struct ppc_link_hash_table *htab;
49c09209 13802 struct plt_entry *ent;
a345bc8d
AM
13803 asection *s;
13804
13805 if (h->root.type == bfd_link_hash_indirect)
13806 return TRUE;
13807
49c09209
AM
13808 info = inf;
13809 htab = ppc_hash_table (info);
13810 if (htab == NULL)
13811 return FALSE;
13812
13813 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13814 if (ent->plt.offset != (bfd_vma) -1)
13815 {
13816 /* This symbol has an entry in the procedure linkage
13817 table. Set it up. */
13818 Elf_Internal_Rela rela;
2d7ad24e 13819 asection *plt, *relplt;
49c09209
AM
13820 bfd_byte *loc;
13821
13822 if (!htab->elf.dynamic_sections_created
13823 || h->dynindx == -1)
13824 {
13825 if (!(h->def_regular
13826 && (h->root.type == bfd_link_hash_defined
13827 || h->root.type == bfd_link_hash_defweak)))
13828 continue;
2d7ad24e
AM
13829 if (h->type == STT_GNU_IFUNC)
13830 {
13831 plt = htab->elf.iplt;
13832 relplt = htab->elf.irelplt;
13833 htab->local_ifunc_resolver = 1;
13834 if (htab->opd_abi)
13835 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13836 else
13837 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13838 }
49c09209 13839 else
2d7ad24e
AM
13840 {
13841 plt = htab->pltlocal;
13842 if (bfd_link_pic (info))
13843 {
13844 relplt = htab->relpltlocal;
13845 if (htab->opd_abi)
13846 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13847 else
13848 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13849 }
13850 else
13851 relplt = NULL;
13852 }
ed7007c1 13853 rela.r_addend = defined_sym_val (h) + ent->addend;
2d7ad24e
AM
13854
13855 if (relplt == NULL)
13856 {
13857 loc = plt->contents + ent->plt.offset;
13858 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
13859 if (htab->opd_abi)
13860 {
13861 bfd_vma toc = elf_gp (info->output_bfd);
13862 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
13863 bfd_put_64 (info->output_bfd, toc, loc + 8);
13864 }
13865 }
13866 else
13867 {
13868 rela.r_offset = (plt->output_section->vma
13869 + plt->output_offset
13870 + ent->plt.offset);
13871 loc = relplt->contents + (relplt->reloc_count++
13872 * sizeof (Elf64_External_Rela));
13873 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13874 }
49c09209
AM
13875 }
13876 else
13877 {
13878 rela.r_offset = (htab->elf.splt->output_section->vma
13879 + htab->elf.splt->output_offset
13880 + ent->plt.offset);
13881 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13882 rela.r_addend = ent->addend;
13883 loc = (htab->elf.srelplt->contents
13884 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
13885 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
13886 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
13887 htab->maybe_local_ifunc_resolver = 1;
2d7ad24e 13888 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
49c09209 13889 }
49c09209
AM
13890 }
13891
a345bc8d
AM
13892 if (!h->pointer_equality_needed)
13893 return TRUE;
13894
13895 if (h->def_regular)
13896 return TRUE;
13897
9e390558 13898 s = htab->global_entry;
49c09209
AM
13899 if (s == NULL || s->size == 0)
13900 return TRUE;
13901
13902 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13903 if (ent->plt.offset != (bfd_vma) -1
13904 && ent->addend == 0)
a345bc8d
AM
13905 {
13906 bfd_byte *p;
13907 asection *plt;
13908 bfd_vma off;
13909
a345bc8d 13910 p = s->contents + h->root.u.def.value;
33e44f2e 13911 plt = htab->elf.splt;
a345bc8d
AM
13912 if (!htab->elf.dynamic_sections_created
13913 || h->dynindx == -1)
2d7ad24e
AM
13914 {
13915 if (h->type == STT_GNU_IFUNC)
13916 plt = htab->elf.iplt;
13917 else
13918 plt = htab->pltlocal;
13919 }
49c09209 13920 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
a345bc8d
AM
13921 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
13922
13923 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
13924 {
13925 info->callbacks->einfo
c1c8c1ef 13926 (_("%P: linkage table error against `%pT'\n"),
a345bc8d
AM
13927 h->root.root.string);
13928 bfd_set_error (bfd_error_bad_value);
13929 htab->stub_error = TRUE;
13930 }
13931
7341d5e2
AM
13932 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13933 if (htab->params->emit_stub_syms)
13934 {
13935 size_t len = strlen (h->root.root.string);
13936 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13937
13938 if (name == NULL)
13939 return FALSE;
13940
13941 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13942 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13943 if (h == NULL)
13944 return FALSE;
13945 if (h->root.type == bfd_link_hash_new)
13946 {
13947 h->root.type = bfd_link_hash_defined;
13948 h->root.u.def.section = s;
13949 h->root.u.def.value = p - s->contents;
13950 h->ref_regular = 1;
13951 h->def_regular = 1;
13952 h->ref_regular_nonweak = 1;
13953 h->forced_local = 1;
13954 h->non_elf = 0;
2ec55de3 13955 h->root.linker_def = 1;
7341d5e2
AM
13956 }
13957 }
13958
a345bc8d
AM
13959 if (PPC_HA (off) != 0)
13960 {
13961 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
13962 p += 4;
13963 }
13964 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
13965 p += 4;
13966 bfd_put_32 (s->owner, MTCTR_R12, p);
13967 p += 4;
407aa07c 13968 bfd_put_32 (s->owner, BCTR, p);
a345bc8d
AM
13969 break;
13970 }
13971 return TRUE;
13972}
13973
49c09209
AM
13974/* Write PLT relocs for locals. */
13975
13976static bfd_boolean
13977write_plt_relocs_for_local_syms (struct bfd_link_info *info)
13978{
13979 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13980 bfd *ibfd;
13981
13982 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
13983 {
13984 struct got_entry **lgot_ents, **end_lgot_ents;
13985 struct plt_entry **local_plt, **lplt, **end_local_plt;
13986 Elf_Internal_Shdr *symtab_hdr;
13987 bfd_size_type locsymcount;
13988 Elf_Internal_Sym *local_syms = NULL;
13989 struct plt_entry *ent;
13990
13991 if (!is_ppc64_elf (ibfd))
13992 continue;
13993
13994 lgot_ents = elf_local_got_ents (ibfd);
13995 if (!lgot_ents)
13996 continue;
13997
13998 symtab_hdr = &elf_symtab_hdr (ibfd);
13999 locsymcount = symtab_hdr->sh_info;
14000 end_lgot_ents = lgot_ents + locsymcount;
14001 local_plt = (struct plt_entry **) end_lgot_ents;
14002 end_local_plt = local_plt + locsymcount;
14003 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
14004 for (ent = *lplt; ent != NULL; ent = ent->next)
14005 if (ent->plt.offset != (bfd_vma) -1)
14006 {
14007 Elf_Internal_Sym *sym;
14008 asection *sym_sec;
14009 asection *plt, *relplt;
14010 bfd_byte *loc;
14011 bfd_vma val;
49c09209
AM
14012
14013 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
14014 lplt - local_plt, ibfd))
14015 {
14016 if (local_syms != NULL
14017 && symtab_hdr->contents != (unsigned char *) local_syms)
14018 free (local_syms);
14019 return FALSE;
14020 }
14021
14022 val = sym->st_value + ent->addend;
ba85c15d
AM
14023 if (ELF_ST_TYPE (sym->st_info) != STT_GNU_IFUNC)
14024 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
49c09209
AM
14025 if (sym_sec != NULL && sym_sec->output_section != NULL)
14026 val += sym_sec->output_offset + sym_sec->output_section->vma;
14027
2d7ad24e
AM
14028 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14029 {
14030 htab->local_ifunc_resolver = 1;
14031 plt = htab->elf.iplt;
14032 relplt = htab->elf.irelplt;
14033 }
14034 else
14035 {
14036 plt = htab->pltlocal;
14037 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
14038 }
49c09209 14039
2d7ad24e
AM
14040 if (relplt == NULL)
14041 {
14042 loc = plt->contents + ent->plt.offset;
14043 bfd_put_64 (info->output_bfd, val, loc);
14044 if (htab->opd_abi)
14045 {
14046 bfd_vma toc = elf_gp (ibfd);
14047 bfd_put_64 (info->output_bfd, toc, loc + 8);
14048 }
14049 }
49c09209 14050 else
2d7ad24e
AM
14051 {
14052 Elf_Internal_Rela rela;
14053 rela.r_offset = (ent->plt.offset
14054 + plt->output_offset
14055 + plt->output_section->vma);
14056 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14057 {
14058 if (htab->opd_abi)
14059 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
14060 else
14061 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14062 }
14063 else
14064 {
14065 if (htab->opd_abi)
14066 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
14067 else
14068 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14069 }
14070 rela.r_addend = val;
14071 loc = relplt->contents + (relplt->reloc_count++
14072 * sizeof (Elf64_External_Rela));
14073 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
14074 }
49c09209
AM
14075 }
14076
14077 if (local_syms != NULL
14078 && symtab_hdr->contents != (unsigned char *) local_syms)
14079 {
14080 if (!info->keep_memory)
14081 free (local_syms);
14082 else
14083 symtab_hdr->contents = (unsigned char *) local_syms;
14084 }
14085 }
14086 return TRUE;
14087}
14088
721956f4
AM
14089/* Build all the stubs associated with the current output file.
14090 The stubs are kept in a hash table attached to the main linker
14091 hash table. This function is called via gldelf64ppc_finish. */
14092
b34976b6 14093bfd_boolean
e7d1c40c 14094ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 14095 char **stats)
5d1634d7
AM
14096{
14097 struct ppc_link_hash_table *htab = ppc_hash_table (info);
a4b6fadd 14098 struct map_stub *group;
721956f4 14099 asection *stub_sec;
5d1634d7 14100 bfd_byte *p;
e717da7e 14101 int stub_sec_count = 0;
5d1634d7 14102
4dfe6ac6
NC
14103 if (htab == NULL)
14104 return FALSE;
14105
eea6121a 14106 /* Allocate memory to hold the linker stubs. */
d4aaa2a0 14107 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
14108 {
14109 group->eh_size = 0;
14110 group->lr_restore = 0;
14111 if ((stub_sec = group->stub_sec) != NULL
14112 && stub_sec->size != 0)
14113 {
14114 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd,
14115 stub_sec->size);
14116 if (stub_sec->contents == NULL)
14117 return FALSE;
14118 stub_sec->size = 0;
14119 }
14120 }
5d1634d7 14121
23eb7e01 14122 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 14123 {
9f951329 14124 unsigned int indx;
ad8e1ba5 14125 bfd_vma plt0;
9f951329 14126
721956f4 14127 /* Build the .glink plt call stub. */
e7d1c40c 14128 if (htab->params->emit_stub_syms)
97b639ba
AM
14129 {
14130 struct elf_link_hash_entry *h;
468392fb
AM
14131 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
14132 TRUE, FALSE, FALSE);
97b639ba
AM
14133 if (h == NULL)
14134 return FALSE;
14135 if (h->root.type == bfd_link_hash_new)
14136 {
14137 h->root.type = bfd_link_hash_defined;
14138 h->root.u.def.section = htab->glink;
ee4bf8d2 14139 h->root.u.def.value = 8;
f5385ebf
AM
14140 h->ref_regular = 1;
14141 h->def_regular = 1;
14142 h->ref_regular_nonweak = 1;
14143 h->forced_local = 1;
14144 h->non_elf = 0;
2ec55de3 14145 h->root.linker_def = 1;
97b639ba
AM
14146 }
14147 }
33e44f2e
AM
14148 plt0 = (htab->elf.splt->output_section->vma
14149 + htab->elf.splt->output_offset
14150 - 16);
176a0d42
AM
14151 if (info->emitrelocations)
14152 {
14153 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
14154 if (r == NULL)
14155 return FALSE;
14156 r->r_offset = (htab->glink->output_offset
14157 + htab->glink->output_section->vma);
14158 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
14159 r->r_addend = plt0;
14160 }
4ce794b7 14161 p = htab->glink->contents;
176a0d42 14162 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
14163 bfd_put_64 (htab->glink->owner, plt0, p);
14164 p += 8;
b9e5796b
AM
14165 if (htab->opd_abi)
14166 {
14167 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
14168 p += 4;
14169 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
14170 p += 4;
14171 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
14172 p += 4;
14173 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
14174 p += 4;
14175 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
14176 p += 4;
14177 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
14178 p += 4;
14179 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
14180 p += 4;
14181 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
14182 p += 4;
14183 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
14184 p += 4;
14185 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
14186 p += 4;
14187 }
14188 else
14189 {
14190 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
14191 p += 4;
14192 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
14193 p += 4;
14194 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
14195 p += 4;
f378ab09
AM
14196 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
14197 p += 4;
b9e5796b
AM
14198 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
14199 p += 4;
14200 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
14201 p += 4;
14202 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
14203 p += 4;
14204 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
14205 p += 4;
14206 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
14207 p += 4;
14208 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
14209 p += 4;
14210 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
14211 p += 4;
14212 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
14213 p += 4;
14214 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
14215 p += 4;
14216 }
407aa07c
AM
14217 bfd_put_32 (htab->glink->owner, BCTR, p);
14218 p += 4;
c75bc4f7 14219 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
ad8e1ba5 14220
9f951329
AM
14221 /* Build the .glink lazy link call stubs. */
14222 indx = 0;
9e390558 14223 while (p < htab->glink->contents + htab->glink->size)
9f951329 14224 {
b9e5796b 14225 if (htab->opd_abi)
9f951329 14226 {
b9e5796b
AM
14227 if (indx < 0x8000)
14228 {
14229 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
14230 p += 4;
14231 }
14232 else
14233 {
14234 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
14235 p += 4;
14236 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
14237 p);
14238 p += 4;
14239 }
9f951329 14240 }
4ce794b7 14241 bfd_put_32 (htab->glink->owner,
ee4bf8d2 14242 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 14243 indx++;
9f951329
AM
14244 p += 4;
14245 }
5d1634d7 14246 }
5d1634d7 14247
49c09209
AM
14248 /* Build .glink global entry stubs, and PLT relocs for globals. */
14249 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
14250
14251 if (!write_plt_relocs_for_local_syms (info))
14252 return FALSE;
9e390558 14253
7341d5e2 14254 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 14255 {
4ce794b7 14256 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 14257 htab->brlt->size);
4ce794b7 14258 if (htab->brlt->contents == NULL)
b34976b6 14259 return FALSE;
721956f4 14260 }
ee75fd95 14261 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
14262 {
14263 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 14264 htab->relbrlt->size);
63bc6f6c
AM
14265 if (htab->relbrlt->contents == NULL)
14266 return FALSE;
14267 }
5d1634d7 14268
721956f4
AM
14269 /* Build the stubs as directed by the stub hash table. */
14270 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 14271
a4b6fadd
AM
14272 for (group = htab->group; group != NULL; group = group->next)
14273 if (group->needs_save_res)
7dda8d3c 14274 group->stub_sec->size += htab->sfpr->size;
a4b6fadd 14275
aa8a7074
AM
14276 if (htab->relbrlt != NULL)
14277 htab->relbrlt->reloc_count = 0;
14278
e7d1c40c 14279 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
14280 for (group = htab->group; group != NULL; group = group->next)
14281 if ((stub_sec = group->stub_sec) != NULL)
691d2e9a
AM
14282 {
14283 int align = abs (htab->params->plt_stub_align);
14284 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
14285 }
794e51c0 14286
7dda8d3c
AM
14287 for (group = htab->group; group != NULL; group = group->next)
14288 if (group->needs_save_res)
14289 {
14290 stub_sec = group->stub_sec;
14291 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
14292 htab->sfpr->contents, htab->sfpr->size);
14293 if (htab->params->emit_stub_syms)
14294 {
14295 unsigned int i;
14296
14297 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
14298 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
14299 return FALSE;
14300 }
14301 }
14302
df136d64
AM
14303 if (htab->glink_eh_frame != NULL
14304 && htab->glink_eh_frame->size != 0)
14305 {
14306 bfd_vma val;
14307 size_t align = 4;
14308
14309 p = htab->glink_eh_frame->contents;
14310 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
14311
14312 for (group = htab->group; group != NULL; group = group->next)
14313 if (group->eh_size != 0)
14314 {
14315 /* Offset to stub section. */
14316 val = (group->stub_sec->output_section->vma
14317 + group->stub_sec->output_offset);
14318 val -= (htab->glink_eh_frame->output_section->vma
14319 + htab->glink_eh_frame->output_offset
14320 + (p + 8 - htab->glink_eh_frame->contents));
14321 if (val + 0x80000000 > 0xffffffff)
14322 {
14323 _bfd_error_handler
14324 (_("%s offset too large for .eh_frame sdata4 encoding"),
14325 group->stub_sec->name);
14326 return FALSE;
14327 }
14328 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14329 p += (group->eh_size + 17 + 3) & -4;
14330 }
14331 if (htab->glink != NULL && htab->glink->size != 0)
14332 {
14333 /* Offset to .glink. */
14334 val = (htab->glink->output_section->vma
14335 + htab->glink->output_offset
14336 + 8);
14337 val -= (htab->glink_eh_frame->output_section->vma
14338 + htab->glink_eh_frame->output_offset
14339 + (p + 8 - htab->glink_eh_frame->contents));
14340 if (val + 0x80000000 > 0xffffffff)
14341 {
14342 _bfd_error_handler
14343 (_("%s offset too large for .eh_frame sdata4 encoding"),
14344 htab->glink->name);
14345 return FALSE;
14346 }
14347 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14348 p += (24 + align - 1) & -align;
14349 }
14350 }
14351
d4aaa2a0
AM
14352 for (group = htab->group; group != NULL; group = group->next)
14353 if ((stub_sec = group->stub_sec) != NULL)
e717da7e
AM
14354 {
14355 stub_sec_count += 1;
c9301e31
AM
14356 if (stub_sec->rawsize != stub_sec->size
14357 && (htab->stub_iteration <= STUB_SHRINK_ITER
14358 || stub_sec->rawsize < stub_sec->size))
e717da7e
AM
14359 break;
14360 }
5d1634d7 14361
25516cc5 14362 if (group != NULL)
5d1634d7 14363 {
b34976b6 14364 htab->stub_error = TRUE;
cf97bcb0 14365 _bfd_error_handler (_("stubs don't match calculated size"));
5d1634d7 14366 }
721956f4 14367
d2a300cf
AM
14368 if (htab->stub_error)
14369 return FALSE;
14370
14371 if (stats != NULL)
14372 {
db84fff3 14373 size_t len;
d2a300cf
AM
14374 *stats = bfd_malloc (500);
14375 if (*stats == NULL)
14376 return FALSE;
14377
db84fff3
AM
14378 len = sprintf (*stats,
14379 ngettext ("linker stubs in %u group\n",
14380 "linker stubs in %u groups\n",
14381 stub_sec_count),
14382 stub_sec_count);
05d0e962
AM
14383 sprintf (*stats + len, _(" branch %lu\n"
14384 " branch toc adj %lu\n"
14385 " branch notoc %lu\n"
14386 " branch both %lu\n"
14387 " long branch %lu\n"
14388 " long toc adj %lu\n"
14389 " long notoc %lu\n"
14390 " long both %lu\n"
14391 " plt call %lu\n"
14392 " plt call save %lu\n"
14393 " plt call notoc %lu\n"
14394 " plt call both %lu\n"
14395 " global entry %lu"),
4ce794b7
AM
14396 htab->stub_count[ppc_stub_long_branch - 1],
14397 htab->stub_count[ppc_stub_long_branch_r2off - 1],
05d0e962
AM
14398 htab->stub_count[ppc_stub_long_branch_notoc - 1],
14399 htab->stub_count[ppc_stub_long_branch_both - 1],
4ce794b7
AM
14400 htab->stub_count[ppc_stub_plt_branch - 1],
14401 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
05d0e962
AM
14402 htab->stub_count[ppc_stub_plt_branch_notoc - 1],
14403 htab->stub_count[ppc_stub_plt_branch_both - 1],
794e51c0 14404 htab->stub_count[ppc_stub_plt_call - 1],
7341d5e2 14405 htab->stub_count[ppc_stub_plt_call_r2save - 1],
05d0e962
AM
14406 htab->stub_count[ppc_stub_plt_call_notoc - 1],
14407 htab->stub_count[ppc_stub_plt_call_both - 1],
7341d5e2 14408 htab->stub_count[ppc_stub_global_entry - 1]);
d2a300cf
AM
14409 }
14410 return TRUE;
5bd4f169
AM
14411}
14412
60124e18
AM
14413/* What to do when ld finds relocations against symbols defined in
14414 discarded sections. */
14415
14416static unsigned int
14417ppc64_elf_action_discarded (asection *sec)
14418{
14419 if (strcmp (".opd", sec->name) == 0)
14420 return 0;
14421
14422 if (strcmp (".toc", sec->name) == 0)
14423 return 0;
14424
bce50a28
JJ
14425 if (strcmp (".toc1", sec->name) == 0)
14426 return 0;
14427
60124e18
AM
14428 return _bfd_elf_default_action_discarded (sec);
14429}
14430
e59a1001
AM
14431/* These are the dynamic relocations supported by glibc. */
14432
14433static bfd_boolean
14434ppc64_glibc_dynamic_reloc (enum elf_ppc64_reloc_type r_type)
14435{
14436 switch (r_type)
14437 {
14438 case R_PPC64_RELATIVE:
14439 case R_PPC64_NONE:
14440 case R_PPC64_ADDR64:
14441 case R_PPC64_GLOB_DAT:
14442 case R_PPC64_IRELATIVE:
14443 case R_PPC64_JMP_IREL:
14444 case R_PPC64_JMP_SLOT:
14445 case R_PPC64_DTPMOD64:
14446 case R_PPC64_DTPREL64:
14447 case R_PPC64_TPREL64:
14448 case R_PPC64_TPREL16_LO_DS:
14449 case R_PPC64_TPREL16_DS:
14450 case R_PPC64_TPREL16:
14451 case R_PPC64_TPREL16_LO:
14452 case R_PPC64_TPREL16_HI:
14453 case R_PPC64_TPREL16_HIGH:
14454 case R_PPC64_TPREL16_HA:
14455 case R_PPC64_TPREL16_HIGHA:
14456 case R_PPC64_TPREL16_HIGHER:
14457 case R_PPC64_TPREL16_HIGHEST:
14458 case R_PPC64_TPREL16_HIGHERA:
14459 case R_PPC64_TPREL16_HIGHESTA:
14460 case R_PPC64_ADDR16_LO_DS:
14461 case R_PPC64_ADDR16_LO:
14462 case R_PPC64_ADDR16_HI:
14463 case R_PPC64_ADDR16_HIGH:
14464 case R_PPC64_ADDR16_HA:
14465 case R_PPC64_ADDR16_HIGHA:
14466 case R_PPC64_REL30:
14467 case R_PPC64_COPY:
14468 case R_PPC64_UADDR64:
14469 case R_PPC64_UADDR32:
14470 case R_PPC64_ADDR32:
14471 case R_PPC64_ADDR24:
14472 case R_PPC64_ADDR16:
14473 case R_PPC64_UADDR16:
14474 case R_PPC64_ADDR16_DS:
14475 case R_PPC64_ADDR16_HIGHER:
14476 case R_PPC64_ADDR16_HIGHEST:
14477 case R_PPC64_ADDR16_HIGHERA:
14478 case R_PPC64_ADDR16_HIGHESTA:
14479 case R_PPC64_ADDR14:
14480 case R_PPC64_ADDR14_BRTAKEN:
14481 case R_PPC64_ADDR14_BRNTAKEN:
14482 case R_PPC64_REL32:
14483 case R_PPC64_REL64:
14484 return TRUE;
14485
14486 default:
14487 return FALSE;
14488 }
14489}
14490
5bd4f169
AM
14491/* The RELOCATE_SECTION function is called by the ELF backend linker
14492 to handle the relocations for a section.
14493
14494 The relocs are always passed as Rela structures; if the section
14495 actually uses Rel structures, the r_addend field will always be
14496 zero.
14497
14498 This function is responsible for adjust the section contents as
14499 necessary, and (if using Rela relocs and generating a
1049f94e 14500 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
14501 necessary.
14502
14503 This function does not have to worry about setting the reloc
14504 address or the reloc symbol index.
14505
14506 LOCAL_SYMS is a pointer to the swapped in local symbols.
14507
14508 LOCAL_SECTIONS is an array giving the section in the input file
14509 corresponding to the st_shndx field of each local symbol.
14510
14511 The global hash table entry for the global symbols can be found
14512 via elf_sym_hashes (input_bfd).
14513
1049f94e 14514 When generating relocatable output, this function must handle
5bd4f169
AM
14515 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
14516 going to be the section symbol corresponding to the output
14517 section, which means that the addend must be adjusted
14518 accordingly. */
14519
b34976b6 14520static bfd_boolean
4ce794b7
AM
14521ppc64_elf_relocate_section (bfd *output_bfd,
14522 struct bfd_link_info *info,
14523 bfd *input_bfd,
14524 asection *input_section,
14525 bfd_byte *contents,
14526 Elf_Internal_Rela *relocs,
14527 Elf_Internal_Sym *local_syms,
14528 asection **local_sections)
5bd4f169 14529{
65f38f15 14530 struct ppc_link_hash_table *htab;
5bd4f169
AM
14531 Elf_Internal_Shdr *symtab_hdr;
14532 struct elf_link_hash_entry **sym_hashes;
5bd4f169 14533 Elf_Internal_Rela *rel;
c316a17c 14534 Elf_Internal_Rela *wrel;
5bd4f169 14535 Elf_Internal_Rela *relend;
411e1bfb
AM
14536 Elf_Internal_Rela outrel;
14537 bfd_byte *loc;
411e1bfb 14538 struct got_entry **local_got_ents;
5bd4f169 14539 bfd_vma TOCstart;
b34976b6
AM
14540 bfd_boolean ret = TRUE;
14541 bfd_boolean is_opd;
794e51c0
AM
14542 /* Assume 'at' branch hints. */
14543 bfd_boolean is_isa_v2 = TRUE;
e59a1001 14544 bfd_boolean warned_dynamic = FALSE;
95f0d0d2 14545 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
5bd4f169 14546
65f38f15 14547 /* Initialize howto table if needed. */
5bd4f169 14548 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
14549 ppc_howto_init ();
14550
65f38f15 14551 htab = ppc_hash_table (info);
4dfe6ac6
NC
14552 if (htab == NULL)
14553 return FALSE;
ee75fd95
AM
14554
14555 /* Don't relocate stub sections. */
e7d1c40c 14556 if (input_section->owner == htab->params->stub_bfd)
ee75fd95
AM
14557 return TRUE;
14558
7af5d5c4
AM
14559 if (!is_ppc64_elf (input_bfd))
14560 {
14561 bfd_set_error (bfd_error_wrong_format);
14562 return FALSE;
14563 }
0ffa91dd 14564
411e1bfb 14565 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 14566 TOCstart = elf_gp (output_bfd);
0ffa91dd 14567 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 14568 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 14569 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 14570
c316a17c 14571 rel = wrel = relocs;
5bd4f169 14572 relend = relocs + input_section->reloc_count;
c316a17c 14573 for (; rel < relend; wrel++, rel++)
5bd4f169 14574 {
04c9666a 14575 enum elf_ppc64_reloc_type r_type;
31c76678 14576 bfd_vma addend;
5bd4f169
AM
14577 bfd_reloc_status_type r;
14578 Elf_Internal_Sym *sym;
14579 asection *sec;
039b3fef
AM
14580 struct elf_link_hash_entry *h_elf;
14581 struct ppc_link_hash_entry *h;
14582 struct ppc_link_hash_entry *fdh;
5bd4f169 14583 const char *sym_name;
0d4792f7 14584 unsigned long r_symndx, toc_symndx;
3a71aa26 14585 bfd_vma toc_addend;
f961d9dd
AM
14586 unsigned char tls_mask, tls_gd, tls_type;
14587 unsigned char sym_type;
5bd4f169 14588 bfd_vma relocation;
23cedd1d 14589 bfd_boolean unresolved_reloc, save_unresolved_reloc;
b34976b6 14590 bfd_boolean warned;
bc30df16 14591 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 14592 unsigned int insn;
e11840f9 14593 unsigned int mask;
721956f4
AM
14594 struct ppc_stub_hash_entry *stub_entry;
14595 bfd_vma max_br_offset;
14596 bfd_vma from;
c316a17c 14597 Elf_Internal_Rela orig_rel;
b80eed39
AM
14598 reloc_howto_type *howto;
14599 struct reloc_howto_struct alt_howto;
4a421c53
AM
14600 uint64_t pinsn;
14601 bfd_vma offset;
5bd4f169 14602
c316a17c
AM
14603 again:
14604 orig_rel = *rel;
14605
4ce794b7 14606 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 14607 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
14608
14609 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
14610 symbol of the previous ADDR64 reloc. The symbol gives us the
14611 proper TOC base to use. */
14612 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
c316a17c
AM
14613 && wrel != relocs
14614 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
ee87f2da 14615 && is_opd)
c316a17c 14616 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
ee87f2da 14617
4ce794b7
AM
14618 sym = NULL;
14619 sec = NULL;
039b3fef 14620 h_elf = NULL;
4ce794b7 14621 sym_name = NULL;
b34976b6
AM
14622 unresolved_reloc = FALSE;
14623 warned = FALSE;
65f38f15 14624
0b13192e 14625 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
14626 {
14627 /* It's a local symbol. */
74f0fb50 14628 struct _opd_sec_data *opd;
4025353c 14629
5bd4f169
AM
14630 sym = local_syms + r_symndx;
14631 sec = local_sections[r_symndx];
26c61ae5 14632 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 14633 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 14634 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
14635 opd = get_opd_info (sec);
14636 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 14637 {
51aecdc5
AM
14638 long adjust = opd->adjust[OPD_NDX (sym->st_value
14639 + rel->r_addend)];
4025353c
AM
14640 if (adjust == -1)
14641 relocation = 0;
14642 else
4cc603a5
AM
14643 {
14644 /* If this is a relocation against the opd section sym
14645 and we have edited .opd, adjust the reloc addend so
14646 that ld -r and ld --emit-relocs output is correct.
14647 If it is a reloc against some other .opd symbol,
14648 then the symbol value will be adjusted later. */
14649 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
14650 rel->r_addend += adjust;
14651 else
14652 relocation += adjust;
14653 }
1e2f5b6e 14654 }
5bd4f169
AM
14655 }
14656 else
14657 {
62d887d4
L
14658 bfd_boolean ignored;
14659
b2a8e766
AM
14660 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
14661 r_symndx, symtab_hdr, sym_hashes,
039b3fef 14662 h_elf, sec, relocation,
62d887d4 14663 unresolved_reloc, warned, ignored);
039b3fef
AM
14664 sym_name = h_elf->root.root.string;
14665 sym_type = h_elf->type;
b69fdb4e
AM
14666 if (sec != NULL
14667 && sec->owner == output_bfd
14668 && strcmp (sec->name, ".opd") == 0)
14669 {
14670 /* This is a symbol defined in a linker script. All
14671 such are defined in output sections, even those
14672 defined by simple assignment from a symbol defined in
14673 an input section. Transfer the symbol to an
14674 appropriate input .opd section, so that a branch to
14675 this symbol will be mapped to the location specified
14676 by the opd entry. */
14677 struct bfd_link_order *lo;
14678 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
14679 if (lo->type == bfd_indirect_link_order)
14680 {
14681 asection *isec = lo->u.indirect.section;
14682 if (h_elf->root.u.def.value >= isec->output_offset
14683 && h_elf->root.u.def.value < (isec->output_offset
14684 + isec->size))
14685 {
14686 h_elf->root.u.def.value -= isec->output_offset;
14687 h_elf->root.u.def.section = isec;
14688 sec = isec;
14689 break;
14690 }
14691 }
14692 }
5bd4f169 14693 }
ed7007c1 14694 h = ppc_elf_hash_entry (h_elf);
5bd4f169 14695
dbaa2011 14696 if (sec != NULL && discarded_section (sec))
c316a17c
AM
14697 {
14698 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
14699 input_bfd, input_section,
0930cb30 14700 contents, rel->r_offset);
c316a17c
AM
14701 wrel->r_offset = rel->r_offset;
14702 wrel->r_info = 0;
14703 wrel->r_addend = 0;
14704
14705 /* For ld -r, remove relocations in debug sections against
dcd2b8a0 14706 symbols defined in discarded sections. Not done for
c316a17c
AM
14707 non-debug to preserve relocs in .eh_frame which the
14708 eh_frame editing code expects to be present. */
14709 if (bfd_link_relocatable (info)
14710 && (input_section->flags & SEC_DEBUGGING))
14711 wrel--;
14712
14713 continue;
14714 }
ab96bf03 14715
0e1862bb 14716 if (bfd_link_relocatable (info))
c316a17c 14717 goto copy_reloc;
ab96bf03 14718
f40da81b
AM
14719 if (h != NULL && &h->elf == htab->elf.hgot)
14720 {
6f20ed8a 14721 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
f40da81b
AM
14722 sec = bfd_abs_section_ptr;
14723 unresolved_reloc = FALSE;
14724 }
14725
951fd09b
AM
14726 /* TLS optimizations. Replace instruction sequences and relocs
14727 based on information we collected in tls_optimize. We edit
14728 RELOCS so that --emit-relocs will output something sensible
14729 for the final instruction stream. */
14730 tls_mask = 0;
14731 tls_gd = 0;
0d4792f7 14732 toc_symndx = 0;
727fc41e
AM
14733 if (h != NULL)
14734 tls_mask = h->tls_mask;
14735 else if (local_got_ents != NULL)
411e1bfb 14736 {
e054468f
AM
14737 struct plt_entry **local_plt = (struct plt_entry **)
14738 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 14739 unsigned char *lgot_masks = (unsigned char *)
e054468f 14740 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
14741 tls_mask = lgot_masks[r_symndx];
14742 }
37da22e5 14743 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
727fc41e
AM
14744 && (r_type == R_PPC64_TLS
14745 || r_type == R_PPC64_TLSGD
14746 || r_type == R_PPC64_TLSLD))
14747 {
14748 /* Check for toc tls entries. */
f961d9dd 14749 unsigned char *toc_tls;
0d4792f7 14750
727fc41e
AM
14751 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14752 &local_syms, rel, input_bfd))
14753 return FALSE;
0d4792f7 14754
727fc41e
AM
14755 if (toc_tls)
14756 tls_mask = *toc_tls;
0d4792f7
AM
14757 }
14758
14759 /* Check that tls relocs are used with tls syms, and non-tls
14760 relocs are used with non-tls syms. */
cf35638d 14761 if (r_symndx != STN_UNDEF
0d4792f7
AM
14762 && r_type != R_PPC64_NONE
14763 && (h == NULL
039b3fef
AM
14764 || h->elf.root.type == bfd_link_hash_defined
14765 || h->elf.root.type == bfd_link_hash_defweak)
71c4e95a 14766 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
0d4792f7 14767 {
37da22e5 14768 if ((tls_mask & TLS_TLS) != 0
727fc41e
AM
14769 && (r_type == R_PPC64_TLS
14770 || r_type == R_PPC64_TLSGD
14771 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
14772 /* R_PPC64_TLS is OK against a symbol in the TOC. */
14773 ;
14774 else
25f53a85 14775 info->callbacks->einfo
1d483afe 14776 (!IS_PPC64_TLS_RELOC (r_type)
695344c0 14777 /* xgettext:c-format */
c1c8c1ef 14778 ? _("%H: %s used with TLS symbol `%pT'\n")
695344c0 14779 /* xgettext:c-format */
c1c8c1ef 14780 : _("%H: %s used with non-TLS symbol `%pT'\n"),
25f53a85 14781 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
14782 ppc64_elf_howto_table[r_type]->name,
14783 sym_name);
411e1bfb
AM
14784 }
14785
14786 /* Ensure reloc mapping code below stays sane. */
14787 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
14788 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
14789 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
14790 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
14791 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
14792 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
14793 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
14794 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
14795 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
14796 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
14797 abort ();
0d4792f7 14798
411e1bfb
AM
14799 switch (r_type)
14800 {
14801 default:
411e1bfb
AM
14802 break;
14803
ba761f19 14804 case R_PPC64_LO_DS_OPT:
95f0d0d2 14805 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
2365f8d7 14806 if ((insn & (0x3fu << 26)) != 58u << 26)
ba761f19
AM
14807 abort ();
14808 insn += (14u << 26) - (58u << 26);
95f0d0d2 14809 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
ba761f19
AM
14810 r_type = R_PPC64_TOC16_LO;
14811 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14812 break;
14813
411e1bfb
AM
14814 case R_PPC64_TOC16:
14815 case R_PPC64_TOC16_LO:
14816 case R_PPC64_TOC16_DS:
14817 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
14818 {
14819 /* Check for toc tls entries. */
f961d9dd 14820 unsigned char *toc_tls;
951fd09b 14821 int retval;
411e1bfb 14822
3a71aa26
AM
14823 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14824 &local_syms, rel, input_bfd);
951fd09b 14825 if (retval == 0)
411e1bfb
AM
14826 return FALSE;
14827
14828 if (toc_tls)
14829 {
951fd09b 14830 tls_mask = *toc_tls;
411e1bfb
AM
14831 if (r_type == R_PPC64_TOC16_DS
14832 || r_type == R_PPC64_TOC16_LO_DS)
81407a69 14833 {
37da22e5 14834 if ((tls_mask & TLS_TLS) != 0
81407a69
AM
14835 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
14836 goto toctprel;
14837 }
411e1bfb 14838 else
951fd09b
AM
14839 {
14840 /* If we found a GD reloc pair, then we might be
14841 doing a GD->IE transition. */
14842 if (retval == 2)
14843 {
b00a0a86 14844 tls_gd = TLS_GDIE;
37da22e5
AM
14845 if ((tls_mask & TLS_TLS) != 0
14846 && (tls_mask & TLS_GD) == 0)
102890f0 14847 goto tls_ldgd_opt;
951fd09b
AM
14848 }
14849 else if (retval == 3)
14850 {
37da22e5
AM
14851 if ((tls_mask & TLS_TLS) != 0
14852 && (tls_mask & TLS_LD) == 0)
102890f0 14853 goto tls_ldgd_opt;
951fd09b
AM
14854 }
14855 }
411e1bfb
AM
14856 }
14857 }
14858 break;
14859
9d6ded02
AM
14860 case R_PPC64_GOT_TPREL16_HI:
14861 case R_PPC64_GOT_TPREL16_HA:
37da22e5 14862 if ((tls_mask & TLS_TLS) != 0
9d6ded02
AM
14863 && (tls_mask & TLS_TPREL) == 0)
14864 {
14865 rel->r_offset -= d_offset;
95f0d0d2 14866 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
9d6ded02
AM
14867 r_type = R_PPC64_NONE;
14868 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14869 }
14870 break;
14871
411e1bfb
AM
14872 case R_PPC64_GOT_TPREL16_DS:
14873 case R_PPC64_GOT_TPREL16_LO_DS:
37da22e5 14874 if ((tls_mask & TLS_TLS) != 0
951fd09b 14875 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14876 {
81407a69 14877 toctprel:
95f0d0d2 14878 insn = bfd_get_32 (input_bfd,
c316a17c 14879 contents + rel->r_offset - d_offset);
411e1bfb
AM
14880 insn &= 31 << 21;
14881 insn |= 0x3c0d0000; /* addis 0,13,0 */
95f0d0d2 14882 bfd_put_32 (input_bfd, insn,
c316a17c 14883 contents + rel->r_offset - d_offset);
411e1bfb 14884 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
14885 if (toc_symndx != 0)
14886 {
14887 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 14888 rel->r_addend = toc_addend;
0d4792f7
AM
14889 /* We changed the symbol. Start over in order to
14890 get h, sym, sec etc. right. */
c316a17c 14891 goto again;
0d4792f7
AM
14892 }
14893 else
14894 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14895 }
14896 break;
14897
c213164a
AM
14898 case R_PPC64_GOT_TPREL34:
14899 if ((tls_mask & TLS_TLS) != 0
14900 && (tls_mask & TLS_TPREL) == 0)
14901 {
14902 /* pld ra,sym@got@tprel@pcrel -> paddi ra,r13,sym@tprel */
14903 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14904 pinsn <<= 32;
14905 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14906 pinsn += ((2ULL << 56) + (-1ULL << 52)
14907 + (14ULL << 26) - (57ULL << 26) + (13ULL << 16));
14908 bfd_put_32 (input_bfd, pinsn >> 32,
14909 contents + rel->r_offset);
14910 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14911 contents + rel->r_offset + 4);
14912 r_type = R_PPC64_TPREL34;
14913 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14914 }
14915 break;
14916
411e1bfb 14917 case R_PPC64_TLS:
37da22e5 14918 if ((tls_mask & TLS_TLS) != 0
951fd09b 14919 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14920 {
c213164a 14921 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2d0f3896
AM
14922 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
14923 if (insn == 0)
c213164a
AM
14924 break;
14925 if ((rel->r_offset & 3) == 0)
0d4792f7 14926 {
c213164a
AM
14927 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
14928 /* Was PPC64_TLS which sits on insn boundary, now
14929 PPC64_TPREL16_LO which is at low-order half-word. */
14930 rel->r_offset += d_offset;
14931 r_type = R_PPC64_TPREL16_LO;
14932 if (toc_symndx != 0)
14933 {
14934 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
14935 rel->r_addend = toc_addend;
14936 /* We changed the symbol. Start over in order to
14937 get h, sym, sec etc. right. */
14938 goto again;
14939 }
14940 else
14941 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14942 }
14943 else if ((rel->r_offset & 3) == 1)
14944 {
14945 /* For pcrel IE to LE we already have the full
14946 offset and thus don't need an addi here. A nop
14947 or mr will do. */
2365f8d7 14948 if ((insn & (0x3fu << 26)) == 14 << 26)
c213164a
AM
14949 {
14950 /* Extract regs from addi rt,ra,si. */
14951 unsigned int rt = (insn >> 21) & 0x1f;
14952 unsigned int ra = (insn >> 16) & 0x1f;
14953 if (rt == ra)
14954 insn = NOP;
14955 else
14956 {
14957 /* Build or ra,rs,rb with rb==rs, ie. mr ra,rs. */
14958 insn = (rt << 16) | (ra << 21) | (ra << 11);
14959 insn |= (31u << 26) | (444u << 1);
14960 }
14961 }
14962 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - 1);
0d4792f7 14963 }
411e1bfb
AM
14964 }
14965 break;
14966
411e1bfb
AM
14967 case R_PPC64_GOT_TLSGD16_HI:
14968 case R_PPC64_GOT_TLSGD16_HA:
b00a0a86 14969 tls_gd = TLS_GDIE;
37da22e5 14970 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
951fd09b
AM
14971 goto tls_gdld_hi;
14972 break;
14973
411e1bfb
AM
14974 case R_PPC64_GOT_TLSLD16_HI:
14975 case R_PPC64_GOT_TLSLD16_HA:
37da22e5 14976 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 14977 {
951fd09b
AM
14978 tls_gdld_hi:
14979 if ((tls_mask & tls_gd) != 0)
14980 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14981 + R_PPC64_GOT_TPREL16_DS);
14982 else
411e1bfb 14983 {
4fe5ca5b 14984 rel->r_offset -= d_offset;
95f0d0d2 14985 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
951fd09b 14986 r_type = R_PPC64_NONE;
411e1bfb 14987 }
951fd09b 14988 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14989 }
14990 break;
14991
951fd09b
AM
14992 case R_PPC64_GOT_TLSGD16:
14993 case R_PPC64_GOT_TLSGD16_LO:
b00a0a86 14994 tls_gd = TLS_GDIE;
37da22e5 14995 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
102890f0 14996 goto tls_ldgd_opt;
951fd09b 14997 break;
411e1bfb 14998
951fd09b
AM
14999 case R_PPC64_GOT_TLSLD16:
15000 case R_PPC64_GOT_TLSLD16_LO:
37da22e5 15001 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
951fd09b 15002 {
b9f04fe0 15003 unsigned int insn1, insn2;
102890f0
AM
15004
15005 tls_ldgd_opt:
727fc41e
AM
15006 offset = (bfd_vma) -1;
15007 /* If not using the newer R_PPC64_TLSGD/LD to mark
15008 __tls_get_addr calls, we must trust that the call
15009 stays with its arg setup insns, ie. that the next
15010 reloc is the __tls_get_addr call associated with
15011 the current reloc. Edit both insns. */
9737e8af 15012 if (input_section->nomark_tls_get_addr
727fc41e
AM
15013 && rel + 1 < relend
15014 && branch_reloc_hash_match (input_bfd, rel + 1,
9e7028aa
AM
15015 htab->tls_get_addr_fd,
15016 htab->tga_desc_fd,
727fc41e 15017 htab->tls_get_addr,
9e7028aa 15018 htab->tga_desc))
727fc41e 15019 offset = rel[1].r_offset;
b86ac8e3
AM
15020 /* We read the low GOT_TLS (or TOC16) insn because we
15021 need to keep the destination reg. It may be
15022 something other than the usual r3, and moved to r3
15023 before the call by intervening code. */
95f0d0d2 15024 insn1 = bfd_get_32 (input_bfd,
b86ac8e3 15025 contents + rel->r_offset - d_offset);
102890f0 15026 if ((tls_mask & tls_gd) != 0)
411e1bfb 15027 {
102890f0 15028 /* IE */
b86ac8e3 15029 insn1 &= (0x1f << 21) | (0x1f << 16);
2365f8d7 15030 insn1 |= 58u << 26; /* ld */
102890f0 15031 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 15032 if (offset != (bfd_vma) -1)
f58d5a2d 15033 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
46e9995a
AM
15034 if (r_type == R_PPC64_TOC16
15035 || r_type == R_PPC64_TOC16_LO)
102890f0 15036 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
46e9995a
AM
15037 else
15038 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 1)) & 1)
15039 + R_PPC64_GOT_TPREL16_DS);
102890f0
AM
15040 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15041 }
15042 else
15043 {
15044 /* LE */
b86ac8e3
AM
15045 insn1 &= 0x1f << 21;
15046 insn1 |= 0x3c0d0000; /* addis r,13,0 */
102890f0
AM
15047 insn2 = 0x38630000; /* addi 3,3,0 */
15048 if (tls_gd == 0)
951fd09b 15049 {
102890f0 15050 /* Was an LD reloc. */
71c4e95a 15051 r_symndx = STN_UNDEF;
102890f0 15052 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
951fd09b 15053 }
102890f0 15054 else if (toc_symndx != 0)
3a71aa26
AM
15055 {
15056 r_symndx = toc_symndx;
15057 rel->r_addend = toc_addend;
15058 }
102890f0
AM
15059 r_type = R_PPC64_TPREL16_HA;
15060 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
15061 if (offset != (bfd_vma) -1)
15062 {
15063 rel[1].r_info = ELF64_R_INFO (r_symndx,
15064 R_PPC64_TPREL16_LO);
15065 rel[1].r_offset = offset + d_offset;
15066 rel[1].r_addend = rel->r_addend;
15067 }
102890f0 15068 }
95f0d0d2 15069 bfd_put_32 (input_bfd, insn1,
3a71aa26 15070 contents + rel->r_offset - d_offset);
727fc41e 15071 if (offset != (bfd_vma) -1)
c96e0573
AM
15072 {
15073 bfd_put_32 (input_bfd, insn2, contents + offset);
15074 if (offset + 8 <= input_section->size)
15075 {
15076 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
15077 if (insn2 == LD_R2_0R1 + STK_TOC (htab))
15078 bfd_put_32 (input_bfd, NOP, contents + offset + 4);
15079 }
15080 }
727fc41e
AM
15081 if ((tls_mask & tls_gd) == 0
15082 && (tls_gd == 0 || toc_symndx != 0))
15083 {
15084 /* We changed the symbol. Start over in order
15085 to get h, sym, sec etc. right. */
c316a17c 15086 goto again;
727fc41e
AM
15087 }
15088 }
15089 break;
15090
c213164a
AM
15091 case R_PPC64_GOT_TLSGD34:
15092 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
15093 {
15094 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15095 pinsn <<= 32;
15096 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15097 if ((tls_mask & TLS_GDIE) != 0)
15098 {
15099 /* IE, pla -> pld */
15100 pinsn += (-2ULL << 56) + (57ULL << 26) - (14ULL << 26);
15101 r_type = R_PPC64_GOT_TPREL34;
15102 }
15103 else
15104 {
15105 /* LE, pla pcrel -> paddi r13 */
15106 pinsn += (-1ULL << 52) + (13ULL << 16);
15107 r_type = R_PPC64_TPREL34;
15108 }
15109 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15110 bfd_put_32 (input_bfd, pinsn >> 32,
15111 contents + rel->r_offset);
15112 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
15113 contents + rel->r_offset + 4);
15114 }
15115 break;
15116
15117 case R_PPC64_GOT_TLSLD34:
15118 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
15119 {
15120 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15121 pinsn <<= 32;
15122 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15123 pinsn += (-1ULL << 52) + (13ULL << 16);
15124 bfd_put_32 (input_bfd, pinsn >> 32,
15125 contents + rel->r_offset);
15126 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
15127 contents + rel->r_offset + 4);
15128 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
15129 r_symndx = STN_UNDEF;
15130 r_type = R_PPC64_TPREL34;
15131 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15132 goto again;
15133 }
15134 break;
15135
727fc41e 15136 case R_PPC64_TLSGD:
37da22e5 15137 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
675e2809 15138 && rel + 1 < relend)
727fc41e 15139 {
b9f04fe0 15140 unsigned int insn2;
5663e321 15141 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 15142
4a421c53 15143 offset = rel->r_offset;
5663e321 15144 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
15145 {
15146 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
15147 if (r_type1 == R_PPC64_PLT_PCREL34
15148 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
15149 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
15150 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
15151 break;
15152 }
15153
15154 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
15155 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
15156
b00a0a86 15157 if ((tls_mask & TLS_GDIE) != 0)
727fc41e
AM
15158 {
15159 /* IE */
15160 r_type = R_PPC64_NONE;
15161 insn2 = 0x7c636a14; /* add 3,3,13 */
15162 }
15163 else
15164 {
15165 /* LE */
15166 if (toc_symndx != 0)
15167 {
15168 r_symndx = toc_symndx;
15169 rel->r_addend = toc_addend;
15170 }
c213164a
AM
15171 if (r_type1 == R_PPC64_REL24_NOTOC
15172 || r_type1 == R_PPC64_PLTCALL_NOTOC)
15173 {
15174 r_type = R_PPC64_NONE;
15175 insn2 = NOP;
15176 }
15177 else
15178 {
15179 rel->r_offset = offset + d_offset;
15180 r_type = R_PPC64_TPREL16_LO;
15181 insn2 = 0x38630000; /* addi 3,3,0 */
15182 }
727fc41e
AM
15183 }
15184 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15185 /* Zap the reloc on the _tls_get_addr call too. */
15186 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 15187 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 15188 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
15189 if ((tls_mask & TLS_GDIE) == 0
15190 && toc_symndx != 0
15191 && r_type != R_PPC64_NONE)
c316a17c 15192 goto again;
411e1bfb 15193 }
411e1bfb
AM
15194 break;
15195
727fc41e 15196 case R_PPC64_TLSLD:
37da22e5 15197 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
675e2809 15198 && rel + 1 < relend)
727fc41e 15199 {
b9f04fe0 15200 unsigned int insn2;
5663e321 15201 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 15202
4a421c53 15203 offset = rel->r_offset;
5663e321 15204 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
15205 {
15206 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
15207 if (r_type1 == R_PPC64_PLT_PCREL34
15208 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
15209 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
15210 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
15211 break;
15212 }
15213
15214 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
15215 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
15216
c213164a
AM
15217 if (r_type1 == R_PPC64_REL24_NOTOC
15218 || r_type1 == R_PPC64_PLTCALL_NOTOC)
15219 {
15220 r_type = R_PPC64_NONE;
15221 insn2 = NOP;
15222 }
15223 else
15224 {
15225 rel->r_offset = offset + d_offset;
15226 r_symndx = STN_UNDEF;
15227 r_type = R_PPC64_TPREL16_LO;
15228 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
15229 insn2 = 0x38630000; /* addi 3,3,0 */
15230 }
727fc41e 15231 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
15232 /* Zap the reloc on the _tls_get_addr call too. */
15233 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 15234 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 15235 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
15236 if (r_type != R_PPC64_NONE)
15237 goto again;
727fc41e
AM
15238 }
15239 break;
15240
411e1bfb 15241 case R_PPC64_DTPMOD64:
951fd09b
AM
15242 if (rel + 1 < relend
15243 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
15244 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 15245 {
951fd09b
AM
15246 if ((tls_mask & TLS_GD) == 0)
15247 {
15248 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
b00a0a86 15249 if ((tls_mask & TLS_GDIE) != 0)
951fd09b
AM
15250 r_type = R_PPC64_TPREL64;
15251 else
15252 {
4ce794b7 15253 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
15254 r_type = R_PPC64_NONE;
15255 }
15256 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15257 }
15258 }
15259 else
15260 {
15261 if ((tls_mask & TLS_LD) == 0)
411e1bfb 15262 {
4ce794b7 15263 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 15264 r_type = R_PPC64_NONE;
951fd09b 15265 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 15266 }
411e1bfb
AM
15267 }
15268 break;
15269
15270 case R_PPC64_TPREL64:
951fd09b 15271 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
15272 {
15273 r_type = R_PPC64_NONE;
15274 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15275 }
15276 break;
52a82034 15277
006589cf
AM
15278 case R_PPC64_ENTRY:
15279 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
15280 if (!bfd_link_pic (info)
15281 && !info->traditional_format
15282 && relocation + 0x80008000 <= 0xffffffff)
15283 {
15284 unsigned int insn1, insn2;
15285
15286 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15287 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15288 if ((insn1 & ~0xfffc) == LD_R2_0R12
15289 && insn2 == ADD_R2_R2_R12)
15290 {
95f0d0d2 15291 bfd_put_32 (input_bfd,
006589cf
AM
15292 LIS_R2 + PPC_HA (relocation),
15293 contents + rel->r_offset);
95f0d0d2 15294 bfd_put_32 (input_bfd,
006589cf
AM
15295 ADDI_R2_R2 + PPC_LO (relocation),
15296 contents + rel->r_offset + 4);
15297 }
15298 }
15299 else
15300 {
15301 relocation -= (rel->r_offset
15302 + input_section->output_offset
15303 + input_section->output_section->vma);
15304 if (relocation + 0x80008000 <= 0xffffffff)
15305 {
15306 unsigned int insn1, insn2;
15307
15308 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15309 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15310 if ((insn1 & ~0xfffc) == LD_R2_0R12
15311 && insn2 == ADD_R2_R2_R12)
15312 {
95f0d0d2 15313 bfd_put_32 (input_bfd,
006589cf
AM
15314 ADDIS_R2_R12 + PPC_HA (relocation),
15315 contents + rel->r_offset);
95f0d0d2 15316 bfd_put_32 (input_bfd,
006589cf
AM
15317 ADDI_R2_R2 + PPC_LO (relocation),
15318 contents + rel->r_offset + 4);
15319 }
15320 }
15321 }
15322 break;
15323
52a82034
AM
15324 case R_PPC64_REL16_HA:
15325 /* If we are generating a non-PIC executable, edit
15326 . 0: addis 2,12,.TOC.-0b@ha
15327 . addi 2,2,.TOC.-0b@l
15328 used by ELFv2 global entry points to set up r2, to
15329 . lis 2,.TOC.@ha
15330 . addi 2,2,.TOC.@l
15331 if .TOC. is in range. */
0e1862bb 15332 if (!bfd_link_pic (info)
810d4e75 15333 && !info->traditional_format
006589cf 15334 && !htab->opd_abi
4f038ee5 15335 && rel->r_addend == d_offset
52a82034
AM
15336 && h != NULL && &h->elf == htab->elf.hgot
15337 && rel + 1 < relend
15338 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
15339 && rel[1].r_offset == rel->r_offset + 4
15340 && rel[1].r_addend == rel->r_addend + 4
15341 && relocation + 0x80008000 <= 0xffffffff)
15342 {
15343 unsigned int insn1, insn2;
4a421c53 15344 offset = rel->r_offset - d_offset;
95f0d0d2
AM
15345 insn1 = bfd_get_32 (input_bfd, contents + offset);
15346 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
006589cf
AM
15347 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
15348 && (insn2 & 0xffff0000) == ADDI_R2_R2)
52a82034
AM
15349 {
15350 r_type = R_PPC64_ADDR16_HA;
15351 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15352 rel->r_addend -= d_offset;
15353 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
15354 rel[1].r_addend -= d_offset + 4;
95f0d0d2 15355 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
52a82034
AM
15356 }
15357 }
15358 break;
411e1bfb
AM
15359 }
15360
15361 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 15362 insn = 0;
b25116a9
AM
15363 max_br_offset = 1 << 25;
15364 addend = rel->r_addend;
bc30df16 15365 reloc_dest = DEST_NORMAL;
65f38f15 15366 switch (r_type)
5bd4f169
AM
15367 {
15368 default:
65f38f15 15369 break;
5bd4f169 15370
3b421ab3
AM
15371 case R_PPC64_TOCSAVE:
15372 if (relocation + addend == (rel->r_offset
15373 + input_section->output_offset
15374 + input_section->output_section->vma)
15375 && tocsave_find (htab, NO_INSERT,
15376 &local_syms, rel, input_bfd))
15377 {
15378 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15379 if (insn == NOP
15380 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
15381 bfd_put_32 (input_bfd,
15382 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
15383 contents + rel->r_offset);
15384 }
15385 break;
15386
65f38f15
AM
15387 /* Branch taken prediction relocations. */
15388 case R_PPC64_ADDR14_BRTAKEN:
15389 case R_PPC64_REL14_BRTAKEN:
cedb70c5 15390 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
1a0670f3 15391 /* Fall through. */
65f38f15 15392
86c76c7b 15393 /* Branch not taken prediction relocations. */
65f38f15
AM
15394 case R_PPC64_ADDR14_BRNTAKEN:
15395 case R_PPC64_REL14_BRNTAKEN:
95f0d0d2 15396 insn |= bfd_get_32 (input_bfd,
411e1bfb 15397 contents + rel->r_offset) & ~(0x01 << 21);
1a0670f3 15398 /* Fall through. */
86c76c7b 15399
b25116a9
AM
15400 case R_PPC64_REL14:
15401 max_br_offset = 1 << 15;
1a0670f3 15402 /* Fall through. */
5bd4f169 15403
65f38f15 15404 case R_PPC64_REL24:
05d0e962 15405 case R_PPC64_REL24_NOTOC:
23cedd1d 15406 case R_PPC64_PLTCALL:
5663e321 15407 case R_PPC64_PLTCALL_NOTOC:
ad8e1ba5
AM
15408 /* Calls to functions with a different TOC, such as calls to
15409 shared objects, need to alter the TOC pointer. This is
15410 done using a linkage stub. A REL24 branching to these
15411 linkage stubs needs to be followed by a nop, as the nop
15412 will be replaced with an instruction to restore the TOC
15413 base pointer. */
8387904d 15414 fdh = h;
b31867b6
AM
15415 if (h != NULL
15416 && h->oh != NULL
15417 && h->oh->is_func_descriptor)
15418 fdh = ppc_follow_link (h->oh);
31c76678
DK
15419 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
15420 htab);
5663e321
AM
15421 if ((r_type == R_PPC64_PLTCALL
15422 || r_type == R_PPC64_PLTCALL_NOTOC)
23cedd1d 15423 && stub_entry != NULL
05d0e962
AM
15424 && stub_entry->stub_type >= ppc_stub_plt_call
15425 && stub_entry->stub_type <= ppc_stub_plt_call_both)
23cedd1d
AM
15426 stub_entry = NULL;
15427
6abec6bc 15428 if (stub_entry != NULL
d0abeec8
AM
15429 && ((stub_entry->stub_type >= ppc_stub_plt_call
15430 && stub_entry->stub_type <= ppc_stub_plt_call_both)
ad8e1ba5 15431 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
05d0e962
AM
15432 || stub_entry->stub_type == ppc_stub_plt_branch_both
15433 || stub_entry->stub_type == ppc_stub_long_branch_r2off
15434 || stub_entry->stub_type == ppc_stub_long_branch_both))
41bd81ab 15435 {
b25116a9 15436 bfd_boolean can_plt_call = FALSE;
721956f4 15437
6e1816be
AM
15438 if (stub_entry->stub_type == ppc_stub_plt_call
15439 && !htab->opd_abi
15440 && htab->params->plt_localentry0 != 0
15441 && is_elfv2_localentry0 (&h->elf))
15442 {
15443 /* The function doesn't use or change r2. */
15444 can_plt_call = TRUE;
15445 }
05d0e962
AM
15446 else if (r_type == R_PPC64_REL24_NOTOC)
15447 {
15448 /* NOTOC calls don't need to restore r2. */
15449 can_plt_call = TRUE;
15450 }
6e1816be 15451
f378ab09 15452 /* All of these stubs may modify r2, so there must be a
ba8ca3e7
AM
15453 branch and link followed by a nop. The nop is
15454 replaced by an insn to restore r2. */
6e1816be 15455 else if (rel->r_offset + 8 <= input_section->size)
41bd81ab 15456 {
ba8ca3e7
AM
15457 unsigned long br;
15458
15459 br = bfd_get_32 (input_bfd,
15460 contents + rel->r_offset);
15461 if ((br & 1) != 0)
41bd81ab 15462 {
ba8ca3e7
AM
15463 unsigned long nop;
15464
15465 nop = bfd_get_32 (input_bfd,
15466 contents + rel->r_offset + 4);
23cedd1d
AM
15467 if (nop == LD_R2_0R1 + STK_TOC (htab))
15468 can_plt_call = TRUE;
15469 else if (nop == NOP
15470 || nop == CROR_151515
15471 || nop == CROR_313131)
a7f2871e 15472 {
ba8ca3e7 15473 if (h != NULL
ed7007c1 15474 && is_tls_get_addr (&h->elf, htab)
7c9cf415 15475 && htab->params->tls_get_addr_opt)
ba8ca3e7
AM
15476 {
15477 /* Special stub used, leave nop alone. */
15478 }
15479 else
a078d95a
AM
15480 bfd_put_32 (input_bfd,
15481 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7
AM
15482 contents + rel->r_offset + 4);
15483 can_plt_call = TRUE;
a7f2871e 15484 }
41bd81ab 15485 }
5bd4f169 15486 }
721956f4 15487
ba8ca3e7 15488 if (!can_plt_call && h != NULL)
721956f4 15489 {
ba8ca3e7
AM
15490 const char *name = h->elf.root.root.string;
15491
15492 if (*name == '.')
15493 ++name;
15494
15495 if (strncmp (name, "__libc_start_main", 17) == 0
15496 && (name[17] == 0 || name[17] == '@'))
6ab189d5 15497 {
ba8ca3e7
AM
15498 /* Allow crt1 branch to go via a toc adjusting
15499 stub. Other calls that never return could do
15500 the same, if we could detect such. */
b25116a9 15501 can_plt_call = TRUE;
6ab189d5 15502 }
ba8ca3e7
AM
15503 }
15504
15505 if (!can_plt_call)
15506 {
15507 /* g++ as of 20130507 emits self-calls without a
15508 following nop. This is arguably wrong since we
15509 have conflicting information. On the one hand a
15510 global symbol and on the other a local call
15511 sequence, but don't error for this special case.
15512 It isn't possible to cheaply verify we have
15513 exactly such a call. Allow all calls to the same
15514 section. */
15515 asection *code_sec = sec;
15516
15517 if (get_opd_info (sec) != NULL)
ad8e1ba5 15518 {
ba8ca3e7
AM
15519 bfd_vma off = (relocation + addend
15520 - sec->output_section->vma
15521 - sec->output_offset);
bc30df16 15522
ba8ca3e7 15523 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 15524 }
ba8ca3e7
AM
15525 if (code_sec == input_section)
15526 can_plt_call = TRUE;
15527 }
15528
15529 if (!can_plt_call)
15530 {
05d0e962
AM
15531 if (stub_entry->stub_type >= ppc_stub_plt_call
15532 && stub_entry->stub_type <= ppc_stub_plt_call_both)
4805fc55 15533 info->callbacks->einfo
695344c0 15534 /* xgettext:c-format */
c1c8c1ef 15535 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15536 "(plt call stub)\n"),
4805fc55
AM
15537 input_bfd, input_section, rel->r_offset, sym_name);
15538 else
15539 info->callbacks->einfo
695344c0 15540 /* xgettext:c-format */
c1c8c1ef 15541 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15542 "(toc save/adjust stub)\n"),
4805fc55 15543 input_bfd, input_section, rel->r_offset, sym_name);
ba8ca3e7
AM
15544
15545 bfd_set_error (bfd_error_bad_value);
15546 ret = FALSE;
721956f4
AM
15547 }
15548
b25116a9 15549 if (can_plt_call
05d0e962
AM
15550 && stub_entry->stub_type >= ppc_stub_plt_call
15551 && stub_entry->stub_type <= ppc_stub_plt_call_both)
b25116a9
AM
15552 unresolved_reloc = FALSE;
15553 }
15554
6abec6bc
AM
15555 if ((stub_entry == NULL
15556 || stub_entry->stub_type == ppc_stub_long_branch
15557 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
15558 && get_opd_info (sec) != NULL)
15559 {
15560 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
15561 bfd_vma off = (relocation + addend
15562 - sec->output_section->vma
15563 - sec->output_offset);
aef36ac1 15564 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
15565 if (dest != (bfd_vma) -1)
15566 {
15567 relocation = dest;
15568 addend = 0;
bc30df16 15569 reloc_dest = DEST_OPD;
8387904d
AM
15570 }
15571 }
15572
b25116a9
AM
15573 /* If the branch is out of reach we ought to have a long
15574 branch stub. */
15575 from = (rel->r_offset
15576 + input_section->output_offset
15577 + input_section->output_section->vma);
15578
6911b7dc
AM
15579 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
15580 ? fdh->elf.other
15581 : sym->st_other);
15582
6abec6bc
AM
15583 if (stub_entry != NULL
15584 && (stub_entry->stub_type == ppc_stub_long_branch
15585 || stub_entry->stub_type == ppc_stub_plt_branch)
15586 && (r_type == R_PPC64_ADDR14_BRTAKEN
15587 || r_type == R_PPC64_ADDR14_BRNTAKEN
15588 || (relocation + addend - from + max_br_offset
15589 < 2 * max_br_offset)))
15590 /* Don't use the stub if this branch is in range. */
15591 stub_entry = NULL;
b25116a9 15592
05d0e962
AM
15593 if (stub_entry != NULL
15594 && (stub_entry->stub_type == ppc_stub_long_branch_notoc
15595 || stub_entry->stub_type == ppc_stub_long_branch_both
15596 || stub_entry->stub_type == ppc_stub_plt_branch_notoc
15597 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15598 && (r_type != R_PPC64_REL24_NOTOC
15599 || ((fdh ? fdh->elf.other : sym->st_other)
4a4e7361 15600 & STO_PPC64_LOCAL_MASK) <= 1 << STO_PPC64_LOCAL_BIT)
05d0e962
AM
15601 && (relocation + addend - from + max_br_offset
15602 < 2 * max_br_offset))
15603 stub_entry = NULL;
15604
15605 if (stub_entry != NULL
15606 && (stub_entry->stub_type == ppc_stub_long_branch_r2off
15607 || stub_entry->stub_type == ppc_stub_long_branch_both
15608 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
15609 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15610 && r_type == R_PPC64_REL24_NOTOC
15611 && (relocation + addend - from + max_br_offset
15612 < 2 * max_br_offset))
15613 stub_entry = NULL;
15614
b25116a9
AM
15615 if (stub_entry != NULL)
15616 {
15617 /* Munge up the value and addend so that we call the stub
15618 rather than the procedure directly. */
a4b6fadd
AM
15619 asection *stub_sec = stub_entry->group->stub_sec;
15620
15621 if (stub_entry->stub_type == ppc_stub_save_res)
15622 relocation += (stub_sec->output_offset
15623 + stub_sec->output_section->vma
15624 + stub_sec->size - htab->sfpr->size
15625 - htab->sfpr->output_offset
15626 - htab->sfpr->output_section->vma);
15627 else
15628 relocation = (stub_entry->stub_offset
15629 + stub_sec->output_offset
15630 + stub_sec->output_section->vma);
b25116a9 15631 addend = 0;
bc30df16 15632 reloc_dest = DEST_STUB;
3b421ab3 15633
05d0e962
AM
15634 if (((stub_entry->stub_type == ppc_stub_plt_call
15635 && ALWAYS_EMIT_R2SAVE)
15636 || stub_entry->stub_type == ppc_stub_plt_call_r2save
15637 || stub_entry->stub_type == ppc_stub_plt_call_both)
e81b4c93 15638 && !(h != NULL
ed7007c1 15639 && is_tls_get_addr (&h->elf, htab)
e81b4c93 15640 && htab->params->tls_get_addr_opt)
3b421ab3
AM
15641 && rel + 1 < relend
15642 && rel[1].r_offset == rel->r_offset + 4
15643 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
15644 relocation += 4;
05d0e962
AM
15645 else if ((stub_entry->stub_type == ppc_stub_long_branch_both
15646 || stub_entry->stub_type == ppc_stub_plt_branch_both
15647 || stub_entry->stub_type == ppc_stub_plt_call_both)
15648 && r_type == R_PPC64_REL24_NOTOC)
15649 relocation += 4;
5663e321
AM
15650
15651 if (r_type == R_PPC64_REL24_NOTOC
15652 && (stub_entry->stub_type == ppc_stub_plt_call_notoc
15653 || stub_entry->stub_type == ppc_stub_plt_call_both))
15654 htab->notoc_plt = 1;
b25116a9
AM
15655 }
15656
15657 if (insn != 0)
15658 {
794e51c0 15659 if (is_isa_v2)
721956f4 15660 {
b25116a9
AM
15661 /* Set 'a' bit. This is 0b00010 in BO field for branch
15662 on CR(BI) insns (BO == 001at or 011at), and 0b01000
15663 for branch on CTR insns (BO == 1a00t or 1a01t). */
15664 if ((insn & (0x14 << 21)) == (0x04 << 21))
15665 insn |= 0x02 << 21;
15666 else if ((insn & (0x14 << 21)) == (0x10 << 21))
15667 insn |= 0x08 << 21;
15668 else
15669 break;
15670 }
15671 else
15672 {
15673 /* Invert 'y' bit if not the default. */
4cc603a5 15674 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 15675 insn ^= 0x01 << 21;
721956f4 15676 }
b25116a9 15677
95f0d0d2 15678 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
5bd4f169 15679 }
e86ce104 15680
06da1e8e
AM
15681 /* NOP out calls to undefined weak functions.
15682 We can thus call a weak function without first
15683 checking whether the function is defined. */
b25116a9 15684 else if (h != NULL
039b3fef 15685 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 15686 && h->elf.dynindx == -1
05d0e962
AM
15687 && (r_type == R_PPC64_REL24
15688 || r_type == R_PPC64_REL24_NOTOC)
b25116a9 15689 && relocation == 0
4cc603a5 15690 && addend == 0)
e86ce104 15691 {
95f0d0d2 15692 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
c316a17c 15693 goto copy_reloc;
e86ce104 15694 }
65f38f15 15695 break;
066f4018
AM
15696
15697 case R_PPC64_GOT16_DS:
15698 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15699 if (relocation + addend - from + 0x8000 < 0x10000
15700 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15701 {
15702 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15703 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15704 {
15705 insn += (14u << 26) - (58u << 26);
15706 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15707 r_type = R_PPC64_TOC16;
15708 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15709 }
15710 }
15711 break;
15712
15713 case R_PPC64_GOT16_LO_DS:
15714 case R_PPC64_GOT16_HA:
15715 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15716 if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
15717 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15718 {
15719 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15720 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15721 {
15722 insn += (14u << 26) - (58u << 26);
15723 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15724 r_type = R_PPC64_TOC16_LO;
15725 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15726 }
2365f8d7 15727 else if ((insn & (0x3fu << 26)) == 15u << 26 /* addis */)
066f4018
AM
15728 {
15729 r_type = R_PPC64_TOC16_HA;
15730 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15731 }
15732 }
15733 break;
4a421c53
AM
15734
15735 case R_PPC64_GOT_PCREL34:
15736 from = (rel->r_offset
15737 + input_section->output_section->vma
15738 + input_section->output_offset);
15739 if (relocation - from + (1ULL << 33) < 1ULL << 34
15740 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15741 {
15742 offset = rel->r_offset;
15743 pinsn = bfd_get_32 (input_bfd, contents + offset);
15744 pinsn <<= 32;
15745 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15746 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15747 == ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
15748 {
15749 /* Replace with paddi. */
15750 pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
15751 r_type = R_PPC64_PCREL34;
15752 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15753 bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
15754 bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
15755 goto pcrelopt;
15756 }
15757 }
15758 break;
15759
15760 case R_PPC64_PCREL34:
15761 if (SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15762 {
15763 offset = rel->r_offset;
15764 pinsn = bfd_get_32 (input_bfd, contents + offset);
15765 pinsn <<= 32;
15766 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15767 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15768 == ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
15769 | (14ULL << 26) /* paddi */))
15770 {
15771 pcrelopt:
15772 if (rel + 1 < relend
15773 && rel[1].r_offset == offset
15774 && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT))
15775 {
15776 bfd_vma off2 = rel[1].r_addend;
15777 if (off2 == 0)
15778 /* zero means next insn. */
15779 off2 = 8;
15780 off2 += offset;
15781 if (off2 + 4 <= input_section->size)
15782 {
15783 uint64_t pinsn2;
dd9b12c2 15784 bfd_signed_vma addend_off;
4a421c53
AM
15785 pinsn2 = bfd_get_32 (input_bfd, contents + off2);
15786 pinsn2 <<= 32;
15787 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
77486630
AM
15788 {
15789 if (off2 + 8 > input_section->size)
15790 break;
15791 pinsn2 |= bfd_get_32 (input_bfd,
15792 contents + off2 + 4);
15793 }
dd9b12c2 15794 if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
4a421c53 15795 {
dd9b12c2
AM
15796 addend += addend_off;
15797 rel->r_addend = addend;
4a421c53
AM
15798 bfd_put_32 (input_bfd, pinsn >> 32,
15799 contents + offset);
15800 bfd_put_32 (input_bfd, pinsn,
15801 contents + offset + 4);
15802 bfd_put_32 (input_bfd, pinsn2 >> 32,
15803 contents + off2);
77486630
AM
15804 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
15805 bfd_put_32 (input_bfd, pinsn2,
15806 contents + off2 + 4);
4a421c53
AM
15807 }
15808 }
15809 }
15810 }
15811 }
15812 break;
65f38f15 15813 }
5bd4f169 15814
411e1bfb 15815 tls_type = 0;
23cedd1d 15816 save_unresolved_reloc = unresolved_reloc;
65f38f15
AM
15817 switch (r_type)
15818 {
15819 default:
cf97bcb0
AM
15820 /* xgettext:c-format */
15821 _bfd_error_handler (_("%pB: %s unsupported"),
15822 input_bfd, ppc64_elf_howto_table[r_type]->name);
5bd4f169 15823
65f38f15 15824 bfd_set_error (bfd_error_bad_value);
b34976b6 15825 ret = FALSE;
c316a17c 15826 goto copy_reloc;
5bd4f169 15827
65f38f15 15828 case R_PPC64_NONE:
411e1bfb 15829 case R_PPC64_TLS:
727fc41e
AM
15830 case R_PPC64_TLSGD:
15831 case R_PPC64_TLSLD:
3b421ab3 15832 case R_PPC64_TOCSAVE:
04c9666a
AM
15833 case R_PPC64_GNU_VTINHERIT:
15834 case R_PPC64_GNU_VTENTRY:
006589cf 15835 case R_PPC64_ENTRY:
4a421c53 15836 case R_PPC64_PCREL_OPT:
c316a17c 15837 goto copy_reloc;
5bd4f169
AM
15838
15839 /* GOT16 relocations. Like an ADDR16 using the symbol's
15840 address in the GOT as relocation value instead of the
411e1bfb 15841 symbol's value itself. Also, create a GOT entry for the
5bd4f169 15842 symbol and put the symbol value there. */
411e1bfb
AM
15843 case R_PPC64_GOT_TLSGD16:
15844 case R_PPC64_GOT_TLSGD16_LO:
15845 case R_PPC64_GOT_TLSGD16_HI:
15846 case R_PPC64_GOT_TLSGD16_HA:
c213164a 15847 case R_PPC64_GOT_TLSGD34:
951fd09b 15848 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
15849 goto dogot;
15850
15851 case R_PPC64_GOT_TLSLD16:
15852 case R_PPC64_GOT_TLSLD16_LO:
15853 case R_PPC64_GOT_TLSLD16_HI:
15854 case R_PPC64_GOT_TLSLD16_HA:
c213164a 15855 case R_PPC64_GOT_TLSLD34:
951fd09b 15856 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
15857 goto dogot;
15858
15859 case R_PPC64_GOT_TPREL16_DS:
15860 case R_PPC64_GOT_TPREL16_LO_DS:
15861 case R_PPC64_GOT_TPREL16_HI:
15862 case R_PPC64_GOT_TPREL16_HA:
c213164a 15863 case R_PPC64_GOT_TPREL34:
411e1bfb
AM
15864 tls_type = TLS_TLS | TLS_TPREL;
15865 goto dogot;
15866
15867 case R_PPC64_GOT_DTPREL16_DS:
15868 case R_PPC64_GOT_DTPREL16_LO_DS:
15869 case R_PPC64_GOT_DTPREL16_HI:
15870 case R_PPC64_GOT_DTPREL16_HA:
c213164a 15871 case R_PPC64_GOT_DTPREL34:
411e1bfb
AM
15872 tls_type = TLS_TLS | TLS_DTPREL;
15873 goto dogot;
15874
65f38f15
AM
15875 case R_PPC64_GOT16:
15876 case R_PPC64_GOT16_LO:
15877 case R_PPC64_GOT16_HI:
15878 case R_PPC64_GOT16_HA:
15879 case R_PPC64_GOT16_DS:
15880 case R_PPC64_GOT16_LO_DS:
5663e321 15881 case R_PPC64_GOT_PCREL34:
411e1bfb 15882 dogot:
5bd4f169
AM
15883 {
15884 /* Relocation is to the entry for this symbol in the global
15885 offset table. */
e717da7e 15886 asection *got;
d881513a 15887 bfd_vma *offp;
5bd4f169 15888 bfd_vma off;
d881513a 15889 unsigned long indx = 0;
927be08e 15890 struct got_entry *ent;
65f38f15 15891
d881513a 15892 if (tls_type == (TLS_TLS | TLS_LD)
f749f26e 15893 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
927be08e 15894 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 15895 else
5bd4f169 15896 {
d881513a
AM
15897 if (h != NULL)
15898 {
f0158f44
AM
15899 if (!htab->elf.dynamic_sections_created
15900 || h->elf.dynindx == -1
15901 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
21d68fcd 15902 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
d881513a
AM
15903 /* This is actually a static link, or it is a
15904 -Bsymbolic link and the symbol is defined
15905 locally, or the symbol was forced to be local
15906 because of a version file. */
15907 ;
15908 else
15909 {
039b3fef 15910 indx = h->elf.dynindx;
d881513a
AM
15911 unresolved_reloc = FALSE;
15912 }
039b3fef 15913 ent = h->elf.got.glist;
d881513a 15914 }
411e1bfb 15915 else
5bd4f169 15916 {
d881513a
AM
15917 if (local_got_ents == NULL)
15918 abort ();
15919 ent = local_got_ents[r_symndx];
5bd4f169 15920 }
d881513a
AM
15921
15922 for (; ent != NULL; ent = ent->next)
133a1f60 15923 if (ent->addend == orig_rel.r_addend
e717da7e 15924 && ent->owner == input_bfd
d881513a
AM
15925 && ent->tls_type == tls_type)
15926 break;
5bd4f169 15927 }
411e1bfb 15928
927be08e
AM
15929 if (ent == NULL)
15930 abort ();
15931 if (ent->is_indirect)
15932 ent = ent->got.ent;
15933 offp = &ent->got.offset;
15934 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
15935 if (got == NULL)
15936 abort ();
15937
411e1bfb
AM
15938 /* The offset must always be a multiple of 8. We use the
15939 least significant bit to record whether we have already
15940 processed this entry. */
d881513a 15941 off = *offp;
411e1bfb
AM
15942 if ((off & 1) != 0)
15943 off &= ~1;
5bd4f169
AM
15944 else
15945 {
411e1bfb
AM
15946 /* Generate relocs for the dynamic linker, except in
15947 the case of TLSLD where we'll use one entry per
15948 module. */
25f23106
AM
15949 asection *relgot;
15950 bfd_boolean ifunc;
e717da7e 15951
d881513a 15952 *offp = off | 1;
25f23106
AM
15953 relgot = NULL;
15954 ifunc = (h != NULL
15955 ? h->elf.type == STT_GNU_IFUNC
15956 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 15957 if (ifunc)
82e66161
AM
15958 {
15959 relgot = htab->elf.irelplt;
15960 if (indx == 0)
15961 htab->local_ifunc_resolver = 1;
15962 else if (is_static_defined (&h->elf))
15963 htab->maybe_local_ifunc_resolver = 1;
15964 }
f0158f44
AM
15965 else if (indx != 0
15966 || (bfd_link_pic (info)
15967 && (h == NULL
f749f26e
AM
15968 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
15969 && !(tls_type != 0
f15d0b54
AM
15970 && bfd_link_executable (info)
15971 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
19e08130 15972 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 15973 if (relgot != NULL)
5bd4f169 15974 {
e717da7e
AM
15975 outrel.r_offset = (got->output_section->vma
15976 + got->output_offset
411e1bfb 15977 + off);
133a1f60 15978 outrel.r_addend = orig_rel.r_addend;
d881513a 15979 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 15980 {
411e1bfb 15981 outrel.r_addend = 0;
e515b051 15982 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
15983 if (tls_type == (TLS_TLS | TLS_GD))
15984 {
e717da7e
AM
15985 loc = relgot->contents;
15986 loc += (relgot->reloc_count++
d881513a
AM
15987 * sizeof (Elf64_External_Rela));
15988 bfd_elf64_swap_reloca_out (output_bfd,
15989 &outrel, loc);
e515b051 15990 outrel.r_offset += 8;
133a1f60 15991 outrel.r_addend = orig_rel.r_addend;
d881513a
AM
15992 outrel.r_info
15993 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 15994 }
411e1bfb 15995 }
951fd09b 15996 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 15997 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 15998 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 15999 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
16000 else if (indx != 0)
16001 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
16002 else
81407a69 16003 {
25f23106
AM
16004 if (ifunc)
16005 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
16006 else
16007 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
16008
16009 /* Write the .got section contents for the sake
16010 of prelink. */
e717da7e 16011 loc = got->contents + off;
23fbd6fa
JJ
16012 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
16013 loc);
81407a69 16014 }
81407a69
AM
16015
16016 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
16017 {
16018 outrel.r_addend += relocation;
16019 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
989f9879
AM
16020 {
16021 if (htab->elf.tls_sec == NULL)
16022 outrel.r_addend = 0;
16023 else
16024 outrel.r_addend -= htab->elf.tls_sec->vma;
16025 }
e515b051 16026 }
e717da7e
AM
16027 loc = relgot->contents;
16028 loc += (relgot->reloc_count++
411e1bfb
AM
16029 * sizeof (Elf64_External_Rela));
16030 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
16031 }
16032
ad8e1ba5 16033 /* Init the .got section contents here if we're not
81407a69 16034 emitting a reloc. */
d881513a 16035 else
411e1bfb 16036 {
133a1f60 16037 relocation += orig_rel.r_addend;
f0158f44 16038 if (tls_type != 0)
411e1bfb 16039 {
989f9879
AM
16040 if (htab->elf.tls_sec == NULL)
16041 relocation = 0;
16042 else
16043 {
f0158f44
AM
16044 if (tls_type & TLS_LD)
16045 relocation = 0;
16046 else
16047 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
676ee2b5 16048 if (tls_type & TLS_TPREL)
989f9879
AM
16049 relocation += DTP_OFFSET - TP_OFFSET;
16050 }
5bd4f169 16051
f0158f44 16052 if (tls_type & (TLS_GD | TLS_LD))
7b609f53
AM
16053 {
16054 bfd_put_64 (output_bfd, relocation,
e717da7e 16055 got->contents + off + 8);
676ee2b5 16056 relocation = 1;
7b609f53 16057 }
411e1bfb
AM
16058 }
16059 bfd_put_64 (output_bfd, relocation,
e717da7e 16060 got->contents + off);
5bd4f169
AM
16061 }
16062 }
16063
65f38f15
AM
16064 if (off >= (bfd_vma) -2)
16065 abort ();
16066
bf102f86 16067 relocation = got->output_section->vma + got->output_offset + off;
133a1f60 16068 addend = 0;
c213164a
AM
16069 if (!(r_type == R_PPC64_GOT_PCREL34
16070 || r_type == R_PPC64_GOT_TLSGD34
16071 || r_type == R_PPC64_GOT_TLSLD34
16072 || r_type == R_PPC64_GOT_TPREL34
16073 || r_type == R_PPC64_GOT_DTPREL34))
5663e321 16074 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
5bd4f169 16075 }
65f38f15
AM
16076 break;
16077
16078 case R_PPC64_PLT16_HA:
16079 case R_PPC64_PLT16_HI:
16080 case R_PPC64_PLT16_LO:
08be3224 16081 case R_PPC64_PLT16_LO_DS:
5663e321
AM
16082 case R_PPC64_PLT_PCREL34:
16083 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
16084 case R_PPC64_PLT32:
16085 case R_PPC64_PLT64:
23cedd1d 16086 case R_PPC64_PLTSEQ:
5663e321 16087 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d 16088 case R_PPC64_PLTCALL:
5663e321 16089 case R_PPC64_PLTCALL_NOTOC:
65f38f15
AM
16090 /* Relocation is to the entry for this symbol in the
16091 procedure linkage table. */
23cedd1d 16092 unresolved_reloc = TRUE;
cbf95972
AM
16093 {
16094 struct plt_entry **plt_list = NULL;
16095 if (h != NULL)
16096 plt_list = &h->elf.plt.plist;
16097 else if (local_got_ents != NULL)
16098 {
16099 struct plt_entry **local_plt = (struct plt_entry **)
16100 (local_got_ents + symtab_hdr->sh_info);
2d7ad24e 16101 plt_list = local_plt + r_symndx;
cbf95972
AM
16102 }
16103 if (plt_list)
16104 {
16105 struct plt_entry *ent;
65f38f15 16106
cbf95972
AM
16107 for (ent = *plt_list; ent != NULL; ent = ent->next)
16108 if (ent->plt.offset != (bfd_vma) -1
133a1f60 16109 && ent->addend == orig_rel.r_addend)
cbf95972
AM
16110 {
16111 asection *plt;
08be3224 16112 bfd_vma got;
cbf95972
AM
16113
16114 plt = htab->elf.splt;
16115 if (!htab->elf.dynamic_sections_created
16116 || h == NULL
16117 || h->elf.dynindx == -1)
2d7ad24e
AM
16118 {
16119 if (h != NULL
16120 ? h->elf.type == STT_GNU_IFUNC
16121 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
16122 plt = htab->elf.iplt;
16123 else
16124 plt = htab->pltlocal;
16125 }
16126 relocation = (plt->output_section->vma
16127 + plt->output_offset
16128 + ent->plt.offset);
08be3224 16129 if (r_type == R_PPC64_PLT16_HA
2cdcc330
AM
16130 || r_type == R_PPC64_PLT16_HI
16131 || r_type == R_PPC64_PLT16_LO
16132 || r_type == R_PPC64_PLT16_LO_DS)
08be3224
AM
16133 {
16134 got = (elf_gp (output_bfd)
16135 + htab->sec_info[input_section->id].toc_off);
16136 relocation -= got;
16137 }
133a1f60 16138 addend = 0;
cbf95972
AM
16139 unresolved_reloc = FALSE;
16140 break;
16141 }
16142 }
16143 }
65f38f15 16144 break;
5bd4f169 16145
0b13192e
AM
16146 case R_PPC64_TOC:
16147 /* Relocation value is TOC base. */
16148 relocation = TOCstart;
cf35638d 16149 if (r_symndx == STN_UNDEF)
6f20ed8a 16150 relocation += htab->sec_info[input_section->id].toc_off;
8517fae7
AM
16151 else if (unresolved_reloc)
16152 ;
6f20ed8a
AM
16153 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
16154 relocation += htab->sec_info[sec->id].toc_off;
0b13192e
AM
16155 else
16156 unresolved_reloc = TRUE;
ab96bf03 16157 goto dodyn;
0b13192e 16158
5bd4f169
AM
16159 /* TOC16 relocs. We want the offset relative to the TOC base,
16160 which is the address of the start of the TOC plus 0x8000.
16161 The TOC consists of sections .got, .toc, .tocbss, and .plt,
16162 in this order. */
65f38f15
AM
16163 case R_PPC64_TOC16:
16164 case R_PPC64_TOC16_LO:
16165 case R_PPC64_TOC16_HI:
16166 case R_PPC64_TOC16_DS:
16167 case R_PPC64_TOC16_LO_DS:
16168 case R_PPC64_TOC16_HA:
6f20ed8a 16169 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
1bdd8fac
AM
16170 if (h != NULL)
16171 goto dodyn;
5bd4f169
AM
16172 break;
16173
16174 /* Relocate against the beginning of the section. */
65f38f15
AM
16175 case R_PPC64_SECTOFF:
16176 case R_PPC64_SECTOFF_LO:
16177 case R_PPC64_SECTOFF_HI:
16178 case R_PPC64_SECTOFF_DS:
16179 case R_PPC64_SECTOFF_LO_DS:
16180 case R_PPC64_SECTOFF_HA:
4ce794b7 16181 if (sec != NULL)
65f38f15 16182 addend -= sec->output_section->vma;
5bd4f169
AM
16183 break;
16184
25f23106
AM
16185 case R_PPC64_REL16:
16186 case R_PPC64_REL16_LO:
16187 case R_PPC64_REL16_HI:
16188 case R_PPC64_REL16_HA:
4a969973
AM
16189 case R_PPC64_REL16_HIGH:
16190 case R_PPC64_REL16_HIGHA:
16191 case R_PPC64_REL16_HIGHER:
16192 case R_PPC64_REL16_HIGHERA:
16193 case R_PPC64_REL16_HIGHEST:
16194 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
16195 case R_PPC64_REL16_HIGHER34:
16196 case R_PPC64_REL16_HIGHERA34:
16197 case R_PPC64_REL16_HIGHEST34:
16198 case R_PPC64_REL16_HIGHESTA34:
a680de9a 16199 case R_PPC64_REL16DX_HA:
721956f4
AM
16200 case R_PPC64_REL14:
16201 case R_PPC64_REL14_BRNTAKEN:
16202 case R_PPC64_REL14_BRTAKEN:
5d1634d7 16203 case R_PPC64_REL24:
05d0e962 16204 case R_PPC64_REL24_NOTOC:
5663e321
AM
16205 case R_PPC64_PCREL34:
16206 case R_PPC64_PCREL28:
5d1634d7
AM
16207 break;
16208
411e1bfb
AM
16209 case R_PPC64_TPREL16:
16210 case R_PPC64_TPREL16_LO:
16211 case R_PPC64_TPREL16_HI:
16212 case R_PPC64_TPREL16_HA:
16213 case R_PPC64_TPREL16_DS:
16214 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
16215 case R_PPC64_TPREL16_HIGH:
16216 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
16217 case R_PPC64_TPREL16_HIGHER:
16218 case R_PPC64_TPREL16_HIGHERA:
16219 case R_PPC64_TPREL16_HIGHEST:
16220 case R_PPC64_TPREL16_HIGHESTA:
c213164a 16221 case R_PPC64_TPREL34:
766bc656
AM
16222 if (h != NULL
16223 && h->elf.root.type == bfd_link_hash_undefweak
16224 && h->elf.dynindx == -1)
16225 {
16226 /* Make this relocation against an undefined weak symbol
16227 resolve to zero. This is really just a tweak, since
16228 code using weak externs ought to check that they are
16229 defined before using them. */
16230 bfd_byte *p = contents + rel->r_offset - d_offset;
16231
95f0d0d2 16232 insn = bfd_get_32 (input_bfd, p);
766bc656
AM
16233 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
16234 if (insn != 0)
95f0d0d2 16235 bfd_put_32 (input_bfd, insn, p);
766bc656
AM
16236 break;
16237 }
989f9879
AM
16238 if (htab->elf.tls_sec != NULL)
16239 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7c8bbca5
AM
16240 /* The TPREL16 relocs shouldn't really be used in shared
16241 libs or with non-local symbols as that will result in
16242 DT_TEXTREL being set, but support them anyway. */
16243 goto dodyn;
411e1bfb
AM
16244
16245 case R_PPC64_DTPREL16:
16246 case R_PPC64_DTPREL16_LO:
16247 case R_PPC64_DTPREL16_HI:
16248 case R_PPC64_DTPREL16_HA:
16249 case R_PPC64_DTPREL16_DS:
16250 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
16251 case R_PPC64_DTPREL16_HIGH:
16252 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
16253 case R_PPC64_DTPREL16_HIGHER:
16254 case R_PPC64_DTPREL16_HIGHERA:
16255 case R_PPC64_DTPREL16_HIGHEST:
16256 case R_PPC64_DTPREL16_HIGHESTA:
c213164a 16257 case R_PPC64_DTPREL34:
989f9879
AM
16258 if (htab->elf.tls_sec != NULL)
16259 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
16260 break;
16261
45965137
AM
16262 case R_PPC64_ADDR64_LOCAL:
16263 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
16264 ? h->elf.other
16265 : sym->st_other);
16266 break;
16267
e515b051
AM
16268 case R_PPC64_DTPMOD64:
16269 relocation = 1;
16270 addend = 0;
16271 goto dodyn;
16272
411e1bfb 16273 case R_PPC64_TPREL64:
989f9879
AM
16274 if (htab->elf.tls_sec != NULL)
16275 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
16276 goto dodyn;
16277
16278 case R_PPC64_DTPREL64:
989f9879
AM
16279 if (htab->elf.tls_sec != NULL)
16280 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
1a0670f3 16281 /* Fall through. */
411e1bfb 16282
65f38f15
AM
16283 /* Relocations that may need to be propagated if this is a
16284 dynamic object. */
04c9666a 16285 case R_PPC64_REL30:
65f38f15
AM
16286 case R_PPC64_REL32:
16287 case R_PPC64_REL64:
16288 case R_PPC64_ADDR14:
16289 case R_PPC64_ADDR14_BRNTAKEN:
16290 case R_PPC64_ADDR14_BRTAKEN:
16291 case R_PPC64_ADDR16:
16292 case R_PPC64_ADDR16_DS:
16293 case R_PPC64_ADDR16_HA:
16294 case R_PPC64_ADDR16_HI:
f9c6b907
AM
16295 case R_PPC64_ADDR16_HIGH:
16296 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16297 case R_PPC64_ADDR16_HIGHER:
16298 case R_PPC64_ADDR16_HIGHERA:
16299 case R_PPC64_ADDR16_HIGHEST:
16300 case R_PPC64_ADDR16_HIGHESTA:
16301 case R_PPC64_ADDR16_LO:
16302 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
16303 case R_PPC64_ADDR16_HIGHER34:
16304 case R_PPC64_ADDR16_HIGHERA34:
16305 case R_PPC64_ADDR16_HIGHEST34:
16306 case R_PPC64_ADDR16_HIGHESTA34:
65f38f15 16307 case R_PPC64_ADDR24:
65f38f15
AM
16308 case R_PPC64_ADDR32:
16309 case R_PPC64_ADDR64:
16310 case R_PPC64_UADDR16:
16311 case R_PPC64_UADDR32:
16312 case R_PPC64_UADDR64:
5663e321
AM
16313 case R_PPC64_D34:
16314 case R_PPC64_D34_LO:
16315 case R_PPC64_D34_HI30:
16316 case R_PPC64_D34_HA30:
16317 case R_PPC64_D28:
411e1bfb 16318 dodyn:
5d1634d7 16319 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
16320 break;
16321
41bd81ab
AM
16322 if (NO_OPD_RELOCS && is_opd)
16323 break;
16324
8a9e8e72 16325 if (bfd_link_pic (info)
b1b07054
AM
16326 ? ((h == NULL
16327 || h->dyn_relocs != NULL)
16328 && ((h != NULL && pc_dynrelocs (h))
16329 || must_be_dyn_reloc (info, r_type)))
8a9e8e72
AM
16330 : (h != NULL
16331 ? h->dyn_relocs != NULL
d311bc8b 16332 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
65f38f15 16333 {
b34976b6 16334 bfd_boolean skip, relocate;
65f38f15 16335 asection *sreloc;
1cf1f670 16336 bfd_vma out_off;
82e66161 16337 long indx = 0;
65f38f15
AM
16338
16339 /* When generating a dynamic object, these relocations
16340 are copied into the output file to be resolved at run
16341 time. */
16342
b34976b6
AM
16343 skip = FALSE;
16344 relocate = FALSE;
65f38f15 16345
1cf1f670
AM
16346 out_off = _bfd_elf_section_offset (output_bfd, info,
16347 input_section, rel->r_offset);
16348 if (out_off == (bfd_vma) -1)
b34976b6 16349 skip = TRUE;
1cf1f670 16350 else if (out_off == (bfd_vma) -2)
b34976b6 16351 skip = TRUE, relocate = TRUE;
1cf1f670
AM
16352 out_off += (input_section->output_section->vma
16353 + input_section->output_offset);
16354 outrel.r_offset = out_off;
411e1bfb 16355 outrel.r_addend = rel->r_addend;
65f38f15 16356
1cf1f670
AM
16357 /* Optimize unaligned reloc use. */
16358 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
16359 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
16360 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
16361 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
16362 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
16363 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
16364 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
16365 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
16366 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
16367
65f38f15 16368 if (skip)
0bb2d96a 16369 memset (&outrel, 0, sizeof outrel);
afe397ea 16370 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
16371 && !is_opd
16372 && r_type != R_PPC64_TOC)
14acf4dc 16373 {
82e66161
AM
16374 indx = h->elf.dynindx;
16375 BFD_ASSERT (indx != -1);
16376 outrel.r_info = ELF64_R_INFO (indx, r_type);
14acf4dc 16377 }
65f38f15
AM
16378 else
16379 {
41bd81ab
AM
16380 /* This symbol is local, or marked to become local,
16381 or this is an opd section reloc which must point
16382 at a local function. */
65f38f15 16383 outrel.r_addend += relocation;
e86ce104 16384 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 16385 {
3fad3c7c 16386 if (is_opd && h != NULL)
afbe61cf
AM
16387 {
16388 /* Lie about opd entries. This case occurs
16389 when building shared libraries and we
16390 reference a function in another shared
3fad3c7c
AM
16391 lib. The same thing happens for a weak
16392 definition in an application that's
16393 overridden by a strong definition in a
16394 shared lib. (I believe this is a generic
16395 bug in binutils handling of weak syms.)
16396 In these cases we won't use the opd
1e2f5b6e 16397 entry in this lib. */
b34976b6 16398 unresolved_reloc = FALSE;
afbe61cf 16399 }
25f23106
AM
16400 if (!is_opd
16401 && r_type == R_PPC64_ADDR64
16402 && (h != NULL
16403 ? h->elf.type == STT_GNU_IFUNC
16404 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
16405 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
16406 else
16407 {
16408 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 16409
25f23106
AM
16410 /* We need to relocate .opd contents for ld.so.
16411 Prelink also wants simple and consistent rules
16412 for relocs. This make all RELATIVE relocs have
16413 *r_offset equal to r_addend. */
16414 relocate = TRUE;
16415 }
65f38f15
AM
16416 }
16417 else
16418 {
25f23106
AM
16419 if (h != NULL
16420 ? h->elf.type == STT_GNU_IFUNC
16421 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
16422 {
25f53a85 16423 info->callbacks->einfo
695344c0 16424 /* xgettext:c-format */
174d0a74 16425 (_("%H: %s for indirect "
c1c8c1ef 16426 "function `%pT' unsupported\n"),
25f53a85 16427 input_bfd, input_section, rel->r_offset,
25f23106
AM
16428 ppc64_elf_howto_table[r_type]->name,
16429 sym_name);
16430 ret = FALSE;
16431 }
cf35638d 16432 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
16433 ;
16434 else if (sec == NULL || sec->owner == NULL)
16435 {
16436 bfd_set_error (bfd_error_bad_value);
b34976b6 16437 return FALSE;
65f38f15
AM
16438 }
16439 else
16440 {
f26a3287 16441 asection *osec = sec->output_section;
65f38f15 16442
f26a3287
AM
16443 if ((osec->flags & SEC_THREAD_LOCAL) != 0)
16444 {
16445 /* TLS symbol values are relative to the
16446 TLS segment. Dynamic relocations for
16447 local TLS symbols therefore can't be
16448 reduced to a relocation against their
16449 section symbol because it holds the
16450 address of the section, not a value
16451 relative to the TLS segment. We could
16452 change the .tdata dynamic section symbol
16453 to be zero value but STN_UNDEF works
16454 and is used elsewhere, eg. for TPREL64
16455 GOT relocs against local TLS symbols. */
16456 osec = htab->elf.tls_sec;
16457 indx = 0;
16458 }
16459 else
74541ad4 16460 {
74541ad4 16461 indx = elf_section_data (osec)->dynindx;
f26a3287
AM
16462 if (indx == 0)
16463 {
16464 if ((osec->flags & SEC_READONLY) == 0
16465 && htab->elf.data_index_section != NULL)
16466 osec = htab->elf.data_index_section;
16467 else
16468 osec = htab->elf.text_index_section;
16469 indx = elf_section_data (osec)->dynindx;
16470 }
16471 BFD_ASSERT (indx != 0);
74541ad4 16472 }
74541ad4 16473
65f38f15
AM
16474 /* We are turning this relocation into one
16475 against a section symbol, so subtract out
16476 the output section's address but not the
16477 offset of the input section in the output
16478 section. */
16479 outrel.r_addend -= osec->vma;
16480 }
16481
16482 outrel.r_info = ELF64_R_INFO (indx, r_type);
16483 }
16484 }
16485
16486 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
16487 if (h != NULL
16488 ? h->elf.type == STT_GNU_IFUNC
16489 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
82e66161
AM
16490 {
16491 sreloc = htab->elf.irelplt;
16492 if (indx == 0)
16493 htab->local_ifunc_resolver = 1;
16494 else if (is_static_defined (&h->elf))
16495 htab->maybe_local_ifunc_resolver = 1;
16496 }
65f38f15
AM
16497 if (sreloc == NULL)
16498 abort ();
16499
dfbb6ac9
AM
16500 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
16501 >= sreloc->size)
16502 abort ();
947216bf
AM
16503 loc = sreloc->contents;
16504 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
16505 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
16506
e59a1001
AM
16507 if (!warned_dynamic
16508 && !ppc64_glibc_dynamic_reloc (ELF64_R_TYPE (outrel.r_info)))
16509 {
16510 info->callbacks->einfo
16511 /* xgettext:c-format */
16512 (_("%X%P: %pB: %s against %pT "
16513 "is not supported by glibc as a dynamic relocation\n"),
16514 input_bfd,
16515 ppc64_elf_howto_table[ELF64_R_TYPE (outrel.r_info)]->name,
16516 sym_name);
16517 warned_dynamic = TRUE;
16518 }
16519
65f38f15
AM
16520 /* If this reloc is against an external symbol, it will
16521 be computed at runtime, so there's no need to do
81407a69
AM
16522 anything now. However, for the sake of prelink ensure
16523 that the section contents are a known value. */
2cdcc330 16524 if (!relocate)
81407a69
AM
16525 {
16526 unresolved_reloc = FALSE;
16527 /* The value chosen here is quite arbitrary as ld.so
16528 ignores section contents except for the special
16529 case of .opd where the contents might be accessed
16530 before relocation. Choose zero, as that won't
16531 cause reloc overflow. */
16532 relocation = 0;
16533 addend = 0;
16534 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
16535 to improve backward compatibility with older
16536 versions of ld. */
16537 if (r_type == R_PPC64_ADDR64)
16538 addend = outrel.r_addend;
16539 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 16540 else if (ppc64_elf_howto_table[r_type]->pc_relative)
f0158f44 16541 addend = outrel.r_offset;
81407a69 16542 }
65f38f15 16543 }
5bd4f169
AM
16544 break;
16545
65f38f15
AM
16546 case R_PPC64_COPY:
16547 case R_PPC64_GLOB_DAT:
16548 case R_PPC64_JMP_SLOT:
25f23106 16549 case R_PPC64_JMP_IREL:
65f38f15
AM
16550 case R_PPC64_RELATIVE:
16551 /* We shouldn't ever see these dynamic relocs in relocatable
16552 files. */
ae9a127f 16553 /* Fall through. */
65f38f15
AM
16554
16555 case R_PPC64_PLTGOT16:
16556 case R_PPC64_PLTGOT16_DS:
16557 case R_PPC64_PLTGOT16_HA:
16558 case R_PPC64_PLTGOT16_HI:
16559 case R_PPC64_PLTGOT16_LO:
16560 case R_PPC64_PLTGOT16_LO_DS:
16561 case R_PPC64_PLTREL32:
16562 case R_PPC64_PLTREL64:
16563 /* These ones haven't been implemented yet. */
16564
25f53a85 16565 info->callbacks->einfo
695344c0 16566 /* xgettext:c-format */
c1c8c1ef 16567 (_("%P: %pB: %s is not supported for `%pT'\n"),
d003868e 16568 input_bfd,
4ce794b7 16569 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
16570
16571 bfd_set_error (bfd_error_invalid_operation);
b34976b6 16572 ret = FALSE;
c316a17c 16573 goto copy_reloc;
65f38f15 16574 }
5bd4f169 16575
67f0cbdb
AM
16576 /* Multi-instruction sequences that access the TOC can be
16577 optimized, eg. addis ra,r2,0; addi rb,ra,x;
07d6d2b8 16578 to nop; addi rb,r2,x; */
67f0cbdb
AM
16579 switch (r_type)
16580 {
16581 default:
16582 break;
16583
16584 case R_PPC64_GOT_TLSLD16_HI:
16585 case R_PPC64_GOT_TLSGD16_HI:
16586 case R_PPC64_GOT_TPREL16_HI:
16587 case R_PPC64_GOT_DTPREL16_HI:
16588 case R_PPC64_GOT16_HI:
16589 case R_PPC64_TOC16_HI:
16590 /* These relocs would only be useful if building up an
16591 offset to later add to r2, perhaps in an indexed
16592 addressing mode instruction. Don't try to optimize.
16593 Unfortunately, the possibility of someone building up an
16594 offset like this or even with the HA relocs, means that
16595 we need to check the high insn when optimizing the low
16596 insn. */
16597 break;
16598
5663e321
AM
16599 case R_PPC64_PLTCALL_NOTOC:
16600 if (!unresolved_reloc)
16601 htab->notoc_plt = 1;
16602 /* Fall through. */
23cedd1d
AM
16603 case R_PPC64_PLTCALL:
16604 if (unresolved_reloc)
16605 {
16606 /* No plt entry. Make this into a direct call. */
16607 bfd_byte *p = contents + rel->r_offset;
16608 insn = bfd_get_32 (input_bfd, p);
16609 insn &= 1;
16610 bfd_put_32 (input_bfd, B_DOT | insn, p);
5663e321
AM
16611 if (r_type == R_PPC64_PLTCALL)
16612 bfd_put_32 (input_bfd, NOP, p + 4);
23cedd1d
AM
16613 unresolved_reloc = save_unresolved_reloc;
16614 r_type = R_PPC64_REL24;
16615 }
16616 break;
16617
5663e321 16618 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d
AM
16619 case R_PPC64_PLTSEQ:
16620 if (unresolved_reloc)
16621 {
16622 unresolved_reloc = FALSE;
16623 goto nop_it;
16624 }
16625 break;
16626
5663e321
AM
16627 case R_PPC64_PLT_PCREL34_NOTOC:
16628 if (!unresolved_reloc)
16629 htab->notoc_plt = 1;
16630 /* Fall through. */
16631 case R_PPC64_PLT_PCREL34:
16632 if (unresolved_reloc)
16633 {
16634 bfd_byte *p = contents + rel->r_offset;
16635 bfd_put_32 (input_bfd, PNOP >> 32, p);
16636 bfd_put_32 (input_bfd, PNOP, p + 4);
16637 unresolved_reloc = FALSE;
16638 goto copy_reloc;
16639 }
16640 break;
16641
23cedd1d
AM
16642 case R_PPC64_PLT16_HA:
16643 if (unresolved_reloc)
16644 {
16645 unresolved_reloc = FALSE;
16646 goto nop_it;
16647 }
16648 /* Fall through. */
67f0cbdb
AM
16649 case R_PPC64_GOT_TLSLD16_HA:
16650 case R_PPC64_GOT_TLSGD16_HA:
16651 case R_PPC64_GOT_TPREL16_HA:
16652 case R_PPC64_GOT_DTPREL16_HA:
16653 case R_PPC64_GOT16_HA:
16654 case R_PPC64_TOC16_HA:
98528052 16655 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16656 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052 16657 {
23cedd1d
AM
16658 bfd_byte *p;
16659 nop_it:
16660 p = contents + (rel->r_offset & ~3);
98528052 16661 bfd_put_32 (input_bfd, NOP, p);
d830549d 16662 goto copy_reloc;
98528052 16663 }
67f0cbdb
AM
16664 break;
16665
23cedd1d
AM
16666 case R_PPC64_PLT16_LO:
16667 case R_PPC64_PLT16_LO_DS:
16668 if (unresolved_reloc)
16669 {
16670 unresolved_reloc = FALSE;
16671 goto nop_it;
16672 }
16673 /* Fall through. */
67f0cbdb
AM
16674 case R_PPC64_GOT_TLSLD16_LO:
16675 case R_PPC64_GOT_TLSGD16_LO:
16676 case R_PPC64_GOT_TPREL16_LO_DS:
16677 case R_PPC64_GOT_DTPREL16_LO_DS:
16678 case R_PPC64_GOT16_LO:
16679 case R_PPC64_GOT16_LO_DS:
16680 case R_PPC64_TOC16_LO:
16681 case R_PPC64_TOC16_LO_DS:
98528052 16682 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16683 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
16684 {
16685 bfd_byte *p = contents + (rel->r_offset & ~3);
16686 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16687 if ((insn & (0x3fu << 26)) == 12u << 26 /* addic */)
560c8763
AM
16688 {
16689 /* Transform addic to addi when we change reg. */
2365f8d7 16690 insn &= ~((0x3fu << 26) | (0x1f << 16));
560c8763
AM
16691 insn |= (14u << 26) | (2 << 16);
16692 }
16693 else
67f0cbdb 16694 {
98528052
AM
16695 insn &= ~(0x1f << 16);
16696 insn |= 2 << 16;
67f0cbdb 16697 }
560c8763 16698 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
16699 }
16700 break;
9a23f96e
AM
16701
16702 case R_PPC64_TPREL16_HA:
16703 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16704 {
16705 bfd_byte *p = contents + (rel->r_offset & ~3);
16706 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16707 if ((insn & ((0x3fu << 26) | 0x1f << 16))
9a23f96e
AM
16708 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */)
16709 /* xgettext:c-format */
16710 info->callbacks->minfo
16711 (_("%H: warning: %s unexpected insn %#x.\n"),
d830549d
AM
16712 input_bfd, input_section, rel->r_offset,
16713 ppc64_elf_howto_table[r_type]->name, insn);
9a23f96e 16714 else
d830549d
AM
16715 {
16716 bfd_put_32 (input_bfd, NOP, p);
16717 goto copy_reloc;
16718 }
9a23f96e
AM
16719 }
16720 break;
16721
16722 case R_PPC64_TPREL16_LO:
16723 case R_PPC64_TPREL16_LO_DS:
16724 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16725 {
16726 bfd_byte *p = contents + (rel->r_offset & ~3);
16727 insn = bfd_get_32 (input_bfd, p);
16728 insn &= ~(0x1f << 16);
16729 insn |= 13 << 16;
16730 bfd_put_32 (input_bfd, insn, p);
16731 }
16732 break;
67f0cbdb
AM
16733 }
16734
65f38f15
AM
16735 /* Do any further special processing. */
16736 switch (r_type)
16737 {
16738 default:
16739 break;
16740
25f23106 16741 case R_PPC64_REL16_HA:
4a969973
AM
16742 case R_PPC64_REL16_HIGHA:
16743 case R_PPC64_REL16_HIGHERA:
16744 case R_PPC64_REL16_HIGHESTA:
a680de9a 16745 case R_PPC64_REL16DX_HA:
f9c6b907
AM
16746 case R_PPC64_ADDR16_HA:
16747 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16748 case R_PPC64_ADDR16_HIGHERA:
16749 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
16750 case R_PPC64_TOC16_HA:
16751 case R_PPC64_SECTOFF_HA:
411e1bfb 16752 case R_PPC64_TPREL16_HA:
f9c6b907 16753 case R_PPC64_TPREL16_HIGHA:
411e1bfb 16754 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 16755 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
16756 case R_PPC64_DTPREL16_HA:
16757 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 16758 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 16759 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
16760 /* It's just possible that this symbol is a weak symbol
16761 that's not actually defined anywhere. In that case,
16762 'sec' would be NULL, and we should leave the symbol
16763 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
16764 if (sec == NULL)
16765 break;
1a0670f3 16766 /* Fall through. */
5c5f6e17
AM
16767
16768 case R_PPC64_GOT16_HA:
16769 case R_PPC64_PLTGOT16_HA:
16770 case R_PPC64_PLT16_HA:
16771 case R_PPC64_GOT_TLSGD16_HA:
16772 case R_PPC64_GOT_TLSLD16_HA:
16773 case R_PPC64_GOT_TPREL16_HA:
16774 case R_PPC64_GOT_DTPREL16_HA:
16775 /* Add 0x10000 if sign bit in 0:15 is set.
16776 Bits 0:15 are not used. */
16777 addend += 0x8000;
65f38f15
AM
16778 break;
16779
5663e321
AM
16780 case R_PPC64_D34_HA30:
16781 case R_PPC64_ADDR16_HIGHERA34:
16782 case R_PPC64_ADDR16_HIGHESTA34:
16783 case R_PPC64_REL16_HIGHERA34:
16784 case R_PPC64_REL16_HIGHESTA34:
16785 if (sec != NULL)
16786 addend += 1ULL << 33;
16787 break;
16788
65f38f15
AM
16789 case R_PPC64_ADDR16_DS:
16790 case R_PPC64_ADDR16_LO_DS:
16791 case R_PPC64_GOT16_DS:
16792 case R_PPC64_GOT16_LO_DS:
16793 case R_PPC64_PLT16_LO_DS:
16794 case R_PPC64_SECTOFF_DS:
16795 case R_PPC64_SECTOFF_LO_DS:
16796 case R_PPC64_TOC16_DS:
16797 case R_PPC64_TOC16_LO_DS:
16798 case R_PPC64_PLTGOT16_DS:
16799 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
16800 case R_PPC64_GOT_TPREL16_DS:
16801 case R_PPC64_GOT_TPREL16_LO_DS:
16802 case R_PPC64_GOT_DTPREL16_DS:
16803 case R_PPC64_GOT_DTPREL16_LO_DS:
16804 case R_PPC64_TPREL16_DS:
16805 case R_PPC64_TPREL16_LO_DS:
16806 case R_PPC64_DTPREL16_DS:
16807 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
16808 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
16809 mask = 3;
a680de9a
PB
16810 /* If this reloc is against an lq, lxv, or stxv insn, then
16811 the value must be a multiple of 16. This is somewhat of
16812 a hack, but the "correct" way to do this by defining _DQ
16813 forms of all the _DS relocs bloats all reloc switches in
16814 this file. It doesn't make much sense to use these
16815 relocs in data, so testing the insn should be safe. */
2365f8d7
AM
16816 if ((insn & (0x3fu << 26)) == (56u << 26)
16817 || ((insn & (0x3fu << 26)) == (61u << 26) && (insn & 3) == 1))
adadcc0c 16818 mask = 15;
a680de9a
PB
16819 relocation += addend;
16820 addend = insn & (mask ^ 3);
16821 if ((relocation & mask) != 0)
65f38f15 16822 {
a680de9a 16823 relocation ^= relocation & mask;
25f53a85 16824 info->callbacks->einfo
695344c0 16825 /* xgettext:c-format */
174d0a74 16826 (_("%H: error: %s not a multiple of %u\n"),
25f53a85 16827 input_bfd, input_section, rel->r_offset,
d830549d 16828 ppc64_elf_howto_table[r_type]->name,
adadcc0c 16829 mask + 1);
65f38f15 16830 bfd_set_error (bfd_error_bad_value);
b34976b6 16831 ret = FALSE;
c316a17c 16832 goto copy_reloc;
65f38f15
AM
16833 }
16834 break;
5bd4f169
AM
16835 }
16836
239e1f3a
AM
16837 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
16838 because such sections are not SEC_ALLOC and thus ld.so will
16839 not process them. */
d830549d 16840 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15 16841 if (unresolved_reloc
239e1f3a 16842 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
16843 && h->elf.def_dynamic)
16844 && _bfd_elf_section_offset (output_bfd, info, input_section,
16845 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 16846 {
25f53a85 16847 info->callbacks->einfo
695344c0 16848 /* xgettext:c-format */
c1c8c1ef 16849 (_("%H: unresolvable %s against `%pT'\n"),
25f53a85 16850 input_bfd, input_section, rel->r_offset,
b80eed39 16851 howto->name,
039b3fef 16852 h->elf.root.root.string);
b34976b6 16853 ret = FALSE;
9c07fe7c 16854 }
5bd4f169 16855
b80eed39
AM
16856 /* 16-bit fields in insns mostly have signed values, but a
16857 few insns have 16-bit unsigned values. Really, we should
16858 have different reloc types. */
16859 if (howto->complain_on_overflow != complain_overflow_dont
16860 && howto->dst_mask == 0xffff
16861 && (input_section->flags & SEC_CODE) != 0)
16862 {
16863 enum complain_overflow complain = complain_overflow_signed;
16864
16865 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 16866 if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */)
a47622ac
AM
16867 complain = complain_overflow_bitfield;
16868 else if (howto->rightshift == 0
2365f8d7
AM
16869 ? ((insn & (0x3fu << 26)) == 28u << 26 /* andi */
16870 || (insn & (0x3fu << 26)) == 24u << 26 /* ori */
16871 || (insn & (0x3fu << 26)) == 26u << 26 /* xori */)
16872 : ((insn & (0x3fu << 26)) == 29u << 26 /* andis */
16873 || (insn & (0x3fu << 26)) == 25u << 26 /* oris */
16874 || (insn & (0x3fu << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
16875 complain = complain_overflow_unsigned;
16876 if (howto->complain_on_overflow != complain)
16877 {
16878 alt_howto = *howto;
16879 alt_howto.complain_on_overflow = complain;
16880 howto = &alt_howto;
16881 }
16882 }
16883
5663e321 16884 switch (r_type)
a680de9a 16885 {
5663e321
AM
16886 /* Split field relocs aren't handled by _bfd_final_link_relocate. */
16887 case R_PPC64_D34:
16888 case R_PPC64_D34_LO:
16889 case R_PPC64_D34_HI30:
16890 case R_PPC64_D34_HA30:
16891 case R_PPC64_PCREL34:
16892 case R_PPC64_GOT_PCREL34:
c213164a
AM
16893 case R_PPC64_TPREL34:
16894 case R_PPC64_DTPREL34:
16895 case R_PPC64_GOT_TLSGD34:
16896 case R_PPC64_GOT_TLSLD34:
16897 case R_PPC64_GOT_TPREL34:
16898 case R_PPC64_GOT_DTPREL34:
5663e321
AM
16899 case R_PPC64_PLT_PCREL34:
16900 case R_PPC64_PLT_PCREL34_NOTOC:
16901 case R_PPC64_D28:
16902 case R_PPC64_PCREL28:
16903 if (rel->r_offset + 8 > input_section->size)
16904 r = bfd_reloc_outofrange;
16905 else
16906 {
5663e321
AM
16907 relocation += addend;
16908 if (howto->pc_relative)
16909 relocation -= (rel->r_offset
16910 + input_section->output_offset
16911 + input_section->output_section->vma);
16912 relocation >>= howto->rightshift;
16913
16914 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16915 pinsn <<= 32;
16916 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
16917
16918 pinsn &= ~howto->dst_mask;
16919 pinsn |= (((relocation << 16) | (relocation & 0xffff))
16920 & howto->dst_mask);
16921 bfd_put_32 (input_bfd, pinsn >> 32, contents + rel->r_offset);
16922 bfd_put_32 (input_bfd, pinsn, contents + rel->r_offset + 4);
16923 r = bfd_reloc_ok;
16924 if (howto->complain_on_overflow == complain_overflow_signed
16925 && (relocation + (1ULL << (howto->bitsize - 1))
16926 >= 1ULL << howto->bitsize))
16927 r = bfd_reloc_overflow;
16928 }
16929 break;
16930
16931 case R_PPC64_REL16DX_HA:
a680de9a
PB
16932 if (rel->r_offset + 4 > input_section->size)
16933 r = bfd_reloc_outofrange;
16934 else
16935 {
16936 relocation += addend;
16937 relocation -= (rel->r_offset
16938 + input_section->output_offset
16939 + input_section->output_section->vma);
3de43e7b 16940 relocation = (bfd_signed_vma) relocation >> 16;
a680de9a
PB
16941 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16942 insn &= ~0x1fffc1;
3de43e7b 16943 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
a680de9a
PB
16944 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
16945 r = bfd_reloc_ok;
3de43e7b 16946 if (relocation + 0x8000 > 0xffff)
a680de9a
PB
16947 r = bfd_reloc_overflow;
16948 }
5663e321
AM
16949 break;
16950
16951 default:
16952 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
16953 contents, rel->r_offset,
16954 relocation, addend);
a680de9a 16955 }
5bd4f169 16956
ef60b7ff 16957 if (r != bfd_reloc_ok)
5bd4f169 16958 {
bc30df16 16959 char *more_info = NULL;
b80eed39 16960 const char *reloc_name = howto->name;
bc30df16
AM
16961
16962 if (reloc_dest != DEST_NORMAL)
16963 {
16964 more_info = bfd_malloc (strlen (reloc_name) + 8);
16965 if (more_info != NULL)
16966 {
16967 strcpy (more_info, reloc_name);
16968 strcat (more_info, (reloc_dest == DEST_OPD
16969 ? " (OPD)" : " (stub)"));
16970 reloc_name = more_info;
16971 }
16972 }
16973
cd27b276 16974 if (r == bfd_reloc_overflow)
5bd4f169 16975 {
8131c122
AM
16976 /* On code like "if (foo) foo();" don't report overflow
16977 on a branch to zero when foo is undefined. */
16978 if (!warned
16979 && (reloc_dest == DEST_STUB
16980 || !(h != NULL
16981 && (h->elf.root.type == bfd_link_hash_undefweak
16982 || h->elf.root.type == bfd_link_hash_undefined)
16983 && is_branch_reloc (r_type))))
1a72702b
AM
16984 info->callbacks->reloc_overflow (info, &h->elf.root,
16985 sym_name, reloc_name,
16986 orig_rel.r_addend,
16987 input_bfd, input_section,
16988 rel->r_offset);
ef60b7ff
AM
16989 }
16990 else
16991 {
25f53a85 16992 info->callbacks->einfo
695344c0 16993 /* xgettext:c-format */
c1c8c1ef 16994 (_("%H: %s against `%pT': error %d\n"),
25f53a85 16995 input_bfd, input_section, rel->r_offset,
bc30df16 16996 reloc_name, sym_name, (int) r);
b34976b6 16997 ret = FALSE;
ef60b7ff 16998 }
bc30df16
AM
16999 if (more_info != NULL)
17000 free (more_info);
5bd4f169 17001 }
c316a17c
AM
17002 copy_reloc:
17003 if (wrel != rel)
17004 *wrel = *rel;
17005 }
17006
17007 if (wrel != rel)
17008 {
17009 Elf_Internal_Shdr *rel_hdr;
17010 size_t deleted = rel - wrel;
17011
17012 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
17013 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
17014 if (rel_hdr->sh_size == 0)
17015 {
17016 /* It is too late to remove an empty reloc section. Leave
17017 one NONE reloc.
17018 ??? What is wrong with an empty section??? */
17019 rel_hdr->sh_size = rel_hdr->sh_entsize;
17020 deleted -= 1;
17021 }
17022 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
17023 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
17024 input_section->reloc_count -= deleted;
5bd4f169
AM
17025 }
17026
645ea6a9
AM
17027 /* If we're emitting relocations, then shortly after this function
17028 returns, reloc offsets and addends for this section will be
17029 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
17030 file rather than the input. Save a copy of the relocs for
17031 opd_entry_value. */
0e1862bb 17032 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
8860955f
AM
17033 {
17034 bfd_size_type amt;
17035 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
17036 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
17037 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
17038 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
17039 if (rel == NULL)
17040 return FALSE;
17041 memcpy (rel, relocs, amt);
17042 }
5bd4f169
AM
17043 return ret;
17044}
17045
754021d0
AM
17046/* Adjust the value of any local symbols in opd sections. */
17047
6e0b88f1 17048static int
754021d0
AM
17049ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
17050 const char *name ATTRIBUTE_UNUSED,
17051 Elf_Internal_Sym *elfsym,
17052 asection *input_sec,
17053 struct elf_link_hash_entry *h)
17054{
74f0fb50
AM
17055 struct _opd_sec_data *opd;
17056 long adjust;
754021d0
AM
17057 bfd_vma value;
17058
4025353c 17059 if (h != NULL)
6e0b88f1 17060 return 1;
4025353c 17061
74f0fb50
AM
17062 opd = get_opd_info (input_sec);
17063 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 17064 return 1;
754021d0
AM
17065
17066 value = elfsym->st_value - input_sec->output_offset;
0e1862bb 17067 if (!bfd_link_relocatable (info))
754021d0
AM
17068 value -= input_sec->output_section->vma;
17069
51aecdc5 17070 adjust = opd->adjust[OPD_NDX (value)];
4025353c 17071 if (adjust == -1)
6e0b88f1
AM
17072 return 2;
17073
17074 elfsym->st_value += adjust;
17075 return 1;
754021d0
AM
17076}
17077
5bd4f169
AM
17078/* Finish up dynamic symbol handling. We set the contents of various
17079 dynamic sections here. */
17080
b34976b6 17081static bfd_boolean
4ce794b7
AM
17082ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
17083 struct bfd_link_info *info,
17084 struct elf_link_hash_entry *h,
4aef7643 17085 Elf_Internal_Sym *sym)
5bd4f169 17086{
65f38f15 17087 struct ppc_link_hash_table *htab;
8387904d 17088 struct plt_entry *ent;
5bd4f169 17089
65f38f15 17090 htab = ppc_hash_table (info);
4dfe6ac6
NC
17091 if (htab == NULL)
17092 return FALSE;
5bd4f169 17093
49c09209
AM
17094 if (!htab->opd_abi && !h->def_regular)
17095 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
17096 if (ent->plt.offset != (bfd_vma) -1)
17097 {
17098 /* Mark the symbol as undefined, rather than as
17099 defined in glink. Leave the value if there were
17100 any relocations where pointer equality matters
17101 (this is a clue for the dynamic linker, to make
17102 function pointer comparisons work between an
17103 application and shared library), otherwise set it
17104 to zero. */
17105 sym->st_shndx = SHN_UNDEF;
17106 if (!h->pointer_equality_needed)
17107 sym->st_value = 0;
17108 else if (!h->ref_regular_nonweak)
17109 {
17110 /* This breaks function pointer comparisons, but
17111 that is better than breaking tests for a NULL
17112 function pointer. */
17113 sym->st_value = 0;
17114 }
17115 break;
17116 }
5bd4f169 17117
1bdd8fac
AM
17118 if (h->needs_copy
17119 && (h->root.type == bfd_link_hash_defined
17120 || h->root.type == bfd_link_hash_defweak)
17121 && (h->root.u.def.section == htab->elf.sdynbss
17122 || h->root.u.def.section == htab->elf.sdynrelro))
5bd4f169 17123 {
65f38f15 17124 /* This symbol needs a copy reloc. Set it up. */
49c09209 17125 Elf_Internal_Rela rela;
5474d94f 17126 asection *srel;
49c09209 17127 bfd_byte *loc;
5bd4f169 17128
1bdd8fac 17129 if (h->dynindx == -1)
65f38f15 17130 abort ();
5bd4f169 17131
ed7007c1 17132 rela.r_offset = defined_sym_val (h);
5bd4f169
AM
17133 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
17134 rela.r_addend = 0;
afbf7e8e 17135 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
17136 srel = htab->elf.sreldynrelro;
17137 else
17138 srel = htab->elf.srelbss;
17139 loc = srel->contents;
17140 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 17141 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
17142 }
17143
b34976b6 17144 return TRUE;
5bd4f169
AM
17145}
17146
65f38f15
AM
17147/* Used to decide how to sort relocs in an optimal manner for the
17148 dynamic linker, before writing them out. */
17149
17150static enum elf_reloc_type_class
7e612e98
AM
17151ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
17152 const asection *rel_sec,
17153 const Elf_Internal_Rela *rela)
65f38f15 17154{
04c9666a 17155 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
17156 struct ppc_link_hash_table *htab = ppc_hash_table (info);
17157
33e44f2e 17158 if (rel_sec == htab->elf.irelplt)
7e612e98 17159 return reloc_class_ifunc;
a33d1f77 17160
4ce794b7 17161 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 17162 switch (r_type)
65f38f15
AM
17163 {
17164 case R_PPC64_RELATIVE:
17165 return reloc_class_relative;
17166 case R_PPC64_JMP_SLOT:
17167 return reloc_class_plt;
17168 case R_PPC64_COPY:
17169 return reloc_class_copy;
17170 default:
17171 return reloc_class_normal;
17172 }
17173}
17174
5bd4f169
AM
17175/* Finish up the dynamic sections. */
17176
b34976b6 17177static bfd_boolean
4ce794b7
AM
17178ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
17179 struct bfd_link_info *info)
5bd4f169 17180{
65f38f15
AM
17181 struct ppc_link_hash_table *htab;
17182 bfd *dynobj;
5bd4f169 17183 asection *sdyn;
5bd4f169 17184
65f38f15 17185 htab = ppc_hash_table (info);
4dfe6ac6
NC
17186 if (htab == NULL)
17187 return FALSE;
17188
65f38f15 17189 dynobj = htab->elf.dynobj;
3d4d4302 17190 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 17191
65f38f15 17192 if (htab->elf.dynamic_sections_created)
5bd4f169 17193 {
5bd4f169
AM
17194 Elf64_External_Dyn *dyncon, *dynconend;
17195
33e44f2e 17196 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 17197 abort ();
5bd4f169
AM
17198
17199 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 17200 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
17201 for (; dyncon < dynconend; dyncon++)
17202 {
17203 Elf_Internal_Dyn dyn;
19397422 17204 asection *s;
5bd4f169
AM
17205
17206 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
17207
17208 switch (dyn.d_tag)
17209 {
65f38f15
AM
17210 default:
17211 continue;
5bd4f169 17212
5d1634d7 17213 case DT_PPC64_GLINK:
4ce794b7 17214 s = htab->glink;
6348e046 17215 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
17216 /* We stupidly defined DT_PPC64_GLINK to be the start
17217 of glink rather than the first entry point, which is
17218 what ld.so needs, and now have a bigger stub to
17219 support automatic multiple TOCs. */
9e390558 17220 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
5d1634d7
AM
17221 break;
17222
19397422
AM
17223 case DT_PPC64_OPD:
17224 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
17225 if (s == NULL)
17226 continue;
17227 dyn.d_un.d_ptr = s->vma;
19397422
AM
17228 break;
17229
e8910a83 17230 case DT_PPC64_OPT:
5663e321
AM
17231 if ((htab->do_multi_toc && htab->multi_toc_needed)
17232 || htab->notoc_plt)
e8910a83 17233 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
f378ab09
AM
17234 if (htab->has_plt_localentry0)
17235 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
e8910a83
AM
17236 break;
17237
19397422
AM
17238 case DT_PPC64_OPDSZ:
17239 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
17240 if (s == NULL)
17241 continue;
eea6121a 17242 dyn.d_un.d_val = s->size;
19397422
AM
17243 break;
17244
65f38f15 17245 case DT_PLTGOT:
33e44f2e 17246 s = htab->elf.splt;
6348e046 17247 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
17248 break;
17249
17250 case DT_JMPREL:
33e44f2e 17251 s = htab->elf.srelplt;
6348e046 17252 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 17253 break;
5bd4f169 17254
65f38f15 17255 case DT_PLTRELSZ:
33e44f2e 17256 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7 17257 break;
82e66161
AM
17258
17259 case DT_TEXTREL:
17260 if (htab->local_ifunc_resolver)
17261 info->callbacks->einfo
17262 (_("%X%P: text relocations and GNU indirect "
17263 "functions will result in a segfault at runtime\n"));
17264 else if (htab->maybe_local_ifunc_resolver)
17265 info->callbacks->einfo
17266 (_("%P: warning: text relocations and GNU indirect "
17267 "functions may result in a segfault at runtime\n"));
17268 continue;
5bd4f169 17269 }
5bd4f169 17270
65f38f15 17271 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 17272 }
5bd4f169
AM
17273 }
17274
6528b6eb
AM
17275 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
17276 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17277 {
17278 /* Fill in the first entry in the global offset table.
17279 We use it to hold the link-time TOCbase. */
17280 bfd_put_64 (output_bfd,
60ee0d4a 17281 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 17282 htab->elf.sgot->contents);
5d1634d7
AM
17283
17284 /* Set .got entry size. */
2cdcc330
AM
17285 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
17286 = 8;
5d1634d7
AM
17287 }
17288
6528b6eb
AM
17289 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
17290 && htab->elf.splt->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17291 {
17292 /* Set .plt entry size. */
33e44f2e 17293 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 17294 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
17295 }
17296
84f5d08e
AM
17297 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
17298 brlt ourselves if emitrelocations. */
17299 if (htab->brlt != NULL
17300 && htab->brlt->reloc_count != 0
17301 && !_bfd_elf_link_output_relocs (output_bfd,
17302 htab->brlt,
d4730f92 17303 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
17304 elf_section_data (htab->brlt)->relocs,
17305 NULL))
17306 return FALSE;
17307
176a0d42
AM
17308 if (htab->glink != NULL
17309 && htab->glink->reloc_count != 0
17310 && !_bfd_elf_link_output_relocs (output_bfd,
17311 htab->glink,
d4730f92 17312 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
17313 elf_section_data (htab->glink)->relocs,
17314 NULL))
17315 return FALSE;
17316
da44f4e5 17317
df136d64
AM
17318 if (htab->glink_eh_frame != NULL
17319 && htab->glink_eh_frame->size != 0
17320 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
17321 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
17322 htab->glink_eh_frame,
17323 htab->glink_eh_frame->contents))
17324 return FALSE;
58d180e8 17325
e717da7e 17326 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
17327 since we didn't add them to DYNOBJ. We know dynobj is the first
17328 bfd. */
c72f2fb2 17329 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
17330 {
17331 asection *s;
7b53ace3 17332
0c8d6e5c 17333 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
17334 continue;
17335
e717da7e
AM
17336 s = ppc64_elf_tdata (dynobj)->got;
17337 if (s != NULL
eea6121a 17338 && s->size != 0
e717da7e
AM
17339 && s->output_section != bfd_abs_section_ptr
17340 && !bfd_set_section_contents (output_bfd, s->output_section,
17341 s->contents, s->output_offset,
eea6121a 17342 s->size))
e717da7e
AM
17343 return FALSE;
17344 s = ppc64_elf_tdata (dynobj)->relgot;
17345 if (s != NULL
eea6121a 17346 && s->size != 0
e717da7e
AM
17347 && s->output_section != bfd_abs_section_ptr
17348 && !bfd_set_section_contents (output_bfd, s->output_section,
17349 s->contents, s->output_offset,
eea6121a 17350 s->size))
e717da7e
AM
17351 return FALSE;
17352 }
f6c52c13 17353
b34976b6 17354 return TRUE;
5bd4f169
AM
17355}
17356
5bd4f169 17357#include "elf64-target.h"
7b8e7dad
AM
17358
17359/* FreeBSD support */
17360
17361#undef TARGET_LITTLE_SYM
17362#undef TARGET_LITTLE_NAME
17363
17364#undef TARGET_BIG_SYM
6d00b590 17365#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
17366#undef TARGET_BIG_NAME
17367#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
17368
17369#undef ELF_OSABI
17370#define ELF_OSABI ELFOSABI_FREEBSD
17371
17372#undef elf64_bed
17373#define elf64_bed elf64_powerpc_fbsd_bed
17374
17375#include "elf64-target.h"
This page took 2.851296 seconds and 4 git commands to generate.