Yet more signed overflow fixes
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
82704155 2 Copyright (C) 1999-2019 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 *
7292b3ac 2123sym_exists_at (asymbol **syms, long lo, long hi, unsigned int id, bfd_vma value)
90e3cdf2 2124{
699733f6 2125 long mid;
90e3cdf2 2126
7292b3ac 2127 if (id == (unsigned) -1)
699733f6
AM
2128 {
2129 while (lo < hi)
2130 {
2131 mid = (lo + hi) >> 1;
2132 if (syms[mid]->value + syms[mid]->section->vma < value)
2133 lo = mid + 1;
2134 else if (syms[mid]->value + syms[mid]->section->vma > value)
2135 hi = mid;
2136 else
2137 return syms[mid];
2138 }
2139 }
2140 else
2141 {
2142 while (lo < hi)
2143 {
2144 mid = (lo + hi) >> 1;
2145 if (syms[mid]->section->id < id)
2146 lo = mid + 1;
2147 else if (syms[mid]->section->id > id)
2148 hi = mid;
2149 else if (syms[mid]->value < value)
2150 lo = mid + 1;
2151 else if (syms[mid]->value > value)
2152 hi = mid;
2153 else
2154 return syms[mid];
2155 }
2156 }
2157 return NULL;
90e3cdf2
JJ
2158}
2159
468392fb
AM
2160static bfd_boolean
2161section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
2162{
2163 bfd_vma vma = *(bfd_vma *) ptr;
2164 return ((section->flags & SEC_ALLOC) != 0
2165 && section->vma <= vma
2166 && vma < section->vma + section->size);
2167}
2168
699733f6 2169/* Create synthetic symbols, effectively restoring "dot-symbol" function
c4b0b099
AM
2170 entry syms. Also generate @plt symbols for the glink branch table.
2171 Returns count of synthetic symbols in RET or -1 on error. */
90e3cdf2
JJ
2172
2173static long
a7535cf3
AM
2174ppc64_elf_get_synthetic_symtab (bfd *abfd,
2175 long static_count, asymbol **static_syms,
2176 long dyn_count, asymbol **dyn_syms,
c9727e01 2177 asymbol **ret)
90e3cdf2
JJ
2178{
2179 asymbol *s;
0ccf57bd 2180 size_t i, j, count;
90e3cdf2 2181 char *names;
0ccf57bd 2182 size_t symcount, codesecsym, codesecsymend, secsymend, opdsymend;
ee67d69a 2183 asection *opd = NULL;
90e3cdf2 2184 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 2185 asymbol **syms;
ee67d69a 2186 int abi = abiversion (abfd);
90e3cdf2
JJ
2187
2188 *ret = NULL;
2189
ee67d69a
AM
2190 if (abi < 2)
2191 {
2192 opd = bfd_get_section_by_name (abfd, ".opd");
2193 if (opd == NULL && abi == 1)
2194 return 0;
2195 }
90e3cdf2 2196
a5259595
AM
2197 syms = NULL;
2198 codesecsym = 0;
2199 codesecsymend = 0;
2200 secsymend = 0;
2201 opdsymend = 0;
2202 symcount = 0;
2203 if (opd != NULL)
c9727e01 2204 {
a5259595
AM
2205 symcount = static_count;
2206 if (!relocatable)
2207 symcount += dyn_count;
2208 if (symcount == 0)
2209 return 0;
c9727e01 2210
a5259595
AM
2211 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2212 if (syms == NULL)
2213 return -1;
90e3cdf2 2214
a5259595
AM
2215 if (!relocatable && static_count != 0 && dyn_count != 0)
2216 {
2217 /* Use both symbol tables. */
2218 memcpy (syms, static_syms, static_count * sizeof (*syms));
2219 memcpy (syms + static_count, dyn_syms,
2220 (dyn_count + 1) * sizeof (*syms));
2221 }
2222 else if (!relocatable && static_count == 0)
2223 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
2224 else
2225 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
90e3cdf2 2226
0ccf57bd
AM
2227 /* Trim uninteresting symbols. Interesting symbols are section,
2228 function, and notype symbols. */
2229 for (i = 0, j = 0; i < symcount; ++i)
2230 if ((syms[i]->flags & (BSF_FILE | BSF_OBJECT | BSF_THREAD_LOCAL
2231 | BSF_RELC | BSF_SRELC)) == 0)
2232 syms[j++] = syms[i];
2233 symcount = j;
2234
a5259595
AM
2235 synthetic_relocatable = relocatable;
2236 synthetic_opd = opd;
2237 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 2238
a5259595
AM
2239 if (!relocatable && symcount > 1)
2240 {
bfa5bd2a
PA
2241 /* Trim duplicate syms, since we may have merged the normal
2242 and dynamic symbols. Actually, we only care about syms
2243 that have different values, so trim any with the same
2244 value. Don't consider ifunc and ifunc resolver symbols
2245 duplicates however, because GDB wants to know whether a
2246 text symbol is an ifunc resolver. */
a5259595 2247 for (i = 1, j = 1; i < symcount; ++i)
bfa5bd2a
PA
2248 {
2249 const asymbol *s0 = syms[i - 1];
2250 const asymbol *s1 = syms[i];
2251
2252 if ((s0->value + s0->section->vma
2253 != s1->value + s1->section->vma)
2254 || ((s0->flags & BSF_GNU_INDIRECT_FUNCTION)
2255 != (s1->flags & BSF_GNU_INDIRECT_FUNCTION)))
2256 syms[j++] = syms[i];
2257 }
a5259595
AM
2258 symcount = j;
2259 }
699733f6 2260
a5259595
AM
2261 i = 0;
2262 /* Note that here and in compare_symbols we can't compare opd and
2263 sym->section directly. With separate debug info files, the
2264 symbols will be extracted from the debug file while abfd passed
2265 to this function is the real binary. */
0ccf57bd 2266 if (strcmp (syms[i]->section->name, ".opd") == 0)
a5259595
AM
2267 ++i;
2268 codesecsym = i;
2269
2270 for (; i < symcount; ++i)
2271 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC
2272 | SEC_THREAD_LOCAL))
2273 != (SEC_CODE | SEC_ALLOC))
2274 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
2275 break;
2276 codesecsymend = i;
2277
2278 for (; i < symcount; ++i)
2279 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2280 break;
2281 secsymend = i;
2282
2283 for (; i < symcount; ++i)
2284 if (strcmp (syms[i]->section->name, ".opd") != 0)
2285 break;
2286 opdsymend = i;
2287
2288 for (; i < symcount; ++i)
2cdcc330
AM
2289 if (((syms[i]->section->flags
2290 & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL)))
a5259595
AM
2291 != (SEC_CODE | SEC_ALLOC))
2292 break;
2293 symcount = i;
2294 }
c9727e01 2295 count = 0;
90e3cdf2 2296
699733f6 2297 if (relocatable)
90e3cdf2 2298 {
699733f6
AM
2299 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2300 arelent *r;
2301 size_t size;
0ccf57bd 2302 size_t relcount;
90e3cdf2 2303
468392fb
AM
2304 if (opdsymend == secsymend)
2305 goto done;
2306
699733f6 2307 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2 2308 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
7356fed5 2309 if (relcount == 0)
c9727e01 2310 goto done;
90e3cdf2 2311
7356fed5
AM
2312 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
2313 {
2314 count = -1;
2315 goto done;
2316 }
2317
699733f6 2318 size = 0;
595da8c5 2319 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
2320 {
2321 asymbol *sym;
90e3cdf2 2322
595da8c5 2323 while (r < opd->relocation + relcount
699733f6
AM
2324 && r->address < syms[i]->value + opd->vma)
2325 ++r;
90e3cdf2 2326
595da8c5 2327 if (r == opd->relocation + relcount)
699733f6 2328 break;
90e3cdf2 2329
699733f6
AM
2330 if (r->address != syms[i]->value + opd->vma)
2331 continue;
90e3cdf2 2332
699733f6
AM
2333 if (r->howto->type != R_PPC64_ADDR64)
2334 continue;
90e3cdf2 2335
699733f6
AM
2336 sym = *r->sym_ptr_ptr;
2337 if (!sym_exists_at (syms, opdsymend, symcount,
2338 sym->section->id, sym->value + r->addend))
2339 {
2340 ++count;
2341 size += sizeof (asymbol);
2342 size += strlen (syms[i]->name) + 2;
2343 }
2344 }
90e3cdf2 2345
c4b0b099
AM
2346 if (size == 0)
2347 goto done;
699733f6
AM
2348 s = *ret = bfd_malloc (size);
2349 if (s == NULL)
2350 {
7356fed5 2351 count = -1;
c9727e01 2352 goto done;
699733f6 2353 }
90e3cdf2 2354
699733f6 2355 names = (char *) (s + count);
90e3cdf2 2356
595da8c5 2357 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 2358 {
699733f6 2359 asymbol *sym;
90e3cdf2 2360
595da8c5 2361 while (r < opd->relocation + relcount
699733f6
AM
2362 && r->address < syms[i]->value + opd->vma)
2363 ++r;
90e3cdf2 2364
595da8c5 2365 if (r == opd->relocation + relcount)
699733f6
AM
2366 break;
2367
2368 if (r->address != syms[i]->value + opd->vma)
2369 continue;
2370
2371 if (r->howto->type != R_PPC64_ADDR64)
2372 continue;
90e3cdf2 2373
699733f6
AM
2374 sym = *r->sym_ptr_ptr;
2375 if (!sym_exists_at (syms, opdsymend, symcount,
2376 sym->section->id, sym->value + r->addend))
2377 {
2378 size_t len;
2379
2380 *s = *syms[i];
6ba2a415 2381 s->flags |= BSF_SYNTHETIC;
699733f6
AM
2382 s->section = sym->section;
2383 s->value = sym->value + r->addend;
2384 s->name = names;
2385 *names++ = '.';
2386 len = strlen (syms[i]->name);
2387 memcpy (names, syms[i]->name, len + 1);
2388 names += len + 1;
6f610d07
UW
2389 /* Have udata.p point back to the original symbol this
2390 synthetic symbol was derived from. */
2391 s->udata.p = syms[i];
699733f6
AM
2392 s++;
2393 }
2394 }
2395 }
2396 else
90e3cdf2 2397 {
468392fb 2398 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
ee67d69a 2399 bfd_byte *contents = NULL;
699733f6 2400 size_t size;
0ccf57bd 2401 size_t plt_count = 0;
468392fb
AM
2402 bfd_vma glink_vma = 0, resolv_vma = 0;
2403 asection *dynamic, *glink = NULL, *relplt = NULL;
2404 arelent *p;
90e3cdf2 2405
ee67d69a 2406 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
699733f6 2407 {
c4b0b099
AM
2408 free_contents_and_exit_err:
2409 count = -1;
ee67d69a 2410 free_contents_and_exit:
699733f6 2411 if (contents)
ee67d69a 2412 free (contents);
c9727e01 2413 goto done;
699733f6 2414 }
90e3cdf2 2415
699733f6
AM
2416 size = 0;
2417 for (i = secsymend; i < opdsymend; ++i)
2418 {
2419 bfd_vma ent;
90e3cdf2 2420
5ef11c02
AM
2421 /* Ignore bogus symbols. */
2422 if (syms[i]->value > opd->size - 8)
2423 continue;
2424
699733f6
AM
2425 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2426 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2427 {
2428 ++count;
2429 size += sizeof (asymbol);
2430 size += strlen (syms[i]->name) + 2;
2431 }
2432 }
90e3cdf2 2433
468392fb 2434 /* Get start of .glink stubs from DT_PPC64_GLINK. */
066ee829
AM
2435 if (dyn_count != 0
2436 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
468392fb
AM
2437 {
2438 bfd_byte *dynbuf, *extdyn, *extdynend;
2439 size_t extdynsize;
2440 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
2441
2442 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
c4b0b099 2443 goto free_contents_and_exit_err;
468392fb
AM
2444
2445 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
2446 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
2447
2448 extdyn = dynbuf;
2449 extdynend = extdyn + dynamic->size;
2450 for (; extdyn < extdynend; extdyn += extdynsize)
2451 {
2452 Elf_Internal_Dyn dyn;
2453 (*swap_dyn_in) (abfd, extdyn, &dyn);
2454
2455 if (dyn.d_tag == DT_NULL)
2456 break;
2457
2458 if (dyn.d_tag == DT_PPC64_GLINK)
2459 {
9e390558
AM
2460 /* The first glink stub starts at DT_PPC64_GLINK plus 32.
2461 See comment in ppc64_elf_finish_dynamic_sections. */
2462 glink_vma = dyn.d_un.d_val + 8 * 4;
468392fb
AM
2463 /* The .glink section usually does not survive the final
2464 link; search for the section (usually .text) where the
2465 glink stubs now reside. */
2466 glink = bfd_sections_find_if (abfd, section_covers_vma,
2467 &glink_vma);
2468 break;
2469 }
2470 }
2471
2472 free (dynbuf);
2473 }
2474
2475 if (glink != NULL)
2476 {
2477 /* Determine __glink trampoline by reading the relative branch
2478 from the first glink stub. */
2479 bfd_byte buf[4];
b9e5796b
AM
2480 unsigned int off = 0;
2481
2482 while (bfd_get_section_contents (abfd, glink, buf,
2483 glink_vma + off - glink->vma, 4))
468392fb
AM
2484 {
2485 unsigned int insn = bfd_get_32 (abfd, buf);
2486 insn ^= B_DOT;
2487 if ((insn & ~0x3fffffc) == 0)
b9e5796b 2488 {
2cdcc330
AM
2489 resolv_vma
2490 = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
b9e5796b
AM
2491 break;
2492 }
2493 off += 4;
2494 if (off > 4)
2495 break;
468392fb
AM
2496 }
2497
2498 if (resolv_vma)
2499 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
468392fb 2500
066ee829
AM
2501 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2502 if (relplt != NULL)
2503 {
2504 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2cdcc330 2505 if (!(*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
c4b0b099 2506 goto free_contents_and_exit_err;
68ffbac6 2507
066ee829
AM
2508 plt_count = relplt->size / sizeof (Elf64_External_Rela);
2509 size += plt_count * sizeof (asymbol);
468392fb 2510
066ee829
AM
2511 p = relplt->relocation;
2512 for (i = 0; i < plt_count; i++, p++)
e054468f
AM
2513 {
2514 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
2515 if (p->addend != 0)
2516 size += sizeof ("+0x") - 1 + 16;
2517 }
066ee829 2518 }
468392fb
AM
2519 }
2520
c4b0b099
AM
2521 if (size == 0)
2522 goto free_contents_and_exit;
699733f6
AM
2523 s = *ret = bfd_malloc (size);
2524 if (s == NULL)
c4b0b099 2525 goto free_contents_and_exit_err;
90e3cdf2 2526
468392fb 2527 names = (char *) (s + count + plt_count + (resolv_vma != 0));
90e3cdf2 2528
699733f6 2529 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 2530 {
699733f6 2531 bfd_vma ent;
90e3cdf2 2532
5ef11c02
AM
2533 if (syms[i]->value > opd->size - 8)
2534 continue;
2535
699733f6
AM
2536 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2537 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 2538 {
0ccf57bd 2539 size_t lo, hi;
699733f6 2540 size_t len;
c9727e01 2541 asection *sec = abfd->sections;
90e3cdf2 2542
699733f6
AM
2543 *s = *syms[i];
2544 lo = codesecsym;
2545 hi = codesecsymend;
2546 while (lo < hi)
2547 {
0ccf57bd 2548 size_t mid = (lo + hi) >> 1;
699733f6
AM
2549 if (syms[mid]->section->vma < ent)
2550 lo = mid + 1;
2551 else if (syms[mid]->section->vma > ent)
2552 hi = mid;
2553 else
c9727e01
AM
2554 {
2555 sec = syms[mid]->section;
2556 break;
2557 }
699733f6
AM
2558 }
2559
c9727e01 2560 if (lo >= hi && lo > codesecsym)
699733f6 2561 sec = syms[lo - 1]->section;
699733f6
AM
2562
2563 for (; sec != NULL; sec = sec->next)
2564 {
2565 if (sec->vma > ent)
2566 break;
63524580
JK
2567 /* SEC_LOAD may not be set if SEC is from a separate debug
2568 info file. */
2569 if ((sec->flags & SEC_ALLOC) == 0)
699733f6
AM
2570 break;
2571 if ((sec->flags & SEC_CODE) != 0)
2572 s->section = sec;
2573 }
6ba2a415 2574 s->flags |= BSF_SYNTHETIC;
699733f6
AM
2575 s->value = ent - s->section->vma;
2576 s->name = names;
2577 *names++ = '.';
2578 len = strlen (syms[i]->name);
2579 memcpy (names, syms[i]->name, len + 1);
2580 names += len + 1;
6f610d07
UW
2581 /* Have udata.p point back to the original symbol this
2582 synthetic symbol was derived from. */
2583 s->udata.p = syms[i];
699733f6 2584 s++;
90e3cdf2 2585 }
90e3cdf2 2586 }
699733f6 2587 free (contents);
468392fb
AM
2588
2589 if (glink != NULL && relplt != NULL)
2590 {
2591 if (resolv_vma)
2592 {
2593 /* Add a symbol for the main glink trampoline. */
86a4952b 2594 memset (s, 0, sizeof *s);
468392fb 2595 s->the_bfd = abfd;
6ba2a415 2596 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
468392fb
AM
2597 s->section = glink;
2598 s->value = resolv_vma - glink->vma;
2599 s->name = names;
2cdcc330
AM
2600 memcpy (names, "__glink_PLTresolve",
2601 sizeof ("__glink_PLTresolve"));
468392fb
AM
2602 names += sizeof ("__glink_PLTresolve");
2603 s++;
2604 count++;
2605 }
2606
2607 /* FIXME: It would be very much nicer to put sym@plt on the
2608 stub rather than on the glink branch table entry. The
2609 objdump disassembler would then use a sensible symbol
2610 name on plt calls. The difficulty in doing so is
2611 a) finding the stubs, and,
2612 b) matching stubs against plt entries, and,
2613 c) there can be multiple stubs for a given plt entry.
2614
2615 Solving (a) could be done by code scanning, but older
2616 ppc64 binaries used different stubs to current code.
2617 (b) is the tricky one since you need to known the toc
2618 pointer for at least one function that uses a pic stub to
2619 be able to calculate the plt address referenced.
2620 (c) means gdb would need to set multiple breakpoints (or
2621 find the glink branch itself) when setting breakpoints
2622 for pending shared library loads. */
2623 p = relplt->relocation;
2624 for (i = 0; i < plt_count; i++, p++)
2625 {
2626 size_t len;
2627
2628 *s = **p->sym_ptr_ptr;
2629 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
2630 we are defining a symbol, ensure one of them is set. */
2631 if ((s->flags & BSF_LOCAL) == 0)
2632 s->flags |= BSF_GLOBAL;
6ba2a415 2633 s->flags |= BSF_SYNTHETIC;
468392fb
AM
2634 s->section = glink;
2635 s->value = glink_vma - glink->vma;
2636 s->name = names;
2637 s->udata.p = NULL;
2638 len = strlen ((*p->sym_ptr_ptr)->name);
2639 memcpy (names, (*p->sym_ptr_ptr)->name, len);
2640 names += len;
e054468f
AM
2641 if (p->addend != 0)
2642 {
2643 memcpy (names, "+0x", sizeof ("+0x") - 1);
2644 names += sizeof ("+0x") - 1;
2645 bfd_sprintf_vma (abfd, names, p->addend);
2646 names += strlen (names);
2647 }
468392fb
AM
2648 memcpy (names, "@plt", sizeof ("@plt"));
2649 names += sizeof ("@plt");
2650 s++;
b9e5796b
AM
2651 if (abi < 2)
2652 {
2653 glink_vma += 8;
2654 if (i >= 0x8000)
2655 glink_vma += 4;
2656 }
2657 else
468392fb
AM
2658 glink_vma += 4;
2659 }
2660 count += plt_count;
2661 }
90e3cdf2
JJ
2662 }
2663
c9727e01 2664 done:
a7535cf3 2665 free (syms);
90e3cdf2
JJ
2666 return count;
2667}
5bd4f169 2668\f
65f38f15
AM
2669/* The following functions are specific to the ELF linker, while
2670 functions above are used generally. Those named ppc64_elf_* are
2671 called by the main ELF linker code. They appear in this file more
2672 or less in the order in which they are called. eg.
2673 ppc64_elf_check_relocs is called early in the link process,
2674 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
2675 called.
2676
2677 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2678 functions have both a function code symbol and a function descriptor
2679 symbol. A call to foo in a relocatable object file looks like:
2680
2681 . .text
2682 . x:
2683 . bl .foo
2684 . nop
2685
2686 The function definition in another object file might be:
2687
2688 . .section .opd
2689 . foo: .quad .foo
2690 . .quad .TOC.@tocbase
2691 . .quad 0
2692 .
2693 . .text
2694 . .foo: blr
2695
2696 When the linker resolves the call during a static link, the branch
2697 unsurprisingly just goes to .foo and the .opd information is unused.
2698 If the function definition is in a shared library, things are a little
2699 different: The call goes via a plt call stub, the opd information gets
2700 copied to the plt, and the linker patches the nop.
2701
2702 . x:
2703 . bl .foo_stub
2704 . ld 2,40(1)
2705 .
2706 .
2707 . .foo_stub:
71a39c98
AM
2708 . std 2,40(1) # in practice, the call stub
2709 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
2710 . addi 11,11,Lfoo@toc@l # this is the general idea
2711 . ld 12,0(11)
2712 . ld 2,8(11)
2713 . mtctr 12
2714 . ld 11,16(11)
e86ce104
AM
2715 . bctr
2716 .
2717 . .section .plt
2718 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
2719
2720 The "reloc ()" notation is supposed to indicate that the linker emits
2721 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
2722 copying.
2723
2724 What are the difficulties here? Well, firstly, the relocations
2725 examined by the linker in check_relocs are against the function code
2726 sym .foo, while the dynamic relocation in the plt is emitted against
2727 the function descriptor symbol, foo. Somewhere along the line, we need
2728 to carefully copy dynamic link information from one symbol to the other.
2729 Secondly, the generic part of the elf linker will make .foo a dynamic
2730 symbol as is normal for most other backends. We need foo dynamic
2731 instead, at least for an application final link. However, when
2732 creating a shared library containing foo, we need to have both symbols
2733 dynamic so that references to .foo are satisfied during the early
2734 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
2735 definition from some other object, eg. a static library.
2736
2737 Update: As of August 2004, we support a new convention. Function
2738 calls may use the function descriptor symbol, ie. "bl foo". This
2739 behaves exactly as "bl .foo". */
65f38f15 2740
7c8bbca5
AM
2741/* Of those relocs that might be copied as dynamic relocs, this
2742 function selects those that must be copied when linking a shared
2743 library or PIE, even when the symbol is local. */
65f38f15 2744
1d483afe
AM
2745static int
2746must_be_dyn_reloc (struct bfd_link_info *info,
2747 enum elf_ppc64_reloc_type r_type)
2748{
2749 switch (r_type)
2750 {
2751 default:
7c8bbca5
AM
2752 /* Only relative relocs can be resolved when the object load
2753 address isn't fixed. DTPREL64 is excluded because the
2754 dynamic linker needs to differentiate global dynamic from
2755 local dynamic __tls_index pairs when PPC64_OPT_TLS is set. */
1d483afe
AM
2756 return 1;
2757
2758 case R_PPC64_REL32:
2759 case R_PPC64_REL64:
2760 case R_PPC64_REL30:
1bdd8fac
AM
2761 case R_PPC64_TOC16:
2762 case R_PPC64_TOC16_DS:
2763 case R_PPC64_TOC16_LO:
2764 case R_PPC64_TOC16_HI:
2765 case R_PPC64_TOC16_HA:
2766 case R_PPC64_TOC16_LO_DS:
1d483afe
AM
2767 return 0;
2768
2769 case R_PPC64_TPREL16:
2770 case R_PPC64_TPREL16_LO:
2771 case R_PPC64_TPREL16_HI:
2772 case R_PPC64_TPREL16_HA:
2773 case R_PPC64_TPREL16_DS:
2774 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
2775 case R_PPC64_TPREL16_HIGH:
2776 case R_PPC64_TPREL16_HIGHA:
1d483afe
AM
2777 case R_PPC64_TPREL16_HIGHER:
2778 case R_PPC64_TPREL16_HIGHERA:
2779 case R_PPC64_TPREL16_HIGHEST:
2780 case R_PPC64_TPREL16_HIGHESTA:
2781 case R_PPC64_TPREL64:
c213164a 2782 case R_PPC64_TPREL34:
7c8bbca5
AM
2783 /* These relocations are relative but in a shared library the
2784 linker doesn't know the thread pointer base. */
2785 return bfd_link_dll (info);
1d483afe
AM
2786 }
2787}
65f38f15 2788
f4656909
AM
2789/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
2790 copying dynamic variables from a shared lib into an app's dynbss
2791 section, and instead use a dynamic relocation to point into the
5d35169e
AM
2792 shared lib. With code that gcc generates, it's vital that this be
2793 enabled; In the PowerPC64 ABI, the address of a function is actually
2794 the address of a function descriptor, which resides in the .opd
2795 section. gcc uses the descriptor directly rather than going via the
2796 GOT as some other ABI's do, which means that initialized function
2797 pointers must reference the descriptor. Thus, a function pointer
2798 initialized to the address of a function in a shared library will
2799 either require a copy reloc, or a dynamic reloc. Using a copy reloc
4cc11e76 2800 redefines the function descriptor symbol to point to the copy. This
5d35169e
AM
2801 presents a problem as a plt entry for that function is also
2802 initialized from the function descriptor symbol and the copy reloc
2803 may not be initialized first. */
a23b6845 2804#define ELIMINATE_COPY_RELOCS 1
f4656909 2805
721956f4 2806/* Section name for stubs is the associated section name plus this
29942be8
NC
2807 string. */
2808#define STUB_SUFFIX ".stub"
721956f4
AM
2809
2810/* Linker stubs.
2811 ppc_stub_long_branch:
2812 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
2813 destination, but a 24 bit branch in a stub section will reach.
2814 . b dest
2815
2816 ppc_stub_plt_branch:
2817 Similar to the above, but a 24 bit branch in the stub section won't
2818 reach its destination.
71a39c98
AM
2819 . addis %r11,%r2,xxx@toc@ha
2820 . ld %r12,xxx@toc@l(%r11)
2821 . mtctr %r12
721956f4
AM
2822 . bctr
2823
2824 ppc_stub_plt_call:
2c66dc6c
AM
2825 Used to call a function in a shared library. If it so happens that
2826 the plt entry referenced crosses a 64k boundary, then an extra
71a39c98 2827 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
05d0e962 2828 ppc_stub_plt_call_r2save starts with "std %r2,40(%r1)".
71a39c98
AM
2829 . addis %r11,%r2,xxx@toc@ha
2830 . ld %r12,xxx+0@toc@l(%r11)
2831 . mtctr %r12
2832 . ld %r2,xxx+8@toc@l(%r11)
2833 . ld %r11,xxx+16@toc@l(%r11)
721956f4 2834 . bctr
ad8e1ba5
AM
2835
2836 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
2837 code to adjust the value and save r2 to support multiple toc sections.
2838 A ppc_stub_long_branch with an r2 offset looks like:
2839 . std %r2,40(%r1)
2840 . addis %r2,%r2,off@ha
2841 . addi %r2,%r2,off@l
2842 . b dest
2843
2844 A ppc_stub_plt_branch with an r2 offset looks like:
2845 . std %r2,40(%r1)
71a39c98
AM
2846 . addis %r11,%r2,xxx@toc@ha
2847 . ld %r12,xxx@toc@l(%r11)
ad8e1ba5
AM
2848 . addis %r2,%r2,off@ha
2849 . addi %r2,%r2,off@l
71a39c98 2850 . mtctr %r12
ad8e1ba5 2851 . bctr
ac2df442 2852
05d0e962
AM
2853 All of the above stubs are shown as their ELFv1 variants. ELFv2
2854 variants exist too, simpler for plt calls since a new toc pointer
2855 and static chain are not loaded by the stub. In addition, ELFv2
2856 has some more complex stubs to handle calls marked with NOTOC
2857 relocs from functions where r2 is not a valid toc pointer. These
2858 come in two flavours, the ones shown below, and _both variants that
2859 start with "std %r2,24(%r1)" to save r2 in the unlikely event that
2860 one call is from a function where r2 is used as the toc pointer but
2861 needs a toc adjusting stub for small-model multi-toc, and another
2862 call is from a function where r2 is not valid.
2863 ppc_stub_long_branch_notoc:
2864 . mflr %r12
2865 . bcl 20,31,1f
2866 . 1:
2867 . mflr %r11
2868 . mtlr %r12
2cdcc330
AM
2869 . addis %r12,%r11,dest-1b@ha
2870 . addi %r12,%r12,dest-1b@l
05d0e962
AM
2871 . b dest
2872
2873 ppc_stub_plt_branch_notoc:
2874 . mflr %r12
2875 . bcl 20,31,1f
2876 . 1:
2877 . mflr %r11
2878 . mtlr %r12
2879 . lis %r12,xxx-1b@highest
f891966f 2880 . ori %r12,%r12,xxx-1b@higher
05d0e962 2881 . sldi %r12,%r12,32
f891966f 2882 . oris %r12,%r12,xxx-1b@high
05d0e962
AM
2883 . ori %r12,%r12,xxx-1b@l
2884 . add %r12,%r11,%r12
2885 . mtctr %r12
2886 . bctr
2887
2888 ppc_stub_plt_call_notoc:
2889 . mflr %r12
2890 . bcl 20,31,1f
2891 . 1:
2892 . mflr %r11
2893 . mtlr %r12
2894 . lis %r12,xxx-1b@highest
f891966f 2895 . ori %r12,%r12,xxx-1b@higher
05d0e962 2896 . sldi %r12,%r12,32
f891966f 2897 . oris %r12,%r12,xxx-1b@high
05d0e962
AM
2898 . ori %r12,%r12,xxx-1b@l
2899 . ldx %r12,%r11,%r12
2900 . mtctr %r12
2901 . bctr
2902
04bdff6a
AM
2903 There are also ELFv1 powerxx variants of these stubs.
2904 ppc_stub_long_branch_notoc:
d4b87b1e 2905 . pla %r12,dest@pcrel
04bdff6a
AM
2906 . b dest
2907 ppc_stub_plt_branch_notoc:
2908 . lis %r11,(dest-1f)@highesta34
2909 . ori %r11,%r11,(dest-1f)@highera34
2910 . sldi %r11,%r11,34
d4b87b1e 2911 . 1: pla %r12,dest@pcrel
04bdff6a
AM
2912 . add %r12,%r11,%r12
2913 . mtctr %r12
2914 . bctr
2915 ppc_stub_plt_call_notoc:
2916 . lis %r11,(xxx-1f)@highesta34
2917 . ori %r11,%r11,(xxx-1f)@highera34
2918 . sldi %r11,%r11,34
d4b87b1e 2919 . 1: pla %r12,xxx@pcrel
04bdff6a
AM
2920 . ldx %r12,%r11,%r12
2921 . mtctr %r12
2922 . bctr
2923
05d0e962
AM
2924 In cases where the high instructions would add zero, they are
2925 omitted and following instructions modified in some cases.
04bdff6a
AM
2926 For example, a powerxx ppc_stub_plt_call_notoc might simplify down
2927 to
2928 . pld %r12,xxx@pcrel
2929 . mtctr %r12
2930 . bctr
05d0e962
AM
2931
2932 For a given stub group (a set of sections all using the same toc
2933 pointer value) there will be just one stub type used for any
2934 particular function symbol. For example, if printf is called from
2935 code with the tocsave optimization (ie. r2 saved in function
2936 prologue) and therefore calls use a ppc_stub_plt_call linkage stub,
2937 and from other code without the tocsave optimization requiring a
2938 ppc_stub_plt_call_r2save linkage stub, a single stub of the latter
2939 type will be created. Calls with the tocsave optimization will
2940 enter this stub after the instruction saving r2. A similar
2941 situation exists when calls are marked with R_PPC64_REL24_NOTOC
2942 relocations. These require a ppc_stub_plt_call_notoc linkage stub
2943 to call an external function like printf. If other calls to printf
2944 require a ppc_stub_plt_call linkage stub then a single
2945 ppc_stub_plt_call_notoc linkage stub will be used for both types of
2946 call. If other calls to printf require a ppc_stub_plt_call_r2save
2947 linkage stub then a single ppc_stub_plt_call_both linkage stub will
2948 be created and calls not requiring r2 to be saved will enter the
2949 stub after the r2 save instruction. There is an analogous
2950 hierarchy of long branch and plt branch stubs for local call
2951 linkage. */
721956f4 2952
2cdcc330
AM
2953enum ppc_stub_type
2954{
721956f4
AM
2955 ppc_stub_none,
2956 ppc_stub_long_branch,
ad8e1ba5 2957 ppc_stub_long_branch_r2off,
05d0e962
AM
2958 ppc_stub_long_branch_notoc,
2959 ppc_stub_long_branch_both, /* r2off and notoc variants both needed. */
721956f4 2960 ppc_stub_plt_branch,
ad8e1ba5 2961 ppc_stub_plt_branch_r2off,
05d0e962
AM
2962 ppc_stub_plt_branch_notoc,
2963 ppc_stub_plt_branch_both,
794e51c0 2964 ppc_stub_plt_call,
7341d5e2 2965 ppc_stub_plt_call_r2save,
05d0e962
AM
2966 ppc_stub_plt_call_notoc,
2967 ppc_stub_plt_call_both,
a4b6fadd
AM
2968 ppc_stub_global_entry,
2969 ppc_stub_save_res
721956f4
AM
2970};
2971
6f20ed8a
AM
2972/* Information on stub grouping. */
2973struct map_stub
2974{
2975 /* The stub section. */
2976 asection *stub_sec;
2977 /* This is the section to which stubs in the group will be attached. */
2978 asection *link_sec;
a4b6fadd
AM
2979 /* Next group. */
2980 struct map_stub *next;
2981 /* Whether to emit a copy of register save/restore functions in this
2982 group. */
2983 int needs_save_res;
df136d64
AM
2984 /* Current offset within stubs after the insn restoring lr in a
2985 _notoc or _both stub using bcl for pc-relative addressing, or
2986 after the insn restoring lr in a __tls_get_addr_opt plt stub. */
2987 unsigned int lr_restore;
2988 /* Accumulated size of EH info emitted to describe return address
2989 if stubs modify lr. Does not include 17 byte FDE header. */
2990 unsigned int eh_size;
2991 /* Offset in glink_eh_frame to the start of EH info for this group. */
2992 unsigned int eh_base;
6f20ed8a
AM
2993};
2994
2cdcc330
AM
2995struct ppc_stub_hash_entry
2996{
721956f4
AM
2997 /* Base hash table entry structure. */
2998 struct bfd_hash_entry root;
2999
ad8e1ba5
AM
3000 enum ppc_stub_type stub_type;
3001
6f20ed8a
AM
3002 /* Group information. */
3003 struct map_stub *group;
721956f4
AM
3004
3005 /* Offset within stub_sec of the beginning of this stub. */
3006 bfd_vma stub_offset;
3007
3008 /* Given the symbol's value and its section we can determine its final
3009 value when building the stubs (so the stub knows where to jump. */
3010 bfd_vma target_value;
3011 asection *target_section;
3012
721956f4
AM
3013 /* The symbol table entry, if any, that this was derived from. */
3014 struct ppc_link_hash_entry *h;
e054468f 3015 struct plt_entry *plt_ent;
721956f4 3016
2d7ad24e
AM
3017 /* Symbol type. */
3018 unsigned char symtype;
3019
6911b7dc
AM
3020 /* Symbol st_other. */
3021 unsigned char other;
721956f4
AM
3022};
3023
2cdcc330
AM
3024struct ppc_branch_hash_entry
3025{
721956f4
AM
3026 /* Base hash table entry structure. */
3027 struct bfd_hash_entry root;
3028
c456f082 3029 /* Offset within branch lookup table. */
721956f4
AM
3030 unsigned int offset;
3031
3032 /* Generation marker. */
3033 unsigned int iter;
3034};
65f38f15 3035
19e08130
AM
3036/* Used to track dynamic relocations for local symbols. */
3037struct ppc_dyn_relocs
3038{
3039 struct ppc_dyn_relocs *next;
3040
3041 /* The input section of the reloc. */
3042 asection *sec;
3043
3044 /* Total number of relocs copied for the input section. */
3045 unsigned int count : 31;
3046
3047 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3048 unsigned int ifunc : 1;
3049};
3050
65f38f15
AM
3051struct ppc_link_hash_entry
3052{
3053 struct elf_link_hash_entry elf;
3054
2cdcc330
AM
3055 union
3056 {
b3fac117
AM
3057 /* A pointer to the most recently used stub hash entry against this
3058 symbol. */
3059 struct ppc_stub_hash_entry *stub_cache;
3060
3061 /* A pointer to the next symbol starting with a '.' */
3062 struct ppc_link_hash_entry *next_dot_sym;
3063 } u;
721956f4 3064
65f38f15 3065 /* Track dynamic relocs copied for this symbol. */
6061a67d 3066 struct elf_dyn_relocs *dyn_relocs;
e86ce104 3067
721956f4 3068 /* Link between function code and descriptor symbols. */
34814b9f 3069 struct ppc_link_hash_entry *oh;
721956f4 3070
e86ce104
AM
3071 /* Flag function code and descriptor symbols. */
3072 unsigned int is_func:1;
3073 unsigned int is_func_descriptor:1;
908b32fc 3074 unsigned int fake:1;
411e1bfb 3075
c5614fa4
AM
3076 /* Whether global opd/toc sym has been adjusted or not.
3077 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3078 should be set for all globals defined in any opd/toc section. */
754021d0
AM
3079 unsigned int adjust_done:1;
3080
a4b6fadd
AM
3081 /* Set if this is an out-of-line register save/restore function,
3082 with non-standard calling convention. */
3083 unsigned int save_res:1;
3084
8b5f1ed8
AM
3085 /* Set if a duplicate symbol with non-zero localentry is detected,
3086 even when the duplicate symbol does not provide a definition. */
3087 unsigned int non_zero_localentry:1;
3088
411e1bfb 3089 /* Contexts in which symbol is used in the GOT (or TOC).
37da22e5
AM
3090 Bits are or'd into the mask as the corresponding relocs are
3091 encountered during check_relocs, with TLS_TLS being set when any
3092 of the other TLS bits are set. tls_optimize clears bits when
3093 optimizing to indicate the corresponding GOT entry type is not
3094 needed. If set, TLS_TLS is never cleared. tls_optimize may also
b00a0a86 3095 set TLS_GDIE when a GD reloc turns into an IE one.
37da22e5
AM
3096 These flags are also kept for local symbols. */
3097#define TLS_TLS 1 /* Any TLS reloc. */
3098#define TLS_GD 2 /* GD reloc. */
3099#define TLS_LD 4 /* LD reloc. */
3100#define TLS_TPREL 8 /* TPREL reloc, => IE. */
3101#define TLS_DTPREL 16 /* DTPREL reloc, => LD. */
3102#define TLS_MARK 32 /* __tls_get_addr call marked. */
b00a0a86 3103#define TLS_GDIE 64 /* GOT TPREL reloc resulting from GD->IE. */
46e9995a 3104#define TLS_EXPLICIT 256 /* TOC section TLS reloc, not stored. */
f961d9dd 3105 unsigned char tls_mask;
37da22e5
AM
3106
3107 /* The above field is also used to mark function symbols. In which
3108 case TLS_TLS will be 0. */
3109#define PLT_IFUNC 2 /* STT_GNU_IFUNC. */
2d7ad24e 3110#define PLT_KEEP 4 /* inline plt call requires plt entry. */
37da22e5 3111#define NON_GOT 256 /* local symbol plt, not stored. */
65f38f15
AM
3112};
3113
3114/* ppc64 ELF linker hash table. */
3115
3116struct ppc_link_hash_table
3117{
3118 struct elf_link_hash_table elf;
3119
721956f4
AM
3120 /* The stub hash table. */
3121 struct bfd_hash_table stub_hash_table;
3122
3123 /* Another hash table for plt_branch stubs. */
3124 struct bfd_hash_table branch_hash_table;
3125
3b421ab3
AM
3126 /* Hash table for function prologue tocsave. */
3127 htab_t tocsave_htab;
3128
e7d1c40c
AM
3129 /* Various options and other info passed from the linker. */
3130 struct ppc64_elf_params *params;
721956f4 3131
6f20ed8a
AM
3132 /* The size of sec_info below. */
3133 unsigned int sec_info_arr_size;
3134
3135 /* Per-section array of extra section info. Done this way rather
3136 than as part of ppc64_elf_section_data so we have the info for
3137 non-ppc64 sections. */
3138 struct
3139 {
3140 /* Along with elf_gp, specifies the TOC pointer used by this section. */
ad8e1ba5 3141 bfd_vma toc_off;
6f20ed8a
AM
3142
3143 union
3144 {
3145 /* The section group that this section belongs to. */
3146 struct map_stub *group;
3147 /* A temp section list pointer. */
3148 asection *list;
3149 } u;
3150 } *sec_info;
721956f4 3151
a4b6fadd
AM
3152 /* Linked list of groups. */
3153 struct map_stub *group;
3154
ad8e1ba5
AM
3155 /* Temp used when calculating TOC pointers. */
3156 bfd_vma toc_curr;
bf102f86
AM
3157 bfd *toc_bfd;
3158 asection *toc_first_sec;
ad8e1ba5 3159
b3fac117
AM
3160 /* Used when adding symbols. */
3161 struct ppc_link_hash_entry *dot_syms;
3162
33e44f2e 3163 /* Shortcuts to get to dynamic linker sections. */
4ce794b7 3164 asection *glink;
9e390558 3165 asection *global_entry;
82bd7b59 3166 asection *sfpr;
2d7ad24e
AM
3167 asection *pltlocal;
3168 asection *relpltlocal;
4ce794b7
AM
3169 asection *brlt;
3170 asection *relbrlt;
58d180e8 3171 asection *glink_eh_frame;
ec338859 3172
8387904d
AM
3173 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3174 struct ppc_link_hash_entry *tls_get_addr;
3175 struct ppc_link_hash_entry *tls_get_addr_fd;
411e1bfb 3176
927be08e
AM
3177 /* The size of reliplt used by got entry relocs. */
3178 bfd_size_type got_reli_size;
3179
9b5ecbd0 3180 /* Statistics. */
7341d5e2 3181 unsigned long stub_count[ppc_stub_global_entry];
9b5ecbd0 3182
ee75fd95
AM
3183 /* Number of stubs against global syms. */
3184 unsigned long stub_globals;
3185
ee67d69a
AM
3186 /* Set if we're linking code with function descriptors. */
3187 unsigned int opd_abi:1;
3188
4c52953f 3189 /* Support for multiple toc sections. */
33c0ec9d 3190 unsigned int do_multi_toc:1;
4c52953f 3191 unsigned int multi_toc_needed:1;
927be08e 3192 unsigned int second_toc_pass:1;
67f0cbdb 3193 unsigned int do_toc_opt:1;
4c52953f 3194
9a23f96e
AM
3195 /* Set if tls optimization is enabled. */
3196 unsigned int do_tls_opt:1;
3197
3e04d765
AM
3198 /* Set if inline plt calls should be converted to direct calls. */
3199 unsigned int can_convert_all_inline_plt:1;
3200
5d1634d7 3201 /* Set on error. */
99877b66 3202 unsigned int stub_error:1;
721956f4 3203
8c5b4e52
AM
3204 /* Whether func_desc_adjust needs to be run over symbols. */
3205 unsigned int need_func_desc_adj:1;
721956f4 3206
82e66161
AM
3207 /* Whether there exist local gnu indirect function resolvers,
3208 referenced by dynamic relocations. */
3209 unsigned int local_ifunc_resolver:1;
3210 unsigned int maybe_local_ifunc_resolver:1;
3211
f378ab09
AM
3212 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
3213 unsigned int has_plt_localentry0:1;
3214
5663e321
AM
3215 /* Whether calls are made via the PLT from NOTOC functions. */
3216 unsigned int notoc_plt:1;
3217
04bdff6a
AM
3218 /* Whether to use powerxx instructions in linkage stubs. */
3219 unsigned int powerxx_stubs:1;
3220
721956f4
AM
3221 /* Incremented every time we size stubs. */
3222 unsigned int stub_iteration;
5d1634d7 3223
87d72d41
AM
3224 /* Small local sym cache. */
3225 struct sym_cache sym_cache;
65f38f15
AM
3226};
3227
4c52953f
AM
3228/* Rename some of the generic section flags to better document how they
3229 are used here. */
b0dddeec
AM
3230
3231/* Nonzero if this section has TLS related relocations. */
3232#define has_tls_reloc sec_flg0
3233
9737e8af
AM
3234/* Nonzero if this section has a call to __tls_get_addr lacking marker
3235 relocations. */
3236#define nomark_tls_get_addr sec_flg1
b0dddeec
AM
3237
3238/* Nonzero if this section has any toc or got relocs. */
3239#define has_toc_reloc sec_flg2
3240
3241/* Nonzero if this section has a call to another section that uses
3242 the toc or got. */
d77c8a4b 3243#define makes_toc_func_call sec_flg3
b0dddeec
AM
3244
3245/* Recursion protection when determining above flag. */
d77c8a4b 3246#define call_check_in_progress sec_flg4
70cc837d 3247#define call_check_done sec_flg5
4c52953f 3248
65f38f15
AM
3249/* Get the ppc64 ELF linker hash table from a link_info structure. */
3250
3251#define ppc_hash_table(p) \
4dfe6ac6
NC
3252 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3253 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
65f38f15 3254
721956f4
AM
3255#define ppc_stub_hash_lookup(table, string, create, copy) \
3256 ((struct ppc_stub_hash_entry *) \
3257 bfd_hash_lookup ((table), (string), (create), (copy)))
3258
3259#define ppc_branch_hash_lookup(table, string, create, copy) \
3260 ((struct ppc_branch_hash_entry *) \
3261 bfd_hash_lookup ((table), (string), (create), (copy)))
3262
3263/* Create an entry in the stub hash table. */
3264
3265static struct bfd_hash_entry *
4ce794b7
AM
3266stub_hash_newfunc (struct bfd_hash_entry *entry,
3267 struct bfd_hash_table *table,
3268 const char *string)
721956f4
AM
3269{
3270 /* Allocate the structure if it has not already been allocated by a
3271 subclass. */
3272 if (entry == NULL)
3273 {
3274 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3275 if (entry == NULL)
3276 return entry;
3277 }
3278
3279 /* Call the allocation method of the superclass. */
3280 entry = bfd_hash_newfunc (entry, table, string);
3281 if (entry != NULL)
3282 {
3283 struct ppc_stub_hash_entry *eh;
3284
3285 /* Initialize the local fields. */
3286 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 3287 eh->stub_type = ppc_stub_none;
6f20ed8a 3288 eh->group = NULL;
721956f4
AM
3289 eh->stub_offset = 0;
3290 eh->target_value = 0;
3291 eh->target_section = NULL;
721956f4 3292 eh->h = NULL;
6911b7dc 3293 eh->plt_ent = NULL;
6911b7dc 3294 eh->other = 0;
721956f4
AM
3295 }
3296
3297 return entry;
3298}
3299
3300/* Create an entry in the branch hash table. */
3301
3302static struct bfd_hash_entry *
4ce794b7
AM
3303branch_hash_newfunc (struct bfd_hash_entry *entry,
3304 struct bfd_hash_table *table,
3305 const char *string)
721956f4
AM
3306{
3307 /* Allocate the structure if it has not already been allocated by a
3308 subclass. */
3309 if (entry == NULL)
3310 {
3311 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3312 if (entry == NULL)
3313 return entry;
3314 }
3315
3316 /* Call the allocation method of the superclass. */
3317 entry = bfd_hash_newfunc (entry, table, string);
3318 if (entry != NULL)
3319 {
3320 struct ppc_branch_hash_entry *eh;
3321
3322 /* Initialize the local fields. */
3323 eh = (struct ppc_branch_hash_entry *) entry;
3324 eh->offset = 0;
3325 eh->iter = 0;
3326 }
3327
3328 return entry;
3329}
3330
65f38f15
AM
3331/* Create an entry in a ppc64 ELF linker hash table. */
3332
3333static struct bfd_hash_entry *
4ce794b7
AM
3334link_hash_newfunc (struct bfd_hash_entry *entry,
3335 struct bfd_hash_table *table,
3336 const char *string)
65f38f15
AM
3337{
3338 /* Allocate the structure if it has not already been allocated by a
3339 subclass. */
3340 if (entry == NULL)
3341 {
3342 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3343 if (entry == NULL)
3344 return entry;
3345 }
3346
3347 /* Call the allocation method of the superclass. */
3348 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3349 if (entry != NULL)
3350 {
3351 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3352
b3fac117 3353 memset (&eh->u.stub_cache, 0,
908b32fc 3354 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
3355 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3356
3357 /* When making function calls, old ABI code references function entry
3358 points (dot symbols), while new ABI code references the function
3359 descriptor symbol. We need to make any combination of reference and
3360 definition work together, without breaking archive linking.
3361
3362 For a defined function "foo" and an undefined call to "bar":
3363 An old object defines "foo" and ".foo", references ".bar" (possibly
3364 "bar" too).
3365 A new object defines "foo" and references "bar".
3366
3367 A new object thus has no problem with its undefined symbols being
3368 satisfied by definitions in an old object. On the other hand, the
3369 old object won't have ".bar" satisfied by a new object.
3370
3371 Keep a list of newly added dot-symbols. */
3372
3373 if (string[0] == '.')
3374 {
3375 struct ppc_link_hash_table *htab;
3376
3377 htab = (struct ppc_link_hash_table *) table;
3378 eh->u.next_dot_sym = htab->dot_syms;
3379 htab->dot_syms = eh;
3380 }
65f38f15
AM
3381 }
3382
3383 return entry;
3384}
3385
2cdcc330
AM
3386struct tocsave_entry
3387{
3b421ab3
AM
3388 asection *sec;
3389 bfd_vma offset;
3390};
3391
3392static hashval_t
3393tocsave_htab_hash (const void *p)
3394{
3395 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4aef7643 3396 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
3b421ab3
AM
3397}
3398
3399static int
3400tocsave_htab_eq (const void *p1, const void *p2)
3401{
3402 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
3403 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
3404 return e1->sec == e2->sec && e1->offset == e2->offset;
3405}
3406
68faa637
AM
3407/* Destroy a ppc64 ELF linker hash table. */
3408
3409static void
d495ab0d 3410ppc64_elf_link_hash_table_free (bfd *obfd)
68faa637 3411{
d495ab0d 3412 struct ppc_link_hash_table *htab;
68faa637 3413
d495ab0d 3414 htab = (struct ppc_link_hash_table *) obfd->link.hash;
68faa637
AM
3415 if (htab->tocsave_htab)
3416 htab_delete (htab->tocsave_htab);
d495ab0d
AM
3417 bfd_hash_table_free (&htab->branch_hash_table);
3418 bfd_hash_table_free (&htab->stub_hash_table);
3419 _bfd_elf_link_hash_table_free (obfd);
68faa637
AM
3420}
3421
65f38f15
AM
3422/* Create a ppc64 ELF linker hash table. */
3423
3424static struct bfd_link_hash_table *
4ce794b7 3425ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
3426{
3427 struct ppc_link_hash_table *htab;
3428 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3429
4ce794b7 3430 htab = bfd_zmalloc (amt);
65f38f15
AM
3431 if (htab == NULL)
3432 return NULL;
3433
66eb6687 3434 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
3435 sizeof (struct ppc_link_hash_entry),
3436 PPC64_ELF_DATA))
65f38f15 3437 {
e2d34d7d 3438 free (htab);
65f38f15
AM
3439 return NULL;
3440 }
3441
721956f4 3442 /* Init the stub hash table too. */
66eb6687
AM
3443 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
3444 sizeof (struct ppc_stub_hash_entry)))
2915c55b 3445 {
d495ab0d 3446 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3447 return NULL;
3448 }
721956f4
AM
3449
3450 /* And the branch hash table. */
66eb6687
AM
3451 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
3452 sizeof (struct ppc_branch_hash_entry)))
2915c55b
JK
3453 {
3454 bfd_hash_table_free (&htab->stub_hash_table);
d495ab0d 3455 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3456 return NULL;
3457 }
721956f4 3458
3b421ab3
AM
3459 htab->tocsave_htab = htab_try_create (1024,
3460 tocsave_htab_hash,
3461 tocsave_htab_eq,
3462 NULL);
3463 if (htab->tocsave_htab == NULL)
2915c55b 3464 {
d495ab0d 3465 ppc64_elf_link_hash_table_free (abfd);
2915c55b
JK
3466 return NULL;
3467 }
d495ab0d 3468 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
3b421ab3 3469
3254fd24
AM
3470 /* Initializing two fields of the union is just cosmetic. We really
3471 only care about glist, but when compiled on a 32-bit host the
3472 bfd_vma fields are larger. Setting the bfd_vma to zero makes
3473 debugger inspection of these fields look nicer. */
a6aa5195
AM
3474 htab->elf.init_got_refcount.refcount = 0;
3475 htab->elf.init_got_refcount.glist = NULL;
3476 htab->elf.init_plt_refcount.refcount = 0;
3477 htab->elf.init_plt_refcount.glist = NULL;
3478 htab->elf.init_got_offset.offset = 0;
3479 htab->elf.init_got_offset.glist = NULL;
3480 htab->elf.init_plt_offset.offset = 0;
3481 htab->elf.init_plt_offset.glist = NULL;
3254fd24 3482
65f38f15
AM
3483 return &htab->elf.root;
3484}
3485
bfeb4a28
AM
3486/* Create sections for linker generated code. */
3487
3488static bfd_boolean
3489create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3490{
3491 struct ppc_link_hash_table *htab;
3492 flagword flags;
3493
3494 htab = ppc_hash_table (info);
3495
bfeb4a28
AM
3496 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3497 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
b32547cd
AM
3498 if (htab->params->save_restore_funcs)
3499 {
3500 /* Create .sfpr for code to save and restore fp regs. */
3501 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
3502 flags);
3503 if (htab->sfpr == NULL
fd361982 3504 || !bfd_set_section_alignment (htab->sfpr, 2))
b32547cd
AM
3505 return FALSE;
3506 }
3507
3508 if (bfd_link_relocatable (info))
3509 return TRUE;
bfeb4a28
AM
3510
3511 /* Create .glink for lazy dynamic linking support. */
3512 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3513 flags);
3514 if (htab->glink == NULL
fd361982 3515 || !bfd_set_section_alignment (htab->glink, 3))
bfeb4a28
AM
3516 return FALSE;
3517
9e390558
AM
3518 /* The part of .glink used by global entry stubs, separate so that
3519 it can be aligned appropriately without affecting htab->glink. */
3520 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3521 flags);
3522 if (htab->global_entry == NULL
fd361982 3523 || !bfd_set_section_alignment (htab->global_entry, 2))
9e390558
AM
3524 return FALSE;
3525
bfeb4a28
AM
3526 if (!info->no_ld_generated_unwind_info)
3527 {
3528 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
3529 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3530 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
3531 ".eh_frame",
3532 flags);
3533 if (htab->glink_eh_frame == NULL
fd361982 3534 || !bfd_set_section_alignment (htab->glink_eh_frame, 2))
bfeb4a28
AM
3535 return FALSE;
3536 }
3537
3538 flags = SEC_ALLOC | SEC_LINKER_CREATED;
33e44f2e
AM
3539 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
3540 if (htab->elf.iplt == NULL
fd361982 3541 || !bfd_set_section_alignment (htab->elf.iplt, 3))
bfeb4a28
AM
3542 return FALSE;
3543
3544 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3545 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
33e44f2e
AM
3546 htab->elf.irelplt
3547 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
3548 if (htab->elf.irelplt == NULL
fd361982 3549 || !bfd_set_section_alignment (htab->elf.irelplt, 3))
bfeb4a28
AM
3550 return FALSE;
3551
3552 /* Create branch lookup table for plt_branch stubs. */
3553 flags = (SEC_ALLOC | SEC_LOAD
3554 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3555 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3556 flags);
3557 if (htab->brlt == NULL
fd361982 3558 || !bfd_set_section_alignment (htab->brlt, 3))
bfeb4a28
AM
3559 return FALSE;
3560
2d7ad24e
AM
3561 /* Local plt entries, put in .branch_lt but a separate section for
3562 convenience. */
3563 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3564 flags);
3565 if (htab->pltlocal == NULL
fd361982 3566 || !bfd_set_section_alignment (htab->pltlocal, 3))
2d7ad24e
AM
3567 return FALSE;
3568
0e1862bb 3569 if (!bfd_link_pic (info))
bfeb4a28
AM
3570 return TRUE;
3571
3572 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3573 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2d7ad24e
AM
3574 htab->relbrlt
3575 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
bfeb4a28 3576 if (htab->relbrlt == NULL
fd361982 3577 || !bfd_set_section_alignment (htab->relbrlt, 3))
bfeb4a28
AM
3578 return FALSE;
3579
2d7ad24e
AM
3580 htab->relpltlocal
3581 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
3582 if (htab->relpltlocal == NULL
fd361982 3583 || !bfd_set_section_alignment (htab->relpltlocal, 3))
2d7ad24e
AM
3584 return FALSE;
3585
bfeb4a28
AM
3586 return TRUE;
3587}
3588
e717da7e
AM
3589/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
3590
bfeb4a28 3591bfd_boolean
e7d1c40c
AM
3592ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
3593 struct ppc64_elf_params *params)
e717da7e
AM
3594{
3595 struct ppc_link_hash_table *htab;
3596
e7d1c40c 3597 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
e717da7e
AM
3598
3599/* Always hook our dynamic sections into the first bfd, which is the
3600 linker created stub bfd. This ensures that the GOT header is at
3601 the start of the output TOC section. */
3602 htab = ppc_hash_table (info);
e7d1c40c
AM
3603 htab->elf.dynobj = params->stub_bfd;
3604 htab->params = params;
bfeb4a28 3605
bfeb4a28 3606 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
3607}
3608
721956f4
AM
3609/* Build a name for an entry in the stub hash table. */
3610
3611static char *
4ce794b7
AM
3612ppc_stub_name (const asection *input_section,
3613 const asection *sym_sec,
3614 const struct ppc_link_hash_entry *h,
3615 const Elf_Internal_Rela *rel)
721956f4
AM
3616{
3617 char *stub_name;
bcaa2f82 3618 ssize_t len;
721956f4
AM
3619
3620 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3621 offsets from a sym as a branch target? In fact, we could
3622 probably assume the addend is always zero. */
3623 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3624
3625 if (h)
3626 {
3627 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3628 stub_name = bfd_malloc (len);
46de2a7c
AM
3629 if (stub_name == NULL)
3630 return stub_name;
3631
bcaa2f82
AM
3632 len = sprintf (stub_name, "%08x.%s+%x",
3633 input_section->id & 0xffffffff,
3634 h->elf.root.root.string,
3635 (int) rel->r_addend & 0xffffffff);
721956f4
AM
3636 }
3637 else
3638 {
ad8e1ba5 3639 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 3640 stub_name = bfd_malloc (len);
46de2a7c
AM
3641 if (stub_name == NULL)
3642 return stub_name;
3643
bcaa2f82
AM
3644 len = sprintf (stub_name, "%08x.%x:%x+%x",
3645 input_section->id & 0xffffffff,
3646 sym_sec->id & 0xffffffff,
3647 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3648 (int) rel->r_addend & 0xffffffff);
721956f4 3649 }
bcaa2f82 3650 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 3651 stub_name[len - 2] = 0;
721956f4
AM
3652 return stub_name;
3653}
3654
3655/* Look up an entry in the stub hash. Stub entries are cached because
3656 creating the stub name takes a bit of time. */
3657
3658static struct ppc_stub_hash_entry *
4ce794b7
AM
3659ppc_get_stub_entry (const asection *input_section,
3660 const asection *sym_sec,
039b3fef 3661 struct ppc_link_hash_entry *h,
4ce794b7
AM
3662 const Elf_Internal_Rela *rel,
3663 struct ppc_link_hash_table *htab)
721956f4
AM
3664{
3665 struct ppc_stub_hash_entry *stub_entry;
6f20ed8a 3666 struct map_stub *group;
721956f4
AM
3667
3668 /* If this input section is part of a group of sections sharing one
3669 stub section, then use the id of the first section in the group.
3670 Stub names need to include a section id, as there may well be
3671 more than one stub used to reach say, printf, and we need to
3672 distinguish between them. */
6f20ed8a 3673 group = htab->sec_info[input_section->id].u.group;
89d77b8a
AM
3674 if (group == NULL)
3675 return NULL;
721956f4 3676
b3fac117
AM
3677 if (h != NULL && h->u.stub_cache != NULL
3678 && h->u.stub_cache->h == h
6f20ed8a 3679 && h->u.stub_cache->group == group)
721956f4 3680 {
b3fac117 3681 stub_entry = h->u.stub_cache;
721956f4
AM
3682 }
3683 else
3684 {
3685 char *stub_name;
3686
6f20ed8a 3687 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
721956f4
AM
3688 if (stub_name == NULL)
3689 return NULL;
3690
3691 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 3692 stub_name, FALSE, FALSE);
721956f4 3693 if (h != NULL)
b3fac117 3694 h->u.stub_cache = stub_entry;
721956f4
AM
3695
3696 free (stub_name);
3697 }
3698
3699 return stub_entry;
3700}
3701
3702/* Add a new stub entry to the stub hash. Not all fields of the new
3703 stub entry are initialised. */
3704
3705static struct ppc_stub_hash_entry *
4ce794b7
AM
3706ppc_add_stub (const char *stub_name,
3707 asection *section,
25f53a85 3708 struct bfd_link_info *info)
721956f4 3709{
25f53a85 3710 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 3711 struct map_stub *group;
721956f4
AM
3712 asection *link_sec;
3713 asection *stub_sec;
3714 struct ppc_stub_hash_entry *stub_entry;
3715
6f20ed8a
AM
3716 group = htab->sec_info[section->id].u.group;
3717 link_sec = group->link_sec;
3718 stub_sec = group->stub_sec;
721956f4
AM
3719 if (stub_sec == NULL)
3720 {
6f20ed8a
AM
3721 size_t namelen;
3722 bfd_size_type len;
3723 char *s_name;
721956f4 3724
6f20ed8a
AM
3725 namelen = strlen (link_sec->name);
3726 len = namelen + sizeof (STUB_SUFFIX);
3727 s_name = bfd_alloc (htab->params->stub_bfd, len);
3728 if (s_name == NULL)
3729 return NULL;
721956f4 3730
6f20ed8a
AM
3731 memcpy (s_name, link_sec->name, namelen);
3732 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3733 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
3734 if (stub_sec == NULL)
3735 return NULL;
3736 group->stub_sec = stub_sec;
721956f4
AM
3737 }
3738
3739 /* Enter this entry into the linker stub hash table. */
3740 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 3741 TRUE, FALSE);
721956f4
AM
3742 if (stub_entry == NULL)
3743 {
695344c0 3744 /* xgettext:c-format */
cf97bcb0
AM
3745 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
3746 section->owner, stub_name);
721956f4
AM
3747 return NULL;
3748 }
3749
6f20ed8a 3750 stub_entry->group = group;
721956f4 3751 stub_entry->stub_offset = 0;
721956f4
AM
3752 return stub_entry;
3753}
3754
e717da7e
AM
3755/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3756 not already done. */
65f38f15 3757
b34976b6 3758static bfd_boolean
e717da7e 3759create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 3760{
e717da7e
AM
3761 asection *got, *relgot;
3762 flagword flags;
3763 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 3764
0c8d6e5c 3765 if (!is_ppc64_elf (abfd))
0ffa91dd 3766 return FALSE;
4dfe6ac6
NC
3767 if (htab == NULL)
3768 return FALSE;
0ffa91dd 3769
33e44f2e
AM
3770 if (!htab->elf.sgot
3771 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
3772 return FALSE;
e717da7e
AM
3773
3774 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3775 | SEC_LINKER_CREATED);
3776
c456f082 3777 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 3778 if (!got
fd361982 3779 || !bfd_set_section_alignment (got, 3))
e717da7e 3780 return FALSE;
65f38f15 3781
c456f082
AM
3782 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
3783 flags | SEC_READONLY);
e717da7e 3784 if (!relgot
fd361982 3785 || !bfd_set_section_alignment (relgot, 3))
b34976b6 3786 return FALSE;
e717da7e
AM
3787
3788 ppc64_elf_tdata (abfd)->got = got;
3789 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 3790 return TRUE;
65f38f15 3791}
5bd4f169 3792
b31867b6
AM
3793/* Follow indirect and warning symbol links. */
3794
3795static inline struct bfd_link_hash_entry *
3796follow_link (struct bfd_link_hash_entry *h)
3797{
3798 while (h->type == bfd_link_hash_indirect
3799 || h->type == bfd_link_hash_warning)
3800 h = h->u.i.link;
3801 return h;
3802}
3803
3804static inline struct elf_link_hash_entry *
3805elf_follow_link (struct elf_link_hash_entry *h)
3806{
3807 return (struct elf_link_hash_entry *) follow_link (&h->root);
3808}
3809
3810static inline struct ppc_link_hash_entry *
3811ppc_follow_link (struct ppc_link_hash_entry *h)
3812{
3813 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
3814}
3815
40d16e0b
AM
3816/* Merge PLT info on FROM with that on TO. */
3817
3818static void
3819move_plt_plist (struct ppc_link_hash_entry *from,
3820 struct ppc_link_hash_entry *to)
3821{
3822 if (from->elf.plt.plist != NULL)
3823 {
3824 if (to->elf.plt.plist != NULL)
3825 {
3826 struct plt_entry **entp;
3827 struct plt_entry *ent;
3828
3829 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
3830 {
3831 struct plt_entry *dent;
3832
3833 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
3834 if (dent->addend == ent->addend)
3835 {
3836 dent->plt.refcount += ent->plt.refcount;
3837 *entp = ent->next;
3838 break;
3839 }
3840 if (dent == NULL)
3841 entp = &ent->next;
3842 }
3843 *entp = to->elf.plt.plist;
3844 }
3845
3846 to->elf.plt.plist = from->elf.plt.plist;
3847 from->elf.plt.plist = NULL;
3848 }
3849}
3850
65f38f15
AM
3851/* Copy the extra info we tack onto an elf_link_hash_entry. */
3852
3853static void
fcfa13d2
AM
3854ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
3855 struct elf_link_hash_entry *dir,
3856 struct elf_link_hash_entry *ind)
65f38f15
AM
3857{
3858 struct ppc_link_hash_entry *edir, *eind;
3859
3860 edir = (struct ppc_link_hash_entry *) dir;
3861 eind = (struct ppc_link_hash_entry *) ind;
3862
c79d6685
AM
3863 edir->is_func |= eind->is_func;
3864 edir->is_func_descriptor |= eind->is_func_descriptor;
3865 edir->tls_mask |= eind->tls_mask;
3866 if (eind->oh != NULL)
3867 edir->oh = ppc_follow_link (eind->oh);
3868
474436e6 3869 if (edir->elf.versioned != versioned_hidden)
e81830c5
AM
3870 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
3871 edir->elf.ref_regular |= eind->elf.ref_regular;
3872 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4a7e5234 3873 edir->elf.non_got_ref |= eind->elf.non_got_ref;
e81830c5
AM
3874 edir->elf.needs_plt |= eind->elf.needs_plt;
3875 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
c79d6685 3876
d311bc8b
AM
3877 /* If we were called to copy over info for a weak sym, don't copy
3878 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
3879 in order to simplify readonly_dynrelocs and save a field in the
3880 symbol hash entry, but that means dyn_relocs can't be used in any
3881 tests about a specific symbol, or affect other symbol flags which
ab2477e1 3882 are then tested. */
d311bc8b 3883 if (eind->elf.root.type != bfd_link_hash_indirect)
ab2477e1 3884 return;
d311bc8b 3885
411e1bfb 3886 /* Copy over any dynamic relocs we may have on the indirect sym. */
bbd7ec4a 3887 if (eind->dyn_relocs != NULL)
65f38f15 3888 {
bbd7ec4a
AM
3889 if (edir->dyn_relocs != NULL)
3890 {
6061a67d
AM
3891 struct elf_dyn_relocs **pp;
3892 struct elf_dyn_relocs *p;
bbd7ec4a 3893
fcfa13d2 3894 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a
AM
3895 list. Merge any entries against the same section. */
3896 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3897 {
6061a67d 3898 struct elf_dyn_relocs *q;
bbd7ec4a
AM
3899
3900 for (q = edir->dyn_relocs; q != NULL; q = q->next)
3901 if (q->sec == p->sec)
3902 {
3903 q->pc_count += p->pc_count;
3904 q->count += p->count;
3905 *pp = p->next;
3906 break;
3907 }
3908 if (q == NULL)
3909 pp = &p->next;
3910 }
3911 *pp = edir->dyn_relocs;
3912 }
3913
65f38f15
AM
3914 edir->dyn_relocs = eind->dyn_relocs;
3915 eind->dyn_relocs = NULL;
3916 }
65f38f15 3917
81848ca0
AM
3918 /* Copy over got entries that we may have already seen to the
3919 symbol which just became indirect. */
411e1bfb
AM
3920 if (eind->elf.got.glist != NULL)
3921 {
3922 if (edir->elf.got.glist != NULL)
3923 {
3924 struct got_entry **entp;
3925 struct got_entry *ent;
3926
3927 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3928 {
3929 struct got_entry *dent;
3930
3931 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3932 if (dent->addend == ent->addend
e717da7e 3933 && dent->owner == ent->owner
411e1bfb
AM
3934 && dent->tls_type == ent->tls_type)
3935 {
3936 dent->got.refcount += ent->got.refcount;
3937 *entp = ent->next;
3938 break;
3939 }
3940 if (dent == NULL)
3941 entp = &ent->next;
3942 }
3943 *entp = edir->elf.got.glist;
3944 }
3945
3946 edir->elf.got.glist = eind->elf.got.glist;
3947 eind->elf.got.glist = NULL;
3948 }
3949
3950 /* And plt entries. */
40d16e0b 3951 move_plt_plist (eind, edir);
411e1bfb 3952
fcfa13d2 3953 if (eind->elf.dynindx != -1)
411e1bfb 3954 {
fcfa13d2
AM
3955 if (edir->elf.dynindx != -1)
3956 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3957 edir->elf.dynstr_index);
411e1bfb
AM
3958 edir->elf.dynindx = eind->elf.dynindx;
3959 edir->elf.dynstr_index = eind->elf.dynstr_index;
3960 eind->elf.dynindx = -1;
3961 eind->elf.dynstr_index = 0;
3962 }
411e1bfb
AM
3963}
3964
8387904d
AM
3965/* Find the function descriptor hash entry from the given function code
3966 hash entry FH. Link the entries via their OH fields. */
3967
3968static struct ppc_link_hash_entry *
b31867b6 3969lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
3970{
3971 struct ppc_link_hash_entry *fdh = fh->oh;
3972
3973 if (fdh == NULL)
3974 {
3975 const char *fd_name = fh->elf.root.root.string + 1;
3976
3977 fdh = (struct ppc_link_hash_entry *)
3978 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
b31867b6
AM
3979 if (fdh == NULL)
3980 return fdh;
3981
3982 fdh->is_func_descriptor = 1;
3983 fdh->oh = fh;
3984 fh->is_func = 1;
3985 fh->oh = fdh;
8387904d
AM
3986 }
3987
8c5b4e52
AM
3988 fdh = ppc_follow_link (fdh);
3989 fdh->is_func_descriptor = 1;
3990 fdh->oh = fh;
3991 return fdh;
8387904d
AM
3992}
3993
8c5b4e52 3994/* Make a fake function descriptor sym for the undefined code sym FH. */
bb700d78
AM
3995
3996static struct ppc_link_hash_entry *
3997make_fdh (struct bfd_link_info *info,
908b32fc 3998 struct ppc_link_hash_entry *fh)
bb700d78 3999{
8c5b4e52
AM
4000 bfd *abfd = fh->elf.root.u.undef.abfd;
4001 struct bfd_link_hash_entry *bh = NULL;
bb700d78 4002 struct ppc_link_hash_entry *fdh;
8c5b4e52
AM
4003 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4004 ? BSF_WEAK
4005 : BSF_GLOBAL);
4006
4007 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4008 fh->elf.root.root.string + 1,
4009 flags, bfd_und_section_ptr, 0,
4010 NULL, FALSE, FALSE, &bh))
bb700d78
AM
4011 return NULL;
4012
4013 fdh = (struct ppc_link_hash_entry *) bh;
4014 fdh->elf.non_elf = 0;
908b32fc
AM
4015 fdh->fake = 1;
4016 fdh->is_func_descriptor = 1;
4017 fdh->oh = fh;
4018 fh->is_func = 1;
4019 fh->oh = fdh;
bb700d78
AM
4020 return fdh;
4021}
4022
8387904d
AM
4023/* Fix function descriptor symbols defined in .opd sections to be
4024 function type. */
555cd476
AM
4025
4026static bfd_boolean
c16153ae 4027ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 4028 struct bfd_link_info *info,
555cd476 4029 Elf_Internal_Sym *isym,
6911b7dc 4030 const char **name,
555cd476
AM
4031 flagword *flags ATTRIBUTE_UNUSED,
4032 asection **sec,
b53dfeb2 4033 bfd_vma *value)
555cd476 4034{
b53dfeb2 4035 if (*sec != NULL
f1885d1e 4036 && strcmp ((*sec)->name, ".opd") == 0)
b53dfeb2
AM
4037 {
4038 asection *code_sec;
4039
4040 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4041 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4042 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4043
4044 /* If the symbol is a function defined in .opd, and the function
4045 code is in a discarded group, let it appear to be undefined. */
0e1862bb 4046 if (!bfd_link_relocatable (info)
b53dfeb2
AM
4047 && (*sec)->reloc_count != 0
4048 && opd_entry_value (*sec, *value, &code_sec, NULL,
4049 FALSE) != (bfd_vma) -1
4050 && discarded_section (code_sec))
4051 {
4052 *sec = bfd_und_section_ptr;
4053 isym->st_shndx = SHN_UNDEF;
4054 }
4055 }
dbd1e97e
AM
4056 else if (*sec != NULL
4057 && strcmp ((*sec)->name, ".toc") == 0
4058 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4059 {
4060 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4061 if (htab != NULL)
4062 htab->params->object_in_toc = 1;
4063 }
433817dd 4064
6911b7dc
AM
4065 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4066 {
4067 if (abiversion (ibfd) == 0)
4068 set_abiversion (ibfd, 2);
4069 else if (abiversion (ibfd) == 1)
4070 {
cf97bcb0
AM
4071 _bfd_error_handler (_("symbol '%s' has invalid st_other"
4072 " for ABI version 1"), *name);
6911b7dc
AM
4073 bfd_set_error (bfd_error_bad_value);
4074 return FALSE;
4075 }
4076 }
4077
555cd476
AM
4078 return TRUE;
4079}
4080
6911b7dc
AM
4081/* Merge non-visibility st_other attributes: local entry point. */
4082
4083static void
4084ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4085 const Elf_Internal_Sym *isym,
4086 bfd_boolean definition,
4087 bfd_boolean dynamic)
4088{
f378ab09 4089 if (definition && (!dynamic || !h->def_regular))
6911b7dc
AM
4090 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4091 | ELF_ST_VISIBILITY (h->other));
4092}
4093
8c5b4e52
AM
4094/* Hook called on merging a symbol. We use this to clear "fake" since
4095 we now have a real symbol. */
4096
4097static bfd_boolean
4098ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
8b5f1ed8 4099 const Elf_Internal_Sym *isym,
8c5b4e52
AM
4100 asection **psec ATTRIBUTE_UNUSED,
4101 bfd_boolean newdef ATTRIBUTE_UNUSED,
4102 bfd_boolean olddef ATTRIBUTE_UNUSED,
4103 bfd *oldbfd ATTRIBUTE_UNUSED,
4104 const asection *oldsec ATTRIBUTE_UNUSED)
4105{
4106 ((struct ppc_link_hash_entry *) h)->fake = 0;
8b5f1ed8
AM
4107 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4108 ((struct ppc_link_hash_entry *) h)->non_zero_localentry = 1;
8c5b4e52
AM
4109 return TRUE;
4110}
4111
8387904d 4112/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
4113 inclusion of a new ABI object archive that defines "bar".
4114 NAME is a symbol defined in an archive. Return a symbol in the hash
4115 table that might be satisfied by the archive symbols. */
8387904d
AM
4116
4117static struct elf_link_hash_entry *
4118ppc64_elf_archive_symbol_lookup (bfd *abfd,
4119 struct bfd_link_info *info,
4120 const char *name)
4121{
4122 struct elf_link_hash_entry *h;
4123 char *dot_name;
4124 size_t len;
4125
4126 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
4127 if (h != NULL
4128 /* Don't return this sym if it is a fake function descriptor
4129 created by add_symbol_adjust. */
8c5b4e52 4130 && !((struct ppc_link_hash_entry *) h)->fake)
8387904d
AM
4131 return h;
4132
4133 if (name[0] == '.')
4134 return h;
4135
4136 len = strlen (name);
4137 dot_name = bfd_alloc (abfd, len + 2);
4138 if (dot_name == NULL)
e99955cd 4139 return (struct elf_link_hash_entry *) -1;
8387904d
AM
4140 dot_name[0] = '.';
4141 memcpy (dot_name + 1, name, len + 1);
4142 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4143 bfd_release (abfd, dot_name);
4144 return h;
4145}
4146
4147/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
4148 new ABI object defines "bar". Well, at least, undefined dot symbols
4149 are made weak. This stops later archive searches from including an
4150 object if we already have a function descriptor definition. It also
35b0ce59
AM
4151 prevents the linker complaining about undefined symbols.
4152 We also check and correct mismatched symbol visibility here. The
4153 most restrictive visibility of the function descriptor and the
4154 function entry symbol is used. */
8387904d
AM
4155
4156static bfd_boolean
b3fac117 4157add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 4158{
8387904d
AM
4159 struct ppc_link_hash_table *htab;
4160 struct ppc_link_hash_entry *fdh;
4161
b3fac117
AM
4162 if (eh->elf.root.type == bfd_link_hash_warning)
4163 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 4164
8400d40d
AM
4165 if (eh->elf.root.type == bfd_link_hash_indirect)
4166 return TRUE;
4167
b3fac117
AM
4168 if (eh->elf.root.root.string[0] != '.')
4169 abort ();
8387904d 4170
b3fac117 4171 htab = ppc_hash_table (info);
4dfe6ac6
NC
4172 if (htab == NULL)
4173 return FALSE;
4174
b31867b6 4175 fdh = lookup_fdh (eh, htab);
8c5b4e52
AM
4176 if (fdh == NULL
4177 && !bfd_link_relocatable (info)
4178 && (eh->elf.root.type == bfd_link_hash_undefined
4179 || eh->elf.root.type == bfd_link_hash_undefweak)
4180 && eh->elf.ref_regular)
4181 {
4182 /* Make an undefined function descriptor sym, in order to
4183 pull in an --as-needed shared lib. Archives are handled
4184 elsewhere. */
4185 fdh = make_fdh (info, eh);
4186 if (fdh == NULL)
4187 return FALSE;
bb700d78 4188 }
8c5b4e52
AM
4189
4190 if (fdh != NULL)
8387904d 4191 {
35b0ce59
AM
4192 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4193 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
8c5b4e52
AM
4194
4195 /* Make both descriptor and entry symbol have the most
4196 constraining visibility of either symbol. */
35b0ce59
AM
4197 if (entry_vis < descr_vis)
4198 fdh->elf.other += entry_vis - descr_vis;
4199 else if (entry_vis > descr_vis)
4200 eh->elf.other += descr_vis - entry_vis;
4201
8c5b4e52
AM
4202 /* Propagate reference flags from entry symbol to function
4203 descriptor symbol. */
bc4e12de 4204 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
4070765b 4205 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
8c5b4e52
AM
4206 fdh->elf.ref_regular |= eh->elf.ref_regular;
4207 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
4208
4209 if (!fdh->elf.forced_local
4210 && fdh->elf.dynindx == -1
4211 && fdh->elf.versioned != versioned_hidden
4212 && (bfd_link_dll (info)
4213 || fdh->elf.def_dynamic
4214 || fdh->elf.ref_dynamic)
4215 && (eh->elf.ref_regular
4216 || eh->elf.def_regular))
4217 {
2cdcc330 4218 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
8c5b4e52 4219 return FALSE;
35b0ce59 4220 }
8387904d 4221 }
99877b66 4222
8387904d
AM
4223 return TRUE;
4224}
4225
f6c7c3e8
AM
4226/* Set up opd section info and abiversion for IBFD, and process list
4227 of dot-symbols we made in link_hash_newfunc. */
b3fac117 4228
8387904d 4229static bfd_boolean
f6c7c3e8 4230ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
8387904d 4231{
99877b66 4232 struct ppc_link_hash_table *htab;
b3fac117 4233 struct ppc_link_hash_entry **p, *eh;
459609d6 4234 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
433817dd 4235
459609d6 4236 if (opd != NULL && opd->size != 0)
b3fac117 4237 {
b9399fcf
AM
4238 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
4239 ppc64_elf_section_data (opd)->sec_type = sec_opd;
4240
459609d6
AM
4241 if (abiversion (ibfd) == 0)
4242 set_abiversion (ibfd, 1);
8a2058b5 4243 else if (abiversion (ibfd) >= 2)
f6c7c3e8 4244 {
695344c0 4245 /* xgettext:c-format */
cf97bcb0
AM
4246 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"),
4247 ibfd, abiversion (ibfd));
459609d6
AM
4248 bfd_set_error (bfd_error_bad_value);
4249 return FALSE;
f6c7c3e8 4250 }
b9399fcf 4251 }
f6c7c3e8 4252
b9399fcf
AM
4253 if (is_ppc64_elf (info->output_bfd))
4254 {
4255 /* For input files without an explicit abiversion in e_flags
4256 we should have flagged any with symbol st_other bits set
4257 as ELFv1 and above flagged those with .opd as ELFv2.
4258 Set the output abiversion if not yet set, and for any input
4259 still ambiguous, take its abiversion from the output.
4260 Differences in ABI are reported later. */
4261 if (abiversion (info->output_bfd) == 0)
4262 set_abiversion (info->output_bfd, abiversion (ibfd));
4263 else if (abiversion (ibfd) == 0)
4264 set_abiversion (ibfd, abiversion (info->output_bfd));
b3fac117
AM
4265 }
4266
459609d6
AM
4267 htab = ppc_hash_table (info);
4268 if (htab == NULL)
b9399fcf 4269 return TRUE;
459609d6 4270
b9399fcf
AM
4271 if (opd != NULL && opd->size != 0
4272 && (ibfd->flags & DYNAMIC) == 0
4273 && (opd->flags & SEC_RELOC) != 0
4274 && opd->reloc_count != 0
4275 && !bfd_is_abs_section (opd->output_section)
4276 && info->gc_sections)
4277 {
4278 /* Garbage collection needs some extra help with .opd sections.
4279 We don't want to necessarily keep everything referenced by
4280 relocs in .opd, as that would keep all functions. Instead,
4281 if we reference an .opd symbol (a function descriptor), we
4282 want to keep the function code symbol's section. This is
4283 easy for global symbols, but for local syms we need to keep
4284 information about the associated function section. */
4285 bfd_size_type amt;
4286 asection **opd_sym_map;
4287 Elf_Internal_Shdr *symtab_hdr;
4288 Elf_Internal_Rela *relocs, *rel_end, *rel;
4289
4290 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
4291 opd_sym_map = bfd_zalloc (ibfd, amt);
4292 if (opd_sym_map == NULL)
4293 return FALSE;
4294 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
4295 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
4296 info->keep_memory);
4297 if (relocs == NULL)
4298 return FALSE;
4299 symtab_hdr = &elf_symtab_hdr (ibfd);
4300 rel_end = relocs + opd->reloc_count - 1;
4301 for (rel = relocs; rel < rel_end; rel++)
4302 {
4303 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
4304 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
4305
4306 if (r_type == R_PPC64_ADDR64
4307 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
4308 && r_symndx < symtab_hdr->sh_info)
4309 {
4310 Elf_Internal_Sym *isym;
4311 asection *s;
4312
4313 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
4314 if (isym == NULL)
4315 {
4316 if (elf_section_data (opd)->relocs != relocs)
4317 free (relocs);
4318 return FALSE;
4319 }
4320
4321 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
4322 if (s != NULL && s != opd)
4323 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
4324 }
4325 }
4326 if (elf_section_data (opd)->relocs != relocs)
4327 free (relocs);
4328 }
459609d6
AM
4329
4330 p = &htab->dot_syms;
4331 while ((eh = *p) != NULL)
4332 {
4333 *p = NULL;
4334 if (&eh->elf == htab->elf.hgot)
4335 ;
4336 else if (htab->elf.hgot == NULL
4337 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4338 htab->elf.hgot = &eh->elf;
8c5b4e52
AM
4339 else if (abiversion (ibfd) <= 1)
4340 {
4341 htab->need_func_desc_adj = 1;
4342 if (!add_symbol_adjust (eh, info))
4343 return FALSE;
4344 }
459609d6
AM
4345 p = &eh->u.next_dot_sym;
4346 }
b3fac117 4347 return TRUE;
8387904d
AM
4348}
4349
97fed1c9
JJ
4350/* Undo hash table changes when an --as-needed input file is determined
4351 not to be needed. */
4352
4353static bfd_boolean
e5034e59
AM
4354ppc64_elf_notice_as_needed (bfd *ibfd,
4355 struct bfd_link_info *info,
4356 enum notice_asneeded_action act)
97fed1c9 4357{
e5034e59
AM
4358 if (act == notice_not_needed)
4359 {
4360 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 4361
e5034e59
AM
4362 if (htab == NULL)
4363 return FALSE;
4dfe6ac6 4364
e5034e59
AM
4365 htab->dot_syms = NULL;
4366 }
4367 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
4368}
4369
aa374f67
AM
4370/* If --just-symbols against a final linked binary, then assume we need
4371 toc adjusting stubs when calling functions defined there. */
4372
4373static void
4374ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4375{
4376 if ((sec->flags & SEC_CODE) != 0
4377 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4378 && is_ppc64_elf (sec->owner))
4379 {
2c3f079f
AM
4380 if (abiversion (sec->owner) >= 2
4381 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
aa374f67
AM
4382 sec->has_toc_reloc = 1;
4383 }
4384 _bfd_elf_link_just_syms (sec, info);
4385}
4386
e054468f 4387static struct plt_entry **
4ce794b7
AM
4388update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4389 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
4390{
4391 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 4392 struct plt_entry **local_plt;
f961d9dd 4393 unsigned char *local_got_tls_masks;
411e1bfb
AM
4394
4395 if (local_got_ents == NULL)
4396 {
4397 bfd_size_type size = symtab_hdr->sh_info;
4398
e054468f
AM
4399 size *= (sizeof (*local_got_ents)
4400 + sizeof (*local_plt)
4401 + sizeof (*local_got_tls_masks));
4ce794b7 4402 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 4403 if (local_got_ents == NULL)
e054468f 4404 return NULL;
411e1bfb
AM
4405 elf_local_got_ents (abfd) = local_got_ents;
4406 }
4407
37da22e5 4408 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0)
411e1bfb
AM
4409 {
4410 struct got_entry *ent;
4411
4412 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
4413 if (ent->addend == r_addend
4414 && ent->owner == abfd
4415 && ent->tls_type == tls_type)
411e1bfb
AM
4416 break;
4417 if (ent == NULL)
4418 {
4419 bfd_size_type amt = sizeof (*ent);
4ce794b7 4420 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4421 if (ent == NULL)
4422 return FALSE;
4423 ent->next = local_got_ents[r_symndx];
4424 ent->addend = r_addend;
e717da7e 4425 ent->owner = abfd;
411e1bfb 4426 ent->tls_type = tls_type;
927be08e 4427 ent->is_indirect = FALSE;
411e1bfb
AM
4428 ent->got.refcount = 0;
4429 local_got_ents[r_symndx] = ent;
4430 }
4431 ent->got.refcount += 1;
4432 }
4433
e054468f 4434 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 4435 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
37da22e5 4436 local_got_tls_masks[r_symndx] |= tls_type & 0xff;
e054468f
AM
4437
4438 return local_plt + r_symndx;
65f38f15
AM
4439}
4440
411e1bfb 4441static bfd_boolean
e054468f 4442update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 4443{
411e1bfb 4444 struct plt_entry *ent;
1e2f5b6e 4445
e054468f 4446 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
4447 if (ent->addend == addend)
4448 break;
4449 if (ent == NULL)
1e2f5b6e 4450 {
411e1bfb 4451 bfd_size_type amt = sizeof (*ent);
4ce794b7 4452 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4453 if (ent == NULL)
4454 return FALSE;
e054468f 4455 ent->next = *plist;
411e1bfb
AM
4456 ent->addend = addend;
4457 ent->plt.refcount = 0;
e054468f 4458 *plist = ent;
1e2f5b6e 4459 }
411e1bfb 4460 ent->plt.refcount += 1;
b34976b6 4461 return TRUE;
1e2f5b6e
AM
4462}
4463
e054468f
AM
4464static bfd_boolean
4465is_branch_reloc (enum elf_ppc64_reloc_type r_type)
4466{
4467 return (r_type == R_PPC64_REL24
05d0e962 4468 || r_type == R_PPC64_REL24_NOTOC
e054468f
AM
4469 || r_type == R_PPC64_REL14
4470 || r_type == R_PPC64_REL14_BRTAKEN
4471 || r_type == R_PPC64_REL14_BRNTAKEN
4472 || r_type == R_PPC64_ADDR24
4473 || r_type == R_PPC64_ADDR14
4474 || r_type == R_PPC64_ADDR14_BRTAKEN
23cedd1d 4475 || r_type == R_PPC64_ADDR14_BRNTAKEN
5663e321
AM
4476 || r_type == R_PPC64_PLTCALL
4477 || r_type == R_PPC64_PLTCALL_NOTOC);
23cedd1d
AM
4478}
4479
4480/* Relocs on inline plt call sequence insns prior to the call. */
4481
4482static bfd_boolean
4483is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type)
4484{
4485 return (r_type == R_PPC64_PLT16_HA
4486 || r_type == R_PPC64_PLT16_HI
4487 || r_type == R_PPC64_PLT16_LO
4488 || r_type == R_PPC64_PLT16_LO_DS
5663e321
AM
4489 || r_type == R_PPC64_PLT_PCREL34
4490 || r_type == R_PPC64_PLT_PCREL34_NOTOC
4491 || r_type == R_PPC64_PLTSEQ
4492 || r_type == R_PPC64_PLTSEQ_NOTOC);
e054468f
AM
4493}
4494
5bd4f169 4495/* Look through the relocs for a section during the first phase, and
65f38f15 4496 calculate needed space in the global offset table, procedure
5d1634d7 4497 linkage table, and dynamic reloc sections. */
5bd4f169 4498
b34976b6 4499static bfd_boolean
4ce794b7
AM
4500ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4501 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 4502{
65f38f15 4503 struct ppc_link_hash_table *htab;
5bd4f169 4504 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 4505 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
4506 const Elf_Internal_Rela *rel;
4507 const Elf_Internal_Rela *rel_end;
5bd4f169 4508 asection *sreloc;
3a71aa26 4509 struct elf_link_hash_entry *tga, *dottga;
b9399fcf 4510 bfd_boolean is_opd;
5bd4f169 4511
0e1862bb 4512 if (bfd_link_relocatable (info))
b34976b6 4513 return TRUE;
5bd4f169 4514
680a3378
AM
4515 /* Don't do anything special with non-loaded, non-alloced sections.
4516 In particular, any relocs in such sections should not affect GOT
4517 and PLT reference counting (ie. we don't allow them to create GOT
4518 or PLT entries), there's no possibility or desire to optimize TLS
4519 relocs, and there's not much point in propagating relocs to shared
4520 libs that the dynamic linker won't relocate. */
4521 if ((sec->flags & SEC_ALLOC) == 0)
4522 return TRUE;
4523
0c8d6e5c 4524 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 4525
65f38f15 4526 htab = ppc_hash_table (info);
4dfe6ac6
NC
4527 if (htab == NULL)
4528 return FALSE;
4529
3a71aa26
AM
4530 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4531 FALSE, FALSE, TRUE);
4532 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
4533 FALSE, FALSE, TRUE);
0ffa91dd 4534 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 4535 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 4536 sreloc = NULL;
b9399fcf 4537 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5bd4f169
AM
4538 rel_end = relocs + sec->reloc_count;
4539 for (rel = relocs; rel < rel_end; rel++)
4540 {
4541 unsigned long r_symndx;
4542 struct elf_link_hash_entry *h;
04c9666a 4543 enum elf_ppc64_reloc_type r_type;
727fc41e 4544 int tls_type;
7c8fe5c4 4545 struct _ppc64_elf_section_data *ppc64_sec;
cbf95972 4546 struct plt_entry **ifunc, **plt_list;
5bd4f169
AM
4547
4548 r_symndx = ELF64_R_SYM (rel->r_info);
4549 if (r_symndx < symtab_hdr->sh_info)
4550 h = NULL;
4551 else
973a3492
L
4552 {
4553 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 4554 h = elf_follow_link (h);
1c865ab2
AM
4555
4556 if (h == htab->elf.hgot)
4557 sec->has_toc_reloc = 1;
973a3492 4558 }
5bd4f169 4559
5663e321
AM
4560 r_type = ELF64_R_TYPE (rel->r_info);
4561 switch (r_type)
4562 {
04bdff6a
AM
4563 case R_PPC64_D34:
4564 case R_PPC64_D34_LO:
4565 case R_PPC64_D34_HI30:
4566 case R_PPC64_D34_HA30:
4567 case R_PPC64_D28:
c213164a
AM
4568 case R_PPC64_TPREL34:
4569 case R_PPC64_DTPREL34:
04bdff6a 4570 case R_PPC64_PCREL34:
5663e321 4571 case R_PPC64_GOT_PCREL34:
c213164a
AM
4572 case R_PPC64_GOT_TLSGD34:
4573 case R_PPC64_GOT_TLSLD34:
4574 case R_PPC64_GOT_TPREL34:
4575 case R_PPC64_GOT_DTPREL34:
5663e321
AM
4576 case R_PPC64_PLT_PCREL34:
4577 case R_PPC64_PLT_PCREL34_NOTOC:
04bdff6a
AM
4578 case R_PPC64_PCREL28:
4579 htab->powerxx_stubs = 1;
133a1f60
AM
4580 break;
4581 default:
5663e321
AM
4582 break;
4583 }
903b777d
AM
4584
4585 switch (r_type)
4586 {
4587 case R_PPC64_PLT16_HA:
4588 case R_PPC64_GOT_TLSLD16_HA:
4589 case R_PPC64_GOT_TLSGD16_HA:
4590 case R_PPC64_GOT_TPREL16_HA:
4591 case R_PPC64_GOT_DTPREL16_HA:
4592 case R_PPC64_GOT16_HA:
4593 case R_PPC64_TOC16_HA:
4594 case R_PPC64_PLT16_LO:
4595 case R_PPC64_PLT16_LO_DS:
4596 case R_PPC64_GOT_TLSLD16_LO:
4597 case R_PPC64_GOT_TLSGD16_LO:
4598 case R_PPC64_GOT_TPREL16_LO_DS:
4599 case R_PPC64_GOT_DTPREL16_LO_DS:
4600 case R_PPC64_GOT16_LO:
4601 case R_PPC64_GOT16_LO_DS:
4602 case R_PPC64_TOC16_LO:
4603 case R_PPC64_TOC16_LO_DS:
4604 case R_PPC64_GOT_PCREL34:
4605 ppc64_elf_tdata (abfd)->has_optrel = 1;
4606 ppc64_elf_section_data (sec)->has_optrel = 1;
4607 break;
4608 default:
4609 break;
4610 }
4611
f749f26e 4612 ifunc = NULL;
25f23106
AM
4613 if (h != NULL)
4614 {
4615 if (h->type == STT_GNU_IFUNC)
4616 {
4617 h->needs_plt = 1;
4618 ifunc = &h->plt.plist;
4619 }
4620 }
4621 else
4622 {
4623 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4624 abfd, r_symndx);
4625 if (isym == NULL)
4626 return FALSE;
4627
4628 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4629 {
4630 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4631 rel->r_addend,
37da22e5 4632 NON_GOT | PLT_IFUNC);
25f23106
AM
4633 if (ifunc == NULL)
4634 return FALSE;
4635 }
4636 }
727fc41e 4637
f749f26e 4638 tls_type = 0;
a33d1f77 4639 switch (r_type)
5bd4f169 4640 {
727fc41e
AM
4641 case R_PPC64_TLSGD:
4642 case R_PPC64_TLSLD:
4643 /* These special tls relocs tie a call to __tls_get_addr with
4644 its parameter symbol. */
37da22e5
AM
4645 if (h != NULL)
4646 ((struct ppc_link_hash_entry *) h)->tls_mask |= TLS_TLS | TLS_MARK;
4647 else
4648 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4649 rel->r_addend,
37da22e5
AM
4650 NON_GOT | TLS_TLS | TLS_MARK))
4651 return FALSE;
4652 sec->has_tls_reloc = 1;
727fc41e
AM
4653 break;
4654
411e1bfb
AM
4655 case R_PPC64_GOT_TLSLD16:
4656 case R_PPC64_GOT_TLSLD16_LO:
4657 case R_PPC64_GOT_TLSLD16_HI:
4658 case R_PPC64_GOT_TLSLD16_HA:
c213164a 4659 case R_PPC64_GOT_TLSLD34:
951fd09b 4660 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
4661 goto dogottls;
4662
4663 case R_PPC64_GOT_TLSGD16:
4664 case R_PPC64_GOT_TLSGD16_LO:
4665 case R_PPC64_GOT_TLSGD16_HI:
4666 case R_PPC64_GOT_TLSGD16_HA:
c213164a 4667 case R_PPC64_GOT_TLSGD34:
951fd09b 4668 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
4669 goto dogottls;
4670
4671 case R_PPC64_GOT_TPREL16_DS:
4672 case R_PPC64_GOT_TPREL16_LO_DS:
4673 case R_PPC64_GOT_TPREL16_HI:
4674 case R_PPC64_GOT_TPREL16_HA:
c213164a 4675 case R_PPC64_GOT_TPREL34:
7c8bbca5 4676 if (bfd_link_dll (info))
411e1bfb
AM
4677 info->flags |= DF_STATIC_TLS;
4678 tls_type = TLS_TLS | TLS_TPREL;
4679 goto dogottls;
4680
4681 case R_PPC64_GOT_DTPREL16_DS:
4682 case R_PPC64_GOT_DTPREL16_LO_DS:
4683 case R_PPC64_GOT_DTPREL16_HI:
4684 case R_PPC64_GOT_DTPREL16_HA:
c213164a 4685 case R_PPC64_GOT_DTPREL34:
411e1bfb
AM
4686 tls_type = TLS_TLS | TLS_DTPREL;
4687 dogottls:
4688 sec->has_tls_reloc = 1;
066f4018 4689 goto dogot;
411e1bfb 4690
903b777d
AM
4691 case R_PPC64_GOT16:
4692 case R_PPC64_GOT16_LO:
4693 case R_PPC64_GOT16_HI:
65f38f15 4694 case R_PPC64_GOT16_HA:
903b777d 4695 case R_PPC64_GOT16_DS:
066f4018 4696 case R_PPC64_GOT16_LO_DS:
4a421c53 4697 case R_PPC64_GOT_PCREL34:
066f4018 4698 dogot:
65f38f15 4699 /* This symbol requires a global offset table entry. */
4c52953f 4700 sec->has_toc_reloc = 1;
33c0ec9d
AM
4701 if (r_type == R_PPC64_GOT_TLSLD16
4702 || r_type == R_PPC64_GOT_TLSGD16
4703 || r_type == R_PPC64_GOT_TPREL16_DS
4704 || r_type == R_PPC64_GOT_DTPREL16_DS
4705 || r_type == R_PPC64_GOT16
4706 || r_type == R_PPC64_GOT16_DS)
4707 {
4708 htab->do_multi_toc = 1;
d77c8a4b 4709 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
4710 }
4711
e717da7e
AM
4712 if (ppc64_elf_tdata (abfd)->got == NULL
4713 && !create_got_section (abfd, info))
b34976b6 4714 return FALSE;
5bd4f169
AM
4715
4716 if (h != NULL)
4717 {
411e1bfb
AM
4718 struct ppc_link_hash_entry *eh;
4719 struct got_entry *ent;
65f38f15 4720
411e1bfb
AM
4721 eh = (struct ppc_link_hash_entry *) h;
4722 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
133a1f60 4723 if (ent->addend == rel->r_addend
e717da7e 4724 && ent->owner == abfd
411e1bfb
AM
4725 && ent->tls_type == tls_type)
4726 break;
4727 if (ent == NULL)
5bd4f169 4728 {
411e1bfb 4729 bfd_size_type amt = sizeof (*ent);
4ce794b7 4730 ent = bfd_alloc (abfd, amt);
411e1bfb 4731 if (ent == NULL)
b34976b6 4732 return FALSE;
411e1bfb 4733 ent->next = eh->elf.got.glist;
133a1f60 4734 ent->addend = rel->r_addend;
e717da7e 4735 ent->owner = abfd;
411e1bfb 4736 ent->tls_type = tls_type;
927be08e 4737 ent->is_indirect = FALSE;
411e1bfb
AM
4738 ent->got.refcount = 0;
4739 eh->elf.got.glist = ent;
5bd4f169 4740 }
411e1bfb 4741 ent->got.refcount += 1;
e7b938ca 4742 eh->tls_mask |= tls_type;
5bd4f169 4743 }
411e1bfb
AM
4744 else
4745 /* This is a global offset table entry for a local symbol. */
4746 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4747 rel->r_addend, tls_type))
411e1bfb 4748 return FALSE;
a345bc8d
AM
4749
4750 /* We may also need a plt entry if the symbol turns out to be
4751 an ifunc. */
0e1862bb 4752 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
a345bc8d 4753 {
133a1f60 4754 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
a345bc8d
AM
4755 return FALSE;
4756 }
5bd4f169
AM
4757 break;
4758
5bd4f169 4759 case R_PPC64_PLT16_HA:
65f38f15
AM
4760 case R_PPC64_PLT16_HI:
4761 case R_PPC64_PLT16_LO:
08be3224 4762 case R_PPC64_PLT16_LO_DS:
5663e321
AM
4763 case R_PPC64_PLT_PCREL34:
4764 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
4765 case R_PPC64_PLT32:
4766 case R_PPC64_PLT64:
cbf95972
AM
4767 /* This symbol requires a procedure linkage table entry. */
4768 plt_list = ifunc;
4769 if (h != NULL)
e054468f 4770 {
e054468f
AM
4771 h->needs_plt = 1;
4772 if (h->root.root.string[0] == '.'
4773 && h->root.root.string[1] != '\0')
4774 ((struct ppc_link_hash_entry *) h)->is_func = 1;
2d7ad24e 4775 ((struct ppc_link_hash_entry *) h)->tls_mask |= PLT_KEEP;
cbf95972
AM
4776 plt_list = &h->plt.plist;
4777 }
4778 if (plt_list == NULL)
2d7ad24e 4779 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4780 rel->r_addend,
2d7ad24e 4781 NON_GOT | PLT_KEEP);
133a1f60 4782 if (!update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4783 return FALSE;
5bd4f169
AM
4784 break;
4785
4786 /* The following relocations don't need to propagate the
4787 relocation if linking a shared object since they are
4788 section relative. */
4789 case R_PPC64_SECTOFF:
4790 case R_PPC64_SECTOFF_LO:
4791 case R_PPC64_SECTOFF_HI:
4792 case R_PPC64_SECTOFF_HA:
4793 case R_PPC64_SECTOFF_DS:
4794 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
4795 case R_PPC64_DTPREL16:
4796 case R_PPC64_DTPREL16_LO:
4797 case R_PPC64_DTPREL16_HI:
4798 case R_PPC64_DTPREL16_HA:
4799 case R_PPC64_DTPREL16_DS:
4800 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
4801 case R_PPC64_DTPREL16_HIGH:
4802 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
4803 case R_PPC64_DTPREL16_HIGHER:
4804 case R_PPC64_DTPREL16_HIGHERA:
4805 case R_PPC64_DTPREL16_HIGHEST:
4806 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
4807 break;
4808
ad8e1ba5 4809 /* Nor do these. */
25f23106
AM
4810 case R_PPC64_REL16:
4811 case R_PPC64_REL16_LO:
4812 case R_PPC64_REL16_HI:
4813 case R_PPC64_REL16_HA:
4a969973
AM
4814 case R_PPC64_REL16_HIGH:
4815 case R_PPC64_REL16_HIGHA:
4816 case R_PPC64_REL16_HIGHER:
4817 case R_PPC64_REL16_HIGHERA:
4818 case R_PPC64_REL16_HIGHEST:
4819 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
4820 case R_PPC64_REL16_HIGHER34:
4821 case R_PPC64_REL16_HIGHERA34:
4822 case R_PPC64_REL16_HIGHEST34:
4823 case R_PPC64_REL16_HIGHESTA34:
a680de9a 4824 case R_PPC64_REL16DX_HA:
25f23106
AM
4825 break;
4826
45965137
AM
4827 /* Not supported as a dynamic relocation. */
4828 case R_PPC64_ADDR64_LOCAL:
0e1862bb 4829 if (bfd_link_pic (info))
45965137
AM
4830 {
4831 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
4832 ppc_howto_init ();
695344c0 4833 /* xgettext:c-format */
174d0a74 4834 info->callbacks->einfo (_("%H: %s reloc unsupported "
cf97bcb0 4835 "in shared libraries and PIEs\n"),
45965137
AM
4836 abfd, sec, rel->r_offset,
4837 ppc64_elf_howto_table[r_type]->name);
4838 bfd_set_error (bfd_error_bad_value);
4839 return FALSE;
4840 }
4841 break;
4842
ad8e1ba5 4843 case R_PPC64_TOC16:
33c0ec9d
AM
4844 case R_PPC64_TOC16_DS:
4845 htab->do_multi_toc = 1;
d77c8a4b 4846 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
1a0670f3 4847 /* Fall through. */
ad8e1ba5
AM
4848 case R_PPC64_TOC16_LO:
4849 case R_PPC64_TOC16_HI:
4850 case R_PPC64_TOC16_HA:
ad8e1ba5 4851 case R_PPC64_TOC16_LO_DS:
4c52953f 4852 sec->has_toc_reloc = 1;
ec73ddcd 4853 if (h != NULL && bfd_link_executable (info))
1bdd8fac
AM
4854 {
4855 /* We may need a copy reloc. */
4856 h->non_got_ref = 1;
4857 /* Strongly prefer a copy reloc over a dynamic reloc.
4858 glibc ld.so as of 2019-08 will error out if one of
4859 these relocations is emitted. */
4860 h->needs_copy = 1;
4861 goto dodyn;
4862 }
ad8e1ba5
AM
4863 break;
4864
006589cf
AM
4865 /* Marker reloc. */
4866 case R_PPC64_ENTRY:
4867 break;
4868
5bd4f169
AM
4869 /* This relocation describes the C++ object vtable hierarchy.
4870 Reconstruct it for later use during GC. */
4871 case R_PPC64_GNU_VTINHERIT:
c152c796 4872 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 4873 return FALSE;
5bd4f169
AM
4874 break;
4875
4876 /* This relocation describes which C++ vtable entries are actually
4877 used. Record for later use during GC. */
4878 case R_PPC64_GNU_VTENTRY:
a0ea3a14 4879 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 4880 return FALSE;
5bd4f169
AM
4881 break;
4882
721956f4
AM
4883 case R_PPC64_REL14:
4884 case R_PPC64_REL14_BRTAKEN:
4885 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
4886 {
4887 asection *dest = NULL;
4888
4889 /* Heuristic: If jumping outside our section, chances are
4890 we are going to need a stub. */
4891 if (h != NULL)
4892 {
4893 /* If the sym is weak it may be overridden later, so
4894 don't assume we know where a weak sym lives. */
4895 if (h->root.type == bfd_link_hash_defined)
4896 dest = h->root.u.def.section;
4897 }
4898 else
87d72d41
AM
4899 {
4900 Elf_Internal_Sym *isym;
4901
4902 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4903 abfd, r_symndx);
4904 if (isym == NULL)
4905 return FALSE;
4906
4907 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
4908 }
4909
220c76dd 4910 if (dest != sec)
7c8fe5c4 4911 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 4912 }
3e04d765
AM
4913 goto rel24;
4914
4915 case R_PPC64_PLTCALL:
5663e321 4916 case R_PPC64_PLTCALL_NOTOC:
3e04d765 4917 ppc64_elf_section_data (sec)->has_pltcall = 1;
721956f4
AM
4918 /* Fall through. */
4919
5d1634d7 4920 case R_PPC64_REL24:
05d0e962 4921 case R_PPC64_REL24_NOTOC:
3e04d765 4922 rel24:
cbf95972
AM
4923 plt_list = ifunc;
4924 if (h != NULL)
5d1634d7 4925 {
e054468f
AM
4926 h->needs_plt = 1;
4927 if (h->root.root.string[0] == '.'
4928 && h->root.root.string[1] != '\0')
4929 ((struct ppc_link_hash_entry *) h)->is_func = 1;
cbf95972 4930
3a71aa26 4931 if (h == tga || h == dottga)
cbf95972
AM
4932 {
4933 sec->has_tls_reloc = 1;
4934 if (rel != relocs
4935 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
4936 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
4937 /* We have a new-style __tls_get_addr call with
4938 a marker reloc. */
4939 ;
4940 else
4941 /* Mark this section as having an old-style call. */
9737e8af 4942 sec->nomark_tls_get_addr = 1;
cbf95972
AM
4943 }
4944 plt_list = &h->plt.plist;
411e1bfb 4945 }
cbf95972
AM
4946
4947 /* We may need a .plt entry if the function this reloc
4948 refers to is in a shared lib. */
4949 if (plt_list
133a1f60 4950 && !update_plt_info (abfd, plt_list, rel->r_addend))
cbf95972 4951 return FALSE;
411e1bfb
AM
4952 break;
4953
cbf95972
AM
4954 case R_PPC64_ADDR14:
4955 case R_PPC64_ADDR14_BRNTAKEN:
4956 case R_PPC64_ADDR14_BRTAKEN:
4957 case R_PPC64_ADDR24:
4958 goto dodyn;
4959
411e1bfb
AM
4960 case R_PPC64_TPREL64:
4961 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
7c8bbca5 4962 if (bfd_link_dll (info))
411e1bfb
AM
4963 info->flags |= DF_STATIC_TLS;
4964 goto dotlstoc;
4965
4966 case R_PPC64_DTPMOD64:
4967 if (rel + 1 < rel_end
4968 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4969 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 4970 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 4971 else
951fd09b 4972 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
4973 goto dotlstoc;
4974
4975 case R_PPC64_DTPREL64:
4976 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4977 if (rel != relocs
4978 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4979 && rel[-1].r_offset == rel->r_offset - 8)
4980 /* This is the second reloc of a dtpmod, dtprel pair.
4981 Don't mark with TLS_DTPREL. */
4982 goto dodyn;
4983
4984 dotlstoc:
4985 sec->has_tls_reloc = 1;
4986 if (h != NULL)
4987 {
4988 struct ppc_link_hash_entry *eh;
4989 eh = (struct ppc_link_hash_entry *) h;
46e9995a 4990 eh->tls_mask |= tls_type & 0xff;
411e1bfb
AM
4991 }
4992 else
4993 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4994 rel->r_addend, tls_type))
411e1bfb
AM
4995 return FALSE;
4996
7c8fe5c4
AM
4997 ppc64_sec = ppc64_elf_section_data (sec);
4998 if (ppc64_sec->sec_type != sec_toc)
411e1bfb 4999 {
3a71aa26
AM
5000 bfd_size_type amt;
5001
e7b938ca 5002 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5003 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5004 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5005 if (ppc64_sec->u.toc.symndx == NULL)
5006 return FALSE;
5007 amt = sec->size * sizeof (bfd_vma) / 8;
5008 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5009 if (ppc64_sec->u.toc.add == NULL)
411e1bfb 5010 return FALSE;
7c8fe5c4
AM
5011 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5012 ppc64_sec->sec_type = sec_toc;
411e1bfb
AM
5013 }
5014 BFD_ASSERT (rel->r_offset % 8 == 0);
3a71aa26 5015 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
133a1f60 5016 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5017
5018 /* Mark the second slot of a GD or LD entry.
5019 -1 to indicate GD and -2 to indicate LD. */
5020 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5021 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5022 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5023 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5024 goto dodyn;
5025
5026 case R_PPC64_TPREL16:
5027 case R_PPC64_TPREL16_LO:
5028 case R_PPC64_TPREL16_HI:
5029 case R_PPC64_TPREL16_HA:
5030 case R_PPC64_TPREL16_DS:
5031 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
5032 case R_PPC64_TPREL16_HIGH:
5033 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5034 case R_PPC64_TPREL16_HIGHER:
5035 case R_PPC64_TPREL16_HIGHERA:
5036 case R_PPC64_TPREL16_HIGHEST:
5037 case R_PPC64_TPREL16_HIGHESTA:
c213164a 5038 case R_PPC64_TPREL34:
7c8bbca5
AM
5039 if (bfd_link_dll (info))
5040 info->flags |= DF_STATIC_TLS;
5041 goto dodyn;
5d1634d7 5042
e86ce104 5043 case R_PPC64_ADDR64:
b9399fcf 5044 if (is_opd
1e2f5b6e 5045 && rel + 1 < rel_end
4ce794b7 5046 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 5047 {
8387904d 5048 if (h != NULL)
8c5b4e52 5049 ((struct ppc_link_hash_entry *) h)->is_func = 1;
1e2f5b6e 5050 }
e86ce104
AM
5051 /* Fall through. */
5052
65f38f15
AM
5053 case R_PPC64_ADDR16:
5054 case R_PPC64_ADDR16_DS:
5055 case R_PPC64_ADDR16_HA:
5056 case R_PPC64_ADDR16_HI:
f9c6b907
AM
5057 case R_PPC64_ADDR16_HIGH:
5058 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
5059 case R_PPC64_ADDR16_HIGHER:
5060 case R_PPC64_ADDR16_HIGHERA:
5061 case R_PPC64_ADDR16_HIGHEST:
5062 case R_PPC64_ADDR16_HIGHESTA:
5063 case R_PPC64_ADDR16_LO:
5064 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
5065 case R_PPC64_D34:
5066 case R_PPC64_D34_LO:
5067 case R_PPC64_D34_HI30:
5068 case R_PPC64_D34_HA30:
5069 case R_PPC64_ADDR16_HIGHER34:
5070 case R_PPC64_ADDR16_HIGHERA34:
5071 case R_PPC64_ADDR16_HIGHEST34:
5072 case R_PPC64_ADDR16_HIGHESTA34:
5073 case R_PPC64_D28:
0e1862bb 5074 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
a345bc8d
AM
5075 && rel->r_addend == 0)
5076 {
5077 /* We may need a .plt entry if this reloc refers to a
5078 function in a shared lib. */
5663e321 5079 if (!update_plt_info (abfd, &h->plt.plist, 0))
a345bc8d
AM
5080 return FALSE;
5081 h->pointer_equality_needed = 1;
5082 }
5083 /* Fall through. */
5084
5085 case R_PPC64_REL30:
5086 case R_PPC64_REL32:
5087 case R_PPC64_REL64:
65f38f15 5088 case R_PPC64_ADDR32:
65f38f15
AM
5089 case R_PPC64_UADDR16:
5090 case R_PPC64_UADDR32:
5091 case R_PPC64_UADDR64:
5bd4f169 5092 case R_PPC64_TOC:
ec73ddcd 5093 if (h != NULL && bfd_link_executable (info))
81848ca0 5094 /* We may need a copy reloc. */
f5385ebf 5095 h->non_got_ref = 1;
81848ca0 5096
41bd81ab 5097 /* Don't propagate .opd relocs. */
b9399fcf 5098 if (NO_OPD_RELOCS && is_opd)
e86ce104 5099 break;
e86ce104 5100
65f38f15
AM
5101 /* If we are creating a shared library, and this is a reloc
5102 against a global symbol, or a non PC relative reloc
5103 against a local symbol, then we need to copy the reloc
5104 into the shared library. However, if we are linking with
5105 -Bsymbolic, we do not need to copy a reloc against a
5106 global symbol which is defined in an object we are
5107 including in the link (i.e., DEF_REGULAR is set). At
5108 this point we have not seen all the input files, so it is
5109 possible that DEF_REGULAR is not set now but will be set
5110 later (it is never cleared). In case of a weak definition,
5111 DEF_REGULAR may be cleared later by a strong definition in
5112 a shared library. We account for that possibility below by
f4656909 5113 storing information in the dyn_relocs field of the hash
65f38f15
AM
5114 table entry. A similar situation occurs when creating
5115 shared libraries and symbol visibility changes render the
5116 symbol local.
5117
5118 If on the other hand, we are creating an executable, we
5119 may need to keep relocations for symbols satisfied by a
5120 dynamic library if we manage to avoid copy relocs for the
5121 symbol. */
411e1bfb 5122 dodyn:
ec73ddcd
AM
5123 if ((h != NULL
5124 && (h->root.type == bfd_link_hash_defweak
5125 || !h->def_regular))
5126 || (h != NULL
5127 && !bfd_link_executable (info)
5128 && !SYMBOLIC_BIND (info, h))
5129 || (bfd_link_pic (info)
5130 && must_be_dyn_reloc (info, r_type))
0e1862bb 5131 || (!bfd_link_pic (info)
25f23106 5132 && ifunc != NULL))
5bd4f169 5133 {
65f38f15
AM
5134 /* We must copy these reloc types into the output file.
5135 Create a reloc section in dynobj and make room for
5136 this reloc. */
5bd4f169
AM
5137 if (sreloc == NULL)
5138 {
83bac4b0
NC
5139 sreloc = _bfd_elf_make_dynamic_reloc_section
5140 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
65f38f15 5141
5bd4f169 5142 if (sreloc == NULL)
83bac4b0 5143 return FALSE;
5bd4f169
AM
5144 }
5145
65f38f15
AM
5146 /* If this is a global symbol, we count the number of
5147 relocations we need for this symbol. */
5148 if (h != NULL)
5149 {
19e08130
AM
5150 struct elf_dyn_relocs *p;
5151 struct elf_dyn_relocs **head;
5152
ec338859 5153 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
19e08130
AM
5154 p = *head;
5155 if (p == NULL || p->sec != sec)
5156 {
5157 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5158 if (p == NULL)
5159 return FALSE;
5160 p->next = *head;
5161 *head = p;
5162 p->sec = sec;
5163 p->count = 0;
5164 p->pc_count = 0;
5165 }
5166 p->count += 1;
5167 if (!must_be_dyn_reloc (info, r_type))
5168 p->pc_count += 1;
65f38f15
AM
5169 }
5170 else
5171 {
ec338859
AM
5172 /* Track dynamic relocs needed for local syms too.
5173 We really need local syms available to do this
5174 easily. Oh well. */
19e08130
AM
5175 struct ppc_dyn_relocs *p;
5176 struct ppc_dyn_relocs **head;
5177 bfd_boolean is_ifunc;
ec338859 5178 asection *s;
6edfbbad 5179 void *vpp;
87d72d41 5180 Elf_Internal_Sym *isym;
6edfbbad 5181
87d72d41
AM
5182 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5183 abfd, r_symndx);
5184 if (isym == NULL)
b34976b6 5185 return FALSE;
ec338859 5186
87d72d41
AM
5187 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5188 if (s == NULL)
5189 s = sec;
5190
6edfbbad 5191 vpp = &elf_section_data (s)->local_dynrel;
19e08130
AM
5192 head = (struct ppc_dyn_relocs **) vpp;
5193 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5194 p = *head;
5195 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5196 p = p->next;
5197 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5198 {
5199 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5200 if (p == NULL)
5201 return FALSE;
5202 p->next = *head;
5203 *head = p;
5204 p->sec = sec;
5205 p->ifunc = is_ifunc;
5206 p->count = 0;
5207 }
5208 p->count += 1;
ec338859 5209 }
65f38f15 5210 }
5bd4f169 5211 break;
65f38f15
AM
5212
5213 default:
96e0dda4 5214 break;
5bd4f169
AM
5215 }
5216 }
5217
b34976b6 5218 return TRUE;
5bd4f169
AM
5219}
5220
ee67d69a
AM
5221/* Merge backend specific data from an object file to the output
5222 object file when linking. */
5223
5224static bfd_boolean
50e03d47 5225ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
ee67d69a 5226{
50e03d47 5227 bfd *obfd = info->output_bfd;
ee67d69a
AM
5228 unsigned long iflags, oflags;
5229
5230 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5231 return TRUE;
5232
5233 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5234 return TRUE;
5235
50e03d47 5236 if (!_bfd_generic_verify_endian_match (ibfd, info))
ee67d69a
AM
5237 return FALSE;
5238
5239 iflags = elf_elfheader (ibfd)->e_flags;
5240 oflags = elf_elfheader (obfd)->e_flags;
5241
f6c7c3e8 5242 if (iflags & ~EF_PPC64_ABI)
ee67d69a 5243 {
4eca0228 5244 _bfd_error_handler
695344c0 5245 /* xgettext:c-format */
871b3ab2 5246 (_("%pB uses unknown e_flags 0x%lx"), ibfd, iflags);
ee67d69a
AM
5247 bfd_set_error (bfd_error_bad_value);
5248 return FALSE;
5249 }
f6c7c3e8 5250 else if (iflags != oflags && iflags != 0)
ee67d69a 5251 {
4eca0228 5252 _bfd_error_handler
695344c0 5253 /* xgettext:c-format */
871b3ab2 5254 (_("%pB: ABI version %ld is not compatible with ABI version %ld output"),
ee67d69a
AM
5255 ibfd, iflags, oflags);
5256 bfd_set_error (bfd_error_bad_value);
5257 return FALSE;
5258 }
5259
4a91d0ba
AM
5260 if (!_bfd_elf_ppc_merge_fp_attributes (ibfd, info))
5261 return FALSE;
005d79fd 5262
ee67d69a 5263 /* Merge Tag_compatibility attributes and any common GNU ones. */
8d2c8c3d 5264 return _bfd_elf_merge_object_attributes (ibfd, info);
ee67d69a
AM
5265}
5266
5267static bfd_boolean
5268ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5269{
5270 /* Print normal ELF private data. */
5271 _bfd_elf_print_private_bfd_data (abfd, ptr);
5272
5273 if (elf_elfheader (abfd)->e_flags != 0)
5274 {
5275 FILE *file = ptr;
5276
ee67d69a
AM
5277 fprintf (file, _("private flags = 0x%lx:"),
5278 elf_elfheader (abfd)->e_flags);
5279
5280 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5281 fprintf (file, _(" [abiv%ld]"),
5282 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5283 fputc ('\n', file);
5284 }
5285
5286 return TRUE;
5287}
5288
8387904d 5289/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
b53dfeb2
AM
5290 of the code entry point, and its section, which must be in the same
5291 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
8387904d
AM
5292
5293static bfd_vma
5294opd_entry_value (asection *opd_sec,
5295 bfd_vma offset,
5296 asection **code_sec,
aef36ac1
AM
5297 bfd_vma *code_off,
5298 bfd_boolean in_code_sec)
8387904d
AM
5299{
5300 bfd *opd_bfd = opd_sec->owner;
8860955f 5301 Elf_Internal_Rela *relocs;
8387904d 5302 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 5303 bfd_vma val;
8387904d 5304
9f296da3
AM
5305 /* No relocs implies we are linking a --just-symbols object, or looking
5306 at a final linked executable with addr2line or somesuch. */
4b85d634
AM
5307 if (opd_sec->reloc_count == 0)
5308 {
729eabd5 5309 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
3b36f7e6 5310
729eabd5
AM
5311 if (contents == NULL)
5312 {
5313 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5314 return (bfd_vma) -1;
5315 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5316 }
ee1e4ede 5317
dbb3fbbb 5318 /* PR 17512: file: 64b9dfbb. */
451dfd38 5319 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
dbb3fbbb
NC
5320 return (bfd_vma) -1;
5321
729eabd5 5322 val = bfd_get_64 (opd_bfd, contents + offset);
aef36ac1
AM
5323 if (code_sec != NULL)
5324 {
5325 asection *sec, *likely = NULL;
ee1e4ede 5326
aef36ac1 5327 if (in_code_sec)
4b85d634 5328 {
aef36ac1
AM
5329 sec = *code_sec;
5330 if (sec->vma <= val
5331 && val < sec->vma + sec->size)
5332 likely = sec;
5333 else
5334 val = -1;
5335 }
5336 else
5337 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5338 if (sec->vma <= val
5339 && (sec->flags & SEC_LOAD) != 0
5340 && (sec->flags & SEC_ALLOC) != 0)
5341 likely = sec;
5342 if (likely != NULL)
5343 {
5344 *code_sec = likely;
5345 if (code_off != NULL)
5346 *code_off = val - likely->vma;
4b85d634
AM
5347 }
5348 }
aef36ac1 5349 return val;
4b85d634
AM
5350 }
5351
0c8d6e5c 5352 BFD_ASSERT (is_ppc64_elf (opd_bfd));
0ffa91dd 5353
729eabd5 5354 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
8860955f
AM
5355 if (relocs == NULL)
5356 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
877a8638
NC
5357 /* PR 17512: file: df8e1fd6. */
5358 if (relocs == NULL)
5359 return (bfd_vma) -1;
645ea6a9 5360
8387904d 5361 /* Go find the opd reloc at the sym address. */
8860955f 5362 lo = relocs;
8387904d 5363 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 5364 val = (bfd_vma) -1;
8387904d
AM
5365 while (lo < hi)
5366 {
5367 look = lo + (hi - lo) / 2;
5368 if (look->r_offset < offset)
5369 lo = look + 1;
5370 else if (look->r_offset > offset)
5371 hi = look;
5372 else
5373 {
0ffa91dd
NC
5374 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5375
8387904d
AM
5376 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5377 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5378 {
5379 unsigned long symndx = ELF64_R_SYM (look->r_info);
b53dfeb2 5380 asection *sec = NULL;
8387904d 5381
b53dfeb2
AM
5382 if (symndx >= symtab_hdr->sh_info
5383 && elf_sym_hashes (opd_bfd) != NULL)
8387904d
AM
5384 {
5385 struct elf_link_hash_entry **sym_hashes;
5386 struct elf_link_hash_entry *rh;
5387
5388 sym_hashes = elf_sym_hashes (opd_bfd);
5389 rh = sym_hashes[symndx - symtab_hdr->sh_info];
128205bb
AM
5390 if (rh != NULL)
5391 {
5392 rh = elf_follow_link (rh);
bb854a36
AM
5393 if (rh->root.type != bfd_link_hash_defined
5394 && rh->root.type != bfd_link_hash_defweak)
5395 break;
5396 if (rh->root.u.def.section->owner == opd_bfd)
b53dfeb2 5397 {
bb854a36
AM
5398 val = rh->root.u.def.value;
5399 sec = rh->root.u.def.section;
b53dfeb2
AM
5400 }
5401 }
5402 }
5403
5404 if (sec == NULL)
5405 {
5406 Elf_Internal_Sym *sym;
5407
5408 if (symndx < symtab_hdr->sh_info)
5409 {
5410 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5411 if (sym == NULL)
5412 {
5413 size_t symcnt = symtab_hdr->sh_info;
5414 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5415 symcnt, 0,
5416 NULL, NULL, NULL);
5417 if (sym == NULL)
5418 break;
5419 symtab_hdr->contents = (bfd_byte *) sym;
5420 }
5421 sym += symndx;
128205bb
AM
5422 }
5423 else
5424 {
b53dfeb2
AM
5425 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5426 1, symndx,
5427 NULL, NULL, NULL);
128205bb
AM
5428 if (sym == NULL)
5429 break;
128205bb 5430 }
b53dfeb2
AM
5431 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5432 if (sec == NULL)
5433 break;
5434 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5435 val = sym->st_value;
8387904d 5436 }
b53dfeb2 5437
8387904d
AM
5438 val += look->r_addend;
5439 if (code_off != NULL)
5440 *code_off = val;
5441 if (code_sec != NULL)
aef36ac1
AM
5442 {
5443 if (in_code_sec && *code_sec != sec)
5444 return -1;
5445 else
5446 *code_sec = sec;
5447 }
b53dfeb2 5448 if (sec->output_section != NULL)
8387904d 5449 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
5450 }
5451 break;
5452 }
5453 }
645ea6a9 5454
645ea6a9 5455 return val;
8387904d
AM
5456}
5457
aef36ac1
AM
5458/* If the ELF symbol SYM might be a function in SEC, return the
5459 function size and set *CODE_OFF to the function's entry point,
5460 otherwise return zero. */
9f296da3 5461
aef36ac1
AM
5462static bfd_size_type
5463ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
5464 bfd_vma *code_off)
9f296da3 5465{
aef36ac1
AM
5466 bfd_size_type size;
5467
5468 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
5469 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
5470 return 0;
5471
5472 size = 0;
5473 if (!(sym->flags & BSF_SYNTHETIC))
5474 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
5475
5476 if (strcmp (sym->section->name, ".opd") == 0)
9f296da3 5477 {
b07bca4e
AM
5478 struct _opd_sec_data *opd = get_opd_info (sym->section);
5479 bfd_vma symval = sym->value;
5480
5481 if (opd != NULL
5482 && opd->adjust != NULL
5483 && elf_section_data (sym->section)->relocs != NULL)
5484 {
5485 /* opd_entry_value will use cached relocs that have been
5486 adjusted, but with raw symbols. That means both local
5487 and global symbols need adjusting. */
5488 long adjust = opd->adjust[OPD_NDX (symval)];
5489 if (adjust == -1)
5490 return 0;
5491 symval += adjust;
5492 }
5493
5494 if (opd_entry_value (sym->section, symval,
aef36ac1
AM
5495 &sec, code_off, TRUE) == (bfd_vma) -1)
5496 return 0;
5497 /* An old ABI binary with dot-syms has a size of 24 on the .opd
5498 symbol. This size has nothing to do with the code size of the
5499 function, which is what we're supposed to return, but the
5500 code size isn't available without looking up the dot-sym.
5501 However, doing that would be a waste of time particularly
5502 since elf_find_function will look at the dot-sym anyway.
5503 Now, elf_find_function will keep the largest size of any
5504 function sym found at the code address of interest, so return
5505 1 here to avoid it incorrectly caching a larger function size
5506 for a small function. This does mean we return the wrong
5507 size for a new-ABI function of size 24, but all that does is
5508 disable caching for such functions. */
5509 if (size == 24)
5510 size = 1;
9f296da3 5511 }
aef36ac1
AM
5512 else
5513 {
5514 if (sym->section != sec)
5515 return 0;
5516 *code_off = sym->value;
5517 }
5518 if (size == 0)
5519 size = 1;
5520 return size;
9f296da3
AM
5521}
5522
f378ab09
AM
5523/* Return true if symbol is a strong function defined in an ELFv2
5524 object with st_other localentry bits of zero, ie. its local entry
5525 point coincides with its global entry point. */
5526
5527static bfd_boolean
5528is_elfv2_localentry0 (struct elf_link_hash_entry *h)
5529{
5530 return (h != NULL
5531 && h->type == STT_FUNC
5532 && h->root.type == bfd_link_hash_defined
5533 && (STO_PPC64_LOCAL_MASK & h->other) == 0
8b5f1ed8 5534 && !((struct ppc_link_hash_entry *) h)->non_zero_localentry
f378ab09
AM
5535 && is_ppc64_elf (h->root.u.def.section->owner)
5536 && abiversion (h->root.u.def.section->owner) >= 2);
5537}
5538
854b41e7
AM
5539/* Return true if symbol is defined in a regular object file. */
5540
5541static bfd_boolean
5542is_static_defined (struct elf_link_hash_entry *h)
5543{
5544 return ((h->root.type == bfd_link_hash_defined
5545 || h->root.type == bfd_link_hash_defweak)
5546 && h->root.u.def.section != NULL
5547 && h->root.u.def.section->output_section != NULL);
5548}
5549
b31867b6
AM
5550/* If FDH is a function descriptor symbol, return the associated code
5551 entry symbol if it is defined. Return NULL otherwise. */
5552
5553static struct ppc_link_hash_entry *
5554defined_code_entry (struct ppc_link_hash_entry *fdh)
5555{
5556 if (fdh->is_func_descriptor)
5557 {
5558 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
5559 if (fh->elf.root.type == bfd_link_hash_defined
5560 || fh->elf.root.type == bfd_link_hash_defweak)
5561 return fh;
5562 }
5563 return NULL;
5564}
5565
5566/* If FH is a function code entry symbol, return the associated
5567 function descriptor symbol if it is defined. Return NULL otherwise. */
5568
5569static struct ppc_link_hash_entry *
5570defined_func_desc (struct ppc_link_hash_entry *fh)
5571{
5572 if (fh->oh != NULL
5573 && fh->oh->is_func_descriptor)
5574 {
5575 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
5576 if (fdh->elf.root.type == bfd_link_hash_defined
5577 || fdh->elf.root.type == bfd_link_hash_defweak)
5578 return fdh;
5579 }
5580 return NULL;
5581}
5582
8c5b4e52
AM
5583static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
5584
5585/* Garbage collect sections, after first dealing with dot-symbols. */
5586
5587static bfd_boolean
5588ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
5589{
5590 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5591
5592 if (htab != NULL && htab->need_func_desc_adj)
5593 {
5594 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5595 htab->need_func_desc_adj = 0;
5596 }
5597 return bfd_elf_gc_sections (abfd, info);
5598}
5599
74f0fb50
AM
5600/* Mark all our entry sym sections, both opd and code section. */
5601
5602static void
5603ppc64_elf_gc_keep (struct bfd_link_info *info)
5604{
5605 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5606 struct bfd_sym_chain *sym;
5607
4dfe6ac6
NC
5608 if (htab == NULL)
5609 return;
5610
74f0fb50
AM
5611 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5612 {
b31867b6 5613 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
5614 asection *sec;
5615
5616 eh = (struct ppc_link_hash_entry *)
b31867b6 5617 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
74f0fb50
AM
5618 if (eh == NULL)
5619 continue;
5620 if (eh->elf.root.type != bfd_link_hash_defined
5621 && eh->elf.root.type != bfd_link_hash_defweak)
5622 continue;
5623
b31867b6
AM
5624 fh = defined_code_entry (eh);
5625 if (fh != NULL)
74f0fb50 5626 {
b31867b6 5627 sec = fh->elf.root.u.def.section;
74f0fb50
AM
5628 sec->flags |= SEC_KEEP;
5629 }
5630 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5631 && opd_entry_value (eh->elf.root.u.def.section,
5632 eh->elf.root.u.def.value,
aef36ac1 5633 &sec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50
AM
5634 sec->flags |= SEC_KEEP;
5635
5636 sec = eh->elf.root.u.def.section;
5637 sec->flags |= SEC_KEEP;
5638 }
5639}
5640
64d03ab5
AM
5641/* Mark sections containing dynamically referenced symbols. When
5642 building shared libraries, we must assume that any visible symbol is
5643 referenced. */
5644
5645static bfd_boolean
5646ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5647{
5648 struct bfd_link_info *info = (struct bfd_link_info *) inf;
5649 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
b31867b6 5650 struct ppc_link_hash_entry *fdh;
b407645f 5651 struct bfd_elf_dynamic_list *d = info->dynamic_list;
64d03ab5 5652
64d03ab5 5653 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
5654 fdh = defined_func_desc (eh);
5655 if (fdh != NULL)
5656 eh = fdh;
64d03ab5
AM
5657
5658 if ((eh->elf.root.type == bfd_link_hash_defined
5659 || eh->elf.root.type == bfd_link_hash_defweak)
87e79a65 5660 && ((eh->elf.ref_dynamic && !eh->elf.forced_local)
1c9177d9 5661 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
64d03ab5 5662 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8 5663 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
0e1862bb 5664 && (!bfd_link_executable (info)
e278ae05 5665 || info->gc_keep_exported
b407645f
AM
5666 || info->export_dynamic
5667 || (eh->elf.dynamic
5668 && d != NULL
2cdcc330
AM
5669 && (*d->match) (&d->head, NULL,
5670 eh->elf.root.root.string)))
e278ae05 5671 && (eh->elf.versioned >= versioned
4c58e0d8
AM
5672 || !bfd_hide_sym_by_version (info->version_info,
5673 eh->elf.root.root.string)))))
64d03ab5
AM
5674 {
5675 asection *code_sec;
b31867b6 5676 struct ppc_link_hash_entry *fh;
64d03ab5
AM
5677
5678 eh->elf.root.u.def.section->flags |= SEC_KEEP;
5679
5680 /* Function descriptor syms cause the associated
5681 function code sym section to be marked. */
b31867b6
AM
5682 fh = defined_code_entry (eh);
5683 if (fh != NULL)
5684 {
5685 code_sec = fh->elf.root.u.def.section;
5686 code_sec->flags |= SEC_KEEP;
5687 }
64d03ab5
AM
5688 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5689 && opd_entry_value (eh->elf.root.u.def.section,
5690 eh->elf.root.u.def.value,
aef36ac1 5691 &code_sec, NULL, FALSE) != (bfd_vma) -1)
64d03ab5
AM
5692 code_sec->flags |= SEC_KEEP;
5693 }
5694
5695 return TRUE;
5696}
5697
5bd4f169
AM
5698/* Return the section that should be marked against GC for a given
5699 relocation. */
5700
5701static asection *
4ce794b7 5702ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 5703 struct bfd_link_info *info,
4ce794b7
AM
5704 Elf_Internal_Rela *rel,
5705 struct elf_link_hash_entry *h,
5706 Elf_Internal_Sym *sym)
5bd4f169 5707{
ccfa59ea
AM
5708 asection *rsec;
5709
ccfa59ea
AM
5710 /* Syms return NULL if we're marking .opd, so we avoid marking all
5711 function sections, as all functions are referenced in .opd. */
5712 rsec = NULL;
5713 if (get_opd_info (sec) != NULL)
5714 return rsec;
1e2f5b6e 5715
5bd4f169
AM
5716 if (h != NULL)
5717 {
04c9666a 5718 enum elf_ppc64_reloc_type r_type;
b31867b6 5719 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 5720
4ce794b7 5721 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 5722 switch (r_type)
5bd4f169
AM
5723 {
5724 case R_PPC64_GNU_VTINHERIT:
5725 case R_PPC64_GNU_VTENTRY:
5726 break;
5727
5728 default:
5729 switch (h->root.type)
5730 {
5731 case bfd_link_hash_defined:
5732 case bfd_link_hash_defweak:
ccfa59ea 5733 eh = (struct ppc_link_hash_entry *) h;
b31867b6
AM
5734 fdh = defined_func_desc (eh);
5735 if (fdh != NULL)
8c5b4e52
AM
5736 {
5737 /* -mcall-aixdesc code references the dot-symbol on
5738 a call reloc. Mark the function descriptor too
5739 against garbage collection. */
5740 fdh->elf.mark = 1;
60d67dc8
AM
5741 if (fdh->elf.is_weakalias)
5742 weakdef (&fdh->elf)->mark = 1;
8c5b4e52
AM
5743 eh = fdh;
5744 }
1e2f5b6e
AM
5745
5746 /* Function descriptor syms cause the associated
5747 function code sym section to be marked. */
b31867b6
AM
5748 fh = defined_code_entry (eh);
5749 if (fh != NULL)
ccfa59ea
AM
5750 {
5751 /* They also mark their opd section. */
74f0fb50 5752 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5753
b31867b6 5754 rsec = fh->elf.root.u.def.section;
ccfa59ea 5755 }
8387904d
AM
5756 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5757 && opd_entry_value (eh->elf.root.u.def.section,
5758 eh->elf.root.u.def.value,
aef36ac1 5759 &rsec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50 5760 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 5761 else
1e2f5b6e
AM
5762 rsec = h->root.u.def.section;
5763 break;
5bd4f169
AM
5764
5765 case bfd_link_hash_common:
1e2f5b6e
AM
5766 rsec = h->root.u.c.p->section;
5767 break;
5bd4f169
AM
5768
5769 default:
fb34365b 5770 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
5771 }
5772 }
5773 }
5774 else
5775 {
74f0fb50 5776 struct _opd_sec_data *opd;
1e2f5b6e
AM
5777
5778 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
5779 opd = get_opd_info (rsec);
5780 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 5781 {
74f0fb50 5782 rsec->gc_mark = 1;
ccfa59ea 5783
51aecdc5 5784 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
ccfa59ea 5785 }
5bd4f169
AM
5786 }
5787
1e2f5b6e 5788 return rsec;
5bd4f169
AM
5789}
5790
deb0e272
AM
5791/* The maximum size of .sfpr. */
5792#define SFPR_MAX (218*4)
5793
5794struct sfpr_def_parms
5795{
699733f6
AM
5796 const char name[12];
5797 unsigned char lo, hi;
2cdcc330
AM
5798 bfd_byte *(*write_ent) (bfd *, bfd_byte *, int);
5799 bfd_byte *(*write_tail) (bfd *, bfd_byte *, int);
deb0e272
AM
5800};
5801
a4b6fadd
AM
5802/* Auto-generate _save*, _rest* functions in .sfpr.
5803 If STUB_SEC is non-null, define alias symbols in STUB_SEC
5804 instead. */
deb0e272 5805
4dfe6ac6 5806static bfd_boolean
a4b6fadd
AM
5807sfpr_define (struct bfd_link_info *info,
5808 const struct sfpr_def_parms *parm,
5809 asection *stub_sec)
deb0e272
AM
5810{
5811 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5812 unsigned int i;
5813 size_t len = strlen (parm->name);
5814 bfd_boolean writing = FALSE;
699733f6 5815 char sym[16];
deb0e272 5816
4dfe6ac6
NC
5817 if (htab == NULL)
5818 return FALSE;
5819
deb0e272
AM
5820 memcpy (sym, parm->name, len);
5821 sym[len + 2] = 0;
5822
5823 for (i = parm->lo; i <= parm->hi; i++)
5824 {
a4b6fadd 5825 struct ppc_link_hash_entry *h;
deb0e272
AM
5826
5827 sym[len + 0] = i / 10 + '0';
5828 sym[len + 1] = i % 10 + '0';
a4b6fadd 5829 h = (struct ppc_link_hash_entry *)
b32547cd 5830 elf_link_hash_lookup (&htab->elf, sym, writing, TRUE, TRUE);
a4b6fadd 5831 if (stub_sec != NULL)
deb0e272 5832 {
a4b6fadd
AM
5833 if (h != NULL
5834 && h->elf.root.type == bfd_link_hash_defined
5835 && h->elf.root.u.def.section == htab->sfpr)
5836 {
5837 struct elf_link_hash_entry *s;
5838 char buf[32];
5839 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
5840 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
5841 if (s == NULL)
5842 return FALSE;
779f2ae7 5843 if (s->root.type == bfd_link_hash_new)
a4b6fadd
AM
5844 {
5845 s->root.type = bfd_link_hash_defined;
5846 s->root.u.def.section = stub_sec;
7dda8d3c 5847 s->root.u.def.value = (stub_sec->size - htab->sfpr->size
a4b6fadd
AM
5848 + h->elf.root.u.def.value);
5849 s->ref_regular = 1;
5850 s->def_regular = 1;
5851 s->ref_regular_nonweak = 1;
5852 s->forced_local = 1;
5853 s->non_elf = 0;
5854 s->root.linker_def = 1;
5855 }
5856 }
5857 continue;
5858 }
5859 if (h != NULL)
5860 {
5861 h->save_res = 1;
5862 if (!h->elf.def_regular)
deb0e272 5863 {
a4b6fadd
AM
5864 h->elf.root.type = bfd_link_hash_defined;
5865 h->elf.root.u.def.section = htab->sfpr;
5866 h->elf.root.u.def.value = htab->sfpr->size;
5867 h->elf.type = STT_FUNC;
5868 h->elf.def_regular = 1;
b32547cd 5869 h->elf.non_elf = 0;
a4b6fadd
AM
5870 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
5871 writing = TRUE;
deb0e272 5872 if (htab->sfpr->contents == NULL)
a4b6fadd 5873 {
2cdcc330
AM
5874 htab->sfpr->contents
5875 = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
a4b6fadd
AM
5876 if (htab->sfpr->contents == NULL)
5877 return FALSE;
5878 }
deb0e272
AM
5879 }
5880 }
5881 if (writing)
5882 {
5883 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5884 if (i != parm->hi)
5885 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5886 else
5887 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5888 htab->sfpr->size = p - htab->sfpr->contents;
5889 }
5890 }
5891
5892 return TRUE;
5893}
5894
5895static bfd_byte *
5896savegpr0 (bfd *abfd, bfd_byte *p, int r)
5897{
5898 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5899 return p + 4;
5900}
5901
5902static bfd_byte *
5903savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5904{
5905 p = savegpr0 (abfd, p, r);
a078d95a 5906 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
5907 p = p + 4;
5908 bfd_put_32 (abfd, BLR, p);
5909 return p + 4;
5910}
5911
5912static bfd_byte *
5913restgpr0 (bfd *abfd, bfd_byte *p, int r)
5914{
5915 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5916 return p + 4;
5917}
5918
5919static bfd_byte *
5920restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5921{
a078d95a 5922 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
5923 p = p + 4;
5924 p = restgpr0 (abfd, p, r);
5925 bfd_put_32 (abfd, MTLR_R0, p);
5926 p = p + 4;
5927 if (r == 29)
5928 {
5929 p = restgpr0 (abfd, p, 30);
5930 p = restgpr0 (abfd, p, 31);
5931 }
5932 bfd_put_32 (abfd, BLR, p);
5933 return p + 4;
5934}
5935
5936static bfd_byte *
5937savegpr1 (bfd *abfd, bfd_byte *p, int r)
5938{
5939 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5940 return p + 4;
5941}
5942
5943static bfd_byte *
5944savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5945{
5946 p = savegpr1 (abfd, p, r);
5947 bfd_put_32 (abfd, BLR, p);
5948 return p + 4;
5949}
5950
5951static bfd_byte *
5952restgpr1 (bfd *abfd, bfd_byte *p, int r)
5953{
5954 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5955 return p + 4;
5956}
5957
5958static bfd_byte *
5959restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5960{
5961 p = restgpr1 (abfd, p, r);
5962 bfd_put_32 (abfd, BLR, p);
5963 return p + 4;
5964}
5965
5966static bfd_byte *
5967savefpr (bfd *abfd, bfd_byte *p, int r)
5968{
5969 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5970 return p + 4;
5971}
5972
5973static bfd_byte *
5974savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
5975{
5976 p = savefpr (abfd, p, r);
a078d95a 5977 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
5978 p = p + 4;
5979 bfd_put_32 (abfd, BLR, p);
5980 return p + 4;
5981}
5982
5983static bfd_byte *
5984restfpr (bfd *abfd, bfd_byte *p, int r)
5985{
5986 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5987 return p + 4;
5988}
5989
5990static bfd_byte *
5991restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
5992{
a078d95a 5993 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
5994 p = p + 4;
5995 p = restfpr (abfd, p, r);
5996 bfd_put_32 (abfd, MTLR_R0, p);
5997 p = p + 4;
5998 if (r == 29)
5999 {
6000 p = restfpr (abfd, p, 30);
6001 p = restfpr (abfd, p, 31);
6002 }
6003 bfd_put_32 (abfd, BLR, p);
6004 return p + 4;
6005}
6006
6007static bfd_byte *
6008savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6009{
6010 p = savefpr (abfd, p, r);
6011 bfd_put_32 (abfd, BLR, p);
6012 return p + 4;
6013}
6014
6015static bfd_byte *
6016restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6017{
6018 p = restfpr (abfd, p, r);
6019 bfd_put_32 (abfd, BLR, p);
6020 return p + 4;
6021}
6022
6023static bfd_byte *
6024savevr (bfd *abfd, bfd_byte *p, int r)
6025{
6026 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6027 p = p + 4;
6028 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6029 return p + 4;
6030}
6031
6032static bfd_byte *
6033savevr_tail (bfd *abfd, bfd_byte *p, int r)
6034{
6035 p = savevr (abfd, p, r);
6036 bfd_put_32 (abfd, BLR, p);
6037 return p + 4;
6038}
6039
6040static bfd_byte *
6041restvr (bfd *abfd, bfd_byte *p, int r)
6042{
6043 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6044 p = p + 4;
6045 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6046 return p + 4;
6047}
6048
6049static bfd_byte *
6050restvr_tail (bfd *abfd, bfd_byte *p, int r)
6051{
6052 p = restvr (abfd, p, r);
6053 bfd_put_32 (abfd, BLR, p);
6054 return p + 4;
6055}
6056
e86ce104
AM
6057/* Called via elf_link_hash_traverse to transfer dynamic linking
6058 information on function code symbol entries to their corresponding
6059 function descriptor symbol entries. */
deb0e272 6060
b34976b6 6061static bfd_boolean
4ce794b7 6062func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6063{
e86ce104 6064 struct bfd_link_info *info;
65f38f15 6065 struct ppc_link_hash_table *htab;
50bc7936
AM
6066 struct ppc_link_hash_entry *fh;
6067 struct ppc_link_hash_entry *fdh;
6068 bfd_boolean force_local;
5bd4f169 6069
50bc7936
AM
6070 fh = (struct ppc_link_hash_entry *) h;
6071 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 6072 return TRUE;
e86ce104 6073
8c5b4e52
AM
6074 if (!fh->is_func)
6075 return TRUE;
6076
6077 if (fh->elf.root.root.string[0] != '.'
6078 || fh->elf.root.root.string[1] == '\0')
6079 return TRUE;
6080
4ce794b7 6081 info = inf;
65f38f15 6082 htab = ppc_hash_table (info);
4dfe6ac6
NC
6083 if (htab == NULL)
6084 return FALSE;
5bd4f169 6085
8c5b4e52
AM
6086 /* Find the corresponding function descriptor symbol. */
6087 fdh = lookup_fdh (fh, htab);
6088
c09bdfe5
AM
6089 /* Resolve undefined references to dot-symbols as the value
6090 in the function descriptor, if we have one in a regular object.
6091 This is to satisfy cases like ".quad .foo". Calls to functions
6092 in dynamic objects are handled elsewhere. */
8c5b4e52
AM
6093 if ((fh->elf.root.type == bfd_link_hash_undefined
6094 || fh->elf.root.type == bfd_link_hash_undefweak)
6095 && (fdh->elf.root.type == bfd_link_hash_defined
6096 || fdh->elf.root.type == bfd_link_hash_defweak)
b31867b6
AM
6097 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6098 && opd_entry_value (fdh->elf.root.u.def.section,
6099 fdh->elf.root.u.def.value,
c09bdfe5 6100 &fh->elf.root.u.def.section,
aef36ac1 6101 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
c09bdfe5 6102 {
b31867b6 6103 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 6104 fh->elf.forced_local = 1;
b31867b6
AM
6105 fh->elf.def_regular = fdh->elf.def_regular;
6106 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
6107 }
6108
8c5b4e52
AM
6109 if (!fh->elf.dynamic)
6110 {
6111 struct plt_entry *ent;
5bd4f169 6112
8c5b4e52
AM
6113 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6114 if (ent->plt.refcount > 0)
6115 break;
6116 if (ent == NULL)
6117 return TRUE;
6118 }
5bd4f169 6119
8c5b4e52 6120 /* Create a descriptor as undefined if necessary. */
50bc7936 6121 if (fdh == NULL
0e1862bb 6122 && !bfd_link_executable (info)
50bc7936
AM
6123 && (fh->elf.root.type == bfd_link_hash_undefined
6124 || fh->elf.root.type == bfd_link_hash_undefweak))
6125 {
908b32fc 6126 fdh = make_fdh (info, fh);
bb700d78
AM
6127 if (fdh == NULL)
6128 return FALSE;
50bc7936 6129 }
648cca2c 6130
8c5b4e52 6131 /* We can't support overriding of symbols on a fake descriptor. */
908b32fc
AM
6132 if (fdh != NULL
6133 && fdh->fake
8c5b4e52
AM
6134 && (fh->elf.root.type == bfd_link_hash_defined
6135 || fh->elf.root.type == bfd_link_hash_defweak))
6136 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
908b32fc 6137
8c5b4e52
AM
6138 /* Transfer dynamic linking information to the function descriptor. */
6139 if (fdh != NULL)
6140 {
f5385ebf
AM
6141 fdh->elf.ref_regular |= fh->elf.ref_regular;
6142 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6143 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6144 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
8c5b4e52
AM
6145 fdh->elf.dynamic |= fh->elf.dynamic;
6146 fdh->elf.needs_plt |= (fh->elf.needs_plt
6147 || fh->elf.type == STT_FUNC
6148 || fh->elf.type == STT_GNU_IFUNC);
6149 move_plt_plist (fh, fdh);
6150
6151 if (!fdh->elf.forced_local
6152 && fh->elf.dynindx != -1)
6153 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6154 return FALSE;
e86ce104
AM
6155 }
6156
50bc7936
AM
6157 /* Now that the info is on the function descriptor, clear the
6158 function code sym info. Any function code syms for which we
6159 don't have a definition in a regular file, we force local.
6160 This prevents a shared library from exporting syms that have
6161 been imported from another library. Function code syms that
6162 are really in the library we must leave global to prevent the
6163 linker dragging in a definition from a static library. */
93f3fa99
AM
6164 force_local = (!fh->elf.def_regular
6165 || fdh == NULL
6166 || !fdh->elf.def_regular
6167 || fdh->elf.forced_local);
50bc7936
AM
6168 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6169
b34976b6 6170 return TRUE;
e86ce104 6171}
40b8271b 6172
a4b6fadd
AM
6173static const struct sfpr_def_parms save_res_funcs[] =
6174 {
6175 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6176 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6177 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6178 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6179 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6180 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6181 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6182 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6183 { "._savef", 14, 31, savefpr, savefpr1_tail },
6184 { "._restf", 14, 31, restfpr, restfpr1_tail },
6185 { "_savevr_", 20, 31, savevr, savevr_tail },
6186 { "_restvr_", 20, 31, restvr, restvr_tail }
6187 };
6188
e86ce104 6189/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
6190 this hook to a) provide some gcc support functions, and b) transfer
6191 dynamic linking information gathered so far on function code symbol
6192 entries, to their corresponding function descriptor symbol entries. */
deb0e272 6193
b34976b6 6194static bfd_boolean
4ce794b7
AM
6195ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6196 struct bfd_link_info *info)
e86ce104
AM
6197{
6198 struct ppc_link_hash_table *htab;
6199
6200 htab = ppc_hash_table (info);
4dfe6ac6
NC
6201 if (htab == NULL)
6202 return FALSE;
6203
b32547cd
AM
6204 /* Provide any missing _save* and _rest* functions. */
6205 if (htab->sfpr != NULL)
6206 {
6207 unsigned int i;
6208
6209 htab->sfpr->size = 0;
6210 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
6211 if (!sfpr_define (info, &save_res_funcs[i], NULL))
6212 return FALSE;
6213 if (htab->sfpr->size == 0)
6214 htab->sfpr->flags |= SEC_EXCLUDE;
6215 }
6216
6217 if (bfd_link_relocatable (info))
6218 return TRUE;
6219
6220 if (htab->elf.hgot != NULL)
dba6fa9b
AM
6221 {
6222 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
6223 /* Make .TOC. defined so as to prevent it being made dynamic.
6224 The wrong value here is fixed later in ppc64_elf_set_toc. */
43417696
AM
6225 if (!htab->elf.hgot->def_regular
6226 || htab->elf.hgot->root.type != bfd_link_hash_defined)
6227 {
6228 htab->elf.hgot->root.type = bfd_link_hash_defined;
6229 htab->elf.hgot->root.u.def.value = 0;
6230 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
6231 htab->elf.hgot->def_regular = 1;
6232 htab->elf.hgot->root.linker_def = 1;
6233 }
dba6fa9b 6234 htab->elf.hgot->type = STT_OBJECT;
2cdcc330
AM
6235 htab->elf.hgot->other
6236 = (htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
dba6fa9b 6237 }
c66bb0ee 6238
8c5b4e52
AM
6239 if (htab->need_func_desc_adj)
6240 {
6241 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6242 htab->need_func_desc_adj = 0;
6243 }
805fc799 6244
b34976b6 6245 return TRUE;
e86ce104
AM
6246}
6247
98bbb1b8 6248/* Find dynamic relocs for H that apply to read-only sections. */
a345bc8d 6249
98bbb1b8 6250static asection *
a345bc8d
AM
6251readonly_dynrelocs (struct elf_link_hash_entry *h)
6252{
6253 struct ppc_link_hash_entry *eh;
6254 struct elf_dyn_relocs *p;
6255
6256 eh = (struct ppc_link_hash_entry *) h;
6257 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6258 {
6259 asection *s = p->sec->output_section;
6260
6261 if (s != NULL && (s->flags & SEC_READONLY) != 0)
98bbb1b8 6262 return p->sec;
a345bc8d 6263 }
98bbb1b8 6264 return NULL;
a345bc8d
AM
6265}
6266
d311bc8b 6267/* Return true if we have dynamic relocs against H or any of its weak
ab2477e1
AM
6268 aliases, that apply to read-only sections. Cannot be used after
6269 size_dynamic_sections. */
d311bc8b
AM
6270
6271static bfd_boolean
6272alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
6273{
6274 struct ppc_link_hash_entry *eh;
6275
6276 eh = (struct ppc_link_hash_entry *) h;
6277 do
6278 {
6279 if (readonly_dynrelocs (&eh->elf))
6280 return TRUE;
ab2477e1 6281 eh = (struct ppc_link_hash_entry *) eh->elf.u.alias;
2cdcc330
AM
6282 }
6283 while (eh != NULL && &eh->elf != h);
d311bc8b
AM
6284
6285 return FALSE;
6286}
8a2058b5 6287
8a9e8e72
AM
6288/* Return whether EH has pc-relative dynamic relocs. */
6289
6290static bfd_boolean
6291pc_dynrelocs (struct ppc_link_hash_entry *eh)
6292{
6293 struct elf_dyn_relocs *p;
6294
6295 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6296 if (p->pc_count != 0)
6297 return TRUE;
6298 return FALSE;
6299}
6300
8a2058b5
AM
6301/* Return true if a global entry stub will be created for H. Valid
6302 for ELFv2 before plt entries have been allocated. */
6303
6304static bfd_boolean
6305global_entry_stub (struct elf_link_hash_entry *h)
6306{
6307 struct plt_entry *pent;
6308
6309 if (!h->pointer_equality_needed
6310 || h->def_regular)
6311 return FALSE;
6312
6313 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
6314 if (pent->plt.refcount > 0
6315 && pent->addend == 0)
6316 return TRUE;
6317
6318 return FALSE;
6319}
6320
e86ce104
AM
6321/* Adjust a symbol defined by a dynamic object and referenced by a
6322 regular object. The current definition is in some section of the
6323 dynamic object, but we're not including those sections. We have to
6324 change the definition to something the rest of the link can
6325 understand. */
6326
b34976b6 6327static bfd_boolean
4ce794b7
AM
6328ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6329 struct elf_link_hash_entry *h)
e86ce104
AM
6330{
6331 struct ppc_link_hash_table *htab;
5474d94f 6332 asection *s, *srel;
e86ce104
AM
6333
6334 htab = ppc_hash_table (info);
4dfe6ac6
NC
6335 if (htab == NULL)
6336 return FALSE;
e86ce104
AM
6337
6338 /* Deal with function syms. */
6339 if (h->type == STT_FUNC
e054468f 6340 || h->type == STT_GNU_IFUNC
f5385ebf 6341 || h->needs_plt)
e86ce104 6342 {
529fe20e
AM
6343 bfd_boolean local = (((struct ppc_link_hash_entry *) h)->save_res
6344 || SYMBOL_CALLS_LOCAL (info, h)
6345 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
6346 /* Discard dyn_relocs when non-pic if we've decided that a
6347 function symbol is local and not an ifunc. We keep dynamic
6348 relocs for ifuncs when local rather than always emitting a
6349 plt call stub for them and defining the symbol on the call
6350 stub. We can't do that for ELFv1 anyway (a function symbol
6351 is defined on a descriptor, not code) and it can be faster at
6352 run-time due to not needing to bounce through a stub. The
6353 dyn_relocs for ifuncs will be applied even in a static
6354 executable. */
6355 if (!bfd_link_pic (info)
6356 && h->type != STT_GNU_IFUNC
6357 && local)
6358 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
6359
e86ce104
AM
6360 /* Clear procedure linkage table information for any symbol that
6361 won't need a .plt entry. */
411e1bfb
AM
6362 struct plt_entry *ent;
6363 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6364 if (ent->plt.refcount > 0)
6365 break;
8387904d 6366 if (ent == NULL
2d7ad24e
AM
6367 || (h->type != STT_GNU_IFUNC
6368 && local
3e04d765
AM
6369 && (htab->can_convert_all_inline_plt
6370 || (((struct ppc_link_hash_entry *) h)->tls_mask
6371 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
40b8271b 6372 {
411e1bfb 6373 h->plt.plist = NULL;
f5385ebf 6374 h->needs_plt = 0;
d1eca1e4 6375 h->pointer_equality_needed = 0;
40b8271b 6376 }
8a2058b5 6377 else if (abiversion (info->output_bfd) >= 2)
a345bc8d 6378 {
d1eca1e4
AM
6379 /* Taking a function's address in a read/write section
6380 doesn't require us to define the function symbol in the
6381 executable on a global entry stub. A dynamic reloc can
8a2058b5
AM
6382 be used instead. The reason we prefer a few more dynamic
6383 relocs is that calling via a global entry stub costs a
6384 few more instructions, and pointer_equality_needed causes
6385 extra work in ld.so when resolving these symbols. */
529fe20e 6386 if (global_entry_stub (h))
d1eca1e4 6387 {
ab2477e1 6388 if (!readonly_dynrelocs (h))
529fe20e
AM
6389 {
6390 h->pointer_equality_needed = 0;
04383fd1
AM
6391 /* If we haven't seen a branch reloc and the symbol
6392 isn't an ifunc then we don't need a plt entry. */
529fe20e
AM
6393 if (!h->needs_plt)
6394 h->plt.plist = NULL;
6395 }
6396 else if (!bfd_link_pic (info))
6397 /* We are going to be defining the function symbol on the
6398 plt stub, so no dyn_relocs needed when non-pic. */
6399 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
d1eca1e4
AM
6400 }
6401
3988aed5
AM
6402 /* ELFv2 function symbols can't have copy relocs. */
6403 return TRUE;
6404 }
6405 else if (!h->needs_plt
ab2477e1 6406 && !readonly_dynrelocs (h))
3988aed5 6407 {
04383fd1
AM
6408 /* If we haven't seen a branch reloc and the symbol isn't an
6409 ifunc then we don't need a plt entry. */
3988aed5
AM
6410 h->plt.plist = NULL;
6411 h->pointer_equality_needed = 0;
a345bc8d
AM
6412 return TRUE;
6413 }
5bd4f169 6414 }
bbd7ec4a 6415 else
411e1bfb 6416 h->plt.plist = NULL;
5bd4f169
AM
6417
6418 /* If this is a weak symbol, and there is a real definition, the
6419 processor independent code will have arranged for us to see the
6420 real definition first, and we can just use the same value. */
60d67dc8 6421 if (h->is_weakalias)
5bd4f169 6422 {
60d67dc8
AM
6423 struct elf_link_hash_entry *def = weakdef (h);
6424 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
6425 h->root.u.def.section = def->root.u.def.section;
6426 h->root.u.def.value = def->root.u.def.value;
4a7e5234
AM
6427 if (def->root.u.def.section == htab->elf.sdynbss
6428 || def->root.u.def.section == htab->elf.sdynrelro)
6429 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
b34976b6 6430 return TRUE;
5bd4f169
AM
6431 }
6432
5bd4f169
AM
6433 /* If we are creating a shared library, we must presume that the
6434 only references to the symbol are via the global offset table.
6435 For such cases we need not do anything here; the relocations will
6436 be handled correctly by relocate_section. */
ec73ddcd 6437 if (!bfd_link_executable (info))
b34976b6 6438 return TRUE;
5bd4f169 6439
65f38f15
AM
6440 /* If there are no references to this symbol that do not use the
6441 GOT, we don't need to generate a copy reloc. */
f5385ebf 6442 if (!h->non_got_ref)
b34976b6 6443 return TRUE;
65f38f15 6444
b186458a 6445 /* Don't generate a copy reloc for symbols defined in the executable. */
d93d1c80 6446 if (!h->def_dynamic || !h->ref_regular || h->def_regular
b186458a 6447
d93d1c80
AM
6448 /* If -z nocopyreloc was given, don't generate them either. */
6449 || info->nocopyreloc
a127494f 6450
dce2246a 6451 /* If we don't find any dynamic relocs in read-only sections, then
d93d1c80 6452 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1bdd8fac
AM
6453 || (ELIMINATE_COPY_RELOCS
6454 && !h->needs_copy
6455 && !alias_readonly_dynrelocs (h))
65f38f15 6456
d93d1c80
AM
6457 /* Protected variables do not work with .dynbss. The copy in
6458 .dynbss won't be used by the shared library with the protected
6459 definition for the variable. Text relocations are preferable
6460 to an incorrect program. */
6461 || h->protected_def)
529fe20e 6462 return TRUE;
a127494f 6463
5d35169e 6464 if (h->plt.plist != NULL)
97b639ba
AM
6465 {
6466 /* We should never get here, but unfortunately there are versions
6467 of gcc out there that improperly (for this ABI) put initialized
6468 function pointers, vtable refs and suchlike in read-only
6469 sections. Allow them to proceed, but warn that this might
6470 break at runtime. */
25f53a85 6471 info->callbacks->einfo
c1c8c1ef 6472 (_("%P: copy reloc against `%pT' requires lazy plt linking; "
25f53a85 6473 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
6474 h->root.root.string);
6475 }
5d35169e
AM
6476
6477 /* This is a reference to a symbol defined by a dynamic object which
6478 is not a function. */
6479
5bd4f169
AM
6480 /* We must allocate the symbol in our .dynbss section, which will
6481 become part of the .bss section of the executable. There will be
6482 an entry for this symbol in the .dynsym section. The dynamic
6483 object will contain position independent code, so all references
6484 from the dynamic object to this symbol will go through the global
6485 offset table. The dynamic linker will use the .dynsym entry to
6486 determine the address it must put in the global offset table, so
6487 both the dynamic object and the regular object will refer to the
6488 same memory location for the variable. */
5474d94f
AM
6489 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6490 {
6491 s = htab->elf.sdynrelro;
6492 srel = htab->elf.sreldynrelro;
6493 }
6494 else
6495 {
6496 s = htab->elf.sdynbss;
6497 srel = htab->elf.srelbss;
6498 }
1d7e9d18 6499 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 6500 {
4a7e5234
AM
6501 /* We must generate a R_PPC64_COPY reloc to tell the dynamic
6502 linker to copy the initial value out of the dynamic object
6503 and into the runtime process image. */
5474d94f 6504 srel->size += sizeof (Elf64_External_Rela);
f5385ebf 6505 h->needs_copy = 1;
5bd4f169
AM
6506 }
6507
529fe20e
AM
6508 /* We no longer want dyn_relocs. */
6509 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
6cabe1ea 6510 return _bfd_elf_adjust_dynamic_copy (info, h, s);
5bd4f169
AM
6511}
6512
e86ce104
AM
6513/* If given a function descriptor symbol, hide both the function code
6514 sym and the descriptor. */
6515static void
4ce794b7
AM
6516ppc64_elf_hide_symbol (struct bfd_link_info *info,
6517 struct elf_link_hash_entry *h,
6518 bfd_boolean force_local)
e86ce104 6519{
34814b9f 6520 struct ppc_link_hash_entry *eh;
e86ce104
AM
6521 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6522
87469ba2
AM
6523 if (ppc_hash_table (info) == NULL)
6524 return;
6525
34814b9f
AM
6526 eh = (struct ppc_link_hash_entry *) h;
6527 if (eh->is_func_descriptor)
e86ce104 6528 {
34814b9f 6529 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 6530
721956f4 6531 if (fh == NULL)
d1329ca3
AM
6532 {
6533 const char *p, *q;
b8ac2841 6534 struct elf_link_hash_table *htab = elf_hash_table (info);
d1329ca3
AM
6535 char save;
6536
6537 /* We aren't supposed to use alloca in BFD because on
6538 systems which do not have alloca the version in libiberty
6539 calls xmalloc, which might cause the program to crash
6540 when it runs out of memory. This function doesn't have a
6541 return status, so there's no way to gracefully return an
6542 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
6543 accessed; It's either a string in an ELF string table,
6544 or allocated in an objalloc structure. */
d1329ca3 6545
34814b9f 6546 p = eh->elf.root.root.string - 1;
d1329ca3
AM
6547 save = *p;
6548 *(char *) p = '.';
34814b9f 6549 fh = (struct ppc_link_hash_entry *)
b8ac2841 6550 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
d1329ca3
AM
6551 *(char *) p = save;
6552
6553 /* Unfortunately, if it so happens that the string we were
6554 looking for was allocated immediately before this string,
6555 then we overwrote the string terminator. That's the only
6556 reason the lookup should fail. */
6557 if (fh == NULL)
6558 {
34814b9f
AM
6559 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6560 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 6561 --q, --p;
34814b9f
AM
6562 if (q < eh->elf.root.root.string && *p == '.')
6563 fh = (struct ppc_link_hash_entry *)
b8ac2841 6564 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
d1329ca3
AM
6565 }
6566 if (fh != NULL)
6567 {
34814b9f
AM
6568 eh->oh = fh;
6569 fh->oh = eh;
d1329ca3
AM
6570 }
6571 }
e86ce104 6572 if (fh != NULL)
34814b9f 6573 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
6574 }
6575}
6576
411e1bfb 6577static bfd_boolean
8843416a
AM
6578get_sym_h (struct elf_link_hash_entry **hp,
6579 Elf_Internal_Sym **symp,
6580 asection **symsecp,
f961d9dd 6581 unsigned char **tls_maskp,
8843416a
AM
6582 Elf_Internal_Sym **locsymsp,
6583 unsigned long r_symndx,
6584 bfd *ibfd)
411e1bfb 6585{
0ffa91dd 6586 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
6587
6588 if (r_symndx >= symtab_hdr->sh_info)
6589 {
6590 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6591 struct elf_link_hash_entry *h;
6592
6593 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 6594 h = elf_follow_link (h);
411e1bfb
AM
6595
6596 if (hp != NULL)
6597 *hp = h;
6598
6599 if (symp != NULL)
6600 *symp = NULL;
6601
6602 if (symsecp != NULL)
6603 {
6604 asection *symsec = NULL;
6605 if (h->root.type == bfd_link_hash_defined
6606 || h->root.type == bfd_link_hash_defweak)
6607 symsec = h->root.u.def.section;
6608 *symsecp = symsec;
6609 }
6610
e7b938ca 6611 if (tls_maskp != NULL)
411e1bfb
AM
6612 {
6613 struct ppc_link_hash_entry *eh;
6614
6615 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 6616 *tls_maskp = &eh->tls_mask;
411e1bfb
AM
6617 }
6618 }
6619 else
6620 {
6621 Elf_Internal_Sym *sym;
6622 Elf_Internal_Sym *locsyms = *locsymsp;
6623
6624 if (locsyms == NULL)
6625 {
6626 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6627 if (locsyms == NULL)
6628 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6629 symtab_hdr->sh_info,
6630 0, NULL, NULL, NULL);
6631 if (locsyms == NULL)
6632 return FALSE;
6633 *locsymsp = locsyms;
6634 }
6635 sym = locsyms + r_symndx;
6636
6637 if (hp != NULL)
6638 *hp = NULL;
6639
6640 if (symp != NULL)
6641 *symp = sym;
6642
6643 if (symsecp != NULL)
cb33740c 6644 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 6645
e7b938ca 6646 if (tls_maskp != NULL)
411e1bfb
AM
6647 {
6648 struct got_entry **lgot_ents;
f961d9dd 6649 unsigned char *tls_mask;
411e1bfb 6650
e7b938ca 6651 tls_mask = NULL;
411e1bfb
AM
6652 lgot_ents = elf_local_got_ents (ibfd);
6653 if (lgot_ents != NULL)
6654 {
e054468f
AM
6655 struct plt_entry **local_plt = (struct plt_entry **)
6656 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 6657 unsigned char *lgot_masks = (unsigned char *)
e054468f 6658 (local_plt + symtab_hdr->sh_info);
e7b938ca 6659 tls_mask = &lgot_masks[r_symndx];
411e1bfb 6660 }
e7b938ca 6661 *tls_maskp = tls_mask;
411e1bfb
AM
6662 }
6663 }
6664 return TRUE;
6665}
6666
e7b938ca 6667/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 6668 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 6669 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
6670
6671static int
f961d9dd 6672get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
6673 unsigned long *toc_symndx,
6674 bfd_vma *toc_addend,
0d4792f7 6675 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
6676 const Elf_Internal_Rela *rel,
6677 bfd *ibfd)
411e1bfb
AM
6678{
6679 unsigned long r_symndx;
0d4792f7 6680 int next_r;
411e1bfb
AM
6681 struct elf_link_hash_entry *h;
6682 Elf_Internal_Sym *sym;
6683 asection *sec;
6684 bfd_vma off;
6685
6686 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 6687 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 6688 return 0;
411e1bfb 6689
37da22e5
AM
6690 if ((*tls_maskp != NULL
6691 && (**tls_maskp & TLS_TLS) != 0
6692 && **tls_maskp != (TLS_TLS | TLS_MARK))
411e1bfb 6693 || sec == NULL
6bee8834 6694 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 6695 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 6696 return 1;
411e1bfb
AM
6697
6698 /* Look inside a TOC section too. */
6699 if (h != NULL)
6700 {
6701 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
6702 off = h->root.u.def.value;
6703 }
6704 else
6705 off = sym->st_value;
6706 off += rel->r_addend;
6707 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
6708 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
6709 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
6710 if (toc_symndx != NULL)
6711 *toc_symndx = r_symndx;
3a71aa26
AM
6712 if (toc_addend != NULL)
6713 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
6714 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6715 return 0;
854b41e7 6716 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
6717 && (next_r == -1 || next_r == -2))
6718 return 1 - next_r;
951fd09b 6719 return 1;
411e1bfb
AM
6720}
6721
3b421ab3
AM
6722/* Find (or create) an entry in the tocsave hash table. */
6723
6724static struct tocsave_entry *
6725tocsave_find (struct ppc_link_hash_table *htab,
6726 enum insert_option insert,
6727 Elf_Internal_Sym **local_syms,
6728 const Elf_Internal_Rela *irela,
6729 bfd *ibfd)
6730{
6731 unsigned long r_indx;
6732 struct elf_link_hash_entry *h;
6733 Elf_Internal_Sym *sym;
6734 struct tocsave_entry ent, *p;
6735 hashval_t hash;
6736 struct tocsave_entry **slot;
6737
6738 r_indx = ELF64_R_SYM (irela->r_info);
6739 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
6740 return NULL;
6741 if (ent.sec == NULL || ent.sec->output_section == NULL)
6742 {
4eca0228 6743 _bfd_error_handler
871b3ab2 6744 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
3b421ab3
AM
6745 return NULL;
6746 }
6747
6748 if (h != NULL)
6749 ent.offset = h->root.u.def.value;
6750 else
6751 ent.offset = sym->st_value;
6752 ent.offset += irela->r_addend;
6753
6754 hash = tocsave_htab_hash (&ent);
6755 slot = ((struct tocsave_entry **)
6756 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
6757 if (slot == NULL)
6758 return NULL;
6759
6760 if (*slot == NULL)
6761 {
6762 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
6763 if (p == NULL)
6764 return NULL;
6765 *p = ent;
6766 *slot = p;
6767 }
6768 return *slot;
6769}
6770
754021d0 6771/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 6772 code for the old ABI, these will already have been done. */
754021d0
AM
6773
6774static bfd_boolean
6775adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
6776{
6777 struct ppc_link_hash_entry *eh;
6778 asection *sym_sec;
74f0fb50 6779 struct _opd_sec_data *opd;
754021d0
AM
6780
6781 if (h->root.type == bfd_link_hash_indirect)
6782 return TRUE;
6783
754021d0
AM
6784 if (h->root.type != bfd_link_hash_defined
6785 && h->root.type != bfd_link_hash_defweak)
6786 return TRUE;
6787
6788 eh = (struct ppc_link_hash_entry *) h;
6789 if (eh->adjust_done)
6790 return TRUE;
6791
6792 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
6793 opd = get_opd_info (sym_sec);
6794 if (opd != NULL && opd->adjust != NULL)
754021d0 6795 {
51aecdc5 6796 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
4025353c
AM
6797 if (adjust == -1)
6798 {
6799 /* This entry has been deleted. */
b3fac117 6800 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
6801 if (dsec == NULL)
6802 {
6803 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 6804 if (discarded_section (dsec))
81688140 6805 {
b3fac117 6806 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
6807 break;
6808 }
6809 }
4025353c 6810 eh->elf.root.u.def.value = 0;
81688140 6811 eh->elf.root.u.def.section = dsec;
4025353c
AM
6812 }
6813 else
6814 eh->elf.root.u.def.value += adjust;
754021d0
AM
6815 eh->adjust_done = 1;
6816 }
6817 return TRUE;
6818}
6819
8c1d1bb8 6820/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 6821 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
6822 have already been determined. */
6823
6824static bfd_boolean
6825dec_dynrel_count (bfd_vma r_info,
6826 asection *sec,
6827 struct bfd_link_info *info,
6828 Elf_Internal_Sym **local_syms,
6829 struct elf_link_hash_entry *h,
19e08130 6830 Elf_Internal_Sym *sym)
8c1d1bb8
AM
6831{
6832 enum elf_ppc64_reloc_type r_type;
19e08130 6833 asection *sym_sec = NULL;
8c1d1bb8
AM
6834
6835 /* Can this reloc be dynamic? This switch, and later tests here
6836 should be kept in sync with the code in check_relocs. */
6837 r_type = ELF64_R_TYPE (r_info);
6838 switch (r_type)
6839 {
6840 default:
6841 return TRUE;
6842
1bdd8fac
AM
6843 case R_PPC64_TOC16:
6844 case R_PPC64_TOC16_DS:
6845 case R_PPC64_TOC16_LO:
6846 case R_PPC64_TOC16_HI:
6847 case R_PPC64_TOC16_HA:
6848 case R_PPC64_TOC16_LO_DS:
6849 if (h == NULL)
6850 return TRUE;
6851 break;
6852
8c1d1bb8
AM
6853 case R_PPC64_TPREL16:
6854 case R_PPC64_TPREL16_LO:
6855 case R_PPC64_TPREL16_HI:
6856 case R_PPC64_TPREL16_HA:
6857 case R_PPC64_TPREL16_DS:
6858 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
6859 case R_PPC64_TPREL16_HIGH:
6860 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
6861 case R_PPC64_TPREL16_HIGHER:
6862 case R_PPC64_TPREL16_HIGHERA:
6863 case R_PPC64_TPREL16_HIGHEST:
6864 case R_PPC64_TPREL16_HIGHESTA:
8c1d1bb8 6865 case R_PPC64_TPREL64:
c213164a 6866 case R_PPC64_TPREL34:
8c1d1bb8
AM
6867 case R_PPC64_DTPMOD64:
6868 case R_PPC64_DTPREL64:
6869 case R_PPC64_ADDR64:
6870 case R_PPC64_REL30:
6871 case R_PPC64_REL32:
6872 case R_PPC64_REL64:
6873 case R_PPC64_ADDR14:
6874 case R_PPC64_ADDR14_BRNTAKEN:
6875 case R_PPC64_ADDR14_BRTAKEN:
6876 case R_PPC64_ADDR16:
6877 case R_PPC64_ADDR16_DS:
6878 case R_PPC64_ADDR16_HA:
6879 case R_PPC64_ADDR16_HI:
f9c6b907
AM
6880 case R_PPC64_ADDR16_HIGH:
6881 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
6882 case R_PPC64_ADDR16_HIGHER:
6883 case R_PPC64_ADDR16_HIGHERA:
6884 case R_PPC64_ADDR16_HIGHEST:
6885 case R_PPC64_ADDR16_HIGHESTA:
6886 case R_PPC64_ADDR16_LO:
6887 case R_PPC64_ADDR16_LO_DS:
6888 case R_PPC64_ADDR24:
6889 case R_PPC64_ADDR32:
6890 case R_PPC64_UADDR16:
6891 case R_PPC64_UADDR32:
6892 case R_PPC64_UADDR64:
6893 case R_PPC64_TOC:
5663e321
AM
6894 case R_PPC64_D34:
6895 case R_PPC64_D34_LO:
6896 case R_PPC64_D34_HI30:
6897 case R_PPC64_D34_HA30:
6898 case R_PPC64_ADDR16_HIGHER34:
6899 case R_PPC64_ADDR16_HIGHERA34:
6900 case R_PPC64_ADDR16_HIGHEST34:
6901 case R_PPC64_ADDR16_HIGHESTA34:
6902 case R_PPC64_D28:
8c1d1bb8
AM
6903 break;
6904 }
6905
6906 if (local_syms != NULL)
6907 {
6908 unsigned long r_symndx;
8c1d1bb8
AM
6909 bfd *ibfd = sec->owner;
6910
6911 r_symndx = ELF64_R_SYM (r_info);
6912 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
6913 return FALSE;
6914 }
6915
ec73ddcd
AM
6916 if ((h != NULL
6917 && (h->root.type == bfd_link_hash_defweak
6918 || !h->def_regular))
6919 || (h != NULL
6920 && !bfd_link_executable (info)
6921 && !SYMBOLIC_BIND (info, h))
6922 || (bfd_link_pic (info)
6923 && must_be_dyn_reloc (info, r_type))
6924 || (!bfd_link_pic (info)
6925 && (h != NULL
6926 ? h->type == STT_GNU_IFUNC
6927 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
8c1d1bb8
AM
6928 ;
6929 else
6930 return TRUE;
6931
6932 if (h != NULL)
6edfbbad 6933 {
19e08130
AM
6934 struct elf_dyn_relocs *p;
6935 struct elf_dyn_relocs **pp;
6936 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6937
6938 /* elf_gc_sweep may have already removed all dyn relocs associated
6939 with local syms for a given section. Also, symbol flags are
6940 changed by elf_gc_sweep_symbol, confusing the test above. Don't
6941 report a dynreloc miscount. */
6942 if (*pp == NULL && info->gc_sections)
6943 return TRUE;
6944
6945 while ((p = *pp) != NULL)
60124e18 6946 {
19e08130
AM
6947 if (p->sec == sec)
6948 {
6949 if (!must_be_dyn_reloc (info, r_type))
6950 p->pc_count -= 1;
6951 p->count -= 1;
6952 if (p->count == 0)
6953 *pp = p->next;
6954 return TRUE;
6955 }
6956 pp = &p->next;
60124e18 6957 }
6edfbbad 6958 }
19e08130
AM
6959 else
6960 {
6961 struct ppc_dyn_relocs *p;
6962 struct ppc_dyn_relocs **pp;
6963 void *vpp;
6964 bfd_boolean is_ifunc;
8c1d1bb8 6965
19e08130
AM
6966 if (local_syms == NULL)
6967 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6968 if (sym_sec == NULL)
6969 sym_sec = sec;
c57da1a7 6970
19e08130
AM
6971 vpp = &elf_section_data (sym_sec)->local_dynrel;
6972 pp = (struct ppc_dyn_relocs **) vpp;
6973
6974 if (*pp == NULL && info->gc_sections)
6975 return TRUE;
6976
6977 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
6978 while ((p = *pp) != NULL)
8c1d1bb8 6979 {
19e08130
AM
6980 if (p->sec == sec && p->ifunc == is_ifunc)
6981 {
6982 p->count -= 1;
6983 if (p->count == 0)
6984 *pp = p->next;
6985 return TRUE;
6986 }
6987 pp = &p->next;
8c1d1bb8 6988 }
8c1d1bb8
AM
6989 }
6990
695344c0 6991 /* xgettext:c-format */
cf97bcb0
AM
6992 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"),
6993 sec->owner, sec);
8c1d1bb8
AM
6994 bfd_set_error (bfd_error_bad_value);
6995 return FALSE;
6996}
6997
754021d0
AM
6998/* Remove unused Official Procedure Descriptor entries. Currently we
6999 only remove those associated with functions in discarded link-once
7000 sections, or weakly defined functions that have been overridden. It
7001 would be possible to remove many more entries for statically linked
7002 applications. */
7003
b34976b6 7004bfd_boolean
e7d1c40c 7005ppc64_elf_edit_opd (struct bfd_link_info *info)
1e2f5b6e
AM
7006{
7007 bfd *ibfd;
754021d0 7008 bfd_boolean some_edited = FALSE;
3f764659 7009 asection *need_pad = NULL;
e7d1c40c
AM
7010 struct ppc_link_hash_table *htab;
7011
7012 htab = ppc_hash_table (info);
7013 if (htab == NULL)
7014 return FALSE;
1e2f5b6e 7015
c72f2fb2 7016 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1e2f5b6e
AM
7017 {
7018 asection *sec;
7019 Elf_Internal_Rela *relstart, *rel, *relend;
7020 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7021 Elf_Internal_Sym *local_syms;
74f0fb50 7022 struct _opd_sec_data *opd;
51aecdc5 7023 bfd_boolean need_edit, add_aux_fields, broken;
3f764659 7024 bfd_size_type cnt_16b = 0;
1e2f5b6e 7025
854b41e7
AM
7026 if (!is_ppc64_elf (ibfd))
7027 continue;
7028
1e2f5b6e 7029 sec = bfd_get_section_by_name (ibfd, ".opd");
46de2a7c 7030 if (sec == NULL || sec->size == 0)
1e2f5b6e
AM
7031 continue;
7032
dbaa2011 7033 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7034 continue;
7035
1e2f5b6e
AM
7036 if (sec->output_section == bfd_abs_section_ptr)
7037 continue;
7038
7039 /* Look through the section relocs. */
7040 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7041 continue;
7042
6cdc0ccc 7043 local_syms = NULL;
0ffa91dd 7044 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7045
7046 /* Read the relocations. */
4ce794b7 7047 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7048 info->keep_memory);
1e2f5b6e 7049 if (relstart == NULL)
b34976b6 7050 return FALSE;
1e2f5b6e
AM
7051
7052 /* First run through the relocs to check they are sane, and to
7053 determine whether we need to edit this opd section. */
b34976b6 7054 need_edit = FALSE;
51aecdc5 7055 broken = FALSE;
3f764659 7056 need_pad = sec;
1e2f5b6e 7057 relend = relstart + sec->reloc_count;
50bc7936 7058 for (rel = relstart; rel < relend; )
1e2f5b6e 7059 {
04c9666a 7060 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7061 unsigned long r_symndx;
7062 asection *sym_sec;
7063 struct elf_link_hash_entry *h;
7064 Elf_Internal_Sym *sym;
51aecdc5 7065 bfd_vma offset;
1e2f5b6e 7066
51aecdc5 7067 /* .opd contains an array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7068 only interested in the reloc pointing to a function entry
7069 point. */
51aecdc5
AM
7070 offset = rel->r_offset;
7071 if (rel + 1 == relend
7072 || rel[1].r_offset != offset + 8)
1e2f5b6e
AM
7073 {
7074 /* If someone messes with .opd alignment then after a
7075 "ld -r" we might have padding in the middle of .opd.
7076 Also, there's nothing to prevent someone putting
7077 something silly in .opd with the assembler. No .opd
b34976b6 7078 optimization for them! */
3f764659 7079 broken_opd:
4eca0228 7080 _bfd_error_handler
871b3ab2 7081 (_("%pB: .opd is not a regular array of opd entries"), ibfd);
51aecdc5 7082 broken = TRUE;
1e2f5b6e
AM
7083 break;
7084 }
7085
50bc7936
AM
7086 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7087 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7088 {
4eca0228 7089 _bfd_error_handler
695344c0 7090 /* xgettext:c-format */
871b3ab2 7091 (_("%pB: unexpected reloc type %u in .opd section"),
d003868e 7092 ibfd, r_type);
51aecdc5 7093 broken = TRUE;
50bc7936
AM
7094 break;
7095 }
7096
1e2f5b6e 7097 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7098 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7099 r_symndx, ibfd))
50bc7936 7100 goto error_ret;
1e2f5b6e
AM
7101
7102 if (sym_sec == NULL || sym_sec->owner == NULL)
7103 {
411e1bfb
AM
7104 const char *sym_name;
7105 if (h != NULL)
7106 sym_name = h->root.root.string;
7107 else
26c61ae5
L
7108 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7109 sym_sec);
411e1bfb 7110
4eca0228 7111 _bfd_error_handler
695344c0 7112 /* xgettext:c-format */
871b3ab2 7113 (_("%pB: undefined sym `%s' in .opd section"),
d003868e 7114 ibfd, sym_name);
51aecdc5 7115 broken = TRUE;
1e2f5b6e
AM
7116 break;
7117 }
7118
51020317
AM
7119 /* opd entries are always for functions defined in the
7120 current input bfd. If the symbol isn't defined in the
7121 input bfd, then we won't be using the function in this
7122 bfd; It must be defined in a linkonce section in another
7123 bfd, or is weak. It's also possible that we are
7124 discarding the function due to a linker script /DISCARD/,
7125 which we test for via the output_section. */
7126 if (sym_sec->owner != ibfd
7127 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 7128 need_edit = TRUE;
1e2f5b6e 7129
50bc7936 7130 rel += 2;
51aecdc5
AM
7131 if (rel + 1 == relend
7132 || (rel + 2 < relend
7133 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
7134 ++rel;
7135
7136 if (rel == relend)
3f764659
JJ
7137 {
7138 if (sec->size == offset + 24)
7139 {
7140 need_pad = NULL;
7141 break;
7142 }
51aecdc5 7143 if (sec->size == offset + 16)
3f764659
JJ
7144 {
7145 cnt_16b++;
7146 break;
7147 }
7148 goto broken_opd;
7149 }
3f764659
JJ
7150 else if (rel + 1 < relend
7151 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7152 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7153 {
51aecdc5
AM
7154 if (rel[0].r_offset == offset + 16)
7155 cnt_16b++;
7156 else if (rel[0].r_offset != offset + 24)
7157 goto broken_opd;
3f764659
JJ
7158 }
7159 else
7160 goto broken_opd;
1e2f5b6e
AM
7161 }
7162
e7d1c40c 7163 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
3f764659 7164
51aecdc5 7165 if (!broken && (need_edit || add_aux_fields))
1e2f5b6e
AM
7166 {
7167 Elf_Internal_Rela *write_rel;
d4730f92 7168 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 7169 bfd_byte *rptr, *wptr;
983bddc8 7170 bfd_byte *new_contents;
74f0fb50
AM
7171 bfd_size_type amt;
7172
983bddc8 7173 new_contents = NULL;
51aecdc5 7174 amt = OPD_NDX (sec->size) * sizeof (long);
74f0fb50 7175 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 7176 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50
AM
7177 if (opd->adjust == NULL)
7178 return FALSE;
1e2f5b6e
AM
7179
7180 /* This seems a waste of time as input .opd sections are all
7181 zeros as generated by gcc, but I suppose there's no reason
7182 this will always be so. We might start putting something in
7183 the third word of .opd entries. */
7184 if ((sec->flags & SEC_IN_MEMORY) == 0)
7185 {
eea6121a
AM
7186 bfd_byte *loc;
7187 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 7188 {
eea6121a
AM
7189 if (loc != NULL)
7190 free (loc);
50bc7936 7191 error_ret:
6cdc0ccc
AM
7192 if (local_syms != NULL
7193 && symtab_hdr->contents != (unsigned char *) local_syms)
7194 free (local_syms);
6cdc0ccc
AM
7195 if (elf_section_data (sec)->relocs != relstart)
7196 free (relstart);
b34976b6 7197 return FALSE;
6cdc0ccc 7198 }
1e2f5b6e
AM
7199 sec->contents = loc;
7200 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7201 }
7202
7203 elf_section_data (sec)->relocs = relstart;
7204
3f764659 7205 new_contents = sec->contents;
3f764659
JJ
7206 if (add_aux_fields)
7207 {
7208 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7209 if (new_contents == NULL)
7210 return FALSE;
51aecdc5 7211 need_pad = NULL;
3f764659 7212 }
b4f4e59f
AM
7213 wptr = new_contents;
7214 rptr = sec->contents;
1e2f5b6e 7215 write_rel = relstart;
51aecdc5 7216 for (rel = relstart; rel < relend; )
1e2f5b6e 7217 {
50bc7936
AM
7218 unsigned long r_symndx;
7219 asection *sym_sec;
7220 struct elf_link_hash_entry *h;
51aecdc5 7221 struct ppc_link_hash_entry *fdh = NULL;
50bc7936 7222 Elf_Internal_Sym *sym;
51aecdc5
AM
7223 long opd_ent_size;
7224 Elf_Internal_Rela *next_rel;
7225 bfd_boolean skip;
50bc7936
AM
7226
7227 r_symndx = ELF64_R_SYM (rel->r_info);
7228 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 7229 r_symndx, ibfd))
50bc7936
AM
7230 goto error_ret;
7231
51aecdc5
AM
7232 next_rel = rel + 2;
7233 if (next_rel + 1 == relend
7234 || (next_rel + 2 < relend
7235 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
7236 ++next_rel;
7237
7238 /* See if the .opd entry is full 24 byte or
7239 16 byte (with fd_aux entry overlapped with next
7240 fd_func). */
7241 opd_ent_size = 24;
7242 if (next_rel == relend)
1e2f5b6e 7243 {
51aecdc5 7244 if (sec->size == rel->r_offset + 16)
3f764659 7245 opd_ent_size = 16;
51aecdc5
AM
7246 }
7247 else if (next_rel->r_offset == rel->r_offset + 16)
7248 opd_ent_size = 16;
3f764659 7249
51aecdc5
AM
7250 if (h != NULL
7251 && h->root.root.string[0] == '.')
7252 {
8c5b4e52
AM
7253 fdh = ((struct ppc_link_hash_entry *) h)->oh;
7254 if (fdh != NULL)
7255 {
7256 fdh = ppc_follow_link (fdh);
7257 if (fdh->elf.root.type != bfd_link_hash_defined
7258 && fdh->elf.root.type != bfd_link_hash_defweak)
7259 fdh = NULL;
7260 }
51aecdc5 7261 }
1e2f5b6e 7262
51aecdc5
AM
7263 skip = (sym_sec->owner != ibfd
7264 || sym_sec->output_section == bfd_abs_section_ptr);
7265 if (skip)
7266 {
7267 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7 7268 {
51aecdc5
AM
7269 /* Arrange for the function descriptor sym
7270 to be dropped. */
7271 fdh->elf.root.u.def.value = 0;
7272 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 7273 }
51aecdc5 7274 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
1e2f5b6e 7275
0e1862bb 7276 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
51aecdc5
AM
7277 rel = next_rel;
7278 else
7279 while (1)
7280 {
7281 if (!dec_dynrel_count (rel->r_info, sec, info,
7282 NULL, h, sym))
7283 goto error_ret;
754021d0 7284
51aecdc5
AM
7285 if (++rel == next_rel)
7286 break;
1e2f5b6e 7287
51aecdc5
AM
7288 r_symndx = ELF64_R_SYM (rel->r_info);
7289 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7290 r_symndx, ibfd))
7291 goto error_ret;
7292 }
50bc7936
AM
7293 }
7294 else
1e2f5b6e 7295 {
51aecdc5
AM
7296 /* We'll be keeping this opd entry. */
7297 long adjust;
7298
7299 if (fdh != NULL)
7300 {
7301 /* Redefine the function descriptor symbol to
7302 this location in the opd section. It is
7303 necessary to update the value here rather
7304 than using an array of adjustments as we do
7305 for local symbols, because various places
7306 in the generic ELF code use the value
7307 stored in u.def.value. */
7308 fdh->elf.root.u.def.value = wptr - new_contents;
7309 fdh->adjust_done = 1;
7310 }
7311
7312 /* Local syms are a bit tricky. We could
7313 tweak them as they can be cached, but
7314 we'd need to look through the local syms
7315 for the function descriptor sym which we
7316 don't have at the moment. So keep an
7317 array of adjustments. */
7318 adjust = (wptr - new_contents) - (rptr - sec->contents);
7319 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
7320
7321 if (wptr != rptr)
7322 memcpy (wptr, rptr, opd_ent_size);
7323 wptr += opd_ent_size;
7324 if (add_aux_fields && opd_ent_size == 16)
7325 {
7326 memset (wptr, '\0', 8);
7327 wptr += 8;
7328 }
7329
50bc7936 7330 /* We need to adjust any reloc offsets to point to the
51aecdc5
AM
7331 new opd entries. */
7332 for ( ; rel != next_rel; ++rel)
7333 {
7334 rel->r_offset += adjust;
7335 if (write_rel != rel)
7336 memcpy (write_rel, rel, sizeof (*rel));
7337 ++write_rel;
7338 }
1e2f5b6e 7339 }
51aecdc5
AM
7340
7341 rptr += opd_ent_size;
1e2f5b6e
AM
7342 }
7343
3f764659 7344 sec->size = wptr - new_contents;
1e2f5b6e 7345 sec->reloc_count = write_rel - relstart;
3f764659
JJ
7346 if (add_aux_fields)
7347 {
7348 free (sec->contents);
7349 sec->contents = new_contents;
7350 }
7351
05bf9422 7352 /* Fudge the header size too, as this is used later in
cdcf6e38 7353 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
7354 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7355 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
754021d0 7356 some_edited = TRUE;
1e2f5b6e 7357 }
6cdc0ccc 7358 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 7359 free (relstart);
6cdc0ccc 7360
411e1bfb
AM
7361 if (local_syms != NULL
7362 && symtab_hdr->contents != (unsigned char *) local_syms)
7363 {
7364 if (!info->keep_memory)
7365 free (local_syms);
7366 else
7367 symtab_hdr->contents = (unsigned char *) local_syms;
7368 }
7369 }
7370
754021d0
AM
7371 if (some_edited)
7372 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7373
3f764659
JJ
7374 /* If we are doing a final link and the last .opd entry is just 16 byte
7375 long, add a 8 byte padding after it. */
0e1862bb 7376 if (need_pad != NULL && !bfd_link_relocatable (info))
3f764659
JJ
7377 {
7378 bfd_byte *p;
7379
7380 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7381 {
7382 BFD_ASSERT (need_pad->size > 0);
7383
7384 p = bfd_malloc (need_pad->size + 8);
7385 if (p == NULL)
7386 return FALSE;
699733f6 7387
2cdcc330
AM
7388 if (!bfd_get_section_contents (need_pad->owner, need_pad,
7389 p, 0, need_pad->size))
3f764659
JJ
7390 return FALSE;
7391
7392 need_pad->contents = p;
7393 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7394 }
7395 else
7396 {
7397 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7398 if (p == NULL)
7399 return FALSE;
7400
7401 need_pad->contents = p;
7402 }
7403
7404 memset (need_pad->contents + need_pad->size, 0, 8);
7405 need_pad->size += 8;
7406 }
7407
411e1bfb
AM
7408 return TRUE;
7409}
7410
3e04d765
AM
7411/* Analyze inline PLT call relocations to see whether calls to locally
7412 defined functions can be converted to direct calls. */
7413
7414bfd_boolean
7415ppc64_elf_inline_plt (struct bfd_link_info *info)
7416{
7417 struct ppc_link_hash_table *htab;
7418 bfd *ibfd;
7419 asection *sec;
7420 bfd_vma low_vma, high_vma, limit;
7421
7422 htab = ppc_hash_table (info);
7423 if (htab == NULL)
7424 return FALSE;
7425
7426 /* A bl insn can reach -0x2000000 to 0x1fffffc. The limit is
7427 reduced somewhat to cater for possible stubs that might be added
7428 between the call and its destination. */
7429 if (htab->params->group_size < 0)
7430 {
7431 limit = -htab->params->group_size;
7432 if (limit == 1)
7433 limit = 0x1e00000;
7434 }
7435 else
7436 {
7437 limit = htab->params->group_size;
7438 if (limit == 1)
7439 limit = 0x1c00000;
7440 }
7441
7442 low_vma = -1;
7443 high_vma = 0;
7444 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
7445 if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
7446 {
7447 if (low_vma > sec->vma)
7448 low_vma = sec->vma;
7449 if (high_vma < sec->vma + sec->size)
7450 high_vma = sec->vma + sec->size;
7451 }
7452
7453 /* If a "bl" can reach anywhere in local code sections, then we can
7454 convert all inline PLT sequences to direct calls when the symbol
7455 is local. */
7456 if (high_vma - low_vma < limit)
7457 {
7458 htab->can_convert_all_inline_plt = 1;
7459 return TRUE;
7460 }
7461
7462 /* Otherwise, go looking through relocs for cases where a direct
7463 call won't reach. Mark the symbol on any such reloc to disable
7464 the optimization and keep the PLT entry as it seems likely that
7465 this will be better than creating trampolines. Note that this
7466 will disable the optimization for all inline PLT calls to a
7467 particular symbol, not just those that won't reach. The
7468 difficulty in doing a more precise optimization is that the
7469 linker needs to make a decision depending on whether a
7470 particular R_PPC64_PLTCALL insn can be turned into a direct
7471 call, for each of the R_PPC64_PLTSEQ and R_PPC64_PLT16* insns in
7472 the sequence, and there is nothing that ties those relocs
7473 together except their symbol. */
7474
7475 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7476 {
7477 Elf_Internal_Shdr *symtab_hdr;
7478 Elf_Internal_Sym *local_syms;
7479
7480 if (!is_ppc64_elf (ibfd))
7481 continue;
7482
7483 local_syms = NULL;
7484 symtab_hdr = &elf_symtab_hdr (ibfd);
7485
7486 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7487 if (ppc64_elf_section_data (sec)->has_pltcall
7488 && !bfd_is_abs_section (sec->output_section))
7489 {
7490 Elf_Internal_Rela *relstart, *rel, *relend;
7491
7492 /* Read the relocations. */
7493 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7494 info->keep_memory);
7495 if (relstart == NULL)
7496 return FALSE;
7497
7498 relend = relstart + sec->reloc_count;
7499 for (rel = relstart; rel < relend; )
7500 {
7501 enum elf_ppc64_reloc_type r_type;
7502 unsigned long r_symndx;
7503 asection *sym_sec;
7504 struct elf_link_hash_entry *h;
7505 Elf_Internal_Sym *sym;
7506 unsigned char *tls_maskp;
7507
7508 r_type = ELF64_R_TYPE (rel->r_info);
5663e321
AM
7509 if (r_type != R_PPC64_PLTCALL
7510 && r_type != R_PPC64_PLTCALL_NOTOC)
3e04d765
AM
7511 continue;
7512
7513 r_symndx = ELF64_R_SYM (rel->r_info);
7514 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
7515 r_symndx, ibfd))
7516 {
7517 if (elf_section_data (sec)->relocs != relstart)
7518 free (relstart);
7519 if (local_syms != NULL
2cdcc330 7520 && symtab_hdr->contents != (bfd_byte *) local_syms)
3e04d765
AM
7521 free (local_syms);
7522 return FALSE;
7523 }
7524
7525 if (sym_sec != NULL && sym_sec->output_section != NULL)
7526 {
7527 bfd_vma from, to;
7528 if (h != NULL)
7529 to = h->root.u.def.value;
7530 else
7531 to = sym->st_value;
7532 to += (rel->r_addend
7533 + sym_sec->output_offset
7534 + sym_sec->output_section->vma);
7535 from = (rel->r_offset
7536 + sec->output_offset
7537 + sec->output_section->vma);
5663e321
AM
7538 if (to - from + limit < 2 * limit
7539 && !(r_type == R_PPC64_PLTCALL_NOTOC
7540 && (((h ? h->other : sym->st_other)
7541 & STO_PPC64_LOCAL_MASK)
4a4e7361 7542 > 1 << STO_PPC64_LOCAL_BIT)))
3e04d765
AM
7543 *tls_maskp &= ~PLT_KEEP;
7544 }
7545 }
7546 if (elf_section_data (sec)->relocs != relstart)
7547 free (relstart);
7548 }
7549
7550 if (local_syms != NULL
7551 && symtab_hdr->contents != (unsigned char *) local_syms)
7552 {
7553 if (!info->keep_memory)
7554 free (local_syms);
7555 else
7556 symtab_hdr->contents = (unsigned char *) local_syms;
7557 }
7558 }
7559
7560 return TRUE;
7561}
7562
e1918d23 7563/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 7564
e1918d23 7565asection *
e7d1c40c 7566ppc64_elf_tls_setup (struct bfd_link_info *info)
411e1bfb 7567{
411e1bfb
AM
7568 struct ppc_link_hash_table *htab;
7569
411e1bfb 7570 htab = ppc_hash_table (info);
4dfe6ac6
NC
7571 if (htab == NULL)
7572 return NULL;
7573
ee67d69a
AM
7574 if (abiversion (info->output_bfd) == 1)
7575 htab->opd_abi = 1;
7576
e7d1c40c 7577 if (htab->params->no_multi_toc)
33c0ec9d
AM
7578 htab->do_multi_toc = 0;
7579 else if (!htab->do_multi_toc)
e7d1c40c 7580 htab->params->no_multi_toc = 1;
33c0ec9d 7581
8b5f1ed8
AM
7582 /* Default to --no-plt-localentry, as this option can cause problems
7583 with symbol interposition. For example, glibc libpthread.so and
7584 libc.so duplicate many pthread symbols, with a fallback
7585 implementation in libc.so. In some cases the fallback does more
7586 work than the pthread implementation. __pthread_condattr_destroy
7587 is one such symbol: the libpthread.so implementation is
7588 localentry:0 while the libc.so implementation is localentry:8.
7589 An app that "cleverly" uses dlopen to only load necessary
7590 libraries at runtime may omit loading libpthread.so when not
7591 running multi-threaded, which then results in the libc.so
7592 fallback symbols being used and ld.so complaining. Now there
7593 are workarounds in ld (see non_zero_localentry) to detect the
7594 pthread situation, but that may not be the only case where
7595 --plt-localentry can cause trouble. */
f378ab09 7596 if (htab->params->plt_localentry0 < 0)
8b5f1ed8 7597 htab->params->plt_localentry0 = 0;
d44c746a
AM
7598 if (htab->params->plt_localentry0
7599 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
7600 FALSE, FALSE, FALSE) == NULL)
cf97bcb0
AM
7601 _bfd_error_handler
7602 (_("warning: --plt-localentry is especially dangerous without "
7603 "ld.so support to detect ABI violations"));
f378ab09 7604
3a71aa26
AM
7605 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7606 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7607 FALSE, FALSE, TRUE));
a7f2871e
AM
7608 /* Move dynamic linking info to the function descriptor sym. */
7609 if (htab->tls_get_addr != NULL)
7610 func_desc_adjust (&htab->tls_get_addr->elf, info);
3a71aa26
AM
7611 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7612 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7613 FALSE, FALSE, TRUE));
7c9cf415 7614 if (htab->params->tls_get_addr_opt)
a7f2871e
AM
7615 {
7616 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
7617
7618 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7619 FALSE, FALSE, TRUE);
7620 if (opt != NULL)
7621 func_desc_adjust (opt, info);
7622 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7623 FALSE, FALSE, TRUE);
7624 if (opt_fd != NULL
7625 && (opt_fd->root.type == bfd_link_hash_defined
7626 || opt_fd->root.type == bfd_link_hash_defweak))
7627 {
7628 /* If glibc supports an optimized __tls_get_addr call stub,
7629 signalled by the presence of __tls_get_addr_opt, and we'll
7630 be calling __tls_get_addr via a plt call stub, then
7631 make __tls_get_addr point to __tls_get_addr_opt. */
7632 tga_fd = &htab->tls_get_addr_fd->elf;
7633 if (htab->elf.dynamic_sections_created
7634 && tga_fd != NULL
7635 && (tga_fd->type == STT_FUNC
7636 || tga_fd->needs_plt)
7637 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
21d68fcd 7638 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd)))
a7f2871e
AM
7639 {
7640 struct plt_entry *ent;
7641
7642 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7643 if (ent->plt.refcount > 0)
7644 break;
7645 if (ent != NULL)
7646 {
7647 tga_fd->root.type = bfd_link_hash_indirect;
7648 tga_fd->root.u.i.link = &opt_fd->root;
7649 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
b531344c 7650 opt_fd->mark = 1;
a7f2871e
AM
7651 if (opt_fd->dynindx != -1)
7652 {
7653 /* Use __tls_get_addr_opt in dynamic relocations. */
7654 opt_fd->dynindx = -1;
7655 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7656 opt_fd->dynstr_index);
7657 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
854b41e7 7658 return NULL;
a7f2871e 7659 }
2cdcc330
AM
7660 htab->tls_get_addr_fd
7661 = (struct ppc_link_hash_entry *) opt_fd;
a7f2871e
AM
7662 tga = &htab->tls_get_addr->elf;
7663 if (opt != NULL && tga != NULL)
7664 {
7665 tga->root.type = bfd_link_hash_indirect;
7666 tga->root.u.i.link = &opt->root;
7667 ppc64_elf_copy_indirect_symbol (info, opt, tga);
b531344c 7668 opt->mark = 1;
a7f2871e
AM
7669 _bfd_elf_link_hash_hide_symbol (info, opt,
7670 tga->forced_local);
7671 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
7672 }
7673 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7674 htab->tls_get_addr_fd->is_func_descriptor = 1;
7675 if (htab->tls_get_addr != NULL)
7676 {
7677 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7678 htab->tls_get_addr->is_func = 1;
7679 }
7680 }
7681 }
7682 }
7c9cf415
AM
7683 else if (htab->params->tls_get_addr_opt < 0)
7684 htab->params->tls_get_addr_opt = 0;
a7f2871e 7685 }
33c0ec9d 7686 return _bfd_elf_tls_setup (info->output_bfd, info);
3a71aa26 7687}
8387904d 7688
3a71aa26
AM
7689/* Return TRUE iff REL is a branch reloc with a global symbol matching
7690 HASH1 or HASH2. */
8387904d 7691
3a71aa26
AM
7692static bfd_boolean
7693branch_reloc_hash_match (const bfd *ibfd,
7694 const Elf_Internal_Rela *rel,
7695 const struct ppc_link_hash_entry *hash1,
7696 const struct ppc_link_hash_entry *hash2)
7697{
7698 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7699 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7700 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7701
e054468f 7702 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 7703 {
3a71aa26
AM
7704 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7705 struct elf_link_hash_entry *h;
8387904d 7706
3a71aa26 7707 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7708 h = elf_follow_link (h);
3a71aa26
AM
7709 if (h == &hash1->elf || h == &hash2->elf)
7710 return TRUE;
a48ebf4d 7711 }
3a71aa26 7712 return FALSE;
951fd09b 7713}
411e1bfb 7714
951fd09b
AM
7715/* Run through all the TLS relocs looking for optimization
7716 opportunities. The linker has been hacked (see ppc64elf.em) to do
7717 a preliminary section layout so that we know the TLS segment
7718 offsets. We can't optimize earlier because some optimizations need
7719 to know the tp offset, and we need to optimize before allocating
7720 dynamic relocations. */
7721
7722bfd_boolean
33c0ec9d 7723ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
7724{
7725 bfd *ibfd;
7726 asection *sec;
7727 struct ppc_link_hash_table *htab;
663a1470 7728 unsigned char *toc_ref;
102890f0 7729 int pass;
951fd09b 7730
3cbc1e5e 7731 if (!bfd_link_executable (info))
411e1bfb
AM
7732 return TRUE;
7733
951fd09b 7734 htab = ppc_hash_table (info);
4dfe6ac6
NC
7735 if (htab == NULL)
7736 return FALSE;
7737
663a1470
AM
7738 /* Make two passes over the relocs. On the first pass, mark toc
7739 entries involved with tls relocs, and check that tls relocs
7740 involved in setting up a tls_get_addr call are indeed followed by
7741 such a call. If they are not, we can't do any tls optimization.
7742 On the second pass twiddle tls_mask flags to notify
7743 relocate_section that optimization can be done, and adjust got
7744 and plt refcounts. */
7745 toc_ref = NULL;
7746 for (pass = 0; pass < 2; ++pass)
c72f2fb2 7747 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
663a1470
AM
7748 {
7749 Elf_Internal_Sym *locsyms = NULL;
7750 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7751
102890f0
AM
7752 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7753 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7754 {
7755 Elf_Internal_Rela *relstart, *rel, *relend;
663a1470 7756 bfd_boolean found_tls_get_addr_arg = 0;
411e1bfb 7757
102890f0
AM
7758 /* Read the relocations. */
7759 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7760 info->keep_memory);
7761 if (relstart == NULL)
2915c55b
JK
7762 {
7763 free (toc_ref);
7764 return FALSE;
7765 }
411e1bfb 7766
102890f0
AM
7767 relend = relstart + sec->reloc_count;
7768 for (rel = relstart; rel < relend; rel++)
7769 {
7770 enum elf_ppc64_reloc_type r_type;
7771 unsigned long r_symndx;
7772 struct elf_link_hash_entry *h;
7773 Elf_Internal_Sym *sym;
7774 asection *sym_sec;
f961d9dd 7775 unsigned char *tls_mask;
46e9995a 7776 unsigned int tls_set, tls_clear, tls_type = 0;
102890f0
AM
7777 bfd_vma value;
7778 bfd_boolean ok_tprel, is_local;
7779 long toc_ref_index = 0;
7780 int expecting_tls_get_addr = 0;
663a1470 7781 bfd_boolean ret = FALSE;
411e1bfb 7782
102890f0
AM
7783 r_symndx = ELF64_R_SYM (rel->r_info);
7784 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
7785 r_symndx, ibfd))
7786 {
7787 err_free_rel:
7788 if (elf_section_data (sec)->relocs != relstart)
7789 free (relstart);
7790 if (toc_ref != NULL)
7791 free (toc_ref);
7792 if (locsyms != NULL
0ffa91dd 7793 && (elf_symtab_hdr (ibfd).contents
102890f0
AM
7794 != (unsigned char *) locsyms))
7795 free (locsyms);
663a1470 7796 return ret;
102890f0 7797 }
411e1bfb 7798
102890f0
AM
7799 if (h != NULL)
7800 {
766bc656
AM
7801 if (h->root.type == bfd_link_hash_defined
7802 || h->root.type == bfd_link_hash_defweak)
7803 value = h->root.u.def.value;
7804 else if (h->root.type == bfd_link_hash_undefweak)
7805 value = 0;
7806 else
663a1470
AM
7807 {
7808 found_tls_get_addr_arg = 0;
7809 continue;
7810 }
102890f0
AM
7811 }
7812 else
7813 /* Symbols referenced by TLS relocs must be of type
7814 STT_TLS. So no need for .opd local sym adjust. */
7815 value = sym->st_value;
7816
7817 ok_tprel = FALSE;
f749f26e
AM
7818 is_local = SYMBOL_REFERENCES_LOCAL (info, h);
7819 if (is_local)
102890f0 7820 {
766bc656
AM
7821 if (h != NULL
7822 && h->root.type == bfd_link_hash_undefweak)
7823 ok_tprel = TRUE;
c27b8c2a
AM
7824 else if (sym_sec != NULL
7825 && sym_sec->output_section != NULL)
766bc656
AM
7826 {
7827 value += sym_sec->output_offset;
7828 value += sym_sec->output_section->vma;
0b147428 7829 value -= htab->elf.tls_sec->vma + TP_OFFSET;
c213164a
AM
7830 /* Note that even though the prefix insns
7831 allow a 1<<33 offset we use the same test
7832 as for addis;addi. There may be a mix of
7833 pcrel and non-pcrel code and the decision
7834 to optimise is per symbol, not per TLS
7835 sequence. */
0b147428 7836 ok_tprel = value + 0x80008000ULL < 1ULL << 32;
766bc656 7837 }
102890f0 7838 }
951fd09b 7839
102890f0 7840 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
7841 /* If this section has old-style __tls_get_addr calls
7842 without marker relocs, then check that each
7843 __tls_get_addr call reloc is preceded by a reloc
7844 that conceivably belongs to the __tls_get_addr arg
7845 setup insn. If we don't find matching arg setup
7846 relocs, don't do any tls optimization. */
7847 if (pass == 0
9737e8af 7848 && sec->nomark_tls_get_addr
663a1470
AM
7849 && h != NULL
7850 && (h == &htab->tls_get_addr->elf
7851 || h == &htab->tls_get_addr_fd->elf)
7852 && !found_tls_get_addr_arg
7853 && is_branch_reloc (r_type))
7854 {
25f53a85 7855 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
7856 "TLS optimization disabled\n"),
7857 ibfd, sec, rel->r_offset);
7858 ret = TRUE;
7859 goto err_free_rel;
7860 }
7861
7862 found_tls_get_addr_arg = 0;
102890f0
AM
7863 switch (r_type)
7864 {
7865 case R_PPC64_GOT_TLSLD16:
7866 case R_PPC64_GOT_TLSLD16_LO:
c213164a 7867 case R_PPC64_GOT_TLSLD34:
102890f0 7868 expecting_tls_get_addr = 1;
663a1470 7869 found_tls_get_addr_arg = 1;
1a0670f3 7870 /* Fall through. */
102890f0
AM
7871
7872 case R_PPC64_GOT_TLSLD16_HI:
7873 case R_PPC64_GOT_TLSLD16_HA:
7874 /* These relocs should never be against a symbol
7875 defined in a shared lib. Leave them alone if
7876 that turns out to be the case. */
7877 if (!is_local)
7878 continue;
411e1bfb 7879
102890f0 7880 /* LD -> LE */
411e1bfb 7881 tls_set = 0;
102890f0
AM
7882 tls_clear = TLS_LD;
7883 tls_type = TLS_TLS | TLS_LD;
7884 break;
411e1bfb 7885
102890f0
AM
7886 case R_PPC64_GOT_TLSGD16:
7887 case R_PPC64_GOT_TLSGD16_LO:
c213164a 7888 case R_PPC64_GOT_TLSGD34:
102890f0 7889 expecting_tls_get_addr = 1;
663a1470 7890 found_tls_get_addr_arg = 1;
1a0670f3 7891 /* Fall through. */
102890f0
AM
7892
7893 case R_PPC64_GOT_TLSGD16_HI:
7894 case R_PPC64_GOT_TLSGD16_HA:
7895 if (ok_tprel)
7896 /* GD -> LE */
411e1bfb 7897 tls_set = 0;
102890f0
AM
7898 else
7899 /* GD -> IE */
b00a0a86 7900 tls_set = TLS_TLS | TLS_GDIE;
102890f0
AM
7901 tls_clear = TLS_GD;
7902 tls_type = TLS_TLS | TLS_GD;
7903 break;
7904
c213164a 7905 case R_PPC64_GOT_TPREL34:
102890f0
AM
7906 case R_PPC64_GOT_TPREL16_DS:
7907 case R_PPC64_GOT_TPREL16_LO_DS:
7908 case R_PPC64_GOT_TPREL16_HI:
7909 case R_PPC64_GOT_TPREL16_HA:
7910 if (ok_tprel)
7911 {
7912 /* IE -> LE */
7913 tls_set = 0;
7914 tls_clear = TLS_TPREL;
7915 tls_type = TLS_TLS | TLS_TPREL;
7916 break;
7917 }
411e1bfb
AM
7918 continue;
7919
727fc41e 7920 case R_PPC64_TLSLD:
7d04a20a
AM
7921 if (!is_local)
7922 continue;
7923 /* Fall through. */
7924 case R_PPC64_TLSGD:
23cedd1d
AM
7925 if (rel + 1 < relend
7926 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
7927 {
7928 if (pass != 0
2cdcc330 7929 && (ELF64_R_TYPE (rel[1].r_info)
5663e321
AM
7930 != R_PPC64_PLTSEQ)
7931 && (ELF64_R_TYPE (rel[1].r_info)
7932 != R_PPC64_PLTSEQ_NOTOC))
23cedd1d
AM
7933 {
7934 r_symndx = ELF64_R_SYM (rel[1].r_info);
7935 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms,
2cdcc330 7936 r_symndx, ibfd))
23cedd1d
AM
7937 goto err_free_rel;
7938 if (h != NULL)
7939 {
7940 struct plt_entry *ent = NULL;
7941
7942 for (ent = h->plt.plist;
7943 ent != NULL;
7944 ent = ent->next)
7945 if (ent->addend == rel[1].r_addend)
7946 break;
7947
7948 if (ent != NULL
7949 && ent->plt.refcount > 0)
7950 ent->plt.refcount -= 1;
7951 }
7952 }
7953 continue;
7954 }
663a1470 7955 found_tls_get_addr_arg = 1;
1a0670f3 7956 /* Fall through. */
663a1470
AM
7957
7958 case R_PPC64_TLS:
7959 case R_PPC64_TOC16:
7960 case R_PPC64_TOC16_LO:
102890f0
AM
7961 if (sym_sec == NULL || sym_sec != toc)
7962 continue;
7963
7964 /* Mark this toc entry as referenced by a TLS
7965 code sequence. We can do that now in the
7966 case of R_PPC64_TLS, and after checking for
7967 tls_get_addr for the TOC16 relocs. */
7968 if (toc_ref == NULL)
2cdcc330
AM
7969 toc_ref
7970 = bfd_zmalloc (toc->output_section->rawsize / 8);
663a1470
AM
7971 if (toc_ref == NULL)
7972 goto err_free_rel;
7973
102890f0
AM
7974 if (h != NULL)
7975 value = h->root.u.def.value;
7976 else
7977 value = sym->st_value;
7978 value += rel->r_addend;
73242275
AM
7979 if (value % 8 != 0)
7980 continue;
7981 BFD_ASSERT (value < toc->size
7982 && toc->output_offset % 8 == 0);
663a1470 7983 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
7984 if (r_type == R_PPC64_TLS
7985 || r_type == R_PPC64_TLSGD
7986 || r_type == R_PPC64_TLSLD)
102890f0
AM
7987 {
7988 toc_ref[toc_ref_index] = 1;
7989 continue;
7990 }
7991
7992 if (pass != 0 && toc_ref[toc_ref_index] == 0)
7993 continue;
7994
7995 tls_set = 0;
7996 tls_clear = 0;
7997 expecting_tls_get_addr = 2;
7998 break;
7999
8000 case R_PPC64_TPREL64:
8001 if (pass == 0
8002 || sec != toc
8003 || toc_ref == NULL
663a1470 8004 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8005 continue;
8006 if (ok_tprel)
8007 {
8008 /* IE -> LE */
8009 tls_set = TLS_EXPLICIT;
8010 tls_clear = TLS_TPREL;
8011 break;
8012 }
8013 continue;
8014
8015 case R_PPC64_DTPMOD64:
8016 if (pass == 0
8017 || sec != toc
8018 || toc_ref == NULL
663a1470 8019 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8020 continue;
8021 if (rel + 1 < relend
8022 && (rel[1].r_info
8023 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8024 && rel[1].r_offset == rel->r_offset + 8)
8025 {
8026 if (ok_tprel)
8027 /* GD -> LE */
8028 tls_set = TLS_EXPLICIT | TLS_GD;
8029 else
8030 /* GD -> IE */
b00a0a86 8031 tls_set = TLS_EXPLICIT | TLS_GD | TLS_GDIE;
102890f0
AM
8032 tls_clear = TLS_GD;
8033 }
8034 else
8035 {
8036 if (!is_local)
8037 continue;
8038
8039 /* LD -> LE */
8040 tls_set = TLS_EXPLICIT;
8041 tls_clear = TLS_LD;
8042 }
8043 break;
8044
8045 default:
8046 continue;
8047 }
8048
8049 if (pass == 0)
8050 {
727fc41e 8051 if (!expecting_tls_get_addr
9737e8af 8052 || !sec->nomark_tls_get_addr)
102890f0
AM
8053 continue;
8054
3a71aa26
AM
8055 if (rel + 1 < relend
8056 && branch_reloc_hash_match (ibfd, rel + 1,
8057 htab->tls_get_addr,
8058 htab->tls_get_addr_fd))
102890f0 8059 {
3a71aa26 8060 if (expecting_tls_get_addr == 2)
102890f0 8061 {
3a71aa26 8062 /* Check for toc tls entries. */
f961d9dd 8063 unsigned char *toc_tls;
3a71aa26
AM
8064 int retval;
8065
8066 retval = get_tls_mask (&toc_tls, NULL, NULL,
8067 &locsyms,
8068 rel, ibfd);
8069 if (retval == 0)
8070 goto err_free_rel;
663a1470
AM
8071 if (toc_tls != NULL)
8072 {
37da22e5
AM
8073 if ((*toc_tls & TLS_TLS) != 0
8074 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0))
663a1470
AM
8075 found_tls_get_addr_arg = 1;
8076 if (retval > 1)
8077 toc_ref[toc_ref_index] = 1;
8078 }
102890f0 8079 }
3a71aa26 8080 continue;
102890f0
AM
8081 }
8082
102890f0
AM
8083 /* Uh oh, we didn't find the expected call. We
8084 could just mark this symbol to exclude it
8085 from tls optimization but it's safer to skip
663a1470 8086 the entire optimization. */
695344c0 8087 /* xgettext:c-format */
25f53a85 8088 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8089 "TLS optimization disabled\n"),
8090 ibfd, sec, rel->r_offset);
8091 ret = TRUE;
8092 goto err_free_rel;
102890f0
AM
8093 }
8094
37da22e5
AM
8095 /* If we don't have old-style __tls_get_addr calls
8096 without TLSGD/TLSLD marker relocs, and we haven't
8097 found a new-style __tls_get_addr call with a
8098 marker for this symbol, then we either have a
8099 broken object file or an -mlongcall style
8100 indirect call to __tls_get_addr without a marker.
8101 Disable optimization in this case. */
8102 if ((tls_clear & (TLS_GD | TLS_LD)) != 0
8103 && (tls_set & TLS_EXPLICIT) == 0
9737e8af 8104 && !sec->nomark_tls_get_addr
37da22e5
AM
8105 && ((*tls_mask & (TLS_TLS | TLS_MARK))
8106 != (TLS_TLS | TLS_MARK)))
8107 continue;
8108
7d04a20a 8109 if (expecting_tls_get_addr == 1 + !sec->nomark_tls_get_addr)
102890f0 8110 {
23cedd1d
AM
8111 struct plt_entry *ent = NULL;
8112
8113 if (htab->tls_get_addr != NULL)
8114 for (ent = htab->tls_get_addr->elf.plt.plist;
8115 ent != NULL;
8116 ent = ent->next)
8117 if (ent->addend == 0)
102890f0 8118 break;
411e1bfb 8119
23cedd1d
AM
8120 if (ent == NULL && htab->tls_get_addr_fd != NULL)
8121 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8122 ent != NULL;
8123 ent = ent->next)
8124 if (ent->addend == 0)
102890f0 8125 break;
23cedd1d
AM
8126
8127 if (ent != NULL
8128 && ent->plt.refcount > 0)
8129 ent->plt.refcount -= 1;
102890f0 8130 }
411e1bfb 8131
102890f0 8132 if (tls_clear == 0)
30038c59
AM
8133 continue;
8134
102890f0
AM
8135 if ((tls_set & TLS_EXPLICIT) == 0)
8136 {
8137 struct got_entry *ent;
411e1bfb 8138
102890f0
AM
8139 /* Adjust got entry for this reloc. */
8140 if (h != NULL)
8141 ent = h->got.glist;
8142 else
8143 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 8144
102890f0
AM
8145 for (; ent != NULL; ent = ent->next)
8146 if (ent->addend == rel->r_addend
8147 && ent->owner == ibfd
8148 && ent->tls_type == tls_type)
8149 break;
8150 if (ent == NULL)
8151 abort ();
411e1bfb 8152
102890f0
AM
8153 if (tls_set == 0)
8154 {
8155 /* We managed to get rid of a got entry. */
8156 if (ent->got.refcount > 0)
8157 ent->got.refcount -= 1;
8158 }
8159 }
8160 else
8161 {
8162 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8163 we'll lose one or two dyn relocs. */
8164 if (!dec_dynrel_count (rel->r_info, sec, info,
19e08130 8165 NULL, h, sym))
102890f0 8166 return FALSE;
411e1bfb 8167
102890f0
AM
8168 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8169 {
8170 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
19e08130 8171 NULL, h, sym))
102890f0
AM
8172 return FALSE;
8173 }
8174 }
411e1bfb 8175
46e9995a 8176 *tls_mask |= tls_set & 0xff;
102890f0
AM
8177 *tls_mask &= ~tls_clear;
8178 }
8c1d1bb8 8179
102890f0
AM
8180 if (elf_section_data (sec)->relocs != relstart)
8181 free (relstart);
8182 }
411e1bfb 8183
663a1470
AM
8184 if (locsyms != NULL
8185 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8186 {
8187 if (!info->keep_memory)
8188 free (locsyms);
8189 else
8190 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8191 }
8192 }
411e1bfb 8193
663a1470
AM
8194 if (toc_ref != NULL)
8195 free (toc_ref);
9a23f96e 8196 htab->do_tls_opt = 1;
b34976b6 8197 return TRUE;
1e2f5b6e 8198}
b34976b6 8199
c5614fa4
AM
8200/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8201 the values of any global symbols in a toc section that has been
8202 edited. Globals in toc sections should be a rarity, so this function
8203 sets a flag if any are found in toc sections other than the one just
de194d85 8204 edited, so that further hash table traversals can be avoided. */
c5614fa4
AM
8205
8206struct adjust_toc_info
8207{
8208 asection *toc;
8209 unsigned long *skip;
8210 bfd_boolean global_toc_syms;
8211};
8212
ba761f19
AM
8213enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8214
c5614fa4
AM
8215static bfd_boolean
8216adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8217{
8218 struct ppc_link_hash_entry *eh;
8219 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 8220 unsigned long i;
c5614fa4 8221
c5614fa4
AM
8222 if (h->root.type != bfd_link_hash_defined
8223 && h->root.type != bfd_link_hash_defweak)
8224 return TRUE;
8225
8226 eh = (struct ppc_link_hash_entry *) h;
8227 if (eh->adjust_done)
8228 return TRUE;
8229
8230 if (eh->elf.root.u.def.section == toc_inf->toc)
8231 {
854b41e7
AM
8232 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8233 i = toc_inf->toc->rawsize >> 3;
c5614fa4 8234 else
854b41e7
AM
8235 i = eh->elf.root.u.def.value >> 3;
8236
ba761f19 8237 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4 8238 {
4eca0228 8239 _bfd_error_handler
854b41e7
AM
8240 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8241 do
8242 ++i;
ba761f19 8243 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 8244 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 8245 }
854b41e7
AM
8246
8247 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
8248 eh->adjust_done = 1;
8249 }
8250 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8251 toc_inf->global_toc_syms = TRUE;
8252
8253 return TRUE;
8254}
8255
39eeab25
AM
8256/* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8257 on a _LO variety toc/got reloc. */
560c8763
AM
8258
8259static bfd_boolean
39eeab25 8260ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
560c8763 8261{
2365f8d7
AM
8262 return ((insn & (0x3fu << 26)) == 12u << 26 /* addic */
8263 || (insn & (0x3fu << 26)) == 14u << 26 /* addi */
8264 || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */
8265 || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */
8266 || (insn & (0x3fu << 26)) == 36u << 26 /* stw */
8267 || (insn & (0x3fu << 26)) == 38u << 26 /* stb */
8268 || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */
8269 || (insn & (0x3fu << 26)) == 42u << 26 /* lha */
8270 || (insn & (0x3fu << 26)) == 44u << 26 /* sth */
8271 || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */
8272 || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */
8273 || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */
8274 || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */
8275 || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */
8276 || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */
8277 || (insn & (0x3fu << 26)) == 56u << 26 /* lq,lfq */
8278 || ((insn & (0x3fu << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
39eeab25
AM
8279 /* Exclude lfqu by testing reloc. If relocs are ever
8280 defined for the reduced D field in psq_lu then those
8281 will need testing too. */
8282 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8283 || ((insn & (0x3fu << 26)) == 58u << 26 /* ld,lwa */
39eeab25 8284 && (insn & 1) == 0)
2365f8d7
AM
8285 || (insn & (0x3fu << 26)) == 60u << 26 /* stfq */
8286 || ((insn & (0x3fu << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
39eeab25
AM
8287 /* Exclude stfqu. psq_stu as above for psq_lu. */
8288 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8289 || ((insn & (0x3fu << 26)) == 62u << 26 /* std,stq */
39eeab25 8290 && (insn & 1) == 0));
560c8763
AM
8291}
8292
4a421c53
AM
8293/* PCREL_OPT in one instance flags to the linker that a pair of insns:
8294 pld ra,symbol@got@pcrel
dd9b12c2 8295 load/store rt,off(ra)
4a421c53 8296 or
d4b87b1e 8297 pla ra,symbol@pcrel
dd9b12c2 8298 load/store rt,off(ra)
4a421c53 8299 may be translated to
dd9b12c2 8300 pload/pstore rt,symbol+off@pcrel
4a421c53
AM
8301 nop.
8302 This function returns true if the optimization is possible, placing
dd9b12c2 8303 the prefix insn in *PINSN1, a NOP in *PINSN2 and the offset in *POFF.
4a421c53
AM
8304
8305 On entry to this function, the linker has already determined that
d4b87b1e 8306 the pld can be replaced with pla: *PINSN1 is that pla insn,
4a421c53
AM
8307 while *PINSN2 is the second instruction. */
8308
8309static bfd_boolean
dd9b12c2 8310xlate_pcrel_opt (uint64_t *pinsn1, uint64_t *pinsn2, bfd_signed_vma *poff)
4a421c53 8311{
77486630
AM
8312 uint64_t insn1 = *pinsn1;
8313 uint64_t insn2 = *pinsn2;
dd9b12c2 8314 bfd_signed_vma off;
4a421c53 8315
77486630
AM
8316 if ((insn2 & (63ULL << 58)) == 1ULL << 58)
8317 {
8318 /* Check that regs match. */
8319 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
8320 return FALSE;
8321
8322 /* P8LS or PMLS form, non-pcrel. */
8323 if ((insn2 & (-1ULL << 50) & ~(1ULL << 56)) != (1ULL << 58))
8324 return FALSE;
8325
8326 *pinsn1 = (insn2 & ~(31 << 16) & ~0x3ffff0000ffffULL) | (1ULL << 52);
8327 *pinsn2 = PNOP;
8328 off = ((insn2 >> 16) & 0x3ffff0000ULL) | (insn2 & 0xffff);
8329 *poff = (off ^ 0x200000000ULL) - 0x200000000ULL;
8330 return TRUE;
8331 }
8332
8333 insn2 >>= 32;
8334
4a421c53 8335 /* Check that regs match. */
77486630 8336 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
4a421c53
AM
8337 return FALSE;
8338
8339 switch ((insn2 >> 26) & 63)
8340 {
8341 default:
8342 return FALSE;
8343
8344 case 32: /* lwz */
8345 case 34: /* lbz */
8346 case 36: /* stw */
8347 case 38: /* stb */
8348 case 40: /* lhz */
8349 case 42: /* lha */
8350 case 44: /* sth */
8351 case 48: /* lfs */
8352 case 50: /* lfd */
8353 case 52: /* stfs */
8354 case 54: /* stfd */
8355 /* These are the PMLS cases, where we just need to tack a prefix
dd9b12c2 8356 on the insn. */
77486630 8357 insn1 = ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
4a421c53 8358 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8359 off = insn2 & 0xffff;
4a421c53
AM
8360 break;
8361
8362 case 58: /* lwa, ld */
dd9b12c2 8363 if ((insn2 & 1) != 0)
4a421c53 8364 return FALSE;
77486630 8365 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8366 | (insn2 & 2 ? 41ULL << 26 : 57ULL << 26)
8367 | (insn2 & (31ULL << 21)));
dd9b12c2 8368 off = insn2 & 0xfffc;
4a421c53
AM
8369 break;
8370
8371 case 57: /* lxsd, lxssp */
dd9b12c2 8372 if ((insn2 & 3) < 2)
4a421c53 8373 return FALSE;
77486630 8374 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8375 | ((40ULL | (insn2 & 3)) << 26)
8376 | (insn2 & (31ULL << 21)));
dd9b12c2 8377 off = insn2 & 0xfffc;
4a421c53
AM
8378 break;
8379
8380 case 61: /* stxsd, stxssp, lxv, stxv */
8381 if ((insn2 & 3) == 0)
8382 return FALSE;
8383 else if ((insn2 & 3) >= 2)
8384 {
77486630 8385 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8386 | ((44ULL | (insn2 & 3)) << 26)
8387 | (insn2 & (31ULL << 21)));
dd9b12c2 8388 off = insn2 & 0xfffc;
4a421c53
AM
8389 }
8390 else
8391 {
77486630 8392 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8393 | ((50ULL | (insn2 & 4) | ((insn2 & 8) >> 3)) << 26)
8394 | (insn2 & (31ULL << 21)));
dd9b12c2 8395 off = insn2 & 0xfff0;
4a421c53
AM
8396 }
8397 break;
8398
8399 case 56: /* lq */
77486630 8400 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53 8401 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8402 off = insn2 & 0xffff;
4a421c53
AM
8403 break;
8404
8405 case 62: /* std, stq */
dd9b12c2 8406 if ((insn2 & 1) != 0)
4a421c53 8407 return FALSE;
77486630 8408 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8409 | ((insn2 & 2) == 0 ? 61ULL << 26 : 60ULL << 26)
8410 | (insn2 & (31ULL << 21)));
dd9b12c2 8411 off = insn2 & 0xfffc;
4a421c53
AM
8412 break;
8413 }
8414
77486630 8415 *pinsn1 = insn1;
4a421c53 8416 *pinsn2 = (uint64_t) NOP << 32;
dd9b12c2 8417 *poff = (off ^ 0x8000) - 0x8000;
4a421c53
AM
8418 return TRUE;
8419}
8420
c5614fa4
AM
8421/* Examine all relocs referencing .toc sections in order to remove
8422 unused .toc entries. */
8423
8424bfd_boolean
33c0ec9d 8425ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
8426{
8427 bfd *ibfd;
8428 struct adjust_toc_info toc_inf;
67f0cbdb 8429 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 8430
67f0cbdb 8431 htab->do_toc_opt = 1;
c5614fa4 8432 toc_inf.global_toc_syms = TRUE;
c72f2fb2 8433 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
c5614fa4
AM
8434 {
8435 asection *toc, *sec;
8436 Elf_Internal_Shdr *symtab_hdr;
8437 Elf_Internal_Sym *local_syms;
425b145b 8438 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
8439 unsigned long *skip, *drop;
8440 unsigned char *used;
8441 unsigned char *keep, last, some_unused;
8442
854b41e7
AM
8443 if (!is_ppc64_elf (ibfd))
8444 continue;
8445
c5614fa4
AM
8446 toc = bfd_get_section_by_name (ibfd, ".toc");
8447 if (toc == NULL
92b7a70f 8448 || toc->size == 0
dbaa2011
AM
8449 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8450 || discarded_section (toc))
c5614fa4
AM
8451 continue;
8452
425b145b 8453 toc_relocs = NULL;
c5614fa4 8454 local_syms = NULL;
0ffa91dd 8455 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
8456
8457 /* Look at sections dropped from the final link. */
8458 skip = NULL;
8459 relstart = NULL;
8460 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8461 {
8462 if (sec->reloc_count == 0
dbaa2011 8463 || !discarded_section (sec)
c5614fa4
AM
8464 || get_opd_info (sec)
8465 || (sec->flags & SEC_ALLOC) == 0
8466 || (sec->flags & SEC_DEBUGGING) != 0)
8467 continue;
8468
8469 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8470 if (relstart == NULL)
8471 goto error_ret;
8472
8473 /* Run through the relocs to see which toc entries might be
8474 unused. */
8475 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8476 {
8477 enum elf_ppc64_reloc_type r_type;
8478 unsigned long r_symndx;
8479 asection *sym_sec;
8480 struct elf_link_hash_entry *h;
8481 Elf_Internal_Sym *sym;
8482 bfd_vma val;
8483
8484 r_type = ELF64_R_TYPE (rel->r_info);
8485 switch (r_type)
8486 {
8487 default:
8488 continue;
8489
8490 case R_PPC64_TOC16:
8491 case R_PPC64_TOC16_LO:
8492 case R_PPC64_TOC16_HI:
8493 case R_PPC64_TOC16_HA:
8494 case R_PPC64_TOC16_DS:
8495 case R_PPC64_TOC16_LO_DS:
8496 break;
8497 }
8498
8499 r_symndx = ELF64_R_SYM (rel->r_info);
8500 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8501 r_symndx, ibfd))
8502 goto error_ret;
8503
8504 if (sym_sec != toc)
8505 continue;
8506
8507 if (h != NULL)
8508 val = h->root.u.def.value;
8509 else
8510 val = sym->st_value;
8511 val += rel->r_addend;
8512
8513 if (val >= toc->size)
8514 continue;
8515
8516 /* Anything in the toc ought to be aligned to 8 bytes.
8517 If not, don't mark as unused. */
8518 if (val & 7)
8519 continue;
8520
8521 if (skip == NULL)
8522 {
854b41e7 8523 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
8524 if (skip == NULL)
8525 goto error_ret;
8526 }
8527
ba761f19 8528 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
8529 }
8530
8531 if (elf_section_data (sec)->relocs != relstart)
8532 free (relstart);
8533 }
8534
ba761f19
AM
8535 /* For largetoc loads of address constants, we can convert
8536 . addis rx,2,addr@got@ha
8537 . ld ry,addr@got@l(rx)
8538 to
8539 . addis rx,2,addr@toc@ha
8540 . addi ry,rx,addr@toc@l
8541 when addr is within 2G of the toc pointer. This then means
8542 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 8543
ba761f19
AM
8544 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8545 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8546 && toc->reloc_count != 0)
8547 {
8548 /* Read toc relocs. */
425b145b
AM
8549 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8550 info->keep_memory);
8551 if (toc_relocs == NULL)
ba761f19
AM
8552 goto error_ret;
8553
425b145b 8554 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
8555 {
8556 enum elf_ppc64_reloc_type r_type;
8557 unsigned long r_symndx;
8558 asection *sym_sec;
8559 struct elf_link_hash_entry *h;
8560 Elf_Internal_Sym *sym;
8561 bfd_vma val, addr;
8562
8563 r_type = ELF64_R_TYPE (rel->r_info);
8564 if (r_type != R_PPC64_ADDR64)
8565 continue;
8566
8567 r_symndx = ELF64_R_SYM (rel->r_info);
8568 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8569 r_symndx, ibfd))
8570 goto error_ret;
8571
425b145b 8572 if (sym_sec == NULL
c27b8c2a 8573 || sym_sec->output_section == NULL
dbaa2011 8574 || discarded_section (sym_sec))
425b145b
AM
8575 continue;
8576
afe397ea 8577 if (!SYMBOL_REFERENCES_LOCAL (info, h))
ba761f19
AM
8578 continue;
8579
8580 if (h != NULL)
bddc25c9
AM
8581 {
8582 if (h->type == STT_GNU_IFUNC)
8583 continue;
8584 val = h->root.u.def.value;
8585 }
ba761f19 8586 else
bddc25c9
AM
8587 {
8588 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8589 continue;
8590 val = sym->st_value;
8591 }
ba761f19
AM
8592 val += rel->r_addend;
8593 val += sym_sec->output_section->vma + sym_sec->output_offset;
8594
8595 /* We don't yet know the exact toc pointer value, but we
8596 know it will be somewhere in the toc section. Don't
8597 optimize if the difference from any possible toc
8598 pointer is outside [ff..f80008000, 7fff7fff]. */
8599 addr = toc->output_section->vma + TOC_BASE_OFF;
8600 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8601 continue;
8602
8603 addr = toc->output_section->vma + toc->output_section->rawsize;
8604 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8605 continue;
8606
8607 if (skip == NULL)
8608 {
8609 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8610 if (skip == NULL)
8611 goto error_ret;
8612 }
8613
8614 skip[rel->r_offset >> 3]
425b145b 8615 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 8616 }
ba761f19
AM
8617 }
8618
c5614fa4
AM
8619 if (skip == NULL)
8620 continue;
8621
8622 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8623 if (used == NULL)
8624 {
8625 error_ret:
8626 if (local_syms != NULL
8627 && symtab_hdr->contents != (unsigned char *) local_syms)
8628 free (local_syms);
8629 if (sec != NULL
8630 && relstart != NULL
8631 && elf_section_data (sec)->relocs != relstart)
8632 free (relstart);
425b145b
AM
8633 if (toc_relocs != NULL
8634 && elf_section_data (toc)->relocs != toc_relocs)
8635 free (toc_relocs);
c5614fa4
AM
8636 if (skip != NULL)
8637 free (skip);
8638 return FALSE;
8639 }
8640
30038c59
AM
8641 /* Now check all kept sections that might reference the toc.
8642 Check the toc itself last. */
8643 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8644 : ibfd->sections);
c5614fa4 8645 sec != NULL;
c5614fa4 8646 sec = (sec == toc ? NULL
c5614fa4 8647 : sec->next == NULL ? toc
30038c59 8648 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
8649 : sec->next))
8650 {
8651 int repeat;
8652
8653 if (sec->reloc_count == 0
dbaa2011 8654 || discarded_section (sec)
c5614fa4
AM
8655 || get_opd_info (sec)
8656 || (sec->flags & SEC_ALLOC) == 0
8657 || (sec->flags & SEC_DEBUGGING) != 0)
8658 continue;
8659
854b41e7
AM
8660 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8661 info->keep_memory);
c5614fa4 8662 if (relstart == NULL)
2915c55b
JK
8663 {
8664 free (used);
8665 goto error_ret;
8666 }
c5614fa4
AM
8667
8668 /* Mark toc entries referenced as used. */
c5614fa4 8669 do
d4f1ee75
AM
8670 {
8671 repeat = 0;
8672 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8673 {
8674 enum elf_ppc64_reloc_type r_type;
8675 unsigned long r_symndx;
8676 asection *sym_sec;
8677 struct elf_link_hash_entry *h;
8678 Elf_Internal_Sym *sym;
8679 bfd_vma val;
98528052 8680
d4f1ee75 8681 r_type = ELF64_R_TYPE (rel->r_info);
d4f1ee75
AM
8682 switch (r_type)
8683 {
8684 case R_PPC64_TOC16:
8685 case R_PPC64_TOC16_LO:
8686 case R_PPC64_TOC16_HI:
8687 case R_PPC64_TOC16_HA:
8688 case R_PPC64_TOC16_DS:
8689 case R_PPC64_TOC16_LO_DS:
8690 /* In case we're taking addresses of toc entries. */
8691 case R_PPC64_ADDR64:
8692 break;
c5614fa4 8693
d4f1ee75
AM
8694 default:
8695 continue;
8696 }
c5614fa4 8697
d4f1ee75
AM
8698 r_symndx = ELF64_R_SYM (rel->r_info);
8699 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8700 r_symndx, ibfd))
8701 {
8702 free (used);
8703 goto error_ret;
8704 }
c5614fa4 8705
d4f1ee75
AM
8706 if (sym_sec != toc)
8707 continue;
c5614fa4 8708
d4f1ee75
AM
8709 if (h != NULL)
8710 val = h->root.u.def.value;
8711 else
8712 val = sym->st_value;
8713 val += rel->r_addend;
ba761f19 8714
d4f1ee75
AM
8715 if (val >= toc->size)
8716 continue;
ba761f19 8717
d4f1ee75
AM
8718 if ((skip[val >> 3] & can_optimize) != 0)
8719 {
8720 bfd_vma off;
8721 unsigned char opc;
8722
8723 switch (r_type)
8724 {
8725 case R_PPC64_TOC16_HA:
ba761f19 8726 break;
ba761f19 8727
d4f1ee75
AM
8728 case R_PPC64_TOC16_LO_DS:
8729 off = rel->r_offset;
8730 off += (bfd_big_endian (ibfd) ? -2 : 3);
8731 if (!bfd_get_section_contents (ibfd, sec, &opc,
8732 off, 1))
8733 {
8734 free (used);
8735 goto error_ret;
8736 }
8737 if ((opc & (0x3f << 2)) == (58u << 2))
8738 break;
1a0670f3 8739 /* Fall through. */
ba761f19 8740
d4f1ee75
AM
8741 default:
8742 /* Wrong sort of reloc, or not a ld. We may
8743 as well clear ref_from_discarded too. */
8744 skip[val >> 3] = 0;
8745 }
8746 }
8747
8748 if (sec != toc)
8749 used[val >> 3] = 1;
8750 /* For the toc section, we only mark as used if this
8751 entry itself isn't unused. */
8752 else if ((used[rel->r_offset >> 3]
8753 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
8754 && !used[val >> 3])
8755 {
8756 /* Do all the relocs again, to catch reference
8757 chains. */
8758 repeat = 1;
8759 used[val >> 3] = 1;
8760 }
8761 }
8762 }
c5614fa4 8763 while (repeat);
854b41e7
AM
8764
8765 if (elf_section_data (sec)->relocs != relstart)
8766 free (relstart);
c5614fa4
AM
8767 }
8768
8769 /* Merge the used and skip arrays. Assume that TOC
8770 doublewords not appearing as either used or unused belong
de194d85 8771 to an entry more than one doubleword in size. */
c5614fa4
AM
8772 for (drop = skip, keep = used, last = 0, some_unused = 0;
8773 drop < skip + (toc->size + 7) / 8;
8774 ++drop, ++keep)
8775 {
8776 if (*keep)
8777 {
ba761f19
AM
8778 *drop &= ~ref_from_discarded;
8779 if ((*drop & can_optimize) != 0)
8780 some_unused = 1;
c5614fa4
AM
8781 last = 0;
8782 }
b140b010 8783 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
8784 {
8785 some_unused = 1;
ba761f19 8786 last = ref_from_discarded;
c5614fa4
AM
8787 }
8788 else
8789 *drop = last;
8790 }
8791
8792 free (used);
8793
8794 if (some_unused)
8795 {
8796 bfd_byte *contents, *src;
8797 unsigned long off;
d62b3684 8798 Elf_Internal_Sym *sym;
ba761f19 8799 bfd_boolean local_toc_syms = FALSE;
c5614fa4
AM
8800
8801 /* Shuffle the toc contents, and at the same time convert the
8802 skip array from booleans into offsets. */
8803 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8804 goto error_ret;
8805
8806 elf_section_data (toc)->this_hdr.contents = contents;
8807
8808 for (src = contents, off = 0, drop = skip;
8809 src < contents + toc->size;
8810 src += 8, ++drop)
8811 {
ba761f19
AM
8812 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
8813 off += 8;
c5614fa4
AM
8814 else if (off != 0)
8815 {
8816 *drop = off;
8817 memcpy (src - off, src, 8);
8818 }
8819 }
854b41e7 8820 *drop = off;
c5614fa4
AM
8821 toc->rawsize = toc->size;
8822 toc->size = src - contents - off;
8823
ba761f19
AM
8824 /* Adjust addends for relocs against the toc section sym,
8825 and optimize any accesses we can. */
c5614fa4
AM
8826 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8827 {
8828 if (sec->reloc_count == 0
dbaa2011 8829 || discarded_section (sec))
c5614fa4
AM
8830 continue;
8831
8832 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 8833 info->keep_memory);
c5614fa4
AM
8834 if (relstart == NULL)
8835 goto error_ret;
8836
8837 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8838 {
8839 enum elf_ppc64_reloc_type r_type;
8840 unsigned long r_symndx;
8841 asection *sym_sec;
8842 struct elf_link_hash_entry *h;
854b41e7 8843 bfd_vma val;
c5614fa4
AM
8844
8845 r_type = ELF64_R_TYPE (rel->r_info);
8846 switch (r_type)
8847 {
8848 default:
8849 continue;
8850
8851 case R_PPC64_TOC16:
8852 case R_PPC64_TOC16_LO:
8853 case R_PPC64_TOC16_HI:
8854 case R_PPC64_TOC16_HA:
8855 case R_PPC64_TOC16_DS:
8856 case R_PPC64_TOC16_LO_DS:
8857 case R_PPC64_ADDR64:
8858 break;
8859 }
8860
8861 r_symndx = ELF64_R_SYM (rel->r_info);
8862 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8863 r_symndx, ibfd))
8864 goto error_ret;
8865
ba761f19 8866 if (sym_sec != toc)
c5614fa4
AM
8867 continue;
8868
ba761f19
AM
8869 if (h != NULL)
8870 val = h->root.u.def.value;
8871 else
8872 {
8873 val = sym->st_value;
8874 if (val != 0)
8875 local_toc_syms = TRUE;
8876 }
8877
8878 val += rel->r_addend;
854b41e7
AM
8879
8880 if (val > toc->rawsize)
8881 val = toc->rawsize;
ba761f19
AM
8882 else if ((skip[val >> 3] & ref_from_discarded) != 0)
8883 continue;
8884 else if ((skip[val >> 3] & can_optimize) != 0)
8885 {
8886 Elf_Internal_Rela *tocrel
425b145b 8887 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
8888 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
8889
8890 switch (r_type)
8891 {
8892 case R_PPC64_TOC16_HA:
8893 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
8894 break;
8895
8896 case R_PPC64_TOC16_LO_DS:
8897 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
8898 break;
8899
8900 default:
28942f62
AM
8901 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
8902 ppc_howto_init ();
b140b010 8903 info->callbacks->einfo
695344c0 8904 /* xgettext:c-format */
174d0a74 8905 (_("%H: %s references "
b140b010
AM
8906 "optimized away TOC entry\n"),
8907 ibfd, sec, rel->r_offset,
8908 ppc64_elf_howto_table[r_type]->name);
8909 bfd_set_error (bfd_error_bad_value);
8910 goto error_ret;
ba761f19
AM
8911 }
8912 rel->r_addend = tocrel->r_addend;
8913 elf_section_data (sec)->relocs = relstart;
8914 continue;
8915 }
8916
8917 if (h != NULL || sym->st_value != 0)
8918 continue;
854b41e7
AM
8919
8920 rel->r_addend -= skip[val >> 3];
8921 elf_section_data (sec)->relocs = relstart;
c5614fa4 8922 }
854b41e7
AM
8923
8924 if (elf_section_data (sec)->relocs != relstart)
8925 free (relstart);
c5614fa4
AM
8926 }
8927
8928 /* We shouldn't have local or global symbols defined in the TOC,
8929 but handle them anyway. */
df22d223
AM
8930 if (local_syms != NULL)
8931 for (sym = local_syms;
8932 sym < local_syms + symtab_hdr->sh_info;
8933 ++sym)
8934 if (sym->st_value != 0
8935 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
8936 {
8937 unsigned long i;
854b41e7 8938
df22d223
AM
8939 if (sym->st_value > toc->rawsize)
8940 i = toc->rawsize >> 3;
8941 else
8942 i = sym->st_value >> 3;
854b41e7 8943
df22d223
AM
8944 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
8945 {
8946 if (local_toc_syms)
4eca0228 8947 _bfd_error_handler
df22d223
AM
8948 (_("%s defined on removed toc entry"),
8949 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
8950 do
8951 ++i;
8952 while ((skip[i] & (ref_from_discarded | can_optimize)));
8953 sym->st_value = (bfd_vma) i << 3;
8954 }
d62b3684 8955
df22d223
AM
8956 sym->st_value -= skip[i];
8957 symtab_hdr->contents = (unsigned char *) local_syms;
8958 }
c5614fa4 8959
854b41e7 8960 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
8961 if (toc_inf.global_toc_syms)
8962 {
8963 toc_inf.toc = toc;
8964 toc_inf.skip = skip;
8965 toc_inf.global_toc_syms = FALSE;
8966 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
8967 &toc_inf);
8968 }
854b41e7
AM
8969
8970 if (toc->reloc_count != 0)
8971 {
d4730f92 8972 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
8973 Elf_Internal_Rela *wrel;
8974 bfd_size_type sz;
8975
854b41e7 8976 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
8977 if (toc_relocs == NULL)
8978 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8979 info->keep_memory);
8980 if (toc_relocs == NULL)
8981 goto error_ret;
8982
425b145b
AM
8983 wrel = toc_relocs;
8984 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
8985 if ((skip[rel->r_offset >> 3]
8986 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
8987 {
8988 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
8989 wrel->r_info = rel->r_info;
8990 wrel->r_addend = rel->r_addend;
8991 ++wrel;
8992 }
8993 else if (!dec_dynrel_count (rel->r_info, toc, info,
8994 &local_syms, NULL, NULL))
8995 goto error_ret;
8996
425b145b
AM
8997 elf_section_data (toc)->relocs = toc_relocs;
8998 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
8999 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9000 sz = rel_hdr->sh_entsize;
9001 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9002 }
c5614fa4 9003 }
28be611c
AM
9004 else if (toc_relocs != NULL
9005 && elf_section_data (toc)->relocs != toc_relocs)
425b145b 9006 free (toc_relocs);
c5614fa4
AM
9007
9008 if (local_syms != NULL
9009 && symtab_hdr->contents != (unsigned char *) local_syms)
9010 {
9011 if (!info->keep_memory)
9012 free (local_syms);
9013 else
9014 symtab_hdr->contents = (unsigned char *) local_syms;
9015 }
9016 free (skip);
9017 }
9018
066f4018 9019 /* Look for cases where we can change an indirect GOT access to
4a421c53
AM
9020 a GOT relative or PC relative access, possibly reducing the
9021 number of GOT entries. */
066f4018
AM
9022 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9023 {
9024 asection *sec;
9025 Elf_Internal_Shdr *symtab_hdr;
9026 Elf_Internal_Sym *local_syms;
9027 Elf_Internal_Rela *relstart, *rel;
9028 bfd_vma got;
9029
9030 if (!is_ppc64_elf (ibfd))
9031 continue;
9032
903b777d 9033 if (!ppc64_elf_tdata (ibfd)->has_optrel)
066f4018
AM
9034 continue;
9035
9036 sec = ppc64_elf_tdata (ibfd)->got;
903b777d
AM
9037 got = 0;
9038 if (sec != NULL)
9039 got = sec->output_section->vma + sec->output_offset + 0x8000;
066f4018
AM
9040
9041 local_syms = NULL;
9042 symtab_hdr = &elf_symtab_hdr (ibfd);
9043
9044 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9045 {
9046 if (sec->reloc_count == 0
903b777d 9047 || !ppc64_elf_section_data (sec)->has_optrel
066f4018
AM
9048 || discarded_section (sec))
9049 continue;
9050
9051 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9052 info->keep_memory);
9053 if (relstart == NULL)
9054 {
9055 got_error_ret:
9056 if (local_syms != NULL
9057 && symtab_hdr->contents != (unsigned char *) local_syms)
9058 free (local_syms);
9059 if (sec != NULL
9060 && relstart != NULL
9061 && elf_section_data (sec)->relocs != relstart)
9062 free (relstart);
9063 return FALSE;
9064 }
9065
9066 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9067 {
9068 enum elf_ppc64_reloc_type r_type;
9069 unsigned long r_symndx;
9070 Elf_Internal_Sym *sym;
9071 asection *sym_sec;
9072 struct elf_link_hash_entry *h;
9073 struct got_entry *ent;
133a1f60 9074 bfd_vma val, pc;
4a421c53 9075 unsigned char buf[8];
066f4018 9076 unsigned int insn;
903b777d 9077 enum {no_check, check_lo, check_ha} insn_check;
066f4018
AM
9078
9079 r_type = ELF64_R_TYPE (rel->r_info);
903b777d
AM
9080 switch (r_type)
9081 {
9082 default:
9083 insn_check = no_check;
9084 break;
9085
9086 case R_PPC64_PLT16_HA:
9087 case R_PPC64_GOT_TLSLD16_HA:
9088 case R_PPC64_GOT_TLSGD16_HA:
9089 case R_PPC64_GOT_TPREL16_HA:
9090 case R_PPC64_GOT_DTPREL16_HA:
9091 case R_PPC64_GOT16_HA:
9092 case R_PPC64_TOC16_HA:
9093 insn_check = check_ha;
9094 break;
9095
9096 case R_PPC64_PLT16_LO:
9097 case R_PPC64_PLT16_LO_DS:
9098 case R_PPC64_GOT_TLSLD16_LO:
9099 case R_PPC64_GOT_TLSGD16_LO:
9100 case R_PPC64_GOT_TPREL16_LO_DS:
9101 case R_PPC64_GOT_DTPREL16_LO_DS:
9102 case R_PPC64_GOT16_LO:
9103 case R_PPC64_GOT16_LO_DS:
9104 case R_PPC64_TOC16_LO:
9105 case R_PPC64_TOC16_LO_DS:
9106 insn_check = check_lo;
9107 break;
9108 }
9109
9110 if (insn_check != no_check)
9111 {
9112 bfd_vma off = rel->r_offset & ~3;
9113
9114 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9115 goto got_error_ret;
9116
9117 insn = bfd_get_32 (ibfd, buf);
9118 if (insn_check == check_lo
9119 ? !ok_lo_toc_insn (insn, r_type)
2365f8d7 9120 : ((insn & ((0x3fu << 26) | 0x1f << 16))
903b777d
AM
9121 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9122 {
9123 char str[12];
9124
9125 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9126 sprintf (str, "%#08x", insn);
9127 info->callbacks->einfo
9128 /* xgettext:c-format */
9129 (_("%H: got/toc optimization is not supported for"
9130 " %s instruction\n"),
9131 ibfd, sec, rel->r_offset & ~3, str);
9132 continue;
9133 }
9134 }
9135
066f4018
AM
9136 switch (r_type)
9137 {
bb22a418
AM
9138 /* Note that we don't delete GOT entries for
9139 R_PPC64_GOT16_DS since we'd need a lot more
9140 analysis. For starters, the preliminary layout is
9141 before the GOT, PLT, dynamic sections and stubs are
9142 laid out. Then we'd need to allow for changes in
9143 distance between sections caused by alignment. */
066f4018
AM
9144 default:
9145 continue;
9146
066f4018
AM
9147 case R_PPC64_GOT16_HA:
9148 case R_PPC64_GOT16_LO_DS:
4a421c53 9149 case R_PPC64_GOT_PCREL34:
066f4018
AM
9150 break;
9151 }
9152
9153 r_symndx = ELF64_R_SYM (rel->r_info);
9154 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9155 r_symndx, ibfd))
9156 goto got_error_ret;
9157
6d5554a6
AM
9158 if (sym_sec == NULL
9159 || sym_sec->output_section == NULL
9160 || discarded_section (sym_sec))
9161 continue;
9162
066f4018
AM
9163 if (!SYMBOL_REFERENCES_LOCAL (info, h))
9164 continue;
9165
9166 if (h != NULL)
9167 val = h->root.u.def.value;
9168 else
9169 val = sym->st_value;
133a1f60 9170 val += rel->r_addend;
066f4018
AM
9171 val += sym_sec->output_section->vma + sym_sec->output_offset;
9172
bb22a418
AM
9173/* Fudge factor to allow for the fact that the preliminary layout
9174 isn't exact. Reduce limits by this factor. */
9175#define LIMIT_ADJUST(LIMIT) ((LIMIT) - (LIMIT) / 16)
9176
066f4018
AM
9177 switch (r_type)
9178 {
9179 default:
9180 continue;
9181
066f4018 9182 case R_PPC64_GOT16_HA:
bb22a418
AM
9183 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9184 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9185 continue;
9186
9187 if (!bfd_get_section_contents (ibfd, sec, buf,
9188 rel->r_offset & ~3, 4))
9189 goto got_error_ret;
9190 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9191 if (((insn & ((0x3fu << 26) | 0x1f << 16))
066f4018
AM
9192 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9193 continue;
9194 break;
9195
9196 case R_PPC64_GOT16_LO_DS:
bb22a418
AM
9197 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9198 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9199 continue;
9200 if (!bfd_get_section_contents (ibfd, sec, buf,
9201 rel->r_offset & ~3, 4))
9202 goto got_error_ret;
9203 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9204 if ((insn & (0x3fu << 26 | 0x3)) != 58u << 26 /* ld */)
066f4018
AM
9205 continue;
9206 break;
4a421c53
AM
9207
9208 case R_PPC64_GOT_PCREL34:
9209 pc = rel->r_offset;
9210 pc += sec->output_section->vma + sec->output_offset;
bb22a418
AM
9211 if (val - pc + LIMIT_ADJUST (1ULL << 33)
9212 >= LIMIT_ADJUST (1ULL << 34))
4a421c53
AM
9213 continue;
9214 if (!bfd_get_section_contents (ibfd, sec, buf,
9215 rel->r_offset & ~3, 8))
9216 goto got_error_ret;
9217 insn = bfd_get_32 (ibfd, buf);
9218 if ((insn & (-1u << 18)) != ((1u << 26) | (1u << 20)))
9219 continue;
9220 insn = bfd_get_32 (ibfd, buf + 4);
2365f8d7 9221 if ((insn & (0x3fu << 26)) != 57u << 26)
4a421c53
AM
9222 continue;
9223 break;
066f4018 9224 }
bb22a418 9225#undef LIMIT_ADJUST
066f4018
AM
9226
9227 if (h != NULL)
9228 ent = h->got.glist;
9229 else
9230 {
9231 struct got_entry **local_got_ents = elf_local_got_ents (ibfd);
9232 ent = local_got_ents[r_symndx];
9233 }
9234 for (; ent != NULL; ent = ent->next)
133a1f60 9235 if (ent->addend == rel->r_addend
066f4018
AM
9236 && ent->owner == ibfd
9237 && ent->tls_type == 0)
9238 break;
9239 BFD_ASSERT (ent && ent->got.refcount > 0);
9240 ent->got.refcount -= 1;
9241 }
9242
9243 if (elf_section_data (sec)->relocs != relstart)
9244 free (relstart);
9245 }
9246
9247 if (local_syms != NULL
9248 && symtab_hdr->contents != (unsigned char *) local_syms)
9249 {
9250 if (!info->keep_memory)
9251 free (local_syms);
9252 else
9253 symtab_hdr->contents = (unsigned char *) local_syms;
9254 }
9255 }
9256
c5614fa4
AM
9257 return TRUE;
9258}
9259
1bbe0902
AM
9260/* Return true iff input section I references the TOC using
9261 instructions limited to +/-32k offsets. */
9262
9263bfd_boolean
9264ppc64_elf_has_small_toc_reloc (asection *i)
9265{
9266 return (is_ppc64_elf (i->owner)
9267 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9268}
9269
927be08e
AM
9270/* Allocate space for one GOT entry. */
9271
9272static void
9273allocate_got (struct elf_link_hash_entry *h,
9274 struct bfd_link_info *info,
9275 struct got_entry *gent)
9276{
9277 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
9278 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9279 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9280 ? 16 : 8);
9281 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9282 ? 2 : 1) * sizeof (Elf64_External_Rela);
9283 asection *got = ppc64_elf_tdata (gent->owner)->got;
9284
9285 gent->got.offset = got->size;
9286 got->size += entsize;
9287
19e08130 9288 if (h->type == STT_GNU_IFUNC)
927be08e 9289 {
33e44f2e 9290 htab->elf.irelplt->size += rentsize;
19e08130 9291 htab->got_reli_size += rentsize;
927be08e 9292 }
f15d0b54 9293 else if (((bfd_link_pic (info)
f749f26e 9294 && !(gent->tls_type != 0
f15d0b54
AM
9295 && bfd_link_executable (info)
9296 && SYMBOL_REFERENCES_LOCAL (info, h)))
f0158f44
AM
9297 || (htab->elf.dynamic_sections_created
9298 && h->dynindx != -1
9299 && !SYMBOL_REFERENCES_LOCAL (info, h)))
21d68fcd 9300 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
927be08e 9301 {
19e08130 9302 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9303 relgot->size += rentsize;
927be08e
AM
9304 }
9305}
9306
7865406b
AM
9307/* This function merges got entries in the same toc group. */
9308
9309static void
9310merge_got_entries (struct got_entry **pent)
9311{
9312 struct got_entry *ent, *ent2;
9313
9314 for (ent = *pent; ent != NULL; ent = ent->next)
9315 if (!ent->is_indirect)
9316 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9317 if (!ent2->is_indirect
9318 && ent2->addend == ent->addend
9319 && ent2->tls_type == ent->tls_type
9320 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9321 {
9322 ent2->is_indirect = TRUE;
9323 ent2->got.ent = ent;
9324 }
9325}
9326
46434633 9327/* If H is undefined, make it dynamic if that makes sense. */
f0158f44
AM
9328
9329static bfd_boolean
46434633
AM
9330ensure_undef_dynamic (struct bfd_link_info *info,
9331 struct elf_link_hash_entry *h)
f0158f44
AM
9332{
9333 struct elf_link_hash_table *htab = elf_hash_table (info);
9334
9335 if (htab->dynamic_sections_created
46434633
AM
9336 && ((info->dynamic_undefined_weak != 0
9337 && h->root.type == bfd_link_hash_undefweak)
9338 || h->root.type == bfd_link_hash_undefined)
f0158f44
AM
9339 && h->dynindx == -1
9340 && !h->forced_local
9341 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9342 return bfd_elf_link_record_dynamic_symbol (info, h);
9343 return TRUE;
9344}
9345
65f38f15
AM
9346/* Allocate space in .plt, .got and associated reloc sections for
9347 dynamic relocs. */
5bd4f169 9348
b34976b6 9349static bfd_boolean
4ce794b7 9350allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9351{
65f38f15
AM
9352 struct bfd_link_info *info;
9353 struct ppc_link_hash_table *htab;
5bd4f169 9354 asection *s;
65f38f15 9355 struct ppc_link_hash_entry *eh;
0b8bcf0d 9356 struct got_entry **pgent, *gent;
5bd4f169 9357
e92d460e 9358 if (h->root.type == bfd_link_hash_indirect)
b34976b6 9359 return TRUE;
5bd4f169 9360
65f38f15
AM
9361 info = (struct bfd_link_info *) inf;
9362 htab = ppc_hash_table (info);
4dfe6ac6
NC
9363 if (htab == NULL)
9364 return FALSE;
5bd4f169 9365
951fd09b
AM
9366 eh = (struct ppc_link_hash_entry *) h;
9367 /* Run through the TLS GD got entries first if we're changing them
9368 to TPREL. */
b00a0a86 9369 if ((eh->tls_mask & (TLS_TLS | TLS_GDIE)) == (TLS_TLS | TLS_GDIE))
951fd09b
AM
9370 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9371 if (gent->got.refcount > 0
9372 && (gent->tls_type & TLS_GD) != 0)
9373 {
9374 /* This was a GD entry that has been converted to TPREL. If
9375 there happens to be a TPREL entry we can use that one. */
9376 struct got_entry *ent;
9377 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9378 if (ent->got.refcount > 0
9379 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9380 && ent->addend == gent->addend
9381 && ent->owner == gent->owner)
951fd09b
AM
9382 {
9383 gent->got.refcount = 0;
9384 break;
9385 }
9386
9387 /* If not, then we'll be using our own TPREL entry. */
9388 if (gent->got.refcount != 0)
9389 gent->tls_type = TLS_TLS | TLS_TPREL;
9390 }
9391
7865406b
AM
9392 /* Remove any list entry that won't generate a word in the GOT before
9393 we call merge_got_entries. Otherwise we risk merging to empty
9394 entries. */
0b8bcf0d
AM
9395 pgent = &h->got.glist;
9396 while ((gent = *pgent) != NULL)
411e1bfb 9397 if (gent->got.refcount > 0)
7865406b
AM
9398 {
9399 if ((gent->tls_type & TLS_LD) != 0
f749f26e 9400 && SYMBOL_REFERENCES_LOCAL (info, h))
7865406b
AM
9401 {
9402 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9403 *pgent = gent->next;
9404 }
9405 else
9406 pgent = &gent->next;
9407 }
9408 else
9409 *pgent = gent->next;
9410
9411 if (!htab->do_multi_toc)
9412 merge_got_entries (&h->got.glist);
9413
9414 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9415 if (!gent->is_indirect)
411e1bfb 9416 {
ec73ddcd
AM
9417 /* Ensure we catch all the cases where this symbol should
9418 be made dynamic. */
46434633 9419 if (!ensure_undef_dynamic (info, h))
f0158f44 9420 return FALSE;
65f38f15 9421
0c8d6e5c 9422 if (!is_ppc64_elf (gent->owner))
927be08e 9423 abort ();
0ffa91dd 9424
927be08e 9425 allocate_got (h, info, gent);
411e1bfb 9426 }
65f38f15 9427
954b63d4
AM
9428 /* If no dynamic sections we can't have dynamic relocs, except for
9429 IFUNCs which are handled even in static executables. */
8a2058b5
AM
9430 if (!htab->elf.dynamic_sections_created
9431 && h->type != STT_GNU_IFUNC)
9432 eh->dyn_relocs = NULL;
9433
529fe20e
AM
9434 /* Discard relocs on undefined symbols that must be local. */
9435 else if (h->root.type == bfd_link_hash_undefined
9436 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9437 eh->dyn_relocs = NULL;
9438
954b63d4
AM
9439 /* Also discard relocs on undefined weak syms with non-default
9440 visibility, or when dynamic_undefined_weak says so. */
21d68fcd 9441 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
954b63d4
AM
9442 eh->dyn_relocs = NULL;
9443
8a2058b5 9444 if (eh->dyn_relocs != NULL)
65f38f15 9445 {
8a2058b5
AM
9446 struct elf_dyn_relocs *p, **pp;
9447
57e7d118
AM
9448 /* In the shared -Bsymbolic case, discard space allocated for
9449 dynamic pc-relative relocs against symbols which turn out to
9450 be defined in regular objects. For the normal shared case,
9451 discard space for relocs that have become local due to symbol
9452 visibility changes. */
57e7d118 9453 if (bfd_link_pic (info))
65f38f15 9454 {
57e7d118
AM
9455 /* Relocs that use pc_count are those that appear on a call
9456 insn, or certain REL relocs (see must_be_dyn_reloc) that
9457 can be generated via assembly. We want calls to
9458 protected symbols to resolve directly to the function
9459 rather than going via the plt. If people want function
9460 pointer comparisons to work as expected then they should
9461 avoid writing weird assembly. */
9462 if (SYMBOL_CALLS_LOCAL (info, h))
9463 {
57e7d118
AM
9464 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9465 {
9466 p->count -= p->pc_count;
9467 p->pc_count = 0;
9468 if (p->count == 0)
9469 *pp = p->next;
9470 else
9471 pp = &p->next;
9472 }
9473 }
65f38f15 9474
954b63d4 9475 if (eh->dyn_relocs != NULL)
5bd4f169 9476 {
ec73ddcd
AM
9477 /* Ensure we catch all the cases where this symbol
9478 should be made dynamic. */
46434633 9479 if (!ensure_undef_dynamic (info, h))
f0158f44 9480 return FALSE;
5bd4f169 9481 }
65f38f15 9482 }
ec73ddcd
AM
9483
9484 /* For a fixed position executable, discard space for
9485 relocs against symbols which are not dynamic. */
9486 else if (h->type != STT_GNU_IFUNC)
57e7d118 9487 {
529fe20e
AM
9488 if (h->dynamic_adjusted
9489 && !h->def_regular
9490 && !ELF_COMMON_DEF_P (h))
f0158f44 9491 {
ec73ddcd
AM
9492 /* Ensure we catch all the cases where this symbol
9493 should be made dynamic. */
46434633 9494 if (!ensure_undef_dynamic (info, h))
f0158f44 9495 return FALSE;
dfbb6ac9 9496
ec73ddcd 9497 /* But if that didn't work out, discard dynamic relocs. */
f0158f44
AM
9498 if (h->dynindx == -1)
9499 eh->dyn_relocs = NULL;
9500 }
9501 else
8a2058b5 9502 eh->dyn_relocs = NULL;
57e7d118
AM
9503 }
9504
9505 /* Finally, allocate space. */
9506 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9507 {
9508 asection *sreloc = elf_section_data (p->sec)->sreloc;
9509 if (eh->elf.type == STT_GNU_IFUNC)
9510 sreloc = htab->elf.irelplt;
9511 sreloc->size += p->count * sizeof (Elf64_External_Rela);
dfbb6ac9 9512 }
65f38f15 9513 }
57e7d118 9514
2d7ad24e
AM
9515 /* We might need a PLT entry when the symbol
9516 a) is dynamic, or
9517 b) is an ifunc, or
9518 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
9519 d) has plt16 relocs and we are linking statically. */
9520 if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
9521 || h->type == STT_GNU_IFUNC
9522 || (h->needs_plt && h->dynamic_adjusted)
9523 || (h->needs_plt
9524 && h->def_regular
9525 && !htab->elf.dynamic_sections_created
3e04d765 9526 && !htab->can_convert_all_inline_plt
2d7ad24e
AM
9527 && (((struct ppc_link_hash_entry *) h)->tls_mask
9528 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
65f38f15 9529 {
57e7d118
AM
9530 struct plt_entry *pent;
9531 bfd_boolean doneone = FALSE;
9532 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9533 if (pent->plt.refcount > 0)
9534 {
9535 if (!htab->elf.dynamic_sections_created
9536 || h->dynindx == -1)
9537 {
2d7ad24e
AM
9538 if (h->type == STT_GNU_IFUNC)
9539 {
9540 s = htab->elf.iplt;
9541 pent->plt.offset = s->size;
9542 s->size += PLT_ENTRY_SIZE (htab);
9543 s = htab->elf.irelplt;
9544 }
9545 else
9546 {
9547 s = htab->pltlocal;
9548 pent->plt.offset = s->size;
9549 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
9550 s = bfd_link_pic (info) ? htab->relpltlocal : NULL;
9551 }
57e7d118
AM
9552 }
9553 else
9554 {
9555 /* If this is the first .plt entry, make room for the special
9556 first entry. */
9557 s = htab->elf.splt;
9558 if (s->size == 0)
9559 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
65f38f15 9560
57e7d118 9561 pent->plt.offset = s->size;
65f38f15 9562
57e7d118
AM
9563 /* Make room for this entry. */
9564 s->size += PLT_ENTRY_SIZE (htab);
65f38f15 9565
57e7d118
AM
9566 /* Make room for the .glink code. */
9567 s = htab->glink;
9568 if (s->size == 0)
9e390558 9569 s->size += GLINK_PLTRESOLVE_SIZE (htab);
57e7d118
AM
9570 if (htab->opd_abi)
9571 {
9572 /* We need bigger stubs past index 32767. */
9e390558 9573 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4)
57e7d118
AM
9574 s->size += 4;
9575 s->size += 2*4;
9576 }
9577 else
9578 s->size += 4;
65f38f15 9579
57e7d118
AM
9580 /* We also need to make an entry in the .rela.plt section. */
9581 s = htab->elf.srelplt;
9582 }
2d7ad24e
AM
9583 if (s != NULL)
9584 s->size += sizeof (Elf64_External_Rela);
57e7d118
AM
9585 doneone = TRUE;
9586 }
9587 else
9588 pent->plt.offset = (bfd_vma) -1;
9589 if (!doneone)
9590 {
9591 h->plt.plist = NULL;
9592 h->needs_plt = 0;
9593 }
65f38f15 9594 }
57e7d118 9595 else
65f38f15 9596 {
57e7d118
AM
9597 h->plt.plist = NULL;
9598 h->needs_plt = 0;
65f38f15
AM
9599 }
9600
b34976b6 9601 return TRUE;
65f38f15
AM
9602}
9603
9e390558
AM
9604#define PPC_LO(v) ((v) & 0xffff)
9605#define PPC_HI(v) (((v) >> 16) & 0xffff)
9606#define PPC_HA(v) PPC_HI ((v) + 0x8000)
04bdff6a
AM
9607#define D34(v) \
9608 ((((v) & 0x3ffff0000ULL) << 16) | (v & 0xffff))
9609#define HA34(v) ((v + (1ULL << 33)) >> 34)
9e390558 9610
a345bc8d
AM
9611/* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9612 to set up space for global entry stubs. These are put in glink,
9613 after the branch table. */
65f38f15 9614
b34976b6 9615static bfd_boolean
a345bc8d 9616size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
65f38f15 9617{
a345bc8d
AM
9618 struct bfd_link_info *info;
9619 struct ppc_link_hash_table *htab;
9620 struct plt_entry *pent;
9e390558 9621 asection *s, *plt;
65f38f15 9622
a345bc8d
AM
9623 if (h->root.type == bfd_link_hash_indirect)
9624 return TRUE;
65f38f15 9625
a345bc8d
AM
9626 if (!h->pointer_equality_needed)
9627 return TRUE;
65f38f15 9628
a345bc8d
AM
9629 if (h->def_regular)
9630 return TRUE;
65f38f15 9631
a345bc8d
AM
9632 info = inf;
9633 htab = ppc_hash_table (info);
9634 if (htab == NULL)
9635 return FALSE;
9636
9e390558
AM
9637 s = htab->global_entry;
9638 plt = htab->elf.splt;
a345bc8d
AM
9639 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9640 if (pent->plt.offset != (bfd_vma) -1
9641 && pent->addend == 0)
9642 {
afe397ea
AM
9643 /* For ELFv2, if this symbol is not defined in a regular file
9644 and we are not generating a shared library or pie, then we
9645 need to define the symbol in the executable on a call stub.
9646 This is to avoid text relocations. */
9e390558
AM
9647 bfd_vma off, stub_align, stub_off, stub_size;
9648 unsigned int align_power;
9649
9650 stub_size = 16;
9651 stub_off = s->size;
9652 if (htab->params->plt_stub_align >= 0)
9653 align_power = htab->params->plt_stub_align;
9654 else
9655 align_power = -htab->params->plt_stub_align;
9656 /* Setting section alignment is delayed until we know it is
9657 non-empty. Otherwise the .text output section will be
9658 aligned at least to plt_stub_align even when no global
9659 entry stubs are needed. */
9660 if (s->alignment_power < align_power)
9661 s->alignment_power = align_power;
9662 stub_align = (bfd_vma) 1 << align_power;
9663 if (htab->params->plt_stub_align >= 0
9664 || ((((stub_off + stub_size - 1) & -stub_align)
9665 - (stub_off & -stub_align))
9666 > ((stub_size - 1) & -stub_align)))
9667 stub_off = (stub_off + stub_align - 1) & -stub_align;
9668 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
9669 off -= stub_off + s->output_offset + s->output_section->vma;
9670 /* Note that for --plt-stub-align negative we have a possible
9671 dependency between stub offset and size. Break that
9672 dependency by assuming the max stub size when calculating
9673 the stub offset. */
9674 if (PPC_HA (off) == 0)
9675 stub_size -= 4;
8a2058b5 9676 h->root.type = bfd_link_hash_defined;
afe397ea 9677 h->root.u.def.section = s;
9e390558
AM
9678 h->root.u.def.value = stub_off;
9679 s->size = stub_off + stub_size;
a345bc8d
AM
9680 break;
9681 }
9682 return TRUE;
9683}
9684
9685/* Set DF_TEXTREL if we find any dynamic relocs that apply to
9686 read-only sections. */
9687
9688static bfd_boolean
98bbb1b8 9689maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
a345bc8d 9690{
98bbb1b8
AM
9691 asection *sec;
9692
a345bc8d
AM
9693 if (h->root.type == bfd_link_hash_indirect)
9694 return TRUE;
9695
98bbb1b8
AM
9696 sec = readonly_dynrelocs (h);
9697 if (sec != NULL)
a345bc8d 9698 {
98bbb1b8
AM
9699 struct bfd_link_info *info = (struct bfd_link_info *) inf;
9700
9701 info->flags |= DF_TEXTREL;
2cdcc330
AM
9702 info->callbacks->minfo (_("%pB: dynamic relocation against `%pT'"
9703 " in read-only section `%pA'\n"),
9704 sec->owner, h->root.root.string, sec);
a345bc8d
AM
9705
9706 /* Not an error, just cut short the traversal. */
9707 return FALSE;
65f38f15 9708 }
b34976b6 9709 return TRUE;
65f38f15
AM
9710}
9711
9712/* Set the sizes of the dynamic sections. */
9713
b34976b6 9714static bfd_boolean
ee67d69a 9715ppc64_elf_size_dynamic_sections (bfd *output_bfd,
4ce794b7 9716 struct bfd_link_info *info)
65f38f15
AM
9717{
9718 struct ppc_link_hash_table *htab;
9719 bfd *dynobj;
9720 asection *s;
b34976b6 9721 bfd_boolean relocs;
65f38f15 9722 bfd *ibfd;
7865406b 9723 struct got_entry *first_tlsld;
65f38f15
AM
9724
9725 htab = ppc_hash_table (info);
4dfe6ac6
NC
9726 if (htab == NULL)
9727 return FALSE;
9728
65f38f15
AM
9729 dynobj = htab->elf.dynobj;
9730 if (dynobj == NULL)
9731 abort ();
9732
9733 if (htab->elf.dynamic_sections_created)
9734 {
9735 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 9736 if (bfd_link_executable (info) && !info->nointerp)
65f38f15 9737 {
3d4d4302 9738 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
9739 if (s == NULL)
9740 abort ();
eea6121a 9741 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
9742 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9743 }
9744 }
9745
9746 /* Set up .got offsets for local syms, and space for local dynamic
9747 relocs. */
c72f2fb2 9748 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
65f38f15 9749 {
411e1bfb
AM
9750 struct got_entry **lgot_ents;
9751 struct got_entry **end_lgot_ents;
e054468f
AM
9752 struct plt_entry **local_plt;
9753 struct plt_entry **end_local_plt;
f961d9dd 9754 unsigned char *lgot_masks;
65f38f15
AM
9755 bfd_size_type locsymcount;
9756 Elf_Internal_Shdr *symtab_hdr;
65f38f15 9757
0c8d6e5c 9758 if (!is_ppc64_elf (ibfd))
65f38f15
AM
9759 continue;
9760
9761 for (s = ibfd->sections; s != NULL; s = s->next)
9762 {
19e08130 9763 struct ppc_dyn_relocs *p;
65f38f15 9764
6edfbbad 9765 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 9766 {
ec338859
AM
9767 if (!bfd_is_abs_section (p->sec)
9768 && bfd_is_abs_section (p->sec->output_section))
9769 {
9770 /* Input section has been discarded, either because
9771 it is a copy of a linkonce section or due to
9772 linker script /DISCARD/, so we'll be discarding
9773 the relocs too. */
9774 }
248866a8 9775 else if (p->count != 0)
ec338859 9776 {
19e08130
AM
9777 asection *srel = elf_section_data (p->sec)->sreloc;
9778 if (p->ifunc)
33e44f2e 9779 srel = htab->elf.irelplt;
eea6121a 9780 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
9781 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9782 info->flags |= DF_TEXTREL;
ec338859 9783 }
65f38f15
AM
9784 }
9785 }
9786
411e1bfb
AM
9787 lgot_ents = elf_local_got_ents (ibfd);
9788 if (!lgot_ents)
65f38f15
AM
9789 continue;
9790
0ffa91dd 9791 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 9792 locsymcount = symtab_hdr->sh_info;
411e1bfb 9793 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
9794 local_plt = (struct plt_entry **) end_lgot_ents;
9795 end_local_plt = local_plt + locsymcount;
f961d9dd 9796 lgot_masks = (unsigned char *) end_local_plt;
e717da7e 9797 s = ppc64_elf_tdata (ibfd)->got;
e7b938ca 9798 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 9799 {
0b8bcf0d 9800 struct got_entry **pent, *ent;
411e1bfb 9801
0b8bcf0d
AM
9802 pent = lgot_ents;
9803 while ((ent = *pent) != NULL)
411e1bfb
AM
9804 if (ent->got.refcount > 0)
9805 {
e7b938ca 9806 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 9807 {
927be08e 9808 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 9809 *pent = ent->next;
411e1bfb
AM
9810 }
9811 else
9812 {
19e08130
AM
9813 unsigned int ent_size = 8;
9814 unsigned int rel_size = sizeof (Elf64_External_Rela);
9815
eea6121a 9816 ent->got.offset = s->size;
e7b938ca 9817 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 9818 {
19e08130
AM
9819 ent_size *= 2;
9820 rel_size *= 2;
9821 }
9822 s->size += ent_size;
37da22e5 9823 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 9824 {
33e44f2e 9825 htab->elf.irelplt->size += rel_size;
19e08130
AM
9826 htab->got_reli_size += rel_size;
9827 }
93370e8e
AM
9828 else if (bfd_link_pic (info)
9829 && !(ent->tls_type != 0
9830 && bfd_link_executable (info)))
19e08130
AM
9831 {
9832 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9833 srel->size += rel_size;
927be08e 9834 }
0b8bcf0d 9835 pent = &ent->next;
411e1bfb
AM
9836 }
9837 }
9838 else
0b8bcf0d 9839 *pent = ent->next;
65f38f15 9840 }
e054468f 9841
2d7ad24e
AM
9842 /* Allocate space for plt calls to local syms. */
9843 lgot_masks = (unsigned char *) end_local_plt;
9844 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
e054468f
AM
9845 {
9846 struct plt_entry *ent;
9847
9848 for (ent = *local_plt; ent != NULL; ent = ent->next)
9849 if (ent->plt.refcount > 0)
9850 {
2d7ad24e
AM
9851 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
9852 {
9853 s = htab->elf.iplt;
9854 ent->plt.offset = s->size;
9855 s->size += PLT_ENTRY_SIZE (htab);
9856 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
9857 }
3e04d765
AM
9858 else if (htab->can_convert_all_inline_plt
9859 || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
2d7ad24e
AM
9860 ent->plt.offset = (bfd_vma) -1;
9861 else
9862 {
9863 s = htab->pltlocal;
9864 ent->plt.offset = s->size;
9865 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
9866 if (bfd_link_pic (info))
9867 htab->relpltlocal->size += sizeof (Elf64_External_Rela);
9868 }
e054468f
AM
9869 }
9870 else
9871 ent->plt.offset = (bfd_vma) -1;
9872 }
65f38f15
AM
9873 }
9874
9875 /* Allocate global sym .plt and .got entries, and space for global
9876 sym dynamic relocs. */
4ce794b7 9877 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
a345bc8d 9878
0e1862bb 9879 if (!htab->opd_abi && !bfd_link_pic (info))
a345bc8d 9880 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
65f38f15 9881
7865406b 9882 first_tlsld = NULL;
c72f2fb2 9883 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
102890f0 9884 {
7865406b
AM
9885 struct got_entry *ent;
9886
0c8d6e5c 9887 if (!is_ppc64_elf (ibfd))
102890f0
AM
9888 continue;
9889
7865406b
AM
9890 ent = ppc64_tlsld_got (ibfd);
9891 if (ent->got.refcount > 0)
102890f0 9892 {
7865406b 9893 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 9894 {
7865406b
AM
9895 ent->is_indirect = TRUE;
9896 ent->got.ent = first_tlsld;
9897 }
9898 else
9899 {
9900 if (first_tlsld == NULL)
9901 first_tlsld = ent;
9902 s = ppc64_elf_tdata (ibfd)->got;
9903 ent->got.offset = s->size;
9904 ent->owner = ibfd;
9905 s->size += 16;
f749f26e 9906 if (bfd_link_dll (info))
7865406b
AM
9907 {
9908 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9909 srel->size += sizeof (Elf64_External_Rela);
9910 }
102890f0
AM
9911 }
9912 }
9913 else
7865406b 9914 ent->got.offset = (bfd_vma) -1;
102890f0
AM
9915 }
9916
65f38f15
AM
9917 /* We now have determined the sizes of the various dynamic sections.
9918 Allocate memory for them. */
b34976b6 9919 relocs = FALSE;
65f38f15
AM
9920 for (s = dynobj->sections; s != NULL; s = s->next)
9921 {
9922 if ((s->flags & SEC_LINKER_CREATED) == 0)
9923 continue;
9924
4ce794b7 9925 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
9926 /* These haven't been allocated yet; don't strip. */
9927 continue;
33e44f2e
AM
9928 else if (s == htab->elf.sgot
9929 || s == htab->elf.splt
9930 || s == htab->elf.iplt
2d7ad24e 9931 || s == htab->pltlocal
c456f082 9932 || s == htab->glink
9e390558 9933 || s == htab->global_entry
5474d94f
AM
9934 || s == htab->elf.sdynbss
9935 || s == htab->elf.sdynrelro)
65f38f15
AM
9936 {
9937 /* Strip this section if we don't need it; see the
9938 comment below. */
5bd4f169 9939 }
58d180e8
AM
9940 else if (s == htab->glink_eh_frame)
9941 {
9942 if (!bfd_is_abs_section (s->output_section))
9943 /* Not sized yet. */
9944 continue;
9945 }
70cc837d 9946 else if (CONST_STRNEQ (s->name, ".rela"))
5bd4f169 9947 {
c456f082 9948 if (s->size != 0)
5bd4f169 9949 {
33e44f2e 9950 if (s != htab->elf.srelplt)
b34976b6 9951 relocs = TRUE;
5bd4f169
AM
9952
9953 /* We use the reloc_count field as a counter if we need
9954 to copy relocs into the output file. */
9955 s->reloc_count = 0;
9956 }
9957 }
65f38f15 9958 else
5bd4f169
AM
9959 {
9960 /* It's not one of our sections, so don't allocate space. */
9961 continue;
9962 }
9963
eea6121a 9964 if (s->size == 0)
5bd4f169 9965 {
c456f082
AM
9966 /* If we don't need this section, strip it from the
9967 output file. This is mostly to handle .rela.bss and
9968 .rela.plt. We must create both sections in
9969 create_dynamic_sections, because they must be created
9970 before the linker maps input sections to output
9971 sections. The linker does that before
9972 adjust_dynamic_symbol is called, and it is that
9973 function which decides whether anything needs to go
9974 into these sections. */
8423293d 9975 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
9976 continue;
9977 }
9978
06bcf541
AM
9979 if (bfd_is_abs_section (s->output_section))
9980 _bfd_error_handler (_("warning: discarding dynamic section %s"),
9981 s->name);
9982
c456f082 9983 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
9984 continue;
9985
65f38f15
AM
9986 /* Allocate memory for the section contents. We use bfd_zalloc
9987 here in case unused entries are not reclaimed before the
9988 section's contents are written out. This should not happen,
411e1bfb
AM
9989 but this way if it does we get a R_PPC64_NONE reloc in .rela
9990 sections instead of garbage.
9991 We also rely on the section contents being zero when writing
5474d94f 9992 the GOT and .dynrelro. */
eea6121a 9993 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 9994 if (s->contents == NULL)
b34976b6 9995 return FALSE;
5bd4f169
AM
9996 }
9997
c72f2fb2 9998 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
e717da7e 9999 {
0c8d6e5c 10000 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
10001 continue;
10002
e717da7e 10003 s = ppc64_elf_tdata (ibfd)->got;
33e44f2e 10004 if (s != NULL && s != htab->elf.sgot)
e717da7e 10005 {
eea6121a 10006 if (s->size == 0)
8423293d 10007 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10008 else
10009 {
eea6121a 10010 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10011 if (s->contents == NULL)
10012 return FALSE;
10013 }
10014 }
10015 s = ppc64_elf_tdata (ibfd)->relgot;
10016 if (s != NULL)
10017 {
eea6121a 10018 if (s->size == 0)
8423293d 10019 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10020 else
10021 {
eea6121a 10022 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10023 if (s->contents == NULL)
10024 return FALSE;
10025 relocs = TRUE;
10026 s->reloc_count = 0;
10027 }
10028 }
10029 }
10030
e86ce104 10031 if (htab->elf.dynamic_sections_created)
5bd4f169 10032 {
e8910a83
AM
10033 bfd_boolean tls_opt;
10034
5bd4f169
AM
10035 /* Add some entries to the .dynamic section. We fill in the
10036 values later, in ppc64_elf_finish_dynamic_sections, but we
10037 must add the entries now so that we get the correct size for
10038 the .dynamic section. The DT_DEBUG entry is filled in by the
10039 dynamic linker and used by the debugger. */
dc810e39 10040#define add_dynamic_entry(TAG, VAL) \
5a580b3a 10041 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 10042
0e1862bb 10043 if (bfd_link_executable (info))
5bd4f169 10044 {
dc810e39 10045 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 10046 return FALSE;
5bd4f169
AM
10047 }
10048
33e44f2e 10049 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5bd4f169 10050 {
dc810e39
AM
10051 if (!add_dynamic_entry (DT_PLTGOT, 0)
10052 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10053 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
10054 || !add_dynamic_entry (DT_JMPREL, 0)
10055 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 10056 return FALSE;
5bd4f169
AM
10057 }
10058
ee67d69a 10059 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
10060 {
10061 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10062 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 10063 return FALSE;
19397422
AM
10064 }
10065
7c9cf415 10066 tls_opt = (htab->params->tls_get_addr_opt
e8910a83
AM
10067 && htab->tls_get_addr_fd != NULL
10068 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
10069 if (tls_opt || !htab->opd_abi)
10070 {
10071 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10072 return FALSE;
10073 }
a7f2871e 10074
5bd4f169
AM
10075 if (relocs)
10076 {
dc810e39
AM
10077 if (!add_dynamic_entry (DT_RELA, 0)
10078 || !add_dynamic_entry (DT_RELASZ, 0)
10079 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 10080 return FALSE;
5bd4f169 10081
65f38f15
AM
10082 /* If any dynamic relocs apply to a read-only section,
10083 then we need a DT_TEXTREL entry. */
248866a8 10084 if ((info->flags & DF_TEXTREL) == 0)
a345bc8d 10085 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
5bd4f169 10086
65f38f15 10087 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 10088 {
65f38f15 10089 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 10090 return FALSE;
5bd4f169 10091 }
5bd4f169 10092 }
5bd4f169 10093 }
65f38f15 10094#undef add_dynamic_entry
5bd4f169 10095
b34976b6 10096 return TRUE;
5bd4f169
AM
10097}
10098
a345bc8d
AM
10099/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10100
10101static bfd_boolean
10102ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10103{
10104 if (h->plt.plist != NULL
10105 && !h->def_regular
10106 && !h->pointer_equality_needed)
10107 return FALSE;
10108
10109 return _bfd_elf_hash_symbol (h);
10110}
10111
721956f4 10112/* Determine the type of stub needed, if any, for a call. */
5bd4f169 10113
4ce794b7
AM
10114static inline enum ppc_stub_type
10115ppc_type_of_stub (asection *input_sec,
10116 const Elf_Internal_Rela *rel,
10117 struct ppc_link_hash_entry **hash,
e054468f 10118 struct plt_entry **plt_ent,
6911b7dc
AM
10119 bfd_vma destination,
10120 unsigned long local_off)
5bd4f169 10121{
721956f4
AM
10122 struct ppc_link_hash_entry *h = *hash;
10123 bfd_vma location;
10124 bfd_vma branch_offset;
10125 bfd_vma max_branch_offset;
4ce794b7 10126 enum elf_ppc64_reloc_type r_type;
5bd4f169 10127
721956f4
AM
10128 if (h != NULL)
10129 {
e054468f 10130 struct plt_entry *ent;
7fe2b9a6 10131 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
10132 if (h->oh != NULL
10133 && h->oh->is_func_descriptor)
7b8f6675
AM
10134 {
10135 fdh = ppc_follow_link (h->oh);
10136 *hash = fdh;
10137 }
8387904d 10138
e054468f
AM
10139 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10140 if (ent->addend == rel->r_addend
10141 && ent->plt.offset != (bfd_vma) -1)
10142 {
e054468f
AM
10143 *plt_ent = ent;
10144 return ppc_stub_plt_call;
10145 }
5bd4f169 10146
7fe2b9a6
AM
10147 /* Here, we know we don't have a plt entry. If we don't have a
10148 either a defined function descriptor or a defined entry symbol
10149 in a regular object file, then it is pointless trying to make
10150 any other type of stub. */
854b41e7
AM
10151 if (!is_static_defined (&fdh->elf)
10152 && !is_static_defined (&h->elf))
721956f4 10153 return ppc_stub_none;
5d1634d7 10154 }
e054468f
AM
10155 else if (elf_local_got_ents (input_sec->owner) != NULL)
10156 {
10157 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10158 struct plt_entry **local_plt = (struct plt_entry **)
10159 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10160 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10161
10162 if (local_plt[r_symndx] != NULL)
10163 {
10164 struct plt_entry *ent;
10165
10166 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10167 if (ent->addend == rel->r_addend
10168 && ent->plt.offset != (bfd_vma) -1)
10169 {
10170 *plt_ent = ent;
10171 return ppc_stub_plt_call;
10172 }
10173 }
10174 }
5d1634d7 10175
721956f4
AM
10176 /* Determine where the call point is. */
10177 location = (input_sec->output_offset
10178 + input_sec->output_section->vma
10179 + rel->r_offset);
5d1634d7 10180
721956f4
AM
10181 branch_offset = destination - location;
10182 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 10183
721956f4
AM
10184 /* Determine if a long branch stub is needed. */
10185 max_branch_offset = 1 << 25;
23cedd1d
AM
10186 if (r_type == R_PPC64_REL14
10187 || r_type == R_PPC64_REL14_BRTAKEN
10188 || r_type == R_PPC64_REL14_BRNTAKEN)
721956f4 10189 max_branch_offset = 1 << 15;
5d1634d7 10190
6911b7dc 10191 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
721956f4
AM
10192 /* We need a stub. Figure out whether a long_branch or plt_branch
10193 is needed later. */
10194 return ppc_stub_long_branch;
5d1634d7 10195
721956f4 10196 return ppc_stub_none;
5d1634d7
AM
10197}
10198
f891966f
AM
10199/* Gets the address of a label (1:) in r11 and builds an offset in r12,
10200 then adds it to r11 (LOAD false) or loads r12 from r11+r12 (LOAD true).
10201 . mflr %r12
10202 . bcl 20,31,1f
10203 .1: mflr %r11
10204 . mtlr %r12
05d0e962 10205 . lis %r12,xxx-1b@highest
f891966f 10206 . ori %r12,%r12,xxx-1b@higher
05d0e962 10207 . sldi %r12,%r12,32
f891966f 10208 . oris %r12,%r12,xxx-1b@high
05d0e962 10209 . ori %r12,%r12,xxx-1b@l
f891966f 10210 . add/ldx %r12,%r11,%r12 */
05d0e962
AM
10211
10212static bfd_byte *
10213build_offset (bfd *abfd, bfd_byte *p, bfd_vma off, bfd_boolean load)
10214{
f891966f
AM
10215 bfd_put_32 (abfd, MFLR_R12, p);
10216 p += 4;
10217 bfd_put_32 (abfd, BCL_20_31, p);
10218 p += 4;
10219 bfd_put_32 (abfd, MFLR_R11, p);
10220 p += 4;
10221 bfd_put_32 (abfd, MTLR_R12, p);
10222 p += 4;
05d0e962
AM
10223 if (off + 0x8000 < 0x10000)
10224 {
10225 if (load)
10226 bfd_put_32 (abfd, LD_R12_0R11 + PPC_LO (off), p);
10227 else
10228 bfd_put_32 (abfd, ADDI_R12_R11 + PPC_LO (off), p);
10229 p += 4;
10230 }
10231 else if (off + 0x80008000ULL < 0x100000000ULL)
10232 {
10233 bfd_put_32 (abfd, ADDIS_R12_R11 + PPC_HA (off), p);
10234 p += 4;
10235 if (load)
10236 bfd_put_32 (abfd, LD_R12_0R12 + PPC_LO (off), p);
10237 else
10238 bfd_put_32 (abfd, ADDI_R12_R12 + PPC_LO (off), p);
10239 p += 4;
10240 }
10241 else
10242 {
10243 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10244 {
10245 bfd_put_32 (abfd, LI_R12_0 + ((off >> 32) & 0xffff), p);
10246 p += 4;
10247 }
10248 else
10249 {
10250 bfd_put_32 (abfd, LIS_R12 + ((off >> 48) & 0xffff), p);
10251 p += 4;
10252 if (((off >> 32) & 0xffff) != 0)
10253 {
10254 bfd_put_32 (abfd, ORI_R12_R12_0 + ((off >> 32) & 0xffff), p);
10255 p += 4;
10256 }
10257 }
10258 if (((off >> 32) & 0xffffffffULL) != 0)
10259 {
10260 bfd_put_32 (abfd, SLDI_R12_R12_32, p);
10261 p += 4;
10262 }
10263 if (PPC_HI (off) != 0)
10264 {
10265 bfd_put_32 (abfd, ORIS_R12_R12_0 + PPC_HI (off), p);
10266 p += 4;
10267 }
10268 if (PPC_LO (off) != 0)
10269 {
10270 bfd_put_32 (abfd, ORI_R12_R12_0 + PPC_LO (off), p);
10271 p += 4;
10272 }
10273 if (load)
10274 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10275 else
10276 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10277 p += 4;
10278 }
10279 return p;
10280}
10281
10282static unsigned int
10283size_offset (bfd_vma off)
10284{
10285 unsigned int size;
10286 if (off + 0x8000 < 0x10000)
10287 size = 4;
10288 else if (off + 0x80008000ULL < 0x100000000ULL)
10289 size = 8;
10290 else
10291 {
10292 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10293 size = 4;
10294 else
10295 {
10296 size = 4;
10297 if (((off >> 32) & 0xffff) != 0)
10298 size += 4;
10299 }
10300 if (((off >> 32) & 0xffffffffULL) != 0)
10301 size += 4;
10302 if (PPC_HI (off) != 0)
10303 size += 4;
10304 if (PPC_LO (off) != 0)
10305 size += 4;
10306 size += 4;
10307 }
f891966f 10308 return size + 16;
05d0e962
AM
10309}
10310
3d58e1fc
AM
10311static unsigned int
10312num_relocs_for_offset (bfd_vma off)
10313{
10314 unsigned int num_rel;
10315 if (off + 0x8000 < 0x10000)
10316 num_rel = 1;
10317 else if (off + 0x80008000ULL < 0x100000000ULL)
10318 num_rel = 2;
10319 else
10320 {
10321 num_rel = 1;
10322 if (off + 0x800000000000ULL >= 0x1000000000000ULL
10323 && ((off >> 32) & 0xffff) != 0)
10324 num_rel += 1;
10325 if (PPC_HI (off) != 0)
10326 num_rel += 1;
10327 if (PPC_LO (off) != 0)
10328 num_rel += 1;
10329 }
10330 return num_rel;
10331}
10332
10333static Elf_Internal_Rela *
10334emit_relocs_for_offset (struct bfd_link_info *info, Elf_Internal_Rela *r,
10335 bfd_vma roff, bfd_vma targ, bfd_vma off)
10336{
10337 bfd_vma relative_targ = targ - (roff - 8);
10338 if (bfd_big_endian (info->output_bfd))
10339 roff += 2;
10340 r->r_offset = roff;
10341 r->r_addend = relative_targ + roff;
10342 if (off + 0x8000 < 0x10000)
10343 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16);
10344 else if (off + 0x80008000ULL < 0x100000000ULL)
10345 {
10346 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HA);
10347 ++r;
10348 roff += 4;
10349 r->r_offset = roff;
10350 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10351 r->r_addend = relative_targ + roff;
10352 }
10353 else
10354 {
10355 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10356 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10357 else
10358 {
10359 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHEST);
10360 if (((off >> 32) & 0xffff) != 0)
10361 {
10362 ++r;
10363 roff += 4;
10364 r->r_offset = roff;
10365 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10366 r->r_addend = relative_targ + roff;
10367 }
10368 }
10369 if (((off >> 32) & 0xffffffffULL) != 0)
10370 roff += 4;
10371 if (PPC_HI (off) != 0)
10372 {
10373 ++r;
10374 roff += 4;
10375 r->r_offset = roff;
10376 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGH);
10377 r->r_addend = relative_targ + roff;
10378 }
10379 if (PPC_LO (off) != 0)
10380 {
10381 ++r;
10382 roff += 4;
10383 r->r_offset = roff;
10384 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10385 r->r_addend = relative_targ + roff;
10386 }
10387 }
10388 return r;
10389}
10390
04bdff6a
AM
10391static bfd_byte *
10392build_powerxx_offset (bfd *abfd, bfd_byte *p, bfd_vma off, int odd,
10393 bfd_boolean load)
10394{
10395 uint64_t insn;
10396 if (off - odd + (1ULL << 33) < 1ULL << 34)
10397 {
10398 off -= odd;
10399 if (odd)
10400 {
10401 bfd_put_32 (abfd, NOP, p);
10402 p += 4;
10403 }
10404 if (load)
10405 insn = PLD_R12_PC;
10406 else
10407 insn = PADDI_R12_PC;
10408 insn |= D34 (off);
10409 bfd_put_32 (abfd, insn >> 32, p);
10410 p += 4;
10411 bfd_put_32 (abfd, insn, p);
10412 }
10413 /* The minimum value for paddi is -0x200000000. The minimum value
10414 for li is -0x8000, which when shifted by 34 and added gives a
10415 minimum value of -0x2000200000000. The maximum value is
10416 0x1ffffffff+0x7fff<<34 which is 0x2000200000000-1. */
10417 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10418 {
10419 off -= 8 - odd;
10420 bfd_put_32 (abfd, LI_R11_0 | (HA34 (off) & 0xffff), p);
10421 p += 4;
10422 if (!odd)
10423 {
10424 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10425 p += 4;
10426 }
10427 insn = PADDI_R12_PC | D34 (off);
10428 bfd_put_32 (abfd, insn >> 32, p);
10429 p += 4;
10430 bfd_put_32 (abfd, insn, p);
10431 p += 4;
10432 if (odd)
10433 {
10434 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10435 p += 4;
10436 }
10437 if (load)
10438 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10439 else
10440 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10441 }
10442 else
10443 {
10444 off -= odd + 8;
10445 bfd_put_32 (abfd, LIS_R11 | ((HA34 (off) >> 16) & 0x3fff), p);
10446 p += 4;
10447 bfd_put_32 (abfd, ORI_R11_R11_0 | (HA34 (off) & 0xffff), p);
10448 p += 4;
10449 if (odd)
10450 {
10451 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10452 p += 4;
10453 }
10454 insn = PADDI_R12_PC | D34 (off);
10455 bfd_put_32 (abfd, insn >> 32, p);
10456 p += 4;
10457 bfd_put_32 (abfd, insn, p);
10458 p += 4;
10459 if (!odd)
10460 {
10461 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10462 p += 4;
10463 }
10464 if (load)
10465 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10466 else
10467 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10468 }
10469 p += 4;
10470 return p;
10471}
10472
10473static unsigned int
10474size_powerxx_offset (bfd_vma off, int odd)
10475{
10476 if (off - odd + (1ULL << 33) < 1ULL << 34)
10477 return odd + 8;
10478 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10479 return 20;
10480 else
10481 return 24;
10482}
10483
10484static unsigned int
10485num_relocs_for_powerxx_offset (bfd_vma off, int odd)
10486{
10487 if (off - odd + (1ULL << 33) < 1ULL << 34)
10488 return 1;
10489 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10490 return 2;
10491 else
10492 return 3;
10493}
10494
10495static Elf_Internal_Rela *
10496emit_relocs_for_powerxx_offset (struct bfd_link_info *info,
10497 Elf_Internal_Rela *r, bfd_vma roff,
10498 bfd_vma targ, bfd_vma off, int odd)
10499{
10500 if (off - odd + (1ULL << 33) < 1ULL << 34)
10501 roff += odd;
10502 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10503 {
10504 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10505 r->r_offset = roff + d_offset;
10506 r->r_addend = targ + 8 - odd - d_offset;
10507 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10508 ++r;
10509 roff += 8 - odd;
10510 }
10511 else
10512 {
10513 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
10514 r->r_offset = roff + d_offset;
10515 r->r_addend = targ + 8 + odd - d_offset;
10516 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHESTA34);
10517 ++r;
10518 roff += 4;
10519 r->r_offset = roff + d_offset;
10520 r->r_addend = targ + 4 + odd - d_offset;
10521 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
10522 ++r;
10523 roff += 4 + odd;
10524 }
10525 r->r_offset = roff;
10526 r->r_addend = targ;
10527 r->r_info = ELF64_R_INFO (0, R_PPC64_PCREL34);
10528 return r;
10529}
10530
df136d64
AM
10531/* Emit .eh_frame opcode to advance pc by DELTA. */
10532
10533static bfd_byte *
10534eh_advance (bfd *abfd, bfd_byte *eh, unsigned int delta)
10535{
10536 delta /= 4;
10537 if (delta < 64)
10538 *eh++ = DW_CFA_advance_loc + delta;
10539 else if (delta < 256)
10540 {
10541 *eh++ = DW_CFA_advance_loc1;
10542 *eh++ = delta;
10543 }
10544 else if (delta < 65536)
10545 {
10546 *eh++ = DW_CFA_advance_loc2;
10547 bfd_put_16 (abfd, delta, eh);
10548 eh += 2;
10549 }
10550 else
10551 {
10552 *eh++ = DW_CFA_advance_loc4;
10553 bfd_put_32 (abfd, delta, eh);
10554 eh += 4;
10555 }
10556 return eh;
10557}
10558
10559/* Size of required .eh_frame opcode to advance pc by DELTA. */
10560
10561static unsigned int
10562eh_advance_size (unsigned int delta)
10563{
10564 if (delta < 64 * 4)
10565 /* DW_CFA_advance_loc+[1..63]. */
10566 return 1;
10567 if (delta < 256 * 4)
10568 /* DW_CFA_advance_loc1, byte. */
10569 return 2;
10570 if (delta < 65536 * 4)
10571 /* DW_CFA_advance_loc2, 2 bytes. */
10572 return 3;
10573 /* DW_CFA_advance_loc4, 4 bytes. */
10574 return 5;
10575}
10576
794e51c0
AM
10577/* With power7 weakly ordered memory model, it is possible for ld.so
10578 to update a plt entry in one thread and have another thread see a
10579 stale zero toc entry. To avoid this we need some sort of acquire
10580 barrier in the call stub. One solution is to make the load of the
10581 toc word seem to appear to depend on the load of the function entry
10582 word. Another solution is to test for r2 being zero, and branch to
10583 the appropriate glink entry if so.
10584
10585 . fake dep barrier compare
71a39c98
AM
10586 . ld 12,xxx(2) ld 12,xxx(2)
10587 . mtctr 12 mtctr 12
10588 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
10589 . add 2,2,11 cmpldi 2,0
10590 . ld 2,xxx+8(2) bnectr+
10591 . bctr b <glink_entry>
10592
10593 The solution involving the compare turns out to be faster, so
10594 that's what we use unless the branch won't reach. */
10595
10596#define ALWAYS_USE_FAKE_DEP 0
10597#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 10598
794e51c0
AM
10599static inline unsigned int
10600plt_stub_size (struct ppc_link_hash_table *htab,
10601 struct ppc_stub_hash_entry *stub_entry,
10602 bfd_vma off)
10603{
05d0e962 10604 unsigned size;
b9e5796b 10605
05d0e962
AM
10606 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
10607 {
04bdff6a
AM
10608 if (htab->powerxx_stubs)
10609 {
10610 bfd_vma start = (stub_entry->stub_offset
10611 + stub_entry->group->stub_sec->output_offset
10612 + stub_entry->group->stub_sec->output_section->vma);
10613 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10614 start += 4;
10615 size = 8 + size_powerxx_offset (off, start & 4);
10616 }
10617 else
10618 size = 8 + size_offset (off - 8);
05d0e962
AM
10619 if (stub_entry->stub_type > ppc_stub_plt_call_notoc)
10620 size += 4;
10621 return size;
10622 }
10623
10624 size = 12;
b9e5796b
AM
10625 if (ALWAYS_EMIT_R2SAVE
10626 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10627 size += 4;
10628 if (PPC_HA (off) != 0)
794e51c0 10629 size += 4;
b9e5796b
AM
10630 if (htab->opd_abi)
10631 {
10632 size += 4;
e7d1c40c 10633 if (htab->params->plt_static_chain)
b9e5796b 10634 size += 4;
bd4d2eaa
AM
10635 if (htab->params->plt_thread_safe
10636 && htab->elf.dynamic_sections_created
10637 && stub_entry->h != NULL
10638 && stub_entry->h->elf.dynindx != -1)
b9e5796b 10639 size += 8;
e7d1c40c 10640 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
b9e5796b
AM
10641 size += 4;
10642 }
794e51c0
AM
10643 if (stub_entry->h != NULL
10644 && (stub_entry->h == htab->tls_get_addr_fd
10645 || stub_entry->h == htab->tls_get_addr)
7c9cf415 10646 && htab->params->tls_get_addr_opt)
f378ab09
AM
10647 {
10648 size += 7 * 4;
e81b4c93 10649 if (stub_entry->stub_type == ppc_stub_plt_call_r2save)
407aa07c 10650 size += 6 * 4;
f378ab09 10651 }
794e51c0
AM
10652 return size;
10653}
10654
2420fff6
AM
10655/* Depending on the sign of plt_stub_align:
10656 If positive, return the padding to align to a 2**plt_stub_align
10657 boundary.
10658 If negative, if this stub would cross fewer 2**plt_stub_align
10659 boundaries if we align, then return the padding needed to do so. */
10660
794e51c0
AM
10661static inline unsigned int
10662plt_stub_pad (struct ppc_link_hash_table *htab,
10663 struct ppc_stub_hash_entry *stub_entry,
10664 bfd_vma plt_off)
10665{
2420fff6 10666 int stub_align;
1aa42141 10667 unsigned stub_size;
6f20ed8a 10668 bfd_vma stub_off = stub_entry->group->stub_sec->size;
794e51c0 10669
2420fff6
AM
10670 if (htab->params->plt_stub_align >= 0)
10671 {
10672 stub_align = 1 << htab->params->plt_stub_align;
10673 if ((stub_off & (stub_align - 1)) != 0)
10674 return stub_align - (stub_off & (stub_align - 1));
10675 return 0;
10676 }
10677
10678 stub_align = 1 << -htab->params->plt_stub_align;
1aa42141 10679 stub_size = plt_stub_size (htab, stub_entry, plt_off);
794e51c0 10680 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
e05fa0ba 10681 > ((stub_size - 1) & -stub_align))
794e51c0
AM
10682 return stub_align - (stub_off & (stub_align - 1));
10683 return 0;
10684}
10685
10686/* Build a .plt call stub. */
10687
10688static inline bfd_byte *
10689build_plt_stub (struct ppc_link_hash_table *htab,
10690 struct ppc_stub_hash_entry *stub_entry,
10691 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10692{
e7d1c40c 10693 bfd *obfd = htab->params->stub_bfd;
b9e5796b 10694 bfd_boolean plt_load_toc = htab->opd_abi;
e7d1c40c 10695 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
bd4d2eaa
AM
10696 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10697 && htab->elf.dynamic_sections_created
10698 && stub_entry->h != NULL
10699 && stub_entry->h->elf.dynindx != -1);
794e51c0
AM
10700 bfd_boolean use_fake_dep = plt_thread_safe;
10701 bfd_vma cmp_branch_off = 0;
10702
10703 if (!ALWAYS_USE_FAKE_DEP
b9e5796b 10704 && plt_load_toc
794e51c0 10705 && plt_thread_safe
bd4d2eaa
AM
10706 && !((stub_entry->h == htab->tls_get_addr_fd
10707 || stub_entry->h == htab->tls_get_addr)
7c9cf415 10708 && htab->params->tls_get_addr_opt))
794e51c0
AM
10709 {
10710 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
b9e5796b
AM
10711 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10712 / PLT_ENTRY_SIZE (htab));
9e390558 10713 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8;
794e51c0
AM
10714 bfd_vma to, from;
10715
68d62958
AM
10716 if (pltindex > 32768)
10717 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
10718 to = (glinkoff
10719 + htab->glink->output_offset
10720 + htab->glink->output_section->vma);
6f20ed8a 10721 from = (p - stub_entry->group->stub_sec->contents
794e51c0
AM
10722 + 4 * (ALWAYS_EMIT_R2SAVE
10723 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10724 + 4 * (PPC_HA (offset) != 0)
10725 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10726 != PPC_HA (offset))
10727 + 4 * (plt_static_chain != 0)
10728 + 20
6f20ed8a
AM
10729 + stub_entry->group->stub_sec->output_offset
10730 + stub_entry->group->stub_sec->output_section->vma);
794e51c0
AM
10731 cmp_branch_off = to - from;
10732 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10733 }
10734
ac2df442
AM
10735 if (PPC_HA (offset) != 0)
10736 {
176a0d42
AM
10737 if (r != NULL)
10738 {
794e51c0
AM
10739 if (ALWAYS_EMIT_R2SAVE
10740 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10741 r[0].r_offset += 4;
176a0d42 10742 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 10743 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
10744 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10745 r[1].r_addend = r[0].r_addend;
b9e5796b 10746 if (plt_load_toc)
176a0d42 10747 {
b9e5796b 10748 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10749 {
b9e5796b
AM
10750 r[2].r_offset = r[1].r_offset + 4;
10751 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10752 r[2].r_addend = r[0].r_addend;
10753 }
10754 else
10755 {
10756 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10757 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10758 r[2].r_addend = r[0].r_addend + 8;
10759 if (plt_static_chain)
10760 {
10761 r[3].r_offset = r[2].r_offset + 4;
10762 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10763 r[3].r_addend = r[0].r_addend + 16;
10764 }
c7131b65 10765 }
176a0d42
AM
10766 }
10767 }
794e51c0
AM
10768 if (ALWAYS_EMIT_R2SAVE
10769 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10770 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
397998fc
AM
10771 if (plt_load_toc)
10772 {
10773 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10774 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10775 }
10776 else
10777 {
10778 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10779 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10780 }
b9e5796b
AM
10781 if (plt_load_toc
10782 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 10783 {
71a39c98 10784 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
10785 offset = 0;
10786 }
71a39c98 10787 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10788 if (plt_load_toc)
794e51c0 10789 {
b9e5796b
AM
10790 if (use_fake_dep)
10791 {
10792 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10793 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10794 }
10795 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10796 if (plt_static_chain)
10797 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
794e51c0 10798 }
ac2df442
AM
10799 }
10800 else
10801 {
176a0d42
AM
10802 if (r != NULL)
10803 {
794e51c0
AM
10804 if (ALWAYS_EMIT_R2SAVE
10805 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10806 r[0].r_offset += 4;
176a0d42 10807 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
b9e5796b 10808 if (plt_load_toc)
176a0d42 10809 {
b9e5796b 10810 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10811 {
b9e5796b
AM
10812 r[1].r_offset = r[0].r_offset + 4;
10813 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10814 r[1].r_addend = r[0].r_addend;
10815 }
10816 else
10817 {
10818 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10819 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10820 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10821 if (plt_static_chain)
10822 {
10823 r[2].r_offset = r[1].r_offset + 4;
10824 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10825 r[2].r_addend = r[0].r_addend + 8;
10826 }
c7131b65 10827 }
176a0d42
AM
10828 }
10829 }
794e51c0
AM
10830 if (ALWAYS_EMIT_R2SAVE
10831 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10832 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
71a39c98 10833 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
b9e5796b
AM
10834 if (plt_load_toc
10835 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
10836 {
10837 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10838 offset = 0;
10839 }
71a39c98 10840 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10841 if (plt_load_toc)
794e51c0 10842 {
b9e5796b
AM
10843 if (use_fake_dep)
10844 {
10845 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10846 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10847 }
10848 if (plt_static_chain)
10849 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10850 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
794e51c0 10851 }
ac2df442 10852 }
b9e5796b 10853 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
794e51c0
AM
10854 {
10855 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10856 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 10857 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
10858 }
10859 else
407aa07c 10860 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
10861 return p;
10862}
10863
a7f2871e
AM
10864/* Build a special .plt call stub for __tls_get_addr. */
10865
10866#define LD_R11_0R3 0xe9630000
10867#define LD_R12_0R3 0xe9830000
10868#define MR_R0_R3 0x7c601b78
10869#define CMPDI_R11_0 0x2c2b0000
10870#define ADD_R3_R12_R13 0x7c6c6a14
10871#define BEQLR 0x4d820020
10872#define MR_R3_R0 0x7c030378
a7f2871e
AM
10873#define STD_R11_0R1 0xf9610000
10874#define BCTRL 0x4e800421
10875#define LD_R11_0R1 0xe9610000
a7f2871e
AM
10876#define MTLR_R11 0x7d6803a6
10877
10878static inline bfd_byte *
794e51c0
AM
10879build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10880 struct ppc_stub_hash_entry *stub_entry,
10881 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 10882{
e7d1c40c 10883 bfd *obfd = htab->params->stub_bfd;
df136d64 10884 bfd_byte *loc = p;
794e51c0 10885
a7f2871e
AM
10886 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10887 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10888 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10889 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10890 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10891 bfd_put_32 (obfd, BEQLR, p), p += 4;
10892 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
f378ab09
AM
10893 if (r != NULL)
10894 r[0].r_offset += 7 * 4;
e81b4c93 10895 if (stub_entry->stub_type != ppc_stub_plt_call_r2save)
f378ab09
AM
10896 return build_plt_stub (htab, stub_entry, p, offset, r);
10897
a7f2871e 10898 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
a078d95a 10899 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
10900
10901 if (r != NULL)
f378ab09 10902 r[0].r_offset += 2 * 4;
794e51c0 10903 p = build_plt_stub (htab, stub_entry, p, offset, r);
407aa07c 10904 bfd_put_32 (obfd, BCTRL, p - 4);
a7f2871e 10905
a078d95a 10906 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
bd4d2eaa 10907 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
10908 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10909 bfd_put_32 (obfd, BLR, p), p += 4;
10910
df136d64
AM
10911 if (htab->glink_eh_frame != NULL
10912 && htab->glink_eh_frame->size != 0)
10913 {
10914 bfd_byte *base, *eh;
10915 unsigned int lr_used, delta;
10916
10917 base = htab->glink_eh_frame->contents + stub_entry->group->eh_base + 17;
10918 eh = base + stub_entry->group->eh_size;
10919 lr_used = stub_entry->stub_offset + (p - 20 - loc);
10920 delta = lr_used - stub_entry->group->lr_restore;
10921 stub_entry->group->lr_restore = lr_used + 16;
10922 eh = eh_advance (htab->elf.dynobj, eh, delta);
10923 *eh++ = DW_CFA_offset_extended_sf;
10924 *eh++ = 65;
10925 *eh++ = -(STK_LINKER (htab) / 8) & 0x7f;
10926 *eh++ = DW_CFA_advance_loc + 4;
10927 *eh++ = DW_CFA_restore_extended;
10928 *eh++ = 65;
10929 stub_entry->group->eh_size = eh - base;
10930 }
a7f2871e
AM
10931 return p;
10932}
10933
176a0d42
AM
10934static Elf_Internal_Rela *
10935get_relocs (asection *sec, int count)
10936{
10937 Elf_Internal_Rela *relocs;
10938 struct bfd_elf_section_data *elfsec_data;
10939
10940 elfsec_data = elf_section_data (sec);
10941 relocs = elfsec_data->relocs;
10942 if (relocs == NULL)
10943 {
10944 bfd_size_type relsize;
10945 relsize = sec->reloc_count * sizeof (*relocs);
10946 relocs = bfd_alloc (sec->owner, relsize);
10947 if (relocs == NULL)
10948 return NULL;
10949 elfsec_data->relocs = relocs;
d4730f92
BS
10950 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10951 sizeof (Elf_Internal_Shdr));
10952 if (elfsec_data->rela.hdr == NULL)
10953 return NULL;
10954 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10955 * sizeof (Elf64_External_Rela));
10956 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
10957 sec->reloc_count = 0;
10958 }
10959 relocs += sec->reloc_count;
10960 sec->reloc_count += count;
10961 return relocs;
10962}
10963
3d58e1fc
AM
10964/* Convert the relocs R[0] thru R[-NUM_REL+1], which are all no-symbol
10965 forms, to the equivalent relocs against the global symbol given by
10966 STUB_ENTRY->H. */
10967
10968static bfd_boolean
10969use_global_in_relocs (struct ppc_link_hash_table *htab,
10970 struct ppc_stub_hash_entry *stub_entry,
10971 Elf_Internal_Rela *r, unsigned int num_rel)
10972{
10973 struct elf_link_hash_entry **hashes;
10974 unsigned long symndx;
10975 struct ppc_link_hash_entry *h;
10976 bfd_vma symval;
10977
10978 /* Relocs are always against symbols in their own object file. Fake
10979 up global sym hashes for the stub bfd (which has no symbols). */
10980 hashes = elf_sym_hashes (htab->params->stub_bfd);
10981 if (hashes == NULL)
10982 {
10983 bfd_size_type hsize;
10984
10985 /* When called the first time, stub_globals will contain the
10986 total number of symbols seen during stub sizing. After
10987 allocating, stub_globals is used as an index to fill the
10988 hashes array. */
10989 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
10990 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
10991 if (hashes == NULL)
10992 return FALSE;
10993 elf_sym_hashes (htab->params->stub_bfd) = hashes;
10994 htab->stub_globals = 1;
10995 }
10996 symndx = htab->stub_globals++;
10997 h = stub_entry->h;
10998 hashes[symndx] = &h->elf;
10999 if (h->oh != NULL && h->oh->is_func)
11000 h = ppc_follow_link (h->oh);
11001 BFD_ASSERT (h->elf.root.type == bfd_link_hash_defined
11002 || h->elf.root.type == bfd_link_hash_defweak);
11003 symval = (h->elf.root.u.def.value
11004 + h->elf.root.u.def.section->output_offset
11005 + h->elf.root.u.def.section->output_section->vma);
11006 while (num_rel-- != 0)
11007 {
11008 r->r_info = ELF64_R_INFO (symndx, ELF64_R_TYPE (r->r_info));
11009 if (h->elf.root.u.def.section != stub_entry->target_section)
11010 {
11011 /* H is an opd symbol. The addend must be zero, and the
11012 branch reloc is the only one we can convert. */
11013 r->r_addend = 0;
11014 break;
11015 }
11016 else
11017 r->r_addend -= symval;
11018 --r;
11019 }
11020 return TRUE;
11021}
11022
aa374f67 11023static bfd_vma
25f53a85 11024get_r2off (struct bfd_link_info *info,
aa374f67
AM
11025 struct ppc_stub_hash_entry *stub_entry)
11026{
25f53a85 11027 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 11028 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
aa374f67
AM
11029
11030 if (r2off == 0)
11031 {
11032 /* Support linking -R objects. Get the toc pointer from the
11033 opd entry. */
11034 char buf[8];
b9e5796b
AM
11035 if (!htab->opd_abi)
11036 return r2off;
aa374f67
AM
11037 asection *opd = stub_entry->h->elf.root.u.def.section;
11038 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
11039
11040 if (strcmp (opd->name, ".opd") != 0
11041 || opd->reloc_count != 0)
11042 {
2cdcc330
AM
11043 info->callbacks->einfo
11044 (_("%P: cannot find opd entry toc for `%pT'\n"),
11045 stub_entry->h->elf.root.root.string);
aa374f67 11046 bfd_set_error (bfd_error_bad_value);
a7c49797 11047 return (bfd_vma) -1;
aa374f67
AM
11048 }
11049 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
a7c49797 11050 return (bfd_vma) -1;
aa374f67 11051 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 11052 r2off -= elf_gp (info->output_bfd);
aa374f67 11053 }
6f20ed8a 11054 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
aa374f67
AM
11055 return r2off;
11056}
11057
b34976b6 11058static bfd_boolean
4ce794b7 11059ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 11060{
721956f4
AM
11061 struct ppc_stub_hash_entry *stub_entry;
11062 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
11063 struct bfd_link_info *info;
11064 struct ppc_link_hash_table *htab;
721956f4 11065 bfd_byte *loc;
3d58e1fc 11066 bfd_byte *p, *relp;
1aa42141 11067 bfd_vma targ, off;
176a0d42 11068 Elf_Internal_Rela *r;
e054468f 11069 asection *plt;
3d58e1fc 11070 int num_rel;
04bdff6a 11071 int odd;
5d1634d7 11072
721956f4
AM
11073 /* Massage our args to the form they really have. */
11074 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 11075 info = in_arg;
5d1634d7 11076
5d1634d7 11077 htab = ppc_hash_table (info);
4dfe6ac6
NC
11078 if (htab == NULL)
11079 return FALSE;
5d1634d7 11080
1aa42141 11081 BFD_ASSERT (stub_entry->stub_offset >= stub_entry->group->stub_sec->size);
6f20ed8a 11082 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
721956f4 11083
4ce794b7 11084 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 11085 switch (stub_entry->stub_type)
5d1634d7 11086 {
721956f4 11087 case ppc_stub_long_branch:
ad8e1ba5 11088 case ppc_stub_long_branch_r2off:
721956f4 11089 /* Branches are relative. This is where we are going to. */
1aa42141 11090 targ = (stub_entry->target_value
6911b7dc
AM
11091 + stub_entry->target_section->output_offset
11092 + stub_entry->target_section->output_section->vma);
1aa42141 11093 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
5d1634d7 11094
721956f4 11095 /* And this is where we are coming from. */
1aa42141
AM
11096 off = (stub_entry->stub_offset
11097 + stub_entry->group->stub_sec->output_offset
11098 + stub_entry->group->stub_sec->output_section->vma);
11099 off = targ - off;
e86ce104 11100
9e390558 11101 p = loc;
ac2df442 11102 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 11103 {
25f53a85 11104 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 11105
a7c49797 11106 if (r2off == (bfd_vma) -1)
aa374f67
AM
11107 {
11108 htab->stub_error = TRUE;
11109 return FALSE;
11110 }
9e390558
AM
11111 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11112 p += 4;
ac2df442
AM
11113 if (PPC_HA (r2off) != 0)
11114 {
e7d1c40c 11115 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11116 ADDIS_R2_R2 | PPC_HA (r2off), p);
11117 p += 4;
a7c49797
AM
11118 }
11119 if (PPC_LO (r2off) != 0)
11120 {
11121 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11122 ADDI_R2_R2 | PPC_LO (r2off), p);
11123 p += 4;
ac2df442 11124 }
9e390558 11125 off -= p - loc;
ad8e1ba5 11126 }
9e390558
AM
11127 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p);
11128 p += 4;
ad8e1ba5 11129
5c3dead3
AM
11130 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11131 {
cf97bcb0
AM
11132 _bfd_error_handler
11133 (_("long branch stub `%s' offset overflow"),
bc30df16 11134 stub_entry->root.string);
5c3dead3
AM
11135 htab->stub_error = TRUE;
11136 return FALSE;
11137 }
ee75fd95
AM
11138
11139 if (info->emitrelocations)
11140 {
6f20ed8a 11141 r = get_relocs (stub_entry->group->stub_sec, 1);
176a0d42
AM
11142 if (r == NULL)
11143 return FALSE;
9e390558 11144 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
ee75fd95 11145 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
1aa42141 11146 r->r_addend = targ;
3d58e1fc
AM
11147 if (stub_entry->h != NULL
11148 && !use_global_in_relocs (htab, stub_entry, r, 1))
11149 return FALSE;
ee75fd95 11150 }
721956f4 11151 break;
e86ce104 11152
721956f4 11153 case ppc_stub_plt_branch:
ad8e1ba5 11154 case ppc_stub_plt_branch_r2off:
721956f4
AM
11155 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11156 stub_entry->root.string + 9,
b34976b6 11157 FALSE, FALSE);
721956f4
AM
11158 if (br_entry == NULL)
11159 {
cf97bcb0
AM
11160 _bfd_error_handler (_("can't find branch stub `%s'"),
11161 stub_entry->root.string);
b34976b6
AM
11162 htab->stub_error = TRUE;
11163 return FALSE;
721956f4
AM
11164 }
11165
1aa42141 11166 targ = (stub_entry->target_value
176a0d42
AM
11167 + stub_entry->target_section->output_offset
11168 + stub_entry->target_section->output_section->vma);
6911b7dc 11169 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
1aa42141 11170 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 11171
1aa42141 11172 bfd_put_64 (htab->brlt->owner, targ,
4ce794b7 11173 htab->brlt->contents + br_entry->offset);
721956f4 11174
f94498ff 11175 if (br_entry->iter == htab->stub_iteration)
721956f4 11176 {
f94498ff 11177 br_entry->iter = 0;
84f5d08e 11178
f94498ff 11179 if (htab->relbrlt != NULL)
84f5d08e 11180 {
f94498ff
AM
11181 /* Create a reloc for the branch lookup table entry. */
11182 Elf_Internal_Rela rela;
11183 bfd_byte *rl;
11184
11185 rela.r_offset = (br_entry->offset
11186 + htab->brlt->output_offset
11187 + htab->brlt->output_section->vma);
11188 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11189 rela.r_addend = targ;
f94498ff
AM
11190
11191 rl = htab->relbrlt->contents;
11192 rl += (htab->relbrlt->reloc_count++
11193 * sizeof (Elf64_External_Rela));
11194 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
11195 }
11196 else if (info->emitrelocations)
11197 {
176a0d42
AM
11198 r = get_relocs (htab->brlt, 1);
11199 if (r == NULL)
11200 return FALSE;
11201 /* brlt, being SEC_LINKER_CREATED does not go through the
11202 normal reloc processing. Symbols and offsets are not
11203 translated from input file to output file form, so
11204 set up the offset per the output file. */
f94498ff
AM
11205 r->r_offset = (br_entry->offset
11206 + htab->brlt->output_offset
11207 + htab->brlt->output_section->vma);
11208 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11209 r->r_addend = targ;
84f5d08e 11210 }
84f5d08e 11211 }
721956f4 11212
1aa42141 11213 targ = (br_entry->offset
176a0d42
AM
11214 + htab->brlt->output_offset
11215 + htab->brlt->output_section->vma);
11216
1aa42141
AM
11217 off = (elf_gp (info->output_bfd)
11218 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11219 off = targ - off;
721956f4 11220
ad8e1ba5 11221 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 11222 {
25f53a85 11223 info->callbacks->einfo
c1c8c1ef 11224 (_("%P: linkage table error against `%pT'\n"),
721956f4 11225 stub_entry->root.string);
5d1634d7 11226 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11227 htab->stub_error = TRUE;
11228 return FALSE;
5d1634d7 11229 }
41bd81ab 11230
176a0d42
AM
11231 if (info->emitrelocations)
11232 {
6f20ed8a 11233 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
176a0d42
AM
11234 if (r == NULL)
11235 return FALSE;
6f20ed8a 11236 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11237 if (bfd_big_endian (info->output_bfd))
11238 r[0].r_offset += 2;
00f412ee 11239 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
176a0d42
AM
11240 r[0].r_offset += 4;
11241 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
1aa42141 11242 r[0].r_addend = targ;
176a0d42
AM
11243 if (PPC_HA (off) != 0)
11244 {
11245 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11246 r[1].r_offset = r[0].r_offset + 4;
11247 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11248 r[1].r_addend = r[0].r_addend;
11249 }
11250 }
11251
9e390558 11252 p = loc;
00f412ee 11253 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ad8e1ba5 11254 {
176a0d42 11255 if (PPC_HA (off) != 0)
ac2df442 11256 {
e7d1c40c 11257 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11258 ADDIS_R12_R2 | PPC_HA (off), p);
11259 p += 4;
e7d1c40c 11260 bfd_put_32 (htab->params->stub_bfd,
9e390558 11261 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11262 }
11263 else
9e390558
AM
11264 bfd_put_32 (htab->params->stub_bfd,
11265 LD_R12_0R2 | PPC_LO (off), p);
ad8e1ba5
AM
11266 }
11267 else
11268 {
25f53a85 11269 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 11270
a7c49797 11271 if (r2off == (bfd_vma) -1)
aa374f67
AM
11272 {
11273 htab->stub_error = TRUE;
11274 return FALSE;
11275 }
ad8e1ba5 11276
9e390558
AM
11277 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11278 p += 4;
176a0d42 11279 if (PPC_HA (off) != 0)
ac2df442 11280 {
e7d1c40c 11281 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11282 ADDIS_R12_R2 | PPC_HA (off), p);
11283 p += 4;
e7d1c40c 11284 bfd_put_32 (htab->params->stub_bfd,
9e390558 11285 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11286 }
11287 else
9e390558 11288 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p);
ac2df442
AM
11289
11290 if (PPC_HA (r2off) != 0)
11291 {
9e390558 11292 p += 4;
e7d1c40c 11293 bfd_put_32 (htab->params->stub_bfd,
9e390558 11294 ADDIS_R2_R2 | PPC_HA (r2off), p);
00f412ee
AM
11295 }
11296 if (PPC_LO (r2off) != 0)
11297 {
9e390558 11298 p += 4;
e7d1c40c 11299 bfd_put_32 (htab->params->stub_bfd,
9e390558 11300 ADDI_R2_R2 | PPC_LO (r2off), p);
ac2df442 11301 }
ad8e1ba5 11302 }
9e390558
AM
11303 p += 4;
11304 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11305 p += 4;
407aa07c
AM
11306 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11307 p += 4;
721956f4 11308 break;
5d1634d7 11309
05d0e962
AM
11310 case ppc_stub_long_branch_notoc:
11311 case ppc_stub_long_branch_both:
11312 case ppc_stub_plt_branch_notoc:
11313 case ppc_stub_plt_branch_both:
11314 case ppc_stub_plt_call_notoc:
11315 case ppc_stub_plt_call_both:
11316 p = loc;
f891966f 11317 off = (stub_entry->stub_offset
05d0e962
AM
11318 + stub_entry->group->stub_sec->output_offset
11319 + stub_entry->group->stub_sec->output_section->vma);
11320 if (stub_entry->stub_type == ppc_stub_long_branch_both
11321 || stub_entry->stub_type == ppc_stub_plt_branch_both
11322 || stub_entry->stub_type == ppc_stub_plt_call_both)
11323 {
11324 off += 4;
11325 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11326 p += 4;
11327 }
11328 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc)
11329 {
11330 targ = stub_entry->plt_ent->plt.offset & ~1;
11331 if (targ >= (bfd_vma) -2)
11332 abort ();
11333
11334 plt = htab->elf.splt;
11335 if (!htab->elf.dynamic_sections_created
11336 || stub_entry->h == NULL
11337 || stub_entry->h->elf.dynindx == -1)
11338 {
11339 if (stub_entry->symtype == STT_GNU_IFUNC)
11340 plt = htab->elf.iplt;
11341 else
11342 plt = htab->pltlocal;
11343 }
11344 targ += plt->output_offset + plt->output_section->vma;
11345 }
11346 else
11347 targ = (stub_entry->target_value
11348 + stub_entry->target_section->output_offset
11349 + stub_entry->target_section->output_section->vma);
04bdff6a 11350 odd = off & 4;
05d0e962 11351 off = targ - off;
f891966f 11352
3d58e1fc
AM
11353 relp = p;
11354 num_rel = 0;
04bdff6a
AM
11355 if (htab->powerxx_stubs)
11356 {
11357 bfd_boolean load = stub_entry->stub_type >= ppc_stub_plt_call_notoc;
11358 p = build_powerxx_offset (htab->params->stub_bfd, p, off, odd, load);
11359 }
11360 else
11361 {
11362 /* The notoc stubs calculate their target (either a PLT entry or
11363 the global entry point of a function) relative to the PC
11364 returned by the "bcl" two instructions past the start of the
11365 sequence emitted by build_offset. The offset is therefore 8
11366 less than calculated from the start of the sequence. */
11367 off -= 8;
11368 p = build_offset (htab->params->stub_bfd, p, off,
11369 stub_entry->stub_type >= ppc_stub_plt_call_notoc);
11370 }
11371
f891966f 11372 if (stub_entry->stub_type <= ppc_stub_long_branch_both)
05d0e962 11373 {
f891966f 11374 bfd_vma from;
3d58e1fc 11375 num_rel = 1;
f891966f
AM
11376 from = (stub_entry->stub_offset
11377 + stub_entry->group->stub_sec->output_offset
11378 + stub_entry->group->stub_sec->output_section->vma
11379 + (p - loc));
05d0e962 11380 bfd_put_32 (htab->params->stub_bfd,
f891966f 11381 B_DOT | ((targ - from) & 0x3fffffc), p);
05d0e962
AM
11382 }
11383 else
11384 {
11385 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11386 p += 4;
11387 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11388 }
11389 p += 4;
df136d64 11390
3d58e1fc
AM
11391 if (info->emitrelocations)
11392 {
04bdff6a
AM
11393 bfd_vma roff = relp - stub_entry->group->stub_sec->contents;
11394 if (htab->powerxx_stubs)
11395 num_rel += num_relocs_for_powerxx_offset (off, odd);
11396 else
11397 {
11398 num_rel += num_relocs_for_offset (off);
11399 roff += 16;
11400 }
3d58e1fc
AM
11401 r = get_relocs (stub_entry->group->stub_sec, num_rel);
11402 if (r == NULL)
11403 return FALSE;
04bdff6a
AM
11404 if (htab->powerxx_stubs)
11405 r = emit_relocs_for_powerxx_offset (info, r, roff, targ, off, odd);
11406 else
11407 r = emit_relocs_for_offset (info, r, roff, targ, off);
3d58e1fc
AM
11408 if (stub_entry->stub_type == ppc_stub_long_branch_notoc
11409 || stub_entry->stub_type == ppc_stub_long_branch_both)
11410 {
11411 ++r;
11412 roff = p - 4 - stub_entry->group->stub_sec->contents;
11413 r->r_offset = roff;
11414 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
11415 r->r_addend = targ;
11416 if (stub_entry->h != NULL
11417 && !use_global_in_relocs (htab, stub_entry, r, num_rel))
11418 return FALSE;
11419 }
11420 }
11421
04bdff6a
AM
11422 if (!htab->powerxx_stubs
11423 && htab->glink_eh_frame != NULL
11424 && htab->glink_eh_frame->size != 0)
df136d64
AM
11425 {
11426 bfd_byte *base, *eh;
11427 unsigned int lr_used, delta;
11428
11429 base = (htab->glink_eh_frame->contents
11430 + stub_entry->group->eh_base + 17);
11431 eh = base + stub_entry->group->eh_size;
11432 lr_used = stub_entry->stub_offset + 8;
11433 if (stub_entry->stub_type == ppc_stub_long_branch_both
11434 || stub_entry->stub_type == ppc_stub_plt_branch_both
11435 || stub_entry->stub_type == ppc_stub_plt_call_both)
11436 lr_used += 4;
11437 delta = lr_used - stub_entry->group->lr_restore;
11438 stub_entry->group->lr_restore = lr_used + 8;
11439 eh = eh_advance (htab->elf.dynobj, eh, delta);
11440 *eh++ = DW_CFA_register;
11441 *eh++ = 65;
11442 *eh++ = 12;
11443 *eh++ = DW_CFA_advance_loc + 2;
11444 *eh++ = DW_CFA_restore_extended;
11445 *eh++ = 65;
11446 stub_entry->group->eh_size = eh - base;
11447 }
05d0e962
AM
11448 break;
11449
721956f4 11450 case ppc_stub_plt_call:
794e51c0 11451 case ppc_stub_plt_call_r2save:
e054468f 11452 if (stub_entry->h != NULL
b31867b6
AM
11453 && stub_entry->h->is_func_descriptor
11454 && stub_entry->h->oh != NULL)
c862ae31 11455 {
b31867b6
AM
11456 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11457
11458 /* If the old-ABI "dot-symbol" is undefined make it weak so
6f20ed8a 11459 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
8c5b4e52
AM
11460 if (fh->elf.root.type == bfd_link_hash_undefined
11461 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11462 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
b31867b6 11463 fh->elf.root.type = bfd_link_hash_undefweak;
c862ae31
AM
11464 }
11465
721956f4 11466 /* Now build the stub. */
1aa42141
AM
11467 targ = stub_entry->plt_ent->plt.offset & ~1;
11468 if (targ >= (bfd_vma) -2)
721956f4
AM
11469 abort ();
11470
33e44f2e 11471 plt = htab->elf.splt;
25f23106
AM
11472 if (!htab->elf.dynamic_sections_created
11473 || stub_entry->h == NULL
11474 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11475 {
11476 if (stub_entry->symtype == STT_GNU_IFUNC)
11477 plt = htab->elf.iplt;
11478 else
11479 plt = htab->pltlocal;
11480 }
1aa42141 11481 targ += plt->output_offset + plt->output_section->vma;
e054468f 11482
1aa42141
AM
11483 off = (elf_gp (info->output_bfd)
11484 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11485 off = targ - off;
721956f4 11486
ad8e1ba5 11487 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 11488 {
25f53a85 11489 info->callbacks->einfo
695344c0 11490 /* xgettext:c-format */
c1c8c1ef 11491 (_("%P: linkage table error against `%pT'\n"),
e054468f
AM
11492 stub_entry->h != NULL
11493 ? stub_entry->h->elf.root.root.string
11494 : "<local sym>");
721956f4 11495 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11496 htab->stub_error = TRUE;
11497 return FALSE;
721956f4
AM
11498 }
11499
176a0d42
AM
11500 r = NULL;
11501 if (info->emitrelocations)
11502 {
6f20ed8a 11503 r = get_relocs (stub_entry->group->stub_sec,
3ba720c7
AM
11504 ((PPC_HA (off) != 0)
11505 + (htab->opd_abi
e7d1c40c 11506 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
11507 && PPC_HA (off + 16) == PPC_HA (off))
11508 : 1)));
176a0d42
AM
11509 if (r == NULL)
11510 return FALSE;
6f20ed8a 11511 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11512 if (bfd_big_endian (info->output_bfd))
11513 r[0].r_offset += 2;
1aa42141 11514 r[0].r_addend = targ;
176a0d42 11515 }
a7f2871e
AM
11516 if (stub_entry->h != NULL
11517 && (stub_entry->h == htab->tls_get_addr_fd
11518 || stub_entry->h == htab->tls_get_addr)
7c9cf415 11519 && htab->params->tls_get_addr_opt)
794e51c0 11520 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 11521 else
794e51c0 11522 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
11523 break;
11524
a4b6fadd
AM
11525 case ppc_stub_save_res:
11526 return TRUE;
11527
721956f4
AM
11528 default:
11529 BFD_FAIL ();
b34976b6 11530 return FALSE;
721956f4
AM
11531 }
11532
1aa42141 11533 stub_entry->group->stub_sec->size = stub_entry->stub_offset + (p - loc);
97b639ba 11534
e7d1c40c 11535 if (htab->params->emit_stub_syms)
97b639ba
AM
11536 {
11537 struct elf_link_hash_entry *h;
ee75fd95
AM
11538 size_t len1, len2;
11539 char *name;
11540 const char *const stub_str[] = { "long_branch",
05d0e962
AM
11541 "long_branch",
11542 "long_branch",
3f6ff479
AM
11543 "long_branch",
11544 "plt_branch",
ee75fd95 11545 "plt_branch",
05d0e962
AM
11546 "plt_branch",
11547 "plt_branch",
11548 "plt_call",
11549 "plt_call",
794e51c0 11550 "plt_call",
ee75fd95
AM
11551 "plt_call" };
11552
11553 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11554 len2 = strlen (stub_entry->root.string);
11555 name = bfd_malloc (len1 + len2 + 2);
11556 if (name == NULL)
11557 return FALSE;
11558 memcpy (name, stub_entry->root.string, 9);
11559 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11560 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11561 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
11562 if (h == NULL)
11563 return FALSE;
11564 if (h->root.type == bfd_link_hash_new)
11565 {
11566 h->root.type = bfd_link_hash_defined;
6f20ed8a 11567 h->root.u.def.section = stub_entry->group->stub_sec;
97b639ba 11568 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
11569 h->ref_regular = 1;
11570 h->def_regular = 1;
11571 h->ref_regular_nonweak = 1;
11572 h->forced_local = 1;
11573 h->non_elf = 0;
2ec55de3 11574 h->root.linker_def = 1;
97b639ba
AM
11575 }
11576 }
11577
b34976b6 11578 return TRUE;
721956f4
AM
11579}
11580
11581/* As above, but don't actually build the stub. Just bump offset so
11582 we know stub section sizes, and select plt_branch stubs where
11583 long_branch stubs won't do. */
11584
b34976b6 11585static bfd_boolean
4ce794b7 11586ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
11587{
11588 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 11589 struct bfd_link_info *info;
721956f4 11590 struct ppc_link_hash_table *htab;
f891966f
AM
11591 asection *plt;
11592 bfd_vma targ, off, r2off;
04bdff6a 11593 unsigned int size, extra, lr_used, delta, odd;
721956f4
AM
11594
11595 /* Massage our args to the form they really have. */
11596 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
11597 info = in_arg;
11598
11599 htab = ppc_hash_table (info);
4dfe6ac6
NC
11600 if (htab == NULL)
11601 return FALSE;
721956f4 11602
1aa42141
AM
11603 /* Make a note of the offset within the stubs for this entry. */
11604 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11605
a4b6fadd
AM
11606 if (stub_entry->h != NULL
11607 && stub_entry->h->save_res
11608 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11609 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11610 {
11611 /* Don't make stubs to out-of-line register save/restore
11612 functions. Instead, emit copies of the functions. */
11613 stub_entry->group->needs_save_res = 1;
11614 stub_entry->stub_type = ppc_stub_save_res;
11615 return TRUE;
11616 }
11617
f891966f 11618 switch (stub_entry->stub_type)
721956f4 11619 {
f891966f
AM
11620 case ppc_stub_plt_branch:
11621 case ppc_stub_plt_branch_r2off:
11622 /* Reset the stub type from the plt branch variant in case we now
11623 can reach with a shorter stub. */
11624 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11625 /* Fall through. */
11626 case ppc_stub_long_branch:
11627 case ppc_stub_long_branch_r2off:
1aa42141
AM
11628 targ = (stub_entry->target_value
11629 + stub_entry->target_section->output_offset
11630 + stub_entry->target_section->output_section->vma);
f891966f 11631 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
1aa42141
AM
11632 off = (stub_entry->stub_offset
11633 + stub_entry->group->stub_sec->output_offset
11634 + stub_entry->group->stub_sec->output_section->vma);
721956f4 11635
ad8e1ba5 11636 size = 4;
f891966f 11637 r2off = 0;
ad8e1ba5
AM
11638 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11639 {
25f53a85 11640 r2off = get_r2off (info, stub_entry);
a7c49797 11641 if (r2off == (bfd_vma) -1)
aa374f67
AM
11642 {
11643 htab->stub_error = TRUE;
11644 return FALSE;
11645 }
a7c49797 11646 size = 8;
ac2df442 11647 if (PPC_HA (r2off) != 0)
a7c49797
AM
11648 size += 4;
11649 if (PPC_LO (r2off) != 0)
11650 size += 4;
1aa42141 11651 off += size - 4;
ad8e1ba5 11652 }
1aa42141 11653 off = targ - off;
ad8e1ba5 11654
f891966f
AM
11655 /* If the branch offset is too big, use a ppc_stub_plt_branch.
11656 Do the same for -R objects without function descriptors. */
11657 if ((stub_entry->stub_type == ppc_stub_long_branch_r2off
11658 && r2off == 0
11659 && htab->sec_info[stub_entry->target_section->id].toc_off == 0)
11660 || off + (1 << 25) >= (bfd_vma) (1 << 26))
721956f4 11661 {
f891966f 11662 struct ppc_branch_hash_entry *br_entry;
df136d64 11663
f891966f
AM
11664 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11665 stub_entry->root.string + 9,
11666 TRUE, FALSE);
11667 if (br_entry == NULL)
721956f4 11668 {
f891966f
AM
11669 _bfd_error_handler (_("can't build branch stub `%s'"),
11670 stub_entry->root.string);
11671 htab->stub_error = TRUE;
11672 return FALSE;
721956f4
AM
11673 }
11674
f891966f 11675 if (br_entry->iter != htab->stub_iteration)
721956f4 11676 {
f891966f
AM
11677 br_entry->iter = htab->stub_iteration;
11678 br_entry->offset = htab->brlt->size;
11679 htab->brlt->size += 8;
63bc6f6c 11680
f891966f
AM
11681 if (htab->relbrlt != NULL)
11682 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11683 else if (info->emitrelocations)
84f5d08e 11684 {
f891966f
AM
11685 htab->brlt->reloc_count += 1;
11686 htab->brlt->flags |= SEC_RELOC;
05d0e962 11687 }
f891966f 11688 }
ac2df442 11689
f891966f
AM
11690 targ = (br_entry->offset
11691 + htab->brlt->output_offset
11692 + htab->brlt->output_section->vma);
11693 off = (elf_gp (info->output_bfd)
11694 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11695 off = targ - off;
176a0d42 11696
f891966f
AM
11697 if (info->emitrelocations)
11698 {
11699 stub_entry->group->stub_sec->reloc_count
11700 += 1 + (PPC_HA (off) != 0);
11701 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11702 }
05d0e962 11703
f891966f
AM
11704 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11705 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11706 {
11707 size = 12;
11708 if (PPC_HA (off) != 0)
11709 size = 16;
ac2df442 11710 }
f891966f 11711 else
ac2df442 11712 {
f891966f
AM
11713 size = 16;
11714 if (PPC_HA (off) != 0)
11715 size += 4;
11716
11717 if (PPC_HA (r2off) != 0)
11718 size += 4;
11719 if (PPC_LO (r2off) != 0)
11720 size += 4;
ac2df442 11721 }
721956f4 11722 }
f891966f
AM
11723 else if (info->emitrelocations)
11724 {
11725 stub_entry->group->stub_sec->reloc_count += 1;
11726 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11727 }
11728 break;
11729
11730 case ppc_stub_plt_branch_notoc:
11731 case ppc_stub_plt_branch_both:
11732 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11733 /* Fall through. */
11734 case ppc_stub_long_branch_notoc:
11735 case ppc_stub_long_branch_both:
11736 off = (stub_entry->stub_offset
11737 + stub_entry->group->stub_sec->output_offset
11738 + stub_entry->group->stub_sec->output_section->vma);
11739 size = 0;
11740 if (stub_entry->stub_type == ppc_stub_long_branch_both)
11741 size = 4;
11742 off += size;
11743 targ = (stub_entry->target_value
11744 + stub_entry->target_section->output_offset
11745 + stub_entry->target_section->output_section->vma);
04bdff6a 11746 odd = off & 4;
f891966f
AM
11747 off = targ - off;
11748
3d58e1fc
AM
11749 if (info->emitrelocations)
11750 {
04bdff6a
AM
11751 unsigned int num_rel;
11752 if (htab->powerxx_stubs)
11753 num_rel = num_relocs_for_powerxx_offset (off, odd);
11754 else
11755 num_rel = num_relocs_for_offset (off - 8);
11756 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
11757 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11758 }
11759
04bdff6a
AM
11760 if (htab->powerxx_stubs)
11761 extra = size_powerxx_offset (off, odd);
11762 else
11763 extra = size_offset (off - 8);
f891966f
AM
11764 /* Include branch insn plus those in the offset sequence. */
11765 size += 4 + extra;
11766 /* The branch insn is at the end, or "extra" bytes along. So
11767 its offset will be "extra" bytes less that that already
11768 calculated. */
11769 off -= extra;
11770
04bdff6a
AM
11771 if (!htab->powerxx_stubs)
11772 {
11773 /* After the bcl, lr has been modified so we need to emit
11774 .eh_frame info saying the return address is in r12. */
11775 lr_used = stub_entry->stub_offset + 8;
11776 if (stub_entry->stub_type == ppc_stub_long_branch_both)
11777 lr_used += 4;
11778 /* The eh_frame info will consist of a DW_CFA_advance_loc or
11779 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
11780 DW_CFA_restore_extended 65. */
11781 delta = lr_used - stub_entry->group->lr_restore;
11782 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11783 stub_entry->group->lr_restore = lr_used + 8;
11784 }
f891966f
AM
11785
11786 /* If the branch can't reach, use a plt_branch. */
11787 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11788 {
11789 stub_entry->stub_type += (ppc_stub_plt_branch_notoc
11790 - ppc_stub_long_branch_notoc);
11791 size += 4;
11792 }
3d58e1fc
AM
11793 else if (info->emitrelocations)
11794 stub_entry->group->stub_sec->reloc_count +=1;
f891966f
AM
11795 break;
11796
11797 case ppc_stub_plt_call_notoc:
11798 case ppc_stub_plt_call_both:
11799 off = (stub_entry->stub_offset
11800 + stub_entry->group->stub_sec->output_offset
11801 + stub_entry->group->stub_sec->output_section->vma);
11802 if (stub_entry->stub_type == ppc_stub_plt_call_both)
11803 off += 4;
11804 targ = stub_entry->plt_ent->plt.offset & ~1;
11805 if (targ >= (bfd_vma) -2)
11806 abort ();
11807
11808 plt = htab->elf.splt;
11809 if (!htab->elf.dynamic_sections_created
11810 || stub_entry->h == NULL
11811 || stub_entry->h->elf.dynindx == -1)
11812 {
11813 if (stub_entry->symtype == STT_GNU_IFUNC)
11814 plt = htab->elf.iplt;
11815 else
11816 plt = htab->pltlocal;
11817 }
11818 targ += plt->output_offset + plt->output_section->vma;
04bdff6a 11819 odd = off & 4;
f891966f
AM
11820 off = targ - off;
11821
11822 if (htab->params->plt_stub_align != 0)
11823 {
11824 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11825
11826 stub_entry->group->stub_sec->size += pad;
11827 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11828 off -= pad;
11829 }
11830
3d58e1fc
AM
11831 if (info->emitrelocations)
11832 {
04bdff6a
AM
11833 unsigned int num_rel;
11834 if (htab->powerxx_stubs)
11835 num_rel = num_relocs_for_powerxx_offset (off, odd);
11836 else
11837 num_rel = num_relocs_for_offset (off - 8);
11838 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
11839 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11840 }
11841
f891966f
AM
11842 size = plt_stub_size (htab, stub_entry, off);
11843
04bdff6a
AM
11844 if (!htab->powerxx_stubs)
11845 {
11846 /* After the bcl, lr has been modified so we need to emit
11847 .eh_frame info saying the return address is in r12. */
11848 lr_used = stub_entry->stub_offset + 8;
11849 if (stub_entry->stub_type == ppc_stub_plt_call_both)
11850 lr_used += 4;
11851 /* The eh_frame info will consist of a DW_CFA_advance_loc or
11852 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
11853 DW_CFA_restore_extended 65. */
11854 delta = lr_used - stub_entry->group->lr_restore;
11855 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11856 stub_entry->group->lr_restore = lr_used + 8;
11857 }
f891966f
AM
11858 break;
11859
11860 case ppc_stub_plt_call:
11861 case ppc_stub_plt_call_r2save:
11862 targ = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
11863 if (targ >= (bfd_vma) -2)
11864 abort ();
11865 plt = htab->elf.splt;
11866 if (!htab->elf.dynamic_sections_created
11867 || stub_entry->h == NULL
11868 || stub_entry->h->elf.dynindx == -1)
11869 {
11870 if (stub_entry->symtype == STT_GNU_IFUNC)
11871 plt = htab->elf.iplt;
11872 else
11873 plt = htab->pltlocal;
11874 }
11875 targ += plt->output_offset + plt->output_section->vma;
11876
11877 off = (elf_gp (info->output_bfd)
11878 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11879 off = targ - off;
11880
11881 if (htab->params->plt_stub_align != 0)
11882 {
11883 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11884
11885 stub_entry->group->stub_sec->size += pad;
11886 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11887 }
11888
11889 if (info->emitrelocations)
11890 {
11891 stub_entry->group->stub_sec->reloc_count
11892 += ((PPC_HA (off) != 0)
11893 + (htab->opd_abi
11894 ? 2 + (htab->params->plt_static_chain
11895 && PPC_HA (off + 16) == PPC_HA (off))
11896 : 1));
11897 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11898 }
11899
11900 size = plt_stub_size (htab, stub_entry, off);
11901
11902 if (stub_entry->h != NULL
11903 && (stub_entry->h == htab->tls_get_addr_fd
11904 || stub_entry->h == htab->tls_get_addr)
11905 && htab->params->tls_get_addr_opt
11906 && stub_entry->stub_type == ppc_stub_plt_call_r2save)
11907 {
11908 /* After the bctrl, lr has been modified so we need to
11909 emit .eh_frame info saying the return address is
11910 on the stack. In fact we put the EH info specifying
11911 that the return address is on the stack *at* the
11912 call rather than after it, because the EH info for a
11913 call needs to be specified by that point.
11914 See libgcc/unwind-dw2.c execute_cfa_program. */
11915 lr_used = stub_entry->stub_offset + size - 20;
11916 /* The eh_frame info will consist of a DW_CFA_advance_loc
11917 or variant, DW_CFA_offset_externed_sf, 65, -stackoff,
11918 DW_CFA_advance_loc+4, DW_CFA_restore_extended, 65. */
11919 delta = lr_used - stub_entry->group->lr_restore;
11920 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
11921 stub_entry->group->lr_restore = size - 4;
11922 }
11923 break;
11924
11925 default:
11926 BFD_FAIL ();
11927 return FALSE;
721956f4
AM
11928 }
11929
6f20ed8a 11930 stub_entry->group->stub_sec->size += size;
b34976b6 11931 return TRUE;
721956f4
AM
11932}
11933
11934/* Set up various things so that we can make a list of input sections
11935 for each output section included in the link. Returns -1 on error,
cedb70c5 11936 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
11937
11938int
e7d1c40c 11939ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4 11940{
6f20ed8a 11941 unsigned int id;
721956f4
AM
11942 bfd_size_type amt;
11943 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11944
4dfe6ac6
NC
11945 if (htab == NULL)
11946 return -1;
4c52953f 11947
7cf7fcc8 11948 htab->sec_info_arr_size = _bfd_section_id;
6f20ed8a
AM
11949 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
11950 htab->sec_info = bfd_zmalloc (amt);
11951 if (htab->sec_info == NULL)
721956f4
AM
11952 return -1;
11953
3d6f9012
AM
11954 /* Set toc_off for com, und, abs and ind sections. */
11955 for (id = 0; id < 3; id++)
6f20ed8a 11956 htab->sec_info[id].toc_off = TOC_BASE_OFF;
734b6cf9 11957
721956f4
AM
11958 return 1;
11959}
11960
927be08e
AM
11961/* Set up for first pass at multitoc partitioning. */
11962
11963void
11964ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11965{
11966 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11967
1c865ab2 11968 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
11969 htab->toc_bfd = NULL;
11970 htab->toc_first_sec = NULL;
11971}
11972
e717da7e
AM
11973/* The linker repeatedly calls this function for each TOC input section
11974 and linker generated GOT section. Group input bfds such that the toc
927be08e 11975 within a group is less than 64k in size. */
ad8e1ba5 11976
927be08e 11977bfd_boolean
4ce794b7 11978ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
11979{
11980 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 11981 bfd_vma addr, off, limit;
ad8e1ba5 11982
4dfe6ac6
NC
11983 if (htab == NULL)
11984 return FALSE;
11985
927be08e 11986 if (!htab->second_toc_pass)
4c52953f 11987 {
927be08e 11988 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
11989 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11990
11991 if (new_bfd)
bf102f86
AM
11992 {
11993 htab->toc_bfd = isec->owner;
11994 htab->toc_first_sec = isec;
11995 }
927be08e 11996
bf102f86
AM
11997 addr = isec->output_offset + isec->output_section->vma;
11998 off = addr - htab->toc_curr;
d77c8a4b
AM
11999 limit = 0x80008000;
12000 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
12001 limit = 0x10000;
12002 if (off + isec->size > limit)
bf102f86
AM
12003 {
12004 addr = (htab->toc_first_sec->output_offset
12005 + htab->toc_first_sec->output_section->vma);
12006 htab->toc_curr = addr;
a27e685f 12007 htab->toc_curr &= -TOC_BASE_ALIGN;
bf102f86 12008 }
99877b66 12009
927be08e
AM
12010 /* toc_curr is the base address of this toc group. Set elf_gp
12011 for the input section to be the offset relative to the
12012 output toc base plus 0x8000. Making the input elf_gp an
12013 offset allows us to move the toc as a whole without
12014 recalculating input elf_gp. */
06bcf541 12015 off = htab->toc_curr - elf_gp (info->output_bfd);
927be08e
AM
12016 off += TOC_BASE_OFF;
12017
12018 /* Die if someone uses a linker script that doesn't keep input
12019 file .toc and .got together. */
a4fd3de5
AM
12020 if (new_bfd
12021 && elf_gp (isec->owner) != 0
927be08e
AM
12022 && elf_gp (isec->owner) != off)
12023 return FALSE;
12024
12025 elf_gp (isec->owner) = off;
12026 return TRUE;
4c52953f 12027 }
927be08e
AM
12028
12029 /* During the second pass toc_first_sec points to the start of
12030 a toc group, and toc_curr is used to track the old elf_gp.
12031 We use toc_bfd to ensure we only look at each bfd once. */
12032 if (htab->toc_bfd == isec->owner)
12033 return TRUE;
12034 htab->toc_bfd = isec->owner;
12035
12036 if (htab->toc_first_sec == NULL
12037 || htab->toc_curr != elf_gp (isec->owner))
12038 {
12039 htab->toc_curr = elf_gp (isec->owner);
12040 htab->toc_first_sec = isec;
12041 }
12042 addr = (htab->toc_first_sec->output_offset
12043 + htab->toc_first_sec->output_section->vma);
06bcf541 12044 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
927be08e
AM
12045 elf_gp (isec->owner) = off;
12046
12047 return TRUE;
ad8e1ba5
AM
12048}
12049
927be08e
AM
12050/* Called via elf_link_hash_traverse to merge GOT entries for global
12051 symbol H. */
12052
12053static bfd_boolean
12054merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12055{
12056 if (h->root.type == bfd_link_hash_indirect)
12057 return TRUE;
12058
927be08e
AM
12059 merge_got_entries (&h->got.glist);
12060
12061 return TRUE;
12062}
12063
12064/* Called via elf_link_hash_traverse to allocate GOT entries for global
12065 symbol H. */
12066
12067static bfd_boolean
12068reallocate_got (struct elf_link_hash_entry *h, void *inf)
12069{
12070 struct got_entry *gent;
12071
12072 if (h->root.type == bfd_link_hash_indirect)
12073 return TRUE;
12074
927be08e
AM
12075 for (gent = h->got.glist; gent != NULL; gent = gent->next)
12076 if (!gent->is_indirect)
12077 allocate_got (h, (struct bfd_link_info *) inf, gent);
12078 return TRUE;
12079}
12080
12081/* Called on the first multitoc pass after the last call to
12082 ppc64_elf_next_toc_section. This function removes duplicate GOT
12083 entries. */
12084
12085bfd_boolean
12086ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
12087{
12088 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
12089 struct bfd *ibfd, *ibfd2;
12090 bfd_boolean done_something;
12091
12092 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 12093
7865406b
AM
12094 if (!htab->do_multi_toc)
12095 return FALSE;
12096
d0fae19d 12097 /* Merge global sym got entries within a toc group. */
927be08e
AM
12098 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
12099
12100 /* And tlsld_got. */
c72f2fb2 12101 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12102 {
12103 struct got_entry *ent, *ent2;
12104
12105 if (!is_ppc64_elf (ibfd))
12106 continue;
12107
12108 ent = ppc64_tlsld_got (ibfd);
12109 if (!ent->is_indirect
12110 && ent->got.offset != (bfd_vma) -1)
12111 {
c72f2fb2 12112 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
12113 {
12114 if (!is_ppc64_elf (ibfd2))
12115 continue;
12116
12117 ent2 = ppc64_tlsld_got (ibfd2);
12118 if (!ent2->is_indirect
12119 && ent2->got.offset != (bfd_vma) -1
12120 && elf_gp (ibfd2) == elf_gp (ibfd))
12121 {
12122 ent2->is_indirect = TRUE;
12123 ent2->got.ent = ent;
12124 }
12125 }
12126 }
12127 }
12128
12129 /* Zap sizes of got sections. */
33e44f2e
AM
12130 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
12131 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
12132 htab->got_reli_size = 0;
12133
c72f2fb2 12134 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12135 {
12136 asection *got, *relgot;
12137
12138 if (!is_ppc64_elf (ibfd))
12139 continue;
12140
12141 got = ppc64_elf_tdata (ibfd)->got;
12142 if (got != NULL)
12143 {
12144 got->rawsize = got->size;
12145 got->size = 0;
12146 relgot = ppc64_elf_tdata (ibfd)->relgot;
12147 relgot->rawsize = relgot->size;
12148 relgot->size = 0;
12149 }
12150 }
12151
12152 /* Now reallocate the got, local syms first. We don't need to
12153 allocate section contents again since we never increase size. */
c72f2fb2 12154 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12155 {
12156 struct got_entry **lgot_ents;
12157 struct got_entry **end_lgot_ents;
12158 struct plt_entry **local_plt;
12159 struct plt_entry **end_local_plt;
f961d9dd 12160 unsigned char *lgot_masks;
927be08e
AM
12161 bfd_size_type locsymcount;
12162 Elf_Internal_Shdr *symtab_hdr;
19e08130 12163 asection *s;
927be08e
AM
12164
12165 if (!is_ppc64_elf (ibfd))
12166 continue;
12167
12168 lgot_ents = elf_local_got_ents (ibfd);
12169 if (!lgot_ents)
12170 continue;
12171
12172 symtab_hdr = &elf_symtab_hdr (ibfd);
12173 locsymcount = symtab_hdr->sh_info;
12174 end_lgot_ents = lgot_ents + locsymcount;
12175 local_plt = (struct plt_entry **) end_lgot_ents;
12176 end_local_plt = local_plt + locsymcount;
f961d9dd 12177 lgot_masks = (unsigned char *) end_local_plt;
927be08e 12178 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
12179 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
12180 {
12181 struct got_entry *ent;
12182
12183 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 12184 {
19e08130
AM
12185 unsigned int ent_size = 8;
12186 unsigned int rel_size = sizeof (Elf64_External_Rela);
12187
d0fae19d
AM
12188 ent->got.offset = s->size;
12189 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 12190 {
19e08130
AM
12191 ent_size *= 2;
12192 rel_size *= 2;
12193 }
12194 s->size += ent_size;
37da22e5 12195 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 12196 {
33e44f2e 12197 htab->elf.irelplt->size += rel_size;
19e08130
AM
12198 htab->got_reli_size += rel_size;
12199 }
6a3858a6 12200 else if (bfd_link_pic (info)
f749f26e 12201 && !(ent->tls_type != 0
6a3858a6 12202 && bfd_link_executable (info)))
19e08130
AM
12203 {
12204 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12205 srel->size += rel_size;
d0fae19d
AM
12206 }
12207 }
927be08e
AM
12208 }
12209 }
12210
12211 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
12212
c72f2fb2 12213 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12214 {
12215 struct got_entry *ent;
12216
12217 if (!is_ppc64_elf (ibfd))
12218 continue;
12219
12220 ent = ppc64_tlsld_got (ibfd);
12221 if (!ent->is_indirect
12222 && ent->got.offset != (bfd_vma) -1)
12223 {
12224 asection *s = ppc64_elf_tdata (ibfd)->got;
12225 ent->got.offset = s->size;
12226 s->size += 16;
f749f26e 12227 if (bfd_link_dll (info))
927be08e
AM
12228 {
12229 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12230 srel->size += sizeof (Elf64_External_Rela);
12231 }
12232 }
12233 }
12234
33e44f2e 12235 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 12236 if (!done_something)
c72f2fb2 12237 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12238 {
12239 asection *got;
12240
12241 if (!is_ppc64_elf (ibfd))
12242 continue;
12243
12244 got = ppc64_elf_tdata (ibfd)->got;
12245 if (got != NULL)
12246 {
12247 done_something = got->rawsize != got->size;
12248 if (done_something)
12249 break;
12250 }
12251 }
12252
12253 if (done_something)
e7d1c40c 12254 (*htab->params->layout_sections_again) ();
927be08e
AM
12255
12256 /* Set up for second pass over toc sections to recalculate elf_gp
12257 on input sections. */
12258 htab->toc_bfd = NULL;
12259 htab->toc_first_sec = NULL;
12260 htab->second_toc_pass = TRUE;
12261 return done_something;
12262}
12263
12264/* Called after second pass of multitoc partitioning. */
12265
12266void
12267ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
12268{
12269 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12270
12271 /* After the second pass, toc_curr tracks the TOC offset used
12272 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 12273 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
12274}
12275
9b5ecbd0
AM
12276/* No toc references were found in ISEC. If the code in ISEC makes no
12277 calls, then there's no need to use toc adjusting stubs when branching
12278 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
12279 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
12280 needed, and 2 if a cyclical call-graph was found but no other reason
12281 for a stub was detected. If called from the top level, a return of
12282 2 means the same as a return of 0. */
9b5ecbd0
AM
12283
12284static int
4ce794b7 12285toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 12286{
9b5ecbd0 12287 int ret;
70cc837d
AM
12288
12289 /* Mark this section as checked. */
12290 isec->call_check_done = 1;
9b5ecbd0 12291
772119ce
AM
12292 /* We know none of our code bearing sections will need toc stubs. */
12293 if ((isec->flags & SEC_LINKER_CREATED) != 0)
12294 return 0;
12295
eea6121a 12296 if (isec->size == 0)
082c50f8
AM
12297 return 0;
12298
4c52953f
AM
12299 if (isec->output_section == NULL)
12300 return 0;
12301
4c52953f 12302 ret = 0;
70cc837d 12303 if (isec->reloc_count != 0)
9b5ecbd0 12304 {
70cc837d
AM
12305 Elf_Internal_Rela *relstart, *rel;
12306 Elf_Internal_Sym *local_syms;
12307 struct ppc_link_hash_table *htab;
2917689a 12308
70cc837d
AM
12309 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
12310 info->keep_memory);
12311 if (relstart == NULL)
12312 return -1;
90aecf7a 12313
70cc837d
AM
12314 /* Look for branches to outside of this section. */
12315 local_syms = NULL;
12316 htab = ppc_hash_table (info);
12317 if (htab == NULL)
12318 return -1;
4c52953f 12319
70cc837d 12320 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 12321 {
70cc837d
AM
12322 enum elf_ppc64_reloc_type r_type;
12323 unsigned long r_symndx;
12324 struct elf_link_hash_entry *h;
12325 struct ppc_link_hash_entry *eh;
12326 Elf_Internal_Sym *sym;
12327 asection *sym_sec;
12328 struct _opd_sec_data *opd;
12329 bfd_vma sym_value;
12330 bfd_vma dest;
12331
12332 r_type = ELF64_R_TYPE (rel->r_info);
12333 if (r_type != R_PPC64_REL24
05d0e962 12334 && r_type != R_PPC64_REL24_NOTOC
70cc837d
AM
12335 && r_type != R_PPC64_REL14
12336 && r_type != R_PPC64_REL14_BRTAKEN
23cedd1d 12337 && r_type != R_PPC64_REL14_BRNTAKEN
5663e321
AM
12338 && r_type != R_PPC64_PLTCALL
12339 && r_type != R_PPC64_PLTCALL_NOTOC)
70cc837d 12340 continue;
4c52953f 12341
70cc837d
AM
12342 r_symndx = ELF64_R_SYM (rel->r_info);
12343 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
12344 isec->owner))
4c52953f 12345 {
70cc837d
AM
12346 ret = -1;
12347 break;
12348 }
4c52953f 12349
70cc837d
AM
12350 /* Calls to dynamic lib functions go through a plt call stub
12351 that uses r2. */
12352 eh = (struct ppc_link_hash_entry *) h;
12353 if (eh != NULL
12354 && (eh->elf.plt.plist != NULL
12355 || (eh->oh != NULL
12356 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
12357 {
12358 ret = 1;
12359 break;
4c52953f
AM
12360 }
12361
70cc837d
AM
12362 if (sym_sec == NULL)
12363 /* Ignore other undefined symbols. */
4c52953f 12364 continue;
4c52953f 12365
70cc837d
AM
12366 /* Assume branches to other sections not included in the
12367 link need stubs too, to cover -R and absolute syms. */
12368 if (sym_sec->output_section == NULL)
12369 {
12370 ret = 1;
12371 break;
12372 }
4c52953f 12373
70cc837d
AM
12374 if (h == NULL)
12375 sym_value = sym->st_value;
12376 else
12377 {
12378 if (h->root.type != bfd_link_hash_defined
12379 && h->root.type != bfd_link_hash_defweak)
12380 abort ();
12381 sym_value = h->root.u.def.value;
12382 }
12383 sym_value += rel->r_addend;
4c52953f 12384
70cc837d
AM
12385 /* If this branch reloc uses an opd sym, find the code section. */
12386 opd = get_opd_info (sym_sec);
12387 if (opd != NULL)
12388 {
12389 if (h == NULL && opd->adjust != NULL)
12390 {
12391 long adjust;
4c52953f 12392
92a9c616 12393 adjust = opd->adjust[OPD_NDX (sym_value)];
70cc837d
AM
12394 if (adjust == -1)
12395 /* Assume deleted functions won't ever be called. */
12396 continue;
12397 sym_value += adjust;
12398 }
4c52953f 12399
aef36ac1
AM
12400 dest = opd_entry_value (sym_sec, sym_value,
12401 &sym_sec, NULL, FALSE);
70cc837d
AM
12402 if (dest == (bfd_vma) -1)
12403 continue;
12404 }
12405 else
12406 dest = (sym_value
12407 + sym_sec->output_offset
12408 + sym_sec->output_section->vma);
4c52953f 12409
70cc837d
AM
12410 /* Ignore branch to self. */
12411 if (sym_sec == isec)
12412 continue;
4c52953f 12413
70cc837d
AM
12414 /* If the called function uses the toc, we need a stub. */
12415 if (sym_sec->has_toc_reloc
12416 || sym_sec->makes_toc_func_call)
4c52953f 12417 {
70cc837d 12418 ret = 1;
4c52953f
AM
12419 break;
12420 }
70cc837d
AM
12421
12422 /* Assume any branch that needs a long branch stub might in fact
12423 need a plt_branch stub. A plt_branch stub uses r2. */
12424 else if (dest - (isec->output_offset
12425 + isec->output_section->vma
6911b7dc
AM
12426 + rel->r_offset) + (1 << 25)
12427 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
12428 ? h->other
12429 : sym->st_other))
4c52953f 12430 {
70cc837d
AM
12431 ret = 1;
12432 break;
12433 }
12434
12435 /* If calling back to a section in the process of being
12436 tested, we can't say for sure that no toc adjusting stubs
12437 are needed, so don't return zero. */
12438 else if (sym_sec->call_check_in_progress)
12439 ret = 2;
12440
12441 /* Branches to another section that itself doesn't have any TOC
12442 references are OK. Recursively call ourselves to check. */
12443 else if (!sym_sec->call_check_done)
12444 {
12445 int recur;
12446
12447 /* Mark current section as indeterminate, so that other
12448 sections that call back to current won't be marked as
12449 known. */
12450 isec->call_check_in_progress = 1;
12451 recur = toc_adjusting_stub_needed (info, sym_sec);
12452 isec->call_check_in_progress = 0;
12453
4c52953f
AM
12454 if (recur != 0)
12455 {
70cc837d
AM
12456 ret = recur;
12457 if (recur != 2)
12458 break;
4c52953f
AM
12459 }
12460 }
4c52953f 12461 }
70cc837d
AM
12462
12463 if (local_syms != NULL
12464 && (elf_symtab_hdr (isec->owner).contents
12465 != (unsigned char *) local_syms))
12466 free (local_syms);
12467 if (elf_section_data (isec)->relocs != relstart)
12468 free (relstart);
9b5ecbd0
AM
12469 }
12470
70cc837d
AM
12471 if ((ret & 1) == 0
12472 && isec->map_head.s != NULL
12473 && (strcmp (isec->output_section->name, ".init") == 0
12474 || strcmp (isec->output_section->name, ".fini") == 0))
12475 {
12476 if (isec->map_head.s->has_toc_reloc
12477 || isec->map_head.s->makes_toc_func_call)
12478 ret = 1;
12479 else if (!isec->map_head.s->call_check_done)
12480 {
12481 int recur;
12482 isec->call_check_in_progress = 1;
12483 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
12484 isec->call_check_in_progress = 0;
12485 if (recur != 0)
12486 ret = recur;
12487 }
12488 }
12489
12490 if (ret == 1)
12491 isec->makes_toc_func_call = 1;
4c52953f 12492
9b5ecbd0
AM
12493 return ret;
12494}
12495
721956f4
AM
12496/* The linker repeatedly calls this function for each input section,
12497 in the order that input sections are linked into output sections.
12498 Build lists of input sections to determine groupings between which
12499 we may insert linker stubs. */
12500
9b5ecbd0 12501bfd_boolean
4ce794b7 12502ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
12503{
12504 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12505
4dfe6ac6
NC
12506 if (htab == NULL)
12507 return FALSE;
12508
734b6cf9 12509 if ((isec->output_section->flags & SEC_CODE) != 0
6f20ed8a 12510 && isec->output_section->id < htab->sec_info_arr_size)
721956f4 12511 {
3d6f9012
AM
12512 /* This happens to make the list in reverse order,
12513 which is what we want. */
6f20ed8a
AM
12514 htab->sec_info[isec->id].u.list
12515 = htab->sec_info[isec->output_section->id].u.list;
12516 htab->sec_info[isec->output_section->id].u.list = isec;
721956f4 12517 }
ad8e1ba5 12518
4c52953f 12519 if (htab->multi_toc_needed)
9b5ecbd0 12520 {
8b974ba3
AM
12521 /* Analyse sections that aren't already flagged as needing a
12522 valid toc pointer. Exclude .fixup for the linux kernel.
12523 .fixup contains branches, but only back to the function that
12524 hit an exception. */
12525 if (!(isec->has_toc_reloc
12526 || (isec->flags & SEC_CODE) == 0
12527 || strcmp (isec->name, ".fixup") == 0
12528 || isec->call_check_done))
12529 {
12530 if (toc_adjusting_stub_needed (info, isec) < 0)
6683a28d 12531 return FALSE;
8b974ba3
AM
12532 }
12533 /* Make all sections use the TOC assigned for this object file.
12534 This will be wrong for pasted sections; We fix that in
12535 check_pasted_section(). */
12536 if (elf_gp (isec->owner) != 0)
12537 htab->toc_curr = elf_gp (isec->owner);
12538 }
12539
6f20ed8a 12540 htab->sec_info[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 12541 return TRUE;
721956f4
AM
12542}
12543
70cc837d
AM
12544/* Check that all .init and .fini sections use the same toc, if they
12545 have toc relocs. */
12546
12547static bfd_boolean
12548check_pasted_section (struct bfd_link_info *info, const char *name)
12549{
12550 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12551
12552 if (o != NULL)
12553 {
12554 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12555 bfd_vma toc_off = 0;
12556 asection *i;
12557
12558 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12559 if (i->has_toc_reloc)
12560 {
12561 if (toc_off == 0)
6f20ed8a
AM
12562 toc_off = htab->sec_info[i->id].toc_off;
12563 else if (toc_off != htab->sec_info[i->id].toc_off)
70cc837d
AM
12564 return FALSE;
12565 }
6683a28d
AM
12566
12567 if (toc_off == 0)
12568 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12569 if (i->makes_toc_func_call)
12570 {
6f20ed8a 12571 toc_off = htab->sec_info[i->id].toc_off;
6683a28d
AM
12572 break;
12573 }
12574
70cc837d
AM
12575 /* Make sure the whole pasted function uses the same toc offset. */
12576 if (toc_off != 0)
12577 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
6f20ed8a 12578 htab->sec_info[i->id].toc_off = toc_off;
70cc837d
AM
12579 }
12580 return TRUE;
12581}
12582
12583bfd_boolean
12584ppc64_elf_check_init_fini (struct bfd_link_info *info)
12585{
12586 return (check_pasted_section (info, ".init")
12587 & check_pasted_section (info, ".fini"));
12588}
12589
721956f4
AM
12590/* See whether we can group stub sections together. Grouping stub
12591 sections may result in fewer stubs. More importantly, we need to
12592 put all .init* and .fini* stubs at the beginning of the .init or
12593 .fini output sections respectively, because glibc splits the
12594 _init and _fini functions into multiple parts. Putting a stub in
12595 the middle of a function is not a good idea. */
12596
6f20ed8a
AM
12597static bfd_boolean
12598group_sections (struct bfd_link_info *info,
4ce794b7
AM
12599 bfd_size_type stub_group_size,
12600 bfd_boolean stubs_always_before_branch)
721956f4 12601{
6f20ed8a
AM
12602 struct ppc_link_hash_table *htab;
12603 asection *osec;
7c8fe5c4
AM
12604 bfd_boolean suppress_size_errors;
12605
6f20ed8a
AM
12606 htab = ppc_hash_table (info);
12607 if (htab == NULL)
12608 return FALSE;
12609
7c8fe5c4 12610 suppress_size_errors = FALSE;
7c8fe5c4
AM
12611 if (stub_group_size == 1)
12612 {
12613 /* Default values. */
12614 if (stubs_always_before_branch)
09f92717 12615 stub_group_size = 0x1e00000;
7c8fe5c4 12616 else
09f92717 12617 stub_group_size = 0x1c00000;
7c8fe5c4
AM
12618 suppress_size_errors = TRUE;
12619 }
12620
6f20ed8a 12621 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
721956f4 12622 {
6f20ed8a
AM
12623 asection *tail;
12624
12625 if (osec->id >= htab->sec_info_arr_size)
12626 continue;
12627
12628 tail = htab->sec_info[osec->id].u.list;
734b6cf9 12629 while (tail != NULL)
721956f4 12630 {
734b6cf9
AM
12631 asection *curr;
12632 asection *prev;
12633 bfd_size_type total;
12634 bfd_boolean big_sec;
12635 bfd_vma curr_toc;
6f20ed8a 12636 struct map_stub *group;
09f92717 12637 bfd_size_type group_size;
734b6cf9
AM
12638
12639 curr = tail;
eea6121a 12640 total = tail->size;
09f92717
AM
12641 group_size = (ppc64_elf_section_data (tail) != NULL
12642 && ppc64_elf_section_data (tail)->has_14bit_branch
12643 ? stub_group_size >> 10 : stub_group_size);
12644
12645 big_sec = total > group_size;
7c8fe5c4 12646 if (big_sec && !suppress_size_errors)
695344c0 12647 /* xgettext:c-format */
871b3ab2 12648 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
4eca0228 12649 tail->owner, tail);
6f20ed8a 12650 curr_toc = htab->sec_info[tail->id].toc_off;
734b6cf9 12651
6f20ed8a 12652 while ((prev = htab->sec_info[curr->id].u.list) != NULL
734b6cf9 12653 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
12654 < (ppc64_elf_section_data (prev) != NULL
12655 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12656 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12657 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12658 curr = prev;
12659
12660 /* OK, the size from the start of CURR to the end is less
09f92717 12661 than group_size and thus can be handled by one stub
734b6cf9 12662 section. (or the tail section is itself larger than
09f92717
AM
12663 group_size, in which case we may be toast.) We should
12664 really be keeping track of the total size of stubs added
12665 here, as stubs contribute to the final output section
12666 size. That's a little tricky, and this way will only
12667 break if stubs added make the total size more than 2^25,
12668 ie. for the default stub_group_size, if stubs total more
12669 than 2097152 bytes, or nearly 75000 plt call stubs. */
6f20ed8a
AM
12670 group = bfd_alloc (curr->owner, sizeof (*group));
12671 if (group == NULL)
12672 return FALSE;
12673 group->link_sec = curr;
12674 group->stub_sec = NULL;
a4b6fadd 12675 group->needs_save_res = 0;
df136d64
AM
12676 group->lr_restore = 0;
12677 group->eh_size = 0;
12678 group->eh_base = 0;
a4b6fadd
AM
12679 group->next = htab->group;
12680 htab->group = group;
734b6cf9 12681 do
721956f4 12682 {
6f20ed8a 12683 prev = htab->sec_info[tail->id].u.list;
734b6cf9 12684 /* Set up this stub group. */
6f20ed8a 12685 htab->sec_info[tail->id].u.group = group;
721956f4 12686 }
734b6cf9
AM
12687 while (tail != curr && (tail = prev) != NULL);
12688
09f92717 12689 /* But wait, there's more! Input sections up to group_size
734b6cf9
AM
12690 bytes before the stub section can be handled by it too.
12691 Don't do this if we have a really large section after the
12692 stubs, as adding more stubs increases the chance that
12693 branches may not reach into the stub section. */
12694 if (!stubs_always_before_branch && !big_sec)
12695 {
12696 total = 0;
12697 while (prev != NULL
12698 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
12699 < (ppc64_elf_section_data (prev) != NULL
12700 && ppc64_elf_section_data (prev)->has_14bit_branch
2cdcc330
AM
12701 ? (group_size = stub_group_size >> 10)
12702 : group_size))
6f20ed8a 12703 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12704 {
12705 tail = prev;
6f20ed8a
AM
12706 prev = htab->sec_info[tail->id].u.list;
12707 htab->sec_info[tail->id].u.group = group;
734b6cf9
AM
12708 }
12709 }
12710 tail = prev;
721956f4
AM
12711 }
12712 }
6f20ed8a 12713 return TRUE;
721956f4
AM
12714}
12715
58d180e8
AM
12716static const unsigned char glink_eh_frame_cie[] =
12717{
12718 0, 0, 0, 16, /* length. */
12719 0, 0, 0, 0, /* id. */
12720 1, /* CIE version. */
12721 'z', 'R', 0, /* Augmentation string. */
12722 4, /* Code alignment. */
12723 0x78, /* Data alignment. */
12724 65, /* RA reg. */
12725 1, /* Augmentation size. */
12726 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
2e0ce1c8 12727 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
58d180e8
AM
12728};
12729
d969d15f
AM
12730/* Stripping output sections is normally done before dynamic section
12731 symbols have been allocated. This function is called later, and
12732 handles cases like htab->brlt which is mapped to its own output
12733 section. */
12734
12735static void
12736maybe_strip_output (struct bfd_link_info *info, asection *isec)
12737{
12738 if (isec->size == 0
12739 && isec->output_section->size == 0
53d8967a 12740 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
12741 && !bfd_section_removed_from_list (info->output_bfd,
12742 isec->output_section)
12743 && elf_section_data (isec->output_section)->dynindx == 0)
12744 {
12745 isec->output_section->flags |= SEC_EXCLUDE;
12746 bfd_section_list_remove (info->output_bfd, isec->output_section);
12747 info->output_bfd->section_count--;
12748 }
12749}
12750
721956f4
AM
12751/* Determine and set the size of the stub section for a final link.
12752
12753 The basic idea here is to examine all the relocations looking for
12754 PC-relative calls to a target that is unreachable with a "bl"
12755 instruction. */
12756
b34976b6 12757bfd_boolean
e7d1c40c 12758ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
12759{
12760 bfd_size_type stub_group_size;
b34976b6 12761 bfd_boolean stubs_always_before_branch;
721956f4
AM
12762 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12763
4dfe6ac6
NC
12764 if (htab == NULL)
12765 return FALSE;
12766
0e1862bb 12767 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
e7d1c40c 12768 htab->params->plt_thread_safe = 1;
b9e5796b 12769 if (!htab->opd_abi)
e7d1c40c
AM
12770 htab->params->plt_thread_safe = 0;
12771 else if (htab->params->plt_thread_safe == -1)
794e51c0 12772 {
e2458743 12773 static const char *const thread_starter[] =
794e51c0
AM
12774 {
12775 "pthread_create",
12776 /* libstdc++ */
12777 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12778 /* librt */
12779 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12780 "mq_notify", "create_timer",
12781 /* libanl */
12782 "getaddrinfo_a",
12783 /* libgomp */
2300b5a1 12784 "GOMP_parallel",
794e51c0 12785 "GOMP_parallel_start",
2300b5a1 12786 "GOMP_parallel_loop_static",
794e51c0 12787 "GOMP_parallel_loop_static_start",
2300b5a1 12788 "GOMP_parallel_loop_dynamic",
794e51c0 12789 "GOMP_parallel_loop_dynamic_start",
2300b5a1 12790 "GOMP_parallel_loop_guided",
794e51c0 12791 "GOMP_parallel_loop_guided_start",
2300b5a1 12792 "GOMP_parallel_loop_runtime",
794e51c0 12793 "GOMP_parallel_loop_runtime_start",
2300b5a1 12794 "GOMP_parallel_sections",
68ffbac6 12795 "GOMP_parallel_sections_start",
f9dffbf0
AM
12796 /* libgo */
12797 "__go_go",
794e51c0
AM
12798 };
12799 unsigned i;
12800
a4b6fadd 12801 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
794e51c0
AM
12802 {
12803 struct elf_link_hash_entry *h;
12804 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12805 FALSE, FALSE, TRUE);
e7d1c40c
AM
12806 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12807 if (htab->params->plt_thread_safe)
794e51c0
AM
12808 break;
12809 }
12810 }
e7d1c40c
AM
12811 stubs_always_before_branch = htab->params->group_size < 0;
12812 if (htab->params->group_size < 0)
12813 stub_group_size = -htab->params->group_size;
721956f4 12814 else
e7d1c40c 12815 stub_group_size = htab->params->group_size;
721956f4 12816
6f20ed8a
AM
12817 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12818 return FALSE;
721956f4 12819
c9301e31
AM
12820#define STUB_SHRINK_ITER 20
12821 /* Loop until no stubs added. After iteration 20 of this loop we may
12822 exit on a stub section shrinking. This is to break out of a
12823 pathological case where adding stubs on one iteration decreases
12824 section gaps (perhaps due to alignment), which then requires
12825 fewer or smaller stubs on the next iteration. */
12826
721956f4
AM
12827 while (1)
12828 {
12829 bfd *input_bfd;
12830 unsigned int bfd_indx;
a4b6fadd 12831 struct map_stub *group;
721956f4
AM
12832
12833 htab->stub_iteration += 1;
721956f4
AM
12834
12835 for (input_bfd = info->input_bfds, bfd_indx = 0;
12836 input_bfd != NULL;
c72f2fb2 12837 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
12838 {
12839 Elf_Internal_Shdr *symtab_hdr;
12840 asection *section;
6cdc0ccc 12841 Elf_Internal_Sym *local_syms = NULL;
721956f4 12842
0c8d6e5c 12843 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
12844 continue;
12845
721956f4 12846 /* We'll need the symbol table in a second. */
0ffa91dd 12847 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
12848 if (symtab_hdr->sh_info == 0)
12849 continue;
12850
721956f4
AM
12851 /* Walk over each section attached to the input bfd. */
12852 for (section = input_bfd->sections;
12853 section != NULL;
12854 section = section->next)
12855 {
721956f4 12856 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
12857
12858 /* If there aren't any relocs, then there's nothing more
12859 to do. */
12860 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
12861 || (section->flags & SEC_ALLOC) == 0
12862 || (section->flags & SEC_LOAD) == 0
12863 || (section->flags & SEC_CODE) == 0
721956f4
AM
12864 || section->reloc_count == 0)
12865 continue;
12866
12867 /* If this section is a link-once section that will be
12868 discarded, then don't create any stubs. */
12869 if (section->output_section == NULL
927be08e 12870 || section->output_section->owner != info->output_bfd)
721956f4
AM
12871 continue;
12872
1e2f5b6e
AM
12873 /* Get the relocs. */
12874 internal_relocs
4ce794b7 12875 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 12876 info->keep_memory);
721956f4 12877 if (internal_relocs == NULL)
1e2f5b6e 12878 goto error_ret_free_local;
721956f4
AM
12879
12880 /* Now examine each relocation. */
12881 irela = internal_relocs;
12882 irelaend = irela + section->reloc_count;
12883 for (; irela < irelaend; irela++)
12884 {
4ce794b7
AM
12885 enum elf_ppc64_reloc_type r_type;
12886 unsigned int r_indx;
721956f4
AM
12887 enum ppc_stub_type stub_type;
12888 struct ppc_stub_hash_entry *stub_entry;
8387904d 12889 asection *sym_sec, *code_sec;
e054468f 12890 bfd_vma sym_value, code_value;
721956f4 12891 bfd_vma destination;
6911b7dc 12892 unsigned long local_off;
8843416a 12893 bfd_boolean ok_dest;
721956f4 12894 struct ppc_link_hash_entry *hash;
8387904d 12895 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
12896 struct elf_link_hash_entry *h;
12897 Elf_Internal_Sym *sym;
721956f4
AM
12898 char *stub_name;
12899 const asection *id_sec;
74f0fb50 12900 struct _opd_sec_data *opd;
e054468f 12901 struct plt_entry *plt_ent;
721956f4
AM
12902
12903 r_type = ELF64_R_TYPE (irela->r_info);
12904 r_indx = ELF64_R_SYM (irela->r_info);
12905
4ce794b7 12906 if (r_type >= R_PPC64_max)
721956f4
AM
12907 {
12908 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 12909 goto error_ret_free_internal;
721956f4
AM
12910 }
12911
12912 /* Only look for stubs on branch instructions. */
4ce794b7 12913 if (r_type != R_PPC64_REL24
05d0e962 12914 && r_type != R_PPC64_REL24_NOTOC
4ce794b7
AM
12915 && r_type != R_PPC64_REL14
12916 && r_type != R_PPC64_REL14_BRTAKEN
12917 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
12918 continue;
12919
12920 /* Now determine the call target, its name, value,
12921 section. */
411e1bfb
AM
12922 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12923 r_indx, input_bfd))
12924 goto error_ret_free_internal;
12925 hash = (struct ppc_link_hash_entry *) h;
12926
8843416a 12927 ok_dest = FALSE;
8387904d 12928 fdh = NULL;
7fe2b9a6 12929 sym_value = 0;
411e1bfb 12930 if (hash == NULL)
721956f4 12931 {
411e1bfb 12932 sym_value = sym->st_value;
c27b8c2a
AM
12933 if (sym_sec != NULL
12934 && sym_sec->output_section != NULL)
12935 ok_dest = TRUE;
721956f4 12936 }
7fe2b9a6
AM
12937 else if (hash->elf.root.type == bfd_link_hash_defined
12938 || hash->elf.root.type == bfd_link_hash_defweak)
12939 {
12940 sym_value = hash->elf.root.u.def.value;
12941 if (sym_sec->output_section != NULL)
12942 ok_dest = TRUE;
12943 }
12944 else if (hash->elf.root.type == bfd_link_hash_undefweak
12945 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 12946 {
99877b66 12947 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
12948 use the func descriptor sym instead if it is
12949 defined. */
ceb1f1ef 12950 if (hash->elf.root.root.string[0] == '.'
8c5b4e52 12951 && hash->oh != NULL)
8387904d 12952 {
8c5b4e52 12953 fdh = ppc_follow_link (hash->oh);
8387904d
AM
12954 if (fdh->elf.root.type == bfd_link_hash_defined
12955 || fdh->elf.root.type == bfd_link_hash_defweak)
12956 {
12957 sym_sec = fdh->elf.root.u.def.section;
12958 sym_value = fdh->elf.root.u.def.value;
12959 if (sym_sec->output_section != NULL)
12960 ok_dest = TRUE;
12961 }
99877b66
AM
12962 else
12963 fdh = NULL;
8387904d 12964 }
7fe2b9a6
AM
12965 }
12966 else
12967 {
12968 bfd_set_error (bfd_error_bad_value);
12969 goto error_ret_free_internal;
721956f4
AM
12970 }
12971
8843416a 12972 destination = 0;
6911b7dc 12973 local_off = 0;
8843416a
AM
12974 if (ok_dest)
12975 {
12976 sym_value += irela->r_addend;
12977 destination = (sym_value
12978 + sym_sec->output_offset
12979 + sym_sec->output_section->vma);
6911b7dc
AM
12980 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12981 ? hash->elf.other
12982 : sym->st_other);
8843416a
AM
12983 }
12984
8387904d 12985 code_sec = sym_sec;
e054468f 12986 code_value = sym_value;
74f0fb50
AM
12987 opd = get_opd_info (sym_sec);
12988 if (opd != NULL)
8387904d
AM
12989 {
12990 bfd_vma dest;
12991
74f0fb50 12992 if (hash == NULL && opd->adjust != NULL)
8387904d 12993 {
51aecdc5 12994 long adjust = opd->adjust[OPD_NDX (sym_value)];
8387904d
AM
12995 if (adjust == -1)
12996 continue;
e054468f 12997 code_value += adjust;
8387904d
AM
12998 sym_value += adjust;
12999 }
13000 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 13001 &code_sec, &code_value, FALSE);
8387904d
AM
13002 if (dest != (bfd_vma) -1)
13003 {
13004 destination = dest;
13005 if (fdh != NULL)
13006 {
13007 /* Fixup old ABI sym to point at code
13008 entry. */
99877b66 13009 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 13010 hash->elf.root.u.def.section = code_sec;
e054468f 13011 hash->elf.root.u.def.value = code_value;
8387904d
AM
13012 }
13013 }
13014 }
13015
721956f4 13016 /* Determine what (if any) linker stub is needed. */
e054468f 13017 plt_ent = NULL;
721956f4 13018 stub_type = ppc_type_of_stub (section, irela, &hash,
6911b7dc
AM
13019 &plt_ent, destination,
13020 local_off);
ad8e1ba5 13021
05d0e962
AM
13022 if (r_type == R_PPC64_REL24_NOTOC)
13023 {
13024 if (stub_type == ppc_stub_plt_call)
13025 stub_type = ppc_stub_plt_call_notoc;
13026 else if (stub_type == ppc_stub_long_branch
13027 || (code_sec != NULL
13028 && code_sec->output_section != NULL
13029 && (((hash ? hash->elf.other : sym->st_other)
13030 & STO_PPC64_LOCAL_MASK)
4a4e7361 13031 > 1 << STO_PPC64_LOCAL_BIT)))
05d0e962
AM
13032 stub_type = ppc_stub_long_branch_notoc;
13033 }
13034 else if (stub_type != ppc_stub_plt_call)
ad8e1ba5
AM
13035 {
13036 /* Check whether we need a TOC adjusting stub.
13037 Since the linker pastes together pieces from
13038 different object files when creating the
13039 _init and _fini functions, it may be that a
13040 call to what looks like a local sym is in
13041 fact a call needing a TOC adjustment. */
33cb30a1
AM
13042 if ((code_sec != NULL
13043 && code_sec->output_section != NULL
13044 && (htab->sec_info[code_sec->id].toc_off
13045 != htab->sec_info[section->id].toc_off)
13046 && (code_sec->has_toc_reloc
13047 || code_sec->makes_toc_func_call))
13048 || (((hash ? hash->elf.other : sym->st_other)
13049 & STO_PPC64_LOCAL_MASK)
13050 == 1 << STO_PPC64_LOCAL_BIT))
ad8e1ba5
AM
13051 stub_type = ppc_stub_long_branch_r2off;
13052 }
13053
721956f4
AM
13054 if (stub_type == ppc_stub_none)
13055 continue;
13056
411e1bfb
AM
13057 /* __tls_get_addr calls might be eliminated. */
13058 if (stub_type != ppc_stub_plt_call
05d0e962 13059 && stub_type != ppc_stub_plt_call_notoc
411e1bfb 13060 && hash != NULL
8387904d
AM
13061 && (hash == htab->tls_get_addr
13062 || hash == htab->tls_get_addr_fd)
411e1bfb
AM
13063 && section->has_tls_reloc
13064 && irela != internal_relocs)
13065 {
13066 /* Get tls info. */
f961d9dd 13067 unsigned char *tls_mask;
411e1bfb 13068
3a71aa26 13069 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
13070 irela - 1, input_bfd))
13071 goto error_ret_free_internal;
37da22e5 13072 if ((*tls_mask & TLS_TLS) != 0)
411e1bfb
AM
13073 continue;
13074 }
13075
f378ab09 13076 if (stub_type == ppc_stub_plt_call)
794e51c0 13077 {
6e1816be
AM
13078 if (!htab->opd_abi
13079 && htab->params->plt_localentry0 != 0
13080 && is_elfv2_localentry0 (&hash->elf))
13081 htab->has_plt_localentry0 = 1;
13082 else if (irela + 1 < irelaend
13083 && irela[1].r_offset == irela->r_offset + 4
13084 && (ELF64_R_TYPE (irela[1].r_info)
13085 == R_PPC64_TOCSAVE))
f378ab09
AM
13086 {
13087 if (!tocsave_find (htab, INSERT,
13088 &local_syms, irela + 1, input_bfd))
13089 goto error_ret_free_internal;
13090 }
f378ab09
AM
13091 else
13092 stub_type = ppc_stub_plt_call_r2save;
794e51c0 13093 }
3b421ab3 13094
721956f4 13095 /* Support for grouping stub sections. */
6f20ed8a 13096 id_sec = htab->sec_info[section->id].u.group->link_sec;
721956f4
AM
13097
13098 /* Get the name of this stub. */
13099 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
13100 if (!stub_name)
13101 goto error_ret_free_internal;
13102
13103 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 13104 stub_name, FALSE, FALSE);
721956f4
AM
13105 if (stub_entry != NULL)
13106 {
05d0e962
AM
13107 enum ppc_stub_type old_type;
13108 /* A stub has already been created, but it may
13109 not be the required type. We shouldn't be
13110 transitioning from plt_call to long_branch
13111 stubs or vice versa, but we might be
13112 upgrading from plt_call to plt_call_r2save or
13113 from long_branch to long_branch_r2off. */
721956f4 13114 free (stub_name);
05d0e962
AM
13115 old_type = stub_entry->stub_type;
13116 switch (old_type)
13117 {
13118 default:
13119 abort ();
13120
13121 case ppc_stub_save_res:
13122 continue;
13123
13124 case ppc_stub_plt_call:
13125 case ppc_stub_plt_call_r2save:
13126 case ppc_stub_plt_call_notoc:
13127 case ppc_stub_plt_call_both:
13128 if (stub_type == ppc_stub_plt_call)
13129 continue;
13130 else if (stub_type == ppc_stub_plt_call_r2save)
13131 {
13132 if (old_type == ppc_stub_plt_call_notoc)
13133 stub_type = ppc_stub_plt_call_both;
13134 }
13135 else if (stub_type == ppc_stub_plt_call_notoc)
13136 {
13137 if (old_type == ppc_stub_plt_call_r2save)
13138 stub_type = ppc_stub_plt_call_both;
13139 }
13140 else
13141 abort ();
13142 break;
13143
13144 case ppc_stub_plt_branch:
13145 case ppc_stub_plt_branch_r2off:
13146 case ppc_stub_plt_branch_notoc:
13147 case ppc_stub_plt_branch_both:
13148 old_type += (ppc_stub_long_branch
13149 - ppc_stub_plt_branch);
13150 /* Fall through. */
13151 case ppc_stub_long_branch:
13152 case ppc_stub_long_branch_r2off:
13153 case ppc_stub_long_branch_notoc:
13154 case ppc_stub_long_branch_both:
13155 if (stub_type == ppc_stub_long_branch)
13156 continue;
13157 else if (stub_type == ppc_stub_long_branch_r2off)
13158 {
13159 if (old_type == ppc_stub_long_branch_notoc)
13160 stub_type = ppc_stub_long_branch_both;
13161 }
13162 else if (stub_type == ppc_stub_long_branch_notoc)
13163 {
13164 if (old_type == ppc_stub_long_branch_r2off)
13165 stub_type = ppc_stub_long_branch_both;
13166 }
13167 else
13168 abort ();
13169 break;
13170 }
13171 if (old_type < stub_type)
794e51c0 13172 stub_entry->stub_type = stub_type;
721956f4
AM
13173 continue;
13174 }
13175
25f53a85 13176 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
13177 if (stub_entry == NULL)
13178 {
13179 free (stub_name);
6cdc0ccc
AM
13180 error_ret_free_internal:
13181 if (elf_section_data (section)->relocs == NULL)
13182 free (internal_relocs);
13183 error_ret_free_local:
13184 if (local_syms != NULL
13185 && (symtab_hdr->contents
13186 != (unsigned char *) local_syms))
13187 free (local_syms);
b34976b6 13188 return FALSE;
721956f4
AM
13189 }
13190
ad8e1ba5 13191 stub_entry->stub_type = stub_type;
05d0e962
AM
13192 if (stub_type >= ppc_stub_plt_call
13193 && stub_type <= ppc_stub_plt_call_both)
e054468f 13194 {
05d0e962
AM
13195 stub_entry->target_value = sym_value;
13196 stub_entry->target_section = sym_sec;
e054468f
AM
13197 }
13198 else
13199 {
05d0e962
AM
13200 stub_entry->target_value = code_value;
13201 stub_entry->target_section = code_sec;
e054468f 13202 }
721956f4 13203 stub_entry->h = hash;
e054468f 13204 stub_entry->plt_ent = plt_ent;
2d7ad24e
AM
13205 stub_entry->symtype
13206 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
6911b7dc 13207 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95 13208
3d58e1fc
AM
13209 if (hash != NULL
13210 && (hash->elf.root.type == bfd_link_hash_defined
13211 || hash->elf.root.type == bfd_link_hash_defweak))
ee75fd95 13212 htab->stub_globals += 1;
721956f4
AM
13213 }
13214
13215 /* We're done with the internal relocs, free them. */
6cdc0ccc 13216 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 13217 free (internal_relocs);
721956f4 13218 }
6cdc0ccc
AM
13219
13220 if (local_syms != NULL
13221 && symtab_hdr->contents != (unsigned char *) local_syms)
13222 {
13223 if (!info->keep_memory)
13224 free (local_syms);
13225 else
13226 symtab_hdr->contents = (unsigned char *) local_syms;
13227 }
721956f4
AM
13228 }
13229
5c3dead3 13230 /* We may have added some stubs. Find out the new size of the
721956f4 13231 stub sections. */
d4aaa2a0 13232 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13233 {
13234 group->lr_restore = 0;
13235 group->eh_size = 0;
13236 if (group->stub_sec != NULL)
13237 {
13238 asection *stub_sec = group->stub_sec;
13239
13240 if (htab->stub_iteration <= STUB_SHRINK_ITER
13241 || stub_sec->rawsize < stub_sec->size)
13242 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
13243 stub_sec->rawsize = stub_sec->size;
13244 stub_sec->size = 0;
13245 stub_sec->reloc_count = 0;
13246 stub_sec->flags &= ~SEC_RELOC;
13247 }
13248 }
eea6121a 13249
ba21f564
AM
13250 if (htab->stub_iteration <= STUB_SHRINK_ITER
13251 || htab->brlt->rawsize < htab->brlt->size)
13252 htab->brlt->rawsize = htab->brlt->size;
eea6121a 13253 htab->brlt->size = 0;
84f5d08e
AM
13254 htab->brlt->reloc_count = 0;
13255 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 13256 if (htab->relbrlt != NULL)
eea6121a 13257 htab->relbrlt->size = 0;
721956f4 13258
63bc6f6c 13259 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 13260
a4b6fadd
AM
13261 for (group = htab->group; group != NULL; group = group->next)
13262 if (group->needs_save_res)
13263 group->stub_sec->size += htab->sfpr->size;
13264
176a0d42
AM
13265 if (info->emitrelocations
13266 && htab->glink != NULL && htab->glink->size != 0)
13267 {
13268 htab->glink->reloc_count = 1;
13269 htab->glink->flags |= SEC_RELOC;
13270 }
13271
58d180e8
AM
13272 if (htab->glink_eh_frame != NULL
13273 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
2d0d44d5 13274 && htab->glink_eh_frame->output_section->size > 8)
58d180e8 13275 {
2e0ce1c8 13276 size_t size = 0, align = 4;
58d180e8 13277
d4aaa2a0 13278 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13279 if (group->eh_size != 0)
13280 size += (group->eh_size + 17 + align - 1) & -align;
58d180e8 13281 if (htab->glink != NULL && htab->glink->size != 0)
2e0ce1c8 13282 size += (24 + align - 1) & -align;
58d180e8 13283 if (size != 0)
2e0ce1c8
AM
13284 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
13285 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
13286 size = (size + align - 1) & -align;
58d180e8
AM
13287 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
13288 htab->glink_eh_frame->size = size;
13289 }
13290
e7d1c40c 13291 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13292 for (group = htab->group; group != NULL; group = group->next)
13293 if (group->stub_sec != NULL)
691d2e9a
AM
13294 {
13295 int align = abs (htab->params->plt_stub_align);
13296 group->stub_sec->size
13297 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
13298 }
d4aaa2a0
AM
13299
13300 for (group = htab->group; group != NULL; group = group->next)
13301 if (group->stub_sec != NULL
13302 && group->stub_sec->rawsize != group->stub_sec->size
c9301e31 13303 && (htab->stub_iteration <= STUB_SHRINK_ITER
d4aaa2a0 13304 || group->stub_sec->rawsize < group->stub_sec->size))
5c3dead3
AM
13305 break;
13306
d4aaa2a0 13307 if (group == NULL
ba21f564
AM
13308 && (htab->brlt->rawsize == htab->brlt->size
13309 || (htab->stub_iteration > STUB_SHRINK_ITER
13310 && htab->brlt->rawsize > htab->brlt->size))
58d180e8
AM
13311 && (htab->glink_eh_frame == NULL
13312 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
5c3dead3
AM
13313 break;
13314
721956f4 13315 /* Ask the linker to do its stuff. */
e7d1c40c 13316 (*htab->params->layout_sections_again) ();
721956f4
AM
13317 }
13318
da44f4e5
AM
13319 if (htab->glink_eh_frame != NULL
13320 && htab->glink_eh_frame->size != 0)
13321 {
13322 bfd_vma val;
13323 bfd_byte *p, *last_fde;
13324 size_t last_fde_len, size, align, pad;
d4aaa2a0 13325 struct map_stub *group;
da44f4e5 13326
df136d64
AM
13327 /* It is necessary to at least have a rough outline of the
13328 linker generated CIEs and FDEs written before
13329 bfd_elf_discard_info is run, in order for these FDEs to be
13330 indexed in .eh_frame_hdr. */
da44f4e5
AM
13331 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
13332 if (p == NULL)
13333 return FALSE;
13334 htab->glink_eh_frame->contents = p;
13335 last_fde = p;
2e0ce1c8 13336 align = 4;
da44f4e5
AM
13337
13338 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
13339 /* CIE length (rewrite in case little-endian). */
2e0ce1c8 13340 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
da44f4e5 13341 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
2e0ce1c8 13342 p += last_fde_len + 4;
da44f4e5 13343
d4aaa2a0 13344 for (group = htab->group; group != NULL; group = group->next)
df136d64 13345 if (group->eh_size != 0)
da44f4e5 13346 {
df136d64 13347 group->eh_base = p - htab->glink_eh_frame->contents;
da44f4e5 13348 last_fde = p;
df136d64 13349 last_fde_len = ((group->eh_size + 17 + align - 1) & -align) - 4;
da44f4e5 13350 /* FDE length. */
2e0ce1c8 13351 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13352 p += 4;
13353 /* CIE pointer. */
13354 val = p - htab->glink_eh_frame->contents;
13355 bfd_put_32 (htab->elf.dynobj, val, p);
13356 p += 4;
13357 /* Offset to stub section, written later. */
13358 p += 4;
13359 /* stub section size. */
d4aaa2a0 13360 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
da44f4e5
AM
13361 p += 4;
13362 /* Augmentation. */
13363 p += 1;
df136d64
AM
13364 /* Make sure we don't have all nops. This is enough for
13365 elf-eh-frame.c to detect the last non-nop opcode. */
13366 p[group->eh_size - 1] = DW_CFA_advance_loc + 1;
d4aaa2a0 13367 p = last_fde + last_fde_len + 4;
da44f4e5
AM
13368 }
13369 if (htab->glink != NULL && htab->glink->size != 0)
13370 {
13371 last_fde = p;
2e0ce1c8 13372 last_fde_len = ((24 + align - 1) & -align) - 4;
da44f4e5 13373 /* FDE length. */
2e0ce1c8 13374 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13375 p += 4;
13376 /* CIE pointer. */
13377 val = p - htab->glink_eh_frame->contents;
13378 bfd_put_32 (htab->elf.dynobj, val, p);
13379 p += 4;
13380 /* Offset to .glink, written later. */
13381 p += 4;
13382 /* .glink size. */
13383 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
13384 p += 4;
13385 /* Augmentation. */
13386 p += 1;
13387
13388 *p++ = DW_CFA_advance_loc + 1;
13389 *p++ = DW_CFA_register;
13390 *p++ = 65;
9f08fa5c 13391 *p++ = htab->opd_abi ? 12 : 0;
15a3a14f 13392 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
da44f4e5
AM
13393 *p++ = DW_CFA_restore_extended;
13394 *p++ = 65;
2e0ce1c8 13395 p += ((24 + align - 1) & -align) - 24;
da44f4e5
AM
13396 }
13397 /* Subsume any padding into the last FDE if user .eh_frame
13398 sections are aligned more than glink_eh_frame. Otherwise any
13399 zero padding will be seen as a terminator. */
2e0ce1c8 13400 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
da44f4e5 13401 size = p - htab->glink_eh_frame->contents;
2e0ce1c8 13402 pad = ((size + align - 1) & -align) - size;
da44f4e5
AM
13403 htab->glink_eh_frame->size = size + pad;
13404 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
13405 }
13406
d969d15f
AM
13407 maybe_strip_output (info, htab->brlt);
13408 if (htab->glink_eh_frame != NULL)
13409 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 13410
b34976b6 13411 return TRUE;
721956f4
AM
13412}
13413
13414/* Called after we have determined section placement. If sections
805fc799 13415 move, we'll be called again. Provide a value for TOCstart. */
721956f4 13416
805fc799 13417bfd_vma
1c865ab2 13418ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 13419{
805fc799 13420 asection *s;
a27e685f 13421 bfd_vma TOCstart, adjust;
721956f4 13422
43417696
AM
13423 if (info != NULL)
13424 {
13425 struct elf_link_hash_entry *h;
13426 struct elf_link_hash_table *htab = elf_hash_table (info);
13427
13428 if (is_elf_hash_table (htab)
13429 && htab->hgot != NULL)
13430 h = htab->hgot;
13431 else
13432 {
13433 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
13434 if (is_elf_hash_table (htab))
13435 htab->hgot = h;
13436 }
13437 if (h != NULL
13438 && h->root.type == bfd_link_hash_defined
13439 && !h->root.linker_def
13440 && (!is_elf_hash_table (htab)
13441 || h->def_regular))
13442 {
13443 TOCstart = (h->root.u.def.value - TOC_BASE_OFF
13444 + h->root.u.def.section->output_offset
13445 + h->root.u.def.section->output_section->vma);
13446 _bfd_set_gp_value (obfd, TOCstart);
13447 return TOCstart;
13448 }
13449 }
13450
805fc799
AM
13451 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
13452 order. The TOC starts where the first of these sections starts. */
13453 s = bfd_get_section_by_name (obfd, ".got");
e054468f 13454 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13455 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 13456 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13457 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 13458 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13459 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 13460 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
13461 {
13462 /* This may happen for
13463 o references to TOC base (SYM@toc / TOC[tc0]) without a
13464 .toc directive
13465 o bad linker script
13466 o --gc-sections and empty TOC sections
13467
13468 FIXME: Warn user? */
13469
13470 /* Look for a likely section. We probably won't even be
13471 using TOCstart. */
13472 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13473 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
13474 | SEC_EXCLUDE))
805fc799
AM
13475 == (SEC_ALLOC | SEC_SMALL_DATA))
13476 break;
721956f4 13477 if (s == NULL)
805fc799 13478 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13479 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
13480 == (SEC_ALLOC | SEC_SMALL_DATA))
13481 break;
721956f4 13482 if (s == NULL)
805fc799 13483 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13484 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
13485 == SEC_ALLOC)
805fc799 13486 break;
721956f4 13487 if (s == NULL)
805fc799 13488 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13489 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
13490 break;
13491 }
721956f4 13492
805fc799
AM
13493 TOCstart = 0;
13494 if (s != NULL)
13495 TOCstart = s->output_section->vma + s->output_offset;
721956f4 13496
a27e685f
AM
13497 /* Force alignment. */
13498 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
13499 TOCstart -= adjust;
1c865ab2
AM
13500 _bfd_set_gp_value (obfd, TOCstart);
13501
810d4e75 13502 if (info != NULL && s != NULL)
1c865ab2
AM
13503 {
13504 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13505
810d4e75
AM
13506 if (htab != NULL)
13507 {
13508 if (htab->elf.hgot != NULL)
13509 {
a27e685f 13510 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
810d4e75
AM
13511 htab->elf.hgot->root.u.def.section = s;
13512 }
13513 }
13514 else
1c865ab2 13515 {
810d4e75
AM
13516 struct bfd_link_hash_entry *bh = NULL;
13517 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
a27e685f
AM
13518 s, TOC_BASE_OFF - adjust,
13519 NULL, FALSE, FALSE, &bh);
1c865ab2
AM
13520 }
13521 }
805fc799 13522 return TOCstart;
721956f4
AM
13523}
13524
a345bc8d 13525/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
49c09209 13526 write out any global entry stubs, and PLT relocations. */
a345bc8d
AM
13527
13528static bfd_boolean
49c09209 13529build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
a345bc8d
AM
13530{
13531 struct bfd_link_info *info;
13532 struct ppc_link_hash_table *htab;
49c09209 13533 struct plt_entry *ent;
a345bc8d
AM
13534 asection *s;
13535
13536 if (h->root.type == bfd_link_hash_indirect)
13537 return TRUE;
13538
49c09209
AM
13539 info = inf;
13540 htab = ppc_hash_table (info);
13541 if (htab == NULL)
13542 return FALSE;
13543
13544 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13545 if (ent->plt.offset != (bfd_vma) -1)
13546 {
13547 /* This symbol has an entry in the procedure linkage
13548 table. Set it up. */
13549 Elf_Internal_Rela rela;
2d7ad24e 13550 asection *plt, *relplt;
49c09209
AM
13551 bfd_byte *loc;
13552
13553 if (!htab->elf.dynamic_sections_created
13554 || h->dynindx == -1)
13555 {
13556 if (!(h->def_regular
13557 && (h->root.type == bfd_link_hash_defined
13558 || h->root.type == bfd_link_hash_defweak)))
13559 continue;
2d7ad24e
AM
13560 if (h->type == STT_GNU_IFUNC)
13561 {
13562 plt = htab->elf.iplt;
13563 relplt = htab->elf.irelplt;
13564 htab->local_ifunc_resolver = 1;
13565 if (htab->opd_abi)
13566 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13567 else
13568 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13569 }
49c09209 13570 else
2d7ad24e
AM
13571 {
13572 plt = htab->pltlocal;
13573 if (bfd_link_pic (info))
13574 {
13575 relplt = htab->relpltlocal;
13576 if (htab->opd_abi)
13577 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13578 else
13579 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13580 }
13581 else
13582 relplt = NULL;
13583 }
49c09209
AM
13584 rela.r_addend = (h->root.u.def.value
13585 + h->root.u.def.section->output_offset
13586 + h->root.u.def.section->output_section->vma
13587 + ent->addend);
2d7ad24e
AM
13588
13589 if (relplt == NULL)
13590 {
13591 loc = plt->contents + ent->plt.offset;
13592 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
13593 if (htab->opd_abi)
13594 {
13595 bfd_vma toc = elf_gp (info->output_bfd);
13596 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
13597 bfd_put_64 (info->output_bfd, toc, loc + 8);
13598 }
13599 }
13600 else
13601 {
13602 rela.r_offset = (plt->output_section->vma
13603 + plt->output_offset
13604 + ent->plt.offset);
13605 loc = relplt->contents + (relplt->reloc_count++
13606 * sizeof (Elf64_External_Rela));
13607 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13608 }
49c09209
AM
13609 }
13610 else
13611 {
13612 rela.r_offset = (htab->elf.splt->output_section->vma
13613 + htab->elf.splt->output_offset
13614 + ent->plt.offset);
13615 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13616 rela.r_addend = ent->addend;
13617 loc = (htab->elf.srelplt->contents
13618 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
13619 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
13620 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
13621 htab->maybe_local_ifunc_resolver = 1;
2d7ad24e 13622 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
49c09209 13623 }
49c09209
AM
13624 }
13625
a345bc8d
AM
13626 if (!h->pointer_equality_needed)
13627 return TRUE;
13628
13629 if (h->def_regular)
13630 return TRUE;
13631
9e390558 13632 s = htab->global_entry;
49c09209
AM
13633 if (s == NULL || s->size == 0)
13634 return TRUE;
13635
13636 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13637 if (ent->plt.offset != (bfd_vma) -1
13638 && ent->addend == 0)
a345bc8d
AM
13639 {
13640 bfd_byte *p;
13641 asection *plt;
13642 bfd_vma off;
13643
a345bc8d 13644 p = s->contents + h->root.u.def.value;
33e44f2e 13645 plt = htab->elf.splt;
a345bc8d
AM
13646 if (!htab->elf.dynamic_sections_created
13647 || h->dynindx == -1)
2d7ad24e
AM
13648 {
13649 if (h->type == STT_GNU_IFUNC)
13650 plt = htab->elf.iplt;
13651 else
13652 plt = htab->pltlocal;
13653 }
49c09209 13654 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
a345bc8d
AM
13655 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
13656
13657 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
13658 {
13659 info->callbacks->einfo
c1c8c1ef 13660 (_("%P: linkage table error against `%pT'\n"),
a345bc8d
AM
13661 h->root.root.string);
13662 bfd_set_error (bfd_error_bad_value);
13663 htab->stub_error = TRUE;
13664 }
13665
7341d5e2
AM
13666 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13667 if (htab->params->emit_stub_syms)
13668 {
13669 size_t len = strlen (h->root.root.string);
13670 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13671
13672 if (name == NULL)
13673 return FALSE;
13674
13675 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13676 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13677 if (h == NULL)
13678 return FALSE;
13679 if (h->root.type == bfd_link_hash_new)
13680 {
13681 h->root.type = bfd_link_hash_defined;
13682 h->root.u.def.section = s;
13683 h->root.u.def.value = p - s->contents;
13684 h->ref_regular = 1;
13685 h->def_regular = 1;
13686 h->ref_regular_nonweak = 1;
13687 h->forced_local = 1;
13688 h->non_elf = 0;
2ec55de3 13689 h->root.linker_def = 1;
7341d5e2
AM
13690 }
13691 }
13692
a345bc8d
AM
13693 if (PPC_HA (off) != 0)
13694 {
13695 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
13696 p += 4;
13697 }
13698 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
13699 p += 4;
13700 bfd_put_32 (s->owner, MTCTR_R12, p);
13701 p += 4;
407aa07c 13702 bfd_put_32 (s->owner, BCTR, p);
a345bc8d
AM
13703 break;
13704 }
13705 return TRUE;
13706}
13707
49c09209
AM
13708/* Write PLT relocs for locals. */
13709
13710static bfd_boolean
13711write_plt_relocs_for_local_syms (struct bfd_link_info *info)
13712{
13713 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13714 bfd *ibfd;
13715
13716 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
13717 {
13718 struct got_entry **lgot_ents, **end_lgot_ents;
13719 struct plt_entry **local_plt, **lplt, **end_local_plt;
13720 Elf_Internal_Shdr *symtab_hdr;
13721 bfd_size_type locsymcount;
13722 Elf_Internal_Sym *local_syms = NULL;
13723 struct plt_entry *ent;
13724
13725 if (!is_ppc64_elf (ibfd))
13726 continue;
13727
13728 lgot_ents = elf_local_got_ents (ibfd);
13729 if (!lgot_ents)
13730 continue;
13731
13732 symtab_hdr = &elf_symtab_hdr (ibfd);
13733 locsymcount = symtab_hdr->sh_info;
13734 end_lgot_ents = lgot_ents + locsymcount;
13735 local_plt = (struct plt_entry **) end_lgot_ents;
13736 end_local_plt = local_plt + locsymcount;
13737 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
13738 for (ent = *lplt; ent != NULL; ent = ent->next)
13739 if (ent->plt.offset != (bfd_vma) -1)
13740 {
13741 Elf_Internal_Sym *sym;
13742 asection *sym_sec;
13743 asection *plt, *relplt;
13744 bfd_byte *loc;
13745 bfd_vma val;
49c09209
AM
13746
13747 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
13748 lplt - local_plt, ibfd))
13749 {
13750 if (local_syms != NULL
13751 && symtab_hdr->contents != (unsigned char *) local_syms)
13752 free (local_syms);
13753 return FALSE;
13754 }
13755
13756 val = sym->st_value + ent->addend;
ba85c15d
AM
13757 if (ELF_ST_TYPE (sym->st_info) != STT_GNU_IFUNC)
13758 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
49c09209
AM
13759 if (sym_sec != NULL && sym_sec->output_section != NULL)
13760 val += sym_sec->output_offset + sym_sec->output_section->vma;
13761
2d7ad24e
AM
13762 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13763 {
13764 htab->local_ifunc_resolver = 1;
13765 plt = htab->elf.iplt;
13766 relplt = htab->elf.irelplt;
13767 }
13768 else
13769 {
13770 plt = htab->pltlocal;
13771 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
13772 }
49c09209 13773
2d7ad24e
AM
13774 if (relplt == NULL)
13775 {
13776 loc = plt->contents + ent->plt.offset;
13777 bfd_put_64 (info->output_bfd, val, loc);
13778 if (htab->opd_abi)
13779 {
13780 bfd_vma toc = elf_gp (ibfd);
13781 bfd_put_64 (info->output_bfd, toc, loc + 8);
13782 }
13783 }
49c09209 13784 else
2d7ad24e
AM
13785 {
13786 Elf_Internal_Rela rela;
13787 rela.r_offset = (ent->plt.offset
13788 + plt->output_offset
13789 + plt->output_section->vma);
13790 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13791 {
13792 if (htab->opd_abi)
13793 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13794 else
13795 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13796 }
13797 else
13798 {
13799 if (htab->opd_abi)
13800 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13801 else
13802 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13803 }
13804 rela.r_addend = val;
13805 loc = relplt->contents + (relplt->reloc_count++
13806 * sizeof (Elf64_External_Rela));
13807 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13808 }
49c09209
AM
13809 }
13810
13811 if (local_syms != NULL
13812 && symtab_hdr->contents != (unsigned char *) local_syms)
13813 {
13814 if (!info->keep_memory)
13815 free (local_syms);
13816 else
13817 symtab_hdr->contents = (unsigned char *) local_syms;
13818 }
13819 }
13820 return TRUE;
13821}
13822
721956f4
AM
13823/* Build all the stubs associated with the current output file.
13824 The stubs are kept in a hash table attached to the main linker
13825 hash table. This function is called via gldelf64ppc_finish. */
13826
b34976b6 13827bfd_boolean
e7d1c40c 13828ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 13829 char **stats)
5d1634d7
AM
13830{
13831 struct ppc_link_hash_table *htab = ppc_hash_table (info);
a4b6fadd 13832 struct map_stub *group;
721956f4 13833 asection *stub_sec;
5d1634d7 13834 bfd_byte *p;
e717da7e 13835 int stub_sec_count = 0;
5d1634d7 13836
4dfe6ac6
NC
13837 if (htab == NULL)
13838 return FALSE;
13839
eea6121a 13840 /* Allocate memory to hold the linker stubs. */
d4aaa2a0 13841 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
13842 {
13843 group->eh_size = 0;
13844 group->lr_restore = 0;
13845 if ((stub_sec = group->stub_sec) != NULL
13846 && stub_sec->size != 0)
13847 {
13848 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd,
13849 stub_sec->size);
13850 if (stub_sec->contents == NULL)
13851 return FALSE;
13852 stub_sec->size = 0;
13853 }
13854 }
5d1634d7 13855
23eb7e01 13856 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 13857 {
9f951329 13858 unsigned int indx;
ad8e1ba5 13859 bfd_vma plt0;
9f951329 13860
721956f4 13861 /* Build the .glink plt call stub. */
e7d1c40c 13862 if (htab->params->emit_stub_syms)
97b639ba
AM
13863 {
13864 struct elf_link_hash_entry *h;
468392fb
AM
13865 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
13866 TRUE, FALSE, FALSE);
97b639ba
AM
13867 if (h == NULL)
13868 return FALSE;
13869 if (h->root.type == bfd_link_hash_new)
13870 {
13871 h->root.type = bfd_link_hash_defined;
13872 h->root.u.def.section = htab->glink;
ee4bf8d2 13873 h->root.u.def.value = 8;
f5385ebf
AM
13874 h->ref_regular = 1;
13875 h->def_regular = 1;
13876 h->ref_regular_nonweak = 1;
13877 h->forced_local = 1;
13878 h->non_elf = 0;
2ec55de3 13879 h->root.linker_def = 1;
97b639ba
AM
13880 }
13881 }
33e44f2e
AM
13882 plt0 = (htab->elf.splt->output_section->vma
13883 + htab->elf.splt->output_offset
13884 - 16);
176a0d42
AM
13885 if (info->emitrelocations)
13886 {
13887 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
13888 if (r == NULL)
13889 return FALSE;
13890 r->r_offset = (htab->glink->output_offset
13891 + htab->glink->output_section->vma);
13892 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
13893 r->r_addend = plt0;
13894 }
4ce794b7 13895 p = htab->glink->contents;
176a0d42 13896 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
13897 bfd_put_64 (htab->glink->owner, plt0, p);
13898 p += 8;
b9e5796b
AM
13899 if (htab->opd_abi)
13900 {
13901 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
13902 p += 4;
13903 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13904 p += 4;
13905 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13906 p += 4;
13907 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13908 p += 4;
13909 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
13910 p += 4;
13911 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13912 p += 4;
13913 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13914 p += 4;
13915 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
13916 p += 4;
13917 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13918 p += 4;
13919 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
13920 p += 4;
13921 }
13922 else
13923 {
13924 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
13925 p += 4;
13926 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13927 p += 4;
13928 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13929 p += 4;
f378ab09
AM
13930 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
13931 p += 4;
b9e5796b
AM
13932 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13933 p += 4;
13934 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
13935 p += 4;
13936 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
13937 p += 4;
13938 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13939 p += 4;
13940 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
13941 p += 4;
13942 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13943 p += 4;
13944 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
13945 p += 4;
13946 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13947 p += 4;
13948 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
13949 p += 4;
13950 }
407aa07c
AM
13951 bfd_put_32 (htab->glink->owner, BCTR, p);
13952 p += 4;
c75bc4f7 13953 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
ad8e1ba5 13954
9f951329
AM
13955 /* Build the .glink lazy link call stubs. */
13956 indx = 0;
9e390558 13957 while (p < htab->glink->contents + htab->glink->size)
9f951329 13958 {
b9e5796b 13959 if (htab->opd_abi)
9f951329 13960 {
b9e5796b
AM
13961 if (indx < 0x8000)
13962 {
13963 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
13964 p += 4;
13965 }
13966 else
13967 {
13968 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
13969 p += 4;
13970 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
13971 p);
13972 p += 4;
13973 }
9f951329 13974 }
4ce794b7 13975 bfd_put_32 (htab->glink->owner,
ee4bf8d2 13976 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 13977 indx++;
9f951329
AM
13978 p += 4;
13979 }
5d1634d7 13980 }
5d1634d7 13981
49c09209
AM
13982 /* Build .glink global entry stubs, and PLT relocs for globals. */
13983 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
13984
13985 if (!write_plt_relocs_for_local_syms (info))
13986 return FALSE;
9e390558 13987
7341d5e2 13988 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 13989 {
4ce794b7 13990 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 13991 htab->brlt->size);
4ce794b7 13992 if (htab->brlt->contents == NULL)
b34976b6 13993 return FALSE;
721956f4 13994 }
ee75fd95 13995 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
13996 {
13997 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 13998 htab->relbrlt->size);
63bc6f6c
AM
13999 if (htab->relbrlt->contents == NULL)
14000 return FALSE;
14001 }
5d1634d7 14002
721956f4
AM
14003 /* Build the stubs as directed by the stub hash table. */
14004 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 14005
a4b6fadd
AM
14006 for (group = htab->group; group != NULL; group = group->next)
14007 if (group->needs_save_res)
7dda8d3c 14008 group->stub_sec->size += htab->sfpr->size;
a4b6fadd 14009
aa8a7074
AM
14010 if (htab->relbrlt != NULL)
14011 htab->relbrlt->reloc_count = 0;
14012
e7d1c40c 14013 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
14014 for (group = htab->group; group != NULL; group = group->next)
14015 if ((stub_sec = group->stub_sec) != NULL)
691d2e9a
AM
14016 {
14017 int align = abs (htab->params->plt_stub_align);
14018 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
14019 }
794e51c0 14020
7dda8d3c
AM
14021 for (group = htab->group; group != NULL; group = group->next)
14022 if (group->needs_save_res)
14023 {
14024 stub_sec = group->stub_sec;
14025 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
14026 htab->sfpr->contents, htab->sfpr->size);
14027 if (htab->params->emit_stub_syms)
14028 {
14029 unsigned int i;
14030
14031 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
14032 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
14033 return FALSE;
14034 }
14035 }
14036
df136d64
AM
14037 if (htab->glink_eh_frame != NULL
14038 && htab->glink_eh_frame->size != 0)
14039 {
14040 bfd_vma val;
14041 size_t align = 4;
14042
14043 p = htab->glink_eh_frame->contents;
14044 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
14045
14046 for (group = htab->group; group != NULL; group = group->next)
14047 if (group->eh_size != 0)
14048 {
14049 /* Offset to stub section. */
14050 val = (group->stub_sec->output_section->vma
14051 + group->stub_sec->output_offset);
14052 val -= (htab->glink_eh_frame->output_section->vma
14053 + htab->glink_eh_frame->output_offset
14054 + (p + 8 - htab->glink_eh_frame->contents));
14055 if (val + 0x80000000 > 0xffffffff)
14056 {
14057 _bfd_error_handler
14058 (_("%s offset too large for .eh_frame sdata4 encoding"),
14059 group->stub_sec->name);
14060 return FALSE;
14061 }
14062 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14063 p += (group->eh_size + 17 + 3) & -4;
14064 }
14065 if (htab->glink != NULL && htab->glink->size != 0)
14066 {
14067 /* Offset to .glink. */
14068 val = (htab->glink->output_section->vma
14069 + htab->glink->output_offset
14070 + 8);
14071 val -= (htab->glink_eh_frame->output_section->vma
14072 + htab->glink_eh_frame->output_offset
14073 + (p + 8 - htab->glink_eh_frame->contents));
14074 if (val + 0x80000000 > 0xffffffff)
14075 {
14076 _bfd_error_handler
14077 (_("%s offset too large for .eh_frame sdata4 encoding"),
14078 htab->glink->name);
14079 return FALSE;
14080 }
14081 bfd_put_32 (htab->elf.dynobj, val, p + 8);
14082 p += (24 + align - 1) & -align;
14083 }
14084 }
14085
d4aaa2a0
AM
14086 for (group = htab->group; group != NULL; group = group->next)
14087 if ((stub_sec = group->stub_sec) != NULL)
e717da7e
AM
14088 {
14089 stub_sec_count += 1;
c9301e31
AM
14090 if (stub_sec->rawsize != stub_sec->size
14091 && (htab->stub_iteration <= STUB_SHRINK_ITER
14092 || stub_sec->rawsize < stub_sec->size))
e717da7e
AM
14093 break;
14094 }
5d1634d7 14095
25516cc5 14096 if (group != NULL)
5d1634d7 14097 {
b34976b6 14098 htab->stub_error = TRUE;
cf97bcb0 14099 _bfd_error_handler (_("stubs don't match calculated size"));
5d1634d7 14100 }
721956f4 14101
d2a300cf
AM
14102 if (htab->stub_error)
14103 return FALSE;
14104
14105 if (stats != NULL)
14106 {
db84fff3 14107 size_t len;
d2a300cf
AM
14108 *stats = bfd_malloc (500);
14109 if (*stats == NULL)
14110 return FALSE;
14111
db84fff3
AM
14112 len = sprintf (*stats,
14113 ngettext ("linker stubs in %u group\n",
14114 "linker stubs in %u groups\n",
14115 stub_sec_count),
14116 stub_sec_count);
05d0e962
AM
14117 sprintf (*stats + len, _(" branch %lu\n"
14118 " branch toc adj %lu\n"
14119 " branch notoc %lu\n"
14120 " branch both %lu\n"
14121 " long branch %lu\n"
14122 " long toc adj %lu\n"
14123 " long notoc %lu\n"
14124 " long both %lu\n"
14125 " plt call %lu\n"
14126 " plt call save %lu\n"
14127 " plt call notoc %lu\n"
14128 " plt call both %lu\n"
14129 " global entry %lu"),
4ce794b7
AM
14130 htab->stub_count[ppc_stub_long_branch - 1],
14131 htab->stub_count[ppc_stub_long_branch_r2off - 1],
05d0e962
AM
14132 htab->stub_count[ppc_stub_long_branch_notoc - 1],
14133 htab->stub_count[ppc_stub_long_branch_both - 1],
4ce794b7
AM
14134 htab->stub_count[ppc_stub_plt_branch - 1],
14135 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
05d0e962
AM
14136 htab->stub_count[ppc_stub_plt_branch_notoc - 1],
14137 htab->stub_count[ppc_stub_plt_branch_both - 1],
794e51c0 14138 htab->stub_count[ppc_stub_plt_call - 1],
7341d5e2 14139 htab->stub_count[ppc_stub_plt_call_r2save - 1],
05d0e962
AM
14140 htab->stub_count[ppc_stub_plt_call_notoc - 1],
14141 htab->stub_count[ppc_stub_plt_call_both - 1],
7341d5e2 14142 htab->stub_count[ppc_stub_global_entry - 1]);
d2a300cf
AM
14143 }
14144 return TRUE;
5bd4f169
AM
14145}
14146
60124e18
AM
14147/* What to do when ld finds relocations against symbols defined in
14148 discarded sections. */
14149
14150static unsigned int
14151ppc64_elf_action_discarded (asection *sec)
14152{
14153 if (strcmp (".opd", sec->name) == 0)
14154 return 0;
14155
14156 if (strcmp (".toc", sec->name) == 0)
14157 return 0;
14158
bce50a28
JJ
14159 if (strcmp (".toc1", sec->name) == 0)
14160 return 0;
14161
60124e18
AM
14162 return _bfd_elf_default_action_discarded (sec);
14163}
14164
e59a1001
AM
14165/* These are the dynamic relocations supported by glibc. */
14166
14167static bfd_boolean
14168ppc64_glibc_dynamic_reloc (enum elf_ppc64_reloc_type r_type)
14169{
14170 switch (r_type)
14171 {
14172 case R_PPC64_RELATIVE:
14173 case R_PPC64_NONE:
14174 case R_PPC64_ADDR64:
14175 case R_PPC64_GLOB_DAT:
14176 case R_PPC64_IRELATIVE:
14177 case R_PPC64_JMP_IREL:
14178 case R_PPC64_JMP_SLOT:
14179 case R_PPC64_DTPMOD64:
14180 case R_PPC64_DTPREL64:
14181 case R_PPC64_TPREL64:
14182 case R_PPC64_TPREL16_LO_DS:
14183 case R_PPC64_TPREL16_DS:
14184 case R_PPC64_TPREL16:
14185 case R_PPC64_TPREL16_LO:
14186 case R_PPC64_TPREL16_HI:
14187 case R_PPC64_TPREL16_HIGH:
14188 case R_PPC64_TPREL16_HA:
14189 case R_PPC64_TPREL16_HIGHA:
14190 case R_PPC64_TPREL16_HIGHER:
14191 case R_PPC64_TPREL16_HIGHEST:
14192 case R_PPC64_TPREL16_HIGHERA:
14193 case R_PPC64_TPREL16_HIGHESTA:
14194 case R_PPC64_ADDR16_LO_DS:
14195 case R_PPC64_ADDR16_LO:
14196 case R_PPC64_ADDR16_HI:
14197 case R_PPC64_ADDR16_HIGH:
14198 case R_PPC64_ADDR16_HA:
14199 case R_PPC64_ADDR16_HIGHA:
14200 case R_PPC64_REL30:
14201 case R_PPC64_COPY:
14202 case R_PPC64_UADDR64:
14203 case R_PPC64_UADDR32:
14204 case R_PPC64_ADDR32:
14205 case R_PPC64_ADDR24:
14206 case R_PPC64_ADDR16:
14207 case R_PPC64_UADDR16:
14208 case R_PPC64_ADDR16_DS:
14209 case R_PPC64_ADDR16_HIGHER:
14210 case R_PPC64_ADDR16_HIGHEST:
14211 case R_PPC64_ADDR16_HIGHERA:
14212 case R_PPC64_ADDR16_HIGHESTA:
14213 case R_PPC64_ADDR14:
14214 case R_PPC64_ADDR14_BRTAKEN:
14215 case R_PPC64_ADDR14_BRNTAKEN:
14216 case R_PPC64_REL32:
14217 case R_PPC64_REL64:
14218 return TRUE;
14219
14220 default:
14221 return FALSE;
14222 }
14223}
14224
5bd4f169
AM
14225/* The RELOCATE_SECTION function is called by the ELF backend linker
14226 to handle the relocations for a section.
14227
14228 The relocs are always passed as Rela structures; if the section
14229 actually uses Rel structures, the r_addend field will always be
14230 zero.
14231
14232 This function is responsible for adjust the section contents as
14233 necessary, and (if using Rela relocs and generating a
1049f94e 14234 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
14235 necessary.
14236
14237 This function does not have to worry about setting the reloc
14238 address or the reloc symbol index.
14239
14240 LOCAL_SYMS is a pointer to the swapped in local symbols.
14241
14242 LOCAL_SECTIONS is an array giving the section in the input file
14243 corresponding to the st_shndx field of each local symbol.
14244
14245 The global hash table entry for the global symbols can be found
14246 via elf_sym_hashes (input_bfd).
14247
1049f94e 14248 When generating relocatable output, this function must handle
5bd4f169
AM
14249 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
14250 going to be the section symbol corresponding to the output
14251 section, which means that the addend must be adjusted
14252 accordingly. */
14253
b34976b6 14254static bfd_boolean
4ce794b7
AM
14255ppc64_elf_relocate_section (bfd *output_bfd,
14256 struct bfd_link_info *info,
14257 bfd *input_bfd,
14258 asection *input_section,
14259 bfd_byte *contents,
14260 Elf_Internal_Rela *relocs,
14261 Elf_Internal_Sym *local_syms,
14262 asection **local_sections)
5bd4f169 14263{
65f38f15 14264 struct ppc_link_hash_table *htab;
5bd4f169
AM
14265 Elf_Internal_Shdr *symtab_hdr;
14266 struct elf_link_hash_entry **sym_hashes;
5bd4f169 14267 Elf_Internal_Rela *rel;
c316a17c 14268 Elf_Internal_Rela *wrel;
5bd4f169 14269 Elf_Internal_Rela *relend;
411e1bfb
AM
14270 Elf_Internal_Rela outrel;
14271 bfd_byte *loc;
411e1bfb 14272 struct got_entry **local_got_ents;
5bd4f169 14273 bfd_vma TOCstart;
b34976b6
AM
14274 bfd_boolean ret = TRUE;
14275 bfd_boolean is_opd;
794e51c0
AM
14276 /* Assume 'at' branch hints. */
14277 bfd_boolean is_isa_v2 = TRUE;
e59a1001 14278 bfd_boolean warned_dynamic = FALSE;
95f0d0d2 14279 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
5bd4f169 14280
65f38f15 14281 /* Initialize howto table if needed. */
5bd4f169 14282 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
14283 ppc_howto_init ();
14284
65f38f15 14285 htab = ppc_hash_table (info);
4dfe6ac6
NC
14286 if (htab == NULL)
14287 return FALSE;
ee75fd95
AM
14288
14289 /* Don't relocate stub sections. */
e7d1c40c 14290 if (input_section->owner == htab->params->stub_bfd)
ee75fd95
AM
14291 return TRUE;
14292
7af5d5c4
AM
14293 if (!is_ppc64_elf (input_bfd))
14294 {
14295 bfd_set_error (bfd_error_wrong_format);
14296 return FALSE;
14297 }
0ffa91dd 14298
411e1bfb 14299 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 14300 TOCstart = elf_gp (output_bfd);
0ffa91dd 14301 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 14302 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 14303 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 14304
c316a17c 14305 rel = wrel = relocs;
5bd4f169 14306 relend = relocs + input_section->reloc_count;
c316a17c 14307 for (; rel < relend; wrel++, rel++)
5bd4f169 14308 {
04c9666a 14309 enum elf_ppc64_reloc_type r_type;
31c76678 14310 bfd_vma addend;
5bd4f169
AM
14311 bfd_reloc_status_type r;
14312 Elf_Internal_Sym *sym;
14313 asection *sec;
039b3fef
AM
14314 struct elf_link_hash_entry *h_elf;
14315 struct ppc_link_hash_entry *h;
14316 struct ppc_link_hash_entry *fdh;
5bd4f169 14317 const char *sym_name;
0d4792f7 14318 unsigned long r_symndx, toc_symndx;
3a71aa26 14319 bfd_vma toc_addend;
f961d9dd
AM
14320 unsigned char tls_mask, tls_gd, tls_type;
14321 unsigned char sym_type;
5bd4f169 14322 bfd_vma relocation;
23cedd1d 14323 bfd_boolean unresolved_reloc, save_unresolved_reloc;
b34976b6 14324 bfd_boolean warned;
bc30df16 14325 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 14326 unsigned int insn;
e11840f9 14327 unsigned int mask;
721956f4
AM
14328 struct ppc_stub_hash_entry *stub_entry;
14329 bfd_vma max_br_offset;
14330 bfd_vma from;
c316a17c 14331 Elf_Internal_Rela orig_rel;
b80eed39
AM
14332 reloc_howto_type *howto;
14333 struct reloc_howto_struct alt_howto;
4a421c53
AM
14334 uint64_t pinsn;
14335 bfd_vma offset;
5bd4f169 14336
c316a17c
AM
14337 again:
14338 orig_rel = *rel;
14339
4ce794b7 14340 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 14341 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
14342
14343 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
14344 symbol of the previous ADDR64 reloc. The symbol gives us the
14345 proper TOC base to use. */
14346 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
c316a17c
AM
14347 && wrel != relocs
14348 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
ee87f2da 14349 && is_opd)
c316a17c 14350 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
ee87f2da 14351
4ce794b7
AM
14352 sym = NULL;
14353 sec = NULL;
039b3fef 14354 h_elf = NULL;
4ce794b7 14355 sym_name = NULL;
b34976b6
AM
14356 unresolved_reloc = FALSE;
14357 warned = FALSE;
65f38f15 14358
0b13192e 14359 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
14360 {
14361 /* It's a local symbol. */
74f0fb50 14362 struct _opd_sec_data *opd;
4025353c 14363
5bd4f169
AM
14364 sym = local_syms + r_symndx;
14365 sec = local_sections[r_symndx];
26c61ae5 14366 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 14367 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 14368 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
14369 opd = get_opd_info (sec);
14370 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 14371 {
51aecdc5
AM
14372 long adjust = opd->adjust[OPD_NDX (sym->st_value
14373 + rel->r_addend)];
4025353c
AM
14374 if (adjust == -1)
14375 relocation = 0;
14376 else
4cc603a5
AM
14377 {
14378 /* If this is a relocation against the opd section sym
14379 and we have edited .opd, adjust the reloc addend so
14380 that ld -r and ld --emit-relocs output is correct.
14381 If it is a reloc against some other .opd symbol,
14382 then the symbol value will be adjusted later. */
14383 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
14384 rel->r_addend += adjust;
14385 else
14386 relocation += adjust;
14387 }
1e2f5b6e 14388 }
5bd4f169
AM
14389 }
14390 else
14391 {
62d887d4
L
14392 bfd_boolean ignored;
14393
b2a8e766
AM
14394 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
14395 r_symndx, symtab_hdr, sym_hashes,
039b3fef 14396 h_elf, sec, relocation,
62d887d4 14397 unresolved_reloc, warned, ignored);
039b3fef
AM
14398 sym_name = h_elf->root.root.string;
14399 sym_type = h_elf->type;
b69fdb4e
AM
14400 if (sec != NULL
14401 && sec->owner == output_bfd
14402 && strcmp (sec->name, ".opd") == 0)
14403 {
14404 /* This is a symbol defined in a linker script. All
14405 such are defined in output sections, even those
14406 defined by simple assignment from a symbol defined in
14407 an input section. Transfer the symbol to an
14408 appropriate input .opd section, so that a branch to
14409 this symbol will be mapped to the location specified
14410 by the opd entry. */
14411 struct bfd_link_order *lo;
14412 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
14413 if (lo->type == bfd_indirect_link_order)
14414 {
14415 asection *isec = lo->u.indirect.section;
14416 if (h_elf->root.u.def.value >= isec->output_offset
14417 && h_elf->root.u.def.value < (isec->output_offset
14418 + isec->size))
14419 {
14420 h_elf->root.u.def.value -= isec->output_offset;
14421 h_elf->root.u.def.section = isec;
14422 sec = isec;
14423 break;
14424 }
14425 }
14426 }
5bd4f169 14427 }
039b3fef 14428 h = (struct ppc_link_hash_entry *) h_elf;
5bd4f169 14429
dbaa2011 14430 if (sec != NULL && discarded_section (sec))
c316a17c
AM
14431 {
14432 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
14433 input_bfd, input_section,
0930cb30 14434 contents, rel->r_offset);
c316a17c
AM
14435 wrel->r_offset = rel->r_offset;
14436 wrel->r_info = 0;
14437 wrel->r_addend = 0;
14438
14439 /* For ld -r, remove relocations in debug sections against
dcd2b8a0 14440 symbols defined in discarded sections. Not done for
c316a17c
AM
14441 non-debug to preserve relocs in .eh_frame which the
14442 eh_frame editing code expects to be present. */
14443 if (bfd_link_relocatable (info)
14444 && (input_section->flags & SEC_DEBUGGING))
14445 wrel--;
14446
14447 continue;
14448 }
ab96bf03 14449
0e1862bb 14450 if (bfd_link_relocatable (info))
c316a17c 14451 goto copy_reloc;
ab96bf03 14452
f40da81b
AM
14453 if (h != NULL && &h->elf == htab->elf.hgot)
14454 {
6f20ed8a 14455 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
f40da81b
AM
14456 sec = bfd_abs_section_ptr;
14457 unresolved_reloc = FALSE;
14458 }
14459
951fd09b
AM
14460 /* TLS optimizations. Replace instruction sequences and relocs
14461 based on information we collected in tls_optimize. We edit
14462 RELOCS so that --emit-relocs will output something sensible
14463 for the final instruction stream. */
14464 tls_mask = 0;
14465 tls_gd = 0;
0d4792f7 14466 toc_symndx = 0;
727fc41e
AM
14467 if (h != NULL)
14468 tls_mask = h->tls_mask;
14469 else if (local_got_ents != NULL)
411e1bfb 14470 {
e054468f
AM
14471 struct plt_entry **local_plt = (struct plt_entry **)
14472 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 14473 unsigned char *lgot_masks = (unsigned char *)
e054468f 14474 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
14475 tls_mask = lgot_masks[r_symndx];
14476 }
37da22e5 14477 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
727fc41e
AM
14478 && (r_type == R_PPC64_TLS
14479 || r_type == R_PPC64_TLSGD
14480 || r_type == R_PPC64_TLSLD))
14481 {
14482 /* Check for toc tls entries. */
f961d9dd 14483 unsigned char *toc_tls;
0d4792f7 14484
727fc41e
AM
14485 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14486 &local_syms, rel, input_bfd))
14487 return FALSE;
0d4792f7 14488
727fc41e
AM
14489 if (toc_tls)
14490 tls_mask = *toc_tls;
0d4792f7
AM
14491 }
14492
14493 /* Check that tls relocs are used with tls syms, and non-tls
14494 relocs are used with non-tls syms. */
cf35638d 14495 if (r_symndx != STN_UNDEF
0d4792f7
AM
14496 && r_type != R_PPC64_NONE
14497 && (h == NULL
039b3fef
AM
14498 || h->elf.root.type == bfd_link_hash_defined
14499 || h->elf.root.type == bfd_link_hash_defweak)
71c4e95a 14500 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
0d4792f7 14501 {
37da22e5 14502 if ((tls_mask & TLS_TLS) != 0
727fc41e
AM
14503 && (r_type == R_PPC64_TLS
14504 || r_type == R_PPC64_TLSGD
14505 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
14506 /* R_PPC64_TLS is OK against a symbol in the TOC. */
14507 ;
14508 else
25f53a85 14509 info->callbacks->einfo
1d483afe 14510 (!IS_PPC64_TLS_RELOC (r_type)
695344c0 14511 /* xgettext:c-format */
c1c8c1ef 14512 ? _("%H: %s used with TLS symbol `%pT'\n")
695344c0 14513 /* xgettext:c-format */
c1c8c1ef 14514 : _("%H: %s used with non-TLS symbol `%pT'\n"),
25f53a85 14515 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
14516 ppc64_elf_howto_table[r_type]->name,
14517 sym_name);
411e1bfb
AM
14518 }
14519
14520 /* Ensure reloc mapping code below stays sane. */
14521 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
14522 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
14523 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
14524 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
14525 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
14526 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
14527 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
14528 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
14529 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
14530 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
14531 abort ();
0d4792f7 14532
411e1bfb
AM
14533 switch (r_type)
14534 {
14535 default:
411e1bfb
AM
14536 break;
14537
ba761f19 14538 case R_PPC64_LO_DS_OPT:
95f0d0d2 14539 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
2365f8d7 14540 if ((insn & (0x3fu << 26)) != 58u << 26)
ba761f19
AM
14541 abort ();
14542 insn += (14u << 26) - (58u << 26);
95f0d0d2 14543 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
ba761f19
AM
14544 r_type = R_PPC64_TOC16_LO;
14545 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14546 break;
14547
411e1bfb
AM
14548 case R_PPC64_TOC16:
14549 case R_PPC64_TOC16_LO:
14550 case R_PPC64_TOC16_DS:
14551 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
14552 {
14553 /* Check for toc tls entries. */
f961d9dd 14554 unsigned char *toc_tls;
951fd09b 14555 int retval;
411e1bfb 14556
3a71aa26
AM
14557 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14558 &local_syms, rel, input_bfd);
951fd09b 14559 if (retval == 0)
411e1bfb
AM
14560 return FALSE;
14561
14562 if (toc_tls)
14563 {
951fd09b 14564 tls_mask = *toc_tls;
411e1bfb
AM
14565 if (r_type == R_PPC64_TOC16_DS
14566 || r_type == R_PPC64_TOC16_LO_DS)
81407a69 14567 {
37da22e5 14568 if ((tls_mask & TLS_TLS) != 0
81407a69
AM
14569 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
14570 goto toctprel;
14571 }
411e1bfb 14572 else
951fd09b
AM
14573 {
14574 /* If we found a GD reloc pair, then we might be
14575 doing a GD->IE transition. */
14576 if (retval == 2)
14577 {
b00a0a86 14578 tls_gd = TLS_GDIE;
37da22e5
AM
14579 if ((tls_mask & TLS_TLS) != 0
14580 && (tls_mask & TLS_GD) == 0)
102890f0 14581 goto tls_ldgd_opt;
951fd09b
AM
14582 }
14583 else if (retval == 3)
14584 {
37da22e5
AM
14585 if ((tls_mask & TLS_TLS) != 0
14586 && (tls_mask & TLS_LD) == 0)
102890f0 14587 goto tls_ldgd_opt;
951fd09b
AM
14588 }
14589 }
411e1bfb
AM
14590 }
14591 }
14592 break;
14593
9d6ded02
AM
14594 case R_PPC64_GOT_TPREL16_HI:
14595 case R_PPC64_GOT_TPREL16_HA:
37da22e5 14596 if ((tls_mask & TLS_TLS) != 0
9d6ded02
AM
14597 && (tls_mask & TLS_TPREL) == 0)
14598 {
14599 rel->r_offset -= d_offset;
95f0d0d2 14600 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
9d6ded02
AM
14601 r_type = R_PPC64_NONE;
14602 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14603 }
14604 break;
14605
411e1bfb
AM
14606 case R_PPC64_GOT_TPREL16_DS:
14607 case R_PPC64_GOT_TPREL16_LO_DS:
37da22e5 14608 if ((tls_mask & TLS_TLS) != 0
951fd09b 14609 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14610 {
81407a69 14611 toctprel:
95f0d0d2 14612 insn = bfd_get_32 (input_bfd,
c316a17c 14613 contents + rel->r_offset - d_offset);
411e1bfb
AM
14614 insn &= 31 << 21;
14615 insn |= 0x3c0d0000; /* addis 0,13,0 */
95f0d0d2 14616 bfd_put_32 (input_bfd, insn,
c316a17c 14617 contents + rel->r_offset - d_offset);
411e1bfb 14618 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
14619 if (toc_symndx != 0)
14620 {
14621 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 14622 rel->r_addend = toc_addend;
0d4792f7
AM
14623 /* We changed the symbol. Start over in order to
14624 get h, sym, sec etc. right. */
c316a17c 14625 goto again;
0d4792f7
AM
14626 }
14627 else
14628 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14629 }
14630 break;
14631
c213164a
AM
14632 case R_PPC64_GOT_TPREL34:
14633 if ((tls_mask & TLS_TLS) != 0
14634 && (tls_mask & TLS_TPREL) == 0)
14635 {
14636 /* pld ra,sym@got@tprel@pcrel -> paddi ra,r13,sym@tprel */
14637 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14638 pinsn <<= 32;
14639 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14640 pinsn += ((2ULL << 56) + (-1ULL << 52)
14641 + (14ULL << 26) - (57ULL << 26) + (13ULL << 16));
14642 bfd_put_32 (input_bfd, pinsn >> 32,
14643 contents + rel->r_offset);
14644 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14645 contents + rel->r_offset + 4);
14646 r_type = R_PPC64_TPREL34;
14647 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14648 }
14649 break;
14650
411e1bfb 14651 case R_PPC64_TLS:
37da22e5 14652 if ((tls_mask & TLS_TLS) != 0
951fd09b 14653 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14654 {
c213164a 14655 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2d0f3896
AM
14656 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
14657 if (insn == 0)
c213164a
AM
14658 break;
14659 if ((rel->r_offset & 3) == 0)
0d4792f7 14660 {
c213164a
AM
14661 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
14662 /* Was PPC64_TLS which sits on insn boundary, now
14663 PPC64_TPREL16_LO which is at low-order half-word. */
14664 rel->r_offset += d_offset;
14665 r_type = R_PPC64_TPREL16_LO;
14666 if (toc_symndx != 0)
14667 {
14668 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
14669 rel->r_addend = toc_addend;
14670 /* We changed the symbol. Start over in order to
14671 get h, sym, sec etc. right. */
14672 goto again;
14673 }
14674 else
14675 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14676 }
14677 else if ((rel->r_offset & 3) == 1)
14678 {
14679 /* For pcrel IE to LE we already have the full
14680 offset and thus don't need an addi here. A nop
14681 or mr will do. */
2365f8d7 14682 if ((insn & (0x3fu << 26)) == 14 << 26)
c213164a
AM
14683 {
14684 /* Extract regs from addi rt,ra,si. */
14685 unsigned int rt = (insn >> 21) & 0x1f;
14686 unsigned int ra = (insn >> 16) & 0x1f;
14687 if (rt == ra)
14688 insn = NOP;
14689 else
14690 {
14691 /* Build or ra,rs,rb with rb==rs, ie. mr ra,rs. */
14692 insn = (rt << 16) | (ra << 21) | (ra << 11);
14693 insn |= (31u << 26) | (444u << 1);
14694 }
14695 }
14696 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - 1);
0d4792f7 14697 }
411e1bfb
AM
14698 }
14699 break;
14700
411e1bfb
AM
14701 case R_PPC64_GOT_TLSGD16_HI:
14702 case R_PPC64_GOT_TLSGD16_HA:
b00a0a86 14703 tls_gd = TLS_GDIE;
37da22e5 14704 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
951fd09b
AM
14705 goto tls_gdld_hi;
14706 break;
14707
411e1bfb
AM
14708 case R_PPC64_GOT_TLSLD16_HI:
14709 case R_PPC64_GOT_TLSLD16_HA:
37da22e5 14710 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 14711 {
951fd09b
AM
14712 tls_gdld_hi:
14713 if ((tls_mask & tls_gd) != 0)
14714 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14715 + R_PPC64_GOT_TPREL16_DS);
14716 else
411e1bfb 14717 {
4fe5ca5b 14718 rel->r_offset -= d_offset;
95f0d0d2 14719 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
951fd09b 14720 r_type = R_PPC64_NONE;
411e1bfb 14721 }
951fd09b 14722 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14723 }
14724 break;
14725
951fd09b
AM
14726 case R_PPC64_GOT_TLSGD16:
14727 case R_PPC64_GOT_TLSGD16_LO:
b00a0a86 14728 tls_gd = TLS_GDIE;
37da22e5 14729 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
102890f0 14730 goto tls_ldgd_opt;
951fd09b 14731 break;
411e1bfb 14732
951fd09b
AM
14733 case R_PPC64_GOT_TLSLD16:
14734 case R_PPC64_GOT_TLSLD16_LO:
37da22e5 14735 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
951fd09b 14736 {
b9f04fe0 14737 unsigned int insn1, insn2;
102890f0
AM
14738
14739 tls_ldgd_opt:
727fc41e
AM
14740 offset = (bfd_vma) -1;
14741 /* If not using the newer R_PPC64_TLSGD/LD to mark
14742 __tls_get_addr calls, we must trust that the call
14743 stays with its arg setup insns, ie. that the next
14744 reloc is the __tls_get_addr call associated with
14745 the current reloc. Edit both insns. */
9737e8af 14746 if (input_section->nomark_tls_get_addr
727fc41e
AM
14747 && rel + 1 < relend
14748 && branch_reloc_hash_match (input_bfd, rel + 1,
14749 htab->tls_get_addr,
14750 htab->tls_get_addr_fd))
14751 offset = rel[1].r_offset;
b86ac8e3
AM
14752 /* We read the low GOT_TLS (or TOC16) insn because we
14753 need to keep the destination reg. It may be
14754 something other than the usual r3, and moved to r3
14755 before the call by intervening code. */
95f0d0d2 14756 insn1 = bfd_get_32 (input_bfd,
b86ac8e3 14757 contents + rel->r_offset - d_offset);
102890f0 14758 if ((tls_mask & tls_gd) != 0)
411e1bfb 14759 {
102890f0 14760 /* IE */
b86ac8e3 14761 insn1 &= (0x1f << 21) | (0x1f << 16);
2365f8d7 14762 insn1 |= 58u << 26; /* ld */
102890f0 14763 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 14764 if (offset != (bfd_vma) -1)
f58d5a2d 14765 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
46e9995a
AM
14766 if (r_type == R_PPC64_TOC16
14767 || r_type == R_PPC64_TOC16_LO)
102890f0 14768 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
46e9995a
AM
14769 else
14770 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 1)) & 1)
14771 + R_PPC64_GOT_TPREL16_DS);
102890f0
AM
14772 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14773 }
14774 else
14775 {
14776 /* LE */
b86ac8e3
AM
14777 insn1 &= 0x1f << 21;
14778 insn1 |= 0x3c0d0000; /* addis r,13,0 */
102890f0
AM
14779 insn2 = 0x38630000; /* addi 3,3,0 */
14780 if (tls_gd == 0)
951fd09b 14781 {
102890f0 14782 /* Was an LD reloc. */
71c4e95a 14783 r_symndx = STN_UNDEF;
102890f0 14784 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
951fd09b 14785 }
102890f0 14786 else if (toc_symndx != 0)
3a71aa26
AM
14787 {
14788 r_symndx = toc_symndx;
14789 rel->r_addend = toc_addend;
14790 }
102890f0
AM
14791 r_type = R_PPC64_TPREL16_HA;
14792 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
14793 if (offset != (bfd_vma) -1)
14794 {
14795 rel[1].r_info = ELF64_R_INFO (r_symndx,
14796 R_PPC64_TPREL16_LO);
14797 rel[1].r_offset = offset + d_offset;
14798 rel[1].r_addend = rel->r_addend;
14799 }
102890f0 14800 }
95f0d0d2 14801 bfd_put_32 (input_bfd, insn1,
3a71aa26 14802 contents + rel->r_offset - d_offset);
727fc41e 14803 if (offset != (bfd_vma) -1)
c96e0573
AM
14804 {
14805 bfd_put_32 (input_bfd, insn2, contents + offset);
14806 if (offset + 8 <= input_section->size)
14807 {
14808 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
14809 if (insn2 == LD_R2_0R1 + STK_TOC (htab))
14810 bfd_put_32 (input_bfd, NOP, contents + offset + 4);
14811 }
14812 }
727fc41e
AM
14813 if ((tls_mask & tls_gd) == 0
14814 && (tls_gd == 0 || toc_symndx != 0))
14815 {
14816 /* We changed the symbol. Start over in order
14817 to get h, sym, sec etc. right. */
c316a17c 14818 goto again;
727fc41e
AM
14819 }
14820 }
14821 break;
14822
c213164a
AM
14823 case R_PPC64_GOT_TLSGD34:
14824 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
14825 {
14826 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14827 pinsn <<= 32;
14828 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14829 if ((tls_mask & TLS_GDIE) != 0)
14830 {
14831 /* IE, pla -> pld */
14832 pinsn += (-2ULL << 56) + (57ULL << 26) - (14ULL << 26);
14833 r_type = R_PPC64_GOT_TPREL34;
14834 }
14835 else
14836 {
14837 /* LE, pla pcrel -> paddi r13 */
14838 pinsn += (-1ULL << 52) + (13ULL << 16);
14839 r_type = R_PPC64_TPREL34;
14840 }
14841 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14842 bfd_put_32 (input_bfd, pinsn >> 32,
14843 contents + rel->r_offset);
14844 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14845 contents + rel->r_offset + 4);
14846 }
14847 break;
14848
14849 case R_PPC64_GOT_TLSLD34:
14850 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
14851 {
14852 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14853 pinsn <<= 32;
14854 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14855 pinsn += (-1ULL << 52) + (13ULL << 16);
14856 bfd_put_32 (input_bfd, pinsn >> 32,
14857 contents + rel->r_offset);
14858 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
14859 contents + rel->r_offset + 4);
14860 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
14861 r_symndx = STN_UNDEF;
14862 r_type = R_PPC64_TPREL34;
14863 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14864 goto again;
14865 }
14866 break;
14867
727fc41e 14868 case R_PPC64_TLSGD:
37da22e5 14869 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
675e2809 14870 && rel + 1 < relend)
727fc41e 14871 {
b9f04fe0 14872 unsigned int insn2;
5663e321 14873 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 14874
4a421c53 14875 offset = rel->r_offset;
5663e321 14876 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
14877 {
14878 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
14879 if (r_type1 == R_PPC64_PLT_PCREL34
14880 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
14881 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
14882 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14883 break;
14884 }
14885
14886 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14887 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14888
b00a0a86 14889 if ((tls_mask & TLS_GDIE) != 0)
727fc41e
AM
14890 {
14891 /* IE */
14892 r_type = R_PPC64_NONE;
14893 insn2 = 0x7c636a14; /* add 3,3,13 */
14894 }
14895 else
14896 {
14897 /* LE */
14898 if (toc_symndx != 0)
14899 {
14900 r_symndx = toc_symndx;
14901 rel->r_addend = toc_addend;
14902 }
c213164a
AM
14903 if (r_type1 == R_PPC64_REL24_NOTOC
14904 || r_type1 == R_PPC64_PLTCALL_NOTOC)
14905 {
14906 r_type = R_PPC64_NONE;
14907 insn2 = NOP;
14908 }
14909 else
14910 {
14911 rel->r_offset = offset + d_offset;
14912 r_type = R_PPC64_TPREL16_LO;
14913 insn2 = 0x38630000; /* addi 3,3,0 */
14914 }
727fc41e
AM
14915 }
14916 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14917 /* Zap the reloc on the _tls_get_addr call too. */
14918 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14919 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 14920 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
14921 if ((tls_mask & TLS_GDIE) == 0
14922 && toc_symndx != 0
14923 && r_type != R_PPC64_NONE)
c316a17c 14924 goto again;
411e1bfb 14925 }
411e1bfb
AM
14926 break;
14927
727fc41e 14928 case R_PPC64_TLSLD:
37da22e5 14929 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
675e2809 14930 && rel + 1 < relend)
727fc41e 14931 {
b9f04fe0 14932 unsigned int insn2;
5663e321 14933 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 14934
4a421c53 14935 offset = rel->r_offset;
5663e321 14936 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
14937 {
14938 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
14939 if (r_type1 == R_PPC64_PLT_PCREL34
14940 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
14941 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
14942 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14943 break;
14944 }
14945
14946 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14947 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14948
c213164a
AM
14949 if (r_type1 == R_PPC64_REL24_NOTOC
14950 || r_type1 == R_PPC64_PLTCALL_NOTOC)
14951 {
14952 r_type = R_PPC64_NONE;
14953 insn2 = NOP;
14954 }
14955 else
14956 {
14957 rel->r_offset = offset + d_offset;
14958 r_symndx = STN_UNDEF;
14959 r_type = R_PPC64_TPREL16_LO;
14960 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
14961 insn2 = 0x38630000; /* addi 3,3,0 */
14962 }
727fc41e 14963 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
14964 /* Zap the reloc on the _tls_get_addr call too. */
14965 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14966 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 14967 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
14968 if (r_type != R_PPC64_NONE)
14969 goto again;
727fc41e
AM
14970 }
14971 break;
14972
411e1bfb 14973 case R_PPC64_DTPMOD64:
951fd09b
AM
14974 if (rel + 1 < relend
14975 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
14976 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 14977 {
951fd09b
AM
14978 if ((tls_mask & TLS_GD) == 0)
14979 {
14980 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
b00a0a86 14981 if ((tls_mask & TLS_GDIE) != 0)
951fd09b
AM
14982 r_type = R_PPC64_TPREL64;
14983 else
14984 {
4ce794b7 14985 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
14986 r_type = R_PPC64_NONE;
14987 }
14988 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14989 }
14990 }
14991 else
14992 {
14993 if ((tls_mask & TLS_LD) == 0)
411e1bfb 14994 {
4ce794b7 14995 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 14996 r_type = R_PPC64_NONE;
951fd09b 14997 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 14998 }
411e1bfb
AM
14999 }
15000 break;
15001
15002 case R_PPC64_TPREL64:
951fd09b 15003 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
15004 {
15005 r_type = R_PPC64_NONE;
15006 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15007 }
15008 break;
52a82034 15009
006589cf
AM
15010 case R_PPC64_ENTRY:
15011 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
15012 if (!bfd_link_pic (info)
15013 && !info->traditional_format
15014 && relocation + 0x80008000 <= 0xffffffff)
15015 {
15016 unsigned int insn1, insn2;
15017
15018 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15019 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15020 if ((insn1 & ~0xfffc) == LD_R2_0R12
15021 && insn2 == ADD_R2_R2_R12)
15022 {
95f0d0d2 15023 bfd_put_32 (input_bfd,
006589cf
AM
15024 LIS_R2 + PPC_HA (relocation),
15025 contents + rel->r_offset);
95f0d0d2 15026 bfd_put_32 (input_bfd,
006589cf
AM
15027 ADDI_R2_R2 + PPC_LO (relocation),
15028 contents + rel->r_offset + 4);
15029 }
15030 }
15031 else
15032 {
15033 relocation -= (rel->r_offset
15034 + input_section->output_offset
15035 + input_section->output_section->vma);
15036 if (relocation + 0x80008000 <= 0xffffffff)
15037 {
15038 unsigned int insn1, insn2;
15039
15040 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
15041 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15042 if ((insn1 & ~0xfffc) == LD_R2_0R12
15043 && insn2 == ADD_R2_R2_R12)
15044 {
95f0d0d2 15045 bfd_put_32 (input_bfd,
006589cf
AM
15046 ADDIS_R2_R12 + PPC_HA (relocation),
15047 contents + rel->r_offset);
95f0d0d2 15048 bfd_put_32 (input_bfd,
006589cf
AM
15049 ADDI_R2_R2 + PPC_LO (relocation),
15050 contents + rel->r_offset + 4);
15051 }
15052 }
15053 }
15054 break;
15055
52a82034
AM
15056 case R_PPC64_REL16_HA:
15057 /* If we are generating a non-PIC executable, edit
15058 . 0: addis 2,12,.TOC.-0b@ha
15059 . addi 2,2,.TOC.-0b@l
15060 used by ELFv2 global entry points to set up r2, to
15061 . lis 2,.TOC.@ha
15062 . addi 2,2,.TOC.@l
15063 if .TOC. is in range. */
0e1862bb 15064 if (!bfd_link_pic (info)
810d4e75 15065 && !info->traditional_format
006589cf 15066 && !htab->opd_abi
4f038ee5 15067 && rel->r_addend == d_offset
52a82034
AM
15068 && h != NULL && &h->elf == htab->elf.hgot
15069 && rel + 1 < relend
15070 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
15071 && rel[1].r_offset == rel->r_offset + 4
15072 && rel[1].r_addend == rel->r_addend + 4
15073 && relocation + 0x80008000 <= 0xffffffff)
15074 {
15075 unsigned int insn1, insn2;
4a421c53 15076 offset = rel->r_offset - d_offset;
95f0d0d2
AM
15077 insn1 = bfd_get_32 (input_bfd, contents + offset);
15078 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
006589cf
AM
15079 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
15080 && (insn2 & 0xffff0000) == ADDI_R2_R2)
52a82034
AM
15081 {
15082 r_type = R_PPC64_ADDR16_HA;
15083 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15084 rel->r_addend -= d_offset;
15085 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
15086 rel[1].r_addend -= d_offset + 4;
95f0d0d2 15087 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
52a82034
AM
15088 }
15089 }
15090 break;
411e1bfb
AM
15091 }
15092
15093 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 15094 insn = 0;
b25116a9
AM
15095 max_br_offset = 1 << 25;
15096 addend = rel->r_addend;
bc30df16 15097 reloc_dest = DEST_NORMAL;
65f38f15 15098 switch (r_type)
5bd4f169
AM
15099 {
15100 default:
65f38f15 15101 break;
5bd4f169 15102
3b421ab3
AM
15103 case R_PPC64_TOCSAVE:
15104 if (relocation + addend == (rel->r_offset
15105 + input_section->output_offset
15106 + input_section->output_section->vma)
15107 && tocsave_find (htab, NO_INSERT,
15108 &local_syms, rel, input_bfd))
15109 {
15110 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15111 if (insn == NOP
15112 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
15113 bfd_put_32 (input_bfd,
15114 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
15115 contents + rel->r_offset);
15116 }
15117 break;
15118
65f38f15
AM
15119 /* Branch taken prediction relocations. */
15120 case R_PPC64_ADDR14_BRTAKEN:
15121 case R_PPC64_REL14_BRTAKEN:
cedb70c5 15122 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
1a0670f3 15123 /* Fall through. */
65f38f15 15124
86c76c7b 15125 /* Branch not taken prediction relocations. */
65f38f15
AM
15126 case R_PPC64_ADDR14_BRNTAKEN:
15127 case R_PPC64_REL14_BRNTAKEN:
95f0d0d2 15128 insn |= bfd_get_32 (input_bfd,
411e1bfb 15129 contents + rel->r_offset) & ~(0x01 << 21);
1a0670f3 15130 /* Fall through. */
86c76c7b 15131
b25116a9
AM
15132 case R_PPC64_REL14:
15133 max_br_offset = 1 << 15;
1a0670f3 15134 /* Fall through. */
5bd4f169 15135
65f38f15 15136 case R_PPC64_REL24:
05d0e962 15137 case R_PPC64_REL24_NOTOC:
23cedd1d 15138 case R_PPC64_PLTCALL:
5663e321 15139 case R_PPC64_PLTCALL_NOTOC:
ad8e1ba5
AM
15140 /* Calls to functions with a different TOC, such as calls to
15141 shared objects, need to alter the TOC pointer. This is
15142 done using a linkage stub. A REL24 branching to these
15143 linkage stubs needs to be followed by a nop, as the nop
15144 will be replaced with an instruction to restore the TOC
15145 base pointer. */
8387904d 15146 fdh = h;
b31867b6
AM
15147 if (h != NULL
15148 && h->oh != NULL
15149 && h->oh->is_func_descriptor)
15150 fdh = ppc_follow_link (h->oh);
31c76678
DK
15151 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
15152 htab);
5663e321
AM
15153 if ((r_type == R_PPC64_PLTCALL
15154 || r_type == R_PPC64_PLTCALL_NOTOC)
23cedd1d 15155 && stub_entry != NULL
05d0e962
AM
15156 && stub_entry->stub_type >= ppc_stub_plt_call
15157 && stub_entry->stub_type <= ppc_stub_plt_call_both)
23cedd1d
AM
15158 stub_entry = NULL;
15159
6abec6bc 15160 if (stub_entry != NULL
d0abeec8
AM
15161 && ((stub_entry->stub_type >= ppc_stub_plt_call
15162 && stub_entry->stub_type <= ppc_stub_plt_call_both)
ad8e1ba5 15163 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
05d0e962
AM
15164 || stub_entry->stub_type == ppc_stub_plt_branch_both
15165 || stub_entry->stub_type == ppc_stub_long_branch_r2off
15166 || stub_entry->stub_type == ppc_stub_long_branch_both))
41bd81ab 15167 {
b25116a9 15168 bfd_boolean can_plt_call = FALSE;
721956f4 15169
6e1816be
AM
15170 if (stub_entry->stub_type == ppc_stub_plt_call
15171 && !htab->opd_abi
15172 && htab->params->plt_localentry0 != 0
15173 && is_elfv2_localentry0 (&h->elf))
15174 {
15175 /* The function doesn't use or change r2. */
15176 can_plt_call = TRUE;
15177 }
05d0e962
AM
15178 else if (r_type == R_PPC64_REL24_NOTOC)
15179 {
15180 /* NOTOC calls don't need to restore r2. */
15181 can_plt_call = TRUE;
15182 }
6e1816be 15183
f378ab09 15184 /* All of these stubs may modify r2, so there must be a
ba8ca3e7
AM
15185 branch and link followed by a nop. The nop is
15186 replaced by an insn to restore r2. */
6e1816be 15187 else if (rel->r_offset + 8 <= input_section->size)
41bd81ab 15188 {
ba8ca3e7
AM
15189 unsigned long br;
15190
15191 br = bfd_get_32 (input_bfd,
15192 contents + rel->r_offset);
15193 if ((br & 1) != 0)
41bd81ab 15194 {
ba8ca3e7
AM
15195 unsigned long nop;
15196
15197 nop = bfd_get_32 (input_bfd,
15198 contents + rel->r_offset + 4);
23cedd1d
AM
15199 if (nop == LD_R2_0R1 + STK_TOC (htab))
15200 can_plt_call = TRUE;
15201 else if (nop == NOP
15202 || nop == CROR_151515
15203 || nop == CROR_313131)
a7f2871e 15204 {
ba8ca3e7
AM
15205 if (h != NULL
15206 && (h == htab->tls_get_addr_fd
15207 || h == htab->tls_get_addr)
7c9cf415 15208 && htab->params->tls_get_addr_opt)
ba8ca3e7
AM
15209 {
15210 /* Special stub used, leave nop alone. */
15211 }
15212 else
a078d95a
AM
15213 bfd_put_32 (input_bfd,
15214 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7
AM
15215 contents + rel->r_offset + 4);
15216 can_plt_call = TRUE;
a7f2871e 15217 }
41bd81ab 15218 }
5bd4f169 15219 }
721956f4 15220
ba8ca3e7 15221 if (!can_plt_call && h != NULL)
721956f4 15222 {
ba8ca3e7
AM
15223 const char *name = h->elf.root.root.string;
15224
15225 if (*name == '.')
15226 ++name;
15227
15228 if (strncmp (name, "__libc_start_main", 17) == 0
15229 && (name[17] == 0 || name[17] == '@'))
6ab189d5 15230 {
ba8ca3e7
AM
15231 /* Allow crt1 branch to go via a toc adjusting
15232 stub. Other calls that never return could do
15233 the same, if we could detect such. */
b25116a9 15234 can_plt_call = TRUE;
6ab189d5 15235 }
ba8ca3e7
AM
15236 }
15237
15238 if (!can_plt_call)
15239 {
15240 /* g++ as of 20130507 emits self-calls without a
15241 following nop. This is arguably wrong since we
15242 have conflicting information. On the one hand a
15243 global symbol and on the other a local call
15244 sequence, but don't error for this special case.
15245 It isn't possible to cheaply verify we have
15246 exactly such a call. Allow all calls to the same
15247 section. */
15248 asection *code_sec = sec;
15249
15250 if (get_opd_info (sec) != NULL)
ad8e1ba5 15251 {
ba8ca3e7
AM
15252 bfd_vma off = (relocation + addend
15253 - sec->output_section->vma
15254 - sec->output_offset);
bc30df16 15255
ba8ca3e7 15256 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 15257 }
ba8ca3e7
AM
15258 if (code_sec == input_section)
15259 can_plt_call = TRUE;
15260 }
15261
15262 if (!can_plt_call)
15263 {
05d0e962
AM
15264 if (stub_entry->stub_type >= ppc_stub_plt_call
15265 && stub_entry->stub_type <= ppc_stub_plt_call_both)
4805fc55 15266 info->callbacks->einfo
695344c0 15267 /* xgettext:c-format */
c1c8c1ef 15268 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15269 "(plt call stub)\n"),
4805fc55
AM
15270 input_bfd, input_section, rel->r_offset, sym_name);
15271 else
15272 info->callbacks->einfo
695344c0 15273 /* xgettext:c-format */
c1c8c1ef 15274 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 15275 "(toc save/adjust stub)\n"),
4805fc55 15276 input_bfd, input_section, rel->r_offset, sym_name);
ba8ca3e7
AM
15277
15278 bfd_set_error (bfd_error_bad_value);
15279 ret = FALSE;
721956f4
AM
15280 }
15281
b25116a9 15282 if (can_plt_call
05d0e962
AM
15283 && stub_entry->stub_type >= ppc_stub_plt_call
15284 && stub_entry->stub_type <= ppc_stub_plt_call_both)
b25116a9
AM
15285 unresolved_reloc = FALSE;
15286 }
15287
6abec6bc
AM
15288 if ((stub_entry == NULL
15289 || stub_entry->stub_type == ppc_stub_long_branch
15290 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
15291 && get_opd_info (sec) != NULL)
15292 {
15293 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
15294 bfd_vma off = (relocation + addend
15295 - sec->output_section->vma
15296 - sec->output_offset);
aef36ac1 15297 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
15298 if (dest != (bfd_vma) -1)
15299 {
15300 relocation = dest;
15301 addend = 0;
bc30df16 15302 reloc_dest = DEST_OPD;
8387904d
AM
15303 }
15304 }
15305
b25116a9
AM
15306 /* If the branch is out of reach we ought to have a long
15307 branch stub. */
15308 from = (rel->r_offset
15309 + input_section->output_offset
15310 + input_section->output_section->vma);
15311
6911b7dc
AM
15312 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
15313 ? fdh->elf.other
15314 : sym->st_other);
15315
6abec6bc
AM
15316 if (stub_entry != NULL
15317 && (stub_entry->stub_type == ppc_stub_long_branch
15318 || stub_entry->stub_type == ppc_stub_plt_branch)
15319 && (r_type == R_PPC64_ADDR14_BRTAKEN
15320 || r_type == R_PPC64_ADDR14_BRNTAKEN
15321 || (relocation + addend - from + max_br_offset
15322 < 2 * max_br_offset)))
15323 /* Don't use the stub if this branch is in range. */
15324 stub_entry = NULL;
b25116a9 15325
05d0e962
AM
15326 if (stub_entry != NULL
15327 && (stub_entry->stub_type == ppc_stub_long_branch_notoc
15328 || stub_entry->stub_type == ppc_stub_long_branch_both
15329 || stub_entry->stub_type == ppc_stub_plt_branch_notoc
15330 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15331 && (r_type != R_PPC64_REL24_NOTOC
15332 || ((fdh ? fdh->elf.other : sym->st_other)
4a4e7361 15333 & STO_PPC64_LOCAL_MASK) <= 1 << STO_PPC64_LOCAL_BIT)
05d0e962
AM
15334 && (relocation + addend - from + max_br_offset
15335 < 2 * max_br_offset))
15336 stub_entry = NULL;
15337
15338 if (stub_entry != NULL
15339 && (stub_entry->stub_type == ppc_stub_long_branch_r2off
15340 || stub_entry->stub_type == ppc_stub_long_branch_both
15341 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
15342 || stub_entry->stub_type == ppc_stub_plt_branch_both)
15343 && r_type == R_PPC64_REL24_NOTOC
15344 && (relocation + addend - from + max_br_offset
15345 < 2 * max_br_offset))
15346 stub_entry = NULL;
15347
b25116a9
AM
15348 if (stub_entry != NULL)
15349 {
15350 /* Munge up the value and addend so that we call the stub
15351 rather than the procedure directly. */
a4b6fadd
AM
15352 asection *stub_sec = stub_entry->group->stub_sec;
15353
15354 if (stub_entry->stub_type == ppc_stub_save_res)
15355 relocation += (stub_sec->output_offset
15356 + stub_sec->output_section->vma
15357 + stub_sec->size - htab->sfpr->size
15358 - htab->sfpr->output_offset
15359 - htab->sfpr->output_section->vma);
15360 else
15361 relocation = (stub_entry->stub_offset
15362 + stub_sec->output_offset
15363 + stub_sec->output_section->vma);
b25116a9 15364 addend = 0;
bc30df16 15365 reloc_dest = DEST_STUB;
3b421ab3 15366
05d0e962
AM
15367 if (((stub_entry->stub_type == ppc_stub_plt_call
15368 && ALWAYS_EMIT_R2SAVE)
15369 || stub_entry->stub_type == ppc_stub_plt_call_r2save
15370 || stub_entry->stub_type == ppc_stub_plt_call_both)
e81b4c93
AM
15371 && !(h != NULL
15372 && (h == htab->tls_get_addr_fd
15373 || h == htab->tls_get_addr)
15374 && htab->params->tls_get_addr_opt)
3b421ab3
AM
15375 && rel + 1 < relend
15376 && rel[1].r_offset == rel->r_offset + 4
15377 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
15378 relocation += 4;
05d0e962
AM
15379 else if ((stub_entry->stub_type == ppc_stub_long_branch_both
15380 || stub_entry->stub_type == ppc_stub_plt_branch_both
15381 || stub_entry->stub_type == ppc_stub_plt_call_both)
15382 && r_type == R_PPC64_REL24_NOTOC)
15383 relocation += 4;
5663e321
AM
15384
15385 if (r_type == R_PPC64_REL24_NOTOC
15386 && (stub_entry->stub_type == ppc_stub_plt_call_notoc
15387 || stub_entry->stub_type == ppc_stub_plt_call_both))
15388 htab->notoc_plt = 1;
b25116a9
AM
15389 }
15390
15391 if (insn != 0)
15392 {
794e51c0 15393 if (is_isa_v2)
721956f4 15394 {
b25116a9
AM
15395 /* Set 'a' bit. This is 0b00010 in BO field for branch
15396 on CR(BI) insns (BO == 001at or 011at), and 0b01000
15397 for branch on CTR insns (BO == 1a00t or 1a01t). */
15398 if ((insn & (0x14 << 21)) == (0x04 << 21))
15399 insn |= 0x02 << 21;
15400 else if ((insn & (0x14 << 21)) == (0x10 << 21))
15401 insn |= 0x08 << 21;
15402 else
15403 break;
15404 }
15405 else
15406 {
15407 /* Invert 'y' bit if not the default. */
4cc603a5 15408 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 15409 insn ^= 0x01 << 21;
721956f4 15410 }
b25116a9 15411
95f0d0d2 15412 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
5bd4f169 15413 }
e86ce104 15414
06da1e8e
AM
15415 /* NOP out calls to undefined weak functions.
15416 We can thus call a weak function without first
15417 checking whether the function is defined. */
b25116a9 15418 else if (h != NULL
039b3fef 15419 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 15420 && h->elf.dynindx == -1
05d0e962
AM
15421 && (r_type == R_PPC64_REL24
15422 || r_type == R_PPC64_REL24_NOTOC)
b25116a9 15423 && relocation == 0
4cc603a5 15424 && addend == 0)
e86ce104 15425 {
95f0d0d2 15426 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
c316a17c 15427 goto copy_reloc;
e86ce104 15428 }
65f38f15 15429 break;
066f4018
AM
15430
15431 case R_PPC64_GOT16_DS:
15432 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15433 if (relocation + addend - from + 0x8000 < 0x10000
15434 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15435 {
15436 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15437 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15438 {
15439 insn += (14u << 26) - (58u << 26);
15440 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15441 r_type = R_PPC64_TOC16;
15442 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15443 }
15444 }
15445 break;
15446
15447 case R_PPC64_GOT16_LO_DS:
15448 case R_PPC64_GOT16_HA:
15449 from = TOCstart + htab->sec_info[input_section->id].toc_off;
15450 if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
15451 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15452 {
15453 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 15454 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
15455 {
15456 insn += (14u << 26) - (58u << 26);
15457 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
15458 r_type = R_PPC64_TOC16_LO;
15459 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15460 }
2365f8d7 15461 else if ((insn & (0x3fu << 26)) == 15u << 26 /* addis */)
066f4018
AM
15462 {
15463 r_type = R_PPC64_TOC16_HA;
15464 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15465 }
15466 }
15467 break;
4a421c53
AM
15468
15469 case R_PPC64_GOT_PCREL34:
15470 from = (rel->r_offset
15471 + input_section->output_section->vma
15472 + input_section->output_offset);
15473 if (relocation - from + (1ULL << 33) < 1ULL << 34
15474 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15475 {
15476 offset = rel->r_offset;
15477 pinsn = bfd_get_32 (input_bfd, contents + offset);
15478 pinsn <<= 32;
15479 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15480 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15481 == ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
15482 {
15483 /* Replace with paddi. */
15484 pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
15485 r_type = R_PPC64_PCREL34;
15486 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15487 bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
15488 bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
15489 goto pcrelopt;
15490 }
15491 }
15492 break;
15493
15494 case R_PPC64_PCREL34:
15495 if (SYMBOL_REFERENCES_LOCAL (info, &h->elf))
15496 {
15497 offset = rel->r_offset;
15498 pinsn = bfd_get_32 (input_bfd, contents + offset);
15499 pinsn <<= 32;
15500 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
15501 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
15502 == ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
15503 | (14ULL << 26) /* paddi */))
15504 {
15505 pcrelopt:
15506 if (rel + 1 < relend
15507 && rel[1].r_offset == offset
15508 && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT))
15509 {
15510 bfd_vma off2 = rel[1].r_addend;
15511 if (off2 == 0)
15512 /* zero means next insn. */
15513 off2 = 8;
15514 off2 += offset;
15515 if (off2 + 4 <= input_section->size)
15516 {
15517 uint64_t pinsn2;
dd9b12c2 15518 bfd_signed_vma addend_off;
4a421c53
AM
15519 pinsn2 = bfd_get_32 (input_bfd, contents + off2);
15520 pinsn2 <<= 32;
15521 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
77486630
AM
15522 {
15523 if (off2 + 8 > input_section->size)
15524 break;
15525 pinsn2 |= bfd_get_32 (input_bfd,
15526 contents + off2 + 4);
15527 }
dd9b12c2 15528 if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
4a421c53 15529 {
dd9b12c2
AM
15530 addend += addend_off;
15531 rel->r_addend = addend;
4a421c53
AM
15532 bfd_put_32 (input_bfd, pinsn >> 32,
15533 contents + offset);
15534 bfd_put_32 (input_bfd, pinsn,
15535 contents + offset + 4);
15536 bfd_put_32 (input_bfd, pinsn2 >> 32,
15537 contents + off2);
77486630
AM
15538 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
15539 bfd_put_32 (input_bfd, pinsn2,
15540 contents + off2 + 4);
4a421c53
AM
15541 }
15542 }
15543 }
15544 }
15545 }
15546 break;
65f38f15 15547 }
5bd4f169 15548
411e1bfb 15549 tls_type = 0;
23cedd1d 15550 save_unresolved_reloc = unresolved_reloc;
65f38f15
AM
15551 switch (r_type)
15552 {
15553 default:
cf97bcb0
AM
15554 /* xgettext:c-format */
15555 _bfd_error_handler (_("%pB: %s unsupported"),
15556 input_bfd, ppc64_elf_howto_table[r_type]->name);
5bd4f169 15557
65f38f15 15558 bfd_set_error (bfd_error_bad_value);
b34976b6 15559 ret = FALSE;
c316a17c 15560 goto copy_reloc;
5bd4f169 15561
65f38f15 15562 case R_PPC64_NONE:
411e1bfb 15563 case R_PPC64_TLS:
727fc41e
AM
15564 case R_PPC64_TLSGD:
15565 case R_PPC64_TLSLD:
3b421ab3 15566 case R_PPC64_TOCSAVE:
04c9666a
AM
15567 case R_PPC64_GNU_VTINHERIT:
15568 case R_PPC64_GNU_VTENTRY:
006589cf 15569 case R_PPC64_ENTRY:
4a421c53 15570 case R_PPC64_PCREL_OPT:
c316a17c 15571 goto copy_reloc;
5bd4f169
AM
15572
15573 /* GOT16 relocations. Like an ADDR16 using the symbol's
15574 address in the GOT as relocation value instead of the
411e1bfb 15575 symbol's value itself. Also, create a GOT entry for the
5bd4f169 15576 symbol and put the symbol value there. */
411e1bfb
AM
15577 case R_PPC64_GOT_TLSGD16:
15578 case R_PPC64_GOT_TLSGD16_LO:
15579 case R_PPC64_GOT_TLSGD16_HI:
15580 case R_PPC64_GOT_TLSGD16_HA:
c213164a 15581 case R_PPC64_GOT_TLSGD34:
951fd09b 15582 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
15583 goto dogot;
15584
15585 case R_PPC64_GOT_TLSLD16:
15586 case R_PPC64_GOT_TLSLD16_LO:
15587 case R_PPC64_GOT_TLSLD16_HI:
15588 case R_PPC64_GOT_TLSLD16_HA:
c213164a 15589 case R_PPC64_GOT_TLSLD34:
951fd09b 15590 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
15591 goto dogot;
15592
15593 case R_PPC64_GOT_TPREL16_DS:
15594 case R_PPC64_GOT_TPREL16_LO_DS:
15595 case R_PPC64_GOT_TPREL16_HI:
15596 case R_PPC64_GOT_TPREL16_HA:
c213164a 15597 case R_PPC64_GOT_TPREL34:
411e1bfb
AM
15598 tls_type = TLS_TLS | TLS_TPREL;
15599 goto dogot;
15600
15601 case R_PPC64_GOT_DTPREL16_DS:
15602 case R_PPC64_GOT_DTPREL16_LO_DS:
15603 case R_PPC64_GOT_DTPREL16_HI:
15604 case R_PPC64_GOT_DTPREL16_HA:
c213164a 15605 case R_PPC64_GOT_DTPREL34:
411e1bfb
AM
15606 tls_type = TLS_TLS | TLS_DTPREL;
15607 goto dogot;
15608
65f38f15
AM
15609 case R_PPC64_GOT16:
15610 case R_PPC64_GOT16_LO:
15611 case R_PPC64_GOT16_HI:
15612 case R_PPC64_GOT16_HA:
15613 case R_PPC64_GOT16_DS:
15614 case R_PPC64_GOT16_LO_DS:
5663e321 15615 case R_PPC64_GOT_PCREL34:
411e1bfb 15616 dogot:
5bd4f169
AM
15617 {
15618 /* Relocation is to the entry for this symbol in the global
15619 offset table. */
e717da7e 15620 asection *got;
d881513a 15621 bfd_vma *offp;
5bd4f169 15622 bfd_vma off;
d881513a 15623 unsigned long indx = 0;
927be08e 15624 struct got_entry *ent;
65f38f15 15625
d881513a 15626 if (tls_type == (TLS_TLS | TLS_LD)
f749f26e 15627 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
927be08e 15628 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 15629 else
5bd4f169 15630 {
d881513a
AM
15631 if (h != NULL)
15632 {
f0158f44
AM
15633 if (!htab->elf.dynamic_sections_created
15634 || h->elf.dynindx == -1
15635 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
21d68fcd 15636 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
d881513a
AM
15637 /* This is actually a static link, or it is a
15638 -Bsymbolic link and the symbol is defined
15639 locally, or the symbol was forced to be local
15640 because of a version file. */
15641 ;
15642 else
15643 {
039b3fef 15644 indx = h->elf.dynindx;
d881513a
AM
15645 unresolved_reloc = FALSE;
15646 }
039b3fef 15647 ent = h->elf.got.glist;
d881513a 15648 }
411e1bfb 15649 else
5bd4f169 15650 {
d881513a
AM
15651 if (local_got_ents == NULL)
15652 abort ();
15653 ent = local_got_ents[r_symndx];
5bd4f169 15654 }
d881513a
AM
15655
15656 for (; ent != NULL; ent = ent->next)
133a1f60 15657 if (ent->addend == orig_rel.r_addend
e717da7e 15658 && ent->owner == input_bfd
d881513a
AM
15659 && ent->tls_type == tls_type)
15660 break;
5bd4f169 15661 }
411e1bfb 15662
927be08e
AM
15663 if (ent == NULL)
15664 abort ();
15665 if (ent->is_indirect)
15666 ent = ent->got.ent;
15667 offp = &ent->got.offset;
15668 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
15669 if (got == NULL)
15670 abort ();
15671
411e1bfb
AM
15672 /* The offset must always be a multiple of 8. We use the
15673 least significant bit to record whether we have already
15674 processed this entry. */
d881513a 15675 off = *offp;
411e1bfb
AM
15676 if ((off & 1) != 0)
15677 off &= ~1;
5bd4f169
AM
15678 else
15679 {
411e1bfb
AM
15680 /* Generate relocs for the dynamic linker, except in
15681 the case of TLSLD where we'll use one entry per
15682 module. */
25f23106
AM
15683 asection *relgot;
15684 bfd_boolean ifunc;
e717da7e 15685
d881513a 15686 *offp = off | 1;
25f23106
AM
15687 relgot = NULL;
15688 ifunc = (h != NULL
15689 ? h->elf.type == STT_GNU_IFUNC
15690 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 15691 if (ifunc)
82e66161
AM
15692 {
15693 relgot = htab->elf.irelplt;
15694 if (indx == 0)
15695 htab->local_ifunc_resolver = 1;
15696 else if (is_static_defined (&h->elf))
15697 htab->maybe_local_ifunc_resolver = 1;
15698 }
f0158f44
AM
15699 else if (indx != 0
15700 || (bfd_link_pic (info)
15701 && (h == NULL
f749f26e
AM
15702 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
15703 && !(tls_type != 0
f15d0b54
AM
15704 && bfd_link_executable (info)
15705 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
19e08130 15706 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 15707 if (relgot != NULL)
5bd4f169 15708 {
e717da7e
AM
15709 outrel.r_offset = (got->output_section->vma
15710 + got->output_offset
411e1bfb 15711 + off);
133a1f60 15712 outrel.r_addend = orig_rel.r_addend;
d881513a 15713 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 15714 {
411e1bfb 15715 outrel.r_addend = 0;
e515b051 15716 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
15717 if (tls_type == (TLS_TLS | TLS_GD))
15718 {
e717da7e
AM
15719 loc = relgot->contents;
15720 loc += (relgot->reloc_count++
d881513a
AM
15721 * sizeof (Elf64_External_Rela));
15722 bfd_elf64_swap_reloca_out (output_bfd,
15723 &outrel, loc);
e515b051 15724 outrel.r_offset += 8;
133a1f60 15725 outrel.r_addend = orig_rel.r_addend;
d881513a
AM
15726 outrel.r_info
15727 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 15728 }
411e1bfb 15729 }
951fd09b 15730 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 15731 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 15732 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 15733 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
15734 else if (indx != 0)
15735 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
15736 else
81407a69 15737 {
25f23106
AM
15738 if (ifunc)
15739 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15740 else
15741 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
15742
15743 /* Write the .got section contents for the sake
15744 of prelink. */
e717da7e 15745 loc = got->contents + off;
23fbd6fa
JJ
15746 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
15747 loc);
81407a69 15748 }
81407a69
AM
15749
15750 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
15751 {
15752 outrel.r_addend += relocation;
15753 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
989f9879
AM
15754 {
15755 if (htab->elf.tls_sec == NULL)
15756 outrel.r_addend = 0;
15757 else
15758 outrel.r_addend -= htab->elf.tls_sec->vma;
15759 }
e515b051 15760 }
e717da7e
AM
15761 loc = relgot->contents;
15762 loc += (relgot->reloc_count++
411e1bfb
AM
15763 * sizeof (Elf64_External_Rela));
15764 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
15765 }
15766
ad8e1ba5 15767 /* Init the .got section contents here if we're not
81407a69 15768 emitting a reloc. */
d881513a 15769 else
411e1bfb 15770 {
133a1f60 15771 relocation += orig_rel.r_addend;
f0158f44 15772 if (tls_type != 0)
411e1bfb 15773 {
989f9879
AM
15774 if (htab->elf.tls_sec == NULL)
15775 relocation = 0;
15776 else
15777 {
f0158f44
AM
15778 if (tls_type & TLS_LD)
15779 relocation = 0;
15780 else
15781 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
676ee2b5 15782 if (tls_type & TLS_TPREL)
989f9879
AM
15783 relocation += DTP_OFFSET - TP_OFFSET;
15784 }
5bd4f169 15785
f0158f44 15786 if (tls_type & (TLS_GD | TLS_LD))
7b609f53
AM
15787 {
15788 bfd_put_64 (output_bfd, relocation,
e717da7e 15789 got->contents + off + 8);
676ee2b5 15790 relocation = 1;
7b609f53 15791 }
411e1bfb
AM
15792 }
15793 bfd_put_64 (output_bfd, relocation,
e717da7e 15794 got->contents + off);
5bd4f169
AM
15795 }
15796 }
15797
65f38f15
AM
15798 if (off >= (bfd_vma) -2)
15799 abort ();
15800
bf102f86 15801 relocation = got->output_section->vma + got->output_offset + off;
133a1f60 15802 addend = 0;
c213164a
AM
15803 if (!(r_type == R_PPC64_GOT_PCREL34
15804 || r_type == R_PPC64_GOT_TLSGD34
15805 || r_type == R_PPC64_GOT_TLSLD34
15806 || r_type == R_PPC64_GOT_TPREL34
15807 || r_type == R_PPC64_GOT_DTPREL34))
5663e321 15808 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
5bd4f169 15809 }
65f38f15
AM
15810 break;
15811
15812 case R_PPC64_PLT16_HA:
15813 case R_PPC64_PLT16_HI:
15814 case R_PPC64_PLT16_LO:
08be3224 15815 case R_PPC64_PLT16_LO_DS:
5663e321
AM
15816 case R_PPC64_PLT_PCREL34:
15817 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
15818 case R_PPC64_PLT32:
15819 case R_PPC64_PLT64:
23cedd1d 15820 case R_PPC64_PLTSEQ:
5663e321 15821 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d 15822 case R_PPC64_PLTCALL:
5663e321 15823 case R_PPC64_PLTCALL_NOTOC:
65f38f15
AM
15824 /* Relocation is to the entry for this symbol in the
15825 procedure linkage table. */
23cedd1d 15826 unresolved_reloc = TRUE;
cbf95972
AM
15827 {
15828 struct plt_entry **plt_list = NULL;
15829 if (h != NULL)
15830 plt_list = &h->elf.plt.plist;
15831 else if (local_got_ents != NULL)
15832 {
15833 struct plt_entry **local_plt = (struct plt_entry **)
15834 (local_got_ents + symtab_hdr->sh_info);
2d7ad24e 15835 plt_list = local_plt + r_symndx;
cbf95972
AM
15836 }
15837 if (plt_list)
15838 {
15839 struct plt_entry *ent;
65f38f15 15840
cbf95972
AM
15841 for (ent = *plt_list; ent != NULL; ent = ent->next)
15842 if (ent->plt.offset != (bfd_vma) -1
133a1f60 15843 && ent->addend == orig_rel.r_addend)
cbf95972
AM
15844 {
15845 asection *plt;
08be3224 15846 bfd_vma got;
cbf95972
AM
15847
15848 plt = htab->elf.splt;
15849 if (!htab->elf.dynamic_sections_created
15850 || h == NULL
15851 || h->elf.dynindx == -1)
2d7ad24e
AM
15852 {
15853 if (h != NULL
15854 ? h->elf.type == STT_GNU_IFUNC
15855 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15856 plt = htab->elf.iplt;
15857 else
15858 plt = htab->pltlocal;
15859 }
15860 relocation = (plt->output_section->vma
15861 + plt->output_offset
15862 + ent->plt.offset);
08be3224 15863 if (r_type == R_PPC64_PLT16_HA
2cdcc330
AM
15864 || r_type == R_PPC64_PLT16_HI
15865 || r_type == R_PPC64_PLT16_LO
15866 || r_type == R_PPC64_PLT16_LO_DS)
08be3224
AM
15867 {
15868 got = (elf_gp (output_bfd)
15869 + htab->sec_info[input_section->id].toc_off);
15870 relocation -= got;
15871 }
133a1f60 15872 addend = 0;
cbf95972
AM
15873 unresolved_reloc = FALSE;
15874 break;
15875 }
15876 }
15877 }
65f38f15 15878 break;
5bd4f169 15879
0b13192e
AM
15880 case R_PPC64_TOC:
15881 /* Relocation value is TOC base. */
15882 relocation = TOCstart;
cf35638d 15883 if (r_symndx == STN_UNDEF)
6f20ed8a 15884 relocation += htab->sec_info[input_section->id].toc_off;
8517fae7
AM
15885 else if (unresolved_reloc)
15886 ;
6f20ed8a
AM
15887 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
15888 relocation += htab->sec_info[sec->id].toc_off;
0b13192e
AM
15889 else
15890 unresolved_reloc = TRUE;
ab96bf03 15891 goto dodyn;
0b13192e 15892
5bd4f169
AM
15893 /* TOC16 relocs. We want the offset relative to the TOC base,
15894 which is the address of the start of the TOC plus 0x8000.
15895 The TOC consists of sections .got, .toc, .tocbss, and .plt,
15896 in this order. */
65f38f15
AM
15897 case R_PPC64_TOC16:
15898 case R_PPC64_TOC16_LO:
15899 case R_PPC64_TOC16_HI:
15900 case R_PPC64_TOC16_DS:
15901 case R_PPC64_TOC16_LO_DS:
15902 case R_PPC64_TOC16_HA:
6f20ed8a 15903 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
1bdd8fac
AM
15904 if (h != NULL)
15905 goto dodyn;
5bd4f169
AM
15906 break;
15907
15908 /* Relocate against the beginning of the section. */
65f38f15
AM
15909 case R_PPC64_SECTOFF:
15910 case R_PPC64_SECTOFF_LO:
15911 case R_PPC64_SECTOFF_HI:
15912 case R_PPC64_SECTOFF_DS:
15913 case R_PPC64_SECTOFF_LO_DS:
15914 case R_PPC64_SECTOFF_HA:
4ce794b7 15915 if (sec != NULL)
65f38f15 15916 addend -= sec->output_section->vma;
5bd4f169
AM
15917 break;
15918
25f23106
AM
15919 case R_PPC64_REL16:
15920 case R_PPC64_REL16_LO:
15921 case R_PPC64_REL16_HI:
15922 case R_PPC64_REL16_HA:
4a969973
AM
15923 case R_PPC64_REL16_HIGH:
15924 case R_PPC64_REL16_HIGHA:
15925 case R_PPC64_REL16_HIGHER:
15926 case R_PPC64_REL16_HIGHERA:
15927 case R_PPC64_REL16_HIGHEST:
15928 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
15929 case R_PPC64_REL16_HIGHER34:
15930 case R_PPC64_REL16_HIGHERA34:
15931 case R_PPC64_REL16_HIGHEST34:
15932 case R_PPC64_REL16_HIGHESTA34:
a680de9a 15933 case R_PPC64_REL16DX_HA:
721956f4
AM
15934 case R_PPC64_REL14:
15935 case R_PPC64_REL14_BRNTAKEN:
15936 case R_PPC64_REL14_BRTAKEN:
5d1634d7 15937 case R_PPC64_REL24:
05d0e962 15938 case R_PPC64_REL24_NOTOC:
5663e321
AM
15939 case R_PPC64_PCREL34:
15940 case R_PPC64_PCREL28:
5d1634d7
AM
15941 break;
15942
411e1bfb
AM
15943 case R_PPC64_TPREL16:
15944 case R_PPC64_TPREL16_LO:
15945 case R_PPC64_TPREL16_HI:
15946 case R_PPC64_TPREL16_HA:
15947 case R_PPC64_TPREL16_DS:
15948 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
15949 case R_PPC64_TPREL16_HIGH:
15950 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
15951 case R_PPC64_TPREL16_HIGHER:
15952 case R_PPC64_TPREL16_HIGHERA:
15953 case R_PPC64_TPREL16_HIGHEST:
15954 case R_PPC64_TPREL16_HIGHESTA:
c213164a 15955 case R_PPC64_TPREL34:
766bc656
AM
15956 if (h != NULL
15957 && h->elf.root.type == bfd_link_hash_undefweak
15958 && h->elf.dynindx == -1)
15959 {
15960 /* Make this relocation against an undefined weak symbol
15961 resolve to zero. This is really just a tweak, since
15962 code using weak externs ought to check that they are
15963 defined before using them. */
15964 bfd_byte *p = contents + rel->r_offset - d_offset;
15965
95f0d0d2 15966 insn = bfd_get_32 (input_bfd, p);
766bc656
AM
15967 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
15968 if (insn != 0)
95f0d0d2 15969 bfd_put_32 (input_bfd, insn, p);
766bc656
AM
15970 break;
15971 }
989f9879
AM
15972 if (htab->elf.tls_sec != NULL)
15973 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7c8bbca5
AM
15974 /* The TPREL16 relocs shouldn't really be used in shared
15975 libs or with non-local symbols as that will result in
15976 DT_TEXTREL being set, but support them anyway. */
15977 goto dodyn;
411e1bfb
AM
15978
15979 case R_PPC64_DTPREL16:
15980 case R_PPC64_DTPREL16_LO:
15981 case R_PPC64_DTPREL16_HI:
15982 case R_PPC64_DTPREL16_HA:
15983 case R_PPC64_DTPREL16_DS:
15984 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
15985 case R_PPC64_DTPREL16_HIGH:
15986 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
15987 case R_PPC64_DTPREL16_HIGHER:
15988 case R_PPC64_DTPREL16_HIGHERA:
15989 case R_PPC64_DTPREL16_HIGHEST:
15990 case R_PPC64_DTPREL16_HIGHESTA:
c213164a 15991 case R_PPC64_DTPREL34:
989f9879
AM
15992 if (htab->elf.tls_sec != NULL)
15993 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
15994 break;
15995
45965137
AM
15996 case R_PPC64_ADDR64_LOCAL:
15997 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
15998 ? h->elf.other
15999 : sym->st_other);
16000 break;
16001
e515b051
AM
16002 case R_PPC64_DTPMOD64:
16003 relocation = 1;
16004 addend = 0;
16005 goto dodyn;
16006
411e1bfb 16007 case R_PPC64_TPREL64:
989f9879
AM
16008 if (htab->elf.tls_sec != NULL)
16009 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
16010 goto dodyn;
16011
16012 case R_PPC64_DTPREL64:
989f9879
AM
16013 if (htab->elf.tls_sec != NULL)
16014 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
1a0670f3 16015 /* Fall through. */
411e1bfb 16016
65f38f15
AM
16017 /* Relocations that may need to be propagated if this is a
16018 dynamic object. */
04c9666a 16019 case R_PPC64_REL30:
65f38f15
AM
16020 case R_PPC64_REL32:
16021 case R_PPC64_REL64:
16022 case R_PPC64_ADDR14:
16023 case R_PPC64_ADDR14_BRNTAKEN:
16024 case R_PPC64_ADDR14_BRTAKEN:
16025 case R_PPC64_ADDR16:
16026 case R_PPC64_ADDR16_DS:
16027 case R_PPC64_ADDR16_HA:
16028 case R_PPC64_ADDR16_HI:
f9c6b907
AM
16029 case R_PPC64_ADDR16_HIGH:
16030 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16031 case R_PPC64_ADDR16_HIGHER:
16032 case R_PPC64_ADDR16_HIGHERA:
16033 case R_PPC64_ADDR16_HIGHEST:
16034 case R_PPC64_ADDR16_HIGHESTA:
16035 case R_PPC64_ADDR16_LO:
16036 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
16037 case R_PPC64_ADDR16_HIGHER34:
16038 case R_PPC64_ADDR16_HIGHERA34:
16039 case R_PPC64_ADDR16_HIGHEST34:
16040 case R_PPC64_ADDR16_HIGHESTA34:
65f38f15 16041 case R_PPC64_ADDR24:
65f38f15
AM
16042 case R_PPC64_ADDR32:
16043 case R_PPC64_ADDR64:
16044 case R_PPC64_UADDR16:
16045 case R_PPC64_UADDR32:
16046 case R_PPC64_UADDR64:
5663e321
AM
16047 case R_PPC64_D34:
16048 case R_PPC64_D34_LO:
16049 case R_PPC64_D34_HI30:
16050 case R_PPC64_D34_HA30:
16051 case R_PPC64_D28:
411e1bfb 16052 dodyn:
5d1634d7 16053 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
16054 break;
16055
41bd81ab
AM
16056 if (NO_OPD_RELOCS && is_opd)
16057 break;
16058
8a9e8e72 16059 if (bfd_link_pic (info)
b1b07054
AM
16060 ? ((h == NULL
16061 || h->dyn_relocs != NULL)
16062 && ((h != NULL && pc_dynrelocs (h))
16063 || must_be_dyn_reloc (info, r_type)))
8a9e8e72
AM
16064 : (h != NULL
16065 ? h->dyn_relocs != NULL
d311bc8b 16066 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
65f38f15 16067 {
b34976b6 16068 bfd_boolean skip, relocate;
65f38f15 16069 asection *sreloc;
1cf1f670 16070 bfd_vma out_off;
82e66161 16071 long indx = 0;
65f38f15
AM
16072
16073 /* When generating a dynamic object, these relocations
16074 are copied into the output file to be resolved at run
16075 time. */
16076
b34976b6
AM
16077 skip = FALSE;
16078 relocate = FALSE;
65f38f15 16079
1cf1f670
AM
16080 out_off = _bfd_elf_section_offset (output_bfd, info,
16081 input_section, rel->r_offset);
16082 if (out_off == (bfd_vma) -1)
b34976b6 16083 skip = TRUE;
1cf1f670 16084 else if (out_off == (bfd_vma) -2)
b34976b6 16085 skip = TRUE, relocate = TRUE;
1cf1f670
AM
16086 out_off += (input_section->output_section->vma
16087 + input_section->output_offset);
16088 outrel.r_offset = out_off;
411e1bfb 16089 outrel.r_addend = rel->r_addend;
65f38f15 16090
1cf1f670
AM
16091 /* Optimize unaligned reloc use. */
16092 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
16093 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
16094 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
16095 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
16096 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
16097 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
16098 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
16099 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
16100 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
16101
65f38f15 16102 if (skip)
0bb2d96a 16103 memset (&outrel, 0, sizeof outrel);
afe397ea 16104 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
16105 && !is_opd
16106 && r_type != R_PPC64_TOC)
14acf4dc 16107 {
82e66161
AM
16108 indx = h->elf.dynindx;
16109 BFD_ASSERT (indx != -1);
16110 outrel.r_info = ELF64_R_INFO (indx, r_type);
14acf4dc 16111 }
65f38f15
AM
16112 else
16113 {
41bd81ab
AM
16114 /* This symbol is local, or marked to become local,
16115 or this is an opd section reloc which must point
16116 at a local function. */
65f38f15 16117 outrel.r_addend += relocation;
e86ce104 16118 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 16119 {
3fad3c7c 16120 if (is_opd && h != NULL)
afbe61cf
AM
16121 {
16122 /* Lie about opd entries. This case occurs
16123 when building shared libraries and we
16124 reference a function in another shared
3fad3c7c
AM
16125 lib. The same thing happens for a weak
16126 definition in an application that's
16127 overridden by a strong definition in a
16128 shared lib. (I believe this is a generic
16129 bug in binutils handling of weak syms.)
16130 In these cases we won't use the opd
1e2f5b6e 16131 entry in this lib. */
b34976b6 16132 unresolved_reloc = FALSE;
afbe61cf 16133 }
25f23106
AM
16134 if (!is_opd
16135 && r_type == R_PPC64_ADDR64
16136 && (h != NULL
16137 ? h->elf.type == STT_GNU_IFUNC
16138 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
16139 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
16140 else
16141 {
16142 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 16143
25f23106
AM
16144 /* We need to relocate .opd contents for ld.so.
16145 Prelink also wants simple and consistent rules
16146 for relocs. This make all RELATIVE relocs have
16147 *r_offset equal to r_addend. */
16148 relocate = TRUE;
16149 }
65f38f15
AM
16150 }
16151 else
16152 {
25f23106
AM
16153 if (h != NULL
16154 ? h->elf.type == STT_GNU_IFUNC
16155 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
16156 {
25f53a85 16157 info->callbacks->einfo
695344c0 16158 /* xgettext:c-format */
174d0a74 16159 (_("%H: %s for indirect "
c1c8c1ef 16160 "function `%pT' unsupported\n"),
25f53a85 16161 input_bfd, input_section, rel->r_offset,
25f23106
AM
16162 ppc64_elf_howto_table[r_type]->name,
16163 sym_name);
16164 ret = FALSE;
16165 }
cf35638d 16166 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
16167 ;
16168 else if (sec == NULL || sec->owner == NULL)
16169 {
16170 bfd_set_error (bfd_error_bad_value);
b34976b6 16171 return FALSE;
65f38f15
AM
16172 }
16173 else
16174 {
f26a3287 16175 asection *osec = sec->output_section;
65f38f15 16176
f26a3287
AM
16177 if ((osec->flags & SEC_THREAD_LOCAL) != 0)
16178 {
16179 /* TLS symbol values are relative to the
16180 TLS segment. Dynamic relocations for
16181 local TLS symbols therefore can't be
16182 reduced to a relocation against their
16183 section symbol because it holds the
16184 address of the section, not a value
16185 relative to the TLS segment. We could
16186 change the .tdata dynamic section symbol
16187 to be zero value but STN_UNDEF works
16188 and is used elsewhere, eg. for TPREL64
16189 GOT relocs against local TLS symbols. */
16190 osec = htab->elf.tls_sec;
16191 indx = 0;
16192 }
16193 else
74541ad4 16194 {
74541ad4 16195 indx = elf_section_data (osec)->dynindx;
f26a3287
AM
16196 if (indx == 0)
16197 {
16198 if ((osec->flags & SEC_READONLY) == 0
16199 && htab->elf.data_index_section != NULL)
16200 osec = htab->elf.data_index_section;
16201 else
16202 osec = htab->elf.text_index_section;
16203 indx = elf_section_data (osec)->dynindx;
16204 }
16205 BFD_ASSERT (indx != 0);
74541ad4 16206 }
74541ad4 16207
65f38f15
AM
16208 /* We are turning this relocation into one
16209 against a section symbol, so subtract out
16210 the output section's address but not the
16211 offset of the input section in the output
16212 section. */
16213 outrel.r_addend -= osec->vma;
16214 }
16215
16216 outrel.r_info = ELF64_R_INFO (indx, r_type);
16217 }
16218 }
16219
16220 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
16221 if (h != NULL
16222 ? h->elf.type == STT_GNU_IFUNC
16223 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
82e66161
AM
16224 {
16225 sreloc = htab->elf.irelplt;
16226 if (indx == 0)
16227 htab->local_ifunc_resolver = 1;
16228 else if (is_static_defined (&h->elf))
16229 htab->maybe_local_ifunc_resolver = 1;
16230 }
65f38f15
AM
16231 if (sreloc == NULL)
16232 abort ();
16233
dfbb6ac9
AM
16234 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
16235 >= sreloc->size)
16236 abort ();
947216bf
AM
16237 loc = sreloc->contents;
16238 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
16239 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
16240
e59a1001
AM
16241 if (!warned_dynamic
16242 && !ppc64_glibc_dynamic_reloc (ELF64_R_TYPE (outrel.r_info)))
16243 {
16244 info->callbacks->einfo
16245 /* xgettext:c-format */
16246 (_("%X%P: %pB: %s against %pT "
16247 "is not supported by glibc as a dynamic relocation\n"),
16248 input_bfd,
16249 ppc64_elf_howto_table[ELF64_R_TYPE (outrel.r_info)]->name,
16250 sym_name);
16251 warned_dynamic = TRUE;
16252 }
16253
65f38f15
AM
16254 /* If this reloc is against an external symbol, it will
16255 be computed at runtime, so there's no need to do
81407a69
AM
16256 anything now. However, for the sake of prelink ensure
16257 that the section contents are a known value. */
2cdcc330 16258 if (!relocate)
81407a69
AM
16259 {
16260 unresolved_reloc = FALSE;
16261 /* The value chosen here is quite arbitrary as ld.so
16262 ignores section contents except for the special
16263 case of .opd where the contents might be accessed
16264 before relocation. Choose zero, as that won't
16265 cause reloc overflow. */
16266 relocation = 0;
16267 addend = 0;
16268 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
16269 to improve backward compatibility with older
16270 versions of ld. */
16271 if (r_type == R_PPC64_ADDR64)
16272 addend = outrel.r_addend;
16273 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 16274 else if (ppc64_elf_howto_table[r_type]->pc_relative)
f0158f44 16275 addend = outrel.r_offset;
81407a69 16276 }
65f38f15 16277 }
5bd4f169
AM
16278 break;
16279
65f38f15
AM
16280 case R_PPC64_COPY:
16281 case R_PPC64_GLOB_DAT:
16282 case R_PPC64_JMP_SLOT:
25f23106 16283 case R_PPC64_JMP_IREL:
65f38f15
AM
16284 case R_PPC64_RELATIVE:
16285 /* We shouldn't ever see these dynamic relocs in relocatable
16286 files. */
ae9a127f 16287 /* Fall through. */
65f38f15
AM
16288
16289 case R_PPC64_PLTGOT16:
16290 case R_PPC64_PLTGOT16_DS:
16291 case R_PPC64_PLTGOT16_HA:
16292 case R_PPC64_PLTGOT16_HI:
16293 case R_PPC64_PLTGOT16_LO:
16294 case R_PPC64_PLTGOT16_LO_DS:
16295 case R_PPC64_PLTREL32:
16296 case R_PPC64_PLTREL64:
16297 /* These ones haven't been implemented yet. */
16298
25f53a85 16299 info->callbacks->einfo
695344c0 16300 /* xgettext:c-format */
c1c8c1ef 16301 (_("%P: %pB: %s is not supported for `%pT'\n"),
d003868e 16302 input_bfd,
4ce794b7 16303 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
16304
16305 bfd_set_error (bfd_error_invalid_operation);
b34976b6 16306 ret = FALSE;
c316a17c 16307 goto copy_reloc;
65f38f15 16308 }
5bd4f169 16309
67f0cbdb
AM
16310 /* Multi-instruction sequences that access the TOC can be
16311 optimized, eg. addis ra,r2,0; addi rb,ra,x;
07d6d2b8 16312 to nop; addi rb,r2,x; */
67f0cbdb
AM
16313 switch (r_type)
16314 {
16315 default:
16316 break;
16317
16318 case R_PPC64_GOT_TLSLD16_HI:
16319 case R_PPC64_GOT_TLSGD16_HI:
16320 case R_PPC64_GOT_TPREL16_HI:
16321 case R_PPC64_GOT_DTPREL16_HI:
16322 case R_PPC64_GOT16_HI:
16323 case R_PPC64_TOC16_HI:
16324 /* These relocs would only be useful if building up an
16325 offset to later add to r2, perhaps in an indexed
16326 addressing mode instruction. Don't try to optimize.
16327 Unfortunately, the possibility of someone building up an
16328 offset like this or even with the HA relocs, means that
16329 we need to check the high insn when optimizing the low
16330 insn. */
16331 break;
16332
5663e321
AM
16333 case R_PPC64_PLTCALL_NOTOC:
16334 if (!unresolved_reloc)
16335 htab->notoc_plt = 1;
16336 /* Fall through. */
23cedd1d
AM
16337 case R_PPC64_PLTCALL:
16338 if (unresolved_reloc)
16339 {
16340 /* No plt entry. Make this into a direct call. */
16341 bfd_byte *p = contents + rel->r_offset;
16342 insn = bfd_get_32 (input_bfd, p);
16343 insn &= 1;
16344 bfd_put_32 (input_bfd, B_DOT | insn, p);
5663e321
AM
16345 if (r_type == R_PPC64_PLTCALL)
16346 bfd_put_32 (input_bfd, NOP, p + 4);
23cedd1d
AM
16347 unresolved_reloc = save_unresolved_reloc;
16348 r_type = R_PPC64_REL24;
16349 }
16350 break;
16351
5663e321 16352 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d
AM
16353 case R_PPC64_PLTSEQ:
16354 if (unresolved_reloc)
16355 {
16356 unresolved_reloc = FALSE;
16357 goto nop_it;
16358 }
16359 break;
16360
5663e321
AM
16361 case R_PPC64_PLT_PCREL34_NOTOC:
16362 if (!unresolved_reloc)
16363 htab->notoc_plt = 1;
16364 /* Fall through. */
16365 case R_PPC64_PLT_PCREL34:
16366 if (unresolved_reloc)
16367 {
16368 bfd_byte *p = contents + rel->r_offset;
16369 bfd_put_32 (input_bfd, PNOP >> 32, p);
16370 bfd_put_32 (input_bfd, PNOP, p + 4);
16371 unresolved_reloc = FALSE;
16372 goto copy_reloc;
16373 }
16374 break;
16375
23cedd1d
AM
16376 case R_PPC64_PLT16_HA:
16377 if (unresolved_reloc)
16378 {
16379 unresolved_reloc = FALSE;
16380 goto nop_it;
16381 }
16382 /* Fall through. */
67f0cbdb
AM
16383 case R_PPC64_GOT_TLSLD16_HA:
16384 case R_PPC64_GOT_TLSGD16_HA:
16385 case R_PPC64_GOT_TPREL16_HA:
16386 case R_PPC64_GOT_DTPREL16_HA:
16387 case R_PPC64_GOT16_HA:
16388 case R_PPC64_TOC16_HA:
98528052 16389 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16390 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052 16391 {
23cedd1d
AM
16392 bfd_byte *p;
16393 nop_it:
16394 p = contents + (rel->r_offset & ~3);
98528052 16395 bfd_put_32 (input_bfd, NOP, p);
d830549d 16396 goto copy_reloc;
98528052 16397 }
67f0cbdb
AM
16398 break;
16399
23cedd1d
AM
16400 case R_PPC64_PLT16_LO:
16401 case R_PPC64_PLT16_LO_DS:
16402 if (unresolved_reloc)
16403 {
16404 unresolved_reloc = FALSE;
16405 goto nop_it;
16406 }
16407 /* Fall through. */
67f0cbdb
AM
16408 case R_PPC64_GOT_TLSLD16_LO:
16409 case R_PPC64_GOT_TLSGD16_LO:
16410 case R_PPC64_GOT_TPREL16_LO_DS:
16411 case R_PPC64_GOT_DTPREL16_LO_DS:
16412 case R_PPC64_GOT16_LO:
16413 case R_PPC64_GOT16_LO_DS:
16414 case R_PPC64_TOC16_LO:
16415 case R_PPC64_TOC16_LO_DS:
98528052 16416 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 16417 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
16418 {
16419 bfd_byte *p = contents + (rel->r_offset & ~3);
16420 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16421 if ((insn & (0x3fu << 26)) == 12u << 26 /* addic */)
560c8763
AM
16422 {
16423 /* Transform addic to addi when we change reg. */
2365f8d7 16424 insn &= ~((0x3fu << 26) | (0x1f << 16));
560c8763
AM
16425 insn |= (14u << 26) | (2 << 16);
16426 }
16427 else
67f0cbdb 16428 {
98528052
AM
16429 insn &= ~(0x1f << 16);
16430 insn |= 2 << 16;
67f0cbdb 16431 }
560c8763 16432 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
16433 }
16434 break;
9a23f96e
AM
16435
16436 case R_PPC64_TPREL16_HA:
16437 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16438 {
16439 bfd_byte *p = contents + (rel->r_offset & ~3);
16440 insn = bfd_get_32 (input_bfd, p);
2365f8d7 16441 if ((insn & ((0x3fu << 26) | 0x1f << 16))
9a23f96e
AM
16442 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */)
16443 /* xgettext:c-format */
16444 info->callbacks->minfo
16445 (_("%H: warning: %s unexpected insn %#x.\n"),
d830549d
AM
16446 input_bfd, input_section, rel->r_offset,
16447 ppc64_elf_howto_table[r_type]->name, insn);
9a23f96e 16448 else
d830549d
AM
16449 {
16450 bfd_put_32 (input_bfd, NOP, p);
16451 goto copy_reloc;
16452 }
9a23f96e
AM
16453 }
16454 break;
16455
16456 case R_PPC64_TPREL16_LO:
16457 case R_PPC64_TPREL16_LO_DS:
16458 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
16459 {
16460 bfd_byte *p = contents + (rel->r_offset & ~3);
16461 insn = bfd_get_32 (input_bfd, p);
16462 insn &= ~(0x1f << 16);
16463 insn |= 13 << 16;
16464 bfd_put_32 (input_bfd, insn, p);
16465 }
16466 break;
67f0cbdb
AM
16467 }
16468
65f38f15
AM
16469 /* Do any further special processing. */
16470 switch (r_type)
16471 {
16472 default:
16473 break;
16474
25f23106 16475 case R_PPC64_REL16_HA:
4a969973
AM
16476 case R_PPC64_REL16_HIGHA:
16477 case R_PPC64_REL16_HIGHERA:
16478 case R_PPC64_REL16_HIGHESTA:
a680de9a 16479 case R_PPC64_REL16DX_HA:
f9c6b907
AM
16480 case R_PPC64_ADDR16_HA:
16481 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
16482 case R_PPC64_ADDR16_HIGHERA:
16483 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
16484 case R_PPC64_TOC16_HA:
16485 case R_PPC64_SECTOFF_HA:
411e1bfb 16486 case R_PPC64_TPREL16_HA:
f9c6b907 16487 case R_PPC64_TPREL16_HIGHA:
411e1bfb 16488 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 16489 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
16490 case R_PPC64_DTPREL16_HA:
16491 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 16492 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 16493 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
16494 /* It's just possible that this symbol is a weak symbol
16495 that's not actually defined anywhere. In that case,
16496 'sec' would be NULL, and we should leave the symbol
16497 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
16498 if (sec == NULL)
16499 break;
1a0670f3 16500 /* Fall through. */
5c5f6e17
AM
16501
16502 case R_PPC64_GOT16_HA:
16503 case R_PPC64_PLTGOT16_HA:
16504 case R_PPC64_PLT16_HA:
16505 case R_PPC64_GOT_TLSGD16_HA:
16506 case R_PPC64_GOT_TLSLD16_HA:
16507 case R_PPC64_GOT_TPREL16_HA:
16508 case R_PPC64_GOT_DTPREL16_HA:
16509 /* Add 0x10000 if sign bit in 0:15 is set.
16510 Bits 0:15 are not used. */
16511 addend += 0x8000;
65f38f15
AM
16512 break;
16513
5663e321
AM
16514 case R_PPC64_D34_HA30:
16515 case R_PPC64_ADDR16_HIGHERA34:
16516 case R_PPC64_ADDR16_HIGHESTA34:
16517 case R_PPC64_REL16_HIGHERA34:
16518 case R_PPC64_REL16_HIGHESTA34:
16519 if (sec != NULL)
16520 addend += 1ULL << 33;
16521 break;
16522
65f38f15
AM
16523 case R_PPC64_ADDR16_DS:
16524 case R_PPC64_ADDR16_LO_DS:
16525 case R_PPC64_GOT16_DS:
16526 case R_PPC64_GOT16_LO_DS:
16527 case R_PPC64_PLT16_LO_DS:
16528 case R_PPC64_SECTOFF_DS:
16529 case R_PPC64_SECTOFF_LO_DS:
16530 case R_PPC64_TOC16_DS:
16531 case R_PPC64_TOC16_LO_DS:
16532 case R_PPC64_PLTGOT16_DS:
16533 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
16534 case R_PPC64_GOT_TPREL16_DS:
16535 case R_PPC64_GOT_TPREL16_LO_DS:
16536 case R_PPC64_GOT_DTPREL16_DS:
16537 case R_PPC64_GOT_DTPREL16_LO_DS:
16538 case R_PPC64_TPREL16_DS:
16539 case R_PPC64_TPREL16_LO_DS:
16540 case R_PPC64_DTPREL16_DS:
16541 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
16542 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
16543 mask = 3;
a680de9a
PB
16544 /* If this reloc is against an lq, lxv, or stxv insn, then
16545 the value must be a multiple of 16. This is somewhat of
16546 a hack, but the "correct" way to do this by defining _DQ
16547 forms of all the _DS relocs bloats all reloc switches in
16548 this file. It doesn't make much sense to use these
16549 relocs in data, so testing the insn should be safe. */
2365f8d7
AM
16550 if ((insn & (0x3fu << 26)) == (56u << 26)
16551 || ((insn & (0x3fu << 26)) == (61u << 26) && (insn & 3) == 1))
adadcc0c 16552 mask = 15;
a680de9a
PB
16553 relocation += addend;
16554 addend = insn & (mask ^ 3);
16555 if ((relocation & mask) != 0)
65f38f15 16556 {
a680de9a 16557 relocation ^= relocation & mask;
25f53a85 16558 info->callbacks->einfo
695344c0 16559 /* xgettext:c-format */
174d0a74 16560 (_("%H: error: %s not a multiple of %u\n"),
25f53a85 16561 input_bfd, input_section, rel->r_offset,
d830549d 16562 ppc64_elf_howto_table[r_type]->name,
adadcc0c 16563 mask + 1);
65f38f15 16564 bfd_set_error (bfd_error_bad_value);
b34976b6 16565 ret = FALSE;
c316a17c 16566 goto copy_reloc;
65f38f15
AM
16567 }
16568 break;
5bd4f169
AM
16569 }
16570
239e1f3a
AM
16571 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
16572 because such sections are not SEC_ALLOC and thus ld.so will
16573 not process them. */
d830549d 16574 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15 16575 if (unresolved_reloc
239e1f3a 16576 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
16577 && h->elf.def_dynamic)
16578 && _bfd_elf_section_offset (output_bfd, info, input_section,
16579 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 16580 {
25f53a85 16581 info->callbacks->einfo
695344c0 16582 /* xgettext:c-format */
c1c8c1ef 16583 (_("%H: unresolvable %s against `%pT'\n"),
25f53a85 16584 input_bfd, input_section, rel->r_offset,
b80eed39 16585 howto->name,
039b3fef 16586 h->elf.root.root.string);
b34976b6 16587 ret = FALSE;
9c07fe7c 16588 }
5bd4f169 16589
b80eed39
AM
16590 /* 16-bit fields in insns mostly have signed values, but a
16591 few insns have 16-bit unsigned values. Really, we should
16592 have different reloc types. */
16593 if (howto->complain_on_overflow != complain_overflow_dont
16594 && howto->dst_mask == 0xffff
16595 && (input_section->flags & SEC_CODE) != 0)
16596 {
16597 enum complain_overflow complain = complain_overflow_signed;
16598
16599 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 16600 if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */)
a47622ac
AM
16601 complain = complain_overflow_bitfield;
16602 else if (howto->rightshift == 0
2365f8d7
AM
16603 ? ((insn & (0x3fu << 26)) == 28u << 26 /* andi */
16604 || (insn & (0x3fu << 26)) == 24u << 26 /* ori */
16605 || (insn & (0x3fu << 26)) == 26u << 26 /* xori */)
16606 : ((insn & (0x3fu << 26)) == 29u << 26 /* andis */
16607 || (insn & (0x3fu << 26)) == 25u << 26 /* oris */
16608 || (insn & (0x3fu << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
16609 complain = complain_overflow_unsigned;
16610 if (howto->complain_on_overflow != complain)
16611 {
16612 alt_howto = *howto;
16613 alt_howto.complain_on_overflow = complain;
16614 howto = &alt_howto;
16615 }
16616 }
16617
5663e321 16618 switch (r_type)
a680de9a 16619 {
5663e321
AM
16620 /* Split field relocs aren't handled by _bfd_final_link_relocate. */
16621 case R_PPC64_D34:
16622 case R_PPC64_D34_LO:
16623 case R_PPC64_D34_HI30:
16624 case R_PPC64_D34_HA30:
16625 case R_PPC64_PCREL34:
16626 case R_PPC64_GOT_PCREL34:
c213164a
AM
16627 case R_PPC64_TPREL34:
16628 case R_PPC64_DTPREL34:
16629 case R_PPC64_GOT_TLSGD34:
16630 case R_PPC64_GOT_TLSLD34:
16631 case R_PPC64_GOT_TPREL34:
16632 case R_PPC64_GOT_DTPREL34:
5663e321
AM
16633 case R_PPC64_PLT_PCREL34:
16634 case R_PPC64_PLT_PCREL34_NOTOC:
16635 case R_PPC64_D28:
16636 case R_PPC64_PCREL28:
16637 if (rel->r_offset + 8 > input_section->size)
16638 r = bfd_reloc_outofrange;
16639 else
16640 {
5663e321
AM
16641 relocation += addend;
16642 if (howto->pc_relative)
16643 relocation -= (rel->r_offset
16644 + input_section->output_offset
16645 + input_section->output_section->vma);
16646 relocation >>= howto->rightshift;
16647
16648 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16649 pinsn <<= 32;
16650 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
16651
16652 pinsn &= ~howto->dst_mask;
16653 pinsn |= (((relocation << 16) | (relocation & 0xffff))
16654 & howto->dst_mask);
16655 bfd_put_32 (input_bfd, pinsn >> 32, contents + rel->r_offset);
16656 bfd_put_32 (input_bfd, pinsn, contents + rel->r_offset + 4);
16657 r = bfd_reloc_ok;
16658 if (howto->complain_on_overflow == complain_overflow_signed
16659 && (relocation + (1ULL << (howto->bitsize - 1))
16660 >= 1ULL << howto->bitsize))
16661 r = bfd_reloc_overflow;
16662 }
16663 break;
16664
16665 case R_PPC64_REL16DX_HA:
a680de9a
PB
16666 if (rel->r_offset + 4 > input_section->size)
16667 r = bfd_reloc_outofrange;
16668 else
16669 {
16670 relocation += addend;
16671 relocation -= (rel->r_offset
16672 + input_section->output_offset
16673 + input_section->output_section->vma);
3de43e7b 16674 relocation = (bfd_signed_vma) relocation >> 16;
a680de9a
PB
16675 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16676 insn &= ~0x1fffc1;
3de43e7b 16677 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
a680de9a
PB
16678 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
16679 r = bfd_reloc_ok;
3de43e7b 16680 if (relocation + 0x8000 > 0xffff)
a680de9a
PB
16681 r = bfd_reloc_overflow;
16682 }
5663e321
AM
16683 break;
16684
16685 default:
16686 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
16687 contents, rel->r_offset,
16688 relocation, addend);
a680de9a 16689 }
5bd4f169 16690
ef60b7ff 16691 if (r != bfd_reloc_ok)
5bd4f169 16692 {
bc30df16 16693 char *more_info = NULL;
b80eed39 16694 const char *reloc_name = howto->name;
bc30df16
AM
16695
16696 if (reloc_dest != DEST_NORMAL)
16697 {
16698 more_info = bfd_malloc (strlen (reloc_name) + 8);
16699 if (more_info != NULL)
16700 {
16701 strcpy (more_info, reloc_name);
16702 strcat (more_info, (reloc_dest == DEST_OPD
16703 ? " (OPD)" : " (stub)"));
16704 reloc_name = more_info;
16705 }
16706 }
16707
cd27b276 16708 if (r == bfd_reloc_overflow)
5bd4f169 16709 {
8131c122
AM
16710 /* On code like "if (foo) foo();" don't report overflow
16711 on a branch to zero when foo is undefined. */
16712 if (!warned
16713 && (reloc_dest == DEST_STUB
16714 || !(h != NULL
16715 && (h->elf.root.type == bfd_link_hash_undefweak
16716 || h->elf.root.type == bfd_link_hash_undefined)
16717 && is_branch_reloc (r_type))))
1a72702b
AM
16718 info->callbacks->reloc_overflow (info, &h->elf.root,
16719 sym_name, reloc_name,
16720 orig_rel.r_addend,
16721 input_bfd, input_section,
16722 rel->r_offset);
ef60b7ff
AM
16723 }
16724 else
16725 {
25f53a85 16726 info->callbacks->einfo
695344c0 16727 /* xgettext:c-format */
c1c8c1ef 16728 (_("%H: %s against `%pT': error %d\n"),
25f53a85 16729 input_bfd, input_section, rel->r_offset,
bc30df16 16730 reloc_name, sym_name, (int) r);
b34976b6 16731 ret = FALSE;
ef60b7ff 16732 }
bc30df16
AM
16733 if (more_info != NULL)
16734 free (more_info);
5bd4f169 16735 }
c316a17c
AM
16736 copy_reloc:
16737 if (wrel != rel)
16738 *wrel = *rel;
16739 }
16740
16741 if (wrel != rel)
16742 {
16743 Elf_Internal_Shdr *rel_hdr;
16744 size_t deleted = rel - wrel;
16745
16746 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
16747 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
16748 if (rel_hdr->sh_size == 0)
16749 {
16750 /* It is too late to remove an empty reloc section. Leave
16751 one NONE reloc.
16752 ??? What is wrong with an empty section??? */
16753 rel_hdr->sh_size = rel_hdr->sh_entsize;
16754 deleted -= 1;
16755 }
16756 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
16757 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
16758 input_section->reloc_count -= deleted;
5bd4f169
AM
16759 }
16760
645ea6a9
AM
16761 /* If we're emitting relocations, then shortly after this function
16762 returns, reloc offsets and addends for this section will be
16763 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
16764 file rather than the input. Save a copy of the relocs for
16765 opd_entry_value. */
0e1862bb 16766 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
8860955f
AM
16767 {
16768 bfd_size_type amt;
16769 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
16770 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
16771 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
16772 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
16773 if (rel == NULL)
16774 return FALSE;
16775 memcpy (rel, relocs, amt);
16776 }
5bd4f169
AM
16777 return ret;
16778}
16779
754021d0
AM
16780/* Adjust the value of any local symbols in opd sections. */
16781
6e0b88f1 16782static int
754021d0
AM
16783ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
16784 const char *name ATTRIBUTE_UNUSED,
16785 Elf_Internal_Sym *elfsym,
16786 asection *input_sec,
16787 struct elf_link_hash_entry *h)
16788{
74f0fb50
AM
16789 struct _opd_sec_data *opd;
16790 long adjust;
754021d0
AM
16791 bfd_vma value;
16792
4025353c 16793 if (h != NULL)
6e0b88f1 16794 return 1;
4025353c 16795
74f0fb50
AM
16796 opd = get_opd_info (input_sec);
16797 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 16798 return 1;
754021d0
AM
16799
16800 value = elfsym->st_value - input_sec->output_offset;
0e1862bb 16801 if (!bfd_link_relocatable (info))
754021d0
AM
16802 value -= input_sec->output_section->vma;
16803
51aecdc5 16804 adjust = opd->adjust[OPD_NDX (value)];
4025353c 16805 if (adjust == -1)
6e0b88f1
AM
16806 return 2;
16807
16808 elfsym->st_value += adjust;
16809 return 1;
754021d0
AM
16810}
16811
5bd4f169
AM
16812/* Finish up dynamic symbol handling. We set the contents of various
16813 dynamic sections here. */
16814
b34976b6 16815static bfd_boolean
4ce794b7
AM
16816ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
16817 struct bfd_link_info *info,
16818 struct elf_link_hash_entry *h,
4aef7643 16819 Elf_Internal_Sym *sym)
5bd4f169 16820{
65f38f15 16821 struct ppc_link_hash_table *htab;
8387904d 16822 struct plt_entry *ent;
5bd4f169 16823
65f38f15 16824 htab = ppc_hash_table (info);
4dfe6ac6
NC
16825 if (htab == NULL)
16826 return FALSE;
5bd4f169 16827
49c09209
AM
16828 if (!htab->opd_abi && !h->def_regular)
16829 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
16830 if (ent->plt.offset != (bfd_vma) -1)
16831 {
16832 /* Mark the symbol as undefined, rather than as
16833 defined in glink. Leave the value if there were
16834 any relocations where pointer equality matters
16835 (this is a clue for the dynamic linker, to make
16836 function pointer comparisons work between an
16837 application and shared library), otherwise set it
16838 to zero. */
16839 sym->st_shndx = SHN_UNDEF;
16840 if (!h->pointer_equality_needed)
16841 sym->st_value = 0;
16842 else if (!h->ref_regular_nonweak)
16843 {
16844 /* This breaks function pointer comparisons, but
16845 that is better than breaking tests for a NULL
16846 function pointer. */
16847 sym->st_value = 0;
16848 }
16849 break;
16850 }
5bd4f169 16851
1bdd8fac
AM
16852 if (h->needs_copy
16853 && (h->root.type == bfd_link_hash_defined
16854 || h->root.type == bfd_link_hash_defweak)
16855 && (h->root.u.def.section == htab->elf.sdynbss
16856 || h->root.u.def.section == htab->elf.sdynrelro))
5bd4f169 16857 {
65f38f15 16858 /* This symbol needs a copy reloc. Set it up. */
49c09209 16859 Elf_Internal_Rela rela;
5474d94f 16860 asection *srel;
49c09209 16861 bfd_byte *loc;
5bd4f169 16862
1bdd8fac 16863 if (h->dynindx == -1)
65f38f15 16864 abort ();
5bd4f169
AM
16865
16866 rela.r_offset = (h->root.u.def.value
16867 + h->root.u.def.section->output_section->vma
16868 + h->root.u.def.section->output_offset);
16869 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
16870 rela.r_addend = 0;
afbf7e8e 16871 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
16872 srel = htab->elf.sreldynrelro;
16873 else
16874 srel = htab->elf.srelbss;
16875 loc = srel->contents;
16876 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 16877 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
16878 }
16879
b34976b6 16880 return TRUE;
5bd4f169
AM
16881}
16882
65f38f15
AM
16883/* Used to decide how to sort relocs in an optimal manner for the
16884 dynamic linker, before writing them out. */
16885
16886static enum elf_reloc_type_class
7e612e98
AM
16887ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
16888 const asection *rel_sec,
16889 const Elf_Internal_Rela *rela)
65f38f15 16890{
04c9666a 16891 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
16892 struct ppc_link_hash_table *htab = ppc_hash_table (info);
16893
33e44f2e 16894 if (rel_sec == htab->elf.irelplt)
7e612e98 16895 return reloc_class_ifunc;
a33d1f77 16896
4ce794b7 16897 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 16898 switch (r_type)
65f38f15
AM
16899 {
16900 case R_PPC64_RELATIVE:
16901 return reloc_class_relative;
16902 case R_PPC64_JMP_SLOT:
16903 return reloc_class_plt;
16904 case R_PPC64_COPY:
16905 return reloc_class_copy;
16906 default:
16907 return reloc_class_normal;
16908 }
16909}
16910
5bd4f169
AM
16911/* Finish up the dynamic sections. */
16912
b34976b6 16913static bfd_boolean
4ce794b7
AM
16914ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
16915 struct bfd_link_info *info)
5bd4f169 16916{
65f38f15
AM
16917 struct ppc_link_hash_table *htab;
16918 bfd *dynobj;
5bd4f169 16919 asection *sdyn;
5bd4f169 16920
65f38f15 16921 htab = ppc_hash_table (info);
4dfe6ac6
NC
16922 if (htab == NULL)
16923 return FALSE;
16924
65f38f15 16925 dynobj = htab->elf.dynobj;
3d4d4302 16926 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 16927
65f38f15 16928 if (htab->elf.dynamic_sections_created)
5bd4f169 16929 {
5bd4f169
AM
16930 Elf64_External_Dyn *dyncon, *dynconend;
16931
33e44f2e 16932 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 16933 abort ();
5bd4f169
AM
16934
16935 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 16936 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
16937 for (; dyncon < dynconend; dyncon++)
16938 {
16939 Elf_Internal_Dyn dyn;
19397422 16940 asection *s;
5bd4f169
AM
16941
16942 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
16943
16944 switch (dyn.d_tag)
16945 {
65f38f15
AM
16946 default:
16947 continue;
5bd4f169 16948
5d1634d7 16949 case DT_PPC64_GLINK:
4ce794b7 16950 s = htab->glink;
6348e046 16951 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
16952 /* We stupidly defined DT_PPC64_GLINK to be the start
16953 of glink rather than the first entry point, which is
16954 what ld.so needs, and now have a bigger stub to
16955 support automatic multiple TOCs. */
9e390558 16956 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
5d1634d7
AM
16957 break;
16958
19397422
AM
16959 case DT_PPC64_OPD:
16960 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
16961 if (s == NULL)
16962 continue;
16963 dyn.d_un.d_ptr = s->vma;
19397422
AM
16964 break;
16965
e8910a83 16966 case DT_PPC64_OPT:
5663e321
AM
16967 if ((htab->do_multi_toc && htab->multi_toc_needed)
16968 || htab->notoc_plt)
e8910a83 16969 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
f378ab09
AM
16970 if (htab->has_plt_localentry0)
16971 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
e8910a83
AM
16972 break;
16973
19397422
AM
16974 case DT_PPC64_OPDSZ:
16975 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
16976 if (s == NULL)
16977 continue;
eea6121a 16978 dyn.d_un.d_val = s->size;
19397422
AM
16979 break;
16980
65f38f15 16981 case DT_PLTGOT:
33e44f2e 16982 s = htab->elf.splt;
6348e046 16983 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
16984 break;
16985
16986 case DT_JMPREL:
33e44f2e 16987 s = htab->elf.srelplt;
6348e046 16988 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 16989 break;
5bd4f169 16990
65f38f15 16991 case DT_PLTRELSZ:
33e44f2e 16992 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7 16993 break;
82e66161
AM
16994
16995 case DT_TEXTREL:
16996 if (htab->local_ifunc_resolver)
16997 info->callbacks->einfo
16998 (_("%X%P: text relocations and GNU indirect "
16999 "functions will result in a segfault at runtime\n"));
17000 else if (htab->maybe_local_ifunc_resolver)
17001 info->callbacks->einfo
17002 (_("%P: warning: text relocations and GNU indirect "
17003 "functions may result in a segfault at runtime\n"));
17004 continue;
5bd4f169 17005 }
5bd4f169 17006
65f38f15 17007 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 17008 }
5bd4f169
AM
17009 }
17010
6528b6eb
AM
17011 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
17012 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17013 {
17014 /* Fill in the first entry in the global offset table.
17015 We use it to hold the link-time TOCbase. */
17016 bfd_put_64 (output_bfd,
60ee0d4a 17017 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 17018 htab->elf.sgot->contents);
5d1634d7
AM
17019
17020 /* Set .got entry size. */
2cdcc330
AM
17021 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
17022 = 8;
5d1634d7
AM
17023 }
17024
6528b6eb
AM
17025 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
17026 && htab->elf.splt->output_section != bfd_abs_section_ptr)
5d1634d7
AM
17027 {
17028 /* Set .plt entry size. */
33e44f2e 17029 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 17030 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
17031 }
17032
84f5d08e
AM
17033 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
17034 brlt ourselves if emitrelocations. */
17035 if (htab->brlt != NULL
17036 && htab->brlt->reloc_count != 0
17037 && !_bfd_elf_link_output_relocs (output_bfd,
17038 htab->brlt,
d4730f92 17039 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
17040 elf_section_data (htab->brlt)->relocs,
17041 NULL))
17042 return FALSE;
17043
176a0d42
AM
17044 if (htab->glink != NULL
17045 && htab->glink->reloc_count != 0
17046 && !_bfd_elf_link_output_relocs (output_bfd,
17047 htab->glink,
d4730f92 17048 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
17049 elf_section_data (htab->glink)->relocs,
17050 NULL))
17051 return FALSE;
17052
da44f4e5 17053
df136d64
AM
17054 if (htab->glink_eh_frame != NULL
17055 && htab->glink_eh_frame->size != 0
17056 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
17057 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
17058 htab->glink_eh_frame,
17059 htab->glink_eh_frame->contents))
17060 return FALSE;
58d180e8 17061
e717da7e 17062 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
17063 since we didn't add them to DYNOBJ. We know dynobj is the first
17064 bfd. */
c72f2fb2 17065 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
17066 {
17067 asection *s;
7b53ace3 17068
0c8d6e5c 17069 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
17070 continue;
17071
e717da7e
AM
17072 s = ppc64_elf_tdata (dynobj)->got;
17073 if (s != NULL
eea6121a 17074 && s->size != 0
e717da7e
AM
17075 && s->output_section != bfd_abs_section_ptr
17076 && !bfd_set_section_contents (output_bfd, s->output_section,
17077 s->contents, s->output_offset,
eea6121a 17078 s->size))
e717da7e
AM
17079 return FALSE;
17080 s = ppc64_elf_tdata (dynobj)->relgot;
17081 if (s != NULL
eea6121a 17082 && s->size != 0
e717da7e
AM
17083 && s->output_section != bfd_abs_section_ptr
17084 && !bfd_set_section_contents (output_bfd, s->output_section,
17085 s->contents, s->output_offset,
eea6121a 17086 s->size))
e717da7e
AM
17087 return FALSE;
17088 }
f6c52c13 17089
b34976b6 17090 return TRUE;
5bd4f169
AM
17091}
17092
5bd4f169 17093#include "elf64-target.h"
7b8e7dad
AM
17094
17095/* FreeBSD support */
17096
17097#undef TARGET_LITTLE_SYM
17098#undef TARGET_LITTLE_NAME
17099
17100#undef TARGET_BIG_SYM
6d00b590 17101#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
17102#undef TARGET_BIG_NAME
17103#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
17104
17105#undef ELF_OSABI
17106#define ELF_OSABI ELFOSABI_FREEBSD
17107
17108#undef elf64_bed
17109#define elf64_bed elf64_powerpc_fbsd_bed
17110
17111#include "elf64-target.h"
This page took 3.033294 seconds and 4 git commands to generate.