Remove struct complaints
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
219d1afa 2 Copyright (C) 1999-2018 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
805fc799 38static bfd_reloc_status_type ppc64_elf_ha_reloc
4ce794b7 39 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
40static bfd_reloc_status_type ppc64_elf_branch_reloc
41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 42static bfd_reloc_status_type ppc64_elf_brtaken_reloc
4ce794b7 43 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 44static bfd_reloc_status_type ppc64_elf_sectoff_reloc
4ce794b7 45 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 46static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
4ce794b7 47 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 48static bfd_reloc_status_type ppc64_elf_toc_reloc
4ce794b7 49 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 50static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
4ce794b7 51 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 52static bfd_reloc_status_type ppc64_elf_toc64_reloc
4ce794b7 53 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 54static bfd_reloc_status_type ppc64_elf_unhandled_reloc
4ce794b7 55 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016 56static bfd_vma opd_entry_value
aef36ac1 57 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
5bd4f169 58
6d00b590 59#define TARGET_LITTLE_SYM powerpc_elf64_le_vec
ad8e1ba5 60#define TARGET_LITTLE_NAME "elf64-powerpcle"
6d00b590 61#define TARGET_BIG_SYM powerpc_elf64_vec
ad8e1ba5
AM
62#define TARGET_BIG_NAME "elf64-powerpc"
63#define ELF_ARCH bfd_arch_powerpc
ae95ffa6 64#define ELF_TARGET_ID PPC64_ELF_DATA
ad8e1ba5
AM
65#define ELF_MACHINE_CODE EM_PPC64
66#define ELF_MAXPAGESIZE 0x10000
702d1671
AM
67#define ELF_COMMONPAGESIZE 0x1000
68#define ELF_RELROPAGESIZE ELF_MAXPAGESIZE
ad8e1ba5
AM
69#define elf_info_to_howto ppc64_elf_info_to_howto
70
71#define elf_backend_want_got_sym 0
72#define elf_backend_want_plt_sym 0
73#define elf_backend_plt_alignment 3
74#define elf_backend_plt_not_loaded 1
ad8e1ba5 75#define elf_backend_got_header_size 8
5474d94f 76#define elf_backend_want_dynrelro 1
ad8e1ba5
AM
77#define elf_backend_can_gc_sections 1
78#define elf_backend_can_refcount 1
79#define elf_backend_rela_normal 1
64f52338 80#define elf_backend_dtrel_excludes_plt 1
6bfdb61b 81#define elf_backend_default_execstack 0
ad8e1ba5 82
e717da7e 83#define bfd_elf64_mkobject ppc64_elf_mkobject
ad8e1ba5 84#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
aa374f67 85#define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
ee67d69a
AM
86#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
87#define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
ad8e1ba5
AM
88#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
89#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
90e3cdf2 90#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
aa374f67 91#define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
8c5b4e52 92#define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
ad8e1ba5
AM
93
94#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
95#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
96#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
183e98be 97#define elf_backend_write_core_note ppc64_elf_write_core_note
9d19e4fd 98#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
ad8e1ba5 99#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 100#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
f6c7c3e8 101#define elf_backend_check_directives ppc64_elf_before_check_relocs
e5034e59 102#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
8387904d 103#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5 104#define elf_backend_check_relocs ppc64_elf_check_relocs
c0e331c7 105#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
74f0fb50 106#define elf_backend_gc_keep ppc64_elf_gc_keep
64d03ab5 107#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
ad8e1ba5 108#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
ad8e1ba5
AM
109#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
110#define elf_backend_hide_symbol ppc64_elf_hide_symbol
9f296da3 111#define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
ad8e1ba5
AM
112#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
113#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
a345bc8d 114#define elf_backend_hash_symbol ppc64_elf_hash_symbol
74541ad4 115#define elf_backend_init_index_section _bfd_elf_init_2_index_sections
60124e18 116#define elf_backend_action_discarded ppc64_elf_action_discarded
ad8e1ba5
AM
117#define elf_backend_relocate_section ppc64_elf_relocate_section
118#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
119#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
120#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 121#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
29ef7005 122#define elf_backend_special_sections ppc64_elf_special_sections
6911b7dc 123#define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
8c5b4e52 124#define elf_backend_merge_symbol ppc64_elf_merge_symbol
bce964aa 125#define elf_backend_get_reloc_section bfd_get_section_by_name
ad8e1ba5 126
5bd4f169
AM
127/* The name of the dynamic interpreter. This is put in the .interp
128 section. */
129#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
130
131/* The size in bytes of an entry in the procedure linkage table. */
b9e5796b 132#define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
2d7ad24e 133#define LOCAL_PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 16 : 8)
5bd4f169
AM
134
135/* The initial size of the plt reserved for the dynamic linker. */
b9e5796b 136#define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
5bd4f169 137
a078d95a
AM
138/* Offsets to some stack save slots. */
139#define STK_LR 16
140#define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
eb8d7fda 141/* This one is dodgy. ELFv2 does not have a linker word, so use the
a078d95a
AM
142 CR save slot. Used only by optimised __tls_get_addr call stub,
143 relying on __tls_get_addr_opt not saving CR.. */
144#define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
145
5bd4f169 146/* TOC base pointers offset from start of TOC. */
411e1bfb 147#define TOC_BASE_OFF 0x8000
a27e685f
AM
148/* TOC base alignment. */
149#define TOC_BASE_ALIGN 256
411e1bfb
AM
150
151/* Offset of tp and dtp pointers from start of TLS block. */
152#define TP_OFFSET 0x7000
153#define DTP_OFFSET 0x8000
5bd4f169 154
ad8e1ba5
AM
155/* .plt call stub instructions. The normal stub is like this, but
156 sometimes the .plt entry crosses a 64k boundary and we need to
71a39c98 157 insert an addi to adjust r11. */
a078d95a 158#define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
71a39c98
AM
159#define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
160#define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
161#define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
162#define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
163#define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
5d1634d7
AM
164#define BCTR 0x4e800420 /* bctr */
165
07d6d2b8
AM
166#define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
167#define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
168#define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
169
170#define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
171#define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
172#define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
173#define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
174#define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
175#define BNECTR 0x4ca20420 /* bnectr+ */
176#define BNECTR_P4 0x4ce20420 /* bnectr+ */
794e51c0 177
71a39c98 178#define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
ac2df442 179#define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
07d6d2b8 180#define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
ac2df442 181
07d6d2b8
AM
182#define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
183#define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */
184#define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */
ad8e1ba5 185
07d6d2b8 186#define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */
006589cf
AM
187#define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */
188#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
a345bc8d 189#define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
07d6d2b8 190#define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
a345bc8d 191
9e390558
AM
192/* __glink_PLTresolve stub instructions. We enter with the index in R0. */
193#define GLINK_PLTRESOLVE_SIZE(htab) \
407aa07c 194 (8u + (htab->opd_abi ? 11 * 4 : 14 * 4))
ee4bf8d2
AM
195 /* 0: */
196 /* .quad plt0-1f */
197 /* __glink: */
198#define MFLR_R12 0x7d8802a6 /* mflr %12 */
199#define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
200 /* 1: */
201#define MFLR_R11 0x7d6802a6 /* mflr %11 */
71a39c98 202 /* ld %2,(0b-1b)(%11) */
ee4bf8d2 203#define MTLR_R12 0x7d8803a6 /* mtlr %12 */
71a39c98
AM
204#define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
205 /* ld %12,0(%11) */
206 /* ld %2,8(%11) */
207 /* mtctr %12 */
208 /* ld %11,16(%11) */
ee4bf8d2 209 /* bctr */
b9e5796b
AM
210#define MFLR_R0 0x7c0802a6 /* mflr %r0 */
211#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
212#define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
213#define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
214#define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
5d1634d7
AM
215
216/* Pad with this. */
217#define NOP 0x60000000
218
721956f4
AM
219/* Some other nops. */
220#define CROR_151515 0x4def7b82
221#define CROR_313131 0x4ffffb82
222
cedb70c5 223/* .glink entries for the first 32k functions are two instructions. */
5d1634d7
AM
224#define LI_R0_0 0x38000000 /* li %r0,0 */
225#define B_DOT 0x48000000 /* b . */
226
227/* After that, we need two instructions to load the index, followed by
228 a branch. */
229#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 230#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 231
deb0e272
AM
232/* Instructions used by the save and restore reg functions. */
233#define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
234#define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
235#define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
236#define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
82bd7b59
AM
237#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
238#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
deb0e272
AM
239#define LI_R12_0 0x39800000 /* li %r12,0 */
240#define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
241#define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
242#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
82bd7b59
AM
243#define BLR 0x4e800020 /* blr */
244
41bd81ab
AM
245/* Since .opd is an array of descriptors and each entry will end up
246 with identical R_PPC64_RELATIVE relocs, there is really no need to
247 propagate .opd relocs; The dynamic linker should be taught to
1e2f5b6e 248 relocate .opd without reloc entries. */
41bd81ab
AM
249#ifndef NO_OPD_RELOCS
250#define NO_OPD_RELOCS 0
251#endif
810d4e75 252
a4b6fadd
AM
253#ifndef ARRAY_SIZE
254#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
255#endif
256
810d4e75
AM
257static inline int
258abiversion (bfd *abfd)
259{
260 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
261}
262
263static inline void
264set_abiversion (bfd *abfd, int ver)
265{
266 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
267 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
268}
5bd4f169 269\f
f5e87a1d 270#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
b34976b6 271
5bd4f169 272/* Relocation HOWTO's. */
04c9666a 273static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
5bd4f169 274
f3185997
NC
275static reloc_howto_type ppc64_elf_howto_raw[] =
276{
5bd4f169
AM
277 /* This reloc does nothing. */
278 HOWTO (R_PPC64_NONE, /* type */
279 0, /* rightshift */
6346d5ca
AM
280 3, /* size (0 = byte, 1 = short, 2 = long) */
281 0, /* bitsize */
b34976b6 282 FALSE, /* pc_relative */
5bd4f169 283 0, /* bitpos */
f5e87a1d 284 complain_overflow_dont, /* complain_on_overflow */
5bd4f169
AM
285 bfd_elf_generic_reloc, /* special_function */
286 "R_PPC64_NONE", /* name */
b34976b6 287 FALSE, /* partial_inplace */
d006db6c 288 0, /* src_mask */
5bd4f169 289 0, /* dst_mask */
b34976b6 290 FALSE), /* pcrel_offset */
5bd4f169
AM
291
292 /* A standard 32 bit relocation. */
293 HOWTO (R_PPC64_ADDR32, /* type */
294 0, /* rightshift */
295 2, /* size (0 = byte, 1 = short, 2 = long) */
296 32, /* bitsize */
b34976b6 297 FALSE, /* pc_relative */
5bd4f169
AM
298 0, /* bitpos */
299 complain_overflow_bitfield, /* complain_on_overflow */
300 bfd_elf_generic_reloc, /* special_function */
301 "R_PPC64_ADDR32", /* name */
b34976b6 302 FALSE, /* partial_inplace */
5bd4f169
AM
303 0, /* src_mask */
304 0xffffffff, /* dst_mask */
b34976b6 305 FALSE), /* pcrel_offset */
5bd4f169
AM
306
307 /* An absolute 26 bit branch; the lower two bits must be zero.
308 FIXME: we don't check that, we just clear them. */
309 HOWTO (R_PPC64_ADDR24, /* type */
310 0, /* rightshift */
311 2, /* size (0 = byte, 1 = short, 2 = long) */
312 26, /* bitsize */
b34976b6 313 FALSE, /* pc_relative */
5bd4f169
AM
314 0, /* bitpos */
315 complain_overflow_bitfield, /* complain_on_overflow */
316 bfd_elf_generic_reloc, /* special_function */
317 "R_PPC64_ADDR24", /* name */
b34976b6 318 FALSE, /* partial_inplace */
d006db6c 319 0, /* src_mask */
f5e87a1d 320 0x03fffffc, /* dst_mask */
b34976b6 321 FALSE), /* pcrel_offset */
5bd4f169
AM
322
323 /* A standard 16 bit relocation. */
324 HOWTO (R_PPC64_ADDR16, /* type */
325 0, /* rightshift */
326 1, /* size (0 = byte, 1 = short, 2 = long) */
327 16, /* bitsize */
b34976b6 328 FALSE, /* pc_relative */
5bd4f169
AM
329 0, /* bitpos */
330 complain_overflow_bitfield, /* complain_on_overflow */
331 bfd_elf_generic_reloc, /* special_function */
332 "R_PPC64_ADDR16", /* name */
b34976b6 333 FALSE, /* partial_inplace */
5bd4f169
AM
334 0, /* src_mask */
335 0xffff, /* dst_mask */
b34976b6 336 FALSE), /* pcrel_offset */
5bd4f169
AM
337
338 /* A 16 bit relocation without overflow. */
339 HOWTO (R_PPC64_ADDR16_LO, /* type */
340 0, /* rightshift */
341 1, /* size (0 = byte, 1 = short, 2 = long) */
342 16, /* bitsize */
b34976b6 343 FALSE, /* pc_relative */
5bd4f169
AM
344 0, /* bitpos */
345 complain_overflow_dont,/* complain_on_overflow */
346 bfd_elf_generic_reloc, /* special_function */
347 "R_PPC64_ADDR16_LO", /* name */
b34976b6 348 FALSE, /* partial_inplace */
5bd4f169
AM
349 0, /* src_mask */
350 0xffff, /* dst_mask */
b34976b6 351 FALSE), /* pcrel_offset */
5bd4f169
AM
352
353 /* Bits 16-31 of an address. */
354 HOWTO (R_PPC64_ADDR16_HI, /* type */
355 16, /* rightshift */
356 1, /* size (0 = byte, 1 = short, 2 = long) */
357 16, /* bitsize */
b34976b6 358 FALSE, /* pc_relative */
5bd4f169 359 0, /* bitpos */
f9c6b907 360 complain_overflow_signed, /* complain_on_overflow */
5bd4f169
AM
361 bfd_elf_generic_reloc, /* special_function */
362 "R_PPC64_ADDR16_HI", /* name */
b34976b6 363 FALSE, /* partial_inplace */
5bd4f169
AM
364 0, /* src_mask */
365 0xffff, /* dst_mask */
b34976b6 366 FALSE), /* pcrel_offset */
5bd4f169
AM
367
368 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
369 bits, treated as a signed number, is negative. */
370 HOWTO (R_PPC64_ADDR16_HA, /* type */
371 16, /* rightshift */
372 1, /* size (0 = byte, 1 = short, 2 = long) */
373 16, /* bitsize */
b34976b6 374 FALSE, /* pc_relative */
5bd4f169 375 0, /* bitpos */
f9c6b907 376 complain_overflow_signed, /* complain_on_overflow */
805fc799 377 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 378 "R_PPC64_ADDR16_HA", /* name */
b34976b6 379 FALSE, /* partial_inplace */
5bd4f169
AM
380 0, /* src_mask */
381 0xffff, /* dst_mask */
b34976b6 382 FALSE), /* pcrel_offset */
5bd4f169
AM
383
384 /* An absolute 16 bit branch; the lower two bits must be zero.
385 FIXME: we don't check that, we just clear them. */
386 HOWTO (R_PPC64_ADDR14, /* type */
387 0, /* rightshift */
388 2, /* size (0 = byte, 1 = short, 2 = long) */
389 16, /* bitsize */
b34976b6 390 FALSE, /* pc_relative */
5bd4f169 391 0, /* bitpos */
b80eed39 392 complain_overflow_signed, /* complain_on_overflow */
2441e016 393 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 394 "R_PPC64_ADDR14", /* name */
b34976b6 395 FALSE, /* partial_inplace */
d006db6c 396 0, /* src_mask */
f5e87a1d 397 0x0000fffc, /* dst_mask */
b34976b6 398 FALSE), /* pcrel_offset */
5bd4f169
AM
399
400 /* An absolute 16 bit branch, for which bit 10 should be set to
401 indicate that the branch is expected to be taken. The lower two
402 bits must be zero. */
403 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
404 0, /* rightshift */
405 2, /* size (0 = byte, 1 = short, 2 = long) */
406 16, /* bitsize */
b34976b6 407 FALSE, /* pc_relative */
5bd4f169 408 0, /* bitpos */
b80eed39 409 complain_overflow_signed, /* complain_on_overflow */
805fc799 410 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 411 "R_PPC64_ADDR14_BRTAKEN",/* name */
b34976b6 412 FALSE, /* partial_inplace */
d006db6c 413 0, /* src_mask */
f5e87a1d 414 0x0000fffc, /* dst_mask */
b34976b6 415 FALSE), /* pcrel_offset */
5bd4f169
AM
416
417 /* An absolute 16 bit branch, for which bit 10 should be set to
418 indicate that the branch is not expected to be taken. The lower
419 two bits must be zero. */
420 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
421 0, /* rightshift */
422 2, /* size (0 = byte, 1 = short, 2 = long) */
423 16, /* bitsize */
b34976b6 424 FALSE, /* pc_relative */
5bd4f169 425 0, /* bitpos */
b80eed39 426 complain_overflow_signed, /* complain_on_overflow */
805fc799 427 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 428 "R_PPC64_ADDR14_BRNTAKEN",/* name */
b34976b6 429 FALSE, /* partial_inplace */
d006db6c 430 0, /* src_mask */
f5e87a1d 431 0x0000fffc, /* dst_mask */
b34976b6 432 FALSE), /* pcrel_offset */
5bd4f169
AM
433
434 /* A relative 26 bit branch; the lower two bits must be zero. */
435 HOWTO (R_PPC64_REL24, /* type */
436 0, /* rightshift */
437 2, /* size (0 = byte, 1 = short, 2 = long) */
438 26, /* bitsize */
b34976b6 439 TRUE, /* pc_relative */
5bd4f169
AM
440 0, /* bitpos */
441 complain_overflow_signed, /* complain_on_overflow */
2441e016 442 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 443 "R_PPC64_REL24", /* name */
b34976b6 444 FALSE, /* partial_inplace */
d006db6c 445 0, /* src_mask */
f5e87a1d 446 0x03fffffc, /* dst_mask */
b34976b6 447 TRUE), /* pcrel_offset */
5bd4f169
AM
448
449 /* A relative 16 bit branch; the lower two bits must be zero. */
450 HOWTO (R_PPC64_REL14, /* type */
451 0, /* rightshift */
452 2, /* size (0 = byte, 1 = short, 2 = long) */
453 16, /* bitsize */
b34976b6 454 TRUE, /* pc_relative */
5bd4f169
AM
455 0, /* bitpos */
456 complain_overflow_signed, /* complain_on_overflow */
2441e016 457 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 458 "R_PPC64_REL14", /* name */
b34976b6 459 FALSE, /* partial_inplace */
d006db6c 460 0, /* src_mask */
f5e87a1d 461 0x0000fffc, /* dst_mask */
b34976b6 462 TRUE), /* pcrel_offset */
5bd4f169
AM
463
464 /* A relative 16 bit branch. Bit 10 should be set to indicate that
465 the branch is expected to be taken. The lower two bits must be
466 zero. */
467 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
468 0, /* rightshift */
469 2, /* size (0 = byte, 1 = short, 2 = long) */
470 16, /* bitsize */
b34976b6 471 TRUE, /* pc_relative */
5bd4f169
AM
472 0, /* bitpos */
473 complain_overflow_signed, /* complain_on_overflow */
805fc799 474 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 475 "R_PPC64_REL14_BRTAKEN", /* name */
b34976b6 476 FALSE, /* partial_inplace */
d006db6c 477 0, /* src_mask */
f5e87a1d 478 0x0000fffc, /* dst_mask */
b34976b6 479 TRUE), /* pcrel_offset */
5bd4f169
AM
480
481 /* A relative 16 bit branch. Bit 10 should be set to indicate that
482 the branch is not expected to be taken. The lower two bits must
483 be zero. */
484 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
485 0, /* rightshift */
486 2, /* size (0 = byte, 1 = short, 2 = long) */
487 16, /* bitsize */
b34976b6 488 TRUE, /* pc_relative */
5bd4f169
AM
489 0, /* bitpos */
490 complain_overflow_signed, /* complain_on_overflow */
805fc799 491 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 492 "R_PPC64_REL14_BRNTAKEN",/* name */
b34976b6 493 FALSE, /* partial_inplace */
d006db6c 494 0, /* src_mask */
f5e87a1d 495 0x0000fffc, /* dst_mask */
b34976b6 496 TRUE), /* pcrel_offset */
5bd4f169
AM
497
498 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
499 symbol. */
500 HOWTO (R_PPC64_GOT16, /* type */
501 0, /* rightshift */
502 1, /* size (0 = byte, 1 = short, 2 = long) */
503 16, /* bitsize */
b34976b6 504 FALSE, /* pc_relative */
5bd4f169
AM
505 0, /* bitpos */
506 complain_overflow_signed, /* complain_on_overflow */
805fc799 507 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 508 "R_PPC64_GOT16", /* name */
b34976b6 509 FALSE, /* partial_inplace */
5bd4f169
AM
510 0, /* src_mask */
511 0xffff, /* dst_mask */
b34976b6 512 FALSE), /* pcrel_offset */
5bd4f169
AM
513
514 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
515 the symbol. */
516 HOWTO (R_PPC64_GOT16_LO, /* type */
517 0, /* rightshift */
518 1, /* size (0 = byte, 1 = short, 2 = long) */
519 16, /* bitsize */
b34976b6 520 FALSE, /* pc_relative */
5bd4f169
AM
521 0, /* bitpos */
522 complain_overflow_dont, /* complain_on_overflow */
805fc799 523 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 524 "R_PPC64_GOT16_LO", /* name */
b34976b6 525 FALSE, /* partial_inplace */
5bd4f169
AM
526 0, /* src_mask */
527 0xffff, /* dst_mask */
b34976b6 528 FALSE), /* pcrel_offset */
5bd4f169
AM
529
530 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
531 the symbol. */
532 HOWTO (R_PPC64_GOT16_HI, /* type */
533 16, /* rightshift */
534 1, /* size (0 = byte, 1 = short, 2 = long) */
535 16, /* bitsize */
b34976b6 536 FALSE, /* pc_relative */
5bd4f169 537 0, /* bitpos */
f9c6b907 538 complain_overflow_signed,/* complain_on_overflow */
805fc799 539 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 540 "R_PPC64_GOT16_HI", /* name */
b34976b6 541 FALSE, /* partial_inplace */
5bd4f169
AM
542 0, /* src_mask */
543 0xffff, /* dst_mask */
b34976b6 544 FALSE), /* pcrel_offset */
5bd4f169
AM
545
546 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
547 the symbol. */
548 HOWTO (R_PPC64_GOT16_HA, /* type */
549 16, /* rightshift */
550 1, /* size (0 = byte, 1 = short, 2 = long) */
551 16, /* bitsize */
b34976b6 552 FALSE, /* pc_relative */
5bd4f169 553 0, /* bitpos */
f9c6b907 554 complain_overflow_signed,/* complain_on_overflow */
805fc799 555 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 556 "R_PPC64_GOT16_HA", /* name */
b34976b6 557 FALSE, /* partial_inplace */
5bd4f169
AM
558 0, /* src_mask */
559 0xffff, /* dst_mask */
b34976b6 560 FALSE), /* pcrel_offset */
5bd4f169
AM
561
562 /* This is used only by the dynamic linker. The symbol should exist
563 both in the object being run and in some shared library. The
564 dynamic linker copies the data addressed by the symbol from the
565 shared library into the object, because the object being
566 run has to have the data at some particular address. */
567 HOWTO (R_PPC64_COPY, /* type */
568 0, /* rightshift */
f5e87a1d
AM
569 0, /* this one is variable size */
570 0, /* bitsize */
b34976b6 571 FALSE, /* pc_relative */
5bd4f169 572 0, /* bitpos */
f5e87a1d
AM
573 complain_overflow_dont, /* complain_on_overflow */
574 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 575 "R_PPC64_COPY", /* name */
b34976b6 576 FALSE, /* partial_inplace */
5bd4f169
AM
577 0, /* src_mask */
578 0, /* dst_mask */
b34976b6 579 FALSE), /* pcrel_offset */
5bd4f169
AM
580
581 /* Like R_PPC64_ADDR64, but used when setting global offset table
582 entries. */
583 HOWTO (R_PPC64_GLOB_DAT, /* type */
584 0, /* rightshift */
585 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
586 64, /* bitsize */
b34976b6 587 FALSE, /* pc_relative */
5bd4f169
AM
588 0, /* bitpos */
589 complain_overflow_dont, /* complain_on_overflow */
805fc799 590 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 591 "R_PPC64_GLOB_DAT", /* name */
b34976b6 592 FALSE, /* partial_inplace */
5bd4f169 593 0, /* src_mask */
f5e87a1d 594 ONES (64), /* dst_mask */
b34976b6 595 FALSE), /* pcrel_offset */
5bd4f169
AM
596
597 /* Created by the link editor. Marks a procedure linkage table
598 entry for a symbol. */
599 HOWTO (R_PPC64_JMP_SLOT, /* type */
600 0, /* rightshift */
601 0, /* size (0 = byte, 1 = short, 2 = long) */
602 0, /* bitsize */
b34976b6 603 FALSE, /* pc_relative */
5bd4f169
AM
604 0, /* bitpos */
605 complain_overflow_dont, /* complain_on_overflow */
805fc799 606 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 607 "R_PPC64_JMP_SLOT", /* name */
b34976b6 608 FALSE, /* partial_inplace */
5bd4f169
AM
609 0, /* src_mask */
610 0, /* dst_mask */
b34976b6 611 FALSE), /* pcrel_offset */
5bd4f169
AM
612
613 /* Used only by the dynamic linker. When the object is run, this
614 doubleword64 is set to the load address of the object, plus the
615 addend. */
616 HOWTO (R_PPC64_RELATIVE, /* type */
617 0, /* rightshift */
618 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
619 64, /* bitsize */
b34976b6 620 FALSE, /* pc_relative */
5bd4f169
AM
621 0, /* bitpos */
622 complain_overflow_dont, /* complain_on_overflow */
623 bfd_elf_generic_reloc, /* special_function */
624 "R_PPC64_RELATIVE", /* name */
b34976b6 625 FALSE, /* partial_inplace */
5bd4f169 626 0, /* src_mask */
f5e87a1d 627 ONES (64), /* dst_mask */
b34976b6 628 FALSE), /* pcrel_offset */
5bd4f169
AM
629
630 /* Like R_PPC64_ADDR32, but may be unaligned. */
631 HOWTO (R_PPC64_UADDR32, /* type */
632 0, /* rightshift */
633 2, /* size (0 = byte, 1 = short, 2 = long) */
634 32, /* bitsize */
b34976b6 635 FALSE, /* pc_relative */
5bd4f169
AM
636 0, /* bitpos */
637 complain_overflow_bitfield, /* complain_on_overflow */
638 bfd_elf_generic_reloc, /* special_function */
639 "R_PPC64_UADDR32", /* name */
b34976b6 640 FALSE, /* partial_inplace */
5bd4f169
AM
641 0, /* src_mask */
642 0xffffffff, /* dst_mask */
b34976b6 643 FALSE), /* pcrel_offset */
5bd4f169
AM
644
645 /* Like R_PPC64_ADDR16, but may be unaligned. */
646 HOWTO (R_PPC64_UADDR16, /* type */
647 0, /* rightshift */
648 1, /* size (0 = byte, 1 = short, 2 = long) */
649 16, /* bitsize */
b34976b6 650 FALSE, /* pc_relative */
5bd4f169
AM
651 0, /* bitpos */
652 complain_overflow_bitfield, /* complain_on_overflow */
653 bfd_elf_generic_reloc, /* special_function */
654 "R_PPC64_UADDR16", /* name */
b34976b6 655 FALSE, /* partial_inplace */
5bd4f169
AM
656 0, /* src_mask */
657 0xffff, /* dst_mask */
b34976b6 658 FALSE), /* pcrel_offset */
5bd4f169
AM
659
660 /* 32-bit PC relative. */
661 HOWTO (R_PPC64_REL32, /* type */
662 0, /* rightshift */
663 2, /* size (0 = byte, 1 = short, 2 = long) */
664 32, /* bitsize */
b34976b6 665 TRUE, /* pc_relative */
5bd4f169 666 0, /* bitpos */
5bd4f169
AM
667 complain_overflow_signed, /* complain_on_overflow */
668 bfd_elf_generic_reloc, /* special_function */
669 "R_PPC64_REL32", /* name */
b34976b6 670 FALSE, /* partial_inplace */
5bd4f169
AM
671 0, /* src_mask */
672 0xffffffff, /* dst_mask */
b34976b6 673 TRUE), /* pcrel_offset */
5bd4f169 674
10ed1bba 675 /* 32-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
676 HOWTO (R_PPC64_PLT32, /* type */
677 0, /* rightshift */
678 2, /* size (0 = byte, 1 = short, 2 = long) */
679 32, /* bitsize */
b34976b6 680 FALSE, /* pc_relative */
5bd4f169
AM
681 0, /* bitpos */
682 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 683 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 684 "R_PPC64_PLT32", /* name */
b34976b6 685 FALSE, /* partial_inplace */
5bd4f169 686 0, /* src_mask */
f5e87a1d 687 0xffffffff, /* dst_mask */
b34976b6 688 FALSE), /* pcrel_offset */
5bd4f169
AM
689
690 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
691 FIXME: R_PPC64_PLTREL32 not supported. */
692 HOWTO (R_PPC64_PLTREL32, /* type */
693 0, /* rightshift */
694 2, /* size (0 = byte, 1 = short, 2 = long) */
695 32, /* bitsize */
b34976b6 696 TRUE, /* pc_relative */
5bd4f169
AM
697 0, /* bitpos */
698 complain_overflow_signed, /* complain_on_overflow */
3ce51288 699 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 700 "R_PPC64_PLTREL32", /* name */
b34976b6 701 FALSE, /* partial_inplace */
5bd4f169 702 0, /* src_mask */
f5e87a1d 703 0xffffffff, /* dst_mask */
b34976b6 704 TRUE), /* pcrel_offset */
5bd4f169
AM
705
706 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
707 the symbol. */
708 HOWTO (R_PPC64_PLT16_LO, /* type */
709 0, /* rightshift */
710 1, /* size (0 = byte, 1 = short, 2 = long) */
711 16, /* bitsize */
b34976b6 712 FALSE, /* pc_relative */
5bd4f169
AM
713 0, /* bitpos */
714 complain_overflow_dont, /* complain_on_overflow */
805fc799 715 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 716 "R_PPC64_PLT16_LO", /* name */
b34976b6 717 FALSE, /* partial_inplace */
5bd4f169
AM
718 0, /* src_mask */
719 0xffff, /* dst_mask */
b34976b6 720 FALSE), /* pcrel_offset */
5bd4f169
AM
721
722 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
723 the symbol. */
724 HOWTO (R_PPC64_PLT16_HI, /* type */
725 16, /* rightshift */
726 1, /* size (0 = byte, 1 = short, 2 = long) */
727 16, /* bitsize */
b34976b6 728 FALSE, /* pc_relative */
5bd4f169 729 0, /* bitpos */
f9c6b907 730 complain_overflow_signed, /* complain_on_overflow */
805fc799 731 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 732 "R_PPC64_PLT16_HI", /* name */
b34976b6 733 FALSE, /* partial_inplace */
5bd4f169
AM
734 0, /* src_mask */
735 0xffff, /* dst_mask */
b34976b6 736 FALSE), /* pcrel_offset */
5bd4f169
AM
737
738 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
739 the symbol. */
740 HOWTO (R_PPC64_PLT16_HA, /* type */
741 16, /* rightshift */
742 1, /* size (0 = byte, 1 = short, 2 = long) */
743 16, /* bitsize */
b34976b6 744 FALSE, /* pc_relative */
5bd4f169 745 0, /* bitpos */
f9c6b907 746 complain_overflow_signed, /* complain_on_overflow */
805fc799 747 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 748 "R_PPC64_PLT16_HA", /* name */
b34976b6 749 FALSE, /* partial_inplace */
5bd4f169
AM
750 0, /* src_mask */
751 0xffff, /* dst_mask */
b34976b6 752 FALSE), /* pcrel_offset */
5bd4f169 753
c061c2d8 754 /* 16-bit section relative relocation. */
5bd4f169
AM
755 HOWTO (R_PPC64_SECTOFF, /* type */
756 0, /* rightshift */
c061c2d8
AM
757 1, /* size (0 = byte, 1 = short, 2 = long) */
758 16, /* bitsize */
b34976b6 759 FALSE, /* pc_relative */
5bd4f169 760 0, /* bitpos */
b80eed39 761 complain_overflow_signed, /* complain_on_overflow */
805fc799 762 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 763 "R_PPC64_SECTOFF", /* name */
b34976b6 764 FALSE, /* partial_inplace */
5bd4f169 765 0, /* src_mask */
c061c2d8 766 0xffff, /* dst_mask */
b34976b6 767 FALSE), /* pcrel_offset */
5bd4f169 768
c061c2d8 769 /* Like R_PPC64_SECTOFF, but no overflow warning. */
5bd4f169
AM
770 HOWTO (R_PPC64_SECTOFF_LO, /* type */
771 0, /* rightshift */
772 1, /* size (0 = byte, 1 = short, 2 = long) */
773 16, /* bitsize */
b34976b6 774 FALSE, /* pc_relative */
5bd4f169
AM
775 0, /* bitpos */
776 complain_overflow_dont, /* complain_on_overflow */
805fc799 777 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 778 "R_PPC64_SECTOFF_LO", /* name */
b34976b6 779 FALSE, /* partial_inplace */
5bd4f169
AM
780 0, /* src_mask */
781 0xffff, /* dst_mask */
b34976b6 782 FALSE), /* pcrel_offset */
5bd4f169
AM
783
784 /* 16-bit upper half section relative relocation. */
785 HOWTO (R_PPC64_SECTOFF_HI, /* type */
786 16, /* rightshift */
787 1, /* size (0 = byte, 1 = short, 2 = long) */
788 16, /* bitsize */
b34976b6 789 FALSE, /* pc_relative */
5bd4f169 790 0, /* bitpos */
f9c6b907 791 complain_overflow_signed, /* complain_on_overflow */
805fc799 792 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 793 "R_PPC64_SECTOFF_HI", /* name */
b34976b6 794 FALSE, /* partial_inplace */
5bd4f169
AM
795 0, /* src_mask */
796 0xffff, /* dst_mask */
b34976b6 797 FALSE), /* pcrel_offset */
5bd4f169
AM
798
799 /* 16-bit upper half adjusted section relative relocation. */
800 HOWTO (R_PPC64_SECTOFF_HA, /* type */
801 16, /* rightshift */
802 1, /* size (0 = byte, 1 = short, 2 = long) */
803 16, /* bitsize */
b34976b6 804 FALSE, /* pc_relative */
5bd4f169 805 0, /* bitpos */
f9c6b907 806 complain_overflow_signed, /* complain_on_overflow */
805fc799 807 ppc64_elf_sectoff_ha_reloc, /* special_function */
5bd4f169 808 "R_PPC64_SECTOFF_HA", /* name */
b34976b6 809 FALSE, /* partial_inplace */
5bd4f169
AM
810 0, /* src_mask */
811 0xffff, /* dst_mask */
b34976b6 812 FALSE), /* pcrel_offset */
5bd4f169 813
04c9666a
AM
814 /* Like R_PPC64_REL24 without touching the two least significant bits. */
815 HOWTO (R_PPC64_REL30, /* type */
5bd4f169
AM
816 2, /* rightshift */
817 2, /* size (0 = byte, 1 = short, 2 = long) */
818 30, /* bitsize */
b34976b6 819 TRUE, /* pc_relative */
5bd4f169
AM
820 0, /* bitpos */
821 complain_overflow_dont, /* complain_on_overflow */
822 bfd_elf_generic_reloc, /* special_function */
04c9666a 823 "R_PPC64_REL30", /* name */
b34976b6 824 FALSE, /* partial_inplace */
d006db6c 825 0, /* src_mask */
5bd4f169 826 0xfffffffc, /* dst_mask */
b34976b6 827 TRUE), /* pcrel_offset */
5bd4f169
AM
828
829 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
830
831 /* A standard 64-bit relocation. */
832 HOWTO (R_PPC64_ADDR64, /* type */
833 0, /* rightshift */
834 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
835 64, /* bitsize */
b34976b6 836 FALSE, /* pc_relative */
5bd4f169
AM
837 0, /* bitpos */
838 complain_overflow_dont, /* complain_on_overflow */
839 bfd_elf_generic_reloc, /* special_function */
840 "R_PPC64_ADDR64", /* name */
b34976b6 841 FALSE, /* partial_inplace */
5bd4f169 842 0, /* src_mask */
f5e87a1d 843 ONES (64), /* dst_mask */
b34976b6 844 FALSE), /* pcrel_offset */
5bd4f169
AM
845
846 /* The bits 32-47 of an address. */
847 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
848 32, /* rightshift */
849 1, /* size (0 = byte, 1 = short, 2 = long) */
850 16, /* bitsize */
b34976b6 851 FALSE, /* pc_relative */
5bd4f169
AM
852 0, /* bitpos */
853 complain_overflow_dont, /* complain_on_overflow */
854 bfd_elf_generic_reloc, /* special_function */
855 "R_PPC64_ADDR16_HIGHER", /* name */
b34976b6 856 FALSE, /* partial_inplace */
5bd4f169
AM
857 0, /* src_mask */
858 0xffff, /* dst_mask */
b34976b6 859 FALSE), /* pcrel_offset */
5bd4f169
AM
860
861 /* The bits 32-47 of an address, plus 1 if the contents of the low
862 16 bits, treated as a signed number, is negative. */
863 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
864 32, /* rightshift */
865 1, /* size (0 = byte, 1 = short, 2 = long) */
866 16, /* bitsize */
b34976b6 867 FALSE, /* pc_relative */
5bd4f169
AM
868 0, /* bitpos */
869 complain_overflow_dont, /* complain_on_overflow */
805fc799 870 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 871 "R_PPC64_ADDR16_HIGHERA", /* name */
b34976b6 872 FALSE, /* partial_inplace */
5bd4f169
AM
873 0, /* src_mask */
874 0xffff, /* dst_mask */
b34976b6 875 FALSE), /* pcrel_offset */
5bd4f169
AM
876
877 /* The bits 48-63 of an address. */
878 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
879 48, /* rightshift */
880 1, /* size (0 = byte, 1 = short, 2 = long) */
881 16, /* bitsize */
b34976b6 882 FALSE, /* pc_relative */
5bd4f169
AM
883 0, /* bitpos */
884 complain_overflow_dont, /* complain_on_overflow */
885 bfd_elf_generic_reloc, /* special_function */
886 "R_PPC64_ADDR16_HIGHEST", /* name */
b34976b6 887 FALSE, /* partial_inplace */
5bd4f169
AM
888 0, /* src_mask */
889 0xffff, /* dst_mask */
b34976b6 890 FALSE), /* pcrel_offset */
5bd4f169
AM
891
892 /* The bits 48-63 of an address, plus 1 if the contents of the low
893 16 bits, treated as a signed number, is negative. */
894 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
895 48, /* rightshift */
896 1, /* size (0 = byte, 1 = short, 2 = long) */
897 16, /* bitsize */
b34976b6 898 FALSE, /* pc_relative */
5bd4f169
AM
899 0, /* bitpos */
900 complain_overflow_dont, /* complain_on_overflow */
805fc799 901 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 902 "R_PPC64_ADDR16_HIGHESTA", /* name */
b34976b6 903 FALSE, /* partial_inplace */
5bd4f169
AM
904 0, /* src_mask */
905 0xffff, /* dst_mask */
b34976b6 906 FALSE), /* pcrel_offset */
5bd4f169
AM
907
908 /* Like ADDR64, but may be unaligned. */
909 HOWTO (R_PPC64_UADDR64, /* type */
910 0, /* rightshift */
911 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
912 64, /* bitsize */
b34976b6 913 FALSE, /* pc_relative */
5bd4f169
AM
914 0, /* bitpos */
915 complain_overflow_dont, /* complain_on_overflow */
916 bfd_elf_generic_reloc, /* special_function */
917 "R_PPC64_UADDR64", /* name */
b34976b6 918 FALSE, /* partial_inplace */
5bd4f169 919 0, /* src_mask */
f5e87a1d 920 ONES (64), /* dst_mask */
b34976b6 921 FALSE), /* pcrel_offset */
5bd4f169
AM
922
923 /* 64-bit relative relocation. */
924 HOWTO (R_PPC64_REL64, /* type */
925 0, /* rightshift */
926 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
927 64, /* bitsize */
b34976b6 928 TRUE, /* pc_relative */
5bd4f169
AM
929 0, /* bitpos */
930 complain_overflow_dont, /* complain_on_overflow */
931 bfd_elf_generic_reloc, /* special_function */
932 "R_PPC64_REL64", /* name */
b34976b6 933 FALSE, /* partial_inplace */
5bd4f169 934 0, /* src_mask */
f5e87a1d 935 ONES (64), /* dst_mask */
b34976b6 936 TRUE), /* pcrel_offset */
5bd4f169 937
cedb70c5 938 /* 64-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
939 HOWTO (R_PPC64_PLT64, /* type */
940 0, /* rightshift */
941 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
942 64, /* bitsize */
b34976b6 943 FALSE, /* pc_relative */
5bd4f169
AM
944 0, /* bitpos */
945 complain_overflow_dont, /* complain_on_overflow */
805fc799 946 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 947 "R_PPC64_PLT64", /* name */
b34976b6 948 FALSE, /* partial_inplace */
5bd4f169 949 0, /* src_mask */
f5e87a1d 950 ONES (64), /* dst_mask */
b34976b6 951 FALSE), /* pcrel_offset */
5bd4f169
AM
952
953 /* 64-bit PC relative relocation to the symbol's procedure linkage
954 table. */
955 /* FIXME: R_PPC64_PLTREL64 not supported. */
956 HOWTO (R_PPC64_PLTREL64, /* type */
957 0, /* rightshift */
958 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
959 64, /* bitsize */
b34976b6 960 TRUE, /* pc_relative */
5bd4f169
AM
961 0, /* bitpos */
962 complain_overflow_dont, /* complain_on_overflow */
805fc799 963 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 964 "R_PPC64_PLTREL64", /* name */
b34976b6 965 FALSE, /* partial_inplace */
5bd4f169 966 0, /* src_mask */
f5e87a1d 967 ONES (64), /* dst_mask */
b34976b6 968 TRUE), /* pcrel_offset */
5bd4f169
AM
969
970 /* 16 bit TOC-relative relocation. */
971
972 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
973 HOWTO (R_PPC64_TOC16, /* type */
974 0, /* rightshift */
975 1, /* size (0 = byte, 1 = short, 2 = long) */
976 16, /* bitsize */
b34976b6 977 FALSE, /* pc_relative */
5bd4f169
AM
978 0, /* bitpos */
979 complain_overflow_signed, /* complain_on_overflow */
805fc799 980 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 981 "R_PPC64_TOC16", /* name */
b34976b6 982 FALSE, /* partial_inplace */
5bd4f169
AM
983 0, /* src_mask */
984 0xffff, /* dst_mask */
b34976b6 985 FALSE), /* pcrel_offset */
5bd4f169
AM
986
987 /* 16 bit TOC-relative relocation without overflow. */
988
989 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
990 HOWTO (R_PPC64_TOC16_LO, /* type */
991 0, /* rightshift */
992 1, /* size (0 = byte, 1 = short, 2 = long) */
993 16, /* bitsize */
b34976b6 994 FALSE, /* pc_relative */
5bd4f169
AM
995 0, /* bitpos */
996 complain_overflow_dont, /* complain_on_overflow */
805fc799 997 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 998 "R_PPC64_TOC16_LO", /* name */
b34976b6 999 FALSE, /* partial_inplace */
5bd4f169
AM
1000 0, /* src_mask */
1001 0xffff, /* dst_mask */
b34976b6 1002 FALSE), /* pcrel_offset */
5bd4f169
AM
1003
1004 /* 16 bit TOC-relative relocation, high 16 bits. */
1005
1006 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
1007 HOWTO (R_PPC64_TOC16_HI, /* type */
1008 16, /* rightshift */
1009 1, /* size (0 = byte, 1 = short, 2 = long) */
1010 16, /* bitsize */
b34976b6 1011 FALSE, /* pc_relative */
5bd4f169 1012 0, /* bitpos */
f9c6b907 1013 complain_overflow_signed, /* complain_on_overflow */
805fc799 1014 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 1015 "R_PPC64_TOC16_HI", /* name */
b34976b6 1016 FALSE, /* partial_inplace */
5bd4f169
AM
1017 0, /* src_mask */
1018 0xffff, /* dst_mask */
b34976b6 1019 FALSE), /* pcrel_offset */
5bd4f169
AM
1020
1021 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
1022 contents of the low 16 bits, treated as a signed number, is
1023 negative. */
1024
1025 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
1026 HOWTO (R_PPC64_TOC16_HA, /* type */
1027 16, /* rightshift */
1028 1, /* size (0 = byte, 1 = short, 2 = long) */
1029 16, /* bitsize */
b34976b6 1030 FALSE, /* pc_relative */
5bd4f169 1031 0, /* bitpos */
f9c6b907 1032 complain_overflow_signed, /* complain_on_overflow */
805fc799 1033 ppc64_elf_toc_ha_reloc, /* special_function */
5bd4f169 1034 "R_PPC64_TOC16_HA", /* name */
b34976b6 1035 FALSE, /* partial_inplace */
5bd4f169
AM
1036 0, /* src_mask */
1037 0xffff, /* dst_mask */
b34976b6 1038 FALSE), /* pcrel_offset */
5bd4f169
AM
1039
1040 /* 64-bit relocation; insert value of TOC base (.TOC.). */
1041
1042 /* R_PPC64_TOC 51 doubleword64 .TOC. */
1043 HOWTO (R_PPC64_TOC, /* type */
1044 0, /* rightshift */
1045 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1046 64, /* bitsize */
b34976b6 1047 FALSE, /* pc_relative */
5bd4f169 1048 0, /* bitpos */
b80eed39 1049 complain_overflow_dont, /* complain_on_overflow */
805fc799 1050 ppc64_elf_toc64_reloc, /* special_function */
5bd4f169 1051 "R_PPC64_TOC", /* name */
b34976b6 1052 FALSE, /* partial_inplace */
5bd4f169 1053 0, /* src_mask */
f5e87a1d 1054 ONES (64), /* dst_mask */
b34976b6 1055 FALSE), /* pcrel_offset */
5bd4f169
AM
1056
1057 /* Like R_PPC64_GOT16, but also informs the link editor that the
1058 value to relocate may (!) refer to a PLT entry which the link
1059 editor (a) may replace with the symbol value. If the link editor
1060 is unable to fully resolve the symbol, it may (b) create a PLT
1061 entry and store the address to the new PLT entry in the GOT.
1062 This permits lazy resolution of function symbols at run time.
1063 The link editor may also skip all of this and just (c) emit a
1064 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1065 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1066 HOWTO (R_PPC64_PLTGOT16, /* type */
1067 0, /* rightshift */
1068 1, /* size (0 = byte, 1 = short, 2 = long) */
1069 16, /* bitsize */
b34976b6 1070 FALSE, /* pc_relative */
5bd4f169
AM
1071 0, /* bitpos */
1072 complain_overflow_signed, /* complain_on_overflow */
805fc799 1073 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb
AM
1074 "R_PPC64_PLTGOT16", /* name */
1075 FALSE, /* partial_inplace */
1076 0, /* src_mask */
1077 0xffff, /* dst_mask */
1078 FALSE), /* pcrel_offset */
1079
1080 /* Like R_PPC64_PLTGOT16, but without overflow. */
1081 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1082 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1083 0, /* rightshift */
1084 1, /* size (0 = byte, 1 = short, 2 = long) */
1085 16, /* bitsize */
1086 FALSE, /* pc_relative */
1087 0, /* bitpos */
1088 complain_overflow_dont, /* complain_on_overflow */
1089 ppc64_elf_unhandled_reloc, /* special_function */
1090 "R_PPC64_PLTGOT16_LO", /* name */
1091 FALSE, /* partial_inplace */
1092 0, /* src_mask */
1093 0xffff, /* dst_mask */
1094 FALSE), /* pcrel_offset */
1095
1096 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1097 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1098 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1099 16, /* rightshift */
1100 1, /* size (0 = byte, 1 = short, 2 = long) */
1101 16, /* bitsize */
1102 FALSE, /* pc_relative */
1103 0, /* bitpos */
f9c6b907 1104 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1105 ppc64_elf_unhandled_reloc, /* special_function */
1106 "R_PPC64_PLTGOT16_HI", /* name */
1107 FALSE, /* partial_inplace */
1108 0, /* src_mask */
1109 0xffff, /* dst_mask */
1110 FALSE), /* pcrel_offset */
1111
1112 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1113 1 if the contents of the low 16 bits, treated as a signed number,
1114 is negative. */
1115 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1116 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1117 16, /* rightshift */
1118 1, /* size (0 = byte, 1 = short, 2 = long) */
1119 16, /* bitsize */
1120 FALSE, /* pc_relative */
1121 0, /* bitpos */
f9c6b907 1122 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1123 ppc64_elf_unhandled_reloc, /* special_function */
1124 "R_PPC64_PLTGOT16_HA", /* name */
1125 FALSE, /* partial_inplace */
1126 0, /* src_mask */
1127 0xffff, /* dst_mask */
1128 FALSE), /* pcrel_offset */
1129
1130 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1131 HOWTO (R_PPC64_ADDR16_DS, /* type */
1132 0, /* rightshift */
1133 1, /* size (0 = byte, 1 = short, 2 = long) */
1134 16, /* bitsize */
1135 FALSE, /* pc_relative */
1136 0, /* bitpos */
b80eed39 1137 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1138 bfd_elf_generic_reloc, /* special_function */
1139 "R_PPC64_ADDR16_DS", /* name */
1140 FALSE, /* partial_inplace */
1141 0, /* src_mask */
1142 0xfffc, /* dst_mask */
1143 FALSE), /* pcrel_offset */
1144
1145 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1146 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1147 0, /* rightshift */
1148 1, /* size (0 = byte, 1 = short, 2 = long) */
1149 16, /* bitsize */
1150 FALSE, /* pc_relative */
1151 0, /* bitpos */
1152 complain_overflow_dont,/* complain_on_overflow */
1153 bfd_elf_generic_reloc, /* special_function */
1154 "R_PPC64_ADDR16_LO_DS",/* name */
1155 FALSE, /* partial_inplace */
1156 0, /* src_mask */
1157 0xfffc, /* dst_mask */
1158 FALSE), /* pcrel_offset */
1159
1160 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1161 HOWTO (R_PPC64_GOT16_DS, /* type */
1162 0, /* rightshift */
1163 1, /* size (0 = byte, 1 = short, 2 = long) */
1164 16, /* bitsize */
1165 FALSE, /* pc_relative */
1166 0, /* bitpos */
1167 complain_overflow_signed, /* complain_on_overflow */
1168 ppc64_elf_unhandled_reloc, /* special_function */
1169 "R_PPC64_GOT16_DS", /* name */
1170 FALSE, /* partial_inplace */
1171 0, /* src_mask */
1172 0xfffc, /* dst_mask */
1173 FALSE), /* pcrel_offset */
1174
1175 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1176 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1177 0, /* rightshift */
1178 1, /* size (0 = byte, 1 = short, 2 = long) */
1179 16, /* bitsize */
1180 FALSE, /* pc_relative */
1181 0, /* bitpos */
1182 complain_overflow_dont, /* complain_on_overflow */
1183 ppc64_elf_unhandled_reloc, /* special_function */
1184 "R_PPC64_GOT16_LO_DS", /* name */
1185 FALSE, /* partial_inplace */
1186 0, /* src_mask */
1187 0xfffc, /* dst_mask */
1188 FALSE), /* pcrel_offset */
1189
1190 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1191 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1192 0, /* rightshift */
1193 1, /* size (0 = byte, 1 = short, 2 = long) */
1194 16, /* bitsize */
1195 FALSE, /* pc_relative */
1196 0, /* bitpos */
1197 complain_overflow_dont, /* complain_on_overflow */
1198 ppc64_elf_unhandled_reloc, /* special_function */
1199 "R_PPC64_PLT16_LO_DS", /* name */
1200 FALSE, /* partial_inplace */
1201 0, /* src_mask */
1202 0xfffc, /* dst_mask */
1203 FALSE), /* pcrel_offset */
1204
1205 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1206 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1207 0, /* rightshift */
1208 1, /* size (0 = byte, 1 = short, 2 = long) */
1209 16, /* bitsize */
1210 FALSE, /* pc_relative */
1211 0, /* bitpos */
b80eed39 1212 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1213 ppc64_elf_sectoff_reloc, /* special_function */
1214 "R_PPC64_SECTOFF_DS", /* name */
1215 FALSE, /* partial_inplace */
1216 0, /* src_mask */
1217 0xfffc, /* dst_mask */
1218 FALSE), /* pcrel_offset */
1219
1220 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1221 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1222 0, /* rightshift */
1223 1, /* size (0 = byte, 1 = short, 2 = long) */
1224 16, /* bitsize */
1225 FALSE, /* pc_relative */
1226 0, /* bitpos */
1227 complain_overflow_dont, /* complain_on_overflow */
1228 ppc64_elf_sectoff_reloc, /* special_function */
1229 "R_PPC64_SECTOFF_LO_DS",/* name */
1230 FALSE, /* partial_inplace */
1231 0, /* src_mask */
1232 0xfffc, /* dst_mask */
1233 FALSE), /* pcrel_offset */
1234
1235 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1236 HOWTO (R_PPC64_TOC16_DS, /* type */
1237 0, /* rightshift */
1238 1, /* size (0 = byte, 1 = short, 2 = long) */
1239 16, /* bitsize */
1240 FALSE, /* pc_relative */
1241 0, /* bitpos */
1242 complain_overflow_signed, /* complain_on_overflow */
1243 ppc64_elf_toc_reloc, /* special_function */
1244 "R_PPC64_TOC16_DS", /* name */
1245 FALSE, /* partial_inplace */
1246 0, /* src_mask */
1247 0xfffc, /* dst_mask */
1248 FALSE), /* pcrel_offset */
1249
1250 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1251 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1252 0, /* rightshift */
1253 1, /* size (0 = byte, 1 = short, 2 = long) */
1254 16, /* bitsize */
1255 FALSE, /* pc_relative */
1256 0, /* bitpos */
1257 complain_overflow_dont, /* complain_on_overflow */
1258 ppc64_elf_toc_reloc, /* special_function */
1259 "R_PPC64_TOC16_LO_DS", /* name */
1260 FALSE, /* partial_inplace */
1261 0, /* src_mask */
1262 0xfffc, /* dst_mask */
1263 FALSE), /* pcrel_offset */
1264
1265 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1266 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
6bfdb61b 1267 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
411e1bfb
AM
1268 0, /* rightshift */
1269 1, /* size (0 = byte, 1 = short, 2 = long) */
1270 16, /* bitsize */
1271 FALSE, /* pc_relative */
1272 0, /* bitpos */
1273 complain_overflow_signed, /* complain_on_overflow */
1274 ppc64_elf_unhandled_reloc, /* special_function */
1275 "R_PPC64_PLTGOT16_DS", /* name */
1276 FALSE, /* partial_inplace */
1277 0, /* src_mask */
1278 0xfffc, /* dst_mask */
1279 FALSE), /* pcrel_offset */
1280
1281 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1282 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1283 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1284 0, /* rightshift */
1285 1, /* size (0 = byte, 1 = short, 2 = long) */
1286 16, /* bitsize */
1287 FALSE, /* pc_relative */
1288 0, /* bitpos */
1289 complain_overflow_dont, /* complain_on_overflow */
1290 ppc64_elf_unhandled_reloc, /* special_function */
1291 "R_PPC64_PLTGOT16_LO_DS",/* name */
1292 FALSE, /* partial_inplace */
1293 0, /* src_mask */
1294 0xfffc, /* dst_mask */
1295 FALSE), /* pcrel_offset */
1296
727fc41e 1297 /* Marker relocs for TLS. */
411e1bfb
AM
1298 HOWTO (R_PPC64_TLS,
1299 0, /* rightshift */
1300 2, /* size (0 = byte, 1 = short, 2 = long) */
1301 32, /* bitsize */
1302 FALSE, /* pc_relative */
1303 0, /* bitpos */
1304 complain_overflow_dont, /* complain_on_overflow */
1305 bfd_elf_generic_reloc, /* special_function */
1306 "R_PPC64_TLS", /* name */
1307 FALSE, /* partial_inplace */
1308 0, /* src_mask */
1309 0, /* dst_mask */
1310 FALSE), /* pcrel_offset */
1311
727fc41e
AM
1312 HOWTO (R_PPC64_TLSGD,
1313 0, /* rightshift */
1314 2, /* size (0 = byte, 1 = short, 2 = long) */
1315 32, /* bitsize */
1316 FALSE, /* pc_relative */
1317 0, /* bitpos */
1318 complain_overflow_dont, /* complain_on_overflow */
1319 bfd_elf_generic_reloc, /* special_function */
1320 "R_PPC64_TLSGD", /* name */
1321 FALSE, /* partial_inplace */
1322 0, /* src_mask */
1323 0, /* dst_mask */
1324 FALSE), /* pcrel_offset */
1325
1326 HOWTO (R_PPC64_TLSLD,
1327 0, /* rightshift */
1328 2, /* size (0 = byte, 1 = short, 2 = long) */
1329 32, /* bitsize */
1330 FALSE, /* pc_relative */
1331 0, /* bitpos */
1332 complain_overflow_dont, /* complain_on_overflow */
1333 bfd_elf_generic_reloc, /* special_function */
1334 "R_PPC64_TLSLD", /* name */
1335 FALSE, /* partial_inplace */
1336 0, /* src_mask */
1337 0, /* dst_mask */
1338 FALSE), /* pcrel_offset */
1339
23cedd1d
AM
1340 /* Marker reloc for optimizing r2 save in prologue rather than on
1341 each plt call stub. */
3b421ab3
AM
1342 HOWTO (R_PPC64_TOCSAVE,
1343 0, /* rightshift */
1344 2, /* size (0 = byte, 1 = short, 2 = long) */
1345 32, /* bitsize */
1346 FALSE, /* pc_relative */
1347 0, /* bitpos */
1348 complain_overflow_dont, /* complain_on_overflow */
1349 bfd_elf_generic_reloc, /* special_function */
1350 "R_PPC64_TOCSAVE", /* name */
1351 FALSE, /* partial_inplace */
1352 0, /* src_mask */
1353 0, /* dst_mask */
1354 FALSE), /* pcrel_offset */
1355
23cedd1d
AM
1356 /* Marker relocs on inline plt call instructions. */
1357 HOWTO (R_PPC64_PLTSEQ,
1358 0, /* rightshift */
1359 2, /* size (0 = byte, 1 = short, 2 = long) */
1360 32, /* bitsize */
1361 FALSE, /* pc_relative */
1362 0, /* bitpos */
1363 complain_overflow_dont, /* complain_on_overflow */
1364 bfd_elf_generic_reloc, /* special_function */
1365 "R_PPC64_PLTSEQ", /* name */
1366 FALSE, /* partial_inplace */
1367 0, /* src_mask */
1368 0, /* dst_mask */
1369 FALSE), /* pcrel_offset */
1370
1371 HOWTO (R_PPC64_PLTCALL,
1372 0, /* rightshift */
1373 2, /* size (0 = byte, 1 = short, 2 = long) */
1374 32, /* bitsize */
1375 FALSE, /* pc_relative */
1376 0, /* bitpos */
1377 complain_overflow_dont, /* complain_on_overflow */
1378 bfd_elf_generic_reloc, /* special_function */
1379 "R_PPC64_PLTCALL", /* name */
1380 FALSE, /* partial_inplace */
1381 0, /* src_mask */
1382 0, /* dst_mask */
1383 FALSE), /* pcrel_offset */
1384
411e1bfb
AM
1385 /* Computes the load module index of the load module that contains the
1386 definition of its TLS sym. */
1387 HOWTO (R_PPC64_DTPMOD64,
1388 0, /* rightshift */
1389 4, /* size (0 = byte, 1 = short, 2 = long) */
1390 64, /* bitsize */
1391 FALSE, /* pc_relative */
1392 0, /* bitpos */
1393 complain_overflow_dont, /* complain_on_overflow */
1394 ppc64_elf_unhandled_reloc, /* special_function */
1395 "R_PPC64_DTPMOD64", /* name */
1396 FALSE, /* partial_inplace */
1397 0, /* src_mask */
1398 ONES (64), /* dst_mask */
1399 FALSE), /* pcrel_offset */
1400
1401 /* Computes a dtv-relative displacement, the difference between the value
1402 of sym+add and the base address of the thread-local storage block that
1403 contains the definition of sym, minus 0x8000. */
1404 HOWTO (R_PPC64_DTPREL64,
1405 0, /* rightshift */
1406 4, /* size (0 = byte, 1 = short, 2 = long) */
1407 64, /* bitsize */
1408 FALSE, /* pc_relative */
1409 0, /* bitpos */
1410 complain_overflow_dont, /* complain_on_overflow */
1411 ppc64_elf_unhandled_reloc, /* special_function */
1412 "R_PPC64_DTPREL64", /* name */
1413 FALSE, /* partial_inplace */
1414 0, /* src_mask */
1415 ONES (64), /* dst_mask */
1416 FALSE), /* pcrel_offset */
1417
1418 /* A 16 bit dtprel reloc. */
1419 HOWTO (R_PPC64_DTPREL16,
1420 0, /* rightshift */
1421 1, /* size (0 = byte, 1 = short, 2 = long) */
1422 16, /* bitsize */
1423 FALSE, /* pc_relative */
1424 0, /* bitpos */
1425 complain_overflow_signed, /* complain_on_overflow */
1426 ppc64_elf_unhandled_reloc, /* special_function */
1427 "R_PPC64_DTPREL16", /* name */
1428 FALSE, /* partial_inplace */
1429 0, /* src_mask */
1430 0xffff, /* dst_mask */
1431 FALSE), /* pcrel_offset */
1432
1433 /* Like DTPREL16, but no overflow. */
1434 HOWTO (R_PPC64_DTPREL16_LO,
1435 0, /* rightshift */
1436 1, /* size (0 = byte, 1 = short, 2 = long) */
1437 16, /* bitsize */
1438 FALSE, /* pc_relative */
1439 0, /* bitpos */
1440 complain_overflow_dont, /* complain_on_overflow */
1441 ppc64_elf_unhandled_reloc, /* special_function */
1442 "R_PPC64_DTPREL16_LO", /* name */
1443 FALSE, /* partial_inplace */
1444 0, /* src_mask */
1445 0xffff, /* dst_mask */
1446 FALSE), /* pcrel_offset */
1447
1448 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1449 HOWTO (R_PPC64_DTPREL16_HI,
1450 16, /* rightshift */
1451 1, /* size (0 = byte, 1 = short, 2 = long) */
1452 16, /* bitsize */
1453 FALSE, /* pc_relative */
1454 0, /* bitpos */
f9c6b907 1455 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1456 ppc64_elf_unhandled_reloc, /* special_function */
1457 "R_PPC64_DTPREL16_HI", /* name */
1458 FALSE, /* partial_inplace */
1459 0, /* src_mask */
1460 0xffff, /* dst_mask */
1461 FALSE), /* pcrel_offset */
1462
1463 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1464 HOWTO (R_PPC64_DTPREL16_HA,
1465 16, /* rightshift */
1466 1, /* size (0 = byte, 1 = short, 2 = long) */
1467 16, /* bitsize */
1468 FALSE, /* pc_relative */
1469 0, /* bitpos */
f9c6b907 1470 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1471 ppc64_elf_unhandled_reloc, /* special_function */
1472 "R_PPC64_DTPREL16_HA", /* name */
1473 FALSE, /* partial_inplace */
1474 0, /* src_mask */
1475 0xffff, /* dst_mask */
1476 FALSE), /* pcrel_offset */
1477
1478 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1479 HOWTO (R_PPC64_DTPREL16_HIGHER,
1480 32, /* rightshift */
1481 1, /* size (0 = byte, 1 = short, 2 = long) */
1482 16, /* bitsize */
1483 FALSE, /* pc_relative */
1484 0, /* bitpos */
1485 complain_overflow_dont, /* complain_on_overflow */
1486 ppc64_elf_unhandled_reloc, /* special_function */
1487 "R_PPC64_DTPREL16_HIGHER", /* name */
1488 FALSE, /* partial_inplace */
1489 0, /* src_mask */
1490 0xffff, /* dst_mask */
1491 FALSE), /* pcrel_offset */
1492
1493 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1494 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1495 32, /* rightshift */
1496 1, /* size (0 = byte, 1 = short, 2 = long) */
1497 16, /* bitsize */
1498 FALSE, /* pc_relative */
1499 0, /* bitpos */
1500 complain_overflow_dont, /* complain_on_overflow */
1501 ppc64_elf_unhandled_reloc, /* special_function */
1502 "R_PPC64_DTPREL16_HIGHERA", /* name */
1503 FALSE, /* partial_inplace */
1504 0, /* src_mask */
1505 0xffff, /* dst_mask */
1506 FALSE), /* pcrel_offset */
1507
1508 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1509 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1510 48, /* rightshift */
1511 1, /* size (0 = byte, 1 = short, 2 = long) */
1512 16, /* bitsize */
1513 FALSE, /* pc_relative */
1514 0, /* bitpos */
1515 complain_overflow_dont, /* complain_on_overflow */
1516 ppc64_elf_unhandled_reloc, /* special_function */
1517 "R_PPC64_DTPREL16_HIGHEST", /* name */
1518 FALSE, /* partial_inplace */
1519 0, /* src_mask */
1520 0xffff, /* dst_mask */
1521 FALSE), /* pcrel_offset */
1522
1523 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1524 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1525 48, /* rightshift */
1526 1, /* size (0 = byte, 1 = short, 2 = long) */
1527 16, /* bitsize */
1528 FALSE, /* pc_relative */
1529 0, /* bitpos */
1530 complain_overflow_dont, /* complain_on_overflow */
1531 ppc64_elf_unhandled_reloc, /* special_function */
1532 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1533 FALSE, /* partial_inplace */
1534 0, /* src_mask */
1535 0xffff, /* dst_mask */
1536 FALSE), /* pcrel_offset */
1537
1538 /* Like DTPREL16, but for insns with a DS field. */
1539 HOWTO (R_PPC64_DTPREL16_DS,
1540 0, /* rightshift */
1541 1, /* size (0 = byte, 1 = short, 2 = long) */
1542 16, /* bitsize */
1543 FALSE, /* pc_relative */
1544 0, /* bitpos */
1545 complain_overflow_signed, /* complain_on_overflow */
1546 ppc64_elf_unhandled_reloc, /* special_function */
1547 "R_PPC64_DTPREL16_DS", /* name */
1548 FALSE, /* partial_inplace */
1549 0, /* src_mask */
1550 0xfffc, /* dst_mask */
1551 FALSE), /* pcrel_offset */
1552
1553 /* Like DTPREL16_DS, but no overflow. */
1554 HOWTO (R_PPC64_DTPREL16_LO_DS,
1555 0, /* rightshift */
1556 1, /* size (0 = byte, 1 = short, 2 = long) */
1557 16, /* bitsize */
1558 FALSE, /* pc_relative */
1559 0, /* bitpos */
1560 complain_overflow_dont, /* complain_on_overflow */
1561 ppc64_elf_unhandled_reloc, /* special_function */
1562 "R_PPC64_DTPREL16_LO_DS", /* name */
1563 FALSE, /* partial_inplace */
1564 0, /* src_mask */
1565 0xfffc, /* dst_mask */
1566 FALSE), /* pcrel_offset */
1567
1568 /* Computes a tp-relative displacement, the difference between the value of
1569 sym+add and the value of the thread pointer (r13). */
1570 HOWTO (R_PPC64_TPREL64,
1571 0, /* rightshift */
1572 4, /* size (0 = byte, 1 = short, 2 = long) */
1573 64, /* bitsize */
1574 FALSE, /* pc_relative */
1575 0, /* bitpos */
1576 complain_overflow_dont, /* complain_on_overflow */
1577 ppc64_elf_unhandled_reloc, /* special_function */
1578 "R_PPC64_TPREL64", /* name */
1579 FALSE, /* partial_inplace */
1580 0, /* src_mask */
1581 ONES (64), /* dst_mask */
1582 FALSE), /* pcrel_offset */
1583
1584 /* A 16 bit tprel reloc. */
1585 HOWTO (R_PPC64_TPREL16,
1586 0, /* rightshift */
1587 1, /* size (0 = byte, 1 = short, 2 = long) */
1588 16, /* bitsize */
1589 FALSE, /* pc_relative */
1590 0, /* bitpos */
1591 complain_overflow_signed, /* complain_on_overflow */
1592 ppc64_elf_unhandled_reloc, /* special_function */
1593 "R_PPC64_TPREL16", /* name */
1594 FALSE, /* partial_inplace */
1595 0, /* src_mask */
1596 0xffff, /* dst_mask */
1597 FALSE), /* pcrel_offset */
1598
1599 /* Like TPREL16, but no overflow. */
1600 HOWTO (R_PPC64_TPREL16_LO,
1601 0, /* rightshift */
1602 1, /* size (0 = byte, 1 = short, 2 = long) */
1603 16, /* bitsize */
1604 FALSE, /* pc_relative */
1605 0, /* bitpos */
1606 complain_overflow_dont, /* complain_on_overflow */
1607 ppc64_elf_unhandled_reloc, /* special_function */
1608 "R_PPC64_TPREL16_LO", /* name */
1609 FALSE, /* partial_inplace */
1610 0, /* src_mask */
1611 0xffff, /* dst_mask */
1612 FALSE), /* pcrel_offset */
1613
1614 /* Like TPREL16_LO, but next higher group of 16 bits. */
1615 HOWTO (R_PPC64_TPREL16_HI,
1616 16, /* rightshift */
1617 1, /* size (0 = byte, 1 = short, 2 = long) */
1618 16, /* bitsize */
1619 FALSE, /* pc_relative */
1620 0, /* bitpos */
f9c6b907 1621 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1622 ppc64_elf_unhandled_reloc, /* special_function */
1623 "R_PPC64_TPREL16_HI", /* name */
1624 FALSE, /* partial_inplace */
1625 0, /* src_mask */
1626 0xffff, /* dst_mask */
1627 FALSE), /* pcrel_offset */
1628
1629 /* Like TPREL16_HI, but adjust for low 16 bits. */
1630 HOWTO (R_PPC64_TPREL16_HA,
1631 16, /* rightshift */
1632 1, /* size (0 = byte, 1 = short, 2 = long) */
1633 16, /* bitsize */
1634 FALSE, /* pc_relative */
1635 0, /* bitpos */
f9c6b907 1636 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1637 ppc64_elf_unhandled_reloc, /* special_function */
1638 "R_PPC64_TPREL16_HA", /* name */
1639 FALSE, /* partial_inplace */
1640 0, /* src_mask */
1641 0xffff, /* dst_mask */
1642 FALSE), /* pcrel_offset */
1643
1644 /* Like TPREL16_HI, but next higher group of 16 bits. */
1645 HOWTO (R_PPC64_TPREL16_HIGHER,
1646 32, /* rightshift */
1647 1, /* size (0 = byte, 1 = short, 2 = long) */
1648 16, /* bitsize */
1649 FALSE, /* pc_relative */
1650 0, /* bitpos */
1651 complain_overflow_dont, /* complain_on_overflow */
1652 ppc64_elf_unhandled_reloc, /* special_function */
1653 "R_PPC64_TPREL16_HIGHER", /* name */
1654 FALSE, /* partial_inplace */
1655 0, /* src_mask */
1656 0xffff, /* dst_mask */
1657 FALSE), /* pcrel_offset */
1658
1659 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1660 HOWTO (R_PPC64_TPREL16_HIGHERA,
1661 32, /* rightshift */
1662 1, /* size (0 = byte, 1 = short, 2 = long) */
1663 16, /* bitsize */
1664 FALSE, /* pc_relative */
1665 0, /* bitpos */
1666 complain_overflow_dont, /* complain_on_overflow */
1667 ppc64_elf_unhandled_reloc, /* special_function */
1668 "R_PPC64_TPREL16_HIGHERA", /* name */
1669 FALSE, /* partial_inplace */
1670 0, /* src_mask */
1671 0xffff, /* dst_mask */
1672 FALSE), /* pcrel_offset */
1673
1674 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1675 HOWTO (R_PPC64_TPREL16_HIGHEST,
1676 48, /* rightshift */
1677 1, /* size (0 = byte, 1 = short, 2 = long) */
1678 16, /* bitsize */
1679 FALSE, /* pc_relative */
1680 0, /* bitpos */
1681 complain_overflow_dont, /* complain_on_overflow */
1682 ppc64_elf_unhandled_reloc, /* special_function */
1683 "R_PPC64_TPREL16_HIGHEST", /* name */
1684 FALSE, /* partial_inplace */
1685 0, /* src_mask */
1686 0xffff, /* dst_mask */
1687 FALSE), /* pcrel_offset */
1688
1689 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1690 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1691 48, /* rightshift */
1692 1, /* size (0 = byte, 1 = short, 2 = long) */
1693 16, /* bitsize */
1694 FALSE, /* pc_relative */
1695 0, /* bitpos */
1696 complain_overflow_dont, /* complain_on_overflow */
1697 ppc64_elf_unhandled_reloc, /* special_function */
1698 "R_PPC64_TPREL16_HIGHESTA", /* name */
1699 FALSE, /* partial_inplace */
1700 0, /* src_mask */
1701 0xffff, /* dst_mask */
1702 FALSE), /* pcrel_offset */
1703
1704 /* Like TPREL16, but for insns with a DS field. */
1705 HOWTO (R_PPC64_TPREL16_DS,
1706 0, /* rightshift */
1707 1, /* size (0 = byte, 1 = short, 2 = long) */
1708 16, /* bitsize */
1709 FALSE, /* pc_relative */
1710 0, /* bitpos */
1711 complain_overflow_signed, /* complain_on_overflow */
1712 ppc64_elf_unhandled_reloc, /* special_function */
1713 "R_PPC64_TPREL16_DS", /* name */
1714 FALSE, /* partial_inplace */
1715 0, /* src_mask */
1716 0xfffc, /* dst_mask */
1717 FALSE), /* pcrel_offset */
1718
1719 /* Like TPREL16_DS, but no overflow. */
1720 HOWTO (R_PPC64_TPREL16_LO_DS,
1721 0, /* rightshift */
1722 1, /* size (0 = byte, 1 = short, 2 = long) */
1723 16, /* bitsize */
1724 FALSE, /* pc_relative */
1725 0, /* bitpos */
1726 complain_overflow_dont, /* complain_on_overflow */
1727 ppc64_elf_unhandled_reloc, /* special_function */
1728 "R_PPC64_TPREL16_LO_DS", /* name */
1729 FALSE, /* partial_inplace */
1730 0, /* src_mask */
1731 0xfffc, /* dst_mask */
1732 FALSE), /* pcrel_offset */
1733
1734 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1735 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1736 to the first entry relative to the TOC base (r2). */
1737 HOWTO (R_PPC64_GOT_TLSGD16,
1738 0, /* rightshift */
1739 1, /* size (0 = byte, 1 = short, 2 = long) */
1740 16, /* bitsize */
1741 FALSE, /* pc_relative */
1742 0, /* bitpos */
1743 complain_overflow_signed, /* complain_on_overflow */
1744 ppc64_elf_unhandled_reloc, /* special_function */
1745 "R_PPC64_GOT_TLSGD16", /* name */
b34976b6 1746 FALSE, /* partial_inplace */
5bd4f169
AM
1747 0, /* src_mask */
1748 0xffff, /* dst_mask */
b34976b6 1749 FALSE), /* pcrel_offset */
5bd4f169 1750
411e1bfb
AM
1751 /* Like GOT_TLSGD16, but no overflow. */
1752 HOWTO (R_PPC64_GOT_TLSGD16_LO,
5bd4f169
AM
1753 0, /* rightshift */
1754 1, /* size (0 = byte, 1 = short, 2 = long) */
1755 16, /* bitsize */
b34976b6 1756 FALSE, /* pc_relative */
5bd4f169
AM
1757 0, /* bitpos */
1758 complain_overflow_dont, /* complain_on_overflow */
805fc799 1759 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1760 "R_PPC64_GOT_TLSGD16_LO", /* name */
b34976b6 1761 FALSE, /* partial_inplace */
5bd4f169
AM
1762 0, /* src_mask */
1763 0xffff, /* dst_mask */
b34976b6 1764 FALSE), /* pcrel_offset */
5bd4f169 1765
411e1bfb
AM
1766 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1767 HOWTO (R_PPC64_GOT_TLSGD16_HI,
5bd4f169
AM
1768 16, /* rightshift */
1769 1, /* size (0 = byte, 1 = short, 2 = long) */
1770 16, /* bitsize */
b34976b6 1771 FALSE, /* pc_relative */
5bd4f169 1772 0, /* bitpos */
f9c6b907 1773 complain_overflow_signed, /* complain_on_overflow */
805fc799 1774 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1775 "R_PPC64_GOT_TLSGD16_HI", /* name */
b34976b6 1776 FALSE, /* partial_inplace */
5bd4f169
AM
1777 0, /* src_mask */
1778 0xffff, /* dst_mask */
b34976b6 1779 FALSE), /* pcrel_offset */
5bd4f169 1780
411e1bfb
AM
1781 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1782 HOWTO (R_PPC64_GOT_TLSGD16_HA,
5bd4f169
AM
1783 16, /* rightshift */
1784 1, /* size (0 = byte, 1 = short, 2 = long) */
1785 16, /* bitsize */
b34976b6 1786 FALSE, /* pc_relative */
5bd4f169 1787 0, /* bitpos */
f9c6b907 1788 complain_overflow_signed, /* complain_on_overflow */
805fc799 1789 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1790 "R_PPC64_GOT_TLSGD16_HA", /* name */
b34976b6 1791 FALSE, /* partial_inplace */
5bd4f169
AM
1792 0, /* src_mask */
1793 0xffff, /* dst_mask */
b34976b6 1794 FALSE), /* pcrel_offset */
5bd4f169 1795
411e1bfb
AM
1796 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1797 with values (sym+add)@dtpmod and zero, and computes the offset to the
1798 first entry relative to the TOC base (r2). */
1799 HOWTO (R_PPC64_GOT_TLSLD16,
5bd4f169
AM
1800 0, /* rightshift */
1801 1, /* size (0 = byte, 1 = short, 2 = long) */
1802 16, /* bitsize */
b34976b6 1803 FALSE, /* pc_relative */
5bd4f169 1804 0, /* bitpos */
411e1bfb
AM
1805 complain_overflow_signed, /* complain_on_overflow */
1806 ppc64_elf_unhandled_reloc, /* special_function */
1807 "R_PPC64_GOT_TLSLD16", /* name */
b34976b6 1808 FALSE, /* partial_inplace */
d006db6c 1809 0, /* src_mask */
411e1bfb 1810 0xffff, /* dst_mask */
b34976b6 1811 FALSE), /* pcrel_offset */
5bd4f169 1812
411e1bfb
AM
1813 /* Like GOT_TLSLD16, but no overflow. */
1814 HOWTO (R_PPC64_GOT_TLSLD16_LO,
5bd4f169
AM
1815 0, /* rightshift */
1816 1, /* size (0 = byte, 1 = short, 2 = long) */
1817 16, /* bitsize */
b34976b6 1818 FALSE, /* pc_relative */
5bd4f169 1819 0, /* bitpos */
411e1bfb
AM
1820 complain_overflow_dont, /* complain_on_overflow */
1821 ppc64_elf_unhandled_reloc, /* special_function */
1822 "R_PPC64_GOT_TLSLD16_LO", /* name */
b34976b6 1823 FALSE, /* partial_inplace */
d006db6c 1824 0, /* src_mask */
411e1bfb 1825 0xffff, /* dst_mask */
b34976b6 1826 FALSE), /* pcrel_offset */
5bd4f169 1827
411e1bfb
AM
1828 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1829 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1830 16, /* rightshift */
5bd4f169
AM
1831 1, /* size (0 = byte, 1 = short, 2 = long) */
1832 16, /* bitsize */
b34976b6 1833 FALSE, /* pc_relative */
5bd4f169 1834 0, /* bitpos */
f9c6b907 1835 complain_overflow_signed, /* complain_on_overflow */
805fc799 1836 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1837 "R_PPC64_GOT_TLSLD16_HI", /* name */
b34976b6 1838 FALSE, /* partial_inplace */
d006db6c 1839 0, /* src_mask */
411e1bfb 1840 0xffff, /* dst_mask */
b34976b6 1841 FALSE), /* pcrel_offset */
5bd4f169 1842
411e1bfb
AM
1843 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1844 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1845 16, /* rightshift */
5bd4f169
AM
1846 1, /* size (0 = byte, 1 = short, 2 = long) */
1847 16, /* bitsize */
b34976b6 1848 FALSE, /* pc_relative */
5bd4f169 1849 0, /* bitpos */
f9c6b907 1850 complain_overflow_signed, /* complain_on_overflow */
805fc799 1851 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1852 "R_PPC64_GOT_TLSLD16_HA", /* name */
b34976b6 1853 FALSE, /* partial_inplace */
d006db6c 1854 0, /* src_mask */
411e1bfb 1855 0xffff, /* dst_mask */
b34976b6 1856 FALSE), /* pcrel_offset */
5bd4f169 1857
411e1bfb
AM
1858 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1859 the offset to the entry relative to the TOC base (r2). */
1860 HOWTO (R_PPC64_GOT_DTPREL16_DS,
5bd4f169
AM
1861 0, /* rightshift */
1862 1, /* size (0 = byte, 1 = short, 2 = long) */
1863 16, /* bitsize */
b34976b6 1864 FALSE, /* pc_relative */
5bd4f169 1865 0, /* bitpos */
411e1bfb 1866 complain_overflow_signed, /* complain_on_overflow */
805fc799 1867 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1868 "R_PPC64_GOT_DTPREL16_DS", /* name */
b34976b6 1869 FALSE, /* partial_inplace */
d006db6c 1870 0, /* src_mask */
5bd4f169 1871 0xfffc, /* dst_mask */
b34976b6 1872 FALSE), /* pcrel_offset */
5bd4f169 1873
411e1bfb
AM
1874 /* Like GOT_DTPREL16_DS, but no overflow. */
1875 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
5bd4f169 1876 0, /* rightshift */
c061c2d8
AM
1877 1, /* size (0 = byte, 1 = short, 2 = long) */
1878 16, /* bitsize */
b34976b6 1879 FALSE, /* pc_relative */
5bd4f169 1880 0, /* bitpos */
411e1bfb
AM
1881 complain_overflow_dont, /* complain_on_overflow */
1882 ppc64_elf_unhandled_reloc, /* special_function */
1883 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
b34976b6 1884 FALSE, /* partial_inplace */
d006db6c 1885 0, /* src_mask */
c061c2d8 1886 0xfffc, /* dst_mask */
b34976b6 1887 FALSE), /* pcrel_offset */
5bd4f169 1888
411e1bfb
AM
1889 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1890 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1891 16, /* rightshift */
5bd4f169
AM
1892 1, /* size (0 = byte, 1 = short, 2 = long) */
1893 16, /* bitsize */
b34976b6 1894 FALSE, /* pc_relative */
5bd4f169 1895 0, /* bitpos */
f9c6b907 1896 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1897 ppc64_elf_unhandled_reloc, /* special_function */
1898 "R_PPC64_GOT_DTPREL16_HI", /* name */
b34976b6 1899 FALSE, /* partial_inplace */
d006db6c 1900 0, /* src_mask */
411e1bfb 1901 0xffff, /* dst_mask */
b34976b6 1902 FALSE), /* pcrel_offset */
5bd4f169 1903
411e1bfb
AM
1904 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1905 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1906 16, /* rightshift */
1907 1, /* size (0 = byte, 1 = short, 2 = long) */
1908 16, /* bitsize */
1909 FALSE, /* pc_relative */
1910 0, /* bitpos */
f9c6b907 1911 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1912 ppc64_elf_unhandled_reloc, /* special_function */
1913 "R_PPC64_GOT_DTPREL16_HA", /* name */
1914 FALSE, /* partial_inplace */
1915 0, /* src_mask */
1916 0xffff, /* dst_mask */
1917 FALSE), /* pcrel_offset */
1918
1919 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1920 offset to the entry relative to the TOC base (r2). */
1921 HOWTO (R_PPC64_GOT_TPREL16_DS,
5bd4f169
AM
1922 0, /* rightshift */
1923 1, /* size (0 = byte, 1 = short, 2 = long) */
1924 16, /* bitsize */
b34976b6 1925 FALSE, /* pc_relative */
5bd4f169
AM
1926 0, /* bitpos */
1927 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1928 ppc64_elf_unhandled_reloc, /* special_function */
1929 "R_PPC64_GOT_TPREL16_DS", /* name */
b34976b6 1930 FALSE, /* partial_inplace */
d006db6c 1931 0, /* src_mask */
ad8e1ba5 1932 0xfffc, /* dst_mask */
b34976b6 1933 FALSE), /* pcrel_offset */
5bd4f169 1934
411e1bfb
AM
1935 /* Like GOT_TPREL16_DS, but no overflow. */
1936 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
5bd4f169
AM
1937 0, /* rightshift */
1938 1, /* size (0 = byte, 1 = short, 2 = long) */
1939 16, /* bitsize */
b34976b6 1940 FALSE, /* pc_relative */
5bd4f169
AM
1941 0, /* bitpos */
1942 complain_overflow_dont, /* complain_on_overflow */
411e1bfb
AM
1943 ppc64_elf_unhandled_reloc, /* special_function */
1944 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
b34976b6 1945 FALSE, /* partial_inplace */
d006db6c 1946 0, /* src_mask */
ad8e1ba5 1947 0xfffc, /* dst_mask */
b34976b6 1948 FALSE), /* pcrel_offset */
5bd4f169 1949
411e1bfb
AM
1950 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1951 HOWTO (R_PPC64_GOT_TPREL16_HI,
1952 16, /* rightshift */
5bd4f169
AM
1953 1, /* size (0 = byte, 1 = short, 2 = long) */
1954 16, /* bitsize */
b34976b6 1955 FALSE, /* pc_relative */
5bd4f169 1956 0, /* bitpos */
f9c6b907 1957 complain_overflow_signed, /* complain_on_overflow */
805fc799 1958 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1959 "R_PPC64_GOT_TPREL16_HI", /* name */
b34976b6 1960 FALSE, /* partial_inplace */
d006db6c 1961 0, /* src_mask */
411e1bfb 1962 0xffff, /* dst_mask */
b34976b6 1963 FALSE), /* pcrel_offset */
5bd4f169 1964
411e1bfb
AM
1965 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1966 HOWTO (R_PPC64_GOT_TPREL16_HA,
1967 16, /* rightshift */
5bd4f169
AM
1968 1, /* size (0 = byte, 1 = short, 2 = long) */
1969 16, /* bitsize */
b34976b6 1970 FALSE, /* pc_relative */
5bd4f169 1971 0, /* bitpos */
f9c6b907 1972 complain_overflow_signed, /* complain_on_overflow */
805fc799 1973 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1974 "R_PPC64_GOT_TPREL16_HA", /* name */
b34976b6 1975 FALSE, /* partial_inplace */
d006db6c 1976 0, /* src_mask */
411e1bfb 1977 0xffff, /* dst_mask */
b34976b6 1978 FALSE), /* pcrel_offset */
5bd4f169 1979
25f23106
AM
1980 HOWTO (R_PPC64_JMP_IREL, /* type */
1981 0, /* rightshift */
1982 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1983 0, /* bitsize */
1984 FALSE, /* pc_relative */
1985 0, /* bitpos */
1986 complain_overflow_dont, /* complain_on_overflow */
1987 ppc64_elf_unhandled_reloc, /* special_function */
1988 "R_PPC64_JMP_IREL", /* name */
1989 FALSE, /* partial_inplace */
1990 0, /* src_mask */
1991 0, /* dst_mask */
1992 FALSE), /* pcrel_offset */
1993
e054468f
AM
1994 HOWTO (R_PPC64_IRELATIVE, /* type */
1995 0, /* rightshift */
1996 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1997 64, /* bitsize */
1998 FALSE, /* pc_relative */
1999 0, /* bitpos */
2000 complain_overflow_dont, /* complain_on_overflow */
2001 bfd_elf_generic_reloc, /* special_function */
2002 "R_PPC64_IRELATIVE", /* name */
2003 FALSE, /* partial_inplace */
2004 0, /* src_mask */
2005 ONES (64), /* dst_mask */
2006 FALSE), /* pcrel_offset */
2007
25f23106
AM
2008 /* A 16 bit relative relocation. */
2009 HOWTO (R_PPC64_REL16, /* type */
2010 0, /* rightshift */
2011 1, /* size (0 = byte, 1 = short, 2 = long) */
2012 16, /* bitsize */
2013 TRUE, /* pc_relative */
2014 0, /* bitpos */
b80eed39 2015 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
2016 bfd_elf_generic_reloc, /* special_function */
2017 "R_PPC64_REL16", /* name */
2018 FALSE, /* partial_inplace */
2019 0, /* src_mask */
2020 0xffff, /* dst_mask */
2021 TRUE), /* pcrel_offset */
2022
2023 /* A 16 bit relative relocation without overflow. */
2024 HOWTO (R_PPC64_REL16_LO, /* type */
2025 0, /* rightshift */
2026 1, /* size (0 = byte, 1 = short, 2 = long) */
2027 16, /* bitsize */
2028 TRUE, /* pc_relative */
2029 0, /* bitpos */
2030 complain_overflow_dont,/* complain_on_overflow */
2031 bfd_elf_generic_reloc, /* special_function */
2032 "R_PPC64_REL16_LO", /* name */
2033 FALSE, /* partial_inplace */
2034 0, /* src_mask */
2035 0xffff, /* dst_mask */
2036 TRUE), /* pcrel_offset */
2037
2038 /* The high order 16 bits of a relative address. */
2039 HOWTO (R_PPC64_REL16_HI, /* type */
2040 16, /* rightshift */
2041 1, /* size (0 = byte, 1 = short, 2 = long) */
2042 16, /* bitsize */
2043 TRUE, /* pc_relative */
2044 0, /* bitpos */
f9c6b907 2045 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
2046 bfd_elf_generic_reloc, /* special_function */
2047 "R_PPC64_REL16_HI", /* name */
2048 FALSE, /* partial_inplace */
2049 0, /* src_mask */
2050 0xffff, /* dst_mask */
2051 TRUE), /* pcrel_offset */
2052
2053 /* The high order 16 bits of a relative address, plus 1 if the contents of
2054 the low 16 bits, treated as a signed number, is negative. */
2055 HOWTO (R_PPC64_REL16_HA, /* type */
2056 16, /* rightshift */
2057 1, /* size (0 = byte, 1 = short, 2 = long) */
2058 16, /* bitsize */
2059 TRUE, /* pc_relative */
2060 0, /* bitpos */
f9c6b907 2061 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
2062 ppc64_elf_ha_reloc, /* special_function */
2063 "R_PPC64_REL16_HA", /* name */
2064 FALSE, /* partial_inplace */
2065 0, /* src_mask */
2066 0xffff, /* dst_mask */
2067 TRUE), /* pcrel_offset */
2068
a680de9a
PB
2069 /* Like R_PPC64_REL16_HA but for split field in addpcis. */
2070 HOWTO (R_PPC64_REL16DX_HA, /* type */
2071 16, /* rightshift */
2072 2, /* size (0 = byte, 1 = short, 2 = long) */
2073 16, /* bitsize */
2074 TRUE, /* pc_relative */
2075 0, /* bitpos */
2076 complain_overflow_signed, /* complain_on_overflow */
2077 ppc64_elf_ha_reloc, /* special_function */
2078 "R_PPC64_REL16DX_HA", /* name */
2079 FALSE, /* partial_inplace */
2080 0, /* src_mask */
2081 0x1fffc1, /* dst_mask */
2082 TRUE), /* pcrel_offset */
2083
7ba71655
AM
2084 /* A split-field reloc for addpcis, non-relative (gas internal use only). */
2085 HOWTO (R_PPC64_16DX_HA, /* type */
2086 16, /* rightshift */
2087 2, /* size (0 = byte, 1 = short, 2 = long) */
2088 16, /* bitsize */
2089 FALSE, /* pc_relative */
2090 0, /* bitpos */
2091 complain_overflow_signed, /* complain_on_overflow */
2092 ppc64_elf_ha_reloc, /* special_function */
2093 "R_PPC64_16DX_HA", /* name */
2094 FALSE, /* partial_inplace */
2095 0, /* src_mask */
2096 0x1fffc1, /* dst_mask */
2097 FALSE), /* pcrel_offset */
2098
f9c6b907
AM
2099 /* Like R_PPC64_ADDR16_HI, but no overflow. */
2100 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
2101 16, /* rightshift */
2102 1, /* size (0 = byte, 1 = short, 2 = long) */
2103 16, /* bitsize */
2104 FALSE, /* pc_relative */
2105 0, /* bitpos */
2106 complain_overflow_dont, /* complain_on_overflow */
2107 bfd_elf_generic_reloc, /* special_function */
2108 "R_PPC64_ADDR16_HIGH", /* name */
2109 FALSE, /* partial_inplace */
2110 0, /* src_mask */
2111 0xffff, /* dst_mask */
2112 FALSE), /* pcrel_offset */
2113
2114 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2115 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2116 16, /* rightshift */
2117 1, /* size (0 = byte, 1 = short, 2 = long) */
2118 16, /* bitsize */
2119 FALSE, /* pc_relative */
2120 0, /* bitpos */
2121 complain_overflow_dont, /* complain_on_overflow */
2122 ppc64_elf_ha_reloc, /* special_function */
2123 "R_PPC64_ADDR16_HIGHA", /* name */
2124 FALSE, /* partial_inplace */
2125 0, /* src_mask */
2126 0xffff, /* dst_mask */
2127 FALSE), /* pcrel_offset */
2128
2129 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2130 HOWTO (R_PPC64_DTPREL16_HIGH,
2131 16, /* rightshift */
2132 1, /* size (0 = byte, 1 = short, 2 = long) */
2133 16, /* bitsize */
2134 FALSE, /* pc_relative */
2135 0, /* bitpos */
2136 complain_overflow_dont, /* complain_on_overflow */
2137 ppc64_elf_unhandled_reloc, /* special_function */
2138 "R_PPC64_DTPREL16_HIGH", /* name */
2139 FALSE, /* partial_inplace */
2140 0, /* src_mask */
2141 0xffff, /* dst_mask */
2142 FALSE), /* pcrel_offset */
2143
2144 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2145 HOWTO (R_PPC64_DTPREL16_HIGHA,
2146 16, /* rightshift */
2147 1, /* size (0 = byte, 1 = short, 2 = long) */
2148 16, /* bitsize */
2149 FALSE, /* pc_relative */
2150 0, /* bitpos */
2151 complain_overflow_dont, /* complain_on_overflow */
2152 ppc64_elf_unhandled_reloc, /* special_function */
2153 "R_PPC64_DTPREL16_HIGHA", /* name */
2154 FALSE, /* partial_inplace */
2155 0, /* src_mask */
2156 0xffff, /* dst_mask */
2157 FALSE), /* pcrel_offset */
2158
2159 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2160 HOWTO (R_PPC64_TPREL16_HIGH,
2161 16, /* rightshift */
2162 1, /* size (0 = byte, 1 = short, 2 = long) */
2163 16, /* bitsize */
2164 FALSE, /* pc_relative */
2165 0, /* bitpos */
2166 complain_overflow_dont, /* complain_on_overflow */
2167 ppc64_elf_unhandled_reloc, /* special_function */
2168 "R_PPC64_TPREL16_HIGH", /* name */
2169 FALSE, /* partial_inplace */
2170 0, /* src_mask */
2171 0xffff, /* dst_mask */
2172 FALSE), /* pcrel_offset */
2173
2174 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2175 HOWTO (R_PPC64_TPREL16_HIGHA,
2176 16, /* rightshift */
2177 1, /* size (0 = byte, 1 = short, 2 = long) */
2178 16, /* bitsize */
2179 FALSE, /* pc_relative */
2180 0, /* bitpos */
2181 complain_overflow_dont, /* complain_on_overflow */
2182 ppc64_elf_unhandled_reloc, /* special_function */
2183 "R_PPC64_TPREL16_HIGHA", /* name */
2184 FALSE, /* partial_inplace */
2185 0, /* src_mask */
2186 0xffff, /* dst_mask */
2187 FALSE), /* pcrel_offset */
2188
006589cf
AM
2189 /* Marker reloc on ELFv2 large-model function entry. */
2190 HOWTO (R_PPC64_ENTRY,
2191 0, /* rightshift */
2192 2, /* size (0 = byte, 1 = short, 2 = long) */
2193 32, /* bitsize */
2194 FALSE, /* pc_relative */
2195 0, /* bitpos */
2196 complain_overflow_dont, /* complain_on_overflow */
2197 bfd_elf_generic_reloc, /* special_function */
2198 "R_PPC64_ENTRY", /* name */
2199 FALSE, /* partial_inplace */
2200 0, /* src_mask */
2201 0, /* dst_mask */
2202 FALSE), /* pcrel_offset */
2203
45965137
AM
2204 /* Like ADDR64, but use local entry point of function. */
2205 HOWTO (R_PPC64_ADDR64_LOCAL, /* type */
2206 0, /* rightshift */
2207 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
2208 64, /* bitsize */
2209 FALSE, /* pc_relative */
2210 0, /* bitpos */
2211 complain_overflow_dont, /* complain_on_overflow */
2212 bfd_elf_generic_reloc, /* special_function */
2213 "R_PPC64_ADDR64_LOCAL", /* name */
2214 FALSE, /* partial_inplace */
2215 0, /* src_mask */
2216 ONES (64), /* dst_mask */
2217 FALSE), /* pcrel_offset */
2218
5bd4f169
AM
2219 /* GNU extension to record C++ vtable hierarchy. */
2220 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2221 0, /* rightshift */
2222 0, /* size (0 = byte, 1 = short, 2 = long) */
2223 0, /* bitsize */
b34976b6 2224 FALSE, /* pc_relative */
5bd4f169
AM
2225 0, /* bitpos */
2226 complain_overflow_dont, /* complain_on_overflow */
2227 NULL, /* special_function */
2228 "R_PPC64_GNU_VTINHERIT", /* name */
b34976b6 2229 FALSE, /* partial_inplace */
5bd4f169
AM
2230 0, /* src_mask */
2231 0, /* dst_mask */
b34976b6 2232 FALSE), /* pcrel_offset */
5bd4f169
AM
2233
2234 /* GNU extension to record C++ vtable member usage. */
2235 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2236 0, /* rightshift */
2237 0, /* size (0 = byte, 1 = short, 2 = long) */
2238 0, /* bitsize */
b34976b6 2239 FALSE, /* pc_relative */
5bd4f169
AM
2240 0, /* bitpos */
2241 complain_overflow_dont, /* complain_on_overflow */
2242 NULL, /* special_function */
2243 "R_PPC64_GNU_VTENTRY", /* name */
b34976b6 2244 FALSE, /* partial_inplace */
5bd4f169
AM
2245 0, /* src_mask */
2246 0, /* dst_mask */
b34976b6 2247 FALSE), /* pcrel_offset */
5bd4f169
AM
2248};
2249
2250\f
2251/* Initialize the ppc64_elf_howto_table, so that linear accesses can
2252 be done. */
2253
2254static void
4ce794b7 2255ppc_howto_init (void)
5bd4f169
AM
2256{
2257 unsigned int i, type;
2258
a4b6fadd 2259 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
5bd4f169
AM
2260 {
2261 type = ppc64_elf_howto_raw[i].type;
a4b6fadd 2262 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table));
5bd4f169
AM
2263 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2264 }
2265}
2266
2267static reloc_howto_type *
f3185997 2268ppc64_elf_reloc_type_lookup (bfd *abfd,
4ce794b7 2269 bfd_reloc_code_real_type code)
5bd4f169 2270{
411e1bfb 2271 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
5bd4f169
AM
2272
2273 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2274 /* Initialize howto table if needed. */
2275 ppc_howto_init ();
2276
4ce794b7 2277 switch (code)
5bd4f169
AM
2278 {
2279 default:
f3185997 2280 /* xgettext:c-format */
e8f5af78 2281 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, (int) code);
f3185997 2282 bfd_set_error (bfd_error_bad_value);
4ce794b7 2283 return NULL;
5bd4f169 2284
411e1bfb
AM
2285 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2286 break;
2287 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2288 break;
2289 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2290 break;
2291 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2292 break;
2293 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2294 break;
2295 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2296 break;
f9c6b907
AM
2297 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2298 break;
411e1bfb 2299 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
5bd4f169 2300 break;
f9c6b907
AM
2301 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2302 break;
411e1bfb 2303 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
5bd4f169 2304 break;
411e1bfb 2305 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
5bd4f169 2306 break;
411e1bfb 2307 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
5bd4f169 2308 break;
411e1bfb 2309 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
5bd4f169 2310 break;
411e1bfb 2311 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
5bd4f169 2312 break;
411e1bfb 2313 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
5bd4f169 2314 break;
411e1bfb 2315 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
5bd4f169 2316 break;
411e1bfb 2317 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
5bd4f169 2318 break;
411e1bfb 2319 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
5bd4f169 2320 break;
411e1bfb 2321 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
5bd4f169 2322 break;
411e1bfb 2323 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
5bd4f169 2324 break;
411e1bfb 2325 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
5bd4f169 2326 break;
411e1bfb 2327 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
5bd4f169 2328 break;
411e1bfb 2329 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
5bd4f169 2330 break;
411e1bfb 2331 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
5bd4f169 2332 break;
411e1bfb 2333 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
5bd4f169 2334 break;
411e1bfb 2335 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
5bd4f169 2336 break;
411e1bfb 2337 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
5bd4f169 2338 break;
411e1bfb 2339 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
5bd4f169 2340 break;
411e1bfb 2341 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
5bd4f169 2342 break;
411e1bfb 2343 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
5bd4f169 2344 break;
411e1bfb 2345 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
5bd4f169 2346 break;
411e1bfb 2347 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
5bd4f169 2348 break;
411e1bfb 2349 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
5bd4f169 2350 break;
411e1bfb 2351 case BFD_RELOC_64: r = R_PPC64_ADDR64;
5bd4f169 2352 break;
411e1bfb 2353 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
5bd4f169 2354 break;
411e1bfb 2355 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
5bd4f169 2356 break;
411e1bfb 2357 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
5bd4f169 2358 break;
411e1bfb 2359 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
5bd4f169 2360 break;
411e1bfb 2361 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
5bd4f169 2362 break;
411e1bfb 2363 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
5bd4f169 2364 break;
411e1bfb 2365 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
5bd4f169 2366 break;
411e1bfb 2367 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
5bd4f169 2368 break;
411e1bfb 2369 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
5bd4f169 2370 break;
411e1bfb 2371 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
5bd4f169 2372 break;
411e1bfb 2373 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
5bd4f169 2374 break;
411e1bfb 2375 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
5bd4f169 2376 break;
411e1bfb 2377 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
5bd4f169 2378 break;
411e1bfb 2379 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
5bd4f169 2380 break;
411e1bfb 2381 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
5bd4f169 2382 break;
411e1bfb 2383 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
5bd4f169 2384 break;
411e1bfb 2385 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
5bd4f169 2386 break;
411e1bfb 2387 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
5bd4f169 2388 break;
411e1bfb 2389 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
5bd4f169 2390 break;
411e1bfb 2391 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
5bd4f169 2392 break;
411e1bfb 2393 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
5bd4f169 2394 break;
411e1bfb 2395 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
5bd4f169 2396 break;
411e1bfb 2397 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
5bd4f169 2398 break;
411e1bfb 2399 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
5bd4f169 2400 break;
411e1bfb 2401 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
5bd4f169 2402 break;
411e1bfb 2403 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
5bd4f169 2404 break;
411e1bfb 2405 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
5bd4f169 2406 break;
411e1bfb 2407 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
5bd4f169 2408 break;
727fc41e
AM
2409 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2410 break;
2411 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2412 break;
411e1bfb 2413 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
5bd4f169 2414 break;
411e1bfb 2415 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
5bd4f169 2416 break;
411e1bfb 2417 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
5bd4f169 2418 break;
411e1bfb 2419 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
5bd4f169 2420 break;
f9c6b907
AM
2421 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2422 break;
411e1bfb 2423 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
5bd4f169 2424 break;
f9c6b907
AM
2425 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2426 break;
411e1bfb 2427 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
5bd4f169 2428 break;
411e1bfb
AM
2429 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2430 break;
2431 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2432 break;
2433 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2434 break;
f9c6b907
AM
2435 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2436 break;
411e1bfb
AM
2437 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2438 break;
f9c6b907
AM
2439 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2440 break;
411e1bfb
AM
2441 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2442 break;
2443 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2444 break;
2445 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2446 break;
2447 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2448 break;
2449 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2450 break;
2451 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2452 break;
2453 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2454 break;
2455 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2456 break;
2457 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2458 break;
2459 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2460 break;
2461 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2462 break;
2463 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2464 break;
2465 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2466 break;
2467 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2468 break;
2469 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2470 break;
2471 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2472 break;
2473 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2474 break;
2475 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2476 break;
2477 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2478 break;
2479 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2480 break;
2481 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2482 break;
2483 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2484 break;
2485 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2486 break;
2487 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2488 break;
2489 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2490 break;
2491 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2492 break;
2493 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2494 break;
2495 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2496 break;
2497 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2498 break;
25f23106
AM
2499 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2500 break;
2501 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2502 break;
2503 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2504 break;
2505 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2506 break;
7ba71655
AM
2507 case BFD_RELOC_PPC_16DX_HA: r = R_PPC64_16DX_HA;
2508 break;
a680de9a
PB
2509 case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA;
2510 break;
006589cf
AM
2511 case BFD_RELOC_PPC64_ENTRY: r = R_PPC64_ENTRY;
2512 break;
45965137
AM
2513 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
2514 break;
411e1bfb
AM
2515 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2516 break;
2517 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
5bd4f169
AM
2518 break;
2519 }
2520
4ce794b7 2521 return ppc64_elf_howto_table[r];
5bd4f169
AM
2522};
2523
157090f7
AM
2524static reloc_howto_type *
2525ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2526 const char *r_name)
2527{
2528 unsigned int i;
2529
a4b6fadd 2530 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
157090f7
AM
2531 if (ppc64_elf_howto_raw[i].name != NULL
2532 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2533 return &ppc64_elf_howto_raw[i];
2534
f3185997 2535
157090f7
AM
2536 return NULL;
2537}
2538
5bd4f169
AM
2539/* Set the howto pointer for a PowerPC ELF reloc. */
2540
f3185997 2541static bfd_boolean
4aef7643 2542ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
4ce794b7 2543 Elf_Internal_Rela *dst)
5bd4f169 2544{
65f38f15
AM
2545 unsigned int type;
2546
ef60b7ff 2547 /* Initialize howto table if needed. */
5bd4f169 2548 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
2549 ppc_howto_init ();
2550
65f38f15 2551 type = ELF64_R_TYPE (dst->r_info);
a4b6fadd 2552 if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
d0fb9a8d 2553 {
695344c0 2554 /* xgettext:c-format */
0aa13fee 2555 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
cf97bcb0 2556 abfd, type);
f3185997
NC
2557 bfd_set_error (bfd_error_bad_value);
2558 return FALSE;
d0fb9a8d 2559 }
65f38f15 2560 cache_ptr->howto = ppc64_elf_howto_table[type];
f3185997
NC
2561 if (cache_ptr->howto == NULL || cache_ptr->howto->name == NULL)
2562 {
2563 /* xgettext:c-format */
2564 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
2565 abfd, type);
2566 bfd_set_error (bfd_error_bad_value);
2567 return FALSE;
2568 }
2569
2570 return TRUE;
5bd4f169
AM
2571}
2572
04c9666a 2573/* Handle the R_PPC64_ADDR16_HA and similar relocs. */
5bd4f169
AM
2574
2575static bfd_reloc_status_type
4ce794b7
AM
2576ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2577 void *data, asection *input_section,
2578 bfd *output_bfd, char **error_message)
5bd4f169 2579{
a680de9a
PB
2580 enum elf_ppc64_reloc_type r_type;
2581 long insn;
2582 bfd_size_type octets;
3de43e7b 2583 bfd_vma value;
a680de9a 2584
805fc799
AM
2585 /* If this is a relocatable link (output_bfd test tells us), just
2586 call the generic function. Any adjustment will be done at final
2587 link time. */
2588 if (output_bfd != NULL)
cedb70c5 2589 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2590 input_section, output_bfd, error_message);
2591
2592 /* Adjust the addend for sign extension of the low 16 bits.
2593 We won't actually be using the low 16 bits, so trashing them
2594 doesn't matter. */
2595 reloc_entry->addend += 0x8000;
a680de9a
PB
2596 r_type = reloc_entry->howto->type;
2597 if (r_type != R_PPC64_REL16DX_HA)
2598 return bfd_reloc_continue;
2599
2600 value = 0;
2601 if (!bfd_is_com_section (symbol->section))
2602 value = symbol->value;
2603 value += (reloc_entry->addend
2604 + symbol->section->output_offset
2605 + symbol->section->output_section->vma);
2606 value -= (reloc_entry->address
2607 + input_section->output_offset
2608 + input_section->output_section->vma);
3de43e7b 2609 value = (bfd_signed_vma) value >> 16;
a680de9a
PB
2610
2611 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2612 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2613 insn &= ~0x1fffc1;
3de43e7b 2614 insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
a680de9a 2615 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
3de43e7b 2616 if (value + 0x8000 > 0xffff)
a680de9a
PB
2617 return bfd_reloc_overflow;
2618 return bfd_reloc_ok;
805fc799 2619}
5bd4f169 2620
2441e016
AM
2621static bfd_reloc_status_type
2622ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2623 void *data, asection *input_section,
2624 bfd *output_bfd, char **error_message)
2625{
2626 if (output_bfd != NULL)
2627 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2628 input_section, output_bfd, error_message);
2629
699733f6
AM
2630 if (strcmp (symbol->section->name, ".opd") == 0
2631 && (symbol->section->owner->flags & DYNAMIC) == 0)
2441e016
AM
2632 {
2633 bfd_vma dest = opd_entry_value (symbol->section,
2634 symbol->value + reloc_entry->addend,
aef36ac1 2635 NULL, NULL, FALSE);
2441e016
AM
2636 if (dest != (bfd_vma) -1)
2637 reloc_entry->addend = dest - (symbol->value
2638 + symbol->section->output_section->vma
2639 + symbol->section->output_offset);
2640 }
810d4e75
AM
2641 else
2642 {
2643 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
2644
2645 if (symbol->section->owner != abfd
9f284bf9 2646 && symbol->section->owner != NULL
810d4e75
AM
2647 && abiversion (symbol->section->owner) >= 2)
2648 {
2649 unsigned int i;
2650
2651 for (i = 0; i < symbol->section->owner->symcount; ++i)
2652 {
2653 asymbol *symdef = symbol->section->owner->outsymbols[i];
2654
2655 if (strcmp (symdef->name, symbol->name) == 0)
2656 {
2657 elfsym = (elf_symbol_type *) symdef;
2658 break;
2659 }
2660 }
2661 }
2662 reloc_entry->addend
2663 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
2664 }
2441e016
AM
2665 return bfd_reloc_continue;
2666}
2667
805fc799 2668static bfd_reloc_status_type
4ce794b7
AM
2669ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2670 void *data, asection *input_section,
2671 bfd *output_bfd, char **error_message)
805fc799
AM
2672{
2673 long insn;
04c9666a 2674 enum elf_ppc64_reloc_type r_type;
805fc799 2675 bfd_size_type octets;
794e51c0
AM
2676 /* Assume 'at' branch hints. */
2677 bfd_boolean is_isa_v2 = TRUE;
805fc799
AM
2678
2679 /* If this is a relocatable link (output_bfd test tells us), just
2680 call the generic function. Any adjustment will be done at final
2681 link time. */
5bd4f169 2682 if (output_bfd != NULL)
cedb70c5 2683 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2684 input_section, output_bfd, error_message);
2685
2686 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2687 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2688 insn &= ~(0x01 << 21);
4ce794b7 2689 r_type = reloc_entry->howto->type;
805fc799
AM
2690 if (r_type == R_PPC64_ADDR14_BRTAKEN
2691 || r_type == R_PPC64_REL14_BRTAKEN)
cedb70c5 2692 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
805fc799 2693
794e51c0 2694 if (is_isa_v2)
5bd4f169 2695 {
805fc799
AM
2696 /* Set 'a' bit. This is 0b00010 in BO field for branch
2697 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2698 for branch on CTR insns (BO == 1a00t or 1a01t). */
2699 if ((insn & (0x14 << 21)) == (0x04 << 21))
2700 insn |= 0x02 << 21;
2701 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2702 insn |= 0x08 << 21;
2703 else
2441e016 2704 goto out;
5bd4f169 2705 }
805fc799
AM
2706 else
2707 {
2708 bfd_vma target = 0;
2709 bfd_vma from;
5bd4f169 2710
805fc799
AM
2711 if (!bfd_is_com_section (symbol->section))
2712 target = symbol->value;
2713 target += symbol->section->output_section->vma;
2714 target += symbol->section->output_offset;
2715 target += reloc_entry->addend;
5bd4f169 2716
805fc799
AM
2717 from = (reloc_entry->address
2718 + input_section->output_offset
2719 + input_section->output_section->vma);
5bd4f169 2720
805fc799
AM
2721 /* Invert 'y' bit if not the default. */
2722 if ((bfd_signed_vma) (target - from) < 0)
2723 insn ^= 0x01 << 21;
2724 }
4ce794b7 2725 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2441e016
AM
2726 out:
2727 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2728 input_section, output_bfd, error_message);
805fc799 2729}
5bd4f169 2730
805fc799 2731static bfd_reloc_status_type
4ce794b7
AM
2732ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2733 void *data, asection *input_section,
2734 bfd *output_bfd, char **error_message)
805fc799
AM
2735{
2736 /* If this is a relocatable link (output_bfd test tells us), just
2737 call the generic function. Any adjustment will be done at final
2738 link time. */
2739 if (output_bfd != NULL)
cedb70c5 2740 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799 2741 input_section, output_bfd, error_message);
5bd4f169 2742
805fc799
AM
2743 /* Subtract the symbol section base address. */
2744 reloc_entry->addend -= symbol->section->output_section->vma;
5bd4f169
AM
2745 return bfd_reloc_continue;
2746}
2747
805fc799 2748static bfd_reloc_status_type
4ce794b7
AM
2749ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2750 void *data, asection *input_section,
2751 bfd *output_bfd, char **error_message)
805fc799
AM
2752{
2753 /* If this is a relocatable link (output_bfd test tells us), just
2754 call the generic function. Any adjustment will be done at final
2755 link time. */
2756 if (output_bfd != NULL)
cedb70c5 2757 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2758 input_section, output_bfd, error_message);
2759
2760 /* Subtract the symbol section base address. */
2761 reloc_entry->addend -= symbol->section->output_section->vma;
2762
2763 /* Adjust the addend for sign extension of the low 16 bits. */
2764 reloc_entry->addend += 0x8000;
2765 return bfd_reloc_continue;
2766}
2767
2768static bfd_reloc_status_type
4ce794b7
AM
2769ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2770 void *data, asection *input_section,
2771 bfd *output_bfd, char **error_message)
805fc799
AM
2772{
2773 bfd_vma TOCstart;
2774
2775 /* If this is a relocatable link (output_bfd test tells us), just
2776 call the generic function. Any adjustment will be done at final
2777 link time. */
2778 if (output_bfd != NULL)
cedb70c5 2779 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2780 input_section, output_bfd, error_message);
2781
2782 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2783 if (TOCstart == 0)
1c865ab2 2784 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2785
2786 /* Subtract the TOC base address. */
2787 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2788 return bfd_reloc_continue;
2789}
2790
2791static bfd_reloc_status_type
4ce794b7
AM
2792ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2793 void *data, asection *input_section,
2794 bfd *output_bfd, char **error_message)
805fc799
AM
2795{
2796 bfd_vma TOCstart;
2797
2798 /* If this is a relocatable link (output_bfd test tells us), just
2799 call the generic function. Any adjustment will be done at final
2800 link time. */
2801 if (output_bfd != NULL)
cedb70c5 2802 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2803 input_section, output_bfd, error_message);
2804
2805 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2806 if (TOCstart == 0)
1c865ab2 2807 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2808
2809 /* Subtract the TOC base address. */
2810 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2811
2812 /* Adjust the addend for sign extension of the low 16 bits. */
2813 reloc_entry->addend += 0x8000;
2814 return bfd_reloc_continue;
2815}
2816
2817static bfd_reloc_status_type
4ce794b7
AM
2818ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2819 void *data, asection *input_section,
2820 bfd *output_bfd, char **error_message)
805fc799
AM
2821{
2822 bfd_vma TOCstart;
2823 bfd_size_type octets;
2824
2825 /* If this is a relocatable link (output_bfd test tells us), just
2826 call the generic function. Any adjustment will be done at final
2827 link time. */
2828 if (output_bfd != NULL)
cedb70c5 2829 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2830 input_section, output_bfd, error_message);
2831
2832 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2833 if (TOCstart == 0)
1c865ab2 2834 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2835
2836 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2837 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2838 return bfd_reloc_ok;
2839}
2840
2841static bfd_reloc_status_type
4ce794b7
AM
2842ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2843 void *data, asection *input_section,
2844 bfd *output_bfd, char **error_message)
805fc799
AM
2845{
2846 /* If this is a relocatable link (output_bfd test tells us), just
2847 call the generic function. Any adjustment will be done at final
2848 link time. */
2849 if (output_bfd != NULL)
cedb70c5 2850 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2851 input_section, output_bfd, error_message);
2852
2853 if (error_message != NULL)
2854 {
2855 static char buf[60];
2856 sprintf (buf, "generic linker can't handle %s",
2857 reloc_entry->howto->name);
2858 *error_message = buf;
2859 }
2860 return bfd_reloc_dangerous;
2861}
2862
927be08e
AM
2863/* Track GOT entries needed for a given symbol. We might need more
2864 than one got entry per symbol. */
2865struct got_entry
2866{
2867 struct got_entry *next;
2868
2869 /* The symbol addend that we'll be placing in the GOT. */
2870 bfd_vma addend;
2871
2872 /* Unlike other ELF targets, we use separate GOT entries for the same
2873 symbol referenced from different input files. This is to support
2874 automatic multiple TOC/GOT sections, where the TOC base can vary
2875 from one input file to another. After partitioning into TOC groups
2876 we merge entries within the group.
2877
2878 Point to the BFD owning this GOT entry. */
2879 bfd *owner;
2880
2881 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2882 TLS_TPREL or TLS_DTPREL for tls entries. */
f961d9dd 2883 unsigned char tls_type;
927be08e
AM
2884
2885 /* Non-zero if got.ent points to real entry. */
f961d9dd 2886 unsigned char is_indirect;
927be08e
AM
2887
2888 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2889 union
2890 {
2891 bfd_signed_vma refcount;
2892 bfd_vma offset;
2893 struct got_entry *ent;
2894 } got;
2895};
2896
2897/* The same for PLT. */
2898struct plt_entry
2899{
2900 struct plt_entry *next;
2901
2902 bfd_vma addend;
2903
2904 union
2905 {
2906 bfd_signed_vma refcount;
2907 bfd_vma offset;
2908 } plt;
2909};
2910
e717da7e
AM
2911struct ppc64_elf_obj_tdata
2912{
2913 struct elf_obj_tdata elf;
2914
2915 /* Shortcuts to dynamic linker sections. */
2916 asection *got;
2917 asection *relgot;
2918
b3fac117
AM
2919 /* Used during garbage collection. We attach global symbols defined
2920 on removed .opd entries to this section so that the sym is removed. */
2921 asection *deleted_section;
81688140 2922
927be08e 2923 /* TLS local dynamic got entry handling. Support for multiple GOT
e717da7e 2924 sections means we potentially need one of these for each input bfd. */
927be08e 2925 struct got_entry tlsld_got;
8860955f 2926
729eabd5
AM
2927 union {
2928 /* A copy of relocs before they are modified for --emit-relocs. */
2929 Elf_Internal_Rela *relocs;
2930
2931 /* Section contents. */
2932 bfd_byte *contents;
2933 } opd;
d77c8a4b
AM
2934
2935 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2936 the reloc to be in the range -32768 to 32767. */
98528052
AM
2937 unsigned int has_small_toc_reloc : 1;
2938
560c8763
AM
2939 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2940 instruction not one we handle. */
2941 unsigned int unexpected_toc_insn : 1;
e717da7e
AM
2942};
2943
2944#define ppc64_elf_tdata(bfd) \
2945 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2946
2947#define ppc64_tlsld_got(bfd) \
2948 (&ppc64_elf_tdata (bfd)->tlsld_got)
2949
0c8d6e5c
AM
2950#define is_ppc64_elf(bfd) \
2951 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
4dfe6ac6 2952 && elf_object_id (bfd) == PPC64_ELF_DATA)
0c8d6e5c 2953
e717da7e
AM
2954/* Override the generic function because we store some extras. */
2955
2956static bfd_boolean
2957ppc64_elf_mkobject (bfd *abfd)
2958{
0ffa91dd 2959 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
4dfe6ac6 2960 PPC64_ELF_DATA);
e717da7e
AM
2961}
2962
feee612b 2963/* Fix bad default arch selected for a 64 bit input bfd when the
14b57c7c 2964 default is 32 bit. Also select arch based on apuinfo. */
feee612b 2965
b34976b6 2966static bfd_boolean
4ce794b7 2967ppc64_elf_object_p (bfd *abfd)
feee612b 2968{
14b57c7c
AM
2969 if (!abfd->arch_info->the_default)
2970 return TRUE;
2971
2972 if (abfd->arch_info->bits_per_word == 32)
feee612b
AM
2973 {
2974 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2975
2976 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2977 {
2978 /* Relies on arch after 32 bit default being 64 bit default. */
2979 abfd->arch_info = abfd->arch_info->next;
2980 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2981 }
2982 }
14b57c7c 2983 return _bfd_elf_ppc_set_arch (abfd);
feee612b
AM
2984}
2985
d37c89e5
AM
2986/* Support for core dump NOTE sections. */
2987
2988static bfd_boolean
2989ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2990{
eea6121a 2991 size_t offset, size;
d37c89e5
AM
2992
2993 if (note->descsz != 504)
2994 return FALSE;
2995
2996 /* pr_cursig */
228e534f 2997 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
d37c89e5
AM
2998
2999 /* pr_pid */
228e534f 3000 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
d37c89e5
AM
3001
3002 /* pr_reg */
3003 offset = 112;
eea6121a 3004 size = 384;
d37c89e5
AM
3005
3006 /* Make a ".reg/999" section. */
3007 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 3008 size, note->descpos + offset);
d37c89e5
AM
3009}
3010
3011static bfd_boolean
3012ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3013{
3014 if (note->descsz != 136)
3015 return FALSE;
3016
228e534f 3017 elf_tdata (abfd)->core->pid
bc989cdc 3018 = bfd_get_32 (abfd, note->descdata + 24);
228e534f 3019 elf_tdata (abfd)->core->program
d37c89e5 3020 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
228e534f 3021 elf_tdata (abfd)->core->command
d37c89e5
AM
3022 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
3023
3024 return TRUE;
3025}
3026
183e98be
AM
3027static char *
3028ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
3029 ...)
3030{
3031 switch (note_type)
3032 {
3033 default:
3034 return NULL;
3035
3036 case NT_PRPSINFO:
3037 {
3038 char data[136];
3039 va_list ap;
3040
3041 va_start (ap, note_type);
75cd47ed 3042 memset (data, 0, sizeof (data));
183e98be
AM
3043 strncpy (data + 40, va_arg (ap, const char *), 16);
3044 strncpy (data + 56, va_arg (ap, const char *), 80);
3045 va_end (ap);
3046 return elfcore_write_note (abfd, buf, bufsiz,
3047 "CORE", note_type, data, sizeof (data));
3048 }
3049
3050 case NT_PRSTATUS:
3051 {
3052 char data[504];
3053 va_list ap;
3054 long pid;
3055 int cursig;
3056 const void *greg;
3057
3058 va_start (ap, note_type);
3059 memset (data, 0, 112);
3060 pid = va_arg (ap, long);
3061 bfd_put_32 (abfd, pid, data + 32);
3062 cursig = va_arg (ap, int);
3063 bfd_put_16 (abfd, cursig, data + 12);
3064 greg = va_arg (ap, const void *);
3065 memcpy (data + 112, greg, 384);
3066 memset (data + 496, 0, 8);
3067 va_end (ap);
3068 return elfcore_write_note (abfd, buf, bufsiz,
3069 "CORE", note_type, data, sizeof (data));
3070 }
3071 }
3072}
3073
5d35169e
AM
3074/* Add extra PPC sections. */
3075
b35d266b 3076static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
7f4d3958 3077{
07d6d2b8
AM
3078 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
3079 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 3080 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
3081 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3082 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 3083 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8 3084 { NULL, 0, 0, 0, 0 }
5d35169e
AM
3085};
3086
7c8fe5c4
AM
3087enum _ppc64_sec_type {
3088 sec_normal = 0,
3089 sec_opd = 1,
3090 sec_toc = 2
3091};
3092
f0abc2a1
AM
3093struct _ppc64_elf_section_data
3094{
3095 struct bfd_elf_section_data elf;
411e1bfb 3096
f0abc2a1
AM
3097 union
3098 {
51aecdc5
AM
3099 /* An array with one entry for each opd function descriptor,
3100 and some spares since opd entries may be either 16 or 24 bytes. */
3101#define OPD_NDX(OFF) ((OFF) >> 4)
74f0fb50
AM
3102 struct _opd_sec_data
3103 {
3104 /* Points to the function code section for local opd entries. */
3105 asection **func_sec;
3106
3107 /* After editing .opd, adjust references to opd local syms. */
3108 long *adjust;
3109 } opd;
7c8fe5c4 3110
3a71aa26
AM
3111 /* An array for toc sections, indexed by offset/8. */
3112 struct _toc_sec_data
3113 {
3114 /* Specifies the relocation symbol index used at a given toc offset. */
3115 unsigned *symndx;
3116
3117 /* And the relocation addend. */
3118 bfd_vma *add;
3119 } toc;
7c8fe5c4
AM
3120 } u;
3121
3122 enum _ppc64_sec_type sec_type:2;
411e1bfb 3123
7c8fe5c4
AM
3124 /* Flag set when small branches are detected. Used to
3125 select suitable defaults for the stub group size. */
3126 unsigned int has_14bit_branch:1;
3e04d765
AM
3127
3128 /* Flag set when PLTCALL relocs are detected. */
3129 unsigned int has_pltcall:1;
f0abc2a1
AM
3130};
3131
3132#define ppc64_elf_section_data(sec) \
411e1bfb 3133 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
f0abc2a1
AM
3134
3135static bfd_boolean
4ce794b7 3136ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 3137{
f592407e
AM
3138 if (!sec->used_by_bfd)
3139 {
3140 struct _ppc64_elf_section_data *sdata;
3141 bfd_size_type amt = sizeof (*sdata);
f0abc2a1 3142
f592407e
AM
3143 sdata = bfd_zalloc (abfd, amt);
3144 if (sdata == NULL)
3145 return FALSE;
3146 sec->used_by_bfd = sdata;
3147 }
f0abc2a1
AM
3148
3149 return _bfd_elf_new_section_hook (abfd, sec);
3150}
4025353c 3151
74f0fb50 3152static struct _opd_sec_data *
4025353c
AM
3153get_opd_info (asection * sec)
3154{
3155 if (sec != NULL
3156 && ppc64_elf_section_data (sec) != NULL
7c8fe5c4 3157 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
74f0fb50 3158 return &ppc64_elf_section_data (sec)->u.opd;
4025353c
AM
3159 return NULL;
3160}
90e3cdf2
JJ
3161\f
3162/* Parameters for the qsort hook. */
90e3cdf2 3163static bfd_boolean synthetic_relocatable;
cd285db5 3164static asection *synthetic_opd;
90e3cdf2 3165
699733f6 3166/* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
90e3cdf2
JJ
3167
3168static int
3169compare_symbols (const void *ap, const void *bp)
3170{
3171 const asymbol *a = * (const asymbol **) ap;
3172 const asymbol *b = * (const asymbol **) bp;
3173
699733f6
AM
3174 /* Section symbols first. */
3175 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
90e3cdf2 3176 return -1;
699733f6 3177 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
90e3cdf2
JJ
3178 return 1;
3179
699733f6 3180 /* then .opd symbols. */
cd285db5
AM
3181 if (synthetic_opd != NULL)
3182 {
3183 if (strcmp (a->section->name, ".opd") == 0
3184 && strcmp (b->section->name, ".opd") != 0)
3185 return -1;
3186 if (strcmp (a->section->name, ".opd") != 0
3187 && strcmp (b->section->name, ".opd") == 0)
3188 return 1;
3189 }
90e3cdf2 3190
699733f6 3191 /* then other code symbols. */
90e3cdf2
JJ
3192 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3193 == (SEC_CODE | SEC_ALLOC)
3194 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3195 != (SEC_CODE | SEC_ALLOC))
3196 return -1;
3197
3198 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3199 != (SEC_CODE | SEC_ALLOC)
3200 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3201 == (SEC_CODE | SEC_ALLOC))
3202 return 1;
3203
3204 if (synthetic_relocatable)
3205 {
3206 if (a->section->id < b->section->id)
3207 return -1;
3208
3209 if (a->section->id > b->section->id)
3210 return 1;
3211 }
3212
3213 if (a->value + a->section->vma < b->value + b->section->vma)
3214 return -1;
3215
3216 if (a->value + a->section->vma > b->value + b->section->vma)
3217 return 1;
3218
4d35a0aa
AM
3219 /* For syms with the same value, prefer strong dynamic global function
3220 syms over other syms. */
3221 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3222 return -1;
3223
3224 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3225 return 1;
3226
3227 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3228 return -1;
3229
3230 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3231 return 1;
3232
3233 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3234 return -1;
3235
3236 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3237 return 1;
3238
3239 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3240 return -1;
3241
3242 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3243 return 1;
3244
aaed6f5b 3245 return a > b;
90e3cdf2
JJ
3246}
3247
699733f6 3248/* Search SYMS for a symbol of the given VALUE. */
90e3cdf2 3249
699733f6 3250static asymbol *
7292b3ac 3251sym_exists_at (asymbol **syms, long lo, long hi, unsigned int id, bfd_vma value)
90e3cdf2 3252{
699733f6 3253 long mid;
90e3cdf2 3254
7292b3ac 3255 if (id == (unsigned) -1)
699733f6
AM
3256 {
3257 while (lo < hi)
3258 {
3259 mid = (lo + hi) >> 1;
3260 if (syms[mid]->value + syms[mid]->section->vma < value)
3261 lo = mid + 1;
3262 else if (syms[mid]->value + syms[mid]->section->vma > value)
3263 hi = mid;
3264 else
3265 return syms[mid];
3266 }
3267 }
3268 else
3269 {
3270 while (lo < hi)
3271 {
3272 mid = (lo + hi) >> 1;
3273 if (syms[mid]->section->id < id)
3274 lo = mid + 1;
3275 else if (syms[mid]->section->id > id)
3276 hi = mid;
3277 else if (syms[mid]->value < value)
3278 lo = mid + 1;
3279 else if (syms[mid]->value > value)
3280 hi = mid;
3281 else
3282 return syms[mid];
3283 }
3284 }
3285 return NULL;
90e3cdf2
JJ
3286}
3287
468392fb
AM
3288static bfd_boolean
3289section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3290{
3291 bfd_vma vma = *(bfd_vma *) ptr;
3292 return ((section->flags & SEC_ALLOC) != 0
3293 && section->vma <= vma
3294 && vma < section->vma + section->size);
3295}
3296
699733f6 3297/* Create synthetic symbols, effectively restoring "dot-symbol" function
c4b0b099
AM
3298 entry syms. Also generate @plt symbols for the glink branch table.
3299 Returns count of synthetic symbols in RET or -1 on error. */
90e3cdf2
JJ
3300
3301static long
a7535cf3
AM
3302ppc64_elf_get_synthetic_symtab (bfd *abfd,
3303 long static_count, asymbol **static_syms,
3304 long dyn_count, asymbol **dyn_syms,
c9727e01 3305 asymbol **ret)
90e3cdf2
JJ
3306{
3307 asymbol *s;
0ccf57bd 3308 size_t i, j, count;
90e3cdf2 3309 char *names;
0ccf57bd 3310 size_t symcount, codesecsym, codesecsymend, secsymend, opdsymend;
ee67d69a 3311 asection *opd = NULL;
90e3cdf2 3312 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 3313 asymbol **syms;
ee67d69a 3314 int abi = abiversion (abfd);
90e3cdf2
JJ
3315
3316 *ret = NULL;
3317
ee67d69a
AM
3318 if (abi < 2)
3319 {
3320 opd = bfd_get_section_by_name (abfd, ".opd");
3321 if (opd == NULL && abi == 1)
3322 return 0;
3323 }
90e3cdf2 3324
a5259595
AM
3325 syms = NULL;
3326 codesecsym = 0;
3327 codesecsymend = 0;
3328 secsymend = 0;
3329 opdsymend = 0;
3330 symcount = 0;
3331 if (opd != NULL)
c9727e01 3332 {
a5259595
AM
3333 symcount = static_count;
3334 if (!relocatable)
3335 symcount += dyn_count;
3336 if (symcount == 0)
3337 return 0;
c9727e01 3338
a5259595
AM
3339 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3340 if (syms == NULL)
3341 return -1;
90e3cdf2 3342
a5259595
AM
3343 if (!relocatable && static_count != 0 && dyn_count != 0)
3344 {
3345 /* Use both symbol tables. */
3346 memcpy (syms, static_syms, static_count * sizeof (*syms));
3347 memcpy (syms + static_count, dyn_syms,
3348 (dyn_count + 1) * sizeof (*syms));
3349 }
3350 else if (!relocatable && static_count == 0)
3351 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3352 else
3353 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
90e3cdf2 3354
0ccf57bd
AM
3355 /* Trim uninteresting symbols. Interesting symbols are section,
3356 function, and notype symbols. */
3357 for (i = 0, j = 0; i < symcount; ++i)
3358 if ((syms[i]->flags & (BSF_FILE | BSF_OBJECT | BSF_THREAD_LOCAL
3359 | BSF_RELC | BSF_SRELC)) == 0)
3360 syms[j++] = syms[i];
3361 symcount = j;
3362
a5259595
AM
3363 synthetic_relocatable = relocatable;
3364 synthetic_opd = opd;
3365 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 3366
a5259595
AM
3367 if (!relocatable && symcount > 1)
3368 {
bfa5bd2a
PA
3369 /* Trim duplicate syms, since we may have merged the normal
3370 and dynamic symbols. Actually, we only care about syms
3371 that have different values, so trim any with the same
3372 value. Don't consider ifunc and ifunc resolver symbols
3373 duplicates however, because GDB wants to know whether a
3374 text symbol is an ifunc resolver. */
a5259595 3375 for (i = 1, j = 1; i < symcount; ++i)
bfa5bd2a
PA
3376 {
3377 const asymbol *s0 = syms[i - 1];
3378 const asymbol *s1 = syms[i];
3379
3380 if ((s0->value + s0->section->vma
3381 != s1->value + s1->section->vma)
3382 || ((s0->flags & BSF_GNU_INDIRECT_FUNCTION)
3383 != (s1->flags & BSF_GNU_INDIRECT_FUNCTION)))
3384 syms[j++] = syms[i];
3385 }
a5259595
AM
3386 symcount = j;
3387 }
699733f6 3388
a5259595
AM
3389 i = 0;
3390 /* Note that here and in compare_symbols we can't compare opd and
3391 sym->section directly. With separate debug info files, the
3392 symbols will be extracted from the debug file while abfd passed
3393 to this function is the real binary. */
0ccf57bd 3394 if (strcmp (syms[i]->section->name, ".opd") == 0)
a5259595
AM
3395 ++i;
3396 codesecsym = i;
3397
3398 for (; i < symcount; ++i)
3399 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC
3400 | SEC_THREAD_LOCAL))
3401 != (SEC_CODE | SEC_ALLOC))
3402 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3403 break;
3404 codesecsymend = i;
3405
3406 for (; i < symcount; ++i)
3407 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3408 break;
3409 secsymend = i;
3410
3411 for (; i < symcount; ++i)
3412 if (strcmp (syms[i]->section->name, ".opd") != 0)
3413 break;
3414 opdsymend = i;
3415
3416 for (; i < symcount; ++i)
3417 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3418 != (SEC_CODE | SEC_ALLOC))
3419 break;
3420 symcount = i;
3421 }
c9727e01 3422 count = 0;
90e3cdf2 3423
699733f6 3424 if (relocatable)
90e3cdf2 3425 {
699733f6
AM
3426 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3427 arelent *r;
3428 size_t size;
0ccf57bd 3429 size_t relcount;
90e3cdf2 3430
468392fb
AM
3431 if (opdsymend == secsymend)
3432 goto done;
3433
699733f6 3434 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2 3435 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
7356fed5 3436 if (relcount == 0)
c9727e01 3437 goto done;
90e3cdf2 3438
7356fed5
AM
3439 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3440 {
3441 count = -1;
3442 goto done;
3443 }
3444
699733f6 3445 size = 0;
595da8c5 3446 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
3447 {
3448 asymbol *sym;
90e3cdf2 3449
595da8c5 3450 while (r < opd->relocation + relcount
699733f6
AM
3451 && r->address < syms[i]->value + opd->vma)
3452 ++r;
90e3cdf2 3453
595da8c5 3454 if (r == opd->relocation + relcount)
699733f6 3455 break;
90e3cdf2 3456
699733f6
AM
3457 if (r->address != syms[i]->value + opd->vma)
3458 continue;
90e3cdf2 3459
699733f6
AM
3460 if (r->howto->type != R_PPC64_ADDR64)
3461 continue;
90e3cdf2 3462
699733f6
AM
3463 sym = *r->sym_ptr_ptr;
3464 if (!sym_exists_at (syms, opdsymend, symcount,
3465 sym->section->id, sym->value + r->addend))
3466 {
3467 ++count;
3468 size += sizeof (asymbol);
3469 size += strlen (syms[i]->name) + 2;
3470 }
3471 }
90e3cdf2 3472
c4b0b099
AM
3473 if (size == 0)
3474 goto done;
699733f6
AM
3475 s = *ret = bfd_malloc (size);
3476 if (s == NULL)
3477 {
7356fed5 3478 count = -1;
c9727e01 3479 goto done;
699733f6 3480 }
90e3cdf2 3481
699733f6 3482 names = (char *) (s + count);
90e3cdf2 3483
595da8c5 3484 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 3485 {
699733f6 3486 asymbol *sym;
90e3cdf2 3487
595da8c5 3488 while (r < opd->relocation + relcount
699733f6
AM
3489 && r->address < syms[i]->value + opd->vma)
3490 ++r;
90e3cdf2 3491
595da8c5 3492 if (r == opd->relocation + relcount)
699733f6
AM
3493 break;
3494
3495 if (r->address != syms[i]->value + opd->vma)
3496 continue;
3497
3498 if (r->howto->type != R_PPC64_ADDR64)
3499 continue;
90e3cdf2 3500
699733f6
AM
3501 sym = *r->sym_ptr_ptr;
3502 if (!sym_exists_at (syms, opdsymend, symcount,
3503 sym->section->id, sym->value + r->addend))
3504 {
3505 size_t len;
3506
3507 *s = *syms[i];
6ba2a415 3508 s->flags |= BSF_SYNTHETIC;
699733f6
AM
3509 s->section = sym->section;
3510 s->value = sym->value + r->addend;
3511 s->name = names;
3512 *names++ = '.';
3513 len = strlen (syms[i]->name);
3514 memcpy (names, syms[i]->name, len + 1);
3515 names += len + 1;
6f610d07
UW
3516 /* Have udata.p point back to the original symbol this
3517 synthetic symbol was derived from. */
3518 s->udata.p = syms[i];
699733f6
AM
3519 s++;
3520 }
3521 }
3522 }
3523 else
90e3cdf2 3524 {
468392fb 3525 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
ee67d69a 3526 bfd_byte *contents = NULL;
699733f6 3527 size_t size;
0ccf57bd 3528 size_t plt_count = 0;
468392fb
AM
3529 bfd_vma glink_vma = 0, resolv_vma = 0;
3530 asection *dynamic, *glink = NULL, *relplt = NULL;
3531 arelent *p;
90e3cdf2 3532
ee67d69a 3533 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
699733f6 3534 {
c4b0b099
AM
3535 free_contents_and_exit_err:
3536 count = -1;
ee67d69a 3537 free_contents_and_exit:
699733f6 3538 if (contents)
ee67d69a 3539 free (contents);
c9727e01 3540 goto done;
699733f6 3541 }
90e3cdf2 3542
699733f6
AM
3543 size = 0;
3544 for (i = secsymend; i < opdsymend; ++i)
3545 {
3546 bfd_vma ent;
90e3cdf2 3547
5ef11c02
AM
3548 /* Ignore bogus symbols. */
3549 if (syms[i]->value > opd->size - 8)
3550 continue;
3551
699733f6
AM
3552 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3553 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3554 {
3555 ++count;
3556 size += sizeof (asymbol);
3557 size += strlen (syms[i]->name) + 2;
3558 }
3559 }
90e3cdf2 3560
468392fb 3561 /* Get start of .glink stubs from DT_PPC64_GLINK. */
066ee829
AM
3562 if (dyn_count != 0
3563 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
468392fb
AM
3564 {
3565 bfd_byte *dynbuf, *extdyn, *extdynend;
3566 size_t extdynsize;
3567 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3568
3569 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
c4b0b099 3570 goto free_contents_and_exit_err;
468392fb
AM
3571
3572 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3573 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3574
3575 extdyn = dynbuf;
3576 extdynend = extdyn + dynamic->size;
3577 for (; extdyn < extdynend; extdyn += extdynsize)
3578 {
3579 Elf_Internal_Dyn dyn;
3580 (*swap_dyn_in) (abfd, extdyn, &dyn);
3581
3582 if (dyn.d_tag == DT_NULL)
3583 break;
3584
3585 if (dyn.d_tag == DT_PPC64_GLINK)
3586 {
9e390558
AM
3587 /* The first glink stub starts at DT_PPC64_GLINK plus 32.
3588 See comment in ppc64_elf_finish_dynamic_sections. */
3589 glink_vma = dyn.d_un.d_val + 8 * 4;
468392fb
AM
3590 /* The .glink section usually does not survive the final
3591 link; search for the section (usually .text) where the
3592 glink stubs now reside. */
3593 glink = bfd_sections_find_if (abfd, section_covers_vma,
3594 &glink_vma);
3595 break;
3596 }
3597 }
3598
3599 free (dynbuf);
3600 }
3601
3602 if (glink != NULL)
3603 {
3604 /* Determine __glink trampoline by reading the relative branch
3605 from the first glink stub. */
3606 bfd_byte buf[4];
b9e5796b
AM
3607 unsigned int off = 0;
3608
3609 while (bfd_get_section_contents (abfd, glink, buf,
3610 glink_vma + off - glink->vma, 4))
468392fb
AM
3611 {
3612 unsigned int insn = bfd_get_32 (abfd, buf);
3613 insn ^= B_DOT;
3614 if ((insn & ~0x3fffffc) == 0)
b9e5796b
AM
3615 {
3616 resolv_vma = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
3617 break;
3618 }
3619 off += 4;
3620 if (off > 4)
3621 break;
468392fb
AM
3622 }
3623
3624 if (resolv_vma)
3625 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
468392fb 3626
066ee829
AM
3627 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3628 if (relplt != NULL)
3629 {
3630 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3631 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
c4b0b099 3632 goto free_contents_and_exit_err;
68ffbac6 3633
066ee829
AM
3634 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3635 size += plt_count * sizeof (asymbol);
468392fb 3636
066ee829
AM
3637 p = relplt->relocation;
3638 for (i = 0; i < plt_count; i++, p++)
e054468f
AM
3639 {
3640 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3641 if (p->addend != 0)
3642 size += sizeof ("+0x") - 1 + 16;
3643 }
066ee829 3644 }
468392fb
AM
3645 }
3646
c4b0b099
AM
3647 if (size == 0)
3648 goto free_contents_and_exit;
699733f6
AM
3649 s = *ret = bfd_malloc (size);
3650 if (s == NULL)
c4b0b099 3651 goto free_contents_and_exit_err;
90e3cdf2 3652
468392fb 3653 names = (char *) (s + count + plt_count + (resolv_vma != 0));
90e3cdf2 3654
699733f6 3655 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 3656 {
699733f6 3657 bfd_vma ent;
90e3cdf2 3658
5ef11c02
AM
3659 if (syms[i]->value > opd->size - 8)
3660 continue;
3661
699733f6
AM
3662 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3663 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 3664 {
0ccf57bd 3665 size_t lo, hi;
699733f6 3666 size_t len;
c9727e01 3667 asection *sec = abfd->sections;
90e3cdf2 3668
699733f6
AM
3669 *s = *syms[i];
3670 lo = codesecsym;
3671 hi = codesecsymend;
3672 while (lo < hi)
3673 {
0ccf57bd 3674 size_t mid = (lo + hi) >> 1;
699733f6
AM
3675 if (syms[mid]->section->vma < ent)
3676 lo = mid + 1;
3677 else if (syms[mid]->section->vma > ent)
3678 hi = mid;
3679 else
c9727e01
AM
3680 {
3681 sec = syms[mid]->section;
3682 break;
3683 }
699733f6
AM
3684 }
3685
c9727e01 3686 if (lo >= hi && lo > codesecsym)
699733f6 3687 sec = syms[lo - 1]->section;
699733f6
AM
3688
3689 for (; sec != NULL; sec = sec->next)
3690 {
3691 if (sec->vma > ent)
3692 break;
63524580
JK
3693 /* SEC_LOAD may not be set if SEC is from a separate debug
3694 info file. */
3695 if ((sec->flags & SEC_ALLOC) == 0)
699733f6
AM
3696 break;
3697 if ((sec->flags & SEC_CODE) != 0)
3698 s->section = sec;
3699 }
6ba2a415 3700 s->flags |= BSF_SYNTHETIC;
699733f6
AM
3701 s->value = ent - s->section->vma;
3702 s->name = names;
3703 *names++ = '.';
3704 len = strlen (syms[i]->name);
3705 memcpy (names, syms[i]->name, len + 1);
3706 names += len + 1;
6f610d07
UW
3707 /* Have udata.p point back to the original symbol this
3708 synthetic symbol was derived from. */
3709 s->udata.p = syms[i];
699733f6 3710 s++;
90e3cdf2 3711 }
90e3cdf2 3712 }
699733f6 3713 free (contents);
468392fb
AM
3714
3715 if (glink != NULL && relplt != NULL)
3716 {
3717 if (resolv_vma)
3718 {
3719 /* Add a symbol for the main glink trampoline. */
86a4952b 3720 memset (s, 0, sizeof *s);
468392fb 3721 s->the_bfd = abfd;
6ba2a415 3722 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
468392fb
AM
3723 s->section = glink;
3724 s->value = resolv_vma - glink->vma;
3725 s->name = names;
3726 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3727 names += sizeof ("__glink_PLTresolve");
3728 s++;
3729 count++;
3730 }
3731
3732 /* FIXME: It would be very much nicer to put sym@plt on the
3733 stub rather than on the glink branch table entry. The
3734 objdump disassembler would then use a sensible symbol
3735 name on plt calls. The difficulty in doing so is
3736 a) finding the stubs, and,
3737 b) matching stubs against plt entries, and,
3738 c) there can be multiple stubs for a given plt entry.
3739
3740 Solving (a) could be done by code scanning, but older
3741 ppc64 binaries used different stubs to current code.
3742 (b) is the tricky one since you need to known the toc
3743 pointer for at least one function that uses a pic stub to
3744 be able to calculate the plt address referenced.
3745 (c) means gdb would need to set multiple breakpoints (or
3746 find the glink branch itself) when setting breakpoints
3747 for pending shared library loads. */
3748 p = relplt->relocation;
3749 for (i = 0; i < plt_count; i++, p++)
3750 {
3751 size_t len;
3752
3753 *s = **p->sym_ptr_ptr;
3754 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3755 we are defining a symbol, ensure one of them is set. */
3756 if ((s->flags & BSF_LOCAL) == 0)
3757 s->flags |= BSF_GLOBAL;
6ba2a415 3758 s->flags |= BSF_SYNTHETIC;
468392fb
AM
3759 s->section = glink;
3760 s->value = glink_vma - glink->vma;
3761 s->name = names;
3762 s->udata.p = NULL;
3763 len = strlen ((*p->sym_ptr_ptr)->name);
3764 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3765 names += len;
e054468f
AM
3766 if (p->addend != 0)
3767 {
3768 memcpy (names, "+0x", sizeof ("+0x") - 1);
3769 names += sizeof ("+0x") - 1;
3770 bfd_sprintf_vma (abfd, names, p->addend);
3771 names += strlen (names);
3772 }
468392fb
AM
3773 memcpy (names, "@plt", sizeof ("@plt"));
3774 names += sizeof ("@plt");
3775 s++;
b9e5796b
AM
3776 if (abi < 2)
3777 {
3778 glink_vma += 8;
3779 if (i >= 0x8000)
3780 glink_vma += 4;
3781 }
3782 else
468392fb
AM
3783 glink_vma += 4;
3784 }
3785 count += plt_count;
3786 }
90e3cdf2
JJ
3787 }
3788
c9727e01 3789 done:
a7535cf3 3790 free (syms);
90e3cdf2
JJ
3791 return count;
3792}
5bd4f169 3793\f
65f38f15
AM
3794/* The following functions are specific to the ELF linker, while
3795 functions above are used generally. Those named ppc64_elf_* are
3796 called by the main ELF linker code. They appear in this file more
3797 or less in the order in which they are called. eg.
3798 ppc64_elf_check_relocs is called early in the link process,
3799 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
3800 called.
3801
3802 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3803 functions have both a function code symbol and a function descriptor
3804 symbol. A call to foo in a relocatable object file looks like:
3805
3806 . .text
3807 . x:
3808 . bl .foo
3809 . nop
3810
3811 The function definition in another object file might be:
3812
3813 . .section .opd
3814 . foo: .quad .foo
3815 . .quad .TOC.@tocbase
3816 . .quad 0
3817 .
3818 . .text
3819 . .foo: blr
3820
3821 When the linker resolves the call during a static link, the branch
3822 unsurprisingly just goes to .foo and the .opd information is unused.
3823 If the function definition is in a shared library, things are a little
3824 different: The call goes via a plt call stub, the opd information gets
3825 copied to the plt, and the linker patches the nop.
3826
3827 . x:
3828 . bl .foo_stub
3829 . ld 2,40(1)
3830 .
3831 .
3832 . .foo_stub:
71a39c98
AM
3833 . std 2,40(1) # in practice, the call stub
3834 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3835 . addi 11,11,Lfoo@toc@l # this is the general idea
3836 . ld 12,0(11)
3837 . ld 2,8(11)
3838 . mtctr 12
3839 . ld 11,16(11)
e86ce104
AM
3840 . bctr
3841 .
3842 . .section .plt
3843 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3844
3845 The "reloc ()" notation is supposed to indicate that the linker emits
3846 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3847 copying.
3848
3849 What are the difficulties here? Well, firstly, the relocations
3850 examined by the linker in check_relocs are against the function code
3851 sym .foo, while the dynamic relocation in the plt is emitted against
3852 the function descriptor symbol, foo. Somewhere along the line, we need
3853 to carefully copy dynamic link information from one symbol to the other.
3854 Secondly, the generic part of the elf linker will make .foo a dynamic
3855 symbol as is normal for most other backends. We need foo dynamic
3856 instead, at least for an application final link. However, when
3857 creating a shared library containing foo, we need to have both symbols
3858 dynamic so that references to .foo are satisfied during the early
3859 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
3860 definition from some other object, eg. a static library.
3861
3862 Update: As of August 2004, we support a new convention. Function
3863 calls may use the function descriptor symbol, ie. "bl foo". This
3864 behaves exactly as "bl .foo". */
65f38f15 3865
7c8bbca5
AM
3866/* Of those relocs that might be copied as dynamic relocs, this
3867 function selects those that must be copied when linking a shared
3868 library or PIE, even when the symbol is local. */
65f38f15 3869
1d483afe
AM
3870static int
3871must_be_dyn_reloc (struct bfd_link_info *info,
3872 enum elf_ppc64_reloc_type r_type)
3873{
3874 switch (r_type)
3875 {
3876 default:
7c8bbca5
AM
3877 /* Only relative relocs can be resolved when the object load
3878 address isn't fixed. DTPREL64 is excluded because the
3879 dynamic linker needs to differentiate global dynamic from
3880 local dynamic __tls_index pairs when PPC64_OPT_TLS is set. */
1d483afe
AM
3881 return 1;
3882
3883 case R_PPC64_REL32:
3884 case R_PPC64_REL64:
3885 case R_PPC64_REL30:
3886 return 0;
3887
3888 case R_PPC64_TPREL16:
3889 case R_PPC64_TPREL16_LO:
3890 case R_PPC64_TPREL16_HI:
3891 case R_PPC64_TPREL16_HA:
3892 case R_PPC64_TPREL16_DS:
3893 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
3894 case R_PPC64_TPREL16_HIGH:
3895 case R_PPC64_TPREL16_HIGHA:
1d483afe
AM
3896 case R_PPC64_TPREL16_HIGHER:
3897 case R_PPC64_TPREL16_HIGHERA:
3898 case R_PPC64_TPREL16_HIGHEST:
3899 case R_PPC64_TPREL16_HIGHESTA:
3900 case R_PPC64_TPREL64:
7c8bbca5
AM
3901 /* These relocations are relative but in a shared library the
3902 linker doesn't know the thread pointer base. */
3903 return bfd_link_dll (info);
1d483afe
AM
3904 }
3905}
65f38f15 3906
f4656909
AM
3907/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3908 copying dynamic variables from a shared lib into an app's dynbss
3909 section, and instead use a dynamic relocation to point into the
5d35169e
AM
3910 shared lib. With code that gcc generates, it's vital that this be
3911 enabled; In the PowerPC64 ABI, the address of a function is actually
3912 the address of a function descriptor, which resides in the .opd
3913 section. gcc uses the descriptor directly rather than going via the
3914 GOT as some other ABI's do, which means that initialized function
3915 pointers must reference the descriptor. Thus, a function pointer
3916 initialized to the address of a function in a shared library will
3917 either require a copy reloc, or a dynamic reloc. Using a copy reloc
4cc11e76 3918 redefines the function descriptor symbol to point to the copy. This
5d35169e
AM
3919 presents a problem as a plt entry for that function is also
3920 initialized from the function descriptor symbol and the copy reloc
3921 may not be initialized first. */
a23b6845 3922#define ELIMINATE_COPY_RELOCS 1
f4656909 3923
721956f4 3924/* Section name for stubs is the associated section name plus this
29942be8
NC
3925 string. */
3926#define STUB_SUFFIX ".stub"
721956f4
AM
3927
3928/* Linker stubs.
3929 ppc_stub_long_branch:
3930 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3931 destination, but a 24 bit branch in a stub section will reach.
3932 . b dest
3933
3934 ppc_stub_plt_branch:
3935 Similar to the above, but a 24 bit branch in the stub section won't
3936 reach its destination.
71a39c98
AM
3937 . addis %r11,%r2,xxx@toc@ha
3938 . ld %r12,xxx@toc@l(%r11)
3939 . mtctr %r12
721956f4
AM
3940 . bctr
3941
3942 ppc_stub_plt_call:
2c66dc6c
AM
3943 Used to call a function in a shared library. If it so happens that
3944 the plt entry referenced crosses a 64k boundary, then an extra
71a39c98 3945 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
721956f4 3946 . std %r2,40(%r1)
71a39c98
AM
3947 . addis %r11,%r2,xxx@toc@ha
3948 . ld %r12,xxx+0@toc@l(%r11)
3949 . mtctr %r12
3950 . ld %r2,xxx+8@toc@l(%r11)
3951 . ld %r11,xxx+16@toc@l(%r11)
721956f4 3952 . bctr
ad8e1ba5
AM
3953
3954 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3955 code to adjust the value and save r2 to support multiple toc sections.
3956 A ppc_stub_long_branch with an r2 offset looks like:
3957 . std %r2,40(%r1)
3958 . addis %r2,%r2,off@ha
3959 . addi %r2,%r2,off@l
3960 . b dest
3961
3962 A ppc_stub_plt_branch with an r2 offset looks like:
3963 . std %r2,40(%r1)
71a39c98
AM
3964 . addis %r11,%r2,xxx@toc@ha
3965 . ld %r12,xxx@toc@l(%r11)
ad8e1ba5
AM
3966 . addis %r2,%r2,off@ha
3967 . addi %r2,%r2,off@l
71a39c98 3968 . mtctr %r12
ad8e1ba5 3969 . bctr
ac2df442
AM
3970
3971 In cases where the "addis" instruction would add zero, the "addis" is
3972 omitted and following instructions modified slightly in some cases.
721956f4
AM
3973*/
3974
3975enum ppc_stub_type {
3976 ppc_stub_none,
3977 ppc_stub_long_branch,
ad8e1ba5 3978 ppc_stub_long_branch_r2off,
721956f4 3979 ppc_stub_plt_branch,
ad8e1ba5 3980 ppc_stub_plt_branch_r2off,
794e51c0 3981 ppc_stub_plt_call,
7341d5e2 3982 ppc_stub_plt_call_r2save,
a4b6fadd
AM
3983 ppc_stub_global_entry,
3984 ppc_stub_save_res
721956f4
AM
3985};
3986
6f20ed8a
AM
3987/* Information on stub grouping. */
3988struct map_stub
3989{
3990 /* The stub section. */
3991 asection *stub_sec;
3992 /* This is the section to which stubs in the group will be attached. */
3993 asection *link_sec;
a4b6fadd
AM
3994 /* Next group. */
3995 struct map_stub *next;
3996 /* Whether to emit a copy of register save/restore functions in this
3997 group. */
3998 int needs_save_res;
d4aaa2a0
AM
3999 /* The offset of the __tls_get_addr_opt plt stub bctrl in this group,
4000 or -1u if no such stub with bctrl exists. */
4001 unsigned int tls_get_addr_opt_bctrl;
6f20ed8a
AM
4002};
4003
721956f4
AM
4004struct ppc_stub_hash_entry {
4005
4006 /* Base hash table entry structure. */
4007 struct bfd_hash_entry root;
4008
ad8e1ba5
AM
4009 enum ppc_stub_type stub_type;
4010
6f20ed8a
AM
4011 /* Group information. */
4012 struct map_stub *group;
721956f4
AM
4013
4014 /* Offset within stub_sec of the beginning of this stub. */
4015 bfd_vma stub_offset;
4016
4017 /* Given the symbol's value and its section we can determine its final
4018 value when building the stubs (so the stub knows where to jump. */
4019 bfd_vma target_value;
4020 asection *target_section;
4021
721956f4
AM
4022 /* The symbol table entry, if any, that this was derived from. */
4023 struct ppc_link_hash_entry *h;
e054468f 4024 struct plt_entry *plt_ent;
721956f4 4025
2d7ad24e
AM
4026 /* Symbol type. */
4027 unsigned char symtype;
4028
6911b7dc
AM
4029 /* Symbol st_other. */
4030 unsigned char other;
721956f4
AM
4031};
4032
4033struct ppc_branch_hash_entry {
4034
4035 /* Base hash table entry structure. */
4036 struct bfd_hash_entry root;
4037
c456f082 4038 /* Offset within branch lookup table. */
721956f4
AM
4039 unsigned int offset;
4040
4041 /* Generation marker. */
4042 unsigned int iter;
4043};
65f38f15 4044
19e08130
AM
4045/* Used to track dynamic relocations for local symbols. */
4046struct ppc_dyn_relocs
4047{
4048 struct ppc_dyn_relocs *next;
4049
4050 /* The input section of the reloc. */
4051 asection *sec;
4052
4053 /* Total number of relocs copied for the input section. */
4054 unsigned int count : 31;
4055
4056 /* Whether this entry is for STT_GNU_IFUNC symbols. */
4057 unsigned int ifunc : 1;
4058};
4059
65f38f15
AM
4060struct ppc_link_hash_entry
4061{
4062 struct elf_link_hash_entry elf;
4063
b3fac117
AM
4064 union {
4065 /* A pointer to the most recently used stub hash entry against this
4066 symbol. */
4067 struct ppc_stub_hash_entry *stub_cache;
4068
4069 /* A pointer to the next symbol starting with a '.' */
4070 struct ppc_link_hash_entry *next_dot_sym;
4071 } u;
721956f4 4072
65f38f15 4073 /* Track dynamic relocs copied for this symbol. */
6061a67d 4074 struct elf_dyn_relocs *dyn_relocs;
e86ce104 4075
721956f4 4076 /* Link between function code and descriptor symbols. */
34814b9f 4077 struct ppc_link_hash_entry *oh;
721956f4 4078
e86ce104
AM
4079 /* Flag function code and descriptor symbols. */
4080 unsigned int is_func:1;
4081 unsigned int is_func_descriptor:1;
908b32fc 4082 unsigned int fake:1;
411e1bfb 4083
c5614fa4
AM
4084 /* Whether global opd/toc sym has been adjusted or not.
4085 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
4086 should be set for all globals defined in any opd/toc section. */
754021d0
AM
4087 unsigned int adjust_done:1;
4088
a4b6fadd
AM
4089 /* Set if this is an out-of-line register save/restore function,
4090 with non-standard calling convention. */
4091 unsigned int save_res:1;
4092
8b5f1ed8
AM
4093 /* Set if a duplicate symbol with non-zero localentry is detected,
4094 even when the duplicate symbol does not provide a definition. */
4095 unsigned int non_zero_localentry:1;
4096
411e1bfb 4097 /* Contexts in which symbol is used in the GOT (or TOC).
37da22e5
AM
4098 Bits are or'd into the mask as the corresponding relocs are
4099 encountered during check_relocs, with TLS_TLS being set when any
4100 of the other TLS bits are set. tls_optimize clears bits when
4101 optimizing to indicate the corresponding GOT entry type is not
4102 needed. If set, TLS_TLS is never cleared. tls_optimize may also
4103 set TLS_TPRELGD when a GD reloc turns into a TPREL one. We use a
4104 separate flag rather than setting TPREL just for convenience in
4105 distinguishing the two cases.
4106 These flags are also kept for local symbols. */
4107#define TLS_TLS 1 /* Any TLS reloc. */
4108#define TLS_GD 2 /* GD reloc. */
4109#define TLS_LD 4 /* LD reloc. */
4110#define TLS_TPREL 8 /* TPREL reloc, => IE. */
4111#define TLS_DTPREL 16 /* DTPREL reloc, => LD. */
4112#define TLS_MARK 32 /* __tls_get_addr call marked. */
e7b938ca 4113#define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
37da22e5 4114#define TLS_EXPLICIT 128 /* Marks TOC section TLS relocs. */
f961d9dd 4115 unsigned char tls_mask;
37da22e5
AM
4116
4117 /* The above field is also used to mark function symbols. In which
4118 case TLS_TLS will be 0. */
4119#define PLT_IFUNC 2 /* STT_GNU_IFUNC. */
2d7ad24e 4120#define PLT_KEEP 4 /* inline plt call requires plt entry. */
37da22e5 4121#define NON_GOT 256 /* local symbol plt, not stored. */
65f38f15
AM
4122};
4123
4124/* ppc64 ELF linker hash table. */
4125
4126struct ppc_link_hash_table
4127{
4128 struct elf_link_hash_table elf;
4129
721956f4
AM
4130 /* The stub hash table. */
4131 struct bfd_hash_table stub_hash_table;
4132
4133 /* Another hash table for plt_branch stubs. */
4134 struct bfd_hash_table branch_hash_table;
4135
3b421ab3
AM
4136 /* Hash table for function prologue tocsave. */
4137 htab_t tocsave_htab;
4138
e7d1c40c
AM
4139 /* Various options and other info passed from the linker. */
4140 struct ppc64_elf_params *params;
721956f4 4141
6f20ed8a
AM
4142 /* The size of sec_info below. */
4143 unsigned int sec_info_arr_size;
4144
4145 /* Per-section array of extra section info. Done this way rather
4146 than as part of ppc64_elf_section_data so we have the info for
4147 non-ppc64 sections. */
4148 struct
4149 {
4150 /* Along with elf_gp, specifies the TOC pointer used by this section. */
ad8e1ba5 4151 bfd_vma toc_off;
6f20ed8a
AM
4152
4153 union
4154 {
4155 /* The section group that this section belongs to. */
4156 struct map_stub *group;
4157 /* A temp section list pointer. */
4158 asection *list;
4159 } u;
4160 } *sec_info;
721956f4 4161
a4b6fadd
AM
4162 /* Linked list of groups. */
4163 struct map_stub *group;
4164
ad8e1ba5
AM
4165 /* Temp used when calculating TOC pointers. */
4166 bfd_vma toc_curr;
bf102f86
AM
4167 bfd *toc_bfd;
4168 asection *toc_first_sec;
ad8e1ba5 4169
b3fac117
AM
4170 /* Used when adding symbols. */
4171 struct ppc_link_hash_entry *dot_syms;
4172
33e44f2e 4173 /* Shortcuts to get to dynamic linker sections. */
4ce794b7 4174 asection *glink;
9e390558 4175 asection *global_entry;
82bd7b59 4176 asection *sfpr;
2d7ad24e
AM
4177 asection *pltlocal;
4178 asection *relpltlocal;
4ce794b7
AM
4179 asection *brlt;
4180 asection *relbrlt;
58d180e8 4181 asection *glink_eh_frame;
ec338859 4182
8387904d
AM
4183 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
4184 struct ppc_link_hash_entry *tls_get_addr;
4185 struct ppc_link_hash_entry *tls_get_addr_fd;
411e1bfb 4186
927be08e
AM
4187 /* The size of reliplt used by got entry relocs. */
4188 bfd_size_type got_reli_size;
4189
9b5ecbd0 4190 /* Statistics. */
7341d5e2 4191 unsigned long stub_count[ppc_stub_global_entry];
9b5ecbd0 4192
ee75fd95
AM
4193 /* Number of stubs against global syms. */
4194 unsigned long stub_globals;
4195
ee67d69a
AM
4196 /* Set if we're linking code with function descriptors. */
4197 unsigned int opd_abi:1;
4198
4c52953f 4199 /* Support for multiple toc sections. */
33c0ec9d 4200 unsigned int do_multi_toc:1;
4c52953f 4201 unsigned int multi_toc_needed:1;
927be08e 4202 unsigned int second_toc_pass:1;
67f0cbdb 4203 unsigned int do_toc_opt:1;
4c52953f 4204
9a23f96e
AM
4205 /* Set if tls optimization is enabled. */
4206 unsigned int do_tls_opt:1;
4207
3e04d765
AM
4208 /* Set if inline plt calls should be converted to direct calls. */
4209 unsigned int can_convert_all_inline_plt:1;
4210
5d1634d7 4211 /* Set on error. */
99877b66 4212 unsigned int stub_error:1;
721956f4 4213
8c5b4e52
AM
4214 /* Whether func_desc_adjust needs to be run over symbols. */
4215 unsigned int need_func_desc_adj:1;
721956f4 4216
82e66161
AM
4217 /* Whether there exist local gnu indirect function resolvers,
4218 referenced by dynamic relocations. */
4219 unsigned int local_ifunc_resolver:1;
4220 unsigned int maybe_local_ifunc_resolver:1;
4221
f378ab09
AM
4222 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
4223 unsigned int has_plt_localentry0:1;
4224
721956f4
AM
4225 /* Incremented every time we size stubs. */
4226 unsigned int stub_iteration;
5d1634d7 4227
87d72d41
AM
4228 /* Small local sym cache. */
4229 struct sym_cache sym_cache;
65f38f15
AM
4230};
4231
4c52953f
AM
4232/* Rename some of the generic section flags to better document how they
4233 are used here. */
b0dddeec
AM
4234
4235/* Nonzero if this section has TLS related relocations. */
4236#define has_tls_reloc sec_flg0
4237
23cedd1d 4238/* Nonzero if this section has an old-style call to __tls_get_addr. */
b0dddeec
AM
4239#define has_tls_get_addr_call sec_flg1
4240
4241/* Nonzero if this section has any toc or got relocs. */
4242#define has_toc_reloc sec_flg2
4243
4244/* Nonzero if this section has a call to another section that uses
4245 the toc or got. */
d77c8a4b 4246#define makes_toc_func_call sec_flg3
b0dddeec
AM
4247
4248/* Recursion protection when determining above flag. */
d77c8a4b 4249#define call_check_in_progress sec_flg4
70cc837d 4250#define call_check_done sec_flg5
4c52953f 4251
65f38f15
AM
4252/* Get the ppc64 ELF linker hash table from a link_info structure. */
4253
4254#define ppc_hash_table(p) \
4dfe6ac6
NC
4255 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
4256 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
65f38f15 4257
721956f4
AM
4258#define ppc_stub_hash_lookup(table, string, create, copy) \
4259 ((struct ppc_stub_hash_entry *) \
4260 bfd_hash_lookup ((table), (string), (create), (copy)))
4261
4262#define ppc_branch_hash_lookup(table, string, create, copy) \
4263 ((struct ppc_branch_hash_entry *) \
4264 bfd_hash_lookup ((table), (string), (create), (copy)))
4265
4266/* Create an entry in the stub hash table. */
4267
4268static struct bfd_hash_entry *
4ce794b7
AM
4269stub_hash_newfunc (struct bfd_hash_entry *entry,
4270 struct bfd_hash_table *table,
4271 const char *string)
721956f4
AM
4272{
4273 /* Allocate the structure if it has not already been allocated by a
4274 subclass. */
4275 if (entry == NULL)
4276 {
4277 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
4278 if (entry == NULL)
4279 return entry;
4280 }
4281
4282 /* Call the allocation method of the superclass. */
4283 entry = bfd_hash_newfunc (entry, table, string);
4284 if (entry != NULL)
4285 {
4286 struct ppc_stub_hash_entry *eh;
4287
4288 /* Initialize the local fields. */
4289 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 4290 eh->stub_type = ppc_stub_none;
6f20ed8a 4291 eh->group = NULL;
721956f4
AM
4292 eh->stub_offset = 0;
4293 eh->target_value = 0;
4294 eh->target_section = NULL;
721956f4 4295 eh->h = NULL;
6911b7dc 4296 eh->plt_ent = NULL;
6911b7dc 4297 eh->other = 0;
721956f4
AM
4298 }
4299
4300 return entry;
4301}
4302
4303/* Create an entry in the branch hash table. */
4304
4305static struct bfd_hash_entry *
4ce794b7
AM
4306branch_hash_newfunc (struct bfd_hash_entry *entry,
4307 struct bfd_hash_table *table,
4308 const char *string)
721956f4
AM
4309{
4310 /* Allocate the structure if it has not already been allocated by a
4311 subclass. */
4312 if (entry == NULL)
4313 {
4314 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4315 if (entry == NULL)
4316 return entry;
4317 }
4318
4319 /* Call the allocation method of the superclass. */
4320 entry = bfd_hash_newfunc (entry, table, string);
4321 if (entry != NULL)
4322 {
4323 struct ppc_branch_hash_entry *eh;
4324
4325 /* Initialize the local fields. */
4326 eh = (struct ppc_branch_hash_entry *) entry;
4327 eh->offset = 0;
4328 eh->iter = 0;
4329 }
4330
4331 return entry;
4332}
4333
65f38f15
AM
4334/* Create an entry in a ppc64 ELF linker hash table. */
4335
4336static struct bfd_hash_entry *
4ce794b7
AM
4337link_hash_newfunc (struct bfd_hash_entry *entry,
4338 struct bfd_hash_table *table,
4339 const char *string)
65f38f15
AM
4340{
4341 /* Allocate the structure if it has not already been allocated by a
4342 subclass. */
4343 if (entry == NULL)
4344 {
4345 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4346 if (entry == NULL)
4347 return entry;
4348 }
4349
4350 /* Call the allocation method of the superclass. */
4351 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4352 if (entry != NULL)
4353 {
4354 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4355
b3fac117 4356 memset (&eh->u.stub_cache, 0,
908b32fc 4357 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
4358 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4359
4360 /* When making function calls, old ABI code references function entry
4361 points (dot symbols), while new ABI code references the function
4362 descriptor symbol. We need to make any combination of reference and
4363 definition work together, without breaking archive linking.
4364
4365 For a defined function "foo" and an undefined call to "bar":
4366 An old object defines "foo" and ".foo", references ".bar" (possibly
4367 "bar" too).
4368 A new object defines "foo" and references "bar".
4369
4370 A new object thus has no problem with its undefined symbols being
4371 satisfied by definitions in an old object. On the other hand, the
4372 old object won't have ".bar" satisfied by a new object.
4373
4374 Keep a list of newly added dot-symbols. */
4375
4376 if (string[0] == '.')
4377 {
4378 struct ppc_link_hash_table *htab;
4379
4380 htab = (struct ppc_link_hash_table *) table;
4381 eh->u.next_dot_sym = htab->dot_syms;
4382 htab->dot_syms = eh;
4383 }
65f38f15
AM
4384 }
4385
4386 return entry;
4387}
4388
3b421ab3
AM
4389struct tocsave_entry {
4390 asection *sec;
4391 bfd_vma offset;
4392};
4393
4394static hashval_t
4395tocsave_htab_hash (const void *p)
4396{
4397 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4aef7643 4398 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
3b421ab3
AM
4399}
4400
4401static int
4402tocsave_htab_eq (const void *p1, const void *p2)
4403{
4404 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4405 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4406 return e1->sec == e2->sec && e1->offset == e2->offset;
4407}
4408
68faa637
AM
4409/* Destroy a ppc64 ELF linker hash table. */
4410
4411static void
d495ab0d 4412ppc64_elf_link_hash_table_free (bfd *obfd)
68faa637 4413{
d495ab0d 4414 struct ppc_link_hash_table *htab;
68faa637 4415
d495ab0d 4416 htab = (struct ppc_link_hash_table *) obfd->link.hash;
68faa637
AM
4417 if (htab->tocsave_htab)
4418 htab_delete (htab->tocsave_htab);
d495ab0d
AM
4419 bfd_hash_table_free (&htab->branch_hash_table);
4420 bfd_hash_table_free (&htab->stub_hash_table);
4421 _bfd_elf_link_hash_table_free (obfd);
68faa637
AM
4422}
4423
65f38f15
AM
4424/* Create a ppc64 ELF linker hash table. */
4425
4426static struct bfd_link_hash_table *
4ce794b7 4427ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
4428{
4429 struct ppc_link_hash_table *htab;
4430 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4431
4ce794b7 4432 htab = bfd_zmalloc (amt);
65f38f15
AM
4433 if (htab == NULL)
4434 return NULL;
4435
66eb6687 4436 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
4437 sizeof (struct ppc_link_hash_entry),
4438 PPC64_ELF_DATA))
65f38f15 4439 {
e2d34d7d 4440 free (htab);
65f38f15
AM
4441 return NULL;
4442 }
4443
721956f4 4444 /* Init the stub hash table too. */
66eb6687
AM
4445 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4446 sizeof (struct ppc_stub_hash_entry)))
2915c55b 4447 {
d495ab0d 4448 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
4449 return NULL;
4450 }
721956f4
AM
4451
4452 /* And the branch hash table. */
66eb6687
AM
4453 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4454 sizeof (struct ppc_branch_hash_entry)))
2915c55b
JK
4455 {
4456 bfd_hash_table_free (&htab->stub_hash_table);
d495ab0d 4457 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
4458 return NULL;
4459 }
721956f4 4460
3b421ab3
AM
4461 htab->tocsave_htab = htab_try_create (1024,
4462 tocsave_htab_hash,
4463 tocsave_htab_eq,
4464 NULL);
4465 if (htab->tocsave_htab == NULL)
2915c55b 4466 {
d495ab0d 4467 ppc64_elf_link_hash_table_free (abfd);
2915c55b
JK
4468 return NULL;
4469 }
d495ab0d 4470 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
3b421ab3 4471
3254fd24
AM
4472 /* Initializing two fields of the union is just cosmetic. We really
4473 only care about glist, but when compiled on a 32-bit host the
4474 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4475 debugger inspection of these fields look nicer. */
a6aa5195
AM
4476 htab->elf.init_got_refcount.refcount = 0;
4477 htab->elf.init_got_refcount.glist = NULL;
4478 htab->elf.init_plt_refcount.refcount = 0;
4479 htab->elf.init_plt_refcount.glist = NULL;
4480 htab->elf.init_got_offset.offset = 0;
4481 htab->elf.init_got_offset.glist = NULL;
4482 htab->elf.init_plt_offset.offset = 0;
4483 htab->elf.init_plt_offset.glist = NULL;
3254fd24 4484
65f38f15
AM
4485 return &htab->elf.root;
4486}
4487
bfeb4a28
AM
4488/* Create sections for linker generated code. */
4489
4490static bfd_boolean
4491create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4492{
4493 struct ppc_link_hash_table *htab;
4494 flagword flags;
4495
4496 htab = ppc_hash_table (info);
4497
bfeb4a28
AM
4498 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4499 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
b32547cd
AM
4500 if (htab->params->save_restore_funcs)
4501 {
4502 /* Create .sfpr for code to save and restore fp regs. */
4503 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4504 flags);
4505 if (htab->sfpr == NULL
4506 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4507 return FALSE;
4508 }
4509
4510 if (bfd_link_relocatable (info))
4511 return TRUE;
bfeb4a28
AM
4512
4513 /* Create .glink for lazy dynamic linking support. */
4514 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4515 flags);
4516 if (htab->glink == NULL
4517 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4518 return FALSE;
4519
9e390558
AM
4520 /* The part of .glink used by global entry stubs, separate so that
4521 it can be aligned appropriately without affecting htab->glink. */
4522 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4523 flags);
4524 if (htab->global_entry == NULL
4525 || ! bfd_set_section_alignment (dynobj, htab->global_entry, 2))
4526 return FALSE;
4527
bfeb4a28
AM
4528 if (!info->no_ld_generated_unwind_info)
4529 {
4530 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4531 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4532 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4533 ".eh_frame",
4534 flags);
4535 if (htab->glink_eh_frame == NULL
4536 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4537 return FALSE;
4538 }
4539
4540 flags = SEC_ALLOC | SEC_LINKER_CREATED;
33e44f2e
AM
4541 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4542 if (htab->elf.iplt == NULL
4543 || ! bfd_set_section_alignment (dynobj, htab->elf.iplt, 3))
bfeb4a28
AM
4544 return FALSE;
4545
4546 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4547 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
33e44f2e
AM
4548 htab->elf.irelplt
4549 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
4550 if (htab->elf.irelplt == NULL
4551 || ! bfd_set_section_alignment (dynobj, htab->elf.irelplt, 3))
bfeb4a28
AM
4552 return FALSE;
4553
4554 /* Create branch lookup table for plt_branch stubs. */
4555 flags = (SEC_ALLOC | SEC_LOAD
4556 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4557 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4558 flags);
4559 if (htab->brlt == NULL
4560 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4561 return FALSE;
4562
2d7ad24e
AM
4563 /* Local plt entries, put in .branch_lt but a separate section for
4564 convenience. */
4565 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4566 flags);
4567 if (htab->pltlocal == NULL
4568 || ! bfd_set_section_alignment (dynobj, htab->pltlocal, 3))
4569 return FALSE;
4570
0e1862bb 4571 if (!bfd_link_pic (info))
bfeb4a28
AM
4572 return TRUE;
4573
4574 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4575 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2d7ad24e
AM
4576 htab->relbrlt
4577 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
bfeb4a28
AM
4578 if (htab->relbrlt == NULL
4579 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4580 return FALSE;
4581
2d7ad24e
AM
4582 htab->relpltlocal
4583 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
4584 if (htab->relpltlocal == NULL
4585 || ! bfd_set_section_alignment (dynobj, htab->relpltlocal, 3))
4586 return FALSE;
4587
bfeb4a28
AM
4588 return TRUE;
4589}
4590
e717da7e
AM
4591/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4592
bfeb4a28 4593bfd_boolean
e7d1c40c
AM
4594ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
4595 struct ppc64_elf_params *params)
e717da7e
AM
4596{
4597 struct ppc_link_hash_table *htab;
4598
e7d1c40c 4599 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
e717da7e
AM
4600
4601/* Always hook our dynamic sections into the first bfd, which is the
4602 linker created stub bfd. This ensures that the GOT header is at
4603 the start of the output TOC section. */
4604 htab = ppc_hash_table (info);
e7d1c40c
AM
4605 htab->elf.dynobj = params->stub_bfd;
4606 htab->params = params;
bfeb4a28 4607
bfeb4a28 4608 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
4609}
4610
721956f4
AM
4611/* Build a name for an entry in the stub hash table. */
4612
4613static char *
4ce794b7
AM
4614ppc_stub_name (const asection *input_section,
4615 const asection *sym_sec,
4616 const struct ppc_link_hash_entry *h,
4617 const Elf_Internal_Rela *rel)
721956f4
AM
4618{
4619 char *stub_name;
bcaa2f82 4620 ssize_t len;
721956f4
AM
4621
4622 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4623 offsets from a sym as a branch target? In fact, we could
4624 probably assume the addend is always zero. */
4625 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4626
4627 if (h)
4628 {
4629 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4630 stub_name = bfd_malloc (len);
46de2a7c
AM
4631 if (stub_name == NULL)
4632 return stub_name;
4633
bcaa2f82
AM
4634 len = sprintf (stub_name, "%08x.%s+%x",
4635 input_section->id & 0xffffffff,
4636 h->elf.root.root.string,
4637 (int) rel->r_addend & 0xffffffff);
721956f4
AM
4638 }
4639 else
4640 {
ad8e1ba5 4641 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 4642 stub_name = bfd_malloc (len);
46de2a7c
AM
4643 if (stub_name == NULL)
4644 return stub_name;
4645
bcaa2f82
AM
4646 len = sprintf (stub_name, "%08x.%x:%x+%x",
4647 input_section->id & 0xffffffff,
4648 sym_sec->id & 0xffffffff,
4649 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4650 (int) rel->r_addend & 0xffffffff);
721956f4 4651 }
bcaa2f82 4652 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 4653 stub_name[len - 2] = 0;
721956f4
AM
4654 return stub_name;
4655}
4656
4657/* Look up an entry in the stub hash. Stub entries are cached because
4658 creating the stub name takes a bit of time. */
4659
4660static struct ppc_stub_hash_entry *
4ce794b7
AM
4661ppc_get_stub_entry (const asection *input_section,
4662 const asection *sym_sec,
039b3fef 4663 struct ppc_link_hash_entry *h,
4ce794b7
AM
4664 const Elf_Internal_Rela *rel,
4665 struct ppc_link_hash_table *htab)
721956f4
AM
4666{
4667 struct ppc_stub_hash_entry *stub_entry;
6f20ed8a 4668 struct map_stub *group;
721956f4
AM
4669
4670 /* If this input section is part of a group of sections sharing one
4671 stub section, then use the id of the first section in the group.
4672 Stub names need to include a section id, as there may well be
4673 more than one stub used to reach say, printf, and we need to
4674 distinguish between them. */
6f20ed8a 4675 group = htab->sec_info[input_section->id].u.group;
89d77b8a
AM
4676 if (group == NULL)
4677 return NULL;
721956f4 4678
b3fac117
AM
4679 if (h != NULL && h->u.stub_cache != NULL
4680 && h->u.stub_cache->h == h
6f20ed8a 4681 && h->u.stub_cache->group == group)
721956f4 4682 {
b3fac117 4683 stub_entry = h->u.stub_cache;
721956f4
AM
4684 }
4685 else
4686 {
4687 char *stub_name;
4688
6f20ed8a 4689 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
721956f4
AM
4690 if (stub_name == NULL)
4691 return NULL;
4692
4693 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 4694 stub_name, FALSE, FALSE);
721956f4 4695 if (h != NULL)
b3fac117 4696 h->u.stub_cache = stub_entry;
721956f4
AM
4697
4698 free (stub_name);
4699 }
4700
4701 return stub_entry;
4702}
4703
4704/* Add a new stub entry to the stub hash. Not all fields of the new
4705 stub entry are initialised. */
4706
4707static struct ppc_stub_hash_entry *
4ce794b7
AM
4708ppc_add_stub (const char *stub_name,
4709 asection *section,
25f53a85 4710 struct bfd_link_info *info)
721956f4 4711{
25f53a85 4712 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 4713 struct map_stub *group;
721956f4
AM
4714 asection *link_sec;
4715 asection *stub_sec;
4716 struct ppc_stub_hash_entry *stub_entry;
4717
6f20ed8a
AM
4718 group = htab->sec_info[section->id].u.group;
4719 link_sec = group->link_sec;
4720 stub_sec = group->stub_sec;
721956f4
AM
4721 if (stub_sec == NULL)
4722 {
6f20ed8a
AM
4723 size_t namelen;
4724 bfd_size_type len;
4725 char *s_name;
721956f4 4726
6f20ed8a
AM
4727 namelen = strlen (link_sec->name);
4728 len = namelen + sizeof (STUB_SUFFIX);
4729 s_name = bfd_alloc (htab->params->stub_bfd, len);
4730 if (s_name == NULL)
4731 return NULL;
721956f4 4732
6f20ed8a
AM
4733 memcpy (s_name, link_sec->name, namelen);
4734 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4735 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
4736 if (stub_sec == NULL)
4737 return NULL;
4738 group->stub_sec = stub_sec;
721956f4
AM
4739 }
4740
4741 /* Enter this entry into the linker stub hash table. */
4742 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 4743 TRUE, FALSE);
721956f4
AM
4744 if (stub_entry == NULL)
4745 {
695344c0 4746 /* xgettext:c-format */
cf97bcb0
AM
4747 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
4748 section->owner, stub_name);
721956f4
AM
4749 return NULL;
4750 }
4751
6f20ed8a 4752 stub_entry->group = group;
721956f4 4753 stub_entry->stub_offset = 0;
721956f4
AM
4754 return stub_entry;
4755}
4756
e717da7e
AM
4757/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4758 not already done. */
65f38f15 4759
b34976b6 4760static bfd_boolean
e717da7e 4761create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 4762{
e717da7e
AM
4763 asection *got, *relgot;
4764 flagword flags;
4765 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 4766
0c8d6e5c 4767 if (!is_ppc64_elf (abfd))
0ffa91dd 4768 return FALSE;
4dfe6ac6
NC
4769 if (htab == NULL)
4770 return FALSE;
0ffa91dd 4771
33e44f2e
AM
4772 if (!htab->elf.sgot
4773 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
4774 return FALSE;
e717da7e
AM
4775
4776 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4777 | SEC_LINKER_CREATED);
4778
c456f082 4779 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 4780 if (!got
e717da7e
AM
4781 || !bfd_set_section_alignment (abfd, got, 3))
4782 return FALSE;
65f38f15 4783
c456f082
AM
4784 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4785 flags | SEC_READONLY);
e717da7e 4786 if (!relgot
e717da7e 4787 || ! bfd_set_section_alignment (abfd, relgot, 3))
b34976b6 4788 return FALSE;
e717da7e
AM
4789
4790 ppc64_elf_tdata (abfd)->got = got;
4791 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 4792 return TRUE;
65f38f15 4793}
5bd4f169 4794
b31867b6
AM
4795/* Follow indirect and warning symbol links. */
4796
4797static inline struct bfd_link_hash_entry *
4798follow_link (struct bfd_link_hash_entry *h)
4799{
4800 while (h->type == bfd_link_hash_indirect
4801 || h->type == bfd_link_hash_warning)
4802 h = h->u.i.link;
4803 return h;
4804}
4805
4806static inline struct elf_link_hash_entry *
4807elf_follow_link (struct elf_link_hash_entry *h)
4808{
4809 return (struct elf_link_hash_entry *) follow_link (&h->root);
4810}
4811
4812static inline struct ppc_link_hash_entry *
4813ppc_follow_link (struct ppc_link_hash_entry *h)
4814{
4815 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4816}
4817
40d16e0b
AM
4818/* Merge PLT info on FROM with that on TO. */
4819
4820static void
4821move_plt_plist (struct ppc_link_hash_entry *from,
4822 struct ppc_link_hash_entry *to)
4823{
4824 if (from->elf.plt.plist != NULL)
4825 {
4826 if (to->elf.plt.plist != NULL)
4827 {
4828 struct plt_entry **entp;
4829 struct plt_entry *ent;
4830
4831 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4832 {
4833 struct plt_entry *dent;
4834
4835 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4836 if (dent->addend == ent->addend)
4837 {
4838 dent->plt.refcount += ent->plt.refcount;
4839 *entp = ent->next;
4840 break;
4841 }
4842 if (dent == NULL)
4843 entp = &ent->next;
4844 }
4845 *entp = to->elf.plt.plist;
4846 }
4847
4848 to->elf.plt.plist = from->elf.plt.plist;
4849 from->elf.plt.plist = NULL;
4850 }
4851}
4852
65f38f15
AM
4853/* Copy the extra info we tack onto an elf_link_hash_entry. */
4854
4855static void
fcfa13d2
AM
4856ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4857 struct elf_link_hash_entry *dir,
4858 struct elf_link_hash_entry *ind)
65f38f15
AM
4859{
4860 struct ppc_link_hash_entry *edir, *eind;
4861
4862 edir = (struct ppc_link_hash_entry *) dir;
4863 eind = (struct ppc_link_hash_entry *) ind;
4864
c79d6685
AM
4865 edir->is_func |= eind->is_func;
4866 edir->is_func_descriptor |= eind->is_func_descriptor;
4867 edir->tls_mask |= eind->tls_mask;
4868 if (eind->oh != NULL)
4869 edir->oh = ppc_follow_link (eind->oh);
4870
474436e6 4871 if (edir->elf.versioned != versioned_hidden)
e81830c5
AM
4872 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4873 edir->elf.ref_regular |= eind->elf.ref_regular;
4874 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4a7e5234 4875 edir->elf.non_got_ref |= eind->elf.non_got_ref;
e81830c5
AM
4876 edir->elf.needs_plt |= eind->elf.needs_plt;
4877 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
c79d6685 4878
d311bc8b
AM
4879 /* If we were called to copy over info for a weak sym, don't copy
4880 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
4881 in order to simplify readonly_dynrelocs and save a field in the
4882 symbol hash entry, but that means dyn_relocs can't be used in any
4883 tests about a specific symbol, or affect other symbol flags which
ab2477e1 4884 are then tested. */
d311bc8b 4885 if (eind->elf.root.type != bfd_link_hash_indirect)
ab2477e1 4886 return;
d311bc8b 4887
411e1bfb 4888 /* Copy over any dynamic relocs we may have on the indirect sym. */
bbd7ec4a 4889 if (eind->dyn_relocs != NULL)
65f38f15 4890 {
bbd7ec4a
AM
4891 if (edir->dyn_relocs != NULL)
4892 {
6061a67d
AM
4893 struct elf_dyn_relocs **pp;
4894 struct elf_dyn_relocs *p;
bbd7ec4a 4895
fcfa13d2 4896 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a
AM
4897 list. Merge any entries against the same section. */
4898 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4899 {
6061a67d 4900 struct elf_dyn_relocs *q;
bbd7ec4a
AM
4901
4902 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4903 if (q->sec == p->sec)
4904 {
4905 q->pc_count += p->pc_count;
4906 q->count += p->count;
4907 *pp = p->next;
4908 break;
4909 }
4910 if (q == NULL)
4911 pp = &p->next;
4912 }
4913 *pp = edir->dyn_relocs;
4914 }
4915
65f38f15
AM
4916 edir->dyn_relocs = eind->dyn_relocs;
4917 eind->dyn_relocs = NULL;
4918 }
65f38f15 4919
81848ca0
AM
4920 /* Copy over got entries that we may have already seen to the
4921 symbol which just became indirect. */
411e1bfb
AM
4922 if (eind->elf.got.glist != NULL)
4923 {
4924 if (edir->elf.got.glist != NULL)
4925 {
4926 struct got_entry **entp;
4927 struct got_entry *ent;
4928
4929 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4930 {
4931 struct got_entry *dent;
4932
4933 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4934 if (dent->addend == ent->addend
e717da7e 4935 && dent->owner == ent->owner
411e1bfb
AM
4936 && dent->tls_type == ent->tls_type)
4937 {
4938 dent->got.refcount += ent->got.refcount;
4939 *entp = ent->next;
4940 break;
4941 }
4942 if (dent == NULL)
4943 entp = &ent->next;
4944 }
4945 *entp = edir->elf.got.glist;
4946 }
4947
4948 edir->elf.got.glist = eind->elf.got.glist;
4949 eind->elf.got.glist = NULL;
4950 }
4951
4952 /* And plt entries. */
40d16e0b 4953 move_plt_plist (eind, edir);
411e1bfb 4954
fcfa13d2 4955 if (eind->elf.dynindx != -1)
411e1bfb 4956 {
fcfa13d2
AM
4957 if (edir->elf.dynindx != -1)
4958 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4959 edir->elf.dynstr_index);
411e1bfb
AM
4960 edir->elf.dynindx = eind->elf.dynindx;
4961 edir->elf.dynstr_index = eind->elf.dynstr_index;
4962 eind->elf.dynindx = -1;
4963 eind->elf.dynstr_index = 0;
4964 }
411e1bfb
AM
4965}
4966
8387904d
AM
4967/* Find the function descriptor hash entry from the given function code
4968 hash entry FH. Link the entries via their OH fields. */
4969
4970static struct ppc_link_hash_entry *
b31867b6 4971lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
4972{
4973 struct ppc_link_hash_entry *fdh = fh->oh;
4974
4975 if (fdh == NULL)
4976 {
4977 const char *fd_name = fh->elf.root.root.string + 1;
4978
4979 fdh = (struct ppc_link_hash_entry *)
4980 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
b31867b6
AM
4981 if (fdh == NULL)
4982 return fdh;
4983
4984 fdh->is_func_descriptor = 1;
4985 fdh->oh = fh;
4986 fh->is_func = 1;
4987 fh->oh = fdh;
8387904d
AM
4988 }
4989
8c5b4e52
AM
4990 fdh = ppc_follow_link (fdh);
4991 fdh->is_func_descriptor = 1;
4992 fdh->oh = fh;
4993 return fdh;
8387904d
AM
4994}
4995
8c5b4e52 4996/* Make a fake function descriptor sym for the undefined code sym FH. */
bb700d78
AM
4997
4998static struct ppc_link_hash_entry *
4999make_fdh (struct bfd_link_info *info,
908b32fc 5000 struct ppc_link_hash_entry *fh)
bb700d78 5001{
8c5b4e52
AM
5002 bfd *abfd = fh->elf.root.u.undef.abfd;
5003 struct bfd_link_hash_entry *bh = NULL;
bb700d78 5004 struct ppc_link_hash_entry *fdh;
8c5b4e52
AM
5005 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
5006 ? BSF_WEAK
5007 : BSF_GLOBAL);
5008
5009 if (!_bfd_generic_link_add_one_symbol (info, abfd,
5010 fh->elf.root.root.string + 1,
5011 flags, bfd_und_section_ptr, 0,
5012 NULL, FALSE, FALSE, &bh))
bb700d78
AM
5013 return NULL;
5014
5015 fdh = (struct ppc_link_hash_entry *) bh;
5016 fdh->elf.non_elf = 0;
908b32fc
AM
5017 fdh->fake = 1;
5018 fdh->is_func_descriptor = 1;
5019 fdh->oh = fh;
5020 fh->is_func = 1;
5021 fh->oh = fdh;
bb700d78
AM
5022 return fdh;
5023}
5024
8387904d
AM
5025/* Fix function descriptor symbols defined in .opd sections to be
5026 function type. */
555cd476
AM
5027
5028static bfd_boolean
c16153ae 5029ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 5030 struct bfd_link_info *info,
555cd476 5031 Elf_Internal_Sym *isym,
6911b7dc 5032 const char **name,
555cd476
AM
5033 flagword *flags ATTRIBUTE_UNUSED,
5034 asection **sec,
b53dfeb2 5035 bfd_vma *value)
555cd476 5036{
a43942db 5037 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
f1885d1e
AM
5038 && (ibfd->flags & DYNAMIC) == 0
5039 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
a43942db 5040 elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
f64b2e8d 5041
b53dfeb2 5042 if (*sec != NULL
f1885d1e 5043 && strcmp ((*sec)->name, ".opd") == 0)
b53dfeb2
AM
5044 {
5045 asection *code_sec;
5046
5047 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
5048 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
5049 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
5050
5051 /* If the symbol is a function defined in .opd, and the function
5052 code is in a discarded group, let it appear to be undefined. */
0e1862bb 5053 if (!bfd_link_relocatable (info)
b53dfeb2
AM
5054 && (*sec)->reloc_count != 0
5055 && opd_entry_value (*sec, *value, &code_sec, NULL,
5056 FALSE) != (bfd_vma) -1
5057 && discarded_section (code_sec))
5058 {
5059 *sec = bfd_und_section_ptr;
5060 isym->st_shndx = SHN_UNDEF;
5061 }
5062 }
dbd1e97e
AM
5063 else if (*sec != NULL
5064 && strcmp ((*sec)->name, ".toc") == 0
5065 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
5066 {
5067 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5068 if (htab != NULL)
5069 htab->params->object_in_toc = 1;
5070 }
433817dd 5071
6911b7dc
AM
5072 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
5073 {
5074 if (abiversion (ibfd) == 0)
5075 set_abiversion (ibfd, 2);
5076 else if (abiversion (ibfd) == 1)
5077 {
cf97bcb0
AM
5078 _bfd_error_handler (_("symbol '%s' has invalid st_other"
5079 " for ABI version 1"), *name);
6911b7dc
AM
5080 bfd_set_error (bfd_error_bad_value);
5081 return FALSE;
5082 }
5083 }
5084
555cd476
AM
5085 return TRUE;
5086}
5087
6911b7dc
AM
5088/* Merge non-visibility st_other attributes: local entry point. */
5089
5090static void
5091ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
5092 const Elf_Internal_Sym *isym,
5093 bfd_boolean definition,
5094 bfd_boolean dynamic)
5095{
f378ab09 5096 if (definition && (!dynamic || !h->def_regular))
6911b7dc
AM
5097 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
5098 | ELF_ST_VISIBILITY (h->other));
5099}
5100
8c5b4e52
AM
5101/* Hook called on merging a symbol. We use this to clear "fake" since
5102 we now have a real symbol. */
5103
5104static bfd_boolean
5105ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
8b5f1ed8 5106 const Elf_Internal_Sym *isym,
8c5b4e52
AM
5107 asection **psec ATTRIBUTE_UNUSED,
5108 bfd_boolean newdef ATTRIBUTE_UNUSED,
5109 bfd_boolean olddef ATTRIBUTE_UNUSED,
5110 bfd *oldbfd ATTRIBUTE_UNUSED,
5111 const asection *oldsec ATTRIBUTE_UNUSED)
5112{
5113 ((struct ppc_link_hash_entry *) h)->fake = 0;
8b5f1ed8
AM
5114 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
5115 ((struct ppc_link_hash_entry *) h)->non_zero_localentry = 1;
8c5b4e52
AM
5116 return TRUE;
5117}
5118
8387904d 5119/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
5120 inclusion of a new ABI object archive that defines "bar".
5121 NAME is a symbol defined in an archive. Return a symbol in the hash
5122 table that might be satisfied by the archive symbols. */
8387904d
AM
5123
5124static struct elf_link_hash_entry *
5125ppc64_elf_archive_symbol_lookup (bfd *abfd,
5126 struct bfd_link_info *info,
5127 const char *name)
5128{
5129 struct elf_link_hash_entry *h;
5130 char *dot_name;
5131 size_t len;
5132
5133 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
5134 if (h != NULL
5135 /* Don't return this sym if it is a fake function descriptor
5136 created by add_symbol_adjust. */
8c5b4e52 5137 && !((struct ppc_link_hash_entry *) h)->fake)
8387904d
AM
5138 return h;
5139
5140 if (name[0] == '.')
5141 return h;
5142
5143 len = strlen (name);
5144 dot_name = bfd_alloc (abfd, len + 2);
5145 if (dot_name == NULL)
e99955cd 5146 return (struct elf_link_hash_entry *) -1;
8387904d
AM
5147 dot_name[0] = '.';
5148 memcpy (dot_name + 1, name, len + 1);
5149 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
5150 bfd_release (abfd, dot_name);
5151 return h;
5152}
5153
5154/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
5155 new ABI object defines "bar". Well, at least, undefined dot symbols
5156 are made weak. This stops later archive searches from including an
5157 object if we already have a function descriptor definition. It also
35b0ce59
AM
5158 prevents the linker complaining about undefined symbols.
5159 We also check and correct mismatched symbol visibility here. The
5160 most restrictive visibility of the function descriptor and the
5161 function entry symbol is used. */
8387904d
AM
5162
5163static bfd_boolean
b3fac117 5164add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 5165{
8387904d
AM
5166 struct ppc_link_hash_table *htab;
5167 struct ppc_link_hash_entry *fdh;
5168
b3fac117
AM
5169 if (eh->elf.root.type == bfd_link_hash_warning)
5170 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 5171
8400d40d
AM
5172 if (eh->elf.root.type == bfd_link_hash_indirect)
5173 return TRUE;
5174
b3fac117
AM
5175 if (eh->elf.root.root.string[0] != '.')
5176 abort ();
8387904d 5177
b3fac117 5178 htab = ppc_hash_table (info);
4dfe6ac6
NC
5179 if (htab == NULL)
5180 return FALSE;
5181
b31867b6 5182 fdh = lookup_fdh (eh, htab);
8c5b4e52
AM
5183 if (fdh == NULL
5184 && !bfd_link_relocatable (info)
5185 && (eh->elf.root.type == bfd_link_hash_undefined
5186 || eh->elf.root.type == bfd_link_hash_undefweak)
5187 && eh->elf.ref_regular)
5188 {
5189 /* Make an undefined function descriptor sym, in order to
5190 pull in an --as-needed shared lib. Archives are handled
5191 elsewhere. */
5192 fdh = make_fdh (info, eh);
5193 if (fdh == NULL)
5194 return FALSE;
bb700d78 5195 }
8c5b4e52
AM
5196
5197 if (fdh != NULL)
8387904d 5198 {
35b0ce59
AM
5199 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
5200 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
8c5b4e52
AM
5201
5202 /* Make both descriptor and entry symbol have the most
5203 constraining visibility of either symbol. */
35b0ce59
AM
5204 if (entry_vis < descr_vis)
5205 fdh->elf.other += entry_vis - descr_vis;
5206 else if (entry_vis > descr_vis)
5207 eh->elf.other += descr_vis - entry_vis;
5208
8c5b4e52
AM
5209 /* Propagate reference flags from entry symbol to function
5210 descriptor symbol. */
bc4e12de 5211 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
4070765b 5212 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
8c5b4e52
AM
5213 fdh->elf.ref_regular |= eh->elf.ref_regular;
5214 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
5215
5216 if (!fdh->elf.forced_local
5217 && fdh->elf.dynindx == -1
5218 && fdh->elf.versioned != versioned_hidden
5219 && (bfd_link_dll (info)
5220 || fdh->elf.def_dynamic
5221 || fdh->elf.ref_dynamic)
5222 && (eh->elf.ref_regular
5223 || eh->elf.def_regular))
5224 {
5225 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
5226 return FALSE;
35b0ce59 5227 }
8387904d 5228 }
99877b66 5229
8387904d
AM
5230 return TRUE;
5231}
5232
f6c7c3e8
AM
5233/* Set up opd section info and abiversion for IBFD, and process list
5234 of dot-symbols we made in link_hash_newfunc. */
b3fac117 5235
8387904d 5236static bfd_boolean
f6c7c3e8 5237ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
8387904d 5238{
99877b66 5239 struct ppc_link_hash_table *htab;
b3fac117 5240 struct ppc_link_hash_entry **p, *eh;
459609d6 5241 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
433817dd 5242
459609d6 5243 if (opd != NULL && opd->size != 0)
b3fac117 5244 {
b9399fcf
AM
5245 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
5246 ppc64_elf_section_data (opd)->sec_type = sec_opd;
5247
459609d6
AM
5248 if (abiversion (ibfd) == 0)
5249 set_abiversion (ibfd, 1);
8a2058b5 5250 else if (abiversion (ibfd) >= 2)
f6c7c3e8 5251 {
695344c0 5252 /* xgettext:c-format */
cf97bcb0
AM
5253 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"),
5254 ibfd, abiversion (ibfd));
459609d6
AM
5255 bfd_set_error (bfd_error_bad_value);
5256 return FALSE;
f6c7c3e8 5257 }
b9399fcf 5258 }
f6c7c3e8 5259
b9399fcf
AM
5260 if (is_ppc64_elf (info->output_bfd))
5261 {
5262 /* For input files without an explicit abiversion in e_flags
5263 we should have flagged any with symbol st_other bits set
5264 as ELFv1 and above flagged those with .opd as ELFv2.
5265 Set the output abiversion if not yet set, and for any input
5266 still ambiguous, take its abiversion from the output.
5267 Differences in ABI are reported later. */
5268 if (abiversion (info->output_bfd) == 0)
5269 set_abiversion (info->output_bfd, abiversion (ibfd));
5270 else if (abiversion (ibfd) == 0)
5271 set_abiversion (ibfd, abiversion (info->output_bfd));
b3fac117
AM
5272 }
5273
459609d6
AM
5274 htab = ppc_hash_table (info);
5275 if (htab == NULL)
b9399fcf 5276 return TRUE;
459609d6 5277
b9399fcf
AM
5278 if (opd != NULL && opd->size != 0
5279 && (ibfd->flags & DYNAMIC) == 0
5280 && (opd->flags & SEC_RELOC) != 0
5281 && opd->reloc_count != 0
5282 && !bfd_is_abs_section (opd->output_section)
5283 && info->gc_sections)
5284 {
5285 /* Garbage collection needs some extra help with .opd sections.
5286 We don't want to necessarily keep everything referenced by
5287 relocs in .opd, as that would keep all functions. Instead,
5288 if we reference an .opd symbol (a function descriptor), we
5289 want to keep the function code symbol's section. This is
5290 easy for global symbols, but for local syms we need to keep
5291 information about the associated function section. */
5292 bfd_size_type amt;
5293 asection **opd_sym_map;
5294 Elf_Internal_Shdr *symtab_hdr;
5295 Elf_Internal_Rela *relocs, *rel_end, *rel;
5296
5297 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
5298 opd_sym_map = bfd_zalloc (ibfd, amt);
5299 if (opd_sym_map == NULL)
5300 return FALSE;
5301 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
5302 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
5303 info->keep_memory);
5304 if (relocs == NULL)
5305 return FALSE;
5306 symtab_hdr = &elf_symtab_hdr (ibfd);
5307 rel_end = relocs + opd->reloc_count - 1;
5308 for (rel = relocs; rel < rel_end; rel++)
5309 {
5310 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
5311 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
5312
5313 if (r_type == R_PPC64_ADDR64
5314 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
5315 && r_symndx < symtab_hdr->sh_info)
5316 {
5317 Elf_Internal_Sym *isym;
5318 asection *s;
5319
5320 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
5321 if (isym == NULL)
5322 {
5323 if (elf_section_data (opd)->relocs != relocs)
5324 free (relocs);
5325 return FALSE;
5326 }
5327
5328 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
5329 if (s != NULL && s != opd)
5330 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
5331 }
5332 }
5333 if (elf_section_data (opd)->relocs != relocs)
5334 free (relocs);
5335 }
459609d6
AM
5336
5337 p = &htab->dot_syms;
5338 while ((eh = *p) != NULL)
5339 {
5340 *p = NULL;
5341 if (&eh->elf == htab->elf.hgot)
5342 ;
5343 else if (htab->elf.hgot == NULL
5344 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
5345 htab->elf.hgot = &eh->elf;
8c5b4e52
AM
5346 else if (abiversion (ibfd) <= 1)
5347 {
5348 htab->need_func_desc_adj = 1;
5349 if (!add_symbol_adjust (eh, info))
5350 return FALSE;
5351 }
459609d6
AM
5352 p = &eh->u.next_dot_sym;
5353 }
b3fac117 5354 return TRUE;
8387904d
AM
5355}
5356
97fed1c9
JJ
5357/* Undo hash table changes when an --as-needed input file is determined
5358 not to be needed. */
5359
5360static bfd_boolean
e5034e59
AM
5361ppc64_elf_notice_as_needed (bfd *ibfd,
5362 struct bfd_link_info *info,
5363 enum notice_asneeded_action act)
97fed1c9 5364{
e5034e59
AM
5365 if (act == notice_not_needed)
5366 {
5367 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 5368
e5034e59
AM
5369 if (htab == NULL)
5370 return FALSE;
4dfe6ac6 5371
e5034e59
AM
5372 htab->dot_syms = NULL;
5373 }
5374 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
5375}
5376
aa374f67
AM
5377/* If --just-symbols against a final linked binary, then assume we need
5378 toc adjusting stubs when calling functions defined there. */
5379
5380static void
5381ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
5382{
5383 if ((sec->flags & SEC_CODE) != 0
5384 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
5385 && is_ppc64_elf (sec->owner))
5386 {
2c3f079f
AM
5387 if (abiversion (sec->owner) >= 2
5388 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
aa374f67
AM
5389 sec->has_toc_reloc = 1;
5390 }
5391 _bfd_elf_link_just_syms (sec, info);
5392}
5393
e054468f 5394static struct plt_entry **
4ce794b7
AM
5395update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
5396 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
5397{
5398 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 5399 struct plt_entry **local_plt;
f961d9dd 5400 unsigned char *local_got_tls_masks;
411e1bfb
AM
5401
5402 if (local_got_ents == NULL)
5403 {
5404 bfd_size_type size = symtab_hdr->sh_info;
5405
e054468f
AM
5406 size *= (sizeof (*local_got_ents)
5407 + sizeof (*local_plt)
5408 + sizeof (*local_got_tls_masks));
4ce794b7 5409 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 5410 if (local_got_ents == NULL)
e054468f 5411 return NULL;
411e1bfb
AM
5412 elf_local_got_ents (abfd) = local_got_ents;
5413 }
5414
37da22e5 5415 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0)
411e1bfb
AM
5416 {
5417 struct got_entry *ent;
5418
5419 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
5420 if (ent->addend == r_addend
5421 && ent->owner == abfd
5422 && ent->tls_type == tls_type)
411e1bfb
AM
5423 break;
5424 if (ent == NULL)
5425 {
5426 bfd_size_type amt = sizeof (*ent);
4ce794b7 5427 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
5428 if (ent == NULL)
5429 return FALSE;
5430 ent->next = local_got_ents[r_symndx];
5431 ent->addend = r_addend;
e717da7e 5432 ent->owner = abfd;
411e1bfb 5433 ent->tls_type = tls_type;
927be08e 5434 ent->is_indirect = FALSE;
411e1bfb
AM
5435 ent->got.refcount = 0;
5436 local_got_ents[r_symndx] = ent;
5437 }
5438 ent->got.refcount += 1;
5439 }
5440
e054468f 5441 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 5442 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
37da22e5 5443 local_got_tls_masks[r_symndx] |= tls_type & 0xff;
e054468f
AM
5444
5445 return local_plt + r_symndx;
65f38f15
AM
5446}
5447
411e1bfb 5448static bfd_boolean
e054468f 5449update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 5450{
411e1bfb 5451 struct plt_entry *ent;
1e2f5b6e 5452
e054468f 5453 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
5454 if (ent->addend == addend)
5455 break;
5456 if (ent == NULL)
1e2f5b6e 5457 {
411e1bfb 5458 bfd_size_type amt = sizeof (*ent);
4ce794b7 5459 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
5460 if (ent == NULL)
5461 return FALSE;
e054468f 5462 ent->next = *plist;
411e1bfb
AM
5463 ent->addend = addend;
5464 ent->plt.refcount = 0;
e054468f 5465 *plist = ent;
1e2f5b6e 5466 }
411e1bfb 5467 ent->plt.refcount += 1;
b34976b6 5468 return TRUE;
1e2f5b6e
AM
5469}
5470
e054468f
AM
5471static bfd_boolean
5472is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5473{
5474 return (r_type == R_PPC64_REL24
5475 || r_type == R_PPC64_REL14
5476 || r_type == R_PPC64_REL14_BRTAKEN
5477 || r_type == R_PPC64_REL14_BRNTAKEN
5478 || r_type == R_PPC64_ADDR24
5479 || r_type == R_PPC64_ADDR14
5480 || r_type == R_PPC64_ADDR14_BRTAKEN
23cedd1d
AM
5481 || r_type == R_PPC64_ADDR14_BRNTAKEN
5482 || r_type == R_PPC64_PLTCALL);
5483}
5484
5485/* Relocs on inline plt call sequence insns prior to the call. */
5486
5487static bfd_boolean
5488is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type)
5489{
5490 return (r_type == R_PPC64_PLT16_HA
5491 || r_type == R_PPC64_PLT16_HI
5492 || r_type == R_PPC64_PLT16_LO
5493 || r_type == R_PPC64_PLT16_LO_DS
5494 || r_type == R_PPC64_PLTSEQ);
e054468f
AM
5495}
5496
5bd4f169 5497/* Look through the relocs for a section during the first phase, and
65f38f15 5498 calculate needed space in the global offset table, procedure
5d1634d7 5499 linkage table, and dynamic reloc sections. */
5bd4f169 5500
b34976b6 5501static bfd_boolean
4ce794b7
AM
5502ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5503 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 5504{
65f38f15 5505 struct ppc_link_hash_table *htab;
5bd4f169 5506 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 5507 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
5508 const Elf_Internal_Rela *rel;
5509 const Elf_Internal_Rela *rel_end;
5bd4f169 5510 asection *sreloc;
3a71aa26 5511 struct elf_link_hash_entry *tga, *dottga;
b9399fcf 5512 bfd_boolean is_opd;
5bd4f169 5513
0e1862bb 5514 if (bfd_link_relocatable (info))
b34976b6 5515 return TRUE;
5bd4f169 5516
680a3378
AM
5517 /* Don't do anything special with non-loaded, non-alloced sections.
5518 In particular, any relocs in such sections should not affect GOT
5519 and PLT reference counting (ie. we don't allow them to create GOT
5520 or PLT entries), there's no possibility or desire to optimize TLS
5521 relocs, and there's not much point in propagating relocs to shared
5522 libs that the dynamic linker won't relocate. */
5523 if ((sec->flags & SEC_ALLOC) == 0)
5524 return TRUE;
5525
0c8d6e5c 5526 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 5527
65f38f15 5528 htab = ppc_hash_table (info);
4dfe6ac6
NC
5529 if (htab == NULL)
5530 return FALSE;
5531
3a71aa26
AM
5532 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5533 FALSE, FALSE, TRUE);
5534 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5535 FALSE, FALSE, TRUE);
0ffa91dd 5536 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 5537 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 5538 sreloc = NULL;
b9399fcf 5539 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5bd4f169
AM
5540 rel_end = relocs + sec->reloc_count;
5541 for (rel = relocs; rel < rel_end; rel++)
5542 {
5543 unsigned long r_symndx;
5544 struct elf_link_hash_entry *h;
04c9666a 5545 enum elf_ppc64_reloc_type r_type;
727fc41e 5546 int tls_type;
7c8fe5c4 5547 struct _ppc64_elf_section_data *ppc64_sec;
cbf95972 5548 struct plt_entry **ifunc, **plt_list;
5bd4f169
AM
5549
5550 r_symndx = ELF64_R_SYM (rel->r_info);
5551 if (r_symndx < symtab_hdr->sh_info)
5552 h = NULL;
5553 else
973a3492
L
5554 {
5555 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 5556 h = elf_follow_link (h);
1c865ab2
AM
5557
5558 if (h == htab->elf.hgot)
5559 sec->has_toc_reloc = 1;
973a3492 5560 }
5bd4f169 5561
727fc41e 5562 tls_type = 0;
e054468f 5563 ifunc = NULL;
25f23106
AM
5564 if (h != NULL)
5565 {
5566 if (h->type == STT_GNU_IFUNC)
5567 {
5568 h->needs_plt = 1;
5569 ifunc = &h->plt.plist;
5570 }
5571 }
5572 else
5573 {
5574 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5575 abfd, r_symndx);
5576 if (isym == NULL)
5577 return FALSE;
5578
5579 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5580 {
5581 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
37da22e5
AM
5582 rel->r_addend,
5583 NON_GOT | PLT_IFUNC);
25f23106
AM
5584 if (ifunc == NULL)
5585 return FALSE;
5586 }
5587 }
727fc41e 5588
cbf95972 5589 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 5590 switch (r_type)
5bd4f169 5591 {
727fc41e
AM
5592 case R_PPC64_TLSGD:
5593 case R_PPC64_TLSLD:
5594 /* These special tls relocs tie a call to __tls_get_addr with
5595 its parameter symbol. */
37da22e5
AM
5596 if (h != NULL)
5597 ((struct ppc_link_hash_entry *) h)->tls_mask |= TLS_TLS | TLS_MARK;
5598 else
5599 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5600 rel->r_addend,
5601 NON_GOT | TLS_TLS | TLS_MARK))
5602 return FALSE;
5603 sec->has_tls_reloc = 1;
727fc41e
AM
5604 break;
5605
411e1bfb
AM
5606 case R_PPC64_GOT_TLSLD16:
5607 case R_PPC64_GOT_TLSLD16_LO:
5608 case R_PPC64_GOT_TLSLD16_HI:
5609 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 5610 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
5611 goto dogottls;
5612
5613 case R_PPC64_GOT_TLSGD16:
5614 case R_PPC64_GOT_TLSGD16_LO:
5615 case R_PPC64_GOT_TLSGD16_HI:
5616 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 5617 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
5618 goto dogottls;
5619
5620 case R_PPC64_GOT_TPREL16_DS:
5621 case R_PPC64_GOT_TPREL16_LO_DS:
5622 case R_PPC64_GOT_TPREL16_HI:
5623 case R_PPC64_GOT_TPREL16_HA:
7c8bbca5 5624 if (bfd_link_dll (info))
411e1bfb
AM
5625 info->flags |= DF_STATIC_TLS;
5626 tls_type = TLS_TLS | TLS_TPREL;
5627 goto dogottls;
5628
5629 case R_PPC64_GOT_DTPREL16_DS:
5630 case R_PPC64_GOT_DTPREL16_LO_DS:
5631 case R_PPC64_GOT_DTPREL16_HI:
5632 case R_PPC64_GOT_DTPREL16_HA:
5633 tls_type = TLS_TLS | TLS_DTPREL;
5634 dogottls:
5635 sec->has_tls_reloc = 1;
1a0670f3 5636 /* Fall through */
411e1bfb 5637
5bd4f169 5638 case R_PPC64_GOT16:
5bd4f169 5639 case R_PPC64_GOT16_DS:
65f38f15
AM
5640 case R_PPC64_GOT16_HA:
5641 case R_PPC64_GOT16_HI:
5642 case R_PPC64_GOT16_LO:
5bd4f169 5643 case R_PPC64_GOT16_LO_DS:
65f38f15 5644 /* This symbol requires a global offset table entry. */
4c52953f 5645 sec->has_toc_reloc = 1;
33c0ec9d
AM
5646 if (r_type == R_PPC64_GOT_TLSLD16
5647 || r_type == R_PPC64_GOT_TLSGD16
5648 || r_type == R_PPC64_GOT_TPREL16_DS
5649 || r_type == R_PPC64_GOT_DTPREL16_DS
5650 || r_type == R_PPC64_GOT16
5651 || r_type == R_PPC64_GOT16_DS)
5652 {
5653 htab->do_multi_toc = 1;
d77c8a4b 5654 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
5655 }
5656
e717da7e
AM
5657 if (ppc64_elf_tdata (abfd)->got == NULL
5658 && !create_got_section (abfd, info))
b34976b6 5659 return FALSE;
5bd4f169
AM
5660
5661 if (h != NULL)
5662 {
411e1bfb
AM
5663 struct ppc_link_hash_entry *eh;
5664 struct got_entry *ent;
65f38f15 5665
411e1bfb
AM
5666 eh = (struct ppc_link_hash_entry *) h;
5667 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5668 if (ent->addend == rel->r_addend
e717da7e 5669 && ent->owner == abfd
411e1bfb
AM
5670 && ent->tls_type == tls_type)
5671 break;
5672 if (ent == NULL)
5bd4f169 5673 {
411e1bfb 5674 bfd_size_type amt = sizeof (*ent);
4ce794b7 5675 ent = bfd_alloc (abfd, amt);
411e1bfb 5676 if (ent == NULL)
b34976b6 5677 return FALSE;
411e1bfb
AM
5678 ent->next = eh->elf.got.glist;
5679 ent->addend = rel->r_addend;
e717da7e 5680 ent->owner = abfd;
411e1bfb 5681 ent->tls_type = tls_type;
927be08e 5682 ent->is_indirect = FALSE;
411e1bfb
AM
5683 ent->got.refcount = 0;
5684 eh->elf.got.glist = ent;
5bd4f169 5685 }
411e1bfb 5686 ent->got.refcount += 1;
e7b938ca 5687 eh->tls_mask |= tls_type;
5bd4f169 5688 }
411e1bfb
AM
5689 else
5690 /* This is a global offset table entry for a local symbol. */
5691 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5692 rel->r_addend, tls_type))
5693 return FALSE;
a345bc8d
AM
5694
5695 /* We may also need a plt entry if the symbol turns out to be
5696 an ifunc. */
0e1862bb 5697 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
a345bc8d
AM
5698 {
5699 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5700 return FALSE;
5701 }
5bd4f169
AM
5702 break;
5703
5bd4f169 5704 case R_PPC64_PLT16_HA:
65f38f15
AM
5705 case R_PPC64_PLT16_HI:
5706 case R_PPC64_PLT16_LO:
08be3224 5707 case R_PPC64_PLT16_LO_DS:
65f38f15
AM
5708 case R_PPC64_PLT32:
5709 case R_PPC64_PLT64:
cbf95972
AM
5710 /* This symbol requires a procedure linkage table entry. */
5711 plt_list = ifunc;
5712 if (h != NULL)
e054468f 5713 {
e054468f
AM
5714 h->needs_plt = 1;
5715 if (h->root.root.string[0] == '.'
5716 && h->root.root.string[1] != '\0')
5717 ((struct ppc_link_hash_entry *) h)->is_func = 1;
2d7ad24e 5718 ((struct ppc_link_hash_entry *) h)->tls_mask |= PLT_KEEP;
cbf95972
AM
5719 plt_list = &h->plt.plist;
5720 }
5721 if (plt_list == NULL)
2d7ad24e
AM
5722 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5723 rel->r_addend,
5724 NON_GOT | PLT_KEEP);
cbf95972
AM
5725 if (!update_plt_info (abfd, plt_list, rel->r_addend))
5726 return FALSE;
5bd4f169
AM
5727 break;
5728
5729 /* The following relocations don't need to propagate the
5730 relocation if linking a shared object since they are
5731 section relative. */
5732 case R_PPC64_SECTOFF:
5733 case R_PPC64_SECTOFF_LO:
5734 case R_PPC64_SECTOFF_HI:
5735 case R_PPC64_SECTOFF_HA:
5736 case R_PPC64_SECTOFF_DS:
5737 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
5738 case R_PPC64_DTPREL16:
5739 case R_PPC64_DTPREL16_LO:
5740 case R_PPC64_DTPREL16_HI:
5741 case R_PPC64_DTPREL16_HA:
5742 case R_PPC64_DTPREL16_DS:
5743 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
5744 case R_PPC64_DTPREL16_HIGH:
5745 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
5746 case R_PPC64_DTPREL16_HIGHER:
5747 case R_PPC64_DTPREL16_HIGHERA:
5748 case R_PPC64_DTPREL16_HIGHEST:
5749 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
5750 break;
5751
ad8e1ba5 5752 /* Nor do these. */
25f23106
AM
5753 case R_PPC64_REL16:
5754 case R_PPC64_REL16_LO:
5755 case R_PPC64_REL16_HI:
5756 case R_PPC64_REL16_HA:
a680de9a 5757 case R_PPC64_REL16DX_HA:
25f23106
AM
5758 break;
5759
45965137
AM
5760 /* Not supported as a dynamic relocation. */
5761 case R_PPC64_ADDR64_LOCAL:
0e1862bb 5762 if (bfd_link_pic (info))
45965137
AM
5763 {
5764 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5765 ppc_howto_init ();
695344c0 5766 /* xgettext:c-format */
174d0a74 5767 info->callbacks->einfo (_("%H: %s reloc unsupported "
cf97bcb0 5768 "in shared libraries and PIEs\n"),
45965137
AM
5769 abfd, sec, rel->r_offset,
5770 ppc64_elf_howto_table[r_type]->name);
5771 bfd_set_error (bfd_error_bad_value);
5772 return FALSE;
5773 }
5774 break;
5775
ad8e1ba5 5776 case R_PPC64_TOC16:
33c0ec9d
AM
5777 case R_PPC64_TOC16_DS:
5778 htab->do_multi_toc = 1;
d77c8a4b 5779 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
1a0670f3 5780 /* Fall through. */
ad8e1ba5
AM
5781 case R_PPC64_TOC16_LO:
5782 case R_PPC64_TOC16_HI:
5783 case R_PPC64_TOC16_HA:
ad8e1ba5 5784 case R_PPC64_TOC16_LO_DS:
4c52953f 5785 sec->has_toc_reloc = 1;
ad8e1ba5
AM
5786 break;
5787
006589cf
AM
5788 /* Marker reloc. */
5789 case R_PPC64_ENTRY:
5790 break;
5791
5bd4f169
AM
5792 /* This relocation describes the C++ object vtable hierarchy.
5793 Reconstruct it for later use during GC. */
5794 case R_PPC64_GNU_VTINHERIT:
c152c796 5795 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 5796 return FALSE;
5bd4f169
AM
5797 break;
5798
5799 /* This relocation describes which C++ vtable entries are actually
5800 used. Record for later use during GC. */
5801 case R_PPC64_GNU_VTENTRY:
d17e0c6e
JB
5802 BFD_ASSERT (h != NULL);
5803 if (h != NULL
5804 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 5805 return FALSE;
5bd4f169
AM
5806 break;
5807
721956f4
AM
5808 case R_PPC64_REL14:
5809 case R_PPC64_REL14_BRTAKEN:
5810 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
5811 {
5812 asection *dest = NULL;
5813
5814 /* Heuristic: If jumping outside our section, chances are
5815 we are going to need a stub. */
5816 if (h != NULL)
5817 {
5818 /* If the sym is weak it may be overridden later, so
5819 don't assume we know where a weak sym lives. */
5820 if (h->root.type == bfd_link_hash_defined)
5821 dest = h->root.u.def.section;
5822 }
5823 else
87d72d41
AM
5824 {
5825 Elf_Internal_Sym *isym;
5826
5827 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5828 abfd, r_symndx);
5829 if (isym == NULL)
5830 return FALSE;
5831
5832 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5833 }
5834
220c76dd 5835 if (dest != sec)
7c8fe5c4 5836 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 5837 }
3e04d765
AM
5838 goto rel24;
5839
5840 case R_PPC64_PLTCALL:
5841 ppc64_elf_section_data (sec)->has_pltcall = 1;
721956f4
AM
5842 /* Fall through. */
5843
5d1634d7 5844 case R_PPC64_REL24:
3e04d765 5845 rel24:
cbf95972
AM
5846 plt_list = ifunc;
5847 if (h != NULL)
5d1634d7 5848 {
e054468f
AM
5849 h->needs_plt = 1;
5850 if (h->root.root.string[0] == '.'
5851 && h->root.root.string[1] != '\0')
5852 ((struct ppc_link_hash_entry *) h)->is_func = 1;
cbf95972 5853
3a71aa26 5854 if (h == tga || h == dottga)
cbf95972
AM
5855 {
5856 sec->has_tls_reloc = 1;
5857 if (rel != relocs
5858 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5859 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5860 /* We have a new-style __tls_get_addr call with
5861 a marker reloc. */
5862 ;
5863 else
5864 /* Mark this section as having an old-style call. */
5865 sec->has_tls_get_addr_call = 1;
5866 }
5867 plt_list = &h->plt.plist;
411e1bfb 5868 }
cbf95972
AM
5869
5870 /* We may need a .plt entry if the function this reloc
5871 refers to is in a shared lib. */
5872 if (plt_list
5873 && !update_plt_info (abfd, plt_list, rel->r_addend))
5874 return FALSE;
411e1bfb
AM
5875 break;
5876
cbf95972
AM
5877 case R_PPC64_ADDR14:
5878 case R_PPC64_ADDR14_BRNTAKEN:
5879 case R_PPC64_ADDR14_BRTAKEN:
5880 case R_PPC64_ADDR24:
5881 goto dodyn;
5882
411e1bfb
AM
5883 case R_PPC64_TPREL64:
5884 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
7c8bbca5 5885 if (bfd_link_dll (info))
411e1bfb
AM
5886 info->flags |= DF_STATIC_TLS;
5887 goto dotlstoc;
5888
5889 case R_PPC64_DTPMOD64:
5890 if (rel + 1 < rel_end
5891 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5892 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 5893 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 5894 else
951fd09b 5895 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
5896 goto dotlstoc;
5897
5898 case R_PPC64_DTPREL64:
5899 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5900 if (rel != relocs
5901 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5902 && rel[-1].r_offset == rel->r_offset - 8)
5903 /* This is the second reloc of a dtpmod, dtprel pair.
5904 Don't mark with TLS_DTPREL. */
5905 goto dodyn;
5906
5907 dotlstoc:
5908 sec->has_tls_reloc = 1;
5909 if (h != NULL)
5910 {
5911 struct ppc_link_hash_entry *eh;
5912 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 5913 eh->tls_mask |= tls_type;
411e1bfb
AM
5914 }
5915 else
5916 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5917 rel->r_addend, tls_type))
5918 return FALSE;
5919
7c8fe5c4
AM
5920 ppc64_sec = ppc64_elf_section_data (sec);
5921 if (ppc64_sec->sec_type != sec_toc)
411e1bfb 5922 {
3a71aa26
AM
5923 bfd_size_type amt;
5924
e7b938ca 5925 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5926 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5927 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5928 if (ppc64_sec->u.toc.symndx == NULL)
5929 return FALSE;
5930 amt = sec->size * sizeof (bfd_vma) / 8;
5931 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5932 if (ppc64_sec->u.toc.add == NULL)
411e1bfb 5933 return FALSE;
7c8fe5c4
AM
5934 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5935 ppc64_sec->sec_type = sec_toc;
411e1bfb
AM
5936 }
5937 BFD_ASSERT (rel->r_offset % 8 == 0);
3a71aa26
AM
5938 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5939 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5940
5941 /* Mark the second slot of a GD or LD entry.
5942 -1 to indicate GD and -2 to indicate LD. */
5943 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5944 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5945 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5946 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5947 goto dodyn;
5948
5949 case R_PPC64_TPREL16:
5950 case R_PPC64_TPREL16_LO:
5951 case R_PPC64_TPREL16_HI:
5952 case R_PPC64_TPREL16_HA:
5953 case R_PPC64_TPREL16_DS:
5954 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
5955 case R_PPC64_TPREL16_HIGH:
5956 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5957 case R_PPC64_TPREL16_HIGHER:
5958 case R_PPC64_TPREL16_HIGHERA:
5959 case R_PPC64_TPREL16_HIGHEST:
5960 case R_PPC64_TPREL16_HIGHESTA:
7c8bbca5
AM
5961 if (bfd_link_dll (info))
5962 info->flags |= DF_STATIC_TLS;
5963 goto dodyn;
5d1634d7 5964
e86ce104 5965 case R_PPC64_ADDR64:
b9399fcf 5966 if (is_opd
1e2f5b6e 5967 && rel + 1 < rel_end
4ce794b7 5968 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 5969 {
8387904d 5970 if (h != NULL)
8c5b4e52 5971 ((struct ppc_link_hash_entry *) h)->is_func = 1;
1e2f5b6e 5972 }
e86ce104
AM
5973 /* Fall through. */
5974
65f38f15
AM
5975 case R_PPC64_ADDR16:
5976 case R_PPC64_ADDR16_DS:
5977 case R_PPC64_ADDR16_HA:
5978 case R_PPC64_ADDR16_HI:
f9c6b907
AM
5979 case R_PPC64_ADDR16_HIGH:
5980 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
5981 case R_PPC64_ADDR16_HIGHER:
5982 case R_PPC64_ADDR16_HIGHERA:
5983 case R_PPC64_ADDR16_HIGHEST:
5984 case R_PPC64_ADDR16_HIGHESTA:
5985 case R_PPC64_ADDR16_LO:
5986 case R_PPC64_ADDR16_LO_DS:
0e1862bb 5987 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
a345bc8d
AM
5988 && rel->r_addend == 0)
5989 {
5990 /* We may need a .plt entry if this reloc refers to a
5991 function in a shared lib. */
5992 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5993 return FALSE;
5994 h->pointer_equality_needed = 1;
5995 }
5996 /* Fall through. */
5997
5998 case R_PPC64_REL30:
5999 case R_PPC64_REL32:
6000 case R_PPC64_REL64:
65f38f15 6001 case R_PPC64_ADDR32:
65f38f15
AM
6002 case R_PPC64_UADDR16:
6003 case R_PPC64_UADDR32:
6004 case R_PPC64_UADDR64:
5bd4f169 6005 case R_PPC64_TOC:
0e1862bb 6006 if (h != NULL && !bfd_link_pic (info))
81848ca0 6007 /* We may need a copy reloc. */
f5385ebf 6008 h->non_got_ref = 1;
81848ca0 6009
41bd81ab 6010 /* Don't propagate .opd relocs. */
b9399fcf 6011 if (NO_OPD_RELOCS && is_opd)
e86ce104 6012 break;
e86ce104 6013
65f38f15
AM
6014 /* If we are creating a shared library, and this is a reloc
6015 against a global symbol, or a non PC relative reloc
6016 against a local symbol, then we need to copy the reloc
6017 into the shared library. However, if we are linking with
6018 -Bsymbolic, we do not need to copy a reloc against a
6019 global symbol which is defined in an object we are
6020 including in the link (i.e., DEF_REGULAR is set). At
6021 this point we have not seen all the input files, so it is
6022 possible that DEF_REGULAR is not set now but will be set
6023 later (it is never cleared). In case of a weak definition,
6024 DEF_REGULAR may be cleared later by a strong definition in
6025 a shared library. We account for that possibility below by
f4656909 6026 storing information in the dyn_relocs field of the hash
65f38f15
AM
6027 table entry. A similar situation occurs when creating
6028 shared libraries and symbol visibility changes render the
6029 symbol local.
6030
6031 If on the other hand, we are creating an executable, we
6032 may need to keep relocations for symbols satisfied by a
6033 dynamic library if we manage to avoid copy relocs for the
6034 symbol. */
411e1bfb 6035 dodyn:
0e1862bb 6036 if ((bfd_link_pic (info)
1d483afe 6037 && (must_be_dyn_reloc (info, r_type)
65f38f15 6038 || (h != NULL
198f1157 6039 && (!SYMBOLIC_BIND (info, h)
65f38f15 6040 || h->root.type == bfd_link_hash_defweak
f5385ebf 6041 || !h->def_regular))))
f4656909 6042 || (ELIMINATE_COPY_RELOCS
0e1862bb 6043 && !bfd_link_pic (info)
65f38f15
AM
6044 && h != NULL
6045 && (h->root.type == bfd_link_hash_defweak
25f23106 6046 || !h->def_regular))
0e1862bb 6047 || (!bfd_link_pic (info)
25f23106 6048 && ifunc != NULL))
5bd4f169 6049 {
65f38f15
AM
6050 /* We must copy these reloc types into the output file.
6051 Create a reloc section in dynobj and make room for
6052 this reloc. */
5bd4f169
AM
6053 if (sreloc == NULL)
6054 {
83bac4b0
NC
6055 sreloc = _bfd_elf_make_dynamic_reloc_section
6056 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
65f38f15 6057
5bd4f169 6058 if (sreloc == NULL)
83bac4b0 6059 return FALSE;
5bd4f169
AM
6060 }
6061
65f38f15
AM
6062 /* If this is a global symbol, we count the number of
6063 relocations we need for this symbol. */
6064 if (h != NULL)
6065 {
19e08130
AM
6066 struct elf_dyn_relocs *p;
6067 struct elf_dyn_relocs **head;
6068
ec338859 6069 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
19e08130
AM
6070 p = *head;
6071 if (p == NULL || p->sec != sec)
6072 {
6073 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
6074 if (p == NULL)
6075 return FALSE;
6076 p->next = *head;
6077 *head = p;
6078 p->sec = sec;
6079 p->count = 0;
6080 p->pc_count = 0;
6081 }
6082 p->count += 1;
6083 if (!must_be_dyn_reloc (info, r_type))
6084 p->pc_count += 1;
65f38f15
AM
6085 }
6086 else
6087 {
ec338859
AM
6088 /* Track dynamic relocs needed for local syms too.
6089 We really need local syms available to do this
6090 easily. Oh well. */
19e08130
AM
6091 struct ppc_dyn_relocs *p;
6092 struct ppc_dyn_relocs **head;
6093 bfd_boolean is_ifunc;
ec338859 6094 asection *s;
6edfbbad 6095 void *vpp;
87d72d41 6096 Elf_Internal_Sym *isym;
6edfbbad 6097
87d72d41
AM
6098 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
6099 abfd, r_symndx);
6100 if (isym == NULL)
b34976b6 6101 return FALSE;
ec338859 6102
87d72d41
AM
6103 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
6104 if (s == NULL)
6105 s = sec;
6106
6edfbbad 6107 vpp = &elf_section_data (s)->local_dynrel;
19e08130
AM
6108 head = (struct ppc_dyn_relocs **) vpp;
6109 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
6110 p = *head;
6111 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
6112 p = p->next;
6113 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
6114 {
6115 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
6116 if (p == NULL)
6117 return FALSE;
6118 p->next = *head;
6119 *head = p;
6120 p->sec = sec;
6121 p->ifunc = is_ifunc;
6122 p->count = 0;
6123 }
6124 p->count += 1;
ec338859 6125 }
65f38f15 6126 }
5bd4f169 6127 break;
65f38f15
AM
6128
6129 default:
96e0dda4 6130 break;
5bd4f169
AM
6131 }
6132 }
6133
b34976b6 6134 return TRUE;
5bd4f169
AM
6135}
6136
ee67d69a
AM
6137/* Merge backend specific data from an object file to the output
6138 object file when linking. */
6139
6140static bfd_boolean
50e03d47 6141ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
ee67d69a 6142{
50e03d47 6143 bfd *obfd = info->output_bfd;
ee67d69a
AM
6144 unsigned long iflags, oflags;
6145
6146 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
6147 return TRUE;
6148
6149 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
6150 return TRUE;
6151
50e03d47 6152 if (!_bfd_generic_verify_endian_match (ibfd, info))
ee67d69a
AM
6153 return FALSE;
6154
6155 iflags = elf_elfheader (ibfd)->e_flags;
6156 oflags = elf_elfheader (obfd)->e_flags;
6157
f6c7c3e8 6158 if (iflags & ~EF_PPC64_ABI)
ee67d69a 6159 {
4eca0228 6160 _bfd_error_handler
695344c0 6161 /* xgettext:c-format */
871b3ab2 6162 (_("%pB uses unknown e_flags 0x%lx"), ibfd, iflags);
ee67d69a
AM
6163 bfd_set_error (bfd_error_bad_value);
6164 return FALSE;
6165 }
f6c7c3e8 6166 else if (iflags != oflags && iflags != 0)
ee67d69a 6167 {
4eca0228 6168 _bfd_error_handler
695344c0 6169 /* xgettext:c-format */
871b3ab2 6170 (_("%pB: ABI version %ld is not compatible with ABI version %ld output"),
ee67d69a
AM
6171 ibfd, iflags, oflags);
6172 bfd_set_error (bfd_error_bad_value);
6173 return FALSE;
6174 }
6175
50e03d47 6176 _bfd_elf_ppc_merge_fp_attributes (ibfd, info);
005d79fd 6177
ee67d69a 6178 /* Merge Tag_compatibility attributes and any common GNU ones. */
50e03d47 6179 _bfd_elf_merge_object_attributes (ibfd, info);
ee67d69a
AM
6180
6181 return TRUE;
6182}
6183
6184static bfd_boolean
6185ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6186{
6187 /* Print normal ELF private data. */
6188 _bfd_elf_print_private_bfd_data (abfd, ptr);
6189
6190 if (elf_elfheader (abfd)->e_flags != 0)
6191 {
6192 FILE *file = ptr;
6193
ee67d69a
AM
6194 fprintf (file, _("private flags = 0x%lx:"),
6195 elf_elfheader (abfd)->e_flags);
6196
6197 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
6198 fprintf (file, _(" [abiv%ld]"),
6199 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
6200 fputc ('\n', file);
6201 }
6202
6203 return TRUE;
6204}
6205
8387904d 6206/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
b53dfeb2
AM
6207 of the code entry point, and its section, which must be in the same
6208 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
8387904d
AM
6209
6210static bfd_vma
6211opd_entry_value (asection *opd_sec,
6212 bfd_vma offset,
6213 asection **code_sec,
aef36ac1
AM
6214 bfd_vma *code_off,
6215 bfd_boolean in_code_sec)
8387904d
AM
6216{
6217 bfd *opd_bfd = opd_sec->owner;
8860955f 6218 Elf_Internal_Rela *relocs;
8387904d 6219 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 6220 bfd_vma val;
8387904d 6221
9f296da3
AM
6222 /* No relocs implies we are linking a --just-symbols object, or looking
6223 at a final linked executable with addr2line or somesuch. */
4b85d634
AM
6224 if (opd_sec->reloc_count == 0)
6225 {
729eabd5 6226 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
3b36f7e6 6227
729eabd5
AM
6228 if (contents == NULL)
6229 {
6230 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
6231 return (bfd_vma) -1;
6232 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
6233 }
ee1e4ede 6234
dbb3fbbb 6235 /* PR 17512: file: 64b9dfbb. */
451dfd38 6236 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
dbb3fbbb
NC
6237 return (bfd_vma) -1;
6238
729eabd5 6239 val = bfd_get_64 (opd_bfd, contents + offset);
aef36ac1
AM
6240 if (code_sec != NULL)
6241 {
6242 asection *sec, *likely = NULL;
ee1e4ede 6243
aef36ac1 6244 if (in_code_sec)
4b85d634 6245 {
aef36ac1
AM
6246 sec = *code_sec;
6247 if (sec->vma <= val
6248 && val < sec->vma + sec->size)
6249 likely = sec;
6250 else
6251 val = -1;
6252 }
6253 else
6254 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
6255 if (sec->vma <= val
6256 && (sec->flags & SEC_LOAD) != 0
6257 && (sec->flags & SEC_ALLOC) != 0)
6258 likely = sec;
6259 if (likely != NULL)
6260 {
6261 *code_sec = likely;
6262 if (code_off != NULL)
6263 *code_off = val - likely->vma;
4b85d634
AM
6264 }
6265 }
aef36ac1 6266 return val;
4b85d634
AM
6267 }
6268
0c8d6e5c 6269 BFD_ASSERT (is_ppc64_elf (opd_bfd));
0ffa91dd 6270
729eabd5 6271 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
8860955f
AM
6272 if (relocs == NULL)
6273 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
877a8638
NC
6274 /* PR 17512: file: df8e1fd6. */
6275 if (relocs == NULL)
6276 return (bfd_vma) -1;
645ea6a9 6277
8387904d 6278 /* Go find the opd reloc at the sym address. */
8860955f 6279 lo = relocs;
8387904d 6280 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 6281 val = (bfd_vma) -1;
8387904d
AM
6282 while (lo < hi)
6283 {
6284 look = lo + (hi - lo) / 2;
6285 if (look->r_offset < offset)
6286 lo = look + 1;
6287 else if (look->r_offset > offset)
6288 hi = look;
6289 else
6290 {
0ffa91dd
NC
6291 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
6292
8387904d
AM
6293 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
6294 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
6295 {
6296 unsigned long symndx = ELF64_R_SYM (look->r_info);
b53dfeb2 6297 asection *sec = NULL;
8387904d 6298
b53dfeb2
AM
6299 if (symndx >= symtab_hdr->sh_info
6300 && elf_sym_hashes (opd_bfd) != NULL)
8387904d
AM
6301 {
6302 struct elf_link_hash_entry **sym_hashes;
6303 struct elf_link_hash_entry *rh;
6304
6305 sym_hashes = elf_sym_hashes (opd_bfd);
6306 rh = sym_hashes[symndx - symtab_hdr->sh_info];
128205bb
AM
6307 if (rh != NULL)
6308 {
6309 rh = elf_follow_link (rh);
bb854a36
AM
6310 if (rh->root.type != bfd_link_hash_defined
6311 && rh->root.type != bfd_link_hash_defweak)
6312 break;
6313 if (rh->root.u.def.section->owner == opd_bfd)
b53dfeb2 6314 {
bb854a36
AM
6315 val = rh->root.u.def.value;
6316 sec = rh->root.u.def.section;
b53dfeb2
AM
6317 }
6318 }
6319 }
6320
6321 if (sec == NULL)
6322 {
6323 Elf_Internal_Sym *sym;
6324
6325 if (symndx < symtab_hdr->sh_info)
6326 {
6327 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
6328 if (sym == NULL)
6329 {
6330 size_t symcnt = symtab_hdr->sh_info;
6331 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6332 symcnt, 0,
6333 NULL, NULL, NULL);
6334 if (sym == NULL)
6335 break;
6336 symtab_hdr->contents = (bfd_byte *) sym;
6337 }
6338 sym += symndx;
128205bb
AM
6339 }
6340 else
6341 {
b53dfeb2
AM
6342 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6343 1, symndx,
6344 NULL, NULL, NULL);
128205bb
AM
6345 if (sym == NULL)
6346 break;
128205bb 6347 }
b53dfeb2
AM
6348 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
6349 if (sec == NULL)
6350 break;
6351 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
6352 val = sym->st_value;
8387904d 6353 }
b53dfeb2 6354
8387904d
AM
6355 val += look->r_addend;
6356 if (code_off != NULL)
6357 *code_off = val;
6358 if (code_sec != NULL)
aef36ac1
AM
6359 {
6360 if (in_code_sec && *code_sec != sec)
6361 return -1;
6362 else
6363 *code_sec = sec;
6364 }
b53dfeb2 6365 if (sec->output_section != NULL)
8387904d 6366 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
6367 }
6368 break;
6369 }
6370 }
645ea6a9 6371
645ea6a9 6372 return val;
8387904d
AM
6373}
6374
aef36ac1
AM
6375/* If the ELF symbol SYM might be a function in SEC, return the
6376 function size and set *CODE_OFF to the function's entry point,
6377 otherwise return zero. */
9f296da3 6378
aef36ac1
AM
6379static bfd_size_type
6380ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
6381 bfd_vma *code_off)
9f296da3 6382{
aef36ac1
AM
6383 bfd_size_type size;
6384
6385 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
6386 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
6387 return 0;
6388
6389 size = 0;
6390 if (!(sym->flags & BSF_SYNTHETIC))
6391 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
6392
6393 if (strcmp (sym->section->name, ".opd") == 0)
9f296da3 6394 {
b07bca4e
AM
6395 struct _opd_sec_data *opd = get_opd_info (sym->section);
6396 bfd_vma symval = sym->value;
6397
6398 if (opd != NULL
6399 && opd->adjust != NULL
6400 && elf_section_data (sym->section)->relocs != NULL)
6401 {
6402 /* opd_entry_value will use cached relocs that have been
6403 adjusted, but with raw symbols. That means both local
6404 and global symbols need adjusting. */
6405 long adjust = opd->adjust[OPD_NDX (symval)];
6406 if (adjust == -1)
6407 return 0;
6408 symval += adjust;
6409 }
6410
6411 if (opd_entry_value (sym->section, symval,
aef36ac1
AM
6412 &sec, code_off, TRUE) == (bfd_vma) -1)
6413 return 0;
6414 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6415 symbol. This size has nothing to do with the code size of the
6416 function, which is what we're supposed to return, but the
6417 code size isn't available without looking up the dot-sym.
6418 However, doing that would be a waste of time particularly
6419 since elf_find_function will look at the dot-sym anyway.
6420 Now, elf_find_function will keep the largest size of any
6421 function sym found at the code address of interest, so return
6422 1 here to avoid it incorrectly caching a larger function size
6423 for a small function. This does mean we return the wrong
6424 size for a new-ABI function of size 24, but all that does is
6425 disable caching for such functions. */
6426 if (size == 24)
6427 size = 1;
9f296da3 6428 }
aef36ac1
AM
6429 else
6430 {
6431 if (sym->section != sec)
6432 return 0;
6433 *code_off = sym->value;
6434 }
6435 if (size == 0)
6436 size = 1;
6437 return size;
9f296da3
AM
6438}
6439
f378ab09
AM
6440/* Return true if symbol is a strong function defined in an ELFv2
6441 object with st_other localentry bits of zero, ie. its local entry
6442 point coincides with its global entry point. */
6443
6444static bfd_boolean
6445is_elfv2_localentry0 (struct elf_link_hash_entry *h)
6446{
6447 return (h != NULL
6448 && h->type == STT_FUNC
6449 && h->root.type == bfd_link_hash_defined
6450 && (STO_PPC64_LOCAL_MASK & h->other) == 0
8b5f1ed8 6451 && !((struct ppc_link_hash_entry *) h)->non_zero_localentry
f378ab09
AM
6452 && is_ppc64_elf (h->root.u.def.section->owner)
6453 && abiversion (h->root.u.def.section->owner) >= 2);
6454}
6455
854b41e7
AM
6456/* Return true if symbol is defined in a regular object file. */
6457
6458static bfd_boolean
6459is_static_defined (struct elf_link_hash_entry *h)
6460{
6461 return ((h->root.type == bfd_link_hash_defined
6462 || h->root.type == bfd_link_hash_defweak)
6463 && h->root.u.def.section != NULL
6464 && h->root.u.def.section->output_section != NULL);
6465}
6466
b31867b6
AM
6467/* If FDH is a function descriptor symbol, return the associated code
6468 entry symbol if it is defined. Return NULL otherwise. */
6469
6470static struct ppc_link_hash_entry *
6471defined_code_entry (struct ppc_link_hash_entry *fdh)
6472{
6473 if (fdh->is_func_descriptor)
6474 {
6475 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6476 if (fh->elf.root.type == bfd_link_hash_defined
6477 || fh->elf.root.type == bfd_link_hash_defweak)
6478 return fh;
6479 }
6480 return NULL;
6481}
6482
6483/* If FH is a function code entry symbol, return the associated
6484 function descriptor symbol if it is defined. Return NULL otherwise. */
6485
6486static struct ppc_link_hash_entry *
6487defined_func_desc (struct ppc_link_hash_entry *fh)
6488{
6489 if (fh->oh != NULL
6490 && fh->oh->is_func_descriptor)
6491 {
6492 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6493 if (fdh->elf.root.type == bfd_link_hash_defined
6494 || fdh->elf.root.type == bfd_link_hash_defweak)
6495 return fdh;
6496 }
6497 return NULL;
6498}
6499
8c5b4e52
AM
6500static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
6501
6502/* Garbage collect sections, after first dealing with dot-symbols. */
6503
6504static bfd_boolean
6505ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
6506{
6507 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6508
6509 if (htab != NULL && htab->need_func_desc_adj)
6510 {
6511 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6512 htab->need_func_desc_adj = 0;
6513 }
6514 return bfd_elf_gc_sections (abfd, info);
6515}
6516
74f0fb50
AM
6517/* Mark all our entry sym sections, both opd and code section. */
6518
6519static void
6520ppc64_elf_gc_keep (struct bfd_link_info *info)
6521{
6522 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6523 struct bfd_sym_chain *sym;
6524
4dfe6ac6
NC
6525 if (htab == NULL)
6526 return;
6527
74f0fb50
AM
6528 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6529 {
b31867b6 6530 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
6531 asection *sec;
6532
6533 eh = (struct ppc_link_hash_entry *)
b31867b6 6534 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
74f0fb50
AM
6535 if (eh == NULL)
6536 continue;
6537 if (eh->elf.root.type != bfd_link_hash_defined
6538 && eh->elf.root.type != bfd_link_hash_defweak)
6539 continue;
6540
b31867b6
AM
6541 fh = defined_code_entry (eh);
6542 if (fh != NULL)
74f0fb50 6543 {
b31867b6 6544 sec = fh->elf.root.u.def.section;
74f0fb50
AM
6545 sec->flags |= SEC_KEEP;
6546 }
6547 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6548 && opd_entry_value (eh->elf.root.u.def.section,
6549 eh->elf.root.u.def.value,
aef36ac1 6550 &sec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50
AM
6551 sec->flags |= SEC_KEEP;
6552
6553 sec = eh->elf.root.u.def.section;
6554 sec->flags |= SEC_KEEP;
6555 }
6556}
6557
64d03ab5
AM
6558/* Mark sections containing dynamically referenced symbols. When
6559 building shared libraries, we must assume that any visible symbol is
6560 referenced. */
6561
6562static bfd_boolean
6563ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6564{
6565 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6566 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
b31867b6 6567 struct ppc_link_hash_entry *fdh;
b407645f 6568 struct bfd_elf_dynamic_list *d = info->dynamic_list;
64d03ab5 6569
64d03ab5 6570 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
6571 fdh = defined_func_desc (eh);
6572 if (fdh != NULL)
6573 eh = fdh;
64d03ab5
AM
6574
6575 if ((eh->elf.root.type == bfd_link_hash_defined
6576 || eh->elf.root.type == bfd_link_hash_defweak)
87e79a65 6577 && ((eh->elf.ref_dynamic && !eh->elf.forced_local)
1c9177d9 6578 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
64d03ab5 6579 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8 6580 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
0e1862bb 6581 && (!bfd_link_executable (info)
e278ae05 6582 || info->gc_keep_exported
b407645f
AM
6583 || info->export_dynamic
6584 || (eh->elf.dynamic
6585 && d != NULL
6586 && (*d->match) (&d->head, NULL, eh->elf.root.root.string)))
e278ae05 6587 && (eh->elf.versioned >= versioned
4c58e0d8
AM
6588 || !bfd_hide_sym_by_version (info->version_info,
6589 eh->elf.root.root.string)))))
64d03ab5
AM
6590 {
6591 asection *code_sec;
b31867b6 6592 struct ppc_link_hash_entry *fh;
64d03ab5
AM
6593
6594 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6595
6596 /* Function descriptor syms cause the associated
6597 function code sym section to be marked. */
b31867b6
AM
6598 fh = defined_code_entry (eh);
6599 if (fh != NULL)
6600 {
6601 code_sec = fh->elf.root.u.def.section;
6602 code_sec->flags |= SEC_KEEP;
6603 }
64d03ab5
AM
6604 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6605 && opd_entry_value (eh->elf.root.u.def.section,
6606 eh->elf.root.u.def.value,
aef36ac1 6607 &code_sec, NULL, FALSE) != (bfd_vma) -1)
64d03ab5
AM
6608 code_sec->flags |= SEC_KEEP;
6609 }
6610
6611 return TRUE;
6612}
6613
5bd4f169
AM
6614/* Return the section that should be marked against GC for a given
6615 relocation. */
6616
6617static asection *
4ce794b7 6618ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 6619 struct bfd_link_info *info,
4ce794b7
AM
6620 Elf_Internal_Rela *rel,
6621 struct elf_link_hash_entry *h,
6622 Elf_Internal_Sym *sym)
5bd4f169 6623{
ccfa59ea
AM
6624 asection *rsec;
6625
ccfa59ea
AM
6626 /* Syms return NULL if we're marking .opd, so we avoid marking all
6627 function sections, as all functions are referenced in .opd. */
6628 rsec = NULL;
6629 if (get_opd_info (sec) != NULL)
6630 return rsec;
1e2f5b6e 6631
5bd4f169
AM
6632 if (h != NULL)
6633 {
04c9666a 6634 enum elf_ppc64_reloc_type r_type;
b31867b6 6635 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 6636
4ce794b7 6637 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 6638 switch (r_type)
5bd4f169
AM
6639 {
6640 case R_PPC64_GNU_VTINHERIT:
6641 case R_PPC64_GNU_VTENTRY:
6642 break;
6643
6644 default:
6645 switch (h->root.type)
6646 {
6647 case bfd_link_hash_defined:
6648 case bfd_link_hash_defweak:
ccfa59ea 6649 eh = (struct ppc_link_hash_entry *) h;
b31867b6
AM
6650 fdh = defined_func_desc (eh);
6651 if (fdh != NULL)
8c5b4e52
AM
6652 {
6653 /* -mcall-aixdesc code references the dot-symbol on
6654 a call reloc. Mark the function descriptor too
6655 against garbage collection. */
6656 fdh->elf.mark = 1;
60d67dc8
AM
6657 if (fdh->elf.is_weakalias)
6658 weakdef (&fdh->elf)->mark = 1;
8c5b4e52
AM
6659 eh = fdh;
6660 }
1e2f5b6e
AM
6661
6662 /* Function descriptor syms cause the associated
6663 function code sym section to be marked. */
b31867b6
AM
6664 fh = defined_code_entry (eh);
6665 if (fh != NULL)
ccfa59ea
AM
6666 {
6667 /* They also mark their opd section. */
74f0fb50 6668 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 6669
b31867b6 6670 rsec = fh->elf.root.u.def.section;
ccfa59ea 6671 }
8387904d
AM
6672 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6673 && opd_entry_value (eh->elf.root.u.def.section,
6674 eh->elf.root.u.def.value,
aef36ac1 6675 &rsec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50 6676 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 6677 else
1e2f5b6e
AM
6678 rsec = h->root.u.def.section;
6679 break;
5bd4f169
AM
6680
6681 case bfd_link_hash_common:
1e2f5b6e
AM
6682 rsec = h->root.u.c.p->section;
6683 break;
5bd4f169
AM
6684
6685 default:
fb34365b 6686 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
6687 }
6688 }
6689 }
6690 else
6691 {
74f0fb50 6692 struct _opd_sec_data *opd;
1e2f5b6e
AM
6693
6694 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
6695 opd = get_opd_info (rsec);
6696 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 6697 {
74f0fb50 6698 rsec->gc_mark = 1;
ccfa59ea 6699
51aecdc5 6700 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
ccfa59ea 6701 }
5bd4f169
AM
6702 }
6703
1e2f5b6e 6704 return rsec;
5bd4f169
AM
6705}
6706
deb0e272
AM
6707/* The maximum size of .sfpr. */
6708#define SFPR_MAX (218*4)
6709
6710struct sfpr_def_parms
6711{
699733f6
AM
6712 const char name[12];
6713 unsigned char lo, hi;
deb0e272
AM
6714 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6715 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6716};
6717
a4b6fadd
AM
6718/* Auto-generate _save*, _rest* functions in .sfpr.
6719 If STUB_SEC is non-null, define alias symbols in STUB_SEC
6720 instead. */
deb0e272 6721
4dfe6ac6 6722static bfd_boolean
a4b6fadd
AM
6723sfpr_define (struct bfd_link_info *info,
6724 const struct sfpr_def_parms *parm,
6725 asection *stub_sec)
deb0e272
AM
6726{
6727 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6728 unsigned int i;
6729 size_t len = strlen (parm->name);
6730 bfd_boolean writing = FALSE;
699733f6 6731 char sym[16];
deb0e272 6732
4dfe6ac6
NC
6733 if (htab == NULL)
6734 return FALSE;
6735
deb0e272
AM
6736 memcpy (sym, parm->name, len);
6737 sym[len + 2] = 0;
6738
6739 for (i = parm->lo; i <= parm->hi; i++)
6740 {
a4b6fadd 6741 struct ppc_link_hash_entry *h;
deb0e272
AM
6742
6743 sym[len + 0] = i / 10 + '0';
6744 sym[len + 1] = i % 10 + '0';
a4b6fadd 6745 h = (struct ppc_link_hash_entry *)
b32547cd 6746 elf_link_hash_lookup (&htab->elf, sym, writing, TRUE, TRUE);
a4b6fadd 6747 if (stub_sec != NULL)
deb0e272 6748 {
a4b6fadd
AM
6749 if (h != NULL
6750 && h->elf.root.type == bfd_link_hash_defined
6751 && h->elf.root.u.def.section == htab->sfpr)
6752 {
6753 struct elf_link_hash_entry *s;
6754 char buf[32];
6755 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
6756 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
6757 if (s == NULL)
6758 return FALSE;
6759 if (s->root.type == bfd_link_hash_new
6760 || (s->root.type = bfd_link_hash_defined
6761 && s->root.u.def.section == stub_sec))
6762 {
6763 s->root.type = bfd_link_hash_defined;
6764 s->root.u.def.section = stub_sec;
7dda8d3c 6765 s->root.u.def.value = (stub_sec->size - htab->sfpr->size
a4b6fadd
AM
6766 + h->elf.root.u.def.value);
6767 s->ref_regular = 1;
6768 s->def_regular = 1;
6769 s->ref_regular_nonweak = 1;
6770 s->forced_local = 1;
6771 s->non_elf = 0;
6772 s->root.linker_def = 1;
6773 }
6774 }
6775 continue;
6776 }
6777 if (h != NULL)
6778 {
6779 h->save_res = 1;
6780 if (!h->elf.def_regular)
deb0e272 6781 {
a4b6fadd
AM
6782 h->elf.root.type = bfd_link_hash_defined;
6783 h->elf.root.u.def.section = htab->sfpr;
6784 h->elf.root.u.def.value = htab->sfpr->size;
6785 h->elf.type = STT_FUNC;
6786 h->elf.def_regular = 1;
b32547cd 6787 h->elf.non_elf = 0;
a4b6fadd
AM
6788 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
6789 writing = TRUE;
deb0e272 6790 if (htab->sfpr->contents == NULL)
a4b6fadd
AM
6791 {
6792 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6793 if (htab->sfpr->contents == NULL)
6794 return FALSE;
6795 }
deb0e272
AM
6796 }
6797 }
6798 if (writing)
6799 {
6800 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6801 if (i != parm->hi)
6802 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6803 else
6804 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6805 htab->sfpr->size = p - htab->sfpr->contents;
6806 }
6807 }
6808
6809 return TRUE;
6810}
6811
6812static bfd_byte *
6813savegpr0 (bfd *abfd, bfd_byte *p, int r)
6814{
6815 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6816 return p + 4;
6817}
6818
6819static bfd_byte *
6820savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6821{
6822 p = savegpr0 (abfd, p, r);
a078d95a 6823 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6824 p = p + 4;
6825 bfd_put_32 (abfd, BLR, p);
6826 return p + 4;
6827}
6828
6829static bfd_byte *
6830restgpr0 (bfd *abfd, bfd_byte *p, int r)
6831{
6832 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6833 return p + 4;
6834}
6835
6836static bfd_byte *
6837restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6838{
a078d95a 6839 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6840 p = p + 4;
6841 p = restgpr0 (abfd, p, r);
6842 bfd_put_32 (abfd, MTLR_R0, p);
6843 p = p + 4;
6844 if (r == 29)
6845 {
6846 p = restgpr0 (abfd, p, 30);
6847 p = restgpr0 (abfd, p, 31);
6848 }
6849 bfd_put_32 (abfd, BLR, p);
6850 return p + 4;
6851}
6852
6853static bfd_byte *
6854savegpr1 (bfd *abfd, bfd_byte *p, int r)
6855{
6856 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6857 return p + 4;
6858}
6859
6860static bfd_byte *
6861savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6862{
6863 p = savegpr1 (abfd, p, r);
6864 bfd_put_32 (abfd, BLR, p);
6865 return p + 4;
6866}
6867
6868static bfd_byte *
6869restgpr1 (bfd *abfd, bfd_byte *p, int r)
6870{
6871 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6872 return p + 4;
6873}
6874
6875static bfd_byte *
6876restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6877{
6878 p = restgpr1 (abfd, p, r);
6879 bfd_put_32 (abfd, BLR, p);
6880 return p + 4;
6881}
6882
6883static bfd_byte *
6884savefpr (bfd *abfd, bfd_byte *p, int r)
6885{
6886 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6887 return p + 4;
6888}
6889
6890static bfd_byte *
6891savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6892{
6893 p = savefpr (abfd, p, r);
a078d95a 6894 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6895 p = p + 4;
6896 bfd_put_32 (abfd, BLR, p);
6897 return p + 4;
6898}
6899
6900static bfd_byte *
6901restfpr (bfd *abfd, bfd_byte *p, int r)
6902{
6903 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6904 return p + 4;
6905}
6906
6907static bfd_byte *
6908restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6909{
a078d95a 6910 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6911 p = p + 4;
6912 p = restfpr (abfd, p, r);
6913 bfd_put_32 (abfd, MTLR_R0, p);
6914 p = p + 4;
6915 if (r == 29)
6916 {
6917 p = restfpr (abfd, p, 30);
6918 p = restfpr (abfd, p, 31);
6919 }
6920 bfd_put_32 (abfd, BLR, p);
6921 return p + 4;
6922}
6923
6924static bfd_byte *
6925savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6926{
6927 p = savefpr (abfd, p, r);
6928 bfd_put_32 (abfd, BLR, p);
6929 return p + 4;
6930}
6931
6932static bfd_byte *
6933restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6934{
6935 p = restfpr (abfd, p, r);
6936 bfd_put_32 (abfd, BLR, p);
6937 return p + 4;
6938}
6939
6940static bfd_byte *
6941savevr (bfd *abfd, bfd_byte *p, int r)
6942{
6943 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6944 p = p + 4;
6945 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6946 return p + 4;
6947}
6948
6949static bfd_byte *
6950savevr_tail (bfd *abfd, bfd_byte *p, int r)
6951{
6952 p = savevr (abfd, p, r);
6953 bfd_put_32 (abfd, BLR, p);
6954 return p + 4;
6955}
6956
6957static bfd_byte *
6958restvr (bfd *abfd, bfd_byte *p, int r)
6959{
6960 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6961 p = p + 4;
6962 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6963 return p + 4;
6964}
6965
6966static bfd_byte *
6967restvr_tail (bfd *abfd, bfd_byte *p, int r)
6968{
6969 p = restvr (abfd, p, r);
6970 bfd_put_32 (abfd, BLR, p);
6971 return p + 4;
6972}
6973
e86ce104
AM
6974/* Called via elf_link_hash_traverse to transfer dynamic linking
6975 information on function code symbol entries to their corresponding
6976 function descriptor symbol entries. */
deb0e272 6977
b34976b6 6978static bfd_boolean
4ce794b7 6979func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6980{
e86ce104 6981 struct bfd_link_info *info;
65f38f15 6982 struct ppc_link_hash_table *htab;
50bc7936
AM
6983 struct ppc_link_hash_entry *fh;
6984 struct ppc_link_hash_entry *fdh;
6985 bfd_boolean force_local;
5bd4f169 6986
50bc7936
AM
6987 fh = (struct ppc_link_hash_entry *) h;
6988 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 6989 return TRUE;
e86ce104 6990
8c5b4e52
AM
6991 if (!fh->is_func)
6992 return TRUE;
6993
6994 if (fh->elf.root.root.string[0] != '.'
6995 || fh->elf.root.root.string[1] == '\0')
6996 return TRUE;
6997
4ce794b7 6998 info = inf;
65f38f15 6999 htab = ppc_hash_table (info);
4dfe6ac6
NC
7000 if (htab == NULL)
7001 return FALSE;
5bd4f169 7002
8c5b4e52
AM
7003 /* Find the corresponding function descriptor symbol. */
7004 fdh = lookup_fdh (fh, htab);
7005
c09bdfe5
AM
7006 /* Resolve undefined references to dot-symbols as the value
7007 in the function descriptor, if we have one in a regular object.
7008 This is to satisfy cases like ".quad .foo". Calls to functions
7009 in dynamic objects are handled elsewhere. */
8c5b4e52
AM
7010 if ((fh->elf.root.type == bfd_link_hash_undefined
7011 || fh->elf.root.type == bfd_link_hash_undefweak)
7012 && (fdh->elf.root.type == bfd_link_hash_defined
7013 || fdh->elf.root.type == bfd_link_hash_defweak)
b31867b6
AM
7014 && get_opd_info (fdh->elf.root.u.def.section) != NULL
7015 && opd_entry_value (fdh->elf.root.u.def.section,
7016 fdh->elf.root.u.def.value,
c09bdfe5 7017 &fh->elf.root.u.def.section,
aef36ac1 7018 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
c09bdfe5 7019 {
b31867b6 7020 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 7021 fh->elf.forced_local = 1;
b31867b6
AM
7022 fh->elf.def_regular = fdh->elf.def_regular;
7023 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
7024 }
7025
8c5b4e52
AM
7026 if (!fh->elf.dynamic)
7027 {
7028 struct plt_entry *ent;
5bd4f169 7029
8c5b4e52
AM
7030 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
7031 if (ent->plt.refcount > 0)
7032 break;
7033 if (ent == NULL)
7034 return TRUE;
7035 }
5bd4f169 7036
8c5b4e52 7037 /* Create a descriptor as undefined if necessary. */
50bc7936 7038 if (fdh == NULL
0e1862bb 7039 && !bfd_link_executable (info)
50bc7936
AM
7040 && (fh->elf.root.type == bfd_link_hash_undefined
7041 || fh->elf.root.type == bfd_link_hash_undefweak))
7042 {
908b32fc 7043 fdh = make_fdh (info, fh);
bb700d78
AM
7044 if (fdh == NULL)
7045 return FALSE;
50bc7936 7046 }
648cca2c 7047
8c5b4e52 7048 /* We can't support overriding of symbols on a fake descriptor. */
908b32fc
AM
7049 if (fdh != NULL
7050 && fdh->fake
8c5b4e52
AM
7051 && (fh->elf.root.type == bfd_link_hash_defined
7052 || fh->elf.root.type == bfd_link_hash_defweak))
7053 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
908b32fc 7054
8c5b4e52
AM
7055 /* Transfer dynamic linking information to the function descriptor. */
7056 if (fdh != NULL)
7057 {
f5385ebf
AM
7058 fdh->elf.ref_regular |= fh->elf.ref_regular;
7059 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
7060 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
7061 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
8c5b4e52
AM
7062 fdh->elf.dynamic |= fh->elf.dynamic;
7063 fdh->elf.needs_plt |= (fh->elf.needs_plt
7064 || fh->elf.type == STT_FUNC
7065 || fh->elf.type == STT_GNU_IFUNC);
7066 move_plt_plist (fh, fdh);
7067
7068 if (!fdh->elf.forced_local
7069 && fh->elf.dynindx != -1)
7070 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
7071 return FALSE;
e86ce104
AM
7072 }
7073
50bc7936
AM
7074 /* Now that the info is on the function descriptor, clear the
7075 function code sym info. Any function code syms for which we
7076 don't have a definition in a regular file, we force local.
7077 This prevents a shared library from exporting syms that have
7078 been imported from another library. Function code syms that
7079 are really in the library we must leave global to prevent the
7080 linker dragging in a definition from a static library. */
93f3fa99
AM
7081 force_local = (!fh->elf.def_regular
7082 || fdh == NULL
7083 || !fdh->elf.def_regular
7084 || fdh->elf.forced_local);
50bc7936
AM
7085 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7086
b34976b6 7087 return TRUE;
e86ce104 7088}
40b8271b 7089
a4b6fadd
AM
7090static const struct sfpr_def_parms save_res_funcs[] =
7091 {
7092 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
7093 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
7094 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
7095 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
7096 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
7097 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
7098 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
7099 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
7100 { "._savef", 14, 31, savefpr, savefpr1_tail },
7101 { "._restf", 14, 31, restfpr, restfpr1_tail },
7102 { "_savevr_", 20, 31, savevr, savevr_tail },
7103 { "_restvr_", 20, 31, restvr, restvr_tail }
7104 };
7105
e86ce104 7106/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
7107 this hook to a) provide some gcc support functions, and b) transfer
7108 dynamic linking information gathered so far on function code symbol
7109 entries, to their corresponding function descriptor symbol entries. */
deb0e272 7110
b34976b6 7111static bfd_boolean
4ce794b7
AM
7112ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
7113 struct bfd_link_info *info)
e86ce104
AM
7114{
7115 struct ppc_link_hash_table *htab;
7116
7117 htab = ppc_hash_table (info);
4dfe6ac6
NC
7118 if (htab == NULL)
7119 return FALSE;
7120
b32547cd
AM
7121 /* Provide any missing _save* and _rest* functions. */
7122 if (htab->sfpr != NULL)
7123 {
7124 unsigned int i;
7125
7126 htab->sfpr->size = 0;
7127 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
7128 if (!sfpr_define (info, &save_res_funcs[i], NULL))
7129 return FALSE;
7130 if (htab->sfpr->size == 0)
7131 htab->sfpr->flags |= SEC_EXCLUDE;
7132 }
7133
7134 if (bfd_link_relocatable (info))
7135 return TRUE;
7136
7137 if (htab->elf.hgot != NULL)
dba6fa9b
AM
7138 {
7139 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
7140 /* Make .TOC. defined so as to prevent it being made dynamic.
7141 The wrong value here is fixed later in ppc64_elf_set_toc. */
43417696
AM
7142 if (!htab->elf.hgot->def_regular
7143 || htab->elf.hgot->root.type != bfd_link_hash_defined)
7144 {
7145 htab->elf.hgot->root.type = bfd_link_hash_defined;
7146 htab->elf.hgot->root.u.def.value = 0;
7147 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
7148 htab->elf.hgot->def_regular = 1;
7149 htab->elf.hgot->root.linker_def = 1;
7150 }
dba6fa9b 7151 htab->elf.hgot->type = STT_OBJECT;
dba6fa9b
AM
7152 htab->elf.hgot->other = ((htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1))
7153 | STV_HIDDEN);
7154 }
c66bb0ee 7155
8c5b4e52
AM
7156 if (htab->need_func_desc_adj)
7157 {
7158 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
7159 htab->need_func_desc_adj = 0;
7160 }
805fc799 7161
b34976b6 7162 return TRUE;
e86ce104
AM
7163}
7164
98bbb1b8 7165/* Find dynamic relocs for H that apply to read-only sections. */
a345bc8d 7166
98bbb1b8 7167static asection *
a345bc8d
AM
7168readonly_dynrelocs (struct elf_link_hash_entry *h)
7169{
7170 struct ppc_link_hash_entry *eh;
7171 struct elf_dyn_relocs *p;
7172
7173 eh = (struct ppc_link_hash_entry *) h;
7174 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7175 {
7176 asection *s = p->sec->output_section;
7177
7178 if (s != NULL && (s->flags & SEC_READONLY) != 0)
98bbb1b8 7179 return p->sec;
a345bc8d 7180 }
98bbb1b8 7181 return NULL;
a345bc8d
AM
7182}
7183
d311bc8b 7184/* Return true if we have dynamic relocs against H or any of its weak
ab2477e1
AM
7185 aliases, that apply to read-only sections. Cannot be used after
7186 size_dynamic_sections. */
d311bc8b
AM
7187
7188static bfd_boolean
7189alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
7190{
7191 struct ppc_link_hash_entry *eh;
7192
7193 eh = (struct ppc_link_hash_entry *) h;
7194 do
7195 {
7196 if (readonly_dynrelocs (&eh->elf))
7197 return TRUE;
ab2477e1 7198 eh = (struct ppc_link_hash_entry *) eh->elf.u.alias;
d311bc8b
AM
7199 } while (eh != NULL && &eh->elf != h);
7200
7201 return FALSE;
7202}
8a2058b5 7203
8a9e8e72
AM
7204/* Return whether EH has pc-relative dynamic relocs. */
7205
7206static bfd_boolean
7207pc_dynrelocs (struct ppc_link_hash_entry *eh)
7208{
7209 struct elf_dyn_relocs *p;
7210
7211 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7212 if (p->pc_count != 0)
7213 return TRUE;
7214 return FALSE;
7215}
7216
8a2058b5
AM
7217/* Return true if a global entry stub will be created for H. Valid
7218 for ELFv2 before plt entries have been allocated. */
7219
7220static bfd_boolean
7221global_entry_stub (struct elf_link_hash_entry *h)
7222{
7223 struct plt_entry *pent;
7224
7225 if (!h->pointer_equality_needed
7226 || h->def_regular)
7227 return FALSE;
7228
7229 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
7230 if (pent->plt.refcount > 0
7231 && pent->addend == 0)
7232 return TRUE;
7233
7234 return FALSE;
7235}
7236
e86ce104
AM
7237/* Adjust a symbol defined by a dynamic object and referenced by a
7238 regular object. The current definition is in some section of the
7239 dynamic object, but we're not including those sections. We have to
7240 change the definition to something the rest of the link can
7241 understand. */
7242
b34976b6 7243static bfd_boolean
4ce794b7
AM
7244ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
7245 struct elf_link_hash_entry *h)
e86ce104
AM
7246{
7247 struct ppc_link_hash_table *htab;
5474d94f 7248 asection *s, *srel;
e86ce104
AM
7249
7250 htab = ppc_hash_table (info);
4dfe6ac6
NC
7251 if (htab == NULL)
7252 return FALSE;
e86ce104
AM
7253
7254 /* Deal with function syms. */
7255 if (h->type == STT_FUNC
e054468f 7256 || h->type == STT_GNU_IFUNC
f5385ebf 7257 || h->needs_plt)
e86ce104 7258 {
529fe20e
AM
7259 bfd_boolean local = (((struct ppc_link_hash_entry *) h)->save_res
7260 || SYMBOL_CALLS_LOCAL (info, h)
7261 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
7262 /* Discard dyn_relocs when non-pic if we've decided that a
7263 function symbol is local and not an ifunc. We keep dynamic
7264 relocs for ifuncs when local rather than always emitting a
7265 plt call stub for them and defining the symbol on the call
7266 stub. We can't do that for ELFv1 anyway (a function symbol
7267 is defined on a descriptor, not code) and it can be faster at
7268 run-time due to not needing to bounce through a stub. The
7269 dyn_relocs for ifuncs will be applied even in a static
7270 executable. */
7271 if (!bfd_link_pic (info)
7272 && h->type != STT_GNU_IFUNC
7273 && local)
7274 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
7275
e86ce104
AM
7276 /* Clear procedure linkage table information for any symbol that
7277 won't need a .plt entry. */
411e1bfb
AM
7278 struct plt_entry *ent;
7279 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
7280 if (ent->plt.refcount > 0)
7281 break;
8387904d 7282 if (ent == NULL
2d7ad24e
AM
7283 || (h->type != STT_GNU_IFUNC
7284 && local
3e04d765
AM
7285 && (htab->can_convert_all_inline_plt
7286 || (((struct ppc_link_hash_entry *) h)->tls_mask
7287 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
40b8271b 7288 {
411e1bfb 7289 h->plt.plist = NULL;
f5385ebf 7290 h->needs_plt = 0;
d1eca1e4 7291 h->pointer_equality_needed = 0;
40b8271b 7292 }
8a2058b5 7293 else if (abiversion (info->output_bfd) >= 2)
a345bc8d 7294 {
d1eca1e4
AM
7295 /* Taking a function's address in a read/write section
7296 doesn't require us to define the function symbol in the
7297 executable on a global entry stub. A dynamic reloc can
8a2058b5
AM
7298 be used instead. The reason we prefer a few more dynamic
7299 relocs is that calling via a global entry stub costs a
7300 few more instructions, and pointer_equality_needed causes
7301 extra work in ld.so when resolving these symbols. */
529fe20e 7302 if (global_entry_stub (h))
d1eca1e4 7303 {
ab2477e1 7304 if (!readonly_dynrelocs (h))
529fe20e
AM
7305 {
7306 h->pointer_equality_needed = 0;
04383fd1
AM
7307 /* If we haven't seen a branch reloc and the symbol
7308 isn't an ifunc then we don't need a plt entry. */
529fe20e
AM
7309 if (!h->needs_plt)
7310 h->plt.plist = NULL;
7311 }
7312 else if (!bfd_link_pic (info))
7313 /* We are going to be defining the function symbol on the
7314 plt stub, so no dyn_relocs needed when non-pic. */
7315 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
d1eca1e4
AM
7316 }
7317
3988aed5
AM
7318 /* ELFv2 function symbols can't have copy relocs. */
7319 return TRUE;
7320 }
7321 else if (!h->needs_plt
ab2477e1 7322 && !readonly_dynrelocs (h))
3988aed5 7323 {
04383fd1
AM
7324 /* If we haven't seen a branch reloc and the symbol isn't an
7325 ifunc then we don't need a plt entry. */
3988aed5
AM
7326 h->plt.plist = NULL;
7327 h->pointer_equality_needed = 0;
a345bc8d
AM
7328 return TRUE;
7329 }
5bd4f169 7330 }
bbd7ec4a 7331 else
411e1bfb 7332 h->plt.plist = NULL;
5bd4f169
AM
7333
7334 /* If this is a weak symbol, and there is a real definition, the
7335 processor independent code will have arranged for us to see the
7336 real definition first, and we can just use the same value. */
60d67dc8 7337 if (h->is_weakalias)
5bd4f169 7338 {
60d67dc8
AM
7339 struct elf_link_hash_entry *def = weakdef (h);
7340 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
7341 h->root.u.def.section = def->root.u.def.section;
7342 h->root.u.def.value = def->root.u.def.value;
4a7e5234
AM
7343 if (def->root.u.def.section == htab->elf.sdynbss
7344 || def->root.u.def.section == htab->elf.sdynrelro)
7345 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
b34976b6 7346 return TRUE;
5bd4f169
AM
7347 }
7348
5bd4f169
AM
7349 /* If we are creating a shared library, we must presume that the
7350 only references to the symbol are via the global offset table.
7351 For such cases we need not do anything here; the relocations will
7352 be handled correctly by relocate_section. */
0e1862bb 7353 if (bfd_link_pic (info))
b34976b6 7354 return TRUE;
5bd4f169 7355
65f38f15
AM
7356 /* If there are no references to this symbol that do not use the
7357 GOT, we don't need to generate a copy reloc. */
f5385ebf 7358 if (!h->non_got_ref)
b34976b6 7359 return TRUE;
65f38f15 7360
b186458a 7361 /* Don't generate a copy reloc for symbols defined in the executable. */
d93d1c80 7362 if (!h->def_dynamic || !h->ref_regular || h->def_regular
b186458a 7363
d93d1c80
AM
7364 /* If -z nocopyreloc was given, don't generate them either. */
7365 || info->nocopyreloc
a127494f 7366
dce2246a 7367 /* If we don't find any dynamic relocs in read-only sections, then
d93d1c80 7368 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
d311bc8b 7369 || (ELIMINATE_COPY_RELOCS && !alias_readonly_dynrelocs (h))
65f38f15 7370
d93d1c80
AM
7371 /* Protected variables do not work with .dynbss. The copy in
7372 .dynbss won't be used by the shared library with the protected
7373 definition for the variable. Text relocations are preferable
7374 to an incorrect program. */
7375 || h->protected_def)
529fe20e 7376 return TRUE;
a127494f 7377
5d35169e 7378 if (h->plt.plist != NULL)
97b639ba
AM
7379 {
7380 /* We should never get here, but unfortunately there are versions
7381 of gcc out there that improperly (for this ABI) put initialized
7382 function pointers, vtable refs and suchlike in read-only
7383 sections. Allow them to proceed, but warn that this might
7384 break at runtime. */
25f53a85 7385 info->callbacks->einfo
c1c8c1ef 7386 (_("%P: copy reloc against `%pT' requires lazy plt linking; "
25f53a85 7387 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
7388 h->root.root.string);
7389 }
5d35169e
AM
7390
7391 /* This is a reference to a symbol defined by a dynamic object which
7392 is not a function. */
7393
5bd4f169
AM
7394 /* We must allocate the symbol in our .dynbss section, which will
7395 become part of the .bss section of the executable. There will be
7396 an entry for this symbol in the .dynsym section. The dynamic
7397 object will contain position independent code, so all references
7398 from the dynamic object to this symbol will go through the global
7399 offset table. The dynamic linker will use the .dynsym entry to
7400 determine the address it must put in the global offset table, so
7401 both the dynamic object and the regular object will refer to the
7402 same memory location for the variable. */
5474d94f
AM
7403 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
7404 {
7405 s = htab->elf.sdynrelro;
7406 srel = htab->elf.sreldynrelro;
7407 }
7408 else
7409 {
7410 s = htab->elf.sdynbss;
7411 srel = htab->elf.srelbss;
7412 }
1d7e9d18 7413 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 7414 {
4a7e5234
AM
7415 /* We must generate a R_PPC64_COPY reloc to tell the dynamic
7416 linker to copy the initial value out of the dynamic object
7417 and into the runtime process image. */
5474d94f 7418 srel->size += sizeof (Elf64_External_Rela);
f5385ebf 7419 h->needs_copy = 1;
5bd4f169
AM
7420 }
7421
529fe20e
AM
7422 /* We no longer want dyn_relocs. */
7423 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
6cabe1ea 7424 return _bfd_elf_adjust_dynamic_copy (info, h, s);
5bd4f169
AM
7425}
7426
e86ce104
AM
7427/* If given a function descriptor symbol, hide both the function code
7428 sym and the descriptor. */
7429static void
4ce794b7
AM
7430ppc64_elf_hide_symbol (struct bfd_link_info *info,
7431 struct elf_link_hash_entry *h,
7432 bfd_boolean force_local)
e86ce104 7433{
34814b9f 7434 struct ppc_link_hash_entry *eh;
e86ce104
AM
7435 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
7436
34814b9f
AM
7437 eh = (struct ppc_link_hash_entry *) h;
7438 if (eh->is_func_descriptor)
e86ce104 7439 {
34814b9f 7440 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 7441
721956f4 7442 if (fh == NULL)
d1329ca3
AM
7443 {
7444 const char *p, *q;
b8ac2841 7445 struct elf_link_hash_table *htab = elf_hash_table (info);
d1329ca3
AM
7446 char save;
7447
7448 /* We aren't supposed to use alloca in BFD because on
7449 systems which do not have alloca the version in libiberty
7450 calls xmalloc, which might cause the program to crash
7451 when it runs out of memory. This function doesn't have a
7452 return status, so there's no way to gracefully return an
7453 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
7454 accessed; It's either a string in an ELF string table,
7455 or allocated in an objalloc structure. */
d1329ca3 7456
34814b9f 7457 p = eh->elf.root.root.string - 1;
d1329ca3
AM
7458 save = *p;
7459 *(char *) p = '.';
34814b9f 7460 fh = (struct ppc_link_hash_entry *)
b8ac2841 7461 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
d1329ca3
AM
7462 *(char *) p = save;
7463
7464 /* Unfortunately, if it so happens that the string we were
7465 looking for was allocated immediately before this string,
7466 then we overwrote the string terminator. That's the only
7467 reason the lookup should fail. */
7468 if (fh == NULL)
7469 {
34814b9f
AM
7470 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
7471 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 7472 --q, --p;
34814b9f
AM
7473 if (q < eh->elf.root.root.string && *p == '.')
7474 fh = (struct ppc_link_hash_entry *)
b8ac2841 7475 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
d1329ca3
AM
7476 }
7477 if (fh != NULL)
7478 {
34814b9f
AM
7479 eh->oh = fh;
7480 fh->oh = eh;
d1329ca3
AM
7481 }
7482 }
e86ce104 7483 if (fh != NULL)
34814b9f 7484 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
7485 }
7486}
7487
411e1bfb 7488static bfd_boolean
8843416a
AM
7489get_sym_h (struct elf_link_hash_entry **hp,
7490 Elf_Internal_Sym **symp,
7491 asection **symsecp,
f961d9dd 7492 unsigned char **tls_maskp,
8843416a
AM
7493 Elf_Internal_Sym **locsymsp,
7494 unsigned long r_symndx,
7495 bfd *ibfd)
411e1bfb 7496{
0ffa91dd 7497 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
7498
7499 if (r_symndx >= symtab_hdr->sh_info)
7500 {
7501 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7502 struct elf_link_hash_entry *h;
7503
7504 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7505 h = elf_follow_link (h);
411e1bfb
AM
7506
7507 if (hp != NULL)
7508 *hp = h;
7509
7510 if (symp != NULL)
7511 *symp = NULL;
7512
7513 if (symsecp != NULL)
7514 {
7515 asection *symsec = NULL;
7516 if (h->root.type == bfd_link_hash_defined
7517 || h->root.type == bfd_link_hash_defweak)
7518 symsec = h->root.u.def.section;
7519 *symsecp = symsec;
7520 }
7521
e7b938ca 7522 if (tls_maskp != NULL)
411e1bfb
AM
7523 {
7524 struct ppc_link_hash_entry *eh;
7525
7526 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 7527 *tls_maskp = &eh->tls_mask;
411e1bfb
AM
7528 }
7529 }
7530 else
7531 {
7532 Elf_Internal_Sym *sym;
7533 Elf_Internal_Sym *locsyms = *locsymsp;
7534
7535 if (locsyms == NULL)
7536 {
7537 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7538 if (locsyms == NULL)
7539 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7540 symtab_hdr->sh_info,
7541 0, NULL, NULL, NULL);
7542 if (locsyms == NULL)
7543 return FALSE;
7544 *locsymsp = locsyms;
7545 }
7546 sym = locsyms + r_symndx;
7547
7548 if (hp != NULL)
7549 *hp = NULL;
7550
7551 if (symp != NULL)
7552 *symp = sym;
7553
7554 if (symsecp != NULL)
cb33740c 7555 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 7556
e7b938ca 7557 if (tls_maskp != NULL)
411e1bfb
AM
7558 {
7559 struct got_entry **lgot_ents;
f961d9dd 7560 unsigned char *tls_mask;
411e1bfb 7561
e7b938ca 7562 tls_mask = NULL;
411e1bfb
AM
7563 lgot_ents = elf_local_got_ents (ibfd);
7564 if (lgot_ents != NULL)
7565 {
e054468f
AM
7566 struct plt_entry **local_plt = (struct plt_entry **)
7567 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 7568 unsigned char *lgot_masks = (unsigned char *)
e054468f 7569 (local_plt + symtab_hdr->sh_info);
e7b938ca 7570 tls_mask = &lgot_masks[r_symndx];
411e1bfb 7571 }
e7b938ca 7572 *tls_maskp = tls_mask;
411e1bfb
AM
7573 }
7574 }
7575 return TRUE;
7576}
7577
e7b938ca 7578/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 7579 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 7580 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
7581
7582static int
f961d9dd 7583get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
7584 unsigned long *toc_symndx,
7585 bfd_vma *toc_addend,
0d4792f7 7586 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
7587 const Elf_Internal_Rela *rel,
7588 bfd *ibfd)
411e1bfb
AM
7589{
7590 unsigned long r_symndx;
0d4792f7 7591 int next_r;
411e1bfb
AM
7592 struct elf_link_hash_entry *h;
7593 Elf_Internal_Sym *sym;
7594 asection *sec;
7595 bfd_vma off;
7596
7597 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 7598 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 7599 return 0;
411e1bfb 7600
37da22e5
AM
7601 if ((*tls_maskp != NULL
7602 && (**tls_maskp & TLS_TLS) != 0
7603 && **tls_maskp != (TLS_TLS | TLS_MARK))
411e1bfb 7604 || sec == NULL
6bee8834 7605 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 7606 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 7607 return 1;
411e1bfb
AM
7608
7609 /* Look inside a TOC section too. */
7610 if (h != NULL)
7611 {
7612 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7613 off = h->root.u.def.value;
7614 }
7615 else
7616 off = sym->st_value;
7617 off += rel->r_addend;
7618 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
7619 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7620 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
7621 if (toc_symndx != NULL)
7622 *toc_symndx = r_symndx;
3a71aa26
AM
7623 if (toc_addend != NULL)
7624 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7625 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7626 return 0;
854b41e7 7627 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
7628 && (next_r == -1 || next_r == -2))
7629 return 1 - next_r;
951fd09b 7630 return 1;
411e1bfb
AM
7631}
7632
3b421ab3
AM
7633/* Find (or create) an entry in the tocsave hash table. */
7634
7635static struct tocsave_entry *
7636tocsave_find (struct ppc_link_hash_table *htab,
7637 enum insert_option insert,
7638 Elf_Internal_Sym **local_syms,
7639 const Elf_Internal_Rela *irela,
7640 bfd *ibfd)
7641{
7642 unsigned long r_indx;
7643 struct elf_link_hash_entry *h;
7644 Elf_Internal_Sym *sym;
7645 struct tocsave_entry ent, *p;
7646 hashval_t hash;
7647 struct tocsave_entry **slot;
7648
7649 r_indx = ELF64_R_SYM (irela->r_info);
7650 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7651 return NULL;
7652 if (ent.sec == NULL || ent.sec->output_section == NULL)
7653 {
4eca0228 7654 _bfd_error_handler
871b3ab2 7655 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
3b421ab3
AM
7656 return NULL;
7657 }
7658
7659 if (h != NULL)
7660 ent.offset = h->root.u.def.value;
7661 else
7662 ent.offset = sym->st_value;
7663 ent.offset += irela->r_addend;
7664
7665 hash = tocsave_htab_hash (&ent);
7666 slot = ((struct tocsave_entry **)
7667 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7668 if (slot == NULL)
7669 return NULL;
7670
7671 if (*slot == NULL)
7672 {
7673 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7674 if (p == NULL)
7675 return NULL;
7676 *p = ent;
7677 *slot = p;
7678 }
7679 return *slot;
7680}
7681
754021d0 7682/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 7683 code for the old ABI, these will already have been done. */
754021d0
AM
7684
7685static bfd_boolean
7686adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7687{
7688 struct ppc_link_hash_entry *eh;
7689 asection *sym_sec;
74f0fb50 7690 struct _opd_sec_data *opd;
754021d0
AM
7691
7692 if (h->root.type == bfd_link_hash_indirect)
7693 return TRUE;
7694
754021d0
AM
7695 if (h->root.type != bfd_link_hash_defined
7696 && h->root.type != bfd_link_hash_defweak)
7697 return TRUE;
7698
7699 eh = (struct ppc_link_hash_entry *) h;
7700 if (eh->adjust_done)
7701 return TRUE;
7702
7703 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
7704 opd = get_opd_info (sym_sec);
7705 if (opd != NULL && opd->adjust != NULL)
754021d0 7706 {
51aecdc5 7707 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
4025353c
AM
7708 if (adjust == -1)
7709 {
7710 /* This entry has been deleted. */
b3fac117 7711 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
7712 if (dsec == NULL)
7713 {
7714 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 7715 if (discarded_section (dsec))
81688140 7716 {
b3fac117 7717 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
7718 break;
7719 }
7720 }
4025353c 7721 eh->elf.root.u.def.value = 0;
81688140 7722 eh->elf.root.u.def.section = dsec;
4025353c
AM
7723 }
7724 else
7725 eh->elf.root.u.def.value += adjust;
754021d0
AM
7726 eh->adjust_done = 1;
7727 }
7728 return TRUE;
7729}
7730
8c1d1bb8 7731/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 7732 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
7733 have already been determined. */
7734
7735static bfd_boolean
7736dec_dynrel_count (bfd_vma r_info,
7737 asection *sec,
7738 struct bfd_link_info *info,
7739 Elf_Internal_Sym **local_syms,
7740 struct elf_link_hash_entry *h,
19e08130 7741 Elf_Internal_Sym *sym)
8c1d1bb8
AM
7742{
7743 enum elf_ppc64_reloc_type r_type;
19e08130 7744 asection *sym_sec = NULL;
8c1d1bb8
AM
7745
7746 /* Can this reloc be dynamic? This switch, and later tests here
7747 should be kept in sync with the code in check_relocs. */
7748 r_type = ELF64_R_TYPE (r_info);
7749 switch (r_type)
7750 {
7751 default:
7752 return TRUE;
7753
7754 case R_PPC64_TPREL16:
7755 case R_PPC64_TPREL16_LO:
7756 case R_PPC64_TPREL16_HI:
7757 case R_PPC64_TPREL16_HA:
7758 case R_PPC64_TPREL16_DS:
7759 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
7760 case R_PPC64_TPREL16_HIGH:
7761 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
7762 case R_PPC64_TPREL16_HIGHER:
7763 case R_PPC64_TPREL16_HIGHERA:
7764 case R_PPC64_TPREL16_HIGHEST:
7765 case R_PPC64_TPREL16_HIGHESTA:
8c1d1bb8
AM
7766 case R_PPC64_TPREL64:
7767 case R_PPC64_DTPMOD64:
7768 case R_PPC64_DTPREL64:
7769 case R_PPC64_ADDR64:
7770 case R_PPC64_REL30:
7771 case R_PPC64_REL32:
7772 case R_PPC64_REL64:
7773 case R_PPC64_ADDR14:
7774 case R_PPC64_ADDR14_BRNTAKEN:
7775 case R_PPC64_ADDR14_BRTAKEN:
7776 case R_PPC64_ADDR16:
7777 case R_PPC64_ADDR16_DS:
7778 case R_PPC64_ADDR16_HA:
7779 case R_PPC64_ADDR16_HI:
f9c6b907
AM
7780 case R_PPC64_ADDR16_HIGH:
7781 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
7782 case R_PPC64_ADDR16_HIGHER:
7783 case R_PPC64_ADDR16_HIGHERA:
7784 case R_PPC64_ADDR16_HIGHEST:
7785 case R_PPC64_ADDR16_HIGHESTA:
7786 case R_PPC64_ADDR16_LO:
7787 case R_PPC64_ADDR16_LO_DS:
7788 case R_PPC64_ADDR24:
7789 case R_PPC64_ADDR32:
7790 case R_PPC64_UADDR16:
7791 case R_PPC64_UADDR32:
7792 case R_PPC64_UADDR64:
7793 case R_PPC64_TOC:
7794 break;
7795 }
7796
7797 if (local_syms != NULL)
7798 {
7799 unsigned long r_symndx;
8c1d1bb8
AM
7800 bfd *ibfd = sec->owner;
7801
7802 r_symndx = ELF64_R_SYM (r_info);
7803 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7804 return FALSE;
7805 }
7806
0e1862bb 7807 if ((bfd_link_pic (info)
1d483afe 7808 && (must_be_dyn_reloc (info, r_type)
8c1d1bb8 7809 || (h != NULL
198f1157 7810 && (!SYMBOLIC_BIND (info, h)
8c1d1bb8
AM
7811 || h->root.type == bfd_link_hash_defweak
7812 || !h->def_regular))))
7813 || (ELIMINATE_COPY_RELOCS
0e1862bb 7814 && !bfd_link_pic (info)
8c1d1bb8
AM
7815 && h != NULL
7816 && (h->root.type == bfd_link_hash_defweak
7817 || !h->def_regular)))
7818 ;
7819 else
7820 return TRUE;
7821
7822 if (h != NULL)
6edfbbad 7823 {
19e08130
AM
7824 struct elf_dyn_relocs *p;
7825 struct elf_dyn_relocs **pp;
7826 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7827
7828 /* elf_gc_sweep may have already removed all dyn relocs associated
7829 with local syms for a given section. Also, symbol flags are
7830 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7831 report a dynreloc miscount. */
7832 if (*pp == NULL && info->gc_sections)
7833 return TRUE;
7834
7835 while ((p = *pp) != NULL)
60124e18 7836 {
19e08130
AM
7837 if (p->sec == sec)
7838 {
7839 if (!must_be_dyn_reloc (info, r_type))
7840 p->pc_count -= 1;
7841 p->count -= 1;
7842 if (p->count == 0)
7843 *pp = p->next;
7844 return TRUE;
7845 }
7846 pp = &p->next;
60124e18 7847 }
6edfbbad 7848 }
19e08130
AM
7849 else
7850 {
7851 struct ppc_dyn_relocs *p;
7852 struct ppc_dyn_relocs **pp;
7853 void *vpp;
7854 bfd_boolean is_ifunc;
8c1d1bb8 7855
19e08130
AM
7856 if (local_syms == NULL)
7857 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7858 if (sym_sec == NULL)
7859 sym_sec = sec;
c57da1a7 7860
19e08130
AM
7861 vpp = &elf_section_data (sym_sec)->local_dynrel;
7862 pp = (struct ppc_dyn_relocs **) vpp;
7863
7864 if (*pp == NULL && info->gc_sections)
7865 return TRUE;
7866
7867 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7868 while ((p = *pp) != NULL)
8c1d1bb8 7869 {
19e08130
AM
7870 if (p->sec == sec && p->ifunc == is_ifunc)
7871 {
7872 p->count -= 1;
7873 if (p->count == 0)
7874 *pp = p->next;
7875 return TRUE;
7876 }
7877 pp = &p->next;
8c1d1bb8 7878 }
8c1d1bb8
AM
7879 }
7880
695344c0 7881 /* xgettext:c-format */
cf97bcb0
AM
7882 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"),
7883 sec->owner, sec);
8c1d1bb8
AM
7884 bfd_set_error (bfd_error_bad_value);
7885 return FALSE;
7886}
7887
754021d0
AM
7888/* Remove unused Official Procedure Descriptor entries. Currently we
7889 only remove those associated with functions in discarded link-once
7890 sections, or weakly defined functions that have been overridden. It
7891 would be possible to remove many more entries for statically linked
7892 applications. */
7893
b34976b6 7894bfd_boolean
e7d1c40c 7895ppc64_elf_edit_opd (struct bfd_link_info *info)
1e2f5b6e
AM
7896{
7897 bfd *ibfd;
754021d0 7898 bfd_boolean some_edited = FALSE;
3f764659 7899 asection *need_pad = NULL;
e7d1c40c
AM
7900 struct ppc_link_hash_table *htab;
7901
7902 htab = ppc_hash_table (info);
7903 if (htab == NULL)
7904 return FALSE;
1e2f5b6e 7905
c72f2fb2 7906 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1e2f5b6e
AM
7907 {
7908 asection *sec;
7909 Elf_Internal_Rela *relstart, *rel, *relend;
7910 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7911 Elf_Internal_Sym *local_syms;
74f0fb50 7912 struct _opd_sec_data *opd;
51aecdc5 7913 bfd_boolean need_edit, add_aux_fields, broken;
3f764659 7914 bfd_size_type cnt_16b = 0;
1e2f5b6e 7915
854b41e7
AM
7916 if (!is_ppc64_elf (ibfd))
7917 continue;
7918
1e2f5b6e 7919 sec = bfd_get_section_by_name (ibfd, ".opd");
46de2a7c 7920 if (sec == NULL || sec->size == 0)
1e2f5b6e
AM
7921 continue;
7922
dbaa2011 7923 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7924 continue;
7925
1e2f5b6e
AM
7926 if (sec->output_section == bfd_abs_section_ptr)
7927 continue;
7928
7929 /* Look through the section relocs. */
7930 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7931 continue;
7932
6cdc0ccc 7933 local_syms = NULL;
0ffa91dd 7934 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7935
7936 /* Read the relocations. */
4ce794b7 7937 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7938 info->keep_memory);
1e2f5b6e 7939 if (relstart == NULL)
b34976b6 7940 return FALSE;
1e2f5b6e
AM
7941
7942 /* First run through the relocs to check they are sane, and to
7943 determine whether we need to edit this opd section. */
b34976b6 7944 need_edit = FALSE;
51aecdc5 7945 broken = FALSE;
3f764659 7946 need_pad = sec;
1e2f5b6e 7947 relend = relstart + sec->reloc_count;
50bc7936 7948 for (rel = relstart; rel < relend; )
1e2f5b6e 7949 {
04c9666a 7950 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7951 unsigned long r_symndx;
7952 asection *sym_sec;
7953 struct elf_link_hash_entry *h;
7954 Elf_Internal_Sym *sym;
51aecdc5 7955 bfd_vma offset;
1e2f5b6e 7956
51aecdc5 7957 /* .opd contains an array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7958 only interested in the reloc pointing to a function entry
7959 point. */
51aecdc5
AM
7960 offset = rel->r_offset;
7961 if (rel + 1 == relend
7962 || rel[1].r_offset != offset + 8)
1e2f5b6e
AM
7963 {
7964 /* If someone messes with .opd alignment then after a
7965 "ld -r" we might have padding in the middle of .opd.
7966 Also, there's nothing to prevent someone putting
7967 something silly in .opd with the assembler. No .opd
b34976b6 7968 optimization for them! */
3f764659 7969 broken_opd:
4eca0228 7970 _bfd_error_handler
871b3ab2 7971 (_("%pB: .opd is not a regular array of opd entries"), ibfd);
51aecdc5 7972 broken = TRUE;
1e2f5b6e
AM
7973 break;
7974 }
7975
50bc7936
AM
7976 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7977 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7978 {
4eca0228 7979 _bfd_error_handler
695344c0 7980 /* xgettext:c-format */
871b3ab2 7981 (_("%pB: unexpected reloc type %u in .opd section"),
d003868e 7982 ibfd, r_type);
51aecdc5 7983 broken = TRUE;
50bc7936
AM
7984 break;
7985 }
7986
1e2f5b6e 7987 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7988 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7989 r_symndx, ibfd))
50bc7936 7990 goto error_ret;
1e2f5b6e
AM
7991
7992 if (sym_sec == NULL || sym_sec->owner == NULL)
7993 {
411e1bfb
AM
7994 const char *sym_name;
7995 if (h != NULL)
7996 sym_name = h->root.root.string;
7997 else
26c61ae5
L
7998 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7999 sym_sec);
411e1bfb 8000
4eca0228 8001 _bfd_error_handler
695344c0 8002 /* xgettext:c-format */
871b3ab2 8003 (_("%pB: undefined sym `%s' in .opd section"),
d003868e 8004 ibfd, sym_name);
51aecdc5 8005 broken = TRUE;
1e2f5b6e
AM
8006 break;
8007 }
8008
51020317
AM
8009 /* opd entries are always for functions defined in the
8010 current input bfd. If the symbol isn't defined in the
8011 input bfd, then we won't be using the function in this
8012 bfd; It must be defined in a linkonce section in another
8013 bfd, or is weak. It's also possible that we are
8014 discarding the function due to a linker script /DISCARD/,
8015 which we test for via the output_section. */
8016 if (sym_sec->owner != ibfd
8017 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 8018 need_edit = TRUE;
1e2f5b6e 8019
50bc7936 8020 rel += 2;
51aecdc5
AM
8021 if (rel + 1 == relend
8022 || (rel + 2 < relend
8023 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
8024 ++rel;
8025
8026 if (rel == relend)
3f764659
JJ
8027 {
8028 if (sec->size == offset + 24)
8029 {
8030 need_pad = NULL;
8031 break;
8032 }
51aecdc5 8033 if (sec->size == offset + 16)
3f764659
JJ
8034 {
8035 cnt_16b++;
8036 break;
8037 }
8038 goto broken_opd;
8039 }
3f764659
JJ
8040 else if (rel + 1 < relend
8041 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
8042 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
8043 {
51aecdc5
AM
8044 if (rel[0].r_offset == offset + 16)
8045 cnt_16b++;
8046 else if (rel[0].r_offset != offset + 24)
8047 goto broken_opd;
3f764659
JJ
8048 }
8049 else
8050 goto broken_opd;
1e2f5b6e
AM
8051 }
8052
e7d1c40c 8053 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
3f764659 8054
51aecdc5 8055 if (!broken && (need_edit || add_aux_fields))
1e2f5b6e
AM
8056 {
8057 Elf_Internal_Rela *write_rel;
d4730f92 8058 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 8059 bfd_byte *rptr, *wptr;
983bddc8 8060 bfd_byte *new_contents;
74f0fb50
AM
8061 bfd_size_type amt;
8062
983bddc8 8063 new_contents = NULL;
51aecdc5 8064 amt = OPD_NDX (sec->size) * sizeof (long);
74f0fb50 8065 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 8066 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50
AM
8067 if (opd->adjust == NULL)
8068 return FALSE;
1e2f5b6e
AM
8069
8070 /* This seems a waste of time as input .opd sections are all
8071 zeros as generated by gcc, but I suppose there's no reason
8072 this will always be so. We might start putting something in
8073 the third word of .opd entries. */
8074 if ((sec->flags & SEC_IN_MEMORY) == 0)
8075 {
eea6121a
AM
8076 bfd_byte *loc;
8077 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 8078 {
eea6121a
AM
8079 if (loc != NULL)
8080 free (loc);
50bc7936 8081 error_ret:
6cdc0ccc
AM
8082 if (local_syms != NULL
8083 && symtab_hdr->contents != (unsigned char *) local_syms)
8084 free (local_syms);
6cdc0ccc
AM
8085 if (elf_section_data (sec)->relocs != relstart)
8086 free (relstart);
b34976b6 8087 return FALSE;
6cdc0ccc 8088 }
1e2f5b6e
AM
8089 sec->contents = loc;
8090 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8091 }
8092
8093 elf_section_data (sec)->relocs = relstart;
8094
3f764659 8095 new_contents = sec->contents;
3f764659
JJ
8096 if (add_aux_fields)
8097 {
8098 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
8099 if (new_contents == NULL)
8100 return FALSE;
51aecdc5 8101 need_pad = NULL;
3f764659 8102 }
b4f4e59f
AM
8103 wptr = new_contents;
8104 rptr = sec->contents;
1e2f5b6e 8105 write_rel = relstart;
51aecdc5 8106 for (rel = relstart; rel < relend; )
1e2f5b6e 8107 {
50bc7936
AM
8108 unsigned long r_symndx;
8109 asection *sym_sec;
8110 struct elf_link_hash_entry *h;
51aecdc5 8111 struct ppc_link_hash_entry *fdh = NULL;
50bc7936 8112 Elf_Internal_Sym *sym;
51aecdc5
AM
8113 long opd_ent_size;
8114 Elf_Internal_Rela *next_rel;
8115 bfd_boolean skip;
50bc7936
AM
8116
8117 r_symndx = ELF64_R_SYM (rel->r_info);
8118 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 8119 r_symndx, ibfd))
50bc7936
AM
8120 goto error_ret;
8121
51aecdc5
AM
8122 next_rel = rel + 2;
8123 if (next_rel + 1 == relend
8124 || (next_rel + 2 < relend
8125 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
8126 ++next_rel;
8127
8128 /* See if the .opd entry is full 24 byte or
8129 16 byte (with fd_aux entry overlapped with next
8130 fd_func). */
8131 opd_ent_size = 24;
8132 if (next_rel == relend)
1e2f5b6e 8133 {
51aecdc5 8134 if (sec->size == rel->r_offset + 16)
3f764659 8135 opd_ent_size = 16;
51aecdc5
AM
8136 }
8137 else if (next_rel->r_offset == rel->r_offset + 16)
8138 opd_ent_size = 16;
3f764659 8139
51aecdc5
AM
8140 if (h != NULL
8141 && h->root.root.string[0] == '.')
8142 {
8c5b4e52
AM
8143 fdh = ((struct ppc_link_hash_entry *) h)->oh;
8144 if (fdh != NULL)
8145 {
8146 fdh = ppc_follow_link (fdh);
8147 if (fdh->elf.root.type != bfd_link_hash_defined
8148 && fdh->elf.root.type != bfd_link_hash_defweak)
8149 fdh = NULL;
8150 }
51aecdc5 8151 }
1e2f5b6e 8152
51aecdc5
AM
8153 skip = (sym_sec->owner != ibfd
8154 || sym_sec->output_section == bfd_abs_section_ptr);
8155 if (skip)
8156 {
8157 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7 8158 {
51aecdc5
AM
8159 /* Arrange for the function descriptor sym
8160 to be dropped. */
8161 fdh->elf.root.u.def.value = 0;
8162 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 8163 }
51aecdc5 8164 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
1e2f5b6e 8165
0e1862bb 8166 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
51aecdc5
AM
8167 rel = next_rel;
8168 else
8169 while (1)
8170 {
8171 if (!dec_dynrel_count (rel->r_info, sec, info,
8172 NULL, h, sym))
8173 goto error_ret;
754021d0 8174
51aecdc5
AM
8175 if (++rel == next_rel)
8176 break;
1e2f5b6e 8177
51aecdc5
AM
8178 r_symndx = ELF64_R_SYM (rel->r_info);
8179 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8180 r_symndx, ibfd))
8181 goto error_ret;
8182 }
50bc7936
AM
8183 }
8184 else
1e2f5b6e 8185 {
51aecdc5
AM
8186 /* We'll be keeping this opd entry. */
8187 long adjust;
8188
8189 if (fdh != NULL)
8190 {
8191 /* Redefine the function descriptor symbol to
8192 this location in the opd section. It is
8193 necessary to update the value here rather
8194 than using an array of adjustments as we do
8195 for local symbols, because various places
8196 in the generic ELF code use the value
8197 stored in u.def.value. */
8198 fdh->elf.root.u.def.value = wptr - new_contents;
8199 fdh->adjust_done = 1;
8200 }
8201
8202 /* Local syms are a bit tricky. We could
8203 tweak them as they can be cached, but
8204 we'd need to look through the local syms
8205 for the function descriptor sym which we
8206 don't have at the moment. So keep an
8207 array of adjustments. */
8208 adjust = (wptr - new_contents) - (rptr - sec->contents);
8209 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
8210
8211 if (wptr != rptr)
8212 memcpy (wptr, rptr, opd_ent_size);
8213 wptr += opd_ent_size;
8214 if (add_aux_fields && opd_ent_size == 16)
8215 {
8216 memset (wptr, '\0', 8);
8217 wptr += 8;
8218 }
8219
50bc7936 8220 /* We need to adjust any reloc offsets to point to the
51aecdc5
AM
8221 new opd entries. */
8222 for ( ; rel != next_rel; ++rel)
8223 {
8224 rel->r_offset += adjust;
8225 if (write_rel != rel)
8226 memcpy (write_rel, rel, sizeof (*rel));
8227 ++write_rel;
8228 }
1e2f5b6e 8229 }
51aecdc5
AM
8230
8231 rptr += opd_ent_size;
1e2f5b6e
AM
8232 }
8233
3f764659 8234 sec->size = wptr - new_contents;
1e2f5b6e 8235 sec->reloc_count = write_rel - relstart;
3f764659
JJ
8236 if (add_aux_fields)
8237 {
8238 free (sec->contents);
8239 sec->contents = new_contents;
8240 }
8241
05bf9422 8242 /* Fudge the header size too, as this is used later in
cdcf6e38 8243 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
8244 rel_hdr = _bfd_elf_single_rel_hdr (sec);
8245 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
754021d0 8246 some_edited = TRUE;
1e2f5b6e 8247 }
6cdc0ccc 8248 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 8249 free (relstart);
6cdc0ccc 8250
411e1bfb
AM
8251 if (local_syms != NULL
8252 && symtab_hdr->contents != (unsigned char *) local_syms)
8253 {
8254 if (!info->keep_memory)
8255 free (local_syms);
8256 else
8257 symtab_hdr->contents = (unsigned char *) local_syms;
8258 }
8259 }
8260
754021d0
AM
8261 if (some_edited)
8262 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
8263
3f764659
JJ
8264 /* If we are doing a final link and the last .opd entry is just 16 byte
8265 long, add a 8 byte padding after it. */
0e1862bb 8266 if (need_pad != NULL && !bfd_link_relocatable (info))
3f764659
JJ
8267 {
8268 bfd_byte *p;
8269
8270 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
8271 {
8272 BFD_ASSERT (need_pad->size > 0);
8273
8274 p = bfd_malloc (need_pad->size + 8);
8275 if (p == NULL)
8276 return FALSE;
699733f6 8277
3f764659
JJ
8278 if (! bfd_get_section_contents (need_pad->owner, need_pad,
8279 p, 0, need_pad->size))
8280 return FALSE;
8281
8282 need_pad->contents = p;
8283 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8284 }
8285 else
8286 {
8287 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
8288 if (p == NULL)
8289 return FALSE;
8290
8291 need_pad->contents = p;
8292 }
8293
8294 memset (need_pad->contents + need_pad->size, 0, 8);
8295 need_pad->size += 8;
8296 }
8297
411e1bfb
AM
8298 return TRUE;
8299}
8300
3e04d765
AM
8301/* Analyze inline PLT call relocations to see whether calls to locally
8302 defined functions can be converted to direct calls. */
8303
8304bfd_boolean
8305ppc64_elf_inline_plt (struct bfd_link_info *info)
8306{
8307 struct ppc_link_hash_table *htab;
8308 bfd *ibfd;
8309 asection *sec;
8310 bfd_vma low_vma, high_vma, limit;
8311
8312 htab = ppc_hash_table (info);
8313 if (htab == NULL)
8314 return FALSE;
8315
8316 /* A bl insn can reach -0x2000000 to 0x1fffffc. The limit is
8317 reduced somewhat to cater for possible stubs that might be added
8318 between the call and its destination. */
8319 if (htab->params->group_size < 0)
8320 {
8321 limit = -htab->params->group_size;
8322 if (limit == 1)
8323 limit = 0x1e00000;
8324 }
8325 else
8326 {
8327 limit = htab->params->group_size;
8328 if (limit == 1)
8329 limit = 0x1c00000;
8330 }
8331
8332 low_vma = -1;
8333 high_vma = 0;
8334 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
8335 if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
8336 {
8337 if (low_vma > sec->vma)
8338 low_vma = sec->vma;
8339 if (high_vma < sec->vma + sec->size)
8340 high_vma = sec->vma + sec->size;
8341 }
8342
8343 /* If a "bl" can reach anywhere in local code sections, then we can
8344 convert all inline PLT sequences to direct calls when the symbol
8345 is local. */
8346 if (high_vma - low_vma < limit)
8347 {
8348 htab->can_convert_all_inline_plt = 1;
8349 return TRUE;
8350 }
8351
8352 /* Otherwise, go looking through relocs for cases where a direct
8353 call won't reach. Mark the symbol on any such reloc to disable
8354 the optimization and keep the PLT entry as it seems likely that
8355 this will be better than creating trampolines. Note that this
8356 will disable the optimization for all inline PLT calls to a
8357 particular symbol, not just those that won't reach. The
8358 difficulty in doing a more precise optimization is that the
8359 linker needs to make a decision depending on whether a
8360 particular R_PPC64_PLTCALL insn can be turned into a direct
8361 call, for each of the R_PPC64_PLTSEQ and R_PPC64_PLT16* insns in
8362 the sequence, and there is nothing that ties those relocs
8363 together except their symbol. */
8364
8365 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8366 {
8367 Elf_Internal_Shdr *symtab_hdr;
8368 Elf_Internal_Sym *local_syms;
8369
8370 if (!is_ppc64_elf (ibfd))
8371 continue;
8372
8373 local_syms = NULL;
8374 symtab_hdr = &elf_symtab_hdr (ibfd);
8375
8376 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8377 if (ppc64_elf_section_data (sec)->has_pltcall
8378 && !bfd_is_abs_section (sec->output_section))
8379 {
8380 Elf_Internal_Rela *relstart, *rel, *relend;
8381
8382 /* Read the relocations. */
8383 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8384 info->keep_memory);
8385 if (relstart == NULL)
8386 return FALSE;
8387
8388 relend = relstart + sec->reloc_count;
8389 for (rel = relstart; rel < relend; )
8390 {
8391 enum elf_ppc64_reloc_type r_type;
8392 unsigned long r_symndx;
8393 asection *sym_sec;
8394 struct elf_link_hash_entry *h;
8395 Elf_Internal_Sym *sym;
8396 unsigned char *tls_maskp;
8397
8398 r_type = ELF64_R_TYPE (rel->r_info);
8399 if (r_type != R_PPC64_PLTCALL)
8400 continue;
8401
8402 r_symndx = ELF64_R_SYM (rel->r_info);
8403 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
8404 r_symndx, ibfd))
8405 {
8406 if (elf_section_data (sec)->relocs != relstart)
8407 free (relstart);
8408 if (local_syms != NULL
8409 && symtab_hdr->contents != (unsigned char *) local_syms)
8410 free (local_syms);
8411 return FALSE;
8412 }
8413
8414 if (sym_sec != NULL && sym_sec->output_section != NULL)
8415 {
8416 bfd_vma from, to;
8417 if (h != NULL)
8418 to = h->root.u.def.value;
8419 else
8420 to = sym->st_value;
8421 to += (rel->r_addend
8422 + sym_sec->output_offset
8423 + sym_sec->output_section->vma);
8424 from = (rel->r_offset
8425 + sec->output_offset
8426 + sec->output_section->vma);
8427 if (to - from + limit < 2 * limit)
8428 *tls_maskp &= ~PLT_KEEP;
8429 }
8430 }
8431 if (elf_section_data (sec)->relocs != relstart)
8432 free (relstart);
8433 }
8434
8435 if (local_syms != NULL
8436 && symtab_hdr->contents != (unsigned char *) local_syms)
8437 {
8438 if (!info->keep_memory)
8439 free (local_syms);
8440 else
8441 symtab_hdr->contents = (unsigned char *) local_syms;
8442 }
8443 }
8444
8445 return TRUE;
8446}
8447
e1918d23 8448/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 8449
e1918d23 8450asection *
e7d1c40c 8451ppc64_elf_tls_setup (struct bfd_link_info *info)
411e1bfb 8452{
411e1bfb
AM
8453 struct ppc_link_hash_table *htab;
8454
411e1bfb 8455 htab = ppc_hash_table (info);
4dfe6ac6
NC
8456 if (htab == NULL)
8457 return NULL;
8458
ee67d69a
AM
8459 if (abiversion (info->output_bfd) == 1)
8460 htab->opd_abi = 1;
8461
e7d1c40c 8462 if (htab->params->no_multi_toc)
33c0ec9d
AM
8463 htab->do_multi_toc = 0;
8464 else if (!htab->do_multi_toc)
e7d1c40c 8465 htab->params->no_multi_toc = 1;
33c0ec9d 8466
8b5f1ed8
AM
8467 /* Default to --no-plt-localentry, as this option can cause problems
8468 with symbol interposition. For example, glibc libpthread.so and
8469 libc.so duplicate many pthread symbols, with a fallback
8470 implementation in libc.so. In some cases the fallback does more
8471 work than the pthread implementation. __pthread_condattr_destroy
8472 is one such symbol: the libpthread.so implementation is
8473 localentry:0 while the libc.so implementation is localentry:8.
8474 An app that "cleverly" uses dlopen to only load necessary
8475 libraries at runtime may omit loading libpthread.so when not
8476 running multi-threaded, which then results in the libc.so
8477 fallback symbols being used and ld.so complaining. Now there
8478 are workarounds in ld (see non_zero_localentry) to detect the
8479 pthread situation, but that may not be the only case where
8480 --plt-localentry can cause trouble. */
f378ab09 8481 if (htab->params->plt_localentry0 < 0)
8b5f1ed8 8482 htab->params->plt_localentry0 = 0;
d44c746a
AM
8483 if (htab->params->plt_localentry0
8484 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
8485 FALSE, FALSE, FALSE) == NULL)
cf97bcb0
AM
8486 _bfd_error_handler
8487 (_("warning: --plt-localentry is especially dangerous without "
8488 "ld.so support to detect ABI violations"));
f378ab09 8489
3a71aa26
AM
8490 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
8491 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
8492 FALSE, FALSE, TRUE));
a7f2871e
AM
8493 /* Move dynamic linking info to the function descriptor sym. */
8494 if (htab->tls_get_addr != NULL)
8495 func_desc_adjust (&htab->tls_get_addr->elf, info);
3a71aa26
AM
8496 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
8497 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
8498 FALSE, FALSE, TRUE));
7c9cf415 8499 if (htab->params->tls_get_addr_opt)
a7f2871e
AM
8500 {
8501 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
8502
8503 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
8504 FALSE, FALSE, TRUE);
8505 if (opt != NULL)
8506 func_desc_adjust (opt, info);
8507 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
8508 FALSE, FALSE, TRUE);
8509 if (opt_fd != NULL
8510 && (opt_fd->root.type == bfd_link_hash_defined
8511 || opt_fd->root.type == bfd_link_hash_defweak))
8512 {
8513 /* If glibc supports an optimized __tls_get_addr call stub,
8514 signalled by the presence of __tls_get_addr_opt, and we'll
8515 be calling __tls_get_addr via a plt call stub, then
8516 make __tls_get_addr point to __tls_get_addr_opt. */
8517 tga_fd = &htab->tls_get_addr_fd->elf;
8518 if (htab->elf.dynamic_sections_created
8519 && tga_fd != NULL
8520 && (tga_fd->type == STT_FUNC
8521 || tga_fd->needs_plt)
8522 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
21d68fcd 8523 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd)))
a7f2871e
AM
8524 {
8525 struct plt_entry *ent;
8526
8527 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
8528 if (ent->plt.refcount > 0)
8529 break;
8530 if (ent != NULL)
8531 {
8532 tga_fd->root.type = bfd_link_hash_indirect;
8533 tga_fd->root.u.i.link = &opt_fd->root;
8534 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
b531344c 8535 opt_fd->mark = 1;
a7f2871e
AM
8536 if (opt_fd->dynindx != -1)
8537 {
8538 /* Use __tls_get_addr_opt in dynamic relocations. */
8539 opt_fd->dynindx = -1;
8540 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
8541 opt_fd->dynstr_index);
8542 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
854b41e7 8543 return NULL;
a7f2871e
AM
8544 }
8545 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
8546 tga = &htab->tls_get_addr->elf;
8547 if (opt != NULL && tga != NULL)
8548 {
8549 tga->root.type = bfd_link_hash_indirect;
8550 tga->root.u.i.link = &opt->root;
8551 ppc64_elf_copy_indirect_symbol (info, opt, tga);
b531344c 8552 opt->mark = 1;
a7f2871e
AM
8553 _bfd_elf_link_hash_hide_symbol (info, opt,
8554 tga->forced_local);
8555 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
8556 }
8557 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
8558 htab->tls_get_addr_fd->is_func_descriptor = 1;
8559 if (htab->tls_get_addr != NULL)
8560 {
8561 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8562 htab->tls_get_addr->is_func = 1;
8563 }
8564 }
8565 }
8566 }
7c9cf415
AM
8567 else if (htab->params->tls_get_addr_opt < 0)
8568 htab->params->tls_get_addr_opt = 0;
a7f2871e 8569 }
33c0ec9d 8570 return _bfd_elf_tls_setup (info->output_bfd, info);
3a71aa26 8571}
8387904d 8572
3a71aa26
AM
8573/* Return TRUE iff REL is a branch reloc with a global symbol matching
8574 HASH1 or HASH2. */
8387904d 8575
3a71aa26
AM
8576static bfd_boolean
8577branch_reloc_hash_match (const bfd *ibfd,
8578 const Elf_Internal_Rela *rel,
8579 const struct ppc_link_hash_entry *hash1,
8580 const struct ppc_link_hash_entry *hash2)
8581{
8582 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8583 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8584 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8585
e054468f 8586 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 8587 {
3a71aa26
AM
8588 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8589 struct elf_link_hash_entry *h;
8387904d 8590
3a71aa26 8591 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 8592 h = elf_follow_link (h);
3a71aa26
AM
8593 if (h == &hash1->elf || h == &hash2->elf)
8594 return TRUE;
a48ebf4d 8595 }
3a71aa26 8596 return FALSE;
951fd09b 8597}
411e1bfb 8598
951fd09b
AM
8599/* Run through all the TLS relocs looking for optimization
8600 opportunities. The linker has been hacked (see ppc64elf.em) to do
8601 a preliminary section layout so that we know the TLS segment
8602 offsets. We can't optimize earlier because some optimizations need
8603 to know the tp offset, and we need to optimize before allocating
8604 dynamic relocations. */
8605
8606bfd_boolean
33c0ec9d 8607ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
8608{
8609 bfd *ibfd;
8610 asection *sec;
8611 struct ppc_link_hash_table *htab;
663a1470 8612 unsigned char *toc_ref;
102890f0 8613 int pass;
951fd09b 8614
3cbc1e5e 8615 if (!bfd_link_executable (info))
411e1bfb
AM
8616 return TRUE;
8617
951fd09b 8618 htab = ppc_hash_table (info);
4dfe6ac6
NC
8619 if (htab == NULL)
8620 return FALSE;
8621
663a1470
AM
8622 /* Make two passes over the relocs. On the first pass, mark toc
8623 entries involved with tls relocs, and check that tls relocs
8624 involved in setting up a tls_get_addr call are indeed followed by
8625 such a call. If they are not, we can't do any tls optimization.
8626 On the second pass twiddle tls_mask flags to notify
8627 relocate_section that optimization can be done, and adjust got
8628 and plt refcounts. */
8629 toc_ref = NULL;
8630 for (pass = 0; pass < 2; ++pass)
c72f2fb2 8631 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
663a1470
AM
8632 {
8633 Elf_Internal_Sym *locsyms = NULL;
8634 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8635
102890f0
AM
8636 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8637 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8638 {
8639 Elf_Internal_Rela *relstart, *rel, *relend;
663a1470 8640 bfd_boolean found_tls_get_addr_arg = 0;
411e1bfb 8641
102890f0
AM
8642 /* Read the relocations. */
8643 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8644 info->keep_memory);
8645 if (relstart == NULL)
2915c55b
JK
8646 {
8647 free (toc_ref);
8648 return FALSE;
8649 }
411e1bfb 8650
102890f0
AM
8651 relend = relstart + sec->reloc_count;
8652 for (rel = relstart; rel < relend; rel++)
8653 {
8654 enum elf_ppc64_reloc_type r_type;
8655 unsigned long r_symndx;
8656 struct elf_link_hash_entry *h;
8657 Elf_Internal_Sym *sym;
8658 asection *sym_sec;
f961d9dd
AM
8659 unsigned char *tls_mask;
8660 unsigned char tls_set, tls_clear, tls_type = 0;
102890f0
AM
8661 bfd_vma value;
8662 bfd_boolean ok_tprel, is_local;
8663 long toc_ref_index = 0;
8664 int expecting_tls_get_addr = 0;
663a1470 8665 bfd_boolean ret = FALSE;
411e1bfb 8666
102890f0
AM
8667 r_symndx = ELF64_R_SYM (rel->r_info);
8668 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8669 r_symndx, ibfd))
8670 {
8671 err_free_rel:
8672 if (elf_section_data (sec)->relocs != relstart)
8673 free (relstart);
8674 if (toc_ref != NULL)
8675 free (toc_ref);
8676 if (locsyms != NULL
0ffa91dd 8677 && (elf_symtab_hdr (ibfd).contents
102890f0
AM
8678 != (unsigned char *) locsyms))
8679 free (locsyms);
663a1470 8680 return ret;
102890f0 8681 }
411e1bfb 8682
102890f0
AM
8683 if (h != NULL)
8684 {
766bc656
AM
8685 if (h->root.type == bfd_link_hash_defined
8686 || h->root.type == bfd_link_hash_defweak)
8687 value = h->root.u.def.value;
8688 else if (h->root.type == bfd_link_hash_undefweak)
8689 value = 0;
8690 else
663a1470
AM
8691 {
8692 found_tls_get_addr_arg = 0;
8693 continue;
8694 }
102890f0
AM
8695 }
8696 else
8697 /* Symbols referenced by TLS relocs must be of type
8698 STT_TLS. So no need for .opd local sym adjust. */
8699 value = sym->st_value;
8700
8701 ok_tprel = FALSE;
8702 is_local = FALSE;
8703 if (h == NULL
8704 || !h->def_dynamic)
8705 {
8706 is_local = TRUE;
766bc656
AM
8707 if (h != NULL
8708 && h->root.type == bfd_link_hash_undefweak)
8709 ok_tprel = TRUE;
c27b8c2a
AM
8710 else if (sym_sec != NULL
8711 && sym_sec->output_section != NULL)
766bc656
AM
8712 {
8713 value += sym_sec->output_offset;
8714 value += sym_sec->output_section->vma;
8715 value -= htab->elf.tls_sec->vma;
8716 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8717 < (bfd_vma) 1 << 32);
8718 }
102890f0 8719 }
951fd09b 8720
102890f0 8721 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
8722 /* If this section has old-style __tls_get_addr calls
8723 without marker relocs, then check that each
8724 __tls_get_addr call reloc is preceded by a reloc
8725 that conceivably belongs to the __tls_get_addr arg
8726 setup insn. If we don't find matching arg setup
8727 relocs, don't do any tls optimization. */
8728 if (pass == 0
8729 && sec->has_tls_get_addr_call
8730 && h != NULL
8731 && (h == &htab->tls_get_addr->elf
8732 || h == &htab->tls_get_addr_fd->elf)
8733 && !found_tls_get_addr_arg
8734 && is_branch_reloc (r_type))
8735 {
25f53a85 8736 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
8737 "TLS optimization disabled\n"),
8738 ibfd, sec, rel->r_offset);
8739 ret = TRUE;
8740 goto err_free_rel;
8741 }
8742
8743 found_tls_get_addr_arg = 0;
102890f0
AM
8744 switch (r_type)
8745 {
8746 case R_PPC64_GOT_TLSLD16:
8747 case R_PPC64_GOT_TLSLD16_LO:
8748 expecting_tls_get_addr = 1;
663a1470 8749 found_tls_get_addr_arg = 1;
1a0670f3 8750 /* Fall through. */
102890f0
AM
8751
8752 case R_PPC64_GOT_TLSLD16_HI:
8753 case R_PPC64_GOT_TLSLD16_HA:
8754 /* These relocs should never be against a symbol
8755 defined in a shared lib. Leave them alone if
8756 that turns out to be the case. */
8757 if (!is_local)
8758 continue;
411e1bfb 8759
102890f0 8760 /* LD -> LE */
411e1bfb 8761 tls_set = 0;
102890f0
AM
8762 tls_clear = TLS_LD;
8763 tls_type = TLS_TLS | TLS_LD;
8764 break;
411e1bfb 8765
102890f0
AM
8766 case R_PPC64_GOT_TLSGD16:
8767 case R_PPC64_GOT_TLSGD16_LO:
8768 expecting_tls_get_addr = 1;
663a1470 8769 found_tls_get_addr_arg = 1;
1a0670f3 8770 /* Fall through. */
102890f0
AM
8771
8772 case R_PPC64_GOT_TLSGD16_HI:
8773 case R_PPC64_GOT_TLSGD16_HA:
8774 if (ok_tprel)
8775 /* GD -> LE */
411e1bfb 8776 tls_set = 0;
102890f0
AM
8777 else
8778 /* GD -> IE */
8779 tls_set = TLS_TLS | TLS_TPRELGD;
8780 tls_clear = TLS_GD;
8781 tls_type = TLS_TLS | TLS_GD;
8782 break;
8783
8784 case R_PPC64_GOT_TPREL16_DS:
8785 case R_PPC64_GOT_TPREL16_LO_DS:
8786 case R_PPC64_GOT_TPREL16_HI:
8787 case R_PPC64_GOT_TPREL16_HA:
8788 if (ok_tprel)
8789 {
8790 /* IE -> LE */
8791 tls_set = 0;
8792 tls_clear = TLS_TPREL;
8793 tls_type = TLS_TLS | TLS_TPREL;
8794 break;
8795 }
411e1bfb
AM
8796 continue;
8797
727fc41e
AM
8798 case R_PPC64_TLSGD:
8799 case R_PPC64_TLSLD:
23cedd1d
AM
8800 if (rel + 1 < relend
8801 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
8802 {
8803 if (pass != 0
8804 && ELF64_R_TYPE (rel[1].r_info) != R_PPC64_PLTSEQ)
8805 {
8806 r_symndx = ELF64_R_SYM (rel[1].r_info);
8807 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms,
8808 r_symndx, ibfd))
8809 goto err_free_rel;
8810 if (h != NULL)
8811 {
8812 struct plt_entry *ent = NULL;
8813
8814 for (ent = h->plt.plist;
8815 ent != NULL;
8816 ent = ent->next)
8817 if (ent->addend == rel[1].r_addend)
8818 break;
8819
8820 if (ent != NULL
8821 && ent->plt.refcount > 0)
8822 ent->plt.refcount -= 1;
8823 }
8824 }
8825 continue;
8826 }
663a1470 8827 found_tls_get_addr_arg = 1;
1a0670f3 8828 /* Fall through. */
663a1470
AM
8829
8830 case R_PPC64_TLS:
8831 case R_PPC64_TOC16:
8832 case R_PPC64_TOC16_LO:
102890f0
AM
8833 if (sym_sec == NULL || sym_sec != toc)
8834 continue;
8835
8836 /* Mark this toc entry as referenced by a TLS
8837 code sequence. We can do that now in the
8838 case of R_PPC64_TLS, and after checking for
8839 tls_get_addr for the TOC16 relocs. */
8840 if (toc_ref == NULL)
663a1470
AM
8841 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8842 if (toc_ref == NULL)
8843 goto err_free_rel;
8844
102890f0
AM
8845 if (h != NULL)
8846 value = h->root.u.def.value;
8847 else
8848 value = sym->st_value;
8849 value += rel->r_addend;
73242275
AM
8850 if (value % 8 != 0)
8851 continue;
8852 BFD_ASSERT (value < toc->size
8853 && toc->output_offset % 8 == 0);
663a1470 8854 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
8855 if (r_type == R_PPC64_TLS
8856 || r_type == R_PPC64_TLSGD
8857 || r_type == R_PPC64_TLSLD)
102890f0
AM
8858 {
8859 toc_ref[toc_ref_index] = 1;
8860 continue;
8861 }
8862
8863 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8864 continue;
8865
8866 tls_set = 0;
8867 tls_clear = 0;
8868 expecting_tls_get_addr = 2;
8869 break;
8870
8871 case R_PPC64_TPREL64:
8872 if (pass == 0
8873 || sec != toc
8874 || toc_ref == NULL
663a1470 8875 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8876 continue;
8877 if (ok_tprel)
8878 {
8879 /* IE -> LE */
8880 tls_set = TLS_EXPLICIT;
8881 tls_clear = TLS_TPREL;
8882 break;
8883 }
8884 continue;
8885
8886 case R_PPC64_DTPMOD64:
8887 if (pass == 0
8888 || sec != toc
8889 || toc_ref == NULL
663a1470 8890 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8891 continue;
8892 if (rel + 1 < relend
8893 && (rel[1].r_info
8894 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8895 && rel[1].r_offset == rel->r_offset + 8)
8896 {
8897 if (ok_tprel)
8898 /* GD -> LE */
8899 tls_set = TLS_EXPLICIT | TLS_GD;
8900 else
8901 /* GD -> IE */
8902 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8903 tls_clear = TLS_GD;
8904 }
8905 else
8906 {
8907 if (!is_local)
8908 continue;
8909
8910 /* LD -> LE */
8911 tls_set = TLS_EXPLICIT;
8912 tls_clear = TLS_LD;
8913 }
8914 break;
8915
8916 default:
8917 continue;
8918 }
8919
8920 if (pass == 0)
8921 {
727fc41e
AM
8922 if (!expecting_tls_get_addr
8923 || !sec->has_tls_get_addr_call)
102890f0
AM
8924 continue;
8925
3a71aa26
AM
8926 if (rel + 1 < relend
8927 && branch_reloc_hash_match (ibfd, rel + 1,
8928 htab->tls_get_addr,
8929 htab->tls_get_addr_fd))
102890f0 8930 {
3a71aa26 8931 if (expecting_tls_get_addr == 2)
102890f0 8932 {
3a71aa26 8933 /* Check for toc tls entries. */
f961d9dd 8934 unsigned char *toc_tls;
3a71aa26
AM
8935 int retval;
8936
8937 retval = get_tls_mask (&toc_tls, NULL, NULL,
8938 &locsyms,
8939 rel, ibfd);
8940 if (retval == 0)
8941 goto err_free_rel;
663a1470
AM
8942 if (toc_tls != NULL)
8943 {
37da22e5
AM
8944 if ((*toc_tls & TLS_TLS) != 0
8945 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0))
663a1470
AM
8946 found_tls_get_addr_arg = 1;
8947 if (retval > 1)
8948 toc_ref[toc_ref_index] = 1;
8949 }
102890f0 8950 }
3a71aa26 8951 continue;
102890f0
AM
8952 }
8953
102890f0
AM
8954 /* Uh oh, we didn't find the expected call. We
8955 could just mark this symbol to exclude it
8956 from tls optimization but it's safer to skip
663a1470 8957 the entire optimization. */
695344c0 8958 /* xgettext:c-format */
25f53a85 8959 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8960 "TLS optimization disabled\n"),
8961 ibfd, sec, rel->r_offset);
8962 ret = TRUE;
8963 goto err_free_rel;
102890f0
AM
8964 }
8965
37da22e5
AM
8966 /* If we don't have old-style __tls_get_addr calls
8967 without TLSGD/TLSLD marker relocs, and we haven't
8968 found a new-style __tls_get_addr call with a
8969 marker for this symbol, then we either have a
8970 broken object file or an -mlongcall style
8971 indirect call to __tls_get_addr without a marker.
8972 Disable optimization in this case. */
8973 if ((tls_clear & (TLS_GD | TLS_LD)) != 0
8974 && (tls_set & TLS_EXPLICIT) == 0
8975 && !sec->has_tls_get_addr_call
8976 && ((*tls_mask & (TLS_TLS | TLS_MARK))
8977 != (TLS_TLS | TLS_MARK)))
8978 continue;
8979
23cedd1d 8980 if (expecting_tls_get_addr)
102890f0 8981 {
23cedd1d
AM
8982 struct plt_entry *ent = NULL;
8983
8984 if (htab->tls_get_addr != NULL)
8985 for (ent = htab->tls_get_addr->elf.plt.plist;
8986 ent != NULL;
8987 ent = ent->next)
8988 if (ent->addend == 0)
102890f0 8989 break;
411e1bfb 8990
23cedd1d
AM
8991 if (ent == NULL && htab->tls_get_addr_fd != NULL)
8992 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8993 ent != NULL;
8994 ent = ent->next)
8995 if (ent->addend == 0)
102890f0 8996 break;
23cedd1d
AM
8997
8998 if (ent != NULL
8999 && ent->plt.refcount > 0)
9000 ent->plt.refcount -= 1;
102890f0 9001 }
411e1bfb 9002
102890f0 9003 if (tls_clear == 0)
30038c59
AM
9004 continue;
9005
102890f0
AM
9006 if ((tls_set & TLS_EXPLICIT) == 0)
9007 {
9008 struct got_entry *ent;
411e1bfb 9009
102890f0
AM
9010 /* Adjust got entry for this reloc. */
9011 if (h != NULL)
9012 ent = h->got.glist;
9013 else
9014 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 9015
102890f0
AM
9016 for (; ent != NULL; ent = ent->next)
9017 if (ent->addend == rel->r_addend
9018 && ent->owner == ibfd
9019 && ent->tls_type == tls_type)
9020 break;
9021 if (ent == NULL)
9022 abort ();
411e1bfb 9023
102890f0
AM
9024 if (tls_set == 0)
9025 {
9026 /* We managed to get rid of a got entry. */
9027 if (ent->got.refcount > 0)
9028 ent->got.refcount -= 1;
9029 }
9030 }
9031 else
9032 {
9033 /* If we got rid of a DTPMOD/DTPREL reloc pair then
9034 we'll lose one or two dyn relocs. */
9035 if (!dec_dynrel_count (rel->r_info, sec, info,
19e08130 9036 NULL, h, sym))
102890f0 9037 return FALSE;
411e1bfb 9038
102890f0
AM
9039 if (tls_set == (TLS_EXPLICIT | TLS_GD))
9040 {
9041 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
19e08130 9042 NULL, h, sym))
102890f0
AM
9043 return FALSE;
9044 }
9045 }
411e1bfb 9046
102890f0
AM
9047 *tls_mask |= tls_set;
9048 *tls_mask &= ~tls_clear;
9049 }
8c1d1bb8 9050
102890f0
AM
9051 if (elf_section_data (sec)->relocs != relstart)
9052 free (relstart);
9053 }
411e1bfb 9054
663a1470
AM
9055 if (locsyms != NULL
9056 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
9057 {
9058 if (!info->keep_memory)
9059 free (locsyms);
9060 else
9061 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
9062 }
9063 }
411e1bfb 9064
663a1470
AM
9065 if (toc_ref != NULL)
9066 free (toc_ref);
9a23f96e 9067 htab->do_tls_opt = 1;
b34976b6 9068 return TRUE;
1e2f5b6e 9069}
b34976b6 9070
c5614fa4
AM
9071/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
9072 the values of any global symbols in a toc section that has been
9073 edited. Globals in toc sections should be a rarity, so this function
9074 sets a flag if any are found in toc sections other than the one just
de194d85 9075 edited, so that further hash table traversals can be avoided. */
c5614fa4
AM
9076
9077struct adjust_toc_info
9078{
9079 asection *toc;
9080 unsigned long *skip;
9081 bfd_boolean global_toc_syms;
9082};
9083
ba761f19
AM
9084enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
9085
c5614fa4
AM
9086static bfd_boolean
9087adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
9088{
9089 struct ppc_link_hash_entry *eh;
9090 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 9091 unsigned long i;
c5614fa4 9092
c5614fa4
AM
9093 if (h->root.type != bfd_link_hash_defined
9094 && h->root.type != bfd_link_hash_defweak)
9095 return TRUE;
9096
9097 eh = (struct ppc_link_hash_entry *) h;
9098 if (eh->adjust_done)
9099 return TRUE;
9100
9101 if (eh->elf.root.u.def.section == toc_inf->toc)
9102 {
854b41e7
AM
9103 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
9104 i = toc_inf->toc->rawsize >> 3;
c5614fa4 9105 else
854b41e7
AM
9106 i = eh->elf.root.u.def.value >> 3;
9107
ba761f19 9108 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4 9109 {
4eca0228 9110 _bfd_error_handler
854b41e7
AM
9111 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
9112 do
9113 ++i;
ba761f19 9114 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 9115 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 9116 }
854b41e7
AM
9117
9118 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
9119 eh->adjust_done = 1;
9120 }
9121 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
9122 toc_inf->global_toc_syms = TRUE;
9123
9124 return TRUE;
9125}
9126
39eeab25
AM
9127/* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
9128 on a _LO variety toc/got reloc. */
560c8763
AM
9129
9130static bfd_boolean
39eeab25 9131ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
560c8763 9132{
39eeab25
AM
9133 return ((insn & (0x3f << 26)) == 12u << 26 /* addic */
9134 || (insn & (0x3f << 26)) == 14u << 26 /* addi */
560c8763
AM
9135 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
9136 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
9137 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
9138 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
9139 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
9140 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
9141 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
9142 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
9143 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
9144 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
9145 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
9146 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
9147 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
39eeab25
AM
9148 || (insn & (0x3f << 26)) == 56u << 26 /* lq,lfq */
9149 || ((insn & (0x3f << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
9150 /* Exclude lfqu by testing reloc. If relocs are ever
9151 defined for the reduced D field in psq_lu then those
9152 will need testing too. */
9153 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
9154 || ((insn & (0x3f << 26)) == 58u << 26 /* ld,lwa */
9155 && (insn & 1) == 0)
9156 || (insn & (0x3f << 26)) == 60u << 26 /* stfq */
9157 || ((insn & (0x3f << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
9158 /* Exclude stfqu. psq_stu as above for psq_lu. */
9159 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
9160 || ((insn & (0x3f << 26)) == 62u << 26 /* std,stq */
9161 && (insn & 1) == 0));
560c8763
AM
9162}
9163
c5614fa4
AM
9164/* Examine all relocs referencing .toc sections in order to remove
9165 unused .toc entries. */
9166
9167bfd_boolean
33c0ec9d 9168ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
9169{
9170 bfd *ibfd;
9171 struct adjust_toc_info toc_inf;
67f0cbdb 9172 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 9173
67f0cbdb 9174 htab->do_toc_opt = 1;
c5614fa4 9175 toc_inf.global_toc_syms = TRUE;
c72f2fb2 9176 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
c5614fa4
AM
9177 {
9178 asection *toc, *sec;
9179 Elf_Internal_Shdr *symtab_hdr;
9180 Elf_Internal_Sym *local_syms;
425b145b 9181 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
9182 unsigned long *skip, *drop;
9183 unsigned char *used;
9184 unsigned char *keep, last, some_unused;
9185
854b41e7
AM
9186 if (!is_ppc64_elf (ibfd))
9187 continue;
9188
c5614fa4
AM
9189 toc = bfd_get_section_by_name (ibfd, ".toc");
9190 if (toc == NULL
92b7a70f 9191 || toc->size == 0
dbaa2011
AM
9192 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
9193 || discarded_section (toc))
c5614fa4
AM
9194 continue;
9195
425b145b 9196 toc_relocs = NULL;
c5614fa4 9197 local_syms = NULL;
0ffa91dd 9198 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
9199
9200 /* Look at sections dropped from the final link. */
9201 skip = NULL;
9202 relstart = NULL;
9203 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9204 {
9205 if (sec->reloc_count == 0
dbaa2011 9206 || !discarded_section (sec)
c5614fa4
AM
9207 || get_opd_info (sec)
9208 || (sec->flags & SEC_ALLOC) == 0
9209 || (sec->flags & SEC_DEBUGGING) != 0)
9210 continue;
9211
9212 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
9213 if (relstart == NULL)
9214 goto error_ret;
9215
9216 /* Run through the relocs to see which toc entries might be
9217 unused. */
9218 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9219 {
9220 enum elf_ppc64_reloc_type r_type;
9221 unsigned long r_symndx;
9222 asection *sym_sec;
9223 struct elf_link_hash_entry *h;
9224 Elf_Internal_Sym *sym;
9225 bfd_vma val;
9226
9227 r_type = ELF64_R_TYPE (rel->r_info);
9228 switch (r_type)
9229 {
9230 default:
9231 continue;
9232
9233 case R_PPC64_TOC16:
9234 case R_PPC64_TOC16_LO:
9235 case R_PPC64_TOC16_HI:
9236 case R_PPC64_TOC16_HA:
9237 case R_PPC64_TOC16_DS:
9238 case R_PPC64_TOC16_LO_DS:
9239 break;
9240 }
9241
9242 r_symndx = ELF64_R_SYM (rel->r_info);
9243 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9244 r_symndx, ibfd))
9245 goto error_ret;
9246
9247 if (sym_sec != toc)
9248 continue;
9249
9250 if (h != NULL)
9251 val = h->root.u.def.value;
9252 else
9253 val = sym->st_value;
9254 val += rel->r_addend;
9255
9256 if (val >= toc->size)
9257 continue;
9258
9259 /* Anything in the toc ought to be aligned to 8 bytes.
9260 If not, don't mark as unused. */
9261 if (val & 7)
9262 continue;
9263
9264 if (skip == NULL)
9265 {
854b41e7 9266 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
9267 if (skip == NULL)
9268 goto error_ret;
9269 }
9270
ba761f19 9271 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
9272 }
9273
9274 if (elf_section_data (sec)->relocs != relstart)
9275 free (relstart);
9276 }
9277
ba761f19
AM
9278 /* For largetoc loads of address constants, we can convert
9279 . addis rx,2,addr@got@ha
9280 . ld ry,addr@got@l(rx)
9281 to
9282 . addis rx,2,addr@toc@ha
9283 . addi ry,rx,addr@toc@l
9284 when addr is within 2G of the toc pointer. This then means
9285 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 9286
ba761f19
AM
9287 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
9288 && toc->output_section->rawsize < (bfd_vma) 1 << 31
9289 && toc->reloc_count != 0)
9290 {
9291 /* Read toc relocs. */
425b145b
AM
9292 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9293 info->keep_memory);
9294 if (toc_relocs == NULL)
ba761f19
AM
9295 goto error_ret;
9296
425b145b 9297 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9298 {
9299 enum elf_ppc64_reloc_type r_type;
9300 unsigned long r_symndx;
9301 asection *sym_sec;
9302 struct elf_link_hash_entry *h;
9303 Elf_Internal_Sym *sym;
9304 bfd_vma val, addr;
9305
9306 r_type = ELF64_R_TYPE (rel->r_info);
9307 if (r_type != R_PPC64_ADDR64)
9308 continue;
9309
9310 r_symndx = ELF64_R_SYM (rel->r_info);
9311 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9312 r_symndx, ibfd))
9313 goto error_ret;
9314
425b145b 9315 if (sym_sec == NULL
c27b8c2a 9316 || sym_sec->output_section == NULL
dbaa2011 9317 || discarded_section (sym_sec))
425b145b
AM
9318 continue;
9319
afe397ea 9320 if (!SYMBOL_REFERENCES_LOCAL (info, h))
ba761f19
AM
9321 continue;
9322
9323 if (h != NULL)
bddc25c9
AM
9324 {
9325 if (h->type == STT_GNU_IFUNC)
9326 continue;
9327 val = h->root.u.def.value;
9328 }
ba761f19 9329 else
bddc25c9
AM
9330 {
9331 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
9332 continue;
9333 val = sym->st_value;
9334 }
ba761f19
AM
9335 val += rel->r_addend;
9336 val += sym_sec->output_section->vma + sym_sec->output_offset;
9337
9338 /* We don't yet know the exact toc pointer value, but we
9339 know it will be somewhere in the toc section. Don't
9340 optimize if the difference from any possible toc
9341 pointer is outside [ff..f80008000, 7fff7fff]. */
9342 addr = toc->output_section->vma + TOC_BASE_OFF;
9343 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9344 continue;
9345
9346 addr = toc->output_section->vma + toc->output_section->rawsize;
9347 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9348 continue;
9349
9350 if (skip == NULL)
9351 {
9352 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
9353 if (skip == NULL)
9354 goto error_ret;
9355 }
9356
9357 skip[rel->r_offset >> 3]
425b145b 9358 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 9359 }
ba761f19
AM
9360 }
9361
c5614fa4
AM
9362 if (skip == NULL)
9363 continue;
9364
9365 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
9366 if (used == NULL)
9367 {
9368 error_ret:
9369 if (local_syms != NULL
9370 && symtab_hdr->contents != (unsigned char *) local_syms)
9371 free (local_syms);
9372 if (sec != NULL
9373 && relstart != NULL
9374 && elf_section_data (sec)->relocs != relstart)
9375 free (relstart);
425b145b
AM
9376 if (toc_relocs != NULL
9377 && elf_section_data (toc)->relocs != toc_relocs)
9378 free (toc_relocs);
c5614fa4
AM
9379 if (skip != NULL)
9380 free (skip);
9381 return FALSE;
9382 }
9383
30038c59
AM
9384 /* Now check all kept sections that might reference the toc.
9385 Check the toc itself last. */
9386 for (sec = (ibfd->sections == toc && toc->next ? toc->next
9387 : ibfd->sections);
c5614fa4 9388 sec != NULL;
c5614fa4 9389 sec = (sec == toc ? NULL
c5614fa4 9390 : sec->next == NULL ? toc
30038c59 9391 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
9392 : sec->next))
9393 {
9394 int repeat;
9395
9396 if (sec->reloc_count == 0
dbaa2011 9397 || discarded_section (sec)
c5614fa4
AM
9398 || get_opd_info (sec)
9399 || (sec->flags & SEC_ALLOC) == 0
9400 || (sec->flags & SEC_DEBUGGING) != 0)
9401 continue;
9402
854b41e7
AM
9403 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9404 info->keep_memory);
c5614fa4 9405 if (relstart == NULL)
2915c55b
JK
9406 {
9407 free (used);
9408 goto error_ret;
9409 }
c5614fa4
AM
9410
9411 /* Mark toc entries referenced as used. */
c5614fa4 9412 do
d4f1ee75
AM
9413 {
9414 repeat = 0;
9415 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9416 {
9417 enum elf_ppc64_reloc_type r_type;
9418 unsigned long r_symndx;
9419 asection *sym_sec;
9420 struct elf_link_hash_entry *h;
9421 Elf_Internal_Sym *sym;
9422 bfd_vma val;
9423 enum {no_check, check_lo, check_ha} insn_check;
98528052 9424
d4f1ee75
AM
9425 r_type = ELF64_R_TYPE (rel->r_info);
9426 switch (r_type)
9427 {
9428 default:
9429 insn_check = no_check;
9430 break;
98528052 9431
d4f1ee75
AM
9432 case R_PPC64_GOT_TLSLD16_HA:
9433 case R_PPC64_GOT_TLSGD16_HA:
9434 case R_PPC64_GOT_TPREL16_HA:
9435 case R_PPC64_GOT_DTPREL16_HA:
9436 case R_PPC64_GOT16_HA:
9437 case R_PPC64_TOC16_HA:
9438 insn_check = check_ha;
9439 break;
98528052 9440
d4f1ee75
AM
9441 case R_PPC64_GOT_TLSLD16_LO:
9442 case R_PPC64_GOT_TLSGD16_LO:
9443 case R_PPC64_GOT_TPREL16_LO_DS:
9444 case R_PPC64_GOT_DTPREL16_LO_DS:
9445 case R_PPC64_GOT16_LO:
9446 case R_PPC64_GOT16_LO_DS:
9447 case R_PPC64_TOC16_LO:
9448 case R_PPC64_TOC16_LO_DS:
9449 insn_check = check_lo;
9450 break;
9451 }
560c8763 9452
d4f1ee75
AM
9453 if (insn_check != no_check)
9454 {
9455 bfd_vma off = rel->r_offset & ~3;
9456 unsigned char buf[4];
9457 unsigned int insn;
c5614fa4 9458
d4f1ee75
AM
9459 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9460 {
9461 free (used);
9462 goto error_ret;
9463 }
9464 insn = bfd_get_32 (ibfd, buf);
9465 if (insn_check == check_lo
39eeab25 9466 ? !ok_lo_toc_insn (insn, r_type)
d4f1ee75
AM
9467 : ((insn & ((0x3f << 26) | 0x1f << 16))
9468 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9469 {
9470 char str[12];
9471
9472 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9473 sprintf (str, "%#08x", insn);
9474 info->callbacks->einfo
695344c0 9475 /* xgettext:c-format */
174d0a74 9476 (_("%H: toc optimization is not supported for"
cf97bcb0 9477 " %s instruction\n"),
d4f1ee75
AM
9478 ibfd, sec, rel->r_offset & ~3, str);
9479 }
9480 }
c5614fa4 9481
d4f1ee75
AM
9482 switch (r_type)
9483 {
9484 case R_PPC64_TOC16:
9485 case R_PPC64_TOC16_LO:
9486 case R_PPC64_TOC16_HI:
9487 case R_PPC64_TOC16_HA:
9488 case R_PPC64_TOC16_DS:
9489 case R_PPC64_TOC16_LO_DS:
9490 /* In case we're taking addresses of toc entries. */
9491 case R_PPC64_ADDR64:
9492 break;
c5614fa4 9493
d4f1ee75
AM
9494 default:
9495 continue;
9496 }
c5614fa4 9497
d4f1ee75
AM
9498 r_symndx = ELF64_R_SYM (rel->r_info);
9499 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9500 r_symndx, ibfd))
9501 {
9502 free (used);
9503 goto error_ret;
9504 }
c5614fa4 9505
d4f1ee75
AM
9506 if (sym_sec != toc)
9507 continue;
c5614fa4 9508
d4f1ee75
AM
9509 if (h != NULL)
9510 val = h->root.u.def.value;
9511 else
9512 val = sym->st_value;
9513 val += rel->r_addend;
ba761f19 9514
d4f1ee75
AM
9515 if (val >= toc->size)
9516 continue;
ba761f19 9517
d4f1ee75
AM
9518 if ((skip[val >> 3] & can_optimize) != 0)
9519 {
9520 bfd_vma off;
9521 unsigned char opc;
9522
9523 switch (r_type)
9524 {
9525 case R_PPC64_TOC16_HA:
ba761f19 9526 break;
ba761f19 9527
d4f1ee75
AM
9528 case R_PPC64_TOC16_LO_DS:
9529 off = rel->r_offset;
9530 off += (bfd_big_endian (ibfd) ? -2 : 3);
9531 if (!bfd_get_section_contents (ibfd, sec, &opc,
9532 off, 1))
9533 {
9534 free (used);
9535 goto error_ret;
9536 }
9537 if ((opc & (0x3f << 2)) == (58u << 2))
9538 break;
1a0670f3 9539 /* Fall through. */
ba761f19 9540
d4f1ee75
AM
9541 default:
9542 /* Wrong sort of reloc, or not a ld. We may
9543 as well clear ref_from_discarded too. */
9544 skip[val >> 3] = 0;
9545 }
9546 }
9547
9548 if (sec != toc)
9549 used[val >> 3] = 1;
9550 /* For the toc section, we only mark as used if this
9551 entry itself isn't unused. */
9552 else if ((used[rel->r_offset >> 3]
9553 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
9554 && !used[val >> 3])
9555 {
9556 /* Do all the relocs again, to catch reference
9557 chains. */
9558 repeat = 1;
9559 used[val >> 3] = 1;
9560 }
9561 }
9562 }
c5614fa4 9563 while (repeat);
854b41e7
AM
9564
9565 if (elf_section_data (sec)->relocs != relstart)
9566 free (relstart);
c5614fa4
AM
9567 }
9568
9569 /* Merge the used and skip arrays. Assume that TOC
9570 doublewords not appearing as either used or unused belong
de194d85 9571 to an entry more than one doubleword in size. */
c5614fa4
AM
9572 for (drop = skip, keep = used, last = 0, some_unused = 0;
9573 drop < skip + (toc->size + 7) / 8;
9574 ++drop, ++keep)
9575 {
9576 if (*keep)
9577 {
ba761f19
AM
9578 *drop &= ~ref_from_discarded;
9579 if ((*drop & can_optimize) != 0)
9580 some_unused = 1;
c5614fa4
AM
9581 last = 0;
9582 }
b140b010 9583 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
9584 {
9585 some_unused = 1;
ba761f19 9586 last = ref_from_discarded;
c5614fa4
AM
9587 }
9588 else
9589 *drop = last;
9590 }
9591
9592 free (used);
9593
9594 if (some_unused)
9595 {
9596 bfd_byte *contents, *src;
9597 unsigned long off;
d62b3684 9598 Elf_Internal_Sym *sym;
ba761f19 9599 bfd_boolean local_toc_syms = FALSE;
c5614fa4
AM
9600
9601 /* Shuffle the toc contents, and at the same time convert the
9602 skip array from booleans into offsets. */
9603 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
9604 goto error_ret;
9605
9606 elf_section_data (toc)->this_hdr.contents = contents;
9607
9608 for (src = contents, off = 0, drop = skip;
9609 src < contents + toc->size;
9610 src += 8, ++drop)
9611 {
ba761f19
AM
9612 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9613 off += 8;
c5614fa4
AM
9614 else if (off != 0)
9615 {
9616 *drop = off;
9617 memcpy (src - off, src, 8);
9618 }
9619 }
854b41e7 9620 *drop = off;
c5614fa4
AM
9621 toc->rawsize = toc->size;
9622 toc->size = src - contents - off;
9623
ba761f19
AM
9624 /* Adjust addends for relocs against the toc section sym,
9625 and optimize any accesses we can. */
c5614fa4
AM
9626 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9627 {
9628 if (sec->reloc_count == 0
dbaa2011 9629 || discarded_section (sec))
c5614fa4
AM
9630 continue;
9631
9632 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 9633 info->keep_memory);
c5614fa4
AM
9634 if (relstart == NULL)
9635 goto error_ret;
9636
9637 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9638 {
9639 enum elf_ppc64_reloc_type r_type;
9640 unsigned long r_symndx;
9641 asection *sym_sec;
9642 struct elf_link_hash_entry *h;
854b41e7 9643 bfd_vma val;
c5614fa4
AM
9644
9645 r_type = ELF64_R_TYPE (rel->r_info);
9646 switch (r_type)
9647 {
9648 default:
9649 continue;
9650
9651 case R_PPC64_TOC16:
9652 case R_PPC64_TOC16_LO:
9653 case R_PPC64_TOC16_HI:
9654 case R_PPC64_TOC16_HA:
9655 case R_PPC64_TOC16_DS:
9656 case R_PPC64_TOC16_LO_DS:
9657 case R_PPC64_ADDR64:
9658 break;
9659 }
9660
9661 r_symndx = ELF64_R_SYM (rel->r_info);
9662 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9663 r_symndx, ibfd))
9664 goto error_ret;
9665
ba761f19 9666 if (sym_sec != toc)
c5614fa4
AM
9667 continue;
9668
ba761f19
AM
9669 if (h != NULL)
9670 val = h->root.u.def.value;
9671 else
9672 {
9673 val = sym->st_value;
9674 if (val != 0)
9675 local_toc_syms = TRUE;
9676 }
9677
9678 val += rel->r_addend;
854b41e7
AM
9679
9680 if (val > toc->rawsize)
9681 val = toc->rawsize;
ba761f19
AM
9682 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9683 continue;
9684 else if ((skip[val >> 3] & can_optimize) != 0)
9685 {
9686 Elf_Internal_Rela *tocrel
425b145b 9687 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
9688 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9689
9690 switch (r_type)
9691 {
9692 case R_PPC64_TOC16_HA:
9693 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9694 break;
9695
9696 case R_PPC64_TOC16_LO_DS:
9697 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9698 break;
9699
9700 default:
28942f62
AM
9701 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9702 ppc_howto_init ();
b140b010 9703 info->callbacks->einfo
695344c0 9704 /* xgettext:c-format */
174d0a74 9705 (_("%H: %s references "
b140b010
AM
9706 "optimized away TOC entry\n"),
9707 ibfd, sec, rel->r_offset,
9708 ppc64_elf_howto_table[r_type]->name);
9709 bfd_set_error (bfd_error_bad_value);
9710 goto error_ret;
ba761f19
AM
9711 }
9712 rel->r_addend = tocrel->r_addend;
9713 elf_section_data (sec)->relocs = relstart;
9714 continue;
9715 }
9716
9717 if (h != NULL || sym->st_value != 0)
9718 continue;
854b41e7
AM
9719
9720 rel->r_addend -= skip[val >> 3];
9721 elf_section_data (sec)->relocs = relstart;
c5614fa4 9722 }
854b41e7
AM
9723
9724 if (elf_section_data (sec)->relocs != relstart)
9725 free (relstart);
c5614fa4
AM
9726 }
9727
9728 /* We shouldn't have local or global symbols defined in the TOC,
9729 but handle them anyway. */
df22d223
AM
9730 if (local_syms != NULL)
9731 for (sym = local_syms;
9732 sym < local_syms + symtab_hdr->sh_info;
9733 ++sym)
9734 if (sym->st_value != 0
9735 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9736 {
9737 unsigned long i;
854b41e7 9738
df22d223
AM
9739 if (sym->st_value > toc->rawsize)
9740 i = toc->rawsize >> 3;
9741 else
9742 i = sym->st_value >> 3;
854b41e7 9743
df22d223
AM
9744 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9745 {
9746 if (local_toc_syms)
4eca0228 9747 _bfd_error_handler
df22d223
AM
9748 (_("%s defined on removed toc entry"),
9749 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9750 do
9751 ++i;
9752 while ((skip[i] & (ref_from_discarded | can_optimize)));
9753 sym->st_value = (bfd_vma) i << 3;
9754 }
d62b3684 9755
df22d223
AM
9756 sym->st_value -= skip[i];
9757 symtab_hdr->contents = (unsigned char *) local_syms;
9758 }
c5614fa4 9759
854b41e7 9760 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
9761 if (toc_inf.global_toc_syms)
9762 {
9763 toc_inf.toc = toc;
9764 toc_inf.skip = skip;
9765 toc_inf.global_toc_syms = FALSE;
9766 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9767 &toc_inf);
9768 }
854b41e7
AM
9769
9770 if (toc->reloc_count != 0)
9771 {
d4730f92 9772 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
9773 Elf_Internal_Rela *wrel;
9774 bfd_size_type sz;
9775
854b41e7 9776 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
9777 if (toc_relocs == NULL)
9778 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9779 info->keep_memory);
9780 if (toc_relocs == NULL)
9781 goto error_ret;
9782
425b145b
AM
9783 wrel = toc_relocs;
9784 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9785 if ((skip[rel->r_offset >> 3]
9786 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
9787 {
9788 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9789 wrel->r_info = rel->r_info;
9790 wrel->r_addend = rel->r_addend;
9791 ++wrel;
9792 }
9793 else if (!dec_dynrel_count (rel->r_info, toc, info,
9794 &local_syms, NULL, NULL))
9795 goto error_ret;
9796
425b145b
AM
9797 elf_section_data (toc)->relocs = toc_relocs;
9798 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
9799 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9800 sz = rel_hdr->sh_entsize;
9801 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9802 }
c5614fa4 9803 }
28be611c
AM
9804 else if (toc_relocs != NULL
9805 && elf_section_data (toc)->relocs != toc_relocs)
425b145b 9806 free (toc_relocs);
c5614fa4
AM
9807
9808 if (local_syms != NULL
9809 && symtab_hdr->contents != (unsigned char *) local_syms)
9810 {
9811 if (!info->keep_memory)
9812 free (local_syms);
9813 else
9814 symtab_hdr->contents = (unsigned char *) local_syms;
9815 }
9816 free (skip);
9817 }
9818
9819 return TRUE;
9820}
9821
1bbe0902
AM
9822/* Return true iff input section I references the TOC using
9823 instructions limited to +/-32k offsets. */
9824
9825bfd_boolean
9826ppc64_elf_has_small_toc_reloc (asection *i)
9827{
9828 return (is_ppc64_elf (i->owner)
9829 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9830}
9831
927be08e
AM
9832/* Allocate space for one GOT entry. */
9833
9834static void
9835allocate_got (struct elf_link_hash_entry *h,
9836 struct bfd_link_info *info,
9837 struct got_entry *gent)
9838{
9839 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
9840 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9841 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9842 ? 16 : 8);
9843 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9844 ? 2 : 1) * sizeof (Elf64_External_Rela);
9845 asection *got = ppc64_elf_tdata (gent->owner)->got;
9846
9847 gent->got.offset = got->size;
9848 got->size += entsize;
9849
19e08130 9850 if (h->type == STT_GNU_IFUNC)
927be08e 9851 {
33e44f2e 9852 htab->elf.irelplt->size += rentsize;
19e08130 9853 htab->got_reli_size += rentsize;
927be08e 9854 }
f15d0b54
AM
9855 else if (((bfd_link_pic (info)
9856 && !((gent->tls_type & TLS_TPREL) != 0
9857 && bfd_link_executable (info)
9858 && SYMBOL_REFERENCES_LOCAL (info, h)))
f0158f44
AM
9859 || (htab->elf.dynamic_sections_created
9860 && h->dynindx != -1
9861 && !SYMBOL_REFERENCES_LOCAL (info, h)))
21d68fcd 9862 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
927be08e 9863 {
19e08130 9864 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9865 relgot->size += rentsize;
927be08e
AM
9866 }
9867}
9868
7865406b
AM
9869/* This function merges got entries in the same toc group. */
9870
9871static void
9872merge_got_entries (struct got_entry **pent)
9873{
9874 struct got_entry *ent, *ent2;
9875
9876 for (ent = *pent; ent != NULL; ent = ent->next)
9877 if (!ent->is_indirect)
9878 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9879 if (!ent2->is_indirect
9880 && ent2->addend == ent->addend
9881 && ent2->tls_type == ent->tls_type
9882 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9883 {
9884 ent2->is_indirect = TRUE;
9885 ent2->got.ent = ent;
9886 }
9887}
9888
46434633 9889/* If H is undefined, make it dynamic if that makes sense. */
f0158f44
AM
9890
9891static bfd_boolean
46434633
AM
9892ensure_undef_dynamic (struct bfd_link_info *info,
9893 struct elf_link_hash_entry *h)
f0158f44
AM
9894{
9895 struct elf_link_hash_table *htab = elf_hash_table (info);
9896
9897 if (htab->dynamic_sections_created
46434633
AM
9898 && ((info->dynamic_undefined_weak != 0
9899 && h->root.type == bfd_link_hash_undefweak)
9900 || h->root.type == bfd_link_hash_undefined)
f0158f44
AM
9901 && h->dynindx == -1
9902 && !h->forced_local
9903 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9904 return bfd_elf_link_record_dynamic_symbol (info, h);
9905 return TRUE;
9906}
9907
65f38f15
AM
9908/* Allocate space in .plt, .got and associated reloc sections for
9909 dynamic relocs. */
5bd4f169 9910
b34976b6 9911static bfd_boolean
4ce794b7 9912allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9913{
65f38f15
AM
9914 struct bfd_link_info *info;
9915 struct ppc_link_hash_table *htab;
5bd4f169 9916 asection *s;
65f38f15 9917 struct ppc_link_hash_entry *eh;
0b8bcf0d 9918 struct got_entry **pgent, *gent;
5bd4f169 9919
e92d460e 9920 if (h->root.type == bfd_link_hash_indirect)
b34976b6 9921 return TRUE;
5bd4f169 9922
65f38f15
AM
9923 info = (struct bfd_link_info *) inf;
9924 htab = ppc_hash_table (info);
4dfe6ac6
NC
9925 if (htab == NULL)
9926 return FALSE;
5bd4f169 9927
951fd09b
AM
9928 eh = (struct ppc_link_hash_entry *) h;
9929 /* Run through the TLS GD got entries first if we're changing them
9930 to TPREL. */
37da22e5 9931 if ((eh->tls_mask & (TLS_TLS | TLS_TPRELGD)) == (TLS_TLS | TLS_TPRELGD))
951fd09b
AM
9932 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9933 if (gent->got.refcount > 0
9934 && (gent->tls_type & TLS_GD) != 0)
9935 {
9936 /* This was a GD entry that has been converted to TPREL. If
9937 there happens to be a TPREL entry we can use that one. */
9938 struct got_entry *ent;
9939 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9940 if (ent->got.refcount > 0
9941 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9942 && ent->addend == gent->addend
9943 && ent->owner == gent->owner)
951fd09b
AM
9944 {
9945 gent->got.refcount = 0;
9946 break;
9947 }
9948
9949 /* If not, then we'll be using our own TPREL entry. */
9950 if (gent->got.refcount != 0)
9951 gent->tls_type = TLS_TLS | TLS_TPREL;
9952 }
9953
7865406b
AM
9954 /* Remove any list entry that won't generate a word in the GOT before
9955 we call merge_got_entries. Otherwise we risk merging to empty
9956 entries. */
0b8bcf0d
AM
9957 pgent = &h->got.glist;
9958 while ((gent = *pgent) != NULL)
411e1bfb 9959 if (gent->got.refcount > 0)
7865406b
AM
9960 {
9961 if ((gent->tls_type & TLS_LD) != 0
9962 && !h->def_dynamic)
9963 {
9964 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9965 *pgent = gent->next;
9966 }
9967 else
9968 pgent = &gent->next;
9969 }
9970 else
9971 *pgent = gent->next;
9972
9973 if (!htab->do_multi_toc)
9974 merge_got_entries (&h->got.glist);
9975
9976 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9977 if (!gent->is_indirect)
411e1bfb 9978 {
46434633
AM
9979 /* Make sure this symbol is output as a dynamic symbol. */
9980 if (!ensure_undef_dynamic (info, h))
f0158f44 9981 return FALSE;
65f38f15 9982
0c8d6e5c 9983 if (!is_ppc64_elf (gent->owner))
927be08e 9984 abort ();
0ffa91dd 9985
927be08e 9986 allocate_got (h, info, gent);
411e1bfb 9987 }
65f38f15 9988
954b63d4
AM
9989 /* If no dynamic sections we can't have dynamic relocs, except for
9990 IFUNCs which are handled even in static executables. */
8a2058b5
AM
9991 if (!htab->elf.dynamic_sections_created
9992 && h->type != STT_GNU_IFUNC)
9993 eh->dyn_relocs = NULL;
9994
529fe20e
AM
9995 /* Discard relocs on undefined symbols that must be local. */
9996 else if (h->root.type == bfd_link_hash_undefined
9997 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9998 eh->dyn_relocs = NULL;
9999
954b63d4
AM
10000 /* Also discard relocs on undefined weak syms with non-default
10001 visibility, or when dynamic_undefined_weak says so. */
21d68fcd 10002 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
954b63d4
AM
10003 eh->dyn_relocs = NULL;
10004
8a2058b5 10005 if (eh->dyn_relocs != NULL)
65f38f15 10006 {
8a2058b5
AM
10007 struct elf_dyn_relocs *p, **pp;
10008
57e7d118
AM
10009 /* In the shared -Bsymbolic case, discard space allocated for
10010 dynamic pc-relative relocs against symbols which turn out to
10011 be defined in regular objects. For the normal shared case,
10012 discard space for relocs that have become local due to symbol
10013 visibility changes. */
10014
10015 if (bfd_link_pic (info))
65f38f15 10016 {
57e7d118
AM
10017 /* Relocs that use pc_count are those that appear on a call
10018 insn, or certain REL relocs (see must_be_dyn_reloc) that
10019 can be generated via assembly. We want calls to
10020 protected symbols to resolve directly to the function
10021 rather than going via the plt. If people want function
10022 pointer comparisons to work as expected then they should
10023 avoid writing weird assembly. */
10024 if (SYMBOL_CALLS_LOCAL (info, h))
10025 {
57e7d118
AM
10026 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
10027 {
10028 p->count -= p->pc_count;
10029 p->pc_count = 0;
10030 if (p->count == 0)
10031 *pp = p->next;
10032 else
10033 pp = &p->next;
10034 }
10035 }
65f38f15 10036
954b63d4 10037 if (eh->dyn_relocs != NULL)
5bd4f169 10038 {
46434633
AM
10039 /* Make sure this symbol is output as a dynamic symbol. */
10040 if (!ensure_undef_dynamic (info, h))
f0158f44 10041 return FALSE;
5bd4f169 10042 }
65f38f15 10043 }
529fe20e 10044 else if (ELIMINATE_COPY_RELOCS && h->type != STT_GNU_IFUNC)
57e7d118 10045 {
8a2058b5 10046 /* For the non-pic case, discard space for relocs against
57e7d118
AM
10047 symbols which turn out to need copy relocs or are not
10048 dynamic. */
529fe20e
AM
10049 if (h->dynamic_adjusted
10050 && !h->def_regular
10051 && !ELF_COMMON_DEF_P (h))
f0158f44 10052 {
46434633
AM
10053 /* Make sure this symbol is output as a dynamic symbol. */
10054 if (!ensure_undef_dynamic (info, h))
f0158f44 10055 return FALSE;
dfbb6ac9 10056
f0158f44
AM
10057 if (h->dynindx == -1)
10058 eh->dyn_relocs = NULL;
10059 }
10060 else
8a2058b5 10061 eh->dyn_relocs = NULL;
57e7d118
AM
10062 }
10063
10064 /* Finally, allocate space. */
10065 for (p = eh->dyn_relocs; p != NULL; p = p->next)
10066 {
10067 asection *sreloc = elf_section_data (p->sec)->sreloc;
10068 if (eh->elf.type == STT_GNU_IFUNC)
10069 sreloc = htab->elf.irelplt;
10070 sreloc->size += p->count * sizeof (Elf64_External_Rela);
dfbb6ac9 10071 }
65f38f15 10072 }
57e7d118 10073
2d7ad24e
AM
10074 /* We might need a PLT entry when the symbol
10075 a) is dynamic, or
10076 b) is an ifunc, or
10077 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
10078 d) has plt16 relocs and we are linking statically. */
10079 if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
10080 || h->type == STT_GNU_IFUNC
10081 || (h->needs_plt && h->dynamic_adjusted)
10082 || (h->needs_plt
10083 && h->def_regular
10084 && !htab->elf.dynamic_sections_created
3e04d765 10085 && !htab->can_convert_all_inline_plt
2d7ad24e
AM
10086 && (((struct ppc_link_hash_entry *) h)->tls_mask
10087 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
65f38f15 10088 {
57e7d118
AM
10089 struct plt_entry *pent;
10090 bfd_boolean doneone = FALSE;
10091 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
10092 if (pent->plt.refcount > 0)
10093 {
10094 if (!htab->elf.dynamic_sections_created
10095 || h->dynindx == -1)
10096 {
2d7ad24e
AM
10097 if (h->type == STT_GNU_IFUNC)
10098 {
10099 s = htab->elf.iplt;
10100 pent->plt.offset = s->size;
10101 s->size += PLT_ENTRY_SIZE (htab);
10102 s = htab->elf.irelplt;
10103 }
10104 else
10105 {
10106 s = htab->pltlocal;
10107 pent->plt.offset = s->size;
10108 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
10109 s = bfd_link_pic (info) ? htab->relpltlocal : NULL;
10110 }
57e7d118
AM
10111 }
10112 else
10113 {
10114 /* If this is the first .plt entry, make room for the special
10115 first entry. */
10116 s = htab->elf.splt;
10117 if (s->size == 0)
10118 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
65f38f15 10119
57e7d118 10120 pent->plt.offset = s->size;
65f38f15 10121
57e7d118
AM
10122 /* Make room for this entry. */
10123 s->size += PLT_ENTRY_SIZE (htab);
65f38f15 10124
57e7d118
AM
10125 /* Make room for the .glink code. */
10126 s = htab->glink;
10127 if (s->size == 0)
9e390558 10128 s->size += GLINK_PLTRESOLVE_SIZE (htab);
57e7d118
AM
10129 if (htab->opd_abi)
10130 {
10131 /* We need bigger stubs past index 32767. */
9e390558 10132 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4)
57e7d118
AM
10133 s->size += 4;
10134 s->size += 2*4;
10135 }
10136 else
10137 s->size += 4;
65f38f15 10138
57e7d118
AM
10139 /* We also need to make an entry in the .rela.plt section. */
10140 s = htab->elf.srelplt;
10141 }
2d7ad24e
AM
10142 if (s != NULL)
10143 s->size += sizeof (Elf64_External_Rela);
57e7d118
AM
10144 doneone = TRUE;
10145 }
10146 else
10147 pent->plt.offset = (bfd_vma) -1;
10148 if (!doneone)
10149 {
10150 h->plt.plist = NULL;
10151 h->needs_plt = 0;
10152 }
65f38f15 10153 }
57e7d118 10154 else
65f38f15 10155 {
57e7d118
AM
10156 h->plt.plist = NULL;
10157 h->needs_plt = 0;
65f38f15
AM
10158 }
10159
b34976b6 10160 return TRUE;
65f38f15
AM
10161}
10162
9e390558
AM
10163#define PPC_LO(v) ((v) & 0xffff)
10164#define PPC_HI(v) (((v) >> 16) & 0xffff)
10165#define PPC_HA(v) PPC_HI ((v) + 0x8000)
10166
a345bc8d
AM
10167/* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
10168 to set up space for global entry stubs. These are put in glink,
10169 after the branch table. */
65f38f15 10170
b34976b6 10171static bfd_boolean
a345bc8d 10172size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
65f38f15 10173{
a345bc8d
AM
10174 struct bfd_link_info *info;
10175 struct ppc_link_hash_table *htab;
10176 struct plt_entry *pent;
9e390558 10177 asection *s, *plt;
65f38f15 10178
a345bc8d
AM
10179 if (h->root.type == bfd_link_hash_indirect)
10180 return TRUE;
65f38f15 10181
a345bc8d
AM
10182 if (!h->pointer_equality_needed)
10183 return TRUE;
65f38f15 10184
a345bc8d
AM
10185 if (h->def_regular)
10186 return TRUE;
65f38f15 10187
a345bc8d
AM
10188 info = inf;
10189 htab = ppc_hash_table (info);
10190 if (htab == NULL)
10191 return FALSE;
10192
9e390558
AM
10193 s = htab->global_entry;
10194 plt = htab->elf.splt;
a345bc8d
AM
10195 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
10196 if (pent->plt.offset != (bfd_vma) -1
10197 && pent->addend == 0)
10198 {
afe397ea
AM
10199 /* For ELFv2, if this symbol is not defined in a regular file
10200 and we are not generating a shared library or pie, then we
10201 need to define the symbol in the executable on a call stub.
10202 This is to avoid text relocations. */
9e390558
AM
10203 bfd_vma off, stub_align, stub_off, stub_size;
10204 unsigned int align_power;
10205
10206 stub_size = 16;
10207 stub_off = s->size;
10208 if (htab->params->plt_stub_align >= 0)
10209 align_power = htab->params->plt_stub_align;
10210 else
10211 align_power = -htab->params->plt_stub_align;
10212 /* Setting section alignment is delayed until we know it is
10213 non-empty. Otherwise the .text output section will be
10214 aligned at least to plt_stub_align even when no global
10215 entry stubs are needed. */
10216 if (s->alignment_power < align_power)
10217 s->alignment_power = align_power;
10218 stub_align = (bfd_vma) 1 << align_power;
10219 if (htab->params->plt_stub_align >= 0
10220 || ((((stub_off + stub_size - 1) & -stub_align)
10221 - (stub_off & -stub_align))
10222 > ((stub_size - 1) & -stub_align)))
10223 stub_off = (stub_off + stub_align - 1) & -stub_align;
10224 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
10225 off -= stub_off + s->output_offset + s->output_section->vma;
10226 /* Note that for --plt-stub-align negative we have a possible
10227 dependency between stub offset and size. Break that
10228 dependency by assuming the max stub size when calculating
10229 the stub offset. */
10230 if (PPC_HA (off) == 0)
10231 stub_size -= 4;
8a2058b5 10232 h->root.type = bfd_link_hash_defined;
afe397ea 10233 h->root.u.def.section = s;
9e390558
AM
10234 h->root.u.def.value = stub_off;
10235 s->size = stub_off + stub_size;
a345bc8d
AM
10236 break;
10237 }
10238 return TRUE;
10239}
10240
10241/* Set DF_TEXTREL if we find any dynamic relocs that apply to
10242 read-only sections. */
10243
10244static bfd_boolean
98bbb1b8 10245maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
a345bc8d 10246{
98bbb1b8
AM
10247 asection *sec;
10248
a345bc8d
AM
10249 if (h->root.type == bfd_link_hash_indirect)
10250 return TRUE;
10251
98bbb1b8
AM
10252 sec = readonly_dynrelocs (h);
10253 if (sec != NULL)
a345bc8d 10254 {
98bbb1b8
AM
10255 struct bfd_link_info *info = (struct bfd_link_info *) inf;
10256
10257 info->flags |= DF_TEXTREL;
10258 info->callbacks->minfo
c1c8c1ef 10259 (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
63c1f59d 10260 sec->owner, h->root.root.string, sec);
a345bc8d
AM
10261
10262 /* Not an error, just cut short the traversal. */
10263 return FALSE;
65f38f15 10264 }
b34976b6 10265 return TRUE;
65f38f15
AM
10266}
10267
10268/* Set the sizes of the dynamic sections. */
10269
b34976b6 10270static bfd_boolean
ee67d69a 10271ppc64_elf_size_dynamic_sections (bfd *output_bfd,
4ce794b7 10272 struct bfd_link_info *info)
65f38f15
AM
10273{
10274 struct ppc_link_hash_table *htab;
10275 bfd *dynobj;
10276 asection *s;
b34976b6 10277 bfd_boolean relocs;
65f38f15 10278 bfd *ibfd;
7865406b 10279 struct got_entry *first_tlsld;
65f38f15
AM
10280
10281 htab = ppc_hash_table (info);
4dfe6ac6
NC
10282 if (htab == NULL)
10283 return FALSE;
10284
65f38f15
AM
10285 dynobj = htab->elf.dynobj;
10286 if (dynobj == NULL)
10287 abort ();
10288
10289 if (htab->elf.dynamic_sections_created)
10290 {
10291 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 10292 if (bfd_link_executable (info) && !info->nointerp)
65f38f15 10293 {
3d4d4302 10294 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
10295 if (s == NULL)
10296 abort ();
eea6121a 10297 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
10298 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
10299 }
10300 }
10301
10302 /* Set up .got offsets for local syms, and space for local dynamic
10303 relocs. */
c72f2fb2 10304 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
65f38f15 10305 {
411e1bfb
AM
10306 struct got_entry **lgot_ents;
10307 struct got_entry **end_lgot_ents;
e054468f
AM
10308 struct plt_entry **local_plt;
10309 struct plt_entry **end_local_plt;
f961d9dd 10310 unsigned char *lgot_masks;
65f38f15
AM
10311 bfd_size_type locsymcount;
10312 Elf_Internal_Shdr *symtab_hdr;
65f38f15 10313
0c8d6e5c 10314 if (!is_ppc64_elf (ibfd))
65f38f15
AM
10315 continue;
10316
10317 for (s = ibfd->sections; s != NULL; s = s->next)
10318 {
19e08130 10319 struct ppc_dyn_relocs *p;
65f38f15 10320
6edfbbad 10321 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 10322 {
ec338859
AM
10323 if (!bfd_is_abs_section (p->sec)
10324 && bfd_is_abs_section (p->sec->output_section))
10325 {
10326 /* Input section has been discarded, either because
10327 it is a copy of a linkonce section or due to
10328 linker script /DISCARD/, so we'll be discarding
10329 the relocs too. */
10330 }
248866a8 10331 else if (p->count != 0)
ec338859 10332 {
19e08130
AM
10333 asection *srel = elf_section_data (p->sec)->sreloc;
10334 if (p->ifunc)
33e44f2e 10335 srel = htab->elf.irelplt;
eea6121a 10336 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
10337 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
10338 info->flags |= DF_TEXTREL;
ec338859 10339 }
65f38f15
AM
10340 }
10341 }
10342
411e1bfb
AM
10343 lgot_ents = elf_local_got_ents (ibfd);
10344 if (!lgot_ents)
65f38f15
AM
10345 continue;
10346
0ffa91dd 10347 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 10348 locsymcount = symtab_hdr->sh_info;
411e1bfb 10349 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
10350 local_plt = (struct plt_entry **) end_lgot_ents;
10351 end_local_plt = local_plt + locsymcount;
f961d9dd 10352 lgot_masks = (unsigned char *) end_local_plt;
e717da7e 10353 s = ppc64_elf_tdata (ibfd)->got;
e7b938ca 10354 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 10355 {
0b8bcf0d 10356 struct got_entry **pent, *ent;
411e1bfb 10357
0b8bcf0d
AM
10358 pent = lgot_ents;
10359 while ((ent = *pent) != NULL)
411e1bfb
AM
10360 if (ent->got.refcount > 0)
10361 {
e7b938ca 10362 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 10363 {
927be08e 10364 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 10365 *pent = ent->next;
411e1bfb
AM
10366 }
10367 else
10368 {
19e08130
AM
10369 unsigned int ent_size = 8;
10370 unsigned int rel_size = sizeof (Elf64_External_Rela);
10371
eea6121a 10372 ent->got.offset = s->size;
e7b938ca 10373 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 10374 {
19e08130
AM
10375 ent_size *= 2;
10376 rel_size *= 2;
10377 }
10378 s->size += ent_size;
37da22e5 10379 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 10380 {
33e44f2e 10381 htab->elf.irelplt->size += rel_size;
19e08130
AM
10382 htab->got_reli_size += rel_size;
10383 }
f15d0b54
AM
10384 else if (bfd_link_pic (info)
10385 && !((ent->tls_type & TLS_TPREL) != 0
10386 && bfd_link_executable (info)))
19e08130
AM
10387 {
10388 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10389 srel->size += rel_size;
927be08e 10390 }
0b8bcf0d 10391 pent = &ent->next;
411e1bfb
AM
10392 }
10393 }
10394 else
0b8bcf0d 10395 *pent = ent->next;
65f38f15 10396 }
e054468f 10397
2d7ad24e
AM
10398 /* Allocate space for plt calls to local syms. */
10399 lgot_masks = (unsigned char *) end_local_plt;
10400 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
e054468f
AM
10401 {
10402 struct plt_entry *ent;
10403
10404 for (ent = *local_plt; ent != NULL; ent = ent->next)
10405 if (ent->plt.refcount > 0)
10406 {
2d7ad24e
AM
10407 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
10408 {
10409 s = htab->elf.iplt;
10410 ent->plt.offset = s->size;
10411 s->size += PLT_ENTRY_SIZE (htab);
10412 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
10413 }
3e04d765
AM
10414 else if (htab->can_convert_all_inline_plt
10415 || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
2d7ad24e
AM
10416 ent->plt.offset = (bfd_vma) -1;
10417 else
10418 {
10419 s = htab->pltlocal;
10420 ent->plt.offset = s->size;
10421 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
10422 if (bfd_link_pic (info))
10423 htab->relpltlocal->size += sizeof (Elf64_External_Rela);
10424 }
e054468f
AM
10425 }
10426 else
10427 ent->plt.offset = (bfd_vma) -1;
10428 }
65f38f15
AM
10429 }
10430
10431 /* Allocate global sym .plt and .got entries, and space for global
10432 sym dynamic relocs. */
4ce794b7 10433 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
a345bc8d 10434
0e1862bb 10435 if (!htab->opd_abi && !bfd_link_pic (info))
a345bc8d 10436 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
65f38f15 10437
7865406b 10438 first_tlsld = NULL;
c72f2fb2 10439 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
102890f0 10440 {
7865406b
AM
10441 struct got_entry *ent;
10442
0c8d6e5c 10443 if (!is_ppc64_elf (ibfd))
102890f0
AM
10444 continue;
10445
7865406b
AM
10446 ent = ppc64_tlsld_got (ibfd);
10447 if (ent->got.refcount > 0)
102890f0 10448 {
7865406b 10449 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 10450 {
7865406b
AM
10451 ent->is_indirect = TRUE;
10452 ent->got.ent = first_tlsld;
10453 }
10454 else
10455 {
10456 if (first_tlsld == NULL)
10457 first_tlsld = ent;
10458 s = ppc64_elf_tdata (ibfd)->got;
10459 ent->got.offset = s->size;
10460 ent->owner = ibfd;
10461 s->size += 16;
0e1862bb 10462 if (bfd_link_pic (info))
7865406b
AM
10463 {
10464 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10465 srel->size += sizeof (Elf64_External_Rela);
10466 }
102890f0
AM
10467 }
10468 }
10469 else
7865406b 10470 ent->got.offset = (bfd_vma) -1;
102890f0
AM
10471 }
10472
65f38f15
AM
10473 /* We now have determined the sizes of the various dynamic sections.
10474 Allocate memory for them. */
b34976b6 10475 relocs = FALSE;
65f38f15
AM
10476 for (s = dynobj->sections; s != NULL; s = s->next)
10477 {
10478 if ((s->flags & SEC_LINKER_CREATED) == 0)
10479 continue;
10480
4ce794b7 10481 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
10482 /* These haven't been allocated yet; don't strip. */
10483 continue;
33e44f2e
AM
10484 else if (s == htab->elf.sgot
10485 || s == htab->elf.splt
10486 || s == htab->elf.iplt
2d7ad24e 10487 || s == htab->pltlocal
c456f082 10488 || s == htab->glink
9e390558 10489 || s == htab->global_entry
5474d94f
AM
10490 || s == htab->elf.sdynbss
10491 || s == htab->elf.sdynrelro)
65f38f15
AM
10492 {
10493 /* Strip this section if we don't need it; see the
10494 comment below. */
5bd4f169 10495 }
58d180e8
AM
10496 else if (s == htab->glink_eh_frame)
10497 {
10498 if (!bfd_is_abs_section (s->output_section))
10499 /* Not sized yet. */
10500 continue;
10501 }
70cc837d 10502 else if (CONST_STRNEQ (s->name, ".rela"))
5bd4f169 10503 {
c456f082 10504 if (s->size != 0)
5bd4f169 10505 {
33e44f2e 10506 if (s != htab->elf.srelplt)
b34976b6 10507 relocs = TRUE;
5bd4f169
AM
10508
10509 /* We use the reloc_count field as a counter if we need
10510 to copy relocs into the output file. */
10511 s->reloc_count = 0;
10512 }
10513 }
65f38f15 10514 else
5bd4f169
AM
10515 {
10516 /* It's not one of our sections, so don't allocate space. */
10517 continue;
10518 }
10519
eea6121a 10520 if (s->size == 0)
5bd4f169 10521 {
c456f082
AM
10522 /* If we don't need this section, strip it from the
10523 output file. This is mostly to handle .rela.bss and
10524 .rela.plt. We must create both sections in
10525 create_dynamic_sections, because they must be created
10526 before the linker maps input sections to output
10527 sections. The linker does that before
10528 adjust_dynamic_symbol is called, and it is that
10529 function which decides whether anything needs to go
10530 into these sections. */
8423293d 10531 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
10532 continue;
10533 }
10534
06bcf541
AM
10535 if (bfd_is_abs_section (s->output_section))
10536 _bfd_error_handler (_("warning: discarding dynamic section %s"),
10537 s->name);
10538
c456f082 10539 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
10540 continue;
10541
65f38f15
AM
10542 /* Allocate memory for the section contents. We use bfd_zalloc
10543 here in case unused entries are not reclaimed before the
10544 section's contents are written out. This should not happen,
411e1bfb
AM
10545 but this way if it does we get a R_PPC64_NONE reloc in .rela
10546 sections instead of garbage.
10547 We also rely on the section contents being zero when writing
5474d94f 10548 the GOT and .dynrelro. */
eea6121a 10549 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 10550 if (s->contents == NULL)
b34976b6 10551 return FALSE;
5bd4f169
AM
10552 }
10553
c72f2fb2 10554 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
e717da7e 10555 {
0c8d6e5c 10556 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
10557 continue;
10558
e717da7e 10559 s = ppc64_elf_tdata (ibfd)->got;
33e44f2e 10560 if (s != NULL && s != htab->elf.sgot)
e717da7e 10561 {
eea6121a 10562 if (s->size == 0)
8423293d 10563 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10564 else
10565 {
eea6121a 10566 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10567 if (s->contents == NULL)
10568 return FALSE;
10569 }
10570 }
10571 s = ppc64_elf_tdata (ibfd)->relgot;
10572 if (s != NULL)
10573 {
eea6121a 10574 if (s->size == 0)
8423293d 10575 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10576 else
10577 {
eea6121a 10578 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10579 if (s->contents == NULL)
10580 return FALSE;
10581 relocs = TRUE;
10582 s->reloc_count = 0;
10583 }
10584 }
10585 }
10586
e86ce104 10587 if (htab->elf.dynamic_sections_created)
5bd4f169 10588 {
e8910a83
AM
10589 bfd_boolean tls_opt;
10590
5bd4f169
AM
10591 /* Add some entries to the .dynamic section. We fill in the
10592 values later, in ppc64_elf_finish_dynamic_sections, but we
10593 must add the entries now so that we get the correct size for
10594 the .dynamic section. The DT_DEBUG entry is filled in by the
10595 dynamic linker and used by the debugger. */
dc810e39 10596#define add_dynamic_entry(TAG, VAL) \
5a580b3a 10597 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 10598
0e1862bb 10599 if (bfd_link_executable (info))
5bd4f169 10600 {
dc810e39 10601 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 10602 return FALSE;
5bd4f169
AM
10603 }
10604
33e44f2e 10605 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5bd4f169 10606 {
dc810e39
AM
10607 if (!add_dynamic_entry (DT_PLTGOT, 0)
10608 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10609 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
10610 || !add_dynamic_entry (DT_JMPREL, 0)
10611 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 10612 return FALSE;
5bd4f169
AM
10613 }
10614
ee67d69a 10615 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
10616 {
10617 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10618 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 10619 return FALSE;
19397422
AM
10620 }
10621
7c9cf415 10622 tls_opt = (htab->params->tls_get_addr_opt
e8910a83
AM
10623 && htab->tls_get_addr_fd != NULL
10624 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
10625 if (tls_opt || !htab->opd_abi)
10626 {
10627 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10628 return FALSE;
10629 }
a7f2871e 10630
5bd4f169
AM
10631 if (relocs)
10632 {
dc810e39
AM
10633 if (!add_dynamic_entry (DT_RELA, 0)
10634 || !add_dynamic_entry (DT_RELASZ, 0)
10635 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 10636 return FALSE;
5bd4f169 10637
65f38f15
AM
10638 /* If any dynamic relocs apply to a read-only section,
10639 then we need a DT_TEXTREL entry. */
248866a8 10640 if ((info->flags & DF_TEXTREL) == 0)
a345bc8d 10641 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
5bd4f169 10642
65f38f15 10643 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 10644 {
65f38f15 10645 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 10646 return FALSE;
5bd4f169 10647 }
5bd4f169 10648 }
5bd4f169 10649 }
65f38f15 10650#undef add_dynamic_entry
5bd4f169 10651
b34976b6 10652 return TRUE;
5bd4f169
AM
10653}
10654
a345bc8d
AM
10655/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10656
10657static bfd_boolean
10658ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10659{
10660 if (h->plt.plist != NULL
10661 && !h->def_regular
10662 && !h->pointer_equality_needed)
10663 return FALSE;
10664
10665 return _bfd_elf_hash_symbol (h);
10666}
10667
721956f4 10668/* Determine the type of stub needed, if any, for a call. */
5bd4f169 10669
4ce794b7
AM
10670static inline enum ppc_stub_type
10671ppc_type_of_stub (asection *input_sec,
10672 const Elf_Internal_Rela *rel,
10673 struct ppc_link_hash_entry **hash,
e054468f 10674 struct plt_entry **plt_ent,
6911b7dc
AM
10675 bfd_vma destination,
10676 unsigned long local_off)
5bd4f169 10677{
721956f4
AM
10678 struct ppc_link_hash_entry *h = *hash;
10679 bfd_vma location;
10680 bfd_vma branch_offset;
10681 bfd_vma max_branch_offset;
4ce794b7 10682 enum elf_ppc64_reloc_type r_type;
5bd4f169 10683
721956f4
AM
10684 if (h != NULL)
10685 {
e054468f 10686 struct plt_entry *ent;
7fe2b9a6 10687 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
10688 if (h->oh != NULL
10689 && h->oh->is_func_descriptor)
7b8f6675
AM
10690 {
10691 fdh = ppc_follow_link (h->oh);
10692 *hash = fdh;
10693 }
8387904d 10694
e054468f
AM
10695 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10696 if (ent->addend == rel->r_addend
10697 && ent->plt.offset != (bfd_vma) -1)
10698 {
e054468f
AM
10699 *plt_ent = ent;
10700 return ppc_stub_plt_call;
10701 }
5bd4f169 10702
7fe2b9a6
AM
10703 /* Here, we know we don't have a plt entry. If we don't have a
10704 either a defined function descriptor or a defined entry symbol
10705 in a regular object file, then it is pointless trying to make
10706 any other type of stub. */
854b41e7
AM
10707 if (!is_static_defined (&fdh->elf)
10708 && !is_static_defined (&h->elf))
721956f4 10709 return ppc_stub_none;
5d1634d7 10710 }
e054468f
AM
10711 else if (elf_local_got_ents (input_sec->owner) != NULL)
10712 {
10713 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10714 struct plt_entry **local_plt = (struct plt_entry **)
10715 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10716 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10717
10718 if (local_plt[r_symndx] != NULL)
10719 {
10720 struct plt_entry *ent;
10721
10722 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10723 if (ent->addend == rel->r_addend
10724 && ent->plt.offset != (bfd_vma) -1)
10725 {
10726 *plt_ent = ent;
10727 return ppc_stub_plt_call;
10728 }
10729 }
10730 }
5d1634d7 10731
721956f4
AM
10732 /* Determine where the call point is. */
10733 location = (input_sec->output_offset
10734 + input_sec->output_section->vma
10735 + rel->r_offset);
5d1634d7 10736
721956f4
AM
10737 branch_offset = destination - location;
10738 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 10739
721956f4
AM
10740 /* Determine if a long branch stub is needed. */
10741 max_branch_offset = 1 << 25;
23cedd1d
AM
10742 if (r_type == R_PPC64_REL14
10743 || r_type == R_PPC64_REL14_BRTAKEN
10744 || r_type == R_PPC64_REL14_BRNTAKEN)
721956f4 10745 max_branch_offset = 1 << 15;
5d1634d7 10746
6911b7dc 10747 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
721956f4
AM
10748 /* We need a stub. Figure out whether a long_branch or plt_branch
10749 is needed later. */
10750 return ppc_stub_long_branch;
5d1634d7 10751
721956f4 10752 return ppc_stub_none;
5d1634d7
AM
10753}
10754
794e51c0
AM
10755/* With power7 weakly ordered memory model, it is possible for ld.so
10756 to update a plt entry in one thread and have another thread see a
10757 stale zero toc entry. To avoid this we need some sort of acquire
10758 barrier in the call stub. One solution is to make the load of the
10759 toc word seem to appear to depend on the load of the function entry
10760 word. Another solution is to test for r2 being zero, and branch to
10761 the appropriate glink entry if so.
10762
10763 . fake dep barrier compare
71a39c98
AM
10764 . ld 12,xxx(2) ld 12,xxx(2)
10765 . mtctr 12 mtctr 12
10766 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
10767 . add 2,2,11 cmpldi 2,0
10768 . ld 2,xxx+8(2) bnectr+
10769 . bctr b <glink_entry>
10770
10771 The solution involving the compare turns out to be faster, so
10772 that's what we use unless the branch won't reach. */
10773
10774#define ALWAYS_USE_FAKE_DEP 0
10775#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 10776
794e51c0
AM
10777static inline unsigned int
10778plt_stub_size (struct ppc_link_hash_table *htab,
10779 struct ppc_stub_hash_entry *stub_entry,
10780 bfd_vma off)
10781{
b9e5796b
AM
10782 unsigned size = 12;
10783
10784 if (ALWAYS_EMIT_R2SAVE
10785 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10786 size += 4;
10787 if (PPC_HA (off) != 0)
794e51c0 10788 size += 4;
b9e5796b
AM
10789 if (htab->opd_abi)
10790 {
10791 size += 4;
e7d1c40c 10792 if (htab->params->plt_static_chain)
b9e5796b 10793 size += 4;
bd4d2eaa
AM
10794 if (htab->params->plt_thread_safe
10795 && htab->elf.dynamic_sections_created
10796 && stub_entry->h != NULL
10797 && stub_entry->h->elf.dynindx != -1)
b9e5796b 10798 size += 8;
e7d1c40c 10799 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
b9e5796b
AM
10800 size += 4;
10801 }
794e51c0
AM
10802 if (stub_entry->h != NULL
10803 && (stub_entry->h == htab->tls_get_addr_fd
10804 || stub_entry->h == htab->tls_get_addr)
7c9cf415 10805 && htab->params->tls_get_addr_opt)
f378ab09
AM
10806 {
10807 size += 7 * 4;
10808 if (ALWAYS_EMIT_R2SAVE
10809 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
407aa07c 10810 size += 6 * 4;
f378ab09 10811 }
794e51c0
AM
10812 return size;
10813}
10814
2420fff6
AM
10815/* Depending on the sign of plt_stub_align:
10816 If positive, return the padding to align to a 2**plt_stub_align
10817 boundary.
10818 If negative, if this stub would cross fewer 2**plt_stub_align
10819 boundaries if we align, then return the padding needed to do so. */
10820
794e51c0
AM
10821static inline unsigned int
10822plt_stub_pad (struct ppc_link_hash_table *htab,
10823 struct ppc_stub_hash_entry *stub_entry,
10824 bfd_vma plt_off)
10825{
2420fff6 10826 int stub_align;
794e51c0 10827 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
6f20ed8a 10828 bfd_vma stub_off = stub_entry->group->stub_sec->size;
794e51c0 10829
2420fff6
AM
10830 if (htab->params->plt_stub_align >= 0)
10831 {
10832 stub_align = 1 << htab->params->plt_stub_align;
10833 if ((stub_off & (stub_align - 1)) != 0)
10834 return stub_align - (stub_off & (stub_align - 1));
10835 return 0;
10836 }
10837
10838 stub_align = 1 << -htab->params->plt_stub_align;
794e51c0 10839 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
e05fa0ba 10840 > ((stub_size - 1) & -stub_align))
794e51c0
AM
10841 return stub_align - (stub_off & (stub_align - 1));
10842 return 0;
10843}
10844
10845/* Build a .plt call stub. */
10846
10847static inline bfd_byte *
10848build_plt_stub (struct ppc_link_hash_table *htab,
10849 struct ppc_stub_hash_entry *stub_entry,
10850 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10851{
e7d1c40c 10852 bfd *obfd = htab->params->stub_bfd;
b9e5796b 10853 bfd_boolean plt_load_toc = htab->opd_abi;
e7d1c40c 10854 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
bd4d2eaa
AM
10855 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10856 && htab->elf.dynamic_sections_created
10857 && stub_entry->h != NULL
10858 && stub_entry->h->elf.dynindx != -1);
794e51c0
AM
10859 bfd_boolean use_fake_dep = plt_thread_safe;
10860 bfd_vma cmp_branch_off = 0;
10861
10862 if (!ALWAYS_USE_FAKE_DEP
b9e5796b 10863 && plt_load_toc
794e51c0 10864 && plt_thread_safe
bd4d2eaa
AM
10865 && !((stub_entry->h == htab->tls_get_addr_fd
10866 || stub_entry->h == htab->tls_get_addr)
7c9cf415 10867 && htab->params->tls_get_addr_opt))
794e51c0
AM
10868 {
10869 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
b9e5796b
AM
10870 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10871 / PLT_ENTRY_SIZE (htab));
9e390558 10872 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8;
794e51c0
AM
10873 bfd_vma to, from;
10874
68d62958
AM
10875 if (pltindex > 32768)
10876 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
10877 to = (glinkoff
10878 + htab->glink->output_offset
10879 + htab->glink->output_section->vma);
6f20ed8a 10880 from = (p - stub_entry->group->stub_sec->contents
794e51c0
AM
10881 + 4 * (ALWAYS_EMIT_R2SAVE
10882 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10883 + 4 * (PPC_HA (offset) != 0)
10884 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10885 != PPC_HA (offset))
10886 + 4 * (plt_static_chain != 0)
10887 + 20
6f20ed8a
AM
10888 + stub_entry->group->stub_sec->output_offset
10889 + stub_entry->group->stub_sec->output_section->vma);
794e51c0
AM
10890 cmp_branch_off = to - from;
10891 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10892 }
10893
ac2df442
AM
10894 if (PPC_HA (offset) != 0)
10895 {
176a0d42
AM
10896 if (r != NULL)
10897 {
794e51c0
AM
10898 if (ALWAYS_EMIT_R2SAVE
10899 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10900 r[0].r_offset += 4;
176a0d42 10901 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 10902 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
10903 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10904 r[1].r_addend = r[0].r_addend;
b9e5796b 10905 if (plt_load_toc)
176a0d42 10906 {
b9e5796b 10907 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10908 {
b9e5796b
AM
10909 r[2].r_offset = r[1].r_offset + 4;
10910 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10911 r[2].r_addend = r[0].r_addend;
10912 }
10913 else
10914 {
10915 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10916 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10917 r[2].r_addend = r[0].r_addend + 8;
10918 if (plt_static_chain)
10919 {
10920 r[3].r_offset = r[2].r_offset + 4;
10921 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10922 r[3].r_addend = r[0].r_addend + 16;
10923 }
c7131b65 10924 }
176a0d42
AM
10925 }
10926 }
794e51c0
AM
10927 if (ALWAYS_EMIT_R2SAVE
10928 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10929 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
397998fc
AM
10930 if (plt_load_toc)
10931 {
10932 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10933 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10934 }
10935 else
10936 {
10937 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10938 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10939 }
b9e5796b
AM
10940 if (plt_load_toc
10941 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 10942 {
71a39c98 10943 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
10944 offset = 0;
10945 }
71a39c98 10946 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10947 if (plt_load_toc)
794e51c0 10948 {
b9e5796b
AM
10949 if (use_fake_dep)
10950 {
10951 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10952 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10953 }
10954 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10955 if (plt_static_chain)
10956 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
794e51c0 10957 }
ac2df442
AM
10958 }
10959 else
10960 {
176a0d42
AM
10961 if (r != NULL)
10962 {
794e51c0
AM
10963 if (ALWAYS_EMIT_R2SAVE
10964 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10965 r[0].r_offset += 4;
176a0d42 10966 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
b9e5796b 10967 if (plt_load_toc)
176a0d42 10968 {
b9e5796b 10969 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10970 {
b9e5796b
AM
10971 r[1].r_offset = r[0].r_offset + 4;
10972 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10973 r[1].r_addend = r[0].r_addend;
10974 }
10975 else
10976 {
10977 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10978 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10979 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10980 if (plt_static_chain)
10981 {
10982 r[2].r_offset = r[1].r_offset + 4;
10983 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10984 r[2].r_addend = r[0].r_addend + 8;
10985 }
c7131b65 10986 }
176a0d42
AM
10987 }
10988 }
794e51c0
AM
10989 if (ALWAYS_EMIT_R2SAVE
10990 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10991 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
71a39c98 10992 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
b9e5796b
AM
10993 if (plt_load_toc
10994 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
10995 {
10996 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10997 offset = 0;
10998 }
71a39c98 10999 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 11000 if (plt_load_toc)
794e51c0 11001 {
b9e5796b
AM
11002 if (use_fake_dep)
11003 {
11004 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
11005 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
11006 }
11007 if (plt_static_chain)
11008 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
11009 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
794e51c0 11010 }
ac2df442 11011 }
b9e5796b 11012 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
794e51c0
AM
11013 {
11014 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
11015 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 11016 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
11017 }
11018 else
407aa07c 11019 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
11020 return p;
11021}
11022
a7f2871e
AM
11023/* Build a special .plt call stub for __tls_get_addr. */
11024
11025#define LD_R11_0R3 0xe9630000
11026#define LD_R12_0R3 0xe9830000
11027#define MR_R0_R3 0x7c601b78
11028#define CMPDI_R11_0 0x2c2b0000
11029#define ADD_R3_R12_R13 0x7c6c6a14
11030#define BEQLR 0x4d820020
11031#define MR_R3_R0 0x7c030378
a7f2871e
AM
11032#define STD_R11_0R1 0xf9610000
11033#define BCTRL 0x4e800421
11034#define LD_R11_0R1 0xe9610000
a7f2871e
AM
11035#define MTLR_R11 0x7d6803a6
11036
11037static inline bfd_byte *
794e51c0
AM
11038build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
11039 struct ppc_stub_hash_entry *stub_entry,
11040 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 11041{
e7d1c40c 11042 bfd *obfd = htab->params->stub_bfd;
794e51c0 11043
a7f2871e
AM
11044 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
11045 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
11046 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
11047 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
11048 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
11049 bfd_put_32 (obfd, BEQLR, p), p += 4;
11050 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
f378ab09
AM
11051 if (r != NULL)
11052 r[0].r_offset += 7 * 4;
11053 if (!ALWAYS_EMIT_R2SAVE
11054 && stub_entry->stub_type != ppc_stub_plt_call_r2save)
11055 return build_plt_stub (htab, stub_entry, p, offset, r);
11056
a7f2871e 11057 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
a078d95a 11058 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
11059
11060 if (r != NULL)
f378ab09 11061 r[0].r_offset += 2 * 4;
794e51c0 11062 p = build_plt_stub (htab, stub_entry, p, offset, r);
407aa07c 11063 bfd_put_32 (obfd, BCTRL, p - 4);
a7f2871e 11064
a078d95a 11065 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
bd4d2eaa 11066 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
11067 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
11068 bfd_put_32 (obfd, BLR, p), p += 4;
11069
11070 return p;
11071}
11072
176a0d42
AM
11073static Elf_Internal_Rela *
11074get_relocs (asection *sec, int count)
11075{
11076 Elf_Internal_Rela *relocs;
11077 struct bfd_elf_section_data *elfsec_data;
11078
11079 elfsec_data = elf_section_data (sec);
11080 relocs = elfsec_data->relocs;
11081 if (relocs == NULL)
11082 {
11083 bfd_size_type relsize;
11084 relsize = sec->reloc_count * sizeof (*relocs);
11085 relocs = bfd_alloc (sec->owner, relsize);
11086 if (relocs == NULL)
11087 return NULL;
11088 elfsec_data->relocs = relocs;
d4730f92
BS
11089 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
11090 sizeof (Elf_Internal_Shdr));
11091 if (elfsec_data->rela.hdr == NULL)
11092 return NULL;
11093 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
11094 * sizeof (Elf64_External_Rela));
11095 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
11096 sec->reloc_count = 0;
11097 }
11098 relocs += sec->reloc_count;
11099 sec->reloc_count += count;
11100 return relocs;
11101}
11102
aa374f67 11103static bfd_vma
25f53a85 11104get_r2off (struct bfd_link_info *info,
aa374f67
AM
11105 struct ppc_stub_hash_entry *stub_entry)
11106{
25f53a85 11107 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 11108 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
aa374f67
AM
11109
11110 if (r2off == 0)
11111 {
11112 /* Support linking -R objects. Get the toc pointer from the
11113 opd entry. */
11114 char buf[8];
b9e5796b
AM
11115 if (!htab->opd_abi)
11116 return r2off;
aa374f67
AM
11117 asection *opd = stub_entry->h->elf.root.u.def.section;
11118 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
11119
11120 if (strcmp (opd->name, ".opd") != 0
11121 || opd->reloc_count != 0)
11122 {
c1c8c1ef 11123 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%pT'\n"),
25f53a85 11124 stub_entry->h->elf.root.root.string);
aa374f67 11125 bfd_set_error (bfd_error_bad_value);
a7c49797 11126 return (bfd_vma) -1;
aa374f67
AM
11127 }
11128 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
a7c49797 11129 return (bfd_vma) -1;
aa374f67 11130 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 11131 r2off -= elf_gp (info->output_bfd);
aa374f67 11132 }
6f20ed8a 11133 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
aa374f67
AM
11134 return r2off;
11135}
11136
b34976b6 11137static bfd_boolean
4ce794b7 11138ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 11139{
721956f4
AM
11140 struct ppc_stub_hash_entry *stub_entry;
11141 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
11142 struct bfd_link_info *info;
11143 struct ppc_link_hash_table *htab;
721956f4
AM
11144 bfd_byte *loc;
11145 bfd_byte *p;
ee75fd95 11146 bfd_vma dest, off;
176a0d42 11147 Elf_Internal_Rela *r;
e054468f 11148 asection *plt;
5d1634d7 11149
721956f4
AM
11150 /* Massage our args to the form they really have. */
11151 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 11152 info = in_arg;
5d1634d7 11153
5d1634d7 11154 htab = ppc_hash_table (info);
4dfe6ac6
NC
11155 if (htab == NULL)
11156 return FALSE;
5d1634d7 11157
721956f4 11158 /* Make a note of the offset within the stubs for this entry. */
6f20ed8a
AM
11159 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11160 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
721956f4 11161
4ce794b7 11162 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 11163 switch (stub_entry->stub_type)
5d1634d7 11164 {
721956f4 11165 case ppc_stub_long_branch:
ad8e1ba5 11166 case ppc_stub_long_branch_r2off:
721956f4 11167 /* Branches are relative. This is where we are going to. */
6911b7dc
AM
11168 dest = (stub_entry->target_value
11169 + stub_entry->target_section->output_offset
11170 + stub_entry->target_section->output_section->vma);
11171 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11172 off = dest;
5d1634d7 11173
721956f4
AM
11174 /* And this is where we are coming from. */
11175 off -= (stub_entry->stub_offset
6f20ed8a
AM
11176 + stub_entry->group->stub_sec->output_offset
11177 + stub_entry->group->stub_sec->output_section->vma);
e86ce104 11178
9e390558 11179 p = loc;
ac2df442 11180 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 11181 {
25f53a85 11182 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 11183
a7c49797 11184 if (r2off == (bfd_vma) -1)
aa374f67
AM
11185 {
11186 htab->stub_error = TRUE;
11187 return FALSE;
11188 }
9e390558
AM
11189 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11190 p += 4;
ac2df442
AM
11191 if (PPC_HA (r2off) != 0)
11192 {
e7d1c40c 11193 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11194 ADDIS_R2_R2 | PPC_HA (r2off), p);
11195 p += 4;
a7c49797
AM
11196 }
11197 if (PPC_LO (r2off) != 0)
11198 {
11199 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11200 ADDI_R2_R2 | PPC_LO (r2off), p);
11201 p += 4;
ac2df442 11202 }
9e390558 11203 off -= p - loc;
ad8e1ba5 11204 }
9e390558
AM
11205 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p);
11206 p += 4;
ad8e1ba5 11207
5c3dead3
AM
11208 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11209 {
cf97bcb0
AM
11210 _bfd_error_handler
11211 (_("long branch stub `%s' offset overflow"),
bc30df16 11212 stub_entry->root.string);
5c3dead3
AM
11213 htab->stub_error = TRUE;
11214 return FALSE;
11215 }
ee75fd95
AM
11216
11217 if (info->emitrelocations)
11218 {
6f20ed8a 11219 r = get_relocs (stub_entry->group->stub_sec, 1);
176a0d42
AM
11220 if (r == NULL)
11221 return FALSE;
9e390558 11222 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
ee75fd95
AM
11223 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
11224 r->r_addend = dest;
11225 if (stub_entry->h != NULL)
11226 {
11227 struct elf_link_hash_entry **hashes;
11228 unsigned long symndx;
11229 struct ppc_link_hash_entry *h;
11230
e7d1c40c 11231 hashes = elf_sym_hashes (htab->params->stub_bfd);
ee75fd95
AM
11232 if (hashes == NULL)
11233 {
11234 bfd_size_type hsize;
11235
11236 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
e7d1c40c 11237 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
ee75fd95
AM
11238 if (hashes == NULL)
11239 return FALSE;
e7d1c40c 11240 elf_sym_hashes (htab->params->stub_bfd) = hashes;
ee75fd95
AM
11241 htab->stub_globals = 1;
11242 }
11243 symndx = htab->stub_globals++;
11244 h = stub_entry->h;
11245 hashes[symndx] = &h->elf;
11246 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
11247 if (h->oh != NULL && h->oh->is_func)
b31867b6 11248 h = ppc_follow_link (h->oh);
ee75fd95
AM
11249 if (h->elf.root.u.def.section != stub_entry->target_section)
11250 /* H is an opd symbol. The addend must be zero. */
11251 r->r_addend = 0;
11252 else
11253 {
11254 off = (h->elf.root.u.def.value
11255 + h->elf.root.u.def.section->output_offset
11256 + h->elf.root.u.def.section->output_section->vma);
11257 r->r_addend -= off;
11258 }
11259 }
11260 }
721956f4 11261 break;
e86ce104 11262
721956f4 11263 case ppc_stub_plt_branch:
ad8e1ba5 11264 case ppc_stub_plt_branch_r2off:
721956f4
AM
11265 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11266 stub_entry->root.string + 9,
b34976b6 11267 FALSE, FALSE);
721956f4
AM
11268 if (br_entry == NULL)
11269 {
cf97bcb0
AM
11270 _bfd_error_handler (_("can't find branch stub `%s'"),
11271 stub_entry->root.string);
b34976b6
AM
11272 htab->stub_error = TRUE;
11273 return FALSE;
721956f4
AM
11274 }
11275
176a0d42
AM
11276 dest = (stub_entry->target_value
11277 + stub_entry->target_section->output_offset
11278 + stub_entry->target_section->output_section->vma);
6911b7dc
AM
11279 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11280 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 11281
176a0d42 11282 bfd_put_64 (htab->brlt->owner, dest,
4ce794b7 11283 htab->brlt->contents + br_entry->offset);
721956f4 11284
f94498ff 11285 if (br_entry->iter == htab->stub_iteration)
721956f4 11286 {
f94498ff 11287 br_entry->iter = 0;
84f5d08e 11288
f94498ff 11289 if (htab->relbrlt != NULL)
84f5d08e 11290 {
f94498ff
AM
11291 /* Create a reloc for the branch lookup table entry. */
11292 Elf_Internal_Rela rela;
11293 bfd_byte *rl;
11294
11295 rela.r_offset = (br_entry->offset
11296 + htab->brlt->output_offset
11297 + htab->brlt->output_section->vma);
11298 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
176a0d42 11299 rela.r_addend = dest;
f94498ff
AM
11300
11301 rl = htab->relbrlt->contents;
11302 rl += (htab->relbrlt->reloc_count++
11303 * sizeof (Elf64_External_Rela));
11304 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
11305 }
11306 else if (info->emitrelocations)
11307 {
176a0d42
AM
11308 r = get_relocs (htab->brlt, 1);
11309 if (r == NULL)
11310 return FALSE;
11311 /* brlt, being SEC_LINKER_CREATED does not go through the
11312 normal reloc processing. Symbols and offsets are not
11313 translated from input file to output file form, so
11314 set up the offset per the output file. */
f94498ff
AM
11315 r->r_offset = (br_entry->offset
11316 + htab->brlt->output_offset
11317 + htab->brlt->output_section->vma);
11318 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
176a0d42 11319 r->r_addend = dest;
84f5d08e 11320 }
84f5d08e 11321 }
721956f4 11322
176a0d42
AM
11323 dest = (br_entry->offset
11324 + htab->brlt->output_offset
11325 + htab->brlt->output_section->vma);
11326
11327 off = (dest
06bcf541 11328 - elf_gp (info->output_bfd)
6f20ed8a 11329 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
721956f4 11330
ad8e1ba5 11331 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 11332 {
25f53a85 11333 info->callbacks->einfo
c1c8c1ef 11334 (_("%P: linkage table error against `%pT'\n"),
721956f4 11335 stub_entry->root.string);
5d1634d7 11336 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11337 htab->stub_error = TRUE;
11338 return FALSE;
5d1634d7 11339 }
41bd81ab 11340
176a0d42
AM
11341 if (info->emitrelocations)
11342 {
6f20ed8a 11343 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
176a0d42
AM
11344 if (r == NULL)
11345 return FALSE;
6f20ed8a 11346 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11347 if (bfd_big_endian (info->output_bfd))
11348 r[0].r_offset += 2;
00f412ee 11349 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
176a0d42
AM
11350 r[0].r_offset += 4;
11351 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
11352 r[0].r_addend = dest;
11353 if (PPC_HA (off) != 0)
11354 {
11355 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11356 r[1].r_offset = r[0].r_offset + 4;
11357 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11358 r[1].r_addend = r[0].r_addend;
11359 }
11360 }
11361
9e390558 11362 p = loc;
00f412ee 11363 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ad8e1ba5 11364 {
176a0d42 11365 if (PPC_HA (off) != 0)
ac2df442 11366 {
e7d1c40c 11367 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11368 ADDIS_R12_R2 | PPC_HA (off), p);
11369 p += 4;
e7d1c40c 11370 bfd_put_32 (htab->params->stub_bfd,
9e390558 11371 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11372 }
11373 else
9e390558
AM
11374 bfd_put_32 (htab->params->stub_bfd,
11375 LD_R12_0R2 | PPC_LO (off), p);
ad8e1ba5
AM
11376 }
11377 else
11378 {
25f53a85 11379 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 11380
a7c49797 11381 if (r2off == (bfd_vma) -1)
aa374f67
AM
11382 {
11383 htab->stub_error = TRUE;
11384 return FALSE;
11385 }
ad8e1ba5 11386
9e390558
AM
11387 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11388 p += 4;
176a0d42 11389 if (PPC_HA (off) != 0)
ac2df442 11390 {
e7d1c40c 11391 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11392 ADDIS_R12_R2 | PPC_HA (off), p);
11393 p += 4;
e7d1c40c 11394 bfd_put_32 (htab->params->stub_bfd,
9e390558 11395 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11396 }
11397 else
9e390558 11398 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p);
ac2df442
AM
11399
11400 if (PPC_HA (r2off) != 0)
11401 {
9e390558 11402 p += 4;
e7d1c40c 11403 bfd_put_32 (htab->params->stub_bfd,
9e390558 11404 ADDIS_R2_R2 | PPC_HA (r2off), p);
00f412ee
AM
11405 }
11406 if (PPC_LO (r2off) != 0)
11407 {
9e390558 11408 p += 4;
e7d1c40c 11409 bfd_put_32 (htab->params->stub_bfd,
9e390558 11410 ADDI_R2_R2 | PPC_LO (r2off), p);
ac2df442 11411 }
ad8e1ba5 11412 }
9e390558
AM
11413 p += 4;
11414 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11415 p += 4;
407aa07c
AM
11416 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11417 p += 4;
721956f4 11418 break;
5d1634d7 11419
721956f4 11420 case ppc_stub_plt_call:
794e51c0 11421 case ppc_stub_plt_call_r2save:
e054468f 11422 if (stub_entry->h != NULL
b31867b6
AM
11423 && stub_entry->h->is_func_descriptor
11424 && stub_entry->h->oh != NULL)
c862ae31 11425 {
b31867b6
AM
11426 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11427
11428 /* If the old-ABI "dot-symbol" is undefined make it weak so
6f20ed8a 11429 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
8c5b4e52
AM
11430 if (fh->elf.root.type == bfd_link_hash_undefined
11431 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11432 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
b31867b6 11433 fh->elf.root.type = bfd_link_hash_undefweak;
c862ae31
AM
11434 }
11435
721956f4 11436 /* Now build the stub. */
e054468f 11437 dest = stub_entry->plt_ent->plt.offset & ~1;
176a0d42 11438 if (dest >= (bfd_vma) -2)
721956f4
AM
11439 abort ();
11440
33e44f2e 11441 plt = htab->elf.splt;
25f23106
AM
11442 if (!htab->elf.dynamic_sections_created
11443 || stub_entry->h == NULL
11444 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11445 {
11446 if (stub_entry->symtype == STT_GNU_IFUNC)
11447 plt = htab->elf.iplt;
11448 else
11449 plt = htab->pltlocal;
11450 }
e054468f
AM
11451
11452 dest += plt->output_offset + plt->output_section->vma;
11453
176a0d42 11454 off = (dest
06bcf541 11455 - elf_gp (info->output_bfd)
6f20ed8a 11456 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
721956f4 11457
ad8e1ba5 11458 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 11459 {
25f53a85 11460 info->callbacks->einfo
695344c0 11461 /* xgettext:c-format */
c1c8c1ef 11462 (_("%P: linkage table error against `%pT'\n"),
e054468f
AM
11463 stub_entry->h != NULL
11464 ? stub_entry->h->elf.root.root.string
11465 : "<local sym>");
721956f4 11466 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11467 htab->stub_error = TRUE;
11468 return FALSE;
721956f4
AM
11469 }
11470
e7d1c40c 11471 if (htab->params->plt_stub_align != 0)
794e51c0
AM
11472 {
11473 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11474
6f20ed8a
AM
11475 stub_entry->group->stub_sec->size += pad;
11476 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
794e51c0
AM
11477 loc += pad;
11478 }
11479
176a0d42
AM
11480 r = NULL;
11481 if (info->emitrelocations)
11482 {
6f20ed8a 11483 r = get_relocs (stub_entry->group->stub_sec,
3ba720c7
AM
11484 ((PPC_HA (off) != 0)
11485 + (htab->opd_abi
e7d1c40c 11486 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
11487 && PPC_HA (off + 16) == PPC_HA (off))
11488 : 1)));
176a0d42
AM
11489 if (r == NULL)
11490 return FALSE;
6f20ed8a 11491 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11492 if (bfd_big_endian (info->output_bfd))
11493 r[0].r_offset += 2;
176a0d42
AM
11494 r[0].r_addend = dest;
11495 }
a7f2871e
AM
11496 if (stub_entry->h != NULL
11497 && (stub_entry->h == htab->tls_get_addr_fd
11498 || stub_entry->h == htab->tls_get_addr)
7c9cf415 11499 && htab->params->tls_get_addr_opt)
794e51c0 11500 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 11501 else
794e51c0 11502 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
11503 break;
11504
a4b6fadd
AM
11505 case ppc_stub_save_res:
11506 return TRUE;
11507
721956f4
AM
11508 default:
11509 BFD_FAIL ();
b34976b6 11510 return FALSE;
721956f4
AM
11511 }
11512
9e390558 11513 stub_entry->group->stub_sec->size += p - loc;
97b639ba 11514
e7d1c40c 11515 if (htab->params->emit_stub_syms)
97b639ba
AM
11516 {
11517 struct elf_link_hash_entry *h;
ee75fd95
AM
11518 size_t len1, len2;
11519 char *name;
11520 const char *const stub_str[] = { "long_branch",
11521 "long_branch_r2off",
11522 "plt_branch",
11523 "plt_branch_r2off",
794e51c0 11524 "plt_call",
ee75fd95
AM
11525 "plt_call" };
11526
11527 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11528 len2 = strlen (stub_entry->root.string);
11529 name = bfd_malloc (len1 + len2 + 2);
11530 if (name == NULL)
11531 return FALSE;
11532 memcpy (name, stub_entry->root.string, 9);
11533 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11534 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11535 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
11536 if (h == NULL)
11537 return FALSE;
11538 if (h->root.type == bfd_link_hash_new)
11539 {
11540 h->root.type = bfd_link_hash_defined;
6f20ed8a 11541 h->root.u.def.section = stub_entry->group->stub_sec;
97b639ba 11542 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
11543 h->ref_regular = 1;
11544 h->def_regular = 1;
11545 h->ref_regular_nonweak = 1;
11546 h->forced_local = 1;
11547 h->non_elf = 0;
2ec55de3 11548 h->root.linker_def = 1;
97b639ba
AM
11549 }
11550 }
11551
b34976b6 11552 return TRUE;
721956f4
AM
11553}
11554
11555/* As above, but don't actually build the stub. Just bump offset so
11556 we know stub section sizes, and select plt_branch stubs where
11557 long_branch stubs won't do. */
11558
b34976b6 11559static bfd_boolean
4ce794b7 11560ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
11561{
11562 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 11563 struct bfd_link_info *info;
721956f4
AM
11564 struct ppc_link_hash_table *htab;
11565 bfd_vma off;
11566 int size;
11567
11568 /* Massage our args to the form they really have. */
11569 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
11570 info = in_arg;
11571
11572 htab = ppc_hash_table (info);
4dfe6ac6
NC
11573 if (htab == NULL)
11574 return FALSE;
721956f4 11575
a4b6fadd
AM
11576 if (stub_entry->h != NULL
11577 && stub_entry->h->save_res
11578 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11579 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11580 {
11581 /* Don't make stubs to out-of-line register save/restore
11582 functions. Instead, emit copies of the functions. */
11583 stub_entry->group->needs_save_res = 1;
11584 stub_entry->stub_type = ppc_stub_save_res;
11585 return TRUE;
11586 }
11587
794e51c0
AM
11588 if (stub_entry->stub_type == ppc_stub_plt_call
11589 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
721956f4 11590 {
e054468f
AM
11591 asection *plt;
11592 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
58ac9f71 11593 if (off >= (bfd_vma) -2)
411e1bfb 11594 abort ();
33e44f2e 11595 plt = htab->elf.splt;
25f23106
AM
11596 if (!htab->elf.dynamic_sections_created
11597 || stub_entry->h == NULL
11598 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11599 {
11600 if (stub_entry->symtype == STT_GNU_IFUNC)
11601 plt = htab->elf.iplt;
11602 else
11603 plt = htab->pltlocal;
11604 }
e054468f
AM
11605 off += (plt->output_offset
11606 + plt->output_section->vma
06bcf541 11607 - elf_gp (info->output_bfd)
6f20ed8a 11608 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
721956f4 11609
794e51c0 11610 size = plt_stub_size (htab, stub_entry, off);
d4aaa2a0
AM
11611 if (stub_entry->h != NULL
11612 && (stub_entry->h == htab->tls_get_addr_fd
11613 || stub_entry->h == htab->tls_get_addr)
11614 && htab->params->tls_get_addr_opt
11615 && (ALWAYS_EMIT_R2SAVE
11616 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
11617 stub_entry->group->tls_get_addr_opt_bctrl
11618 = stub_entry->group->stub_sec->size + size - 5 * 4;
11619
e7d1c40c 11620 if (htab->params->plt_stub_align)
794e51c0 11621 size += plt_stub_pad (htab, stub_entry, off);
176a0d42
AM
11622 if (info->emitrelocations)
11623 {
6f20ed8a 11624 stub_entry->group->stub_sec->reloc_count
b9e5796b
AM
11625 += ((PPC_HA (off) != 0)
11626 + (htab->opd_abi
e7d1c40c 11627 ? 2 + (htab->params->plt_static_chain
b9e5796b
AM
11628 && PPC_HA (off + 16) == PPC_HA (off))
11629 : 1));
6f20ed8a 11630 stub_entry->group->stub_sec->flags |= SEC_RELOC;
176a0d42 11631 }
721956f4
AM
11632 }
11633 else
11634 {
ad8e1ba5
AM
11635 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
11636 variants. */
ac2df442 11637 bfd_vma r2off = 0;
6911b7dc 11638 bfd_vma local_off = 0;
ac2df442 11639
721956f4
AM
11640 off = (stub_entry->target_value
11641 + stub_entry->target_section->output_offset
11642 + stub_entry->target_section->output_section->vma);
6f20ed8a
AM
11643 off -= (stub_entry->group->stub_sec->size
11644 + stub_entry->group->stub_sec->output_offset
11645 + stub_entry->group->stub_sec->output_section->vma);
721956f4 11646
ad8e1ba5
AM
11647 /* Reset the stub type from the plt variant in case we now
11648 can reach with a shorter stub. */
11649 if (stub_entry->stub_type >= ppc_stub_plt_branch)
11650 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11651
11652 size = 4;
11653 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11654 {
25f53a85 11655 r2off = get_r2off (info, stub_entry);
a7c49797 11656 if (r2off == (bfd_vma) -1)
aa374f67
AM
11657 {
11658 htab->stub_error = TRUE;
11659 return FALSE;
11660 }
a7c49797 11661 size = 8;
ac2df442 11662 if (PPC_HA (r2off) != 0)
a7c49797
AM
11663 size += 4;
11664 if (PPC_LO (r2off) != 0)
11665 size += 4;
ac2df442 11666 off -= size - 4;
ad8e1ba5
AM
11667 }
11668
6911b7dc
AM
11669 local_off = PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11670
6a3858a6 11671 /* If the branch offset is too big, use a ppc_stub_plt_branch.
b9e5796b
AM
11672 Do the same for -R objects without function descriptors. */
11673 if (off + (1 << 25) >= (bfd_vma) (1 << 26) - local_off
11674 || (stub_entry->stub_type == ppc_stub_long_branch_r2off
a7c49797
AM
11675 && r2off == 0
11676 && htab->sec_info[stub_entry->target_section->id].toc_off == 0))
721956f4
AM
11677 {
11678 struct ppc_branch_hash_entry *br_entry;
11679
11680 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11681 stub_entry->root.string + 9,
b34976b6 11682 TRUE, FALSE);
721956f4
AM
11683 if (br_entry == NULL)
11684 {
cf97bcb0
AM
11685 _bfd_error_handler (_("can't build branch stub `%s'"),
11686 stub_entry->root.string);
b34976b6
AM
11687 htab->stub_error = TRUE;
11688 return FALSE;
721956f4
AM
11689 }
11690
11691 if (br_entry->iter != htab->stub_iteration)
11692 {
11693 br_entry->iter = htab->stub_iteration;
eea6121a
AM
11694 br_entry->offset = htab->brlt->size;
11695 htab->brlt->size += 8;
63bc6f6c 11696
ee75fd95 11697 if (htab->relbrlt != NULL)
eea6121a 11698 htab->relbrlt->size += sizeof (Elf64_External_Rela);
84f5d08e
AM
11699 else if (info->emitrelocations)
11700 {
11701 htab->brlt->reloc_count += 1;
11702 htab->brlt->flags |= SEC_RELOC;
11703 }
721956f4 11704 }
ad8e1ba5
AM
11705
11706 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
ac2df442
AM
11707 off = (br_entry->offset
11708 + htab->brlt->output_offset
11709 + htab->brlt->output_section->vma
06bcf541 11710 - elf_gp (info->output_bfd)
6f20ed8a 11711 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
ac2df442 11712
176a0d42
AM
11713 if (info->emitrelocations)
11714 {
6f20ed8a
AM
11715 stub_entry->group->stub_sec->reloc_count
11716 += 1 + (PPC_HA (off) != 0);
11717 stub_entry->group->stub_sec->flags |= SEC_RELOC;
176a0d42
AM
11718 }
11719
00f412ee 11720 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ac2df442
AM
11721 {
11722 size = 12;
176a0d42 11723 if (PPC_HA (off) != 0)
ac2df442
AM
11724 size = 16;
11725 }
11726 else
11727 {
00f412ee 11728 size = 16;
176a0d42 11729 if (PPC_HA (off) != 0)
ac2df442
AM
11730 size += 4;
11731
11732 if (PPC_HA (r2off) != 0)
11733 size += 4;
00f412ee
AM
11734 if (PPC_LO (r2off) != 0)
11735 size += 4;
ac2df442 11736 }
721956f4 11737 }
84f5d08e
AM
11738 else if (info->emitrelocations)
11739 {
6f20ed8a
AM
11740 stub_entry->group->stub_sec->reloc_count += 1;
11741 stub_entry->group->stub_sec->flags |= SEC_RELOC;
84f5d08e 11742 }
721956f4
AM
11743 }
11744
6f20ed8a 11745 stub_entry->group->stub_sec->size += size;
b34976b6 11746 return TRUE;
721956f4
AM
11747}
11748
11749/* Set up various things so that we can make a list of input sections
11750 for each output section included in the link. Returns -1 on error,
cedb70c5 11751 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
11752
11753int
e7d1c40c 11754ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4 11755{
6f20ed8a 11756 unsigned int id;
721956f4
AM
11757 bfd_size_type amt;
11758 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11759
4dfe6ac6
NC
11760 if (htab == NULL)
11761 return -1;
4c52953f 11762
7cf7fcc8 11763 htab->sec_info_arr_size = _bfd_section_id;
6f20ed8a
AM
11764 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
11765 htab->sec_info = bfd_zmalloc (amt);
11766 if (htab->sec_info == NULL)
721956f4
AM
11767 return -1;
11768
3d6f9012
AM
11769 /* Set toc_off for com, und, abs and ind sections. */
11770 for (id = 0; id < 3; id++)
6f20ed8a 11771 htab->sec_info[id].toc_off = TOC_BASE_OFF;
734b6cf9 11772
721956f4
AM
11773 return 1;
11774}
11775
927be08e
AM
11776/* Set up for first pass at multitoc partitioning. */
11777
11778void
11779ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11780{
11781 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11782
1c865ab2 11783 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
11784 htab->toc_bfd = NULL;
11785 htab->toc_first_sec = NULL;
11786}
11787
e717da7e
AM
11788/* The linker repeatedly calls this function for each TOC input section
11789 and linker generated GOT section. Group input bfds such that the toc
927be08e 11790 within a group is less than 64k in size. */
ad8e1ba5 11791
927be08e 11792bfd_boolean
4ce794b7 11793ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
11794{
11795 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 11796 bfd_vma addr, off, limit;
ad8e1ba5 11797
4dfe6ac6
NC
11798 if (htab == NULL)
11799 return FALSE;
11800
927be08e 11801 if (!htab->second_toc_pass)
4c52953f 11802 {
927be08e 11803 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
11804 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11805
11806 if (new_bfd)
bf102f86
AM
11807 {
11808 htab->toc_bfd = isec->owner;
11809 htab->toc_first_sec = isec;
11810 }
927be08e 11811
bf102f86
AM
11812 addr = isec->output_offset + isec->output_section->vma;
11813 off = addr - htab->toc_curr;
d77c8a4b
AM
11814 limit = 0x80008000;
11815 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
11816 limit = 0x10000;
11817 if (off + isec->size > limit)
bf102f86
AM
11818 {
11819 addr = (htab->toc_first_sec->output_offset
11820 + htab->toc_first_sec->output_section->vma);
11821 htab->toc_curr = addr;
a27e685f 11822 htab->toc_curr &= -TOC_BASE_ALIGN;
bf102f86 11823 }
99877b66 11824
927be08e
AM
11825 /* toc_curr is the base address of this toc group. Set elf_gp
11826 for the input section to be the offset relative to the
11827 output toc base plus 0x8000. Making the input elf_gp an
11828 offset allows us to move the toc as a whole without
11829 recalculating input elf_gp. */
06bcf541 11830 off = htab->toc_curr - elf_gp (info->output_bfd);
927be08e
AM
11831 off += TOC_BASE_OFF;
11832
11833 /* Die if someone uses a linker script that doesn't keep input
11834 file .toc and .got together. */
a4fd3de5
AM
11835 if (new_bfd
11836 && elf_gp (isec->owner) != 0
927be08e
AM
11837 && elf_gp (isec->owner) != off)
11838 return FALSE;
11839
11840 elf_gp (isec->owner) = off;
11841 return TRUE;
4c52953f 11842 }
927be08e
AM
11843
11844 /* During the second pass toc_first_sec points to the start of
11845 a toc group, and toc_curr is used to track the old elf_gp.
11846 We use toc_bfd to ensure we only look at each bfd once. */
11847 if (htab->toc_bfd == isec->owner)
11848 return TRUE;
11849 htab->toc_bfd = isec->owner;
11850
11851 if (htab->toc_first_sec == NULL
11852 || htab->toc_curr != elf_gp (isec->owner))
11853 {
11854 htab->toc_curr = elf_gp (isec->owner);
11855 htab->toc_first_sec = isec;
11856 }
11857 addr = (htab->toc_first_sec->output_offset
11858 + htab->toc_first_sec->output_section->vma);
06bcf541 11859 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
927be08e
AM
11860 elf_gp (isec->owner) = off;
11861
11862 return TRUE;
ad8e1ba5
AM
11863}
11864
927be08e
AM
11865/* Called via elf_link_hash_traverse to merge GOT entries for global
11866 symbol H. */
11867
11868static bfd_boolean
11869merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11870{
11871 if (h->root.type == bfd_link_hash_indirect)
11872 return TRUE;
11873
927be08e
AM
11874 merge_got_entries (&h->got.glist);
11875
11876 return TRUE;
11877}
11878
11879/* Called via elf_link_hash_traverse to allocate GOT entries for global
11880 symbol H. */
11881
11882static bfd_boolean
11883reallocate_got (struct elf_link_hash_entry *h, void *inf)
11884{
11885 struct got_entry *gent;
11886
11887 if (h->root.type == bfd_link_hash_indirect)
11888 return TRUE;
11889
927be08e
AM
11890 for (gent = h->got.glist; gent != NULL; gent = gent->next)
11891 if (!gent->is_indirect)
11892 allocate_got (h, (struct bfd_link_info *) inf, gent);
11893 return TRUE;
11894}
11895
11896/* Called on the first multitoc pass after the last call to
11897 ppc64_elf_next_toc_section. This function removes duplicate GOT
11898 entries. */
11899
11900bfd_boolean
11901ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
11902{
11903 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
11904 struct bfd *ibfd, *ibfd2;
11905 bfd_boolean done_something;
11906
11907 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 11908
7865406b
AM
11909 if (!htab->do_multi_toc)
11910 return FALSE;
11911
d0fae19d 11912 /* Merge global sym got entries within a toc group. */
927be08e
AM
11913 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
11914
11915 /* And tlsld_got. */
c72f2fb2 11916 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11917 {
11918 struct got_entry *ent, *ent2;
11919
11920 if (!is_ppc64_elf (ibfd))
11921 continue;
11922
11923 ent = ppc64_tlsld_got (ibfd);
11924 if (!ent->is_indirect
11925 && ent->got.offset != (bfd_vma) -1)
11926 {
c72f2fb2 11927 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
11928 {
11929 if (!is_ppc64_elf (ibfd2))
11930 continue;
11931
11932 ent2 = ppc64_tlsld_got (ibfd2);
11933 if (!ent2->is_indirect
11934 && ent2->got.offset != (bfd_vma) -1
11935 && elf_gp (ibfd2) == elf_gp (ibfd))
11936 {
11937 ent2->is_indirect = TRUE;
11938 ent2->got.ent = ent;
11939 }
11940 }
11941 }
11942 }
11943
11944 /* Zap sizes of got sections. */
33e44f2e
AM
11945 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
11946 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
11947 htab->got_reli_size = 0;
11948
c72f2fb2 11949 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11950 {
11951 asection *got, *relgot;
11952
11953 if (!is_ppc64_elf (ibfd))
11954 continue;
11955
11956 got = ppc64_elf_tdata (ibfd)->got;
11957 if (got != NULL)
11958 {
11959 got->rawsize = got->size;
11960 got->size = 0;
11961 relgot = ppc64_elf_tdata (ibfd)->relgot;
11962 relgot->rawsize = relgot->size;
11963 relgot->size = 0;
11964 }
11965 }
11966
11967 /* Now reallocate the got, local syms first. We don't need to
11968 allocate section contents again since we never increase size. */
c72f2fb2 11969 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11970 {
11971 struct got_entry **lgot_ents;
11972 struct got_entry **end_lgot_ents;
11973 struct plt_entry **local_plt;
11974 struct plt_entry **end_local_plt;
f961d9dd 11975 unsigned char *lgot_masks;
927be08e
AM
11976 bfd_size_type locsymcount;
11977 Elf_Internal_Shdr *symtab_hdr;
19e08130 11978 asection *s;
927be08e
AM
11979
11980 if (!is_ppc64_elf (ibfd))
11981 continue;
11982
11983 lgot_ents = elf_local_got_ents (ibfd);
11984 if (!lgot_ents)
11985 continue;
11986
11987 symtab_hdr = &elf_symtab_hdr (ibfd);
11988 locsymcount = symtab_hdr->sh_info;
11989 end_lgot_ents = lgot_ents + locsymcount;
11990 local_plt = (struct plt_entry **) end_lgot_ents;
11991 end_local_plt = local_plt + locsymcount;
f961d9dd 11992 lgot_masks = (unsigned char *) end_local_plt;
927be08e 11993 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
11994 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11995 {
11996 struct got_entry *ent;
11997
11998 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 11999 {
19e08130
AM
12000 unsigned int ent_size = 8;
12001 unsigned int rel_size = sizeof (Elf64_External_Rela);
12002
d0fae19d
AM
12003 ent->got.offset = s->size;
12004 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 12005 {
19e08130
AM
12006 ent_size *= 2;
12007 rel_size *= 2;
12008 }
12009 s->size += ent_size;
37da22e5 12010 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 12011 {
33e44f2e 12012 htab->elf.irelplt->size += rel_size;
19e08130
AM
12013 htab->got_reli_size += rel_size;
12014 }
6a3858a6
AM
12015 else if (bfd_link_pic (info)
12016 && !((ent->tls_type & TLS_TPREL) != 0
12017 && bfd_link_executable (info)))
19e08130
AM
12018 {
12019 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12020 srel->size += rel_size;
d0fae19d
AM
12021 }
12022 }
927be08e
AM
12023 }
12024 }
12025
12026 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
12027
c72f2fb2 12028 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12029 {
12030 struct got_entry *ent;
12031
12032 if (!is_ppc64_elf (ibfd))
12033 continue;
12034
12035 ent = ppc64_tlsld_got (ibfd);
12036 if (!ent->is_indirect
12037 && ent->got.offset != (bfd_vma) -1)
12038 {
12039 asection *s = ppc64_elf_tdata (ibfd)->got;
12040 ent->got.offset = s->size;
12041 s->size += 16;
0e1862bb 12042 if (bfd_link_pic (info))
927be08e
AM
12043 {
12044 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12045 srel->size += sizeof (Elf64_External_Rela);
12046 }
12047 }
12048 }
12049
33e44f2e 12050 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 12051 if (!done_something)
c72f2fb2 12052 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12053 {
12054 asection *got;
12055
12056 if (!is_ppc64_elf (ibfd))
12057 continue;
12058
12059 got = ppc64_elf_tdata (ibfd)->got;
12060 if (got != NULL)
12061 {
12062 done_something = got->rawsize != got->size;
12063 if (done_something)
12064 break;
12065 }
12066 }
12067
12068 if (done_something)
e7d1c40c 12069 (*htab->params->layout_sections_again) ();
927be08e
AM
12070
12071 /* Set up for second pass over toc sections to recalculate elf_gp
12072 on input sections. */
12073 htab->toc_bfd = NULL;
12074 htab->toc_first_sec = NULL;
12075 htab->second_toc_pass = TRUE;
12076 return done_something;
12077}
12078
12079/* Called after second pass of multitoc partitioning. */
12080
12081void
12082ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
12083{
12084 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12085
12086 /* After the second pass, toc_curr tracks the TOC offset used
12087 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 12088 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
12089}
12090
9b5ecbd0
AM
12091/* No toc references were found in ISEC. If the code in ISEC makes no
12092 calls, then there's no need to use toc adjusting stubs when branching
12093 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
12094 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
12095 needed, and 2 if a cyclical call-graph was found but no other reason
12096 for a stub was detected. If called from the top level, a return of
12097 2 means the same as a return of 0. */
9b5ecbd0
AM
12098
12099static int
4ce794b7 12100toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 12101{
9b5ecbd0 12102 int ret;
70cc837d
AM
12103
12104 /* Mark this section as checked. */
12105 isec->call_check_done = 1;
9b5ecbd0 12106
772119ce
AM
12107 /* We know none of our code bearing sections will need toc stubs. */
12108 if ((isec->flags & SEC_LINKER_CREATED) != 0)
12109 return 0;
12110
eea6121a 12111 if (isec->size == 0)
082c50f8
AM
12112 return 0;
12113
4c52953f
AM
12114 if (isec->output_section == NULL)
12115 return 0;
12116
4c52953f 12117 ret = 0;
70cc837d 12118 if (isec->reloc_count != 0)
9b5ecbd0 12119 {
70cc837d
AM
12120 Elf_Internal_Rela *relstart, *rel;
12121 Elf_Internal_Sym *local_syms;
12122 struct ppc_link_hash_table *htab;
2917689a 12123
70cc837d
AM
12124 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
12125 info->keep_memory);
12126 if (relstart == NULL)
12127 return -1;
90aecf7a 12128
70cc837d
AM
12129 /* Look for branches to outside of this section. */
12130 local_syms = NULL;
12131 htab = ppc_hash_table (info);
12132 if (htab == NULL)
12133 return -1;
4c52953f 12134
70cc837d 12135 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 12136 {
70cc837d
AM
12137 enum elf_ppc64_reloc_type r_type;
12138 unsigned long r_symndx;
12139 struct elf_link_hash_entry *h;
12140 struct ppc_link_hash_entry *eh;
12141 Elf_Internal_Sym *sym;
12142 asection *sym_sec;
12143 struct _opd_sec_data *opd;
12144 bfd_vma sym_value;
12145 bfd_vma dest;
12146
12147 r_type = ELF64_R_TYPE (rel->r_info);
12148 if (r_type != R_PPC64_REL24
12149 && r_type != R_PPC64_REL14
12150 && r_type != R_PPC64_REL14_BRTAKEN
23cedd1d
AM
12151 && r_type != R_PPC64_REL14_BRNTAKEN
12152 && r_type != R_PPC64_PLTCALL)
70cc837d 12153 continue;
4c52953f 12154
70cc837d
AM
12155 r_symndx = ELF64_R_SYM (rel->r_info);
12156 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
12157 isec->owner))
4c52953f 12158 {
70cc837d
AM
12159 ret = -1;
12160 break;
12161 }
4c52953f 12162
70cc837d
AM
12163 /* Calls to dynamic lib functions go through a plt call stub
12164 that uses r2. */
12165 eh = (struct ppc_link_hash_entry *) h;
12166 if (eh != NULL
12167 && (eh->elf.plt.plist != NULL
12168 || (eh->oh != NULL
12169 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
12170 {
12171 ret = 1;
12172 break;
4c52953f
AM
12173 }
12174
70cc837d
AM
12175 if (sym_sec == NULL)
12176 /* Ignore other undefined symbols. */
4c52953f 12177 continue;
4c52953f 12178
70cc837d
AM
12179 /* Assume branches to other sections not included in the
12180 link need stubs too, to cover -R and absolute syms. */
12181 if (sym_sec->output_section == NULL)
12182 {
12183 ret = 1;
12184 break;
12185 }
4c52953f 12186
70cc837d
AM
12187 if (h == NULL)
12188 sym_value = sym->st_value;
12189 else
12190 {
12191 if (h->root.type != bfd_link_hash_defined
12192 && h->root.type != bfd_link_hash_defweak)
12193 abort ();
12194 sym_value = h->root.u.def.value;
12195 }
12196 sym_value += rel->r_addend;
4c52953f 12197
70cc837d
AM
12198 /* If this branch reloc uses an opd sym, find the code section. */
12199 opd = get_opd_info (sym_sec);
12200 if (opd != NULL)
12201 {
12202 if (h == NULL && opd->adjust != NULL)
12203 {
12204 long adjust;
4c52953f 12205
92a9c616 12206 adjust = opd->adjust[OPD_NDX (sym_value)];
70cc837d
AM
12207 if (adjust == -1)
12208 /* Assume deleted functions won't ever be called. */
12209 continue;
12210 sym_value += adjust;
12211 }
4c52953f 12212
aef36ac1
AM
12213 dest = opd_entry_value (sym_sec, sym_value,
12214 &sym_sec, NULL, FALSE);
70cc837d
AM
12215 if (dest == (bfd_vma) -1)
12216 continue;
12217 }
12218 else
12219 dest = (sym_value
12220 + sym_sec->output_offset
12221 + sym_sec->output_section->vma);
4c52953f 12222
70cc837d
AM
12223 /* Ignore branch to self. */
12224 if (sym_sec == isec)
12225 continue;
4c52953f 12226
70cc837d
AM
12227 /* If the called function uses the toc, we need a stub. */
12228 if (sym_sec->has_toc_reloc
12229 || sym_sec->makes_toc_func_call)
4c52953f 12230 {
70cc837d 12231 ret = 1;
4c52953f
AM
12232 break;
12233 }
70cc837d
AM
12234
12235 /* Assume any branch that needs a long branch stub might in fact
12236 need a plt_branch stub. A plt_branch stub uses r2. */
12237 else if (dest - (isec->output_offset
12238 + isec->output_section->vma
6911b7dc
AM
12239 + rel->r_offset) + (1 << 25)
12240 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
12241 ? h->other
12242 : sym->st_other))
4c52953f 12243 {
70cc837d
AM
12244 ret = 1;
12245 break;
12246 }
12247
12248 /* If calling back to a section in the process of being
12249 tested, we can't say for sure that no toc adjusting stubs
12250 are needed, so don't return zero. */
12251 else if (sym_sec->call_check_in_progress)
12252 ret = 2;
12253
12254 /* Branches to another section that itself doesn't have any TOC
12255 references are OK. Recursively call ourselves to check. */
12256 else if (!sym_sec->call_check_done)
12257 {
12258 int recur;
12259
12260 /* Mark current section as indeterminate, so that other
12261 sections that call back to current won't be marked as
12262 known. */
12263 isec->call_check_in_progress = 1;
12264 recur = toc_adjusting_stub_needed (info, sym_sec);
12265 isec->call_check_in_progress = 0;
12266
4c52953f
AM
12267 if (recur != 0)
12268 {
70cc837d
AM
12269 ret = recur;
12270 if (recur != 2)
12271 break;
4c52953f
AM
12272 }
12273 }
4c52953f 12274 }
70cc837d
AM
12275
12276 if (local_syms != NULL
12277 && (elf_symtab_hdr (isec->owner).contents
12278 != (unsigned char *) local_syms))
12279 free (local_syms);
12280 if (elf_section_data (isec)->relocs != relstart)
12281 free (relstart);
9b5ecbd0
AM
12282 }
12283
70cc837d
AM
12284 if ((ret & 1) == 0
12285 && isec->map_head.s != NULL
12286 && (strcmp (isec->output_section->name, ".init") == 0
12287 || strcmp (isec->output_section->name, ".fini") == 0))
12288 {
12289 if (isec->map_head.s->has_toc_reloc
12290 || isec->map_head.s->makes_toc_func_call)
12291 ret = 1;
12292 else if (!isec->map_head.s->call_check_done)
12293 {
12294 int recur;
12295 isec->call_check_in_progress = 1;
12296 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
12297 isec->call_check_in_progress = 0;
12298 if (recur != 0)
12299 ret = recur;
12300 }
12301 }
12302
12303 if (ret == 1)
12304 isec->makes_toc_func_call = 1;
4c52953f 12305
9b5ecbd0
AM
12306 return ret;
12307}
12308
721956f4
AM
12309/* The linker repeatedly calls this function for each input section,
12310 in the order that input sections are linked into output sections.
12311 Build lists of input sections to determine groupings between which
12312 we may insert linker stubs. */
12313
9b5ecbd0 12314bfd_boolean
4ce794b7 12315ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
12316{
12317 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12318
4dfe6ac6
NC
12319 if (htab == NULL)
12320 return FALSE;
12321
734b6cf9 12322 if ((isec->output_section->flags & SEC_CODE) != 0
6f20ed8a 12323 && isec->output_section->id < htab->sec_info_arr_size)
721956f4 12324 {
3d6f9012
AM
12325 /* This happens to make the list in reverse order,
12326 which is what we want. */
6f20ed8a
AM
12327 htab->sec_info[isec->id].u.list
12328 = htab->sec_info[isec->output_section->id].u.list;
12329 htab->sec_info[isec->output_section->id].u.list = isec;
721956f4 12330 }
ad8e1ba5 12331
4c52953f 12332 if (htab->multi_toc_needed)
9b5ecbd0 12333 {
8b974ba3
AM
12334 /* Analyse sections that aren't already flagged as needing a
12335 valid toc pointer. Exclude .fixup for the linux kernel.
12336 .fixup contains branches, but only back to the function that
12337 hit an exception. */
12338 if (!(isec->has_toc_reloc
12339 || (isec->flags & SEC_CODE) == 0
12340 || strcmp (isec->name, ".fixup") == 0
12341 || isec->call_check_done))
12342 {
12343 if (toc_adjusting_stub_needed (info, isec) < 0)
6683a28d 12344 return FALSE;
8b974ba3
AM
12345 }
12346 /* Make all sections use the TOC assigned for this object file.
12347 This will be wrong for pasted sections; We fix that in
12348 check_pasted_section(). */
12349 if (elf_gp (isec->owner) != 0)
12350 htab->toc_curr = elf_gp (isec->owner);
12351 }
12352
6f20ed8a 12353 htab->sec_info[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 12354 return TRUE;
721956f4
AM
12355}
12356
70cc837d
AM
12357/* Check that all .init and .fini sections use the same toc, if they
12358 have toc relocs. */
12359
12360static bfd_boolean
12361check_pasted_section (struct bfd_link_info *info, const char *name)
12362{
12363 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12364
12365 if (o != NULL)
12366 {
12367 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12368 bfd_vma toc_off = 0;
12369 asection *i;
12370
12371 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12372 if (i->has_toc_reloc)
12373 {
12374 if (toc_off == 0)
6f20ed8a
AM
12375 toc_off = htab->sec_info[i->id].toc_off;
12376 else if (toc_off != htab->sec_info[i->id].toc_off)
70cc837d
AM
12377 return FALSE;
12378 }
6683a28d
AM
12379
12380 if (toc_off == 0)
12381 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12382 if (i->makes_toc_func_call)
12383 {
6f20ed8a 12384 toc_off = htab->sec_info[i->id].toc_off;
6683a28d
AM
12385 break;
12386 }
12387
70cc837d
AM
12388 /* Make sure the whole pasted function uses the same toc offset. */
12389 if (toc_off != 0)
12390 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
6f20ed8a 12391 htab->sec_info[i->id].toc_off = toc_off;
70cc837d
AM
12392 }
12393 return TRUE;
12394}
12395
12396bfd_boolean
12397ppc64_elf_check_init_fini (struct bfd_link_info *info)
12398{
12399 return (check_pasted_section (info, ".init")
12400 & check_pasted_section (info, ".fini"));
12401}
12402
721956f4
AM
12403/* See whether we can group stub sections together. Grouping stub
12404 sections may result in fewer stubs. More importantly, we need to
12405 put all .init* and .fini* stubs at the beginning of the .init or
12406 .fini output sections respectively, because glibc splits the
12407 _init and _fini functions into multiple parts. Putting a stub in
12408 the middle of a function is not a good idea. */
12409
6f20ed8a
AM
12410static bfd_boolean
12411group_sections (struct bfd_link_info *info,
4ce794b7
AM
12412 bfd_size_type stub_group_size,
12413 bfd_boolean stubs_always_before_branch)
721956f4 12414{
6f20ed8a
AM
12415 struct ppc_link_hash_table *htab;
12416 asection *osec;
7c8fe5c4
AM
12417 bfd_boolean suppress_size_errors;
12418
6f20ed8a
AM
12419 htab = ppc_hash_table (info);
12420 if (htab == NULL)
12421 return FALSE;
12422
7c8fe5c4 12423 suppress_size_errors = FALSE;
7c8fe5c4
AM
12424 if (stub_group_size == 1)
12425 {
12426 /* Default values. */
12427 if (stubs_always_before_branch)
09f92717 12428 stub_group_size = 0x1e00000;
7c8fe5c4 12429 else
09f92717 12430 stub_group_size = 0x1c00000;
7c8fe5c4
AM
12431 suppress_size_errors = TRUE;
12432 }
12433
6f20ed8a 12434 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
721956f4 12435 {
6f20ed8a
AM
12436 asection *tail;
12437
12438 if (osec->id >= htab->sec_info_arr_size)
12439 continue;
12440
12441 tail = htab->sec_info[osec->id].u.list;
734b6cf9 12442 while (tail != NULL)
721956f4 12443 {
734b6cf9
AM
12444 asection *curr;
12445 asection *prev;
12446 bfd_size_type total;
12447 bfd_boolean big_sec;
12448 bfd_vma curr_toc;
6f20ed8a 12449 struct map_stub *group;
09f92717 12450 bfd_size_type group_size;
734b6cf9
AM
12451
12452 curr = tail;
eea6121a 12453 total = tail->size;
09f92717
AM
12454 group_size = (ppc64_elf_section_data (tail) != NULL
12455 && ppc64_elf_section_data (tail)->has_14bit_branch
12456 ? stub_group_size >> 10 : stub_group_size);
12457
12458 big_sec = total > group_size;
7c8fe5c4 12459 if (big_sec && !suppress_size_errors)
695344c0 12460 /* xgettext:c-format */
871b3ab2 12461 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
4eca0228 12462 tail->owner, tail);
6f20ed8a 12463 curr_toc = htab->sec_info[tail->id].toc_off;
734b6cf9 12464
6f20ed8a 12465 while ((prev = htab->sec_info[curr->id].u.list) != NULL
734b6cf9 12466 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
12467 < (ppc64_elf_section_data (prev) != NULL
12468 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12469 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12470 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12471 curr = prev;
12472
12473 /* OK, the size from the start of CURR to the end is less
09f92717 12474 than group_size and thus can be handled by one stub
734b6cf9 12475 section. (or the tail section is itself larger than
09f92717
AM
12476 group_size, in which case we may be toast.) We should
12477 really be keeping track of the total size of stubs added
12478 here, as stubs contribute to the final output section
12479 size. That's a little tricky, and this way will only
12480 break if stubs added make the total size more than 2^25,
12481 ie. for the default stub_group_size, if stubs total more
12482 than 2097152 bytes, or nearly 75000 plt call stubs. */
6f20ed8a
AM
12483 group = bfd_alloc (curr->owner, sizeof (*group));
12484 if (group == NULL)
12485 return FALSE;
12486 group->link_sec = curr;
12487 group->stub_sec = NULL;
a4b6fadd 12488 group->needs_save_res = 0;
d4aaa2a0 12489 group->tls_get_addr_opt_bctrl = -1u;
a4b6fadd
AM
12490 group->next = htab->group;
12491 htab->group = group;
734b6cf9 12492 do
721956f4 12493 {
6f20ed8a 12494 prev = htab->sec_info[tail->id].u.list;
734b6cf9 12495 /* Set up this stub group. */
6f20ed8a 12496 htab->sec_info[tail->id].u.group = group;
721956f4 12497 }
734b6cf9
AM
12498 while (tail != curr && (tail = prev) != NULL);
12499
09f92717 12500 /* But wait, there's more! Input sections up to group_size
734b6cf9
AM
12501 bytes before the stub section can be handled by it too.
12502 Don't do this if we have a really large section after the
12503 stubs, as adding more stubs increases the chance that
12504 branches may not reach into the stub section. */
12505 if (!stubs_always_before_branch && !big_sec)
12506 {
12507 total = 0;
12508 while (prev != NULL
12509 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
12510 < (ppc64_elf_section_data (prev) != NULL
12511 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12512 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12513 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12514 {
12515 tail = prev;
6f20ed8a
AM
12516 prev = htab->sec_info[tail->id].u.list;
12517 htab->sec_info[tail->id].u.group = group;
734b6cf9
AM
12518 }
12519 }
12520 tail = prev;
721956f4
AM
12521 }
12522 }
6f20ed8a 12523 return TRUE;
721956f4
AM
12524}
12525
58d180e8
AM
12526static const unsigned char glink_eh_frame_cie[] =
12527{
12528 0, 0, 0, 16, /* length. */
12529 0, 0, 0, 0, /* id. */
12530 1, /* CIE version. */
12531 'z', 'R', 0, /* Augmentation string. */
12532 4, /* Code alignment. */
12533 0x78, /* Data alignment. */
12534 65, /* RA reg. */
12535 1, /* Augmentation size. */
12536 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
2e0ce1c8 12537 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
58d180e8
AM
12538};
12539
d4aaa2a0
AM
12540static size_t
12541stub_eh_frame_size (struct map_stub *group, size_t align)
12542{
12543 size_t this_size = 17;
12544 if (group->tls_get_addr_opt_bctrl != -1u)
12545 {
12546 unsigned int to_bctrl = group->tls_get_addr_opt_bctrl / 4;
12547 if (to_bctrl < 64)
12548 this_size += 1;
12549 else if (to_bctrl < 256)
12550 this_size += 2;
12551 else if (to_bctrl < 65536)
12552 this_size += 3;
12553 else
12554 this_size += 5;
12555 this_size += 6;
12556 }
12557 this_size = (this_size + align - 1) & -align;
12558 return this_size;
12559}
12560
d969d15f
AM
12561/* Stripping output sections is normally done before dynamic section
12562 symbols have been allocated. This function is called later, and
12563 handles cases like htab->brlt which is mapped to its own output
12564 section. */
12565
12566static void
12567maybe_strip_output (struct bfd_link_info *info, asection *isec)
12568{
12569 if (isec->size == 0
12570 && isec->output_section->size == 0
53d8967a 12571 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
12572 && !bfd_section_removed_from_list (info->output_bfd,
12573 isec->output_section)
12574 && elf_section_data (isec->output_section)->dynindx == 0)
12575 {
12576 isec->output_section->flags |= SEC_EXCLUDE;
12577 bfd_section_list_remove (info->output_bfd, isec->output_section);
12578 info->output_bfd->section_count--;
12579 }
12580}
12581
721956f4
AM
12582/* Determine and set the size of the stub section for a final link.
12583
12584 The basic idea here is to examine all the relocations looking for
12585 PC-relative calls to a target that is unreachable with a "bl"
12586 instruction. */
12587
b34976b6 12588bfd_boolean
e7d1c40c 12589ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
12590{
12591 bfd_size_type stub_group_size;
b34976b6 12592 bfd_boolean stubs_always_before_branch;
721956f4
AM
12593 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12594
4dfe6ac6
NC
12595 if (htab == NULL)
12596 return FALSE;
12597
0e1862bb 12598 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
e7d1c40c 12599 htab->params->plt_thread_safe = 1;
b9e5796b 12600 if (!htab->opd_abi)
e7d1c40c
AM
12601 htab->params->plt_thread_safe = 0;
12602 else if (htab->params->plt_thread_safe == -1)
794e51c0 12603 {
e2458743 12604 static const char *const thread_starter[] =
794e51c0
AM
12605 {
12606 "pthread_create",
12607 /* libstdc++ */
12608 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12609 /* librt */
12610 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12611 "mq_notify", "create_timer",
12612 /* libanl */
12613 "getaddrinfo_a",
12614 /* libgomp */
2300b5a1 12615 "GOMP_parallel",
794e51c0 12616 "GOMP_parallel_start",
2300b5a1 12617 "GOMP_parallel_loop_static",
794e51c0 12618 "GOMP_parallel_loop_static_start",
2300b5a1 12619 "GOMP_parallel_loop_dynamic",
794e51c0 12620 "GOMP_parallel_loop_dynamic_start",
2300b5a1 12621 "GOMP_parallel_loop_guided",
794e51c0 12622 "GOMP_parallel_loop_guided_start",
2300b5a1 12623 "GOMP_parallel_loop_runtime",
794e51c0 12624 "GOMP_parallel_loop_runtime_start",
2300b5a1 12625 "GOMP_parallel_sections",
68ffbac6 12626 "GOMP_parallel_sections_start",
f9dffbf0
AM
12627 /* libgo */
12628 "__go_go",
794e51c0
AM
12629 };
12630 unsigned i;
12631
a4b6fadd 12632 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
794e51c0
AM
12633 {
12634 struct elf_link_hash_entry *h;
12635 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12636 FALSE, FALSE, TRUE);
e7d1c40c
AM
12637 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12638 if (htab->params->plt_thread_safe)
794e51c0
AM
12639 break;
12640 }
12641 }
e7d1c40c
AM
12642 stubs_always_before_branch = htab->params->group_size < 0;
12643 if (htab->params->group_size < 0)
12644 stub_group_size = -htab->params->group_size;
721956f4 12645 else
e7d1c40c 12646 stub_group_size = htab->params->group_size;
721956f4 12647
6f20ed8a
AM
12648 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12649 return FALSE;
721956f4 12650
c9301e31
AM
12651#define STUB_SHRINK_ITER 20
12652 /* Loop until no stubs added. After iteration 20 of this loop we may
12653 exit on a stub section shrinking. This is to break out of a
12654 pathological case where adding stubs on one iteration decreases
12655 section gaps (perhaps due to alignment), which then requires
12656 fewer or smaller stubs on the next iteration. */
12657
721956f4
AM
12658 while (1)
12659 {
12660 bfd *input_bfd;
12661 unsigned int bfd_indx;
a4b6fadd 12662 struct map_stub *group;
721956f4
AM
12663
12664 htab->stub_iteration += 1;
721956f4
AM
12665
12666 for (input_bfd = info->input_bfds, bfd_indx = 0;
12667 input_bfd != NULL;
c72f2fb2 12668 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
12669 {
12670 Elf_Internal_Shdr *symtab_hdr;
12671 asection *section;
6cdc0ccc 12672 Elf_Internal_Sym *local_syms = NULL;
721956f4 12673
0c8d6e5c 12674 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
12675 continue;
12676
721956f4 12677 /* We'll need the symbol table in a second. */
0ffa91dd 12678 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
12679 if (symtab_hdr->sh_info == 0)
12680 continue;
12681
721956f4
AM
12682 /* Walk over each section attached to the input bfd. */
12683 for (section = input_bfd->sections;
12684 section != NULL;
12685 section = section->next)
12686 {
721956f4 12687 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
12688
12689 /* If there aren't any relocs, then there's nothing more
12690 to do. */
12691 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
12692 || (section->flags & SEC_ALLOC) == 0
12693 || (section->flags & SEC_LOAD) == 0
12694 || (section->flags & SEC_CODE) == 0
721956f4
AM
12695 || section->reloc_count == 0)
12696 continue;
12697
12698 /* If this section is a link-once section that will be
12699 discarded, then don't create any stubs. */
12700 if (section->output_section == NULL
927be08e 12701 || section->output_section->owner != info->output_bfd)
721956f4
AM
12702 continue;
12703
1e2f5b6e
AM
12704 /* Get the relocs. */
12705 internal_relocs
4ce794b7 12706 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 12707 info->keep_memory);
721956f4 12708 if (internal_relocs == NULL)
1e2f5b6e 12709 goto error_ret_free_local;
721956f4
AM
12710
12711 /* Now examine each relocation. */
12712 irela = internal_relocs;
12713 irelaend = irela + section->reloc_count;
12714 for (; irela < irelaend; irela++)
12715 {
4ce794b7
AM
12716 enum elf_ppc64_reloc_type r_type;
12717 unsigned int r_indx;
721956f4
AM
12718 enum ppc_stub_type stub_type;
12719 struct ppc_stub_hash_entry *stub_entry;
8387904d 12720 asection *sym_sec, *code_sec;
e054468f 12721 bfd_vma sym_value, code_value;
721956f4 12722 bfd_vma destination;
6911b7dc 12723 unsigned long local_off;
8843416a 12724 bfd_boolean ok_dest;
721956f4 12725 struct ppc_link_hash_entry *hash;
8387904d 12726 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
12727 struct elf_link_hash_entry *h;
12728 Elf_Internal_Sym *sym;
721956f4
AM
12729 char *stub_name;
12730 const asection *id_sec;
74f0fb50 12731 struct _opd_sec_data *opd;
e054468f 12732 struct plt_entry *plt_ent;
721956f4
AM
12733
12734 r_type = ELF64_R_TYPE (irela->r_info);
12735 r_indx = ELF64_R_SYM (irela->r_info);
12736
4ce794b7 12737 if (r_type >= R_PPC64_max)
721956f4
AM
12738 {
12739 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 12740 goto error_ret_free_internal;
721956f4
AM
12741 }
12742
12743 /* Only look for stubs on branch instructions. */
4ce794b7
AM
12744 if (r_type != R_PPC64_REL24
12745 && r_type != R_PPC64_REL14
12746 && r_type != R_PPC64_REL14_BRTAKEN
12747 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
12748 continue;
12749
12750 /* Now determine the call target, its name, value,
12751 section. */
411e1bfb
AM
12752 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12753 r_indx, input_bfd))
12754 goto error_ret_free_internal;
12755 hash = (struct ppc_link_hash_entry *) h;
12756
8843416a 12757 ok_dest = FALSE;
8387904d 12758 fdh = NULL;
7fe2b9a6 12759 sym_value = 0;
411e1bfb 12760 if (hash == NULL)
721956f4 12761 {
411e1bfb 12762 sym_value = sym->st_value;
c27b8c2a
AM
12763 if (sym_sec != NULL
12764 && sym_sec->output_section != NULL)
12765 ok_dest = TRUE;
721956f4 12766 }
7fe2b9a6
AM
12767 else if (hash->elf.root.type == bfd_link_hash_defined
12768 || hash->elf.root.type == bfd_link_hash_defweak)
12769 {
12770 sym_value = hash->elf.root.u.def.value;
12771 if (sym_sec->output_section != NULL)
12772 ok_dest = TRUE;
12773 }
12774 else if (hash->elf.root.type == bfd_link_hash_undefweak
12775 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 12776 {
99877b66 12777 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
12778 use the func descriptor sym instead if it is
12779 defined. */
ceb1f1ef 12780 if (hash->elf.root.root.string[0] == '.'
8c5b4e52 12781 && hash->oh != NULL)
8387904d 12782 {
8c5b4e52 12783 fdh = ppc_follow_link (hash->oh);
8387904d
AM
12784 if (fdh->elf.root.type == bfd_link_hash_defined
12785 || fdh->elf.root.type == bfd_link_hash_defweak)
12786 {
12787 sym_sec = fdh->elf.root.u.def.section;
12788 sym_value = fdh->elf.root.u.def.value;
12789 if (sym_sec->output_section != NULL)
12790 ok_dest = TRUE;
12791 }
99877b66
AM
12792 else
12793 fdh = NULL;
8387904d 12794 }
7fe2b9a6
AM
12795 }
12796 else
12797 {
12798 bfd_set_error (bfd_error_bad_value);
12799 goto error_ret_free_internal;
721956f4
AM
12800 }
12801
8843416a 12802 destination = 0;
6911b7dc 12803 local_off = 0;
8843416a
AM
12804 if (ok_dest)
12805 {
12806 sym_value += irela->r_addend;
12807 destination = (sym_value
12808 + sym_sec->output_offset
12809 + sym_sec->output_section->vma);
6911b7dc
AM
12810 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12811 ? hash->elf.other
12812 : sym->st_other);
8843416a
AM
12813 }
12814
8387904d 12815 code_sec = sym_sec;
e054468f 12816 code_value = sym_value;
74f0fb50
AM
12817 opd = get_opd_info (sym_sec);
12818 if (opd != NULL)
8387904d
AM
12819 {
12820 bfd_vma dest;
12821
74f0fb50 12822 if (hash == NULL && opd->adjust != NULL)
8387904d 12823 {
51aecdc5 12824 long adjust = opd->adjust[OPD_NDX (sym_value)];
8387904d
AM
12825 if (adjust == -1)
12826 continue;
e054468f 12827 code_value += adjust;
8387904d
AM
12828 sym_value += adjust;
12829 }
12830 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 12831 &code_sec, &code_value, FALSE);
8387904d
AM
12832 if (dest != (bfd_vma) -1)
12833 {
12834 destination = dest;
12835 if (fdh != NULL)
12836 {
12837 /* Fixup old ABI sym to point at code
12838 entry. */
99877b66 12839 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 12840 hash->elf.root.u.def.section = code_sec;
e054468f 12841 hash->elf.root.u.def.value = code_value;
8387904d
AM
12842 }
12843 }
12844 }
12845
721956f4 12846 /* Determine what (if any) linker stub is needed. */
e054468f 12847 plt_ent = NULL;
721956f4 12848 stub_type = ppc_type_of_stub (section, irela, &hash,
6911b7dc
AM
12849 &plt_ent, destination,
12850 local_off);
ad8e1ba5
AM
12851
12852 if (stub_type != ppc_stub_plt_call)
12853 {
12854 /* Check whether we need a TOC adjusting stub.
12855 Since the linker pastes together pieces from
12856 different object files when creating the
12857 _init and _fini functions, it may be that a
12858 call to what looks like a local sym is in
12859 fact a call needing a TOC adjustment. */
8387904d
AM
12860 if (code_sec != NULL
12861 && code_sec->output_section != NULL
6f20ed8a
AM
12862 && (htab->sec_info[code_sec->id].toc_off
12863 != htab->sec_info[section->id].toc_off)
4c52953f
AM
12864 && (code_sec->has_toc_reloc
12865 || code_sec->makes_toc_func_call))
ad8e1ba5
AM
12866 stub_type = ppc_stub_long_branch_r2off;
12867 }
12868
721956f4
AM
12869 if (stub_type == ppc_stub_none)
12870 continue;
12871
411e1bfb
AM
12872 /* __tls_get_addr calls might be eliminated. */
12873 if (stub_type != ppc_stub_plt_call
12874 && hash != NULL
8387904d
AM
12875 && (hash == htab->tls_get_addr
12876 || hash == htab->tls_get_addr_fd)
411e1bfb
AM
12877 && section->has_tls_reloc
12878 && irela != internal_relocs)
12879 {
12880 /* Get tls info. */
f961d9dd 12881 unsigned char *tls_mask;
411e1bfb 12882
3a71aa26 12883 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
12884 irela - 1, input_bfd))
12885 goto error_ret_free_internal;
37da22e5 12886 if ((*tls_mask & TLS_TLS) != 0)
411e1bfb
AM
12887 continue;
12888 }
12889
f378ab09 12890 if (stub_type == ppc_stub_plt_call)
794e51c0 12891 {
6e1816be
AM
12892 if (!htab->opd_abi
12893 && htab->params->plt_localentry0 != 0
12894 && is_elfv2_localentry0 (&hash->elf))
12895 htab->has_plt_localentry0 = 1;
12896 else if (irela + 1 < irelaend
12897 && irela[1].r_offset == irela->r_offset + 4
12898 && (ELF64_R_TYPE (irela[1].r_info)
12899 == R_PPC64_TOCSAVE))
f378ab09
AM
12900 {
12901 if (!tocsave_find (htab, INSERT,
12902 &local_syms, irela + 1, input_bfd))
12903 goto error_ret_free_internal;
12904 }
f378ab09
AM
12905 else
12906 stub_type = ppc_stub_plt_call_r2save;
794e51c0 12907 }
3b421ab3 12908
721956f4 12909 /* Support for grouping stub sections. */
6f20ed8a 12910 id_sec = htab->sec_info[section->id].u.group->link_sec;
721956f4
AM
12911
12912 /* Get the name of this stub. */
12913 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
12914 if (!stub_name)
12915 goto error_ret_free_internal;
12916
12917 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 12918 stub_name, FALSE, FALSE);
721956f4
AM
12919 if (stub_entry != NULL)
12920 {
12921 /* The proper stub has already been created. */
12922 free (stub_name);
794e51c0
AM
12923 if (stub_type == ppc_stub_plt_call_r2save)
12924 stub_entry->stub_type = stub_type;
721956f4
AM
12925 continue;
12926 }
12927
25f53a85 12928 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
12929 if (stub_entry == NULL)
12930 {
12931 free (stub_name);
6cdc0ccc
AM
12932 error_ret_free_internal:
12933 if (elf_section_data (section)->relocs == NULL)
12934 free (internal_relocs);
12935 error_ret_free_local:
12936 if (local_syms != NULL
12937 && (symtab_hdr->contents
12938 != (unsigned char *) local_syms))
12939 free (local_syms);
b34976b6 12940 return FALSE;
721956f4
AM
12941 }
12942
ad8e1ba5 12943 stub_entry->stub_type = stub_type;
794e51c0
AM
12944 if (stub_type != ppc_stub_plt_call
12945 && stub_type != ppc_stub_plt_call_r2save)
e054468f
AM
12946 {
12947 stub_entry->target_value = code_value;
12948 stub_entry->target_section = code_sec;
12949 }
12950 else
12951 {
12952 stub_entry->target_value = sym_value;
12953 stub_entry->target_section = sym_sec;
12954 }
721956f4 12955 stub_entry->h = hash;
e054468f 12956 stub_entry->plt_ent = plt_ent;
2d7ad24e
AM
12957 stub_entry->symtype
12958 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
6911b7dc 12959 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95
AM
12960
12961 if (stub_entry->h != NULL)
12962 htab->stub_globals += 1;
721956f4
AM
12963 }
12964
12965 /* We're done with the internal relocs, free them. */
6cdc0ccc 12966 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 12967 free (internal_relocs);
721956f4 12968 }
6cdc0ccc
AM
12969
12970 if (local_syms != NULL
12971 && symtab_hdr->contents != (unsigned char *) local_syms)
12972 {
12973 if (!info->keep_memory)
12974 free (local_syms);
12975 else
12976 symtab_hdr->contents = (unsigned char *) local_syms;
12977 }
721956f4
AM
12978 }
12979
5c3dead3 12980 /* We may have added some stubs. Find out the new size of the
721956f4 12981 stub sections. */
d4aaa2a0
AM
12982 for (group = htab->group; group != NULL; group = group->next)
12983 if (group->stub_sec != NULL)
ee75fd95 12984 {
d4aaa2a0
AM
12985 asection *stub_sec = group->stub_sec;
12986
ea3d7d1c
AM
12987 if (htab->stub_iteration <= STUB_SHRINK_ITER
12988 || stub_sec->rawsize < stub_sec->size)
12989 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
12990 stub_sec->rawsize = stub_sec->size;
ee75fd95
AM
12991 stub_sec->size = 0;
12992 stub_sec->reloc_count = 0;
84f5d08e 12993 stub_sec->flags &= ~SEC_RELOC;
ee75fd95 12994 }
eea6121a 12995
ba21f564
AM
12996 if (htab->stub_iteration <= STUB_SHRINK_ITER
12997 || htab->brlt->rawsize < htab->brlt->size)
12998 htab->brlt->rawsize = htab->brlt->size;
eea6121a 12999 htab->brlt->size = 0;
84f5d08e
AM
13000 htab->brlt->reloc_count = 0;
13001 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 13002 if (htab->relbrlt != NULL)
eea6121a 13003 htab->relbrlt->size = 0;
721956f4 13004
63bc6f6c 13005 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 13006
a4b6fadd
AM
13007 for (group = htab->group; group != NULL; group = group->next)
13008 if (group->needs_save_res)
13009 group->stub_sec->size += htab->sfpr->size;
13010
176a0d42
AM
13011 if (info->emitrelocations
13012 && htab->glink != NULL && htab->glink->size != 0)
13013 {
13014 htab->glink->reloc_count = 1;
13015 htab->glink->flags |= SEC_RELOC;
13016 }
13017
58d180e8
AM
13018 if (htab->glink_eh_frame != NULL
13019 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
2d0d44d5 13020 && htab->glink_eh_frame->output_section->size > 8)
58d180e8 13021 {
2e0ce1c8 13022 size_t size = 0, align = 4;
58d180e8 13023
d4aaa2a0
AM
13024 for (group = htab->group; group != NULL; group = group->next)
13025 if (group->stub_sec != NULL)
13026 size += stub_eh_frame_size (group, align);
58d180e8 13027 if (htab->glink != NULL && htab->glink->size != 0)
2e0ce1c8 13028 size += (24 + align - 1) & -align;
58d180e8 13029 if (size != 0)
2e0ce1c8
AM
13030 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
13031 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
13032 size = (size + align - 1) & -align;
58d180e8
AM
13033 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
13034 htab->glink_eh_frame->size = size;
13035 }
13036
e7d1c40c 13037 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13038 for (group = htab->group; group != NULL; group = group->next)
13039 if (group->stub_sec != NULL)
691d2e9a
AM
13040 {
13041 int align = abs (htab->params->plt_stub_align);
13042 group->stub_sec->size
13043 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
13044 }
d4aaa2a0
AM
13045
13046 for (group = htab->group; group != NULL; group = group->next)
13047 if (group->stub_sec != NULL
13048 && group->stub_sec->rawsize != group->stub_sec->size
c9301e31 13049 && (htab->stub_iteration <= STUB_SHRINK_ITER
d4aaa2a0 13050 || group->stub_sec->rawsize < group->stub_sec->size))
5c3dead3
AM
13051 break;
13052
d4aaa2a0 13053 if (group == NULL
ba21f564
AM
13054 && (htab->brlt->rawsize == htab->brlt->size
13055 || (htab->stub_iteration > STUB_SHRINK_ITER
13056 && htab->brlt->rawsize > htab->brlt->size))
58d180e8
AM
13057 && (htab->glink_eh_frame == NULL
13058 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
5c3dead3
AM
13059 break;
13060
721956f4 13061 /* Ask the linker to do its stuff. */
e7d1c40c 13062 (*htab->params->layout_sections_again) ();
721956f4
AM
13063 }
13064
da44f4e5
AM
13065 if (htab->glink_eh_frame != NULL
13066 && htab->glink_eh_frame->size != 0)
13067 {
13068 bfd_vma val;
13069 bfd_byte *p, *last_fde;
13070 size_t last_fde_len, size, align, pad;
d4aaa2a0 13071 struct map_stub *group;
da44f4e5
AM
13072
13073 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
13074 if (p == NULL)
13075 return FALSE;
13076 htab->glink_eh_frame->contents = p;
13077 last_fde = p;
2e0ce1c8 13078 align = 4;
da44f4e5
AM
13079
13080 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
13081 /* CIE length (rewrite in case little-endian). */
2e0ce1c8 13082 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
da44f4e5 13083 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
2e0ce1c8 13084 p += last_fde_len + 4;
da44f4e5 13085
d4aaa2a0
AM
13086 for (group = htab->group; group != NULL; group = group->next)
13087 if (group->stub_sec != NULL)
da44f4e5
AM
13088 {
13089 last_fde = p;
d4aaa2a0 13090 last_fde_len = stub_eh_frame_size (group, align) - 4;
da44f4e5 13091 /* FDE length. */
2e0ce1c8 13092 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13093 p += 4;
13094 /* CIE pointer. */
13095 val = p - htab->glink_eh_frame->contents;
13096 bfd_put_32 (htab->elf.dynobj, val, p);
13097 p += 4;
13098 /* Offset to stub section, written later. */
13099 p += 4;
13100 /* stub section size. */
d4aaa2a0 13101 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
da44f4e5
AM
13102 p += 4;
13103 /* Augmentation. */
13104 p += 1;
d4aaa2a0
AM
13105 if (group->tls_get_addr_opt_bctrl != -1u)
13106 {
13107 unsigned int to_bctrl = group->tls_get_addr_opt_bctrl / 4;
13108
13109 /* This FDE needs more than just the default.
13110 Describe __tls_get_addr_opt stub LR. */
13111 if (to_bctrl < 64)
13112 *p++ = DW_CFA_advance_loc + to_bctrl;
13113 else if (to_bctrl < 256)
13114 {
13115 *p++ = DW_CFA_advance_loc1;
13116 *p++ = to_bctrl;
13117 }
13118 else if (to_bctrl < 65536)
13119 {
13120 *p++ = DW_CFA_advance_loc2;
13121 bfd_put_16 (htab->elf.dynobj, to_bctrl, p);
13122 p += 2;
13123 }
13124 else
13125 {
13126 *p++ = DW_CFA_advance_loc4;
13127 bfd_put_32 (htab->elf.dynobj, to_bctrl, p);
13128 p += 4;
13129 }
13130 *p++ = DW_CFA_offset_extended_sf;
13131 *p++ = 65;
13132 *p++ = -(STK_LINKER (htab) / 8) & 0x7f;
13133 *p++ = DW_CFA_advance_loc + 4;
13134 *p++ = DW_CFA_restore_extended;
13135 *p++ = 65;
13136 }
da44f4e5 13137 /* Pad. */
d4aaa2a0 13138 p = last_fde + last_fde_len + 4;
da44f4e5
AM
13139 }
13140 if (htab->glink != NULL && htab->glink->size != 0)
13141 {
13142 last_fde = p;
2e0ce1c8 13143 last_fde_len = ((24 + align - 1) & -align) - 4;
da44f4e5 13144 /* FDE length. */
2e0ce1c8 13145 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13146 p += 4;
13147 /* CIE pointer. */
13148 val = p - htab->glink_eh_frame->contents;
13149 bfd_put_32 (htab->elf.dynobj, val, p);
13150 p += 4;
13151 /* Offset to .glink, written later. */
13152 p += 4;
13153 /* .glink size. */
13154 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
13155 p += 4;
13156 /* Augmentation. */
13157 p += 1;
13158
13159 *p++ = DW_CFA_advance_loc + 1;
13160 *p++ = DW_CFA_register;
13161 *p++ = 65;
9f08fa5c 13162 *p++ = htab->opd_abi ? 12 : 0;
15a3a14f 13163 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
da44f4e5
AM
13164 *p++ = DW_CFA_restore_extended;
13165 *p++ = 65;
2e0ce1c8 13166 p += ((24 + align - 1) & -align) - 24;
da44f4e5
AM
13167 }
13168 /* Subsume any padding into the last FDE if user .eh_frame
13169 sections are aligned more than glink_eh_frame. Otherwise any
13170 zero padding will be seen as a terminator. */
2e0ce1c8 13171 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
da44f4e5 13172 size = p - htab->glink_eh_frame->contents;
2e0ce1c8 13173 pad = ((size + align - 1) & -align) - size;
da44f4e5
AM
13174 htab->glink_eh_frame->size = size + pad;
13175 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
13176 }
13177
d969d15f
AM
13178 maybe_strip_output (info, htab->brlt);
13179 if (htab->glink_eh_frame != NULL)
13180 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 13181
b34976b6 13182 return TRUE;
721956f4
AM
13183}
13184
13185/* Called after we have determined section placement. If sections
805fc799 13186 move, we'll be called again. Provide a value for TOCstart. */
721956f4 13187
805fc799 13188bfd_vma
1c865ab2 13189ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 13190{
805fc799 13191 asection *s;
a27e685f 13192 bfd_vma TOCstart, adjust;
721956f4 13193
43417696
AM
13194 if (info != NULL)
13195 {
13196 struct elf_link_hash_entry *h;
13197 struct elf_link_hash_table *htab = elf_hash_table (info);
13198
13199 if (is_elf_hash_table (htab)
13200 && htab->hgot != NULL)
13201 h = htab->hgot;
13202 else
13203 {
13204 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
13205 if (is_elf_hash_table (htab))
13206 htab->hgot = h;
13207 }
13208 if (h != NULL
13209 && h->root.type == bfd_link_hash_defined
13210 && !h->root.linker_def
13211 && (!is_elf_hash_table (htab)
13212 || h->def_regular))
13213 {
13214 TOCstart = (h->root.u.def.value - TOC_BASE_OFF
13215 + h->root.u.def.section->output_offset
13216 + h->root.u.def.section->output_section->vma);
13217 _bfd_set_gp_value (obfd, TOCstart);
13218 return TOCstart;
13219 }
13220 }
13221
805fc799
AM
13222 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
13223 order. The TOC starts where the first of these sections starts. */
13224 s = bfd_get_section_by_name (obfd, ".got");
e054468f 13225 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13226 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 13227 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13228 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 13229 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13230 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 13231 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
13232 {
13233 /* This may happen for
13234 o references to TOC base (SYM@toc / TOC[tc0]) without a
13235 .toc directive
13236 o bad linker script
13237 o --gc-sections and empty TOC sections
13238
13239 FIXME: Warn user? */
13240
13241 /* Look for a likely section. We probably won't even be
13242 using TOCstart. */
13243 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13244 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
13245 | SEC_EXCLUDE))
805fc799
AM
13246 == (SEC_ALLOC | SEC_SMALL_DATA))
13247 break;
721956f4 13248 if (s == NULL)
805fc799 13249 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13250 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
13251 == (SEC_ALLOC | SEC_SMALL_DATA))
13252 break;
721956f4 13253 if (s == NULL)
805fc799 13254 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13255 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
13256 == SEC_ALLOC)
805fc799 13257 break;
721956f4 13258 if (s == NULL)
805fc799 13259 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13260 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
13261 break;
13262 }
721956f4 13263
805fc799
AM
13264 TOCstart = 0;
13265 if (s != NULL)
13266 TOCstart = s->output_section->vma + s->output_offset;
721956f4 13267
a27e685f
AM
13268 /* Force alignment. */
13269 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
13270 TOCstart -= adjust;
1c865ab2
AM
13271 _bfd_set_gp_value (obfd, TOCstart);
13272
810d4e75 13273 if (info != NULL && s != NULL)
1c865ab2
AM
13274 {
13275 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13276
810d4e75
AM
13277 if (htab != NULL)
13278 {
13279 if (htab->elf.hgot != NULL)
13280 {
a27e685f 13281 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
810d4e75
AM
13282 htab->elf.hgot->root.u.def.section = s;
13283 }
13284 }
13285 else
1c865ab2 13286 {
810d4e75
AM
13287 struct bfd_link_hash_entry *bh = NULL;
13288 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
a27e685f
AM
13289 s, TOC_BASE_OFF - adjust,
13290 NULL, FALSE, FALSE, &bh);
1c865ab2
AM
13291 }
13292 }
805fc799 13293 return TOCstart;
721956f4
AM
13294}
13295
a345bc8d 13296/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
49c09209 13297 write out any global entry stubs, and PLT relocations. */
a345bc8d
AM
13298
13299static bfd_boolean
49c09209 13300build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
a345bc8d
AM
13301{
13302 struct bfd_link_info *info;
13303 struct ppc_link_hash_table *htab;
49c09209 13304 struct plt_entry *ent;
a345bc8d
AM
13305 asection *s;
13306
13307 if (h->root.type == bfd_link_hash_indirect)
13308 return TRUE;
13309
49c09209
AM
13310 info = inf;
13311 htab = ppc_hash_table (info);
13312 if (htab == NULL)
13313 return FALSE;
13314
13315 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13316 if (ent->plt.offset != (bfd_vma) -1)
13317 {
13318 /* This symbol has an entry in the procedure linkage
13319 table. Set it up. */
13320 Elf_Internal_Rela rela;
2d7ad24e 13321 asection *plt, *relplt;
49c09209
AM
13322 bfd_byte *loc;
13323
13324 if (!htab->elf.dynamic_sections_created
13325 || h->dynindx == -1)
13326 {
13327 if (!(h->def_regular
13328 && (h->root.type == bfd_link_hash_defined
13329 || h->root.type == bfd_link_hash_defweak)))
13330 continue;
2d7ad24e
AM
13331 if (h->type == STT_GNU_IFUNC)
13332 {
13333 plt = htab->elf.iplt;
13334 relplt = htab->elf.irelplt;
13335 htab->local_ifunc_resolver = 1;
13336 if (htab->opd_abi)
13337 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13338 else
13339 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13340 }
49c09209 13341 else
2d7ad24e
AM
13342 {
13343 plt = htab->pltlocal;
13344 if (bfd_link_pic (info))
13345 {
13346 relplt = htab->relpltlocal;
13347 if (htab->opd_abi)
13348 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13349 else
13350 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13351 }
13352 else
13353 relplt = NULL;
13354 }
49c09209
AM
13355 rela.r_addend = (h->root.u.def.value
13356 + h->root.u.def.section->output_offset
13357 + h->root.u.def.section->output_section->vma
13358 + ent->addend);
2d7ad24e
AM
13359
13360 if (relplt == NULL)
13361 {
13362 loc = plt->contents + ent->plt.offset;
13363 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
13364 if (htab->opd_abi)
13365 {
13366 bfd_vma toc = elf_gp (info->output_bfd);
13367 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
13368 bfd_put_64 (info->output_bfd, toc, loc + 8);
13369 }
13370 }
13371 else
13372 {
13373 rela.r_offset = (plt->output_section->vma
13374 + plt->output_offset
13375 + ent->plt.offset);
13376 loc = relplt->contents + (relplt->reloc_count++
13377 * sizeof (Elf64_External_Rela));
13378 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13379 }
49c09209
AM
13380 }
13381 else
13382 {
13383 rela.r_offset = (htab->elf.splt->output_section->vma
13384 + htab->elf.splt->output_offset
13385 + ent->plt.offset);
13386 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13387 rela.r_addend = ent->addend;
13388 loc = (htab->elf.srelplt->contents
13389 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
13390 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
13391 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
13392 htab->maybe_local_ifunc_resolver = 1;
2d7ad24e 13393 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
49c09209 13394 }
49c09209
AM
13395 }
13396
a345bc8d
AM
13397 if (!h->pointer_equality_needed)
13398 return TRUE;
13399
13400 if (h->def_regular)
13401 return TRUE;
13402
9e390558 13403 s = htab->global_entry;
49c09209
AM
13404 if (s == NULL || s->size == 0)
13405 return TRUE;
13406
13407 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13408 if (ent->plt.offset != (bfd_vma) -1
13409 && ent->addend == 0)
a345bc8d
AM
13410 {
13411 bfd_byte *p;
13412 asection *plt;
13413 bfd_vma off;
13414
a345bc8d 13415 p = s->contents + h->root.u.def.value;
33e44f2e 13416 plt = htab->elf.splt;
a345bc8d
AM
13417 if (!htab->elf.dynamic_sections_created
13418 || h->dynindx == -1)
2d7ad24e
AM
13419 {
13420 if (h->type == STT_GNU_IFUNC)
13421 plt = htab->elf.iplt;
13422 else
13423 plt = htab->pltlocal;
13424 }
49c09209 13425 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
a345bc8d
AM
13426 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
13427
13428 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
13429 {
13430 info->callbacks->einfo
c1c8c1ef 13431 (_("%P: linkage table error against `%pT'\n"),
a345bc8d
AM
13432 h->root.root.string);
13433 bfd_set_error (bfd_error_bad_value);
13434 htab->stub_error = TRUE;
13435 }
13436
7341d5e2
AM
13437 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13438 if (htab->params->emit_stub_syms)
13439 {
13440 size_t len = strlen (h->root.root.string);
13441 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13442
13443 if (name == NULL)
13444 return FALSE;
13445
13446 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13447 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13448 if (h == NULL)
13449 return FALSE;
13450 if (h->root.type == bfd_link_hash_new)
13451 {
13452 h->root.type = bfd_link_hash_defined;
13453 h->root.u.def.section = s;
13454 h->root.u.def.value = p - s->contents;
13455 h->ref_regular = 1;
13456 h->def_regular = 1;
13457 h->ref_regular_nonweak = 1;
13458 h->forced_local = 1;
13459 h->non_elf = 0;
2ec55de3 13460 h->root.linker_def = 1;
7341d5e2
AM
13461 }
13462 }
13463
a345bc8d
AM
13464 if (PPC_HA (off) != 0)
13465 {
13466 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
13467 p += 4;
13468 }
13469 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
13470 p += 4;
13471 bfd_put_32 (s->owner, MTCTR_R12, p);
13472 p += 4;
407aa07c 13473 bfd_put_32 (s->owner, BCTR, p);
a345bc8d
AM
13474 break;
13475 }
13476 return TRUE;
13477}
13478
49c09209
AM
13479/* Write PLT relocs for locals. */
13480
13481static bfd_boolean
13482write_plt_relocs_for_local_syms (struct bfd_link_info *info)
13483{
13484 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13485 bfd *ibfd;
13486
13487 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
13488 {
13489 struct got_entry **lgot_ents, **end_lgot_ents;
13490 struct plt_entry **local_plt, **lplt, **end_local_plt;
13491 Elf_Internal_Shdr *symtab_hdr;
13492 bfd_size_type locsymcount;
13493 Elf_Internal_Sym *local_syms = NULL;
13494 struct plt_entry *ent;
13495
13496 if (!is_ppc64_elf (ibfd))
13497 continue;
13498
13499 lgot_ents = elf_local_got_ents (ibfd);
13500 if (!lgot_ents)
13501 continue;
13502
13503 symtab_hdr = &elf_symtab_hdr (ibfd);
13504 locsymcount = symtab_hdr->sh_info;
13505 end_lgot_ents = lgot_ents + locsymcount;
13506 local_plt = (struct plt_entry **) end_lgot_ents;
13507 end_local_plt = local_plt + locsymcount;
13508 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
13509 for (ent = *lplt; ent != NULL; ent = ent->next)
13510 if (ent->plt.offset != (bfd_vma) -1)
13511 {
13512 Elf_Internal_Sym *sym;
13513 asection *sym_sec;
13514 asection *plt, *relplt;
13515 bfd_byte *loc;
13516 bfd_vma val;
49c09209
AM
13517
13518 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
13519 lplt - local_plt, ibfd))
13520 {
13521 if (local_syms != NULL
13522 && symtab_hdr->contents != (unsigned char *) local_syms)
13523 free (local_syms);
13524 return FALSE;
13525 }
13526
13527 val = sym->st_value + ent->addend;
13528 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
13529 if (sym_sec != NULL && sym_sec->output_section != NULL)
13530 val += sym_sec->output_offset + sym_sec->output_section->vma;
13531
2d7ad24e
AM
13532 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13533 {
13534 htab->local_ifunc_resolver = 1;
13535 plt = htab->elf.iplt;
13536 relplt = htab->elf.irelplt;
13537 }
13538 else
13539 {
13540 plt = htab->pltlocal;
13541 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
13542 }
49c09209 13543
2d7ad24e
AM
13544 if (relplt == NULL)
13545 {
13546 loc = plt->contents + ent->plt.offset;
13547 bfd_put_64 (info->output_bfd, val, loc);
13548 if (htab->opd_abi)
13549 {
13550 bfd_vma toc = elf_gp (ibfd);
13551 bfd_put_64 (info->output_bfd, toc, loc + 8);
13552 }
13553 }
49c09209 13554 else
2d7ad24e
AM
13555 {
13556 Elf_Internal_Rela rela;
13557 rela.r_offset = (ent->plt.offset
13558 + plt->output_offset
13559 + plt->output_section->vma);
13560 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13561 {
13562 if (htab->opd_abi)
13563 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13564 else
13565 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13566 }
13567 else
13568 {
13569 if (htab->opd_abi)
13570 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13571 else
13572 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13573 }
13574 rela.r_addend = val;
13575 loc = relplt->contents + (relplt->reloc_count++
13576 * sizeof (Elf64_External_Rela));
13577 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13578 }
49c09209
AM
13579 }
13580
13581 if (local_syms != NULL
13582 && symtab_hdr->contents != (unsigned char *) local_syms)
13583 {
13584 if (!info->keep_memory)
13585 free (local_syms);
13586 else
13587 symtab_hdr->contents = (unsigned char *) local_syms;
13588 }
13589 }
13590 return TRUE;
13591}
13592
721956f4
AM
13593/* Build all the stubs associated with the current output file.
13594 The stubs are kept in a hash table attached to the main linker
13595 hash table. This function is called via gldelf64ppc_finish. */
13596
b34976b6 13597bfd_boolean
e7d1c40c 13598ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 13599 char **stats)
5d1634d7
AM
13600{
13601 struct ppc_link_hash_table *htab = ppc_hash_table (info);
a4b6fadd 13602 struct map_stub *group;
721956f4 13603 asection *stub_sec;
5d1634d7 13604 bfd_byte *p;
e717da7e 13605 int stub_sec_count = 0;
5d1634d7 13606
4dfe6ac6
NC
13607 if (htab == NULL)
13608 return FALSE;
13609
eea6121a 13610 /* Allocate memory to hold the linker stubs. */
d4aaa2a0
AM
13611 for (group = htab->group; group != NULL; group = group->next)
13612 if ((stub_sec = group->stub_sec) != NULL
eea6121a 13613 && stub_sec->size != 0)
e717da7e 13614 {
e7d1c40c 13615 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, stub_sec->size);
eea6121a
AM
13616 if (stub_sec->contents == NULL)
13617 return FALSE;
eea6121a 13618 stub_sec->size = 0;
e717da7e 13619 }
5d1634d7 13620
23eb7e01 13621 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 13622 {
9f951329 13623 unsigned int indx;
ad8e1ba5 13624 bfd_vma plt0;
9f951329 13625
721956f4 13626 /* Build the .glink plt call stub. */
e7d1c40c 13627 if (htab->params->emit_stub_syms)
97b639ba
AM
13628 {
13629 struct elf_link_hash_entry *h;
468392fb
AM
13630 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
13631 TRUE, FALSE, FALSE);
97b639ba
AM
13632 if (h == NULL)
13633 return FALSE;
13634 if (h->root.type == bfd_link_hash_new)
13635 {
13636 h->root.type = bfd_link_hash_defined;
13637 h->root.u.def.section = htab->glink;
ee4bf8d2 13638 h->root.u.def.value = 8;
f5385ebf
AM
13639 h->ref_regular = 1;
13640 h->def_regular = 1;
13641 h->ref_regular_nonweak = 1;
13642 h->forced_local = 1;
13643 h->non_elf = 0;
2ec55de3 13644 h->root.linker_def = 1;
97b639ba
AM
13645 }
13646 }
33e44f2e
AM
13647 plt0 = (htab->elf.splt->output_section->vma
13648 + htab->elf.splt->output_offset
13649 - 16);
176a0d42
AM
13650 if (info->emitrelocations)
13651 {
13652 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
13653 if (r == NULL)
13654 return FALSE;
13655 r->r_offset = (htab->glink->output_offset
13656 + htab->glink->output_section->vma);
13657 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
13658 r->r_addend = plt0;
13659 }
4ce794b7 13660 p = htab->glink->contents;
176a0d42 13661 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
13662 bfd_put_64 (htab->glink->owner, plt0, p);
13663 p += 8;
b9e5796b
AM
13664 if (htab->opd_abi)
13665 {
13666 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
13667 p += 4;
13668 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13669 p += 4;
13670 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13671 p += 4;
13672 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13673 p += 4;
13674 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
13675 p += 4;
13676 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13677 p += 4;
13678 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13679 p += 4;
13680 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
13681 p += 4;
13682 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13683 p += 4;
13684 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
13685 p += 4;
13686 }
13687 else
13688 {
13689 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
13690 p += 4;
13691 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13692 p += 4;
13693 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13694 p += 4;
f378ab09
AM
13695 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
13696 p += 4;
b9e5796b
AM
13697 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13698 p += 4;
13699 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
13700 p += 4;
13701 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
13702 p += 4;
13703 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13704 p += 4;
13705 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
13706 p += 4;
13707 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13708 p += 4;
13709 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
13710 p += 4;
13711 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13712 p += 4;
13713 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
13714 p += 4;
13715 }
407aa07c
AM
13716 bfd_put_32 (htab->glink->owner, BCTR, p);
13717 p += 4;
c75bc4f7 13718 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
ad8e1ba5 13719
9f951329
AM
13720 /* Build the .glink lazy link call stubs. */
13721 indx = 0;
9e390558 13722 while (p < htab->glink->contents + htab->glink->size)
9f951329 13723 {
b9e5796b 13724 if (htab->opd_abi)
9f951329 13725 {
b9e5796b
AM
13726 if (indx < 0x8000)
13727 {
13728 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
13729 p += 4;
13730 }
13731 else
13732 {
13733 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
13734 p += 4;
13735 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
13736 p);
13737 p += 4;
13738 }
9f951329 13739 }
4ce794b7 13740 bfd_put_32 (htab->glink->owner,
ee4bf8d2 13741 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 13742 indx++;
9f951329
AM
13743 p += 4;
13744 }
5d1634d7 13745 }
5d1634d7 13746
49c09209
AM
13747 /* Build .glink global entry stubs, and PLT relocs for globals. */
13748 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
13749
13750 if (!write_plt_relocs_for_local_syms (info))
13751 return FALSE;
9e390558 13752
7341d5e2 13753 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 13754 {
4ce794b7 13755 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 13756 htab->brlt->size);
4ce794b7 13757 if (htab->brlt->contents == NULL)
b34976b6 13758 return FALSE;
721956f4 13759 }
ee75fd95 13760 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
13761 {
13762 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 13763 htab->relbrlt->size);
63bc6f6c
AM
13764 if (htab->relbrlt->contents == NULL)
13765 return FALSE;
13766 }
5d1634d7 13767
721956f4
AM
13768 /* Build the stubs as directed by the stub hash table. */
13769 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 13770
a4b6fadd
AM
13771 for (group = htab->group; group != NULL; group = group->next)
13772 if (group->needs_save_res)
7dda8d3c 13773 group->stub_sec->size += htab->sfpr->size;
a4b6fadd 13774
aa8a7074
AM
13775 if (htab->relbrlt != NULL)
13776 htab->relbrlt->reloc_count = 0;
13777
e7d1c40c 13778 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13779 for (group = htab->group; group != NULL; group = group->next)
13780 if ((stub_sec = group->stub_sec) != NULL)
691d2e9a
AM
13781 {
13782 int align = abs (htab->params->plt_stub_align);
13783 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
13784 }
794e51c0 13785
7dda8d3c
AM
13786 for (group = htab->group; group != NULL; group = group->next)
13787 if (group->needs_save_res)
13788 {
13789 stub_sec = group->stub_sec;
13790 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
13791 htab->sfpr->contents, htab->sfpr->size);
13792 if (htab->params->emit_stub_syms)
13793 {
13794 unsigned int i;
13795
13796 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
13797 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
13798 return FALSE;
13799 }
13800 }
13801
d4aaa2a0
AM
13802 for (group = htab->group; group != NULL; group = group->next)
13803 if ((stub_sec = group->stub_sec) != NULL)
e717da7e
AM
13804 {
13805 stub_sec_count += 1;
c9301e31
AM
13806 if (stub_sec->rawsize != stub_sec->size
13807 && (htab->stub_iteration <= STUB_SHRINK_ITER
13808 || stub_sec->rawsize < stub_sec->size))
e717da7e
AM
13809 break;
13810 }
5d1634d7 13811
25516cc5 13812 if (group != NULL)
5d1634d7 13813 {
b34976b6 13814 htab->stub_error = TRUE;
cf97bcb0 13815 _bfd_error_handler (_("stubs don't match calculated size"));
5d1634d7 13816 }
721956f4 13817
d2a300cf
AM
13818 if (htab->stub_error)
13819 return FALSE;
13820
13821 if (stats != NULL)
13822 {
db84fff3 13823 size_t len;
d2a300cf
AM
13824 *stats = bfd_malloc (500);
13825 if (*stats == NULL)
13826 return FALSE;
13827
db84fff3
AM
13828 len = sprintf (*stats,
13829 ngettext ("linker stubs in %u group\n",
13830 "linker stubs in %u groups\n",
13831 stub_sec_count),
13832 stub_sec_count);
13833 sprintf (*stats + len, _(" branch %lu\n"
13834 " toc adjust %lu\n"
13835 " long branch %lu\n"
13836 " long toc adj %lu\n"
13837 " plt call %lu\n"
13838 " plt call toc %lu\n"
13839 " global entry %lu"),
4ce794b7
AM
13840 htab->stub_count[ppc_stub_long_branch - 1],
13841 htab->stub_count[ppc_stub_long_branch_r2off - 1],
13842 htab->stub_count[ppc_stub_plt_branch - 1],
13843 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
794e51c0 13844 htab->stub_count[ppc_stub_plt_call - 1],
7341d5e2
AM
13845 htab->stub_count[ppc_stub_plt_call_r2save - 1],
13846 htab->stub_count[ppc_stub_global_entry - 1]);
d2a300cf
AM
13847 }
13848 return TRUE;
5bd4f169
AM
13849}
13850
60124e18
AM
13851/* What to do when ld finds relocations against symbols defined in
13852 discarded sections. */
13853
13854static unsigned int
13855ppc64_elf_action_discarded (asection *sec)
13856{
13857 if (strcmp (".opd", sec->name) == 0)
13858 return 0;
13859
13860 if (strcmp (".toc", sec->name) == 0)
13861 return 0;
13862
bce50a28
JJ
13863 if (strcmp (".toc1", sec->name) == 0)
13864 return 0;
13865
60124e18
AM
13866 return _bfd_elf_default_action_discarded (sec);
13867}
13868
5bd4f169
AM
13869/* The RELOCATE_SECTION function is called by the ELF backend linker
13870 to handle the relocations for a section.
13871
13872 The relocs are always passed as Rela structures; if the section
13873 actually uses Rel structures, the r_addend field will always be
13874 zero.
13875
13876 This function is responsible for adjust the section contents as
13877 necessary, and (if using Rela relocs and generating a
1049f94e 13878 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
13879 necessary.
13880
13881 This function does not have to worry about setting the reloc
13882 address or the reloc symbol index.
13883
13884 LOCAL_SYMS is a pointer to the swapped in local symbols.
13885
13886 LOCAL_SECTIONS is an array giving the section in the input file
13887 corresponding to the st_shndx field of each local symbol.
13888
13889 The global hash table entry for the global symbols can be found
13890 via elf_sym_hashes (input_bfd).
13891
1049f94e 13892 When generating relocatable output, this function must handle
5bd4f169
AM
13893 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
13894 going to be the section symbol corresponding to the output
13895 section, which means that the addend must be adjusted
13896 accordingly. */
13897
b34976b6 13898static bfd_boolean
4ce794b7
AM
13899ppc64_elf_relocate_section (bfd *output_bfd,
13900 struct bfd_link_info *info,
13901 bfd *input_bfd,
13902 asection *input_section,
13903 bfd_byte *contents,
13904 Elf_Internal_Rela *relocs,
13905 Elf_Internal_Sym *local_syms,
13906 asection **local_sections)
5bd4f169 13907{
65f38f15 13908 struct ppc_link_hash_table *htab;
5bd4f169
AM
13909 Elf_Internal_Shdr *symtab_hdr;
13910 struct elf_link_hash_entry **sym_hashes;
5bd4f169 13911 Elf_Internal_Rela *rel;
c316a17c 13912 Elf_Internal_Rela *wrel;
5bd4f169 13913 Elf_Internal_Rela *relend;
411e1bfb
AM
13914 Elf_Internal_Rela outrel;
13915 bfd_byte *loc;
411e1bfb 13916 struct got_entry **local_got_ents;
5bd4f169 13917 bfd_vma TOCstart;
b34976b6
AM
13918 bfd_boolean ret = TRUE;
13919 bfd_boolean is_opd;
794e51c0
AM
13920 /* Assume 'at' branch hints. */
13921 bfd_boolean is_isa_v2 = TRUE;
95f0d0d2 13922 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
5bd4f169 13923
65f38f15 13924 /* Initialize howto table if needed. */
5bd4f169 13925 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
13926 ppc_howto_init ();
13927
65f38f15 13928 htab = ppc_hash_table (info);
4dfe6ac6
NC
13929 if (htab == NULL)
13930 return FALSE;
ee75fd95
AM
13931
13932 /* Don't relocate stub sections. */
e7d1c40c 13933 if (input_section->owner == htab->params->stub_bfd)
ee75fd95
AM
13934 return TRUE;
13935
0c8d6e5c 13936 BFD_ASSERT (is_ppc64_elf (input_bfd));
0ffa91dd 13937
411e1bfb 13938 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 13939 TOCstart = elf_gp (output_bfd);
0ffa91dd 13940 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 13941 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 13942 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 13943
c316a17c 13944 rel = wrel = relocs;
5bd4f169 13945 relend = relocs + input_section->reloc_count;
c316a17c 13946 for (; rel < relend; wrel++, rel++)
5bd4f169 13947 {
04c9666a 13948 enum elf_ppc64_reloc_type r_type;
31c76678 13949 bfd_vma addend;
5bd4f169
AM
13950 bfd_reloc_status_type r;
13951 Elf_Internal_Sym *sym;
13952 asection *sec;
039b3fef
AM
13953 struct elf_link_hash_entry *h_elf;
13954 struct ppc_link_hash_entry *h;
13955 struct ppc_link_hash_entry *fdh;
5bd4f169 13956 const char *sym_name;
0d4792f7 13957 unsigned long r_symndx, toc_symndx;
3a71aa26 13958 bfd_vma toc_addend;
f961d9dd
AM
13959 unsigned char tls_mask, tls_gd, tls_type;
13960 unsigned char sym_type;
5bd4f169 13961 bfd_vma relocation;
23cedd1d 13962 bfd_boolean unresolved_reloc, save_unresolved_reloc;
b34976b6 13963 bfd_boolean warned;
bc30df16 13964 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 13965 unsigned int insn;
e11840f9 13966 unsigned int mask;
721956f4
AM
13967 struct ppc_stub_hash_entry *stub_entry;
13968 bfd_vma max_br_offset;
13969 bfd_vma from;
c316a17c 13970 Elf_Internal_Rela orig_rel;
b80eed39
AM
13971 reloc_howto_type *howto;
13972 struct reloc_howto_struct alt_howto;
5bd4f169 13973
c316a17c
AM
13974 again:
13975 orig_rel = *rel;
13976
4ce794b7 13977 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 13978 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
13979
13980 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
13981 symbol of the previous ADDR64 reloc. The symbol gives us the
13982 proper TOC base to use. */
13983 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
c316a17c
AM
13984 && wrel != relocs
13985 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
ee87f2da 13986 && is_opd)
c316a17c 13987 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
ee87f2da 13988
4ce794b7
AM
13989 sym = NULL;
13990 sec = NULL;
039b3fef 13991 h_elf = NULL;
4ce794b7 13992 sym_name = NULL;
b34976b6
AM
13993 unresolved_reloc = FALSE;
13994 warned = FALSE;
65f38f15 13995
0b13192e 13996 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
13997 {
13998 /* It's a local symbol. */
74f0fb50 13999 struct _opd_sec_data *opd;
4025353c 14000
5bd4f169
AM
14001 sym = local_syms + r_symndx;
14002 sec = local_sections[r_symndx];
26c61ae5 14003 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 14004 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 14005 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
14006 opd = get_opd_info (sec);
14007 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 14008 {
51aecdc5
AM
14009 long adjust = opd->adjust[OPD_NDX (sym->st_value
14010 + rel->r_addend)];
4025353c
AM
14011 if (adjust == -1)
14012 relocation = 0;
14013 else
4cc603a5
AM
14014 {
14015 /* If this is a relocation against the opd section sym
14016 and we have edited .opd, adjust the reloc addend so
14017 that ld -r and ld --emit-relocs output is correct.
14018 If it is a reloc against some other .opd symbol,
14019 then the symbol value will be adjusted later. */
14020 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
14021 rel->r_addend += adjust;
14022 else
14023 relocation += adjust;
14024 }
1e2f5b6e 14025 }
5bd4f169
AM
14026 }
14027 else
14028 {
62d887d4
L
14029 bfd_boolean ignored;
14030
b2a8e766
AM
14031 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
14032 r_symndx, symtab_hdr, sym_hashes,
039b3fef 14033 h_elf, sec, relocation,
62d887d4 14034 unresolved_reloc, warned, ignored);
039b3fef
AM
14035 sym_name = h_elf->root.root.string;
14036 sym_type = h_elf->type;
b69fdb4e
AM
14037 if (sec != NULL
14038 && sec->owner == output_bfd
14039 && strcmp (sec->name, ".opd") == 0)
14040 {
14041 /* This is a symbol defined in a linker script. All
14042 such are defined in output sections, even those
14043 defined by simple assignment from a symbol defined in
14044 an input section. Transfer the symbol to an
14045 appropriate input .opd section, so that a branch to
14046 this symbol will be mapped to the location specified
14047 by the opd entry. */
14048 struct bfd_link_order *lo;
14049 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
14050 if (lo->type == bfd_indirect_link_order)
14051 {
14052 asection *isec = lo->u.indirect.section;
14053 if (h_elf->root.u.def.value >= isec->output_offset
14054 && h_elf->root.u.def.value < (isec->output_offset
14055 + isec->size))
14056 {
14057 h_elf->root.u.def.value -= isec->output_offset;
14058 h_elf->root.u.def.section = isec;
14059 sec = isec;
14060 break;
14061 }
14062 }
14063 }
5bd4f169 14064 }
039b3fef 14065 h = (struct ppc_link_hash_entry *) h_elf;
5bd4f169 14066
dbaa2011 14067 if (sec != NULL && discarded_section (sec))
c316a17c
AM
14068 {
14069 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
14070 input_bfd, input_section,
14071 contents + rel->r_offset);
14072 wrel->r_offset = rel->r_offset;
14073 wrel->r_info = 0;
14074 wrel->r_addend = 0;
14075
14076 /* For ld -r, remove relocations in debug sections against
dcd2b8a0 14077 symbols defined in discarded sections. Not done for
c316a17c
AM
14078 non-debug to preserve relocs in .eh_frame which the
14079 eh_frame editing code expects to be present. */
14080 if (bfd_link_relocatable (info)
14081 && (input_section->flags & SEC_DEBUGGING))
14082 wrel--;
14083
14084 continue;
14085 }
ab96bf03 14086
0e1862bb 14087 if (bfd_link_relocatable (info))
c316a17c 14088 goto copy_reloc;
ab96bf03 14089
f40da81b
AM
14090 if (h != NULL && &h->elf == htab->elf.hgot)
14091 {
6f20ed8a 14092 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
f40da81b
AM
14093 sec = bfd_abs_section_ptr;
14094 unresolved_reloc = FALSE;
14095 }
14096
951fd09b
AM
14097 /* TLS optimizations. Replace instruction sequences and relocs
14098 based on information we collected in tls_optimize. We edit
14099 RELOCS so that --emit-relocs will output something sensible
14100 for the final instruction stream. */
14101 tls_mask = 0;
14102 tls_gd = 0;
0d4792f7 14103 toc_symndx = 0;
727fc41e
AM
14104 if (h != NULL)
14105 tls_mask = h->tls_mask;
14106 else if (local_got_ents != NULL)
411e1bfb 14107 {
e054468f
AM
14108 struct plt_entry **local_plt = (struct plt_entry **)
14109 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 14110 unsigned char *lgot_masks = (unsigned char *)
e054468f 14111 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
14112 tls_mask = lgot_masks[r_symndx];
14113 }
37da22e5 14114 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
727fc41e
AM
14115 && (r_type == R_PPC64_TLS
14116 || r_type == R_PPC64_TLSGD
14117 || r_type == R_PPC64_TLSLD))
14118 {
14119 /* Check for toc tls entries. */
f961d9dd 14120 unsigned char *toc_tls;
0d4792f7 14121
727fc41e
AM
14122 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14123 &local_syms, rel, input_bfd))
14124 return FALSE;
0d4792f7 14125
727fc41e
AM
14126 if (toc_tls)
14127 tls_mask = *toc_tls;
0d4792f7
AM
14128 }
14129
14130 /* Check that tls relocs are used with tls syms, and non-tls
14131 relocs are used with non-tls syms. */
cf35638d 14132 if (r_symndx != STN_UNDEF
0d4792f7
AM
14133 && r_type != R_PPC64_NONE
14134 && (h == NULL
039b3fef
AM
14135 || h->elf.root.type == bfd_link_hash_defined
14136 || h->elf.root.type == bfd_link_hash_defweak)
1d483afe
AM
14137 && (IS_PPC64_TLS_RELOC (r_type)
14138 != (sym_type == STT_TLS
14139 || (sym_type == STT_SECTION
14140 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
0d4792f7 14141 {
37da22e5 14142 if ((tls_mask & TLS_TLS) != 0
727fc41e
AM
14143 && (r_type == R_PPC64_TLS
14144 || r_type == R_PPC64_TLSGD
14145 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
14146 /* R_PPC64_TLS is OK against a symbol in the TOC. */
14147 ;
14148 else
25f53a85 14149 info->callbacks->einfo
1d483afe 14150 (!IS_PPC64_TLS_RELOC (r_type)
695344c0 14151 /* xgettext:c-format */
c1c8c1ef 14152 ? _("%H: %s used with TLS symbol `%pT'\n")
695344c0 14153 /* xgettext:c-format */
c1c8c1ef 14154 : _("%H: %s used with non-TLS symbol `%pT'\n"),
25f53a85 14155 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
14156 ppc64_elf_howto_table[r_type]->name,
14157 sym_name);
411e1bfb
AM
14158 }
14159
14160 /* Ensure reloc mapping code below stays sane. */
14161 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
14162 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
14163 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
14164 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
14165 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
14166 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
14167 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
14168 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
14169 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
14170 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
14171 abort ();
0d4792f7 14172
411e1bfb
AM
14173 switch (r_type)
14174 {
14175 default:
411e1bfb
AM
14176 break;
14177
ba761f19 14178 case R_PPC64_LO_DS_OPT:
95f0d0d2 14179 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
ba761f19
AM
14180 if ((insn & (0x3f << 26)) != 58u << 26)
14181 abort ();
14182 insn += (14u << 26) - (58u << 26);
95f0d0d2 14183 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
ba761f19
AM
14184 r_type = R_PPC64_TOC16_LO;
14185 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14186 break;
14187
411e1bfb
AM
14188 case R_PPC64_TOC16:
14189 case R_PPC64_TOC16_LO:
14190 case R_PPC64_TOC16_DS:
14191 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
14192 {
14193 /* Check for toc tls entries. */
f961d9dd 14194 unsigned char *toc_tls;
951fd09b 14195 int retval;
411e1bfb 14196
3a71aa26
AM
14197 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14198 &local_syms, rel, input_bfd);
951fd09b 14199 if (retval == 0)
411e1bfb
AM
14200 return FALSE;
14201
14202 if (toc_tls)
14203 {
951fd09b 14204 tls_mask = *toc_tls;
411e1bfb
AM
14205 if (r_type == R_PPC64_TOC16_DS
14206 || r_type == R_PPC64_TOC16_LO_DS)
81407a69 14207 {
37da22e5 14208 if ((tls_mask & TLS_TLS) != 0
81407a69
AM
14209 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
14210 goto toctprel;
14211 }
411e1bfb 14212 else
951fd09b
AM
14213 {
14214 /* If we found a GD reloc pair, then we might be
14215 doing a GD->IE transition. */
14216 if (retval == 2)
14217 {
14218 tls_gd = TLS_TPRELGD;
37da22e5
AM
14219 if ((tls_mask & TLS_TLS) != 0
14220 && (tls_mask & TLS_GD) == 0)
102890f0 14221 goto tls_ldgd_opt;
951fd09b
AM
14222 }
14223 else if (retval == 3)
14224 {
37da22e5
AM
14225 if ((tls_mask & TLS_TLS) != 0
14226 && (tls_mask & TLS_LD) == 0)
102890f0 14227 goto tls_ldgd_opt;
951fd09b
AM
14228 }
14229 }
411e1bfb
AM
14230 }
14231 }
14232 break;
14233
9d6ded02
AM
14234 case R_PPC64_GOT_TPREL16_HI:
14235 case R_PPC64_GOT_TPREL16_HA:
37da22e5 14236 if ((tls_mask & TLS_TLS) != 0
9d6ded02
AM
14237 && (tls_mask & TLS_TPREL) == 0)
14238 {
14239 rel->r_offset -= d_offset;
95f0d0d2 14240 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
9d6ded02
AM
14241 r_type = R_PPC64_NONE;
14242 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14243 }
14244 break;
14245
411e1bfb
AM
14246 case R_PPC64_GOT_TPREL16_DS:
14247 case R_PPC64_GOT_TPREL16_LO_DS:
37da22e5 14248 if ((tls_mask & TLS_TLS) != 0
951fd09b 14249 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14250 {
81407a69 14251 toctprel:
95f0d0d2 14252 insn = bfd_get_32 (input_bfd,
c316a17c 14253 contents + rel->r_offset - d_offset);
411e1bfb
AM
14254 insn &= 31 << 21;
14255 insn |= 0x3c0d0000; /* addis 0,13,0 */
95f0d0d2 14256 bfd_put_32 (input_bfd, insn,
c316a17c 14257 contents + rel->r_offset - d_offset);
411e1bfb 14258 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
14259 if (toc_symndx != 0)
14260 {
14261 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 14262 rel->r_addend = toc_addend;
0d4792f7
AM
14263 /* We changed the symbol. Start over in order to
14264 get h, sym, sec etc. right. */
c316a17c 14265 goto again;
0d4792f7
AM
14266 }
14267 else
14268 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14269 }
14270 break;
14271
14272 case R_PPC64_TLS:
37da22e5 14273 if ((tls_mask & TLS_TLS) != 0
951fd09b 14274 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14275 {
95f0d0d2 14276 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2d0f3896
AM
14277 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
14278 if (insn == 0)
411e1bfb 14279 abort ();
95f0d0d2 14280 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
411e1bfb 14281 /* Was PPC64_TLS which sits on insn boundary, now
4fe5ca5b
GM
14282 PPC64_TPREL16_LO which is at low-order half-word. */
14283 rel->r_offset += d_offset;
0d4792f7
AM
14284 r_type = R_PPC64_TPREL16_LO;
14285 if (toc_symndx != 0)
14286 {
14287 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 14288 rel->r_addend = toc_addend;
0d4792f7
AM
14289 /* We changed the symbol. Start over in order to
14290 get h, sym, sec etc. right. */
c316a17c 14291 goto again;
0d4792f7
AM
14292 }
14293 else
14294 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14295 }
14296 break;
14297
411e1bfb
AM
14298 case R_PPC64_GOT_TLSGD16_HI:
14299 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 14300 tls_gd = TLS_TPRELGD;
37da22e5 14301 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
951fd09b
AM
14302 goto tls_gdld_hi;
14303 break;
14304
411e1bfb
AM
14305 case R_PPC64_GOT_TLSLD16_HI:
14306 case R_PPC64_GOT_TLSLD16_HA:
37da22e5 14307 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 14308 {
951fd09b
AM
14309 tls_gdld_hi:
14310 if ((tls_mask & tls_gd) != 0)
14311 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14312 + R_PPC64_GOT_TPREL16_DS);
14313 else
411e1bfb 14314 {
4fe5ca5b 14315 rel->r_offset -= d_offset;
95f0d0d2 14316 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
951fd09b 14317 r_type = R_PPC64_NONE;
411e1bfb 14318 }
951fd09b 14319 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14320 }
14321 break;
14322
951fd09b
AM
14323 case R_PPC64_GOT_TLSGD16:
14324 case R_PPC64_GOT_TLSGD16_LO:
14325 tls_gd = TLS_TPRELGD;
37da22e5 14326 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
102890f0 14327 goto tls_ldgd_opt;
951fd09b 14328 break;
411e1bfb 14329
951fd09b
AM
14330 case R_PPC64_GOT_TLSLD16:
14331 case R_PPC64_GOT_TLSLD16_LO:
37da22e5 14332 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
951fd09b 14333 {
b9f04fe0 14334 unsigned int insn1, insn2;
102890f0
AM
14335 bfd_vma offset;
14336
14337 tls_ldgd_opt:
727fc41e
AM
14338 offset = (bfd_vma) -1;
14339 /* If not using the newer R_PPC64_TLSGD/LD to mark
14340 __tls_get_addr calls, we must trust that the call
14341 stays with its arg setup insns, ie. that the next
14342 reloc is the __tls_get_addr call associated with
14343 the current reloc. Edit both insns. */
14344 if (input_section->has_tls_get_addr_call
14345 && rel + 1 < relend
14346 && branch_reloc_hash_match (input_bfd, rel + 1,
14347 htab->tls_get_addr,
14348 htab->tls_get_addr_fd))
14349 offset = rel[1].r_offset;
b86ac8e3
AM
14350 /* We read the low GOT_TLS (or TOC16) insn because we
14351 need to keep the destination reg. It may be
14352 something other than the usual r3, and moved to r3
14353 before the call by intervening code. */
95f0d0d2 14354 insn1 = bfd_get_32 (input_bfd,
b86ac8e3 14355 contents + rel->r_offset - d_offset);
102890f0 14356 if ((tls_mask & tls_gd) != 0)
411e1bfb 14357 {
102890f0 14358 /* IE */
b86ac8e3 14359 insn1 &= (0x1f << 21) | (0x1f << 16);
102890f0
AM
14360 insn1 |= 58 << 26; /* ld */
14361 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 14362 if (offset != (bfd_vma) -1)
f58d5a2d 14363 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
102890f0
AM
14364 if ((tls_mask & TLS_EXPLICIT) == 0)
14365 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14366 + R_PPC64_GOT_TPREL16_DS);
411e1bfb 14367 else
102890f0
AM
14368 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
14369 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14370 }
14371 else
14372 {
14373 /* LE */
b86ac8e3
AM
14374 insn1 &= 0x1f << 21;
14375 insn1 |= 0x3c0d0000; /* addis r,13,0 */
102890f0
AM
14376 insn2 = 0x38630000; /* addi 3,3,0 */
14377 if (tls_gd == 0)
951fd09b 14378 {
102890f0 14379 /* Was an LD reloc. */
1d483afe
AM
14380 if (toc_symndx)
14381 sec = local_sections[toc_symndx];
14382 for (r_symndx = 0;
14383 r_symndx < symtab_hdr->sh_info;
14384 r_symndx++)
14385 if (local_sections[r_symndx] == sec)
14386 break;
14387 if (r_symndx >= symtab_hdr->sh_info)
cf35638d 14388 r_symndx = STN_UNDEF;
102890f0 14389 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
cf35638d 14390 if (r_symndx != STN_UNDEF)
1d483afe
AM
14391 rel->r_addend -= (local_syms[r_symndx].st_value
14392 + sec->output_offset
14393 + sec->output_section->vma);
951fd09b 14394 }
102890f0 14395 else if (toc_symndx != 0)
3a71aa26
AM
14396 {
14397 r_symndx = toc_symndx;
14398 rel->r_addend = toc_addend;
14399 }
102890f0
AM
14400 r_type = R_PPC64_TPREL16_HA;
14401 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
14402 if (offset != (bfd_vma) -1)
14403 {
14404 rel[1].r_info = ELF64_R_INFO (r_symndx,
14405 R_PPC64_TPREL16_LO);
14406 rel[1].r_offset = offset + d_offset;
14407 rel[1].r_addend = rel->r_addend;
14408 }
102890f0 14409 }
95f0d0d2 14410 bfd_put_32 (input_bfd, insn1,
3a71aa26 14411 contents + rel->r_offset - d_offset);
727fc41e 14412 if (offset != (bfd_vma) -1)
b9f04fe0 14413 bfd_put_32 (input_bfd, insn2, contents + offset);
727fc41e
AM
14414 if ((tls_mask & tls_gd) == 0
14415 && (tls_gd == 0 || toc_symndx != 0))
14416 {
14417 /* We changed the symbol. Start over in order
14418 to get h, sym, sec etc. right. */
c316a17c 14419 goto again;
727fc41e
AM
14420 }
14421 }
14422 break;
14423
14424 case R_PPC64_TLSGD:
37da22e5 14425 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
675e2809 14426 && rel + 1 < relend)
727fc41e 14427 {
b9f04fe0 14428 unsigned int insn2;
727fc41e
AM
14429 bfd_vma offset = rel->r_offset;
14430
23cedd1d
AM
14431 if (is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
14432 {
14433 bfd_put_32 (output_bfd, NOP, contents + offset);
14434 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14435 break;
14436 }
14437
14438 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14439 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14440
727fc41e
AM
14441 if ((tls_mask & TLS_TPRELGD) != 0)
14442 {
14443 /* IE */
14444 r_type = R_PPC64_NONE;
14445 insn2 = 0x7c636a14; /* add 3,3,13 */
14446 }
14447 else
14448 {
14449 /* LE */
14450 if (toc_symndx != 0)
14451 {
14452 r_symndx = toc_symndx;
14453 rel->r_addend = toc_addend;
14454 }
14455 r_type = R_PPC64_TPREL16_LO;
14456 rel->r_offset = offset + d_offset;
14457 insn2 = 0x38630000; /* addi 3,3,0 */
14458 }
14459 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14460 /* Zap the reloc on the _tls_get_addr call too. */
14461 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14462 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 14463 bfd_put_32 (input_bfd, insn2, contents + offset);
727fc41e 14464 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
c316a17c 14465 goto again;
411e1bfb 14466 }
411e1bfb
AM
14467 break;
14468
727fc41e 14469 case R_PPC64_TLSLD:
37da22e5 14470 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
675e2809 14471 && rel + 1 < relend)
727fc41e 14472 {
b9f04fe0 14473 unsigned int insn2;
727fc41e
AM
14474 bfd_vma offset = rel->r_offset;
14475
23cedd1d
AM
14476 if (is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
14477 {
14478 bfd_put_32 (output_bfd, NOP, contents + offset);
14479 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14480 break;
14481 }
14482
14483 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14484 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14485
727fc41e
AM
14486 if (toc_symndx)
14487 sec = local_sections[toc_symndx];
14488 for (r_symndx = 0;
14489 r_symndx < symtab_hdr->sh_info;
14490 r_symndx++)
14491 if (local_sections[r_symndx] == sec)
14492 break;
14493 if (r_symndx >= symtab_hdr->sh_info)
cf35638d 14494 r_symndx = STN_UNDEF;
727fc41e 14495 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
cf35638d 14496 if (r_symndx != STN_UNDEF)
727fc41e
AM
14497 rel->r_addend -= (local_syms[r_symndx].st_value
14498 + sec->output_offset
14499 + sec->output_section->vma);
14500
14501 r_type = R_PPC64_TPREL16_LO;
14502 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14503 rel->r_offset = offset + d_offset;
14504 /* Zap the reloc on the _tls_get_addr call too. */
14505 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14506 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
727fc41e 14507 insn2 = 0x38630000; /* addi 3,3,0 */
95f0d0d2 14508 bfd_put_32 (input_bfd, insn2, contents + offset);
c316a17c 14509 goto again;
727fc41e
AM
14510 }
14511 break;
14512
411e1bfb 14513 case R_PPC64_DTPMOD64:
951fd09b
AM
14514 if (rel + 1 < relend
14515 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
14516 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 14517 {
951fd09b
AM
14518 if ((tls_mask & TLS_GD) == 0)
14519 {
14520 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
14521 if ((tls_mask & TLS_TPRELGD) != 0)
14522 r_type = R_PPC64_TPREL64;
14523 else
14524 {
4ce794b7 14525 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
14526 r_type = R_PPC64_NONE;
14527 }
14528 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14529 }
14530 }
14531 else
14532 {
14533 if ((tls_mask & TLS_LD) == 0)
411e1bfb 14534 {
4ce794b7 14535 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 14536 r_type = R_PPC64_NONE;
951fd09b 14537 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 14538 }
411e1bfb
AM
14539 }
14540 break;
14541
14542 case R_PPC64_TPREL64:
951fd09b 14543 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
14544 {
14545 r_type = R_PPC64_NONE;
14546 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14547 }
14548 break;
52a82034 14549
006589cf
AM
14550 case R_PPC64_ENTRY:
14551 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
14552 if (!bfd_link_pic (info)
14553 && !info->traditional_format
14554 && relocation + 0x80008000 <= 0xffffffff)
14555 {
14556 unsigned int insn1, insn2;
14557
14558 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
14559 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14560 if ((insn1 & ~0xfffc) == LD_R2_0R12
14561 && insn2 == ADD_R2_R2_R12)
14562 {
95f0d0d2 14563 bfd_put_32 (input_bfd,
006589cf
AM
14564 LIS_R2 + PPC_HA (relocation),
14565 contents + rel->r_offset);
95f0d0d2 14566 bfd_put_32 (input_bfd,
006589cf
AM
14567 ADDI_R2_R2 + PPC_LO (relocation),
14568 contents + rel->r_offset + 4);
14569 }
14570 }
14571 else
14572 {
14573 relocation -= (rel->r_offset
14574 + input_section->output_offset
14575 + input_section->output_section->vma);
14576 if (relocation + 0x80008000 <= 0xffffffff)
14577 {
14578 unsigned int insn1, insn2;
14579
14580 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
14581 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14582 if ((insn1 & ~0xfffc) == LD_R2_0R12
14583 && insn2 == ADD_R2_R2_R12)
14584 {
95f0d0d2 14585 bfd_put_32 (input_bfd,
006589cf
AM
14586 ADDIS_R2_R12 + PPC_HA (relocation),
14587 contents + rel->r_offset);
95f0d0d2 14588 bfd_put_32 (input_bfd,
006589cf
AM
14589 ADDI_R2_R2 + PPC_LO (relocation),
14590 contents + rel->r_offset + 4);
14591 }
14592 }
14593 }
14594 break;
14595
52a82034
AM
14596 case R_PPC64_REL16_HA:
14597 /* If we are generating a non-PIC executable, edit
14598 . 0: addis 2,12,.TOC.-0b@ha
14599 . addi 2,2,.TOC.-0b@l
14600 used by ELFv2 global entry points to set up r2, to
14601 . lis 2,.TOC.@ha
14602 . addi 2,2,.TOC.@l
14603 if .TOC. is in range. */
0e1862bb 14604 if (!bfd_link_pic (info)
810d4e75 14605 && !info->traditional_format
006589cf 14606 && !htab->opd_abi
4f038ee5 14607 && rel->r_addend == d_offset
52a82034
AM
14608 && h != NULL && &h->elf == htab->elf.hgot
14609 && rel + 1 < relend
14610 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
14611 && rel[1].r_offset == rel->r_offset + 4
14612 && rel[1].r_addend == rel->r_addend + 4
14613 && relocation + 0x80008000 <= 0xffffffff)
14614 {
14615 unsigned int insn1, insn2;
14616 bfd_vma offset = rel->r_offset - d_offset;
95f0d0d2
AM
14617 insn1 = bfd_get_32 (input_bfd, contents + offset);
14618 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
006589cf
AM
14619 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
14620 && (insn2 & 0xffff0000) == ADDI_R2_R2)
52a82034
AM
14621 {
14622 r_type = R_PPC64_ADDR16_HA;
14623 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14624 rel->r_addend -= d_offset;
14625 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
14626 rel[1].r_addend -= d_offset + 4;
95f0d0d2 14627 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
52a82034
AM
14628 }
14629 }
14630 break;
411e1bfb
AM
14631 }
14632
14633 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 14634 insn = 0;
b25116a9
AM
14635 max_br_offset = 1 << 25;
14636 addend = rel->r_addend;
bc30df16 14637 reloc_dest = DEST_NORMAL;
65f38f15 14638 switch (r_type)
5bd4f169
AM
14639 {
14640 default:
65f38f15 14641 break;
5bd4f169 14642
3b421ab3
AM
14643 case R_PPC64_TOCSAVE:
14644 if (relocation + addend == (rel->r_offset
14645 + input_section->output_offset
14646 + input_section->output_section->vma)
14647 && tocsave_find (htab, NO_INSERT,
14648 &local_syms, rel, input_bfd))
14649 {
14650 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14651 if (insn == NOP
14652 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
14653 bfd_put_32 (input_bfd,
14654 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
14655 contents + rel->r_offset);
14656 }
14657 break;
14658
65f38f15
AM
14659 /* Branch taken prediction relocations. */
14660 case R_PPC64_ADDR14_BRTAKEN:
14661 case R_PPC64_REL14_BRTAKEN:
cedb70c5 14662 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
1a0670f3 14663 /* Fall through. */
65f38f15 14664
86c76c7b 14665 /* Branch not taken prediction relocations. */
65f38f15
AM
14666 case R_PPC64_ADDR14_BRNTAKEN:
14667 case R_PPC64_REL14_BRNTAKEN:
95f0d0d2 14668 insn |= bfd_get_32 (input_bfd,
411e1bfb 14669 contents + rel->r_offset) & ~(0x01 << 21);
1a0670f3 14670 /* Fall through. */
86c76c7b 14671
b25116a9
AM
14672 case R_PPC64_REL14:
14673 max_br_offset = 1 << 15;
1a0670f3 14674 /* Fall through. */
5bd4f169 14675
65f38f15 14676 case R_PPC64_REL24:
23cedd1d 14677 case R_PPC64_PLTCALL:
ad8e1ba5
AM
14678 /* Calls to functions with a different TOC, such as calls to
14679 shared objects, need to alter the TOC pointer. This is
14680 done using a linkage stub. A REL24 branching to these
14681 linkage stubs needs to be followed by a nop, as the nop
14682 will be replaced with an instruction to restore the TOC
14683 base pointer. */
8387904d 14684 fdh = h;
b31867b6
AM
14685 if (h != NULL
14686 && h->oh != NULL
14687 && h->oh->is_func_descriptor)
14688 fdh = ppc_follow_link (h->oh);
31c76678
DK
14689 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
14690 htab);
23cedd1d
AM
14691 if (r_type == R_PPC64_PLTCALL
14692 && stub_entry != NULL
14693 && (stub_entry->stub_type == ppc_stub_plt_call
14694 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
14695 stub_entry = NULL;
14696
6abec6bc 14697 if (stub_entry != NULL
ad8e1ba5 14698 && (stub_entry->stub_type == ppc_stub_plt_call
794e51c0 14699 || stub_entry->stub_type == ppc_stub_plt_call_r2save
ad8e1ba5
AM
14700 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
14701 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
41bd81ab 14702 {
b25116a9 14703 bfd_boolean can_plt_call = FALSE;
721956f4 14704
6e1816be
AM
14705 if (stub_entry->stub_type == ppc_stub_plt_call
14706 && !htab->opd_abi
14707 && htab->params->plt_localentry0 != 0
14708 && is_elfv2_localentry0 (&h->elf))
14709 {
14710 /* The function doesn't use or change r2. */
14711 can_plt_call = TRUE;
14712 }
14713
f378ab09 14714 /* All of these stubs may modify r2, so there must be a
ba8ca3e7
AM
14715 branch and link followed by a nop. The nop is
14716 replaced by an insn to restore r2. */
6e1816be 14717 else if (rel->r_offset + 8 <= input_section->size)
41bd81ab 14718 {
ba8ca3e7
AM
14719 unsigned long br;
14720
14721 br = bfd_get_32 (input_bfd,
14722 contents + rel->r_offset);
14723 if ((br & 1) != 0)
41bd81ab 14724 {
ba8ca3e7
AM
14725 unsigned long nop;
14726
14727 nop = bfd_get_32 (input_bfd,
14728 contents + rel->r_offset + 4);
23cedd1d
AM
14729 if (nop == LD_R2_0R1 + STK_TOC (htab))
14730 can_plt_call = TRUE;
14731 else if (nop == NOP
14732 || nop == CROR_151515
14733 || nop == CROR_313131)
a7f2871e 14734 {
ba8ca3e7
AM
14735 if (h != NULL
14736 && (h == htab->tls_get_addr_fd
14737 || h == htab->tls_get_addr)
7c9cf415 14738 && htab->params->tls_get_addr_opt)
ba8ca3e7
AM
14739 {
14740 /* Special stub used, leave nop alone. */
14741 }
14742 else
a078d95a
AM
14743 bfd_put_32 (input_bfd,
14744 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7
AM
14745 contents + rel->r_offset + 4);
14746 can_plt_call = TRUE;
a7f2871e 14747 }
41bd81ab 14748 }
5bd4f169 14749 }
721956f4 14750
ba8ca3e7 14751 if (!can_plt_call && h != NULL)
721956f4 14752 {
ba8ca3e7
AM
14753 const char *name = h->elf.root.root.string;
14754
14755 if (*name == '.')
14756 ++name;
14757
14758 if (strncmp (name, "__libc_start_main", 17) == 0
14759 && (name[17] == 0 || name[17] == '@'))
6ab189d5 14760 {
ba8ca3e7
AM
14761 /* Allow crt1 branch to go via a toc adjusting
14762 stub. Other calls that never return could do
14763 the same, if we could detect such. */
b25116a9 14764 can_plt_call = TRUE;
6ab189d5 14765 }
ba8ca3e7
AM
14766 }
14767
14768 if (!can_plt_call)
14769 {
14770 /* g++ as of 20130507 emits self-calls without a
14771 following nop. This is arguably wrong since we
14772 have conflicting information. On the one hand a
14773 global symbol and on the other a local call
14774 sequence, but don't error for this special case.
14775 It isn't possible to cheaply verify we have
14776 exactly such a call. Allow all calls to the same
14777 section. */
14778 asection *code_sec = sec;
14779
14780 if (get_opd_info (sec) != NULL)
ad8e1ba5 14781 {
ba8ca3e7
AM
14782 bfd_vma off = (relocation + addend
14783 - sec->output_section->vma
14784 - sec->output_offset);
bc30df16 14785
ba8ca3e7 14786 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 14787 }
ba8ca3e7
AM
14788 if (code_sec == input_section)
14789 can_plt_call = TRUE;
14790 }
14791
14792 if (!can_plt_call)
14793 {
4805fc55
AM
14794 if (stub_entry->stub_type == ppc_stub_plt_call
14795 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14796 info->callbacks->einfo
695344c0 14797 /* xgettext:c-format */
c1c8c1ef 14798 (_("%H: call to `%pT' lacks nop, can't restore toc; "
4805fc55
AM
14799 "recompile with -fPIC\n"),
14800 input_bfd, input_section, rel->r_offset, sym_name);
14801 else
14802 info->callbacks->einfo
695344c0 14803 /* xgettext:c-format */
c1c8c1ef 14804 (_("%H: call to `%pT' lacks nop, can't restore toc; "
4805fc55
AM
14805 "(-mcmodel=small toc adjust stub)\n"),
14806 input_bfd, input_section, rel->r_offset, sym_name);
ba8ca3e7
AM
14807
14808 bfd_set_error (bfd_error_bad_value);
14809 ret = FALSE;
721956f4
AM
14810 }
14811
b25116a9 14812 if (can_plt_call
794e51c0
AM
14813 && (stub_entry->stub_type == ppc_stub_plt_call
14814 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
b25116a9
AM
14815 unresolved_reloc = FALSE;
14816 }
14817
6abec6bc
AM
14818 if ((stub_entry == NULL
14819 || stub_entry->stub_type == ppc_stub_long_branch
14820 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
14821 && get_opd_info (sec) != NULL)
14822 {
14823 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
14824 bfd_vma off = (relocation + addend
14825 - sec->output_section->vma
14826 - sec->output_offset);
aef36ac1 14827 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
14828 if (dest != (bfd_vma) -1)
14829 {
14830 relocation = dest;
14831 addend = 0;
bc30df16 14832 reloc_dest = DEST_OPD;
8387904d
AM
14833 }
14834 }
14835
b25116a9
AM
14836 /* If the branch is out of reach we ought to have a long
14837 branch stub. */
14838 from = (rel->r_offset
14839 + input_section->output_offset
14840 + input_section->output_section->vma);
14841
6911b7dc
AM
14842 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
14843 ? fdh->elf.other
14844 : sym->st_other);
14845
6abec6bc
AM
14846 if (stub_entry != NULL
14847 && (stub_entry->stub_type == ppc_stub_long_branch
14848 || stub_entry->stub_type == ppc_stub_plt_branch)
14849 && (r_type == R_PPC64_ADDR14_BRTAKEN
14850 || r_type == R_PPC64_ADDR14_BRNTAKEN
14851 || (relocation + addend - from + max_br_offset
14852 < 2 * max_br_offset)))
14853 /* Don't use the stub if this branch is in range. */
14854 stub_entry = NULL;
b25116a9
AM
14855
14856 if (stub_entry != NULL)
14857 {
14858 /* Munge up the value and addend so that we call the stub
14859 rather than the procedure directly. */
a4b6fadd
AM
14860 asection *stub_sec = stub_entry->group->stub_sec;
14861
14862 if (stub_entry->stub_type == ppc_stub_save_res)
14863 relocation += (stub_sec->output_offset
14864 + stub_sec->output_section->vma
14865 + stub_sec->size - htab->sfpr->size
14866 - htab->sfpr->output_offset
14867 - htab->sfpr->output_section->vma);
14868 else
14869 relocation = (stub_entry->stub_offset
14870 + stub_sec->output_offset
14871 + stub_sec->output_section->vma);
b25116a9 14872 addend = 0;
bc30df16 14873 reloc_dest = DEST_STUB;
3b421ab3 14874
954b63d4 14875 if ((stub_entry->stub_type == ppc_stub_plt_call
794e51c0
AM
14876 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14877 && (ALWAYS_EMIT_R2SAVE
14878 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
3b421ab3
AM
14879 && rel + 1 < relend
14880 && rel[1].r_offset == rel->r_offset + 4
14881 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
14882 relocation += 4;
b25116a9
AM
14883 }
14884
14885 if (insn != 0)
14886 {
794e51c0 14887 if (is_isa_v2)
721956f4 14888 {
b25116a9
AM
14889 /* Set 'a' bit. This is 0b00010 in BO field for branch
14890 on CR(BI) insns (BO == 001at or 011at), and 0b01000
14891 for branch on CTR insns (BO == 1a00t or 1a01t). */
14892 if ((insn & (0x14 << 21)) == (0x04 << 21))
14893 insn |= 0x02 << 21;
14894 else if ((insn & (0x14 << 21)) == (0x10 << 21))
14895 insn |= 0x08 << 21;
14896 else
14897 break;
14898 }
14899 else
14900 {
14901 /* Invert 'y' bit if not the default. */
4cc603a5 14902 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 14903 insn ^= 0x01 << 21;
721956f4 14904 }
b25116a9 14905
95f0d0d2 14906 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
5bd4f169 14907 }
e86ce104 14908
06da1e8e
AM
14909 /* NOP out calls to undefined weak functions.
14910 We can thus call a weak function without first
14911 checking whether the function is defined. */
b25116a9 14912 else if (h != NULL
039b3fef 14913 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 14914 && h->elf.dynindx == -1
b25116a9
AM
14915 && r_type == R_PPC64_REL24
14916 && relocation == 0
4cc603a5 14917 && addend == 0)
e86ce104 14918 {
95f0d0d2 14919 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
c316a17c 14920 goto copy_reloc;
e86ce104 14921 }
65f38f15
AM
14922 break;
14923 }
5bd4f169 14924
65f38f15 14925 /* Set `addend'. */
411e1bfb 14926 tls_type = 0;
23cedd1d 14927 save_unresolved_reloc = unresolved_reloc;
65f38f15
AM
14928 switch (r_type)
14929 {
14930 default:
cf97bcb0
AM
14931 /* xgettext:c-format */
14932 _bfd_error_handler (_("%pB: %s unsupported"),
14933 input_bfd, ppc64_elf_howto_table[r_type]->name);
5bd4f169 14934
65f38f15 14935 bfd_set_error (bfd_error_bad_value);
b34976b6 14936 ret = FALSE;
c316a17c 14937 goto copy_reloc;
5bd4f169 14938
65f38f15 14939 case R_PPC64_NONE:
411e1bfb 14940 case R_PPC64_TLS:
727fc41e
AM
14941 case R_PPC64_TLSGD:
14942 case R_PPC64_TLSLD:
3b421ab3 14943 case R_PPC64_TOCSAVE:
04c9666a
AM
14944 case R_PPC64_GNU_VTINHERIT:
14945 case R_PPC64_GNU_VTENTRY:
006589cf 14946 case R_PPC64_ENTRY:
c316a17c 14947 goto copy_reloc;
5bd4f169
AM
14948
14949 /* GOT16 relocations. Like an ADDR16 using the symbol's
14950 address in the GOT as relocation value instead of the
411e1bfb 14951 symbol's value itself. Also, create a GOT entry for the
5bd4f169 14952 symbol and put the symbol value there. */
411e1bfb
AM
14953 case R_PPC64_GOT_TLSGD16:
14954 case R_PPC64_GOT_TLSGD16_LO:
14955 case R_PPC64_GOT_TLSGD16_HI:
14956 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 14957 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
14958 goto dogot;
14959
14960 case R_PPC64_GOT_TLSLD16:
14961 case R_PPC64_GOT_TLSLD16_LO:
14962 case R_PPC64_GOT_TLSLD16_HI:
14963 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 14964 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
14965 goto dogot;
14966
14967 case R_PPC64_GOT_TPREL16_DS:
14968 case R_PPC64_GOT_TPREL16_LO_DS:
14969 case R_PPC64_GOT_TPREL16_HI:
14970 case R_PPC64_GOT_TPREL16_HA:
14971 tls_type = TLS_TLS | TLS_TPREL;
14972 goto dogot;
14973
14974 case R_PPC64_GOT_DTPREL16_DS:
14975 case R_PPC64_GOT_DTPREL16_LO_DS:
14976 case R_PPC64_GOT_DTPREL16_HI:
14977 case R_PPC64_GOT_DTPREL16_HA:
14978 tls_type = TLS_TLS | TLS_DTPREL;
14979 goto dogot;
14980
65f38f15
AM
14981 case R_PPC64_GOT16:
14982 case R_PPC64_GOT16_LO:
14983 case R_PPC64_GOT16_HI:
14984 case R_PPC64_GOT16_HA:
14985 case R_PPC64_GOT16_DS:
14986 case R_PPC64_GOT16_LO_DS:
411e1bfb 14987 dogot:
5bd4f169
AM
14988 {
14989 /* Relocation is to the entry for this symbol in the global
14990 offset table. */
e717da7e 14991 asection *got;
d881513a 14992 bfd_vma *offp;
5bd4f169 14993 bfd_vma off;
d881513a 14994 unsigned long indx = 0;
927be08e 14995 struct got_entry *ent;
65f38f15 14996
d881513a
AM
14997 if (tls_type == (TLS_TLS | TLS_LD)
14998 && (h == NULL
f5385ebf 14999 || !h->elf.def_dynamic))
927be08e 15000 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 15001 else
5bd4f169 15002 {
d881513a
AM
15003 if (h != NULL)
15004 {
f0158f44
AM
15005 if (!htab->elf.dynamic_sections_created
15006 || h->elf.dynindx == -1
15007 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
21d68fcd 15008 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
d881513a
AM
15009 /* This is actually a static link, or it is a
15010 -Bsymbolic link and the symbol is defined
15011 locally, or the symbol was forced to be local
15012 because of a version file. */
15013 ;
15014 else
15015 {
039b3fef 15016 indx = h->elf.dynindx;
d881513a
AM
15017 unresolved_reloc = FALSE;
15018 }
039b3fef 15019 ent = h->elf.got.glist;
d881513a 15020 }
411e1bfb 15021 else
5bd4f169 15022 {
d881513a
AM
15023 if (local_got_ents == NULL)
15024 abort ();
15025 ent = local_got_ents[r_symndx];
5bd4f169 15026 }
d881513a
AM
15027
15028 for (; ent != NULL; ent = ent->next)
31c76678 15029 if (ent->addend == orig_rel.r_addend
e717da7e 15030 && ent->owner == input_bfd
d881513a
AM
15031 && ent->tls_type == tls_type)
15032 break;
5bd4f169 15033 }
411e1bfb 15034
927be08e
AM
15035 if (ent == NULL)
15036 abort ();
15037 if (ent->is_indirect)
15038 ent = ent->got.ent;
15039 offp = &ent->got.offset;
15040 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
15041 if (got == NULL)
15042 abort ();
15043
411e1bfb
AM
15044 /* The offset must always be a multiple of 8. We use the
15045 least significant bit to record whether we have already
15046 processed this entry. */
d881513a 15047 off = *offp;
411e1bfb
AM
15048 if ((off & 1) != 0)
15049 off &= ~1;
5bd4f169
AM
15050 else
15051 {
411e1bfb
AM
15052 /* Generate relocs for the dynamic linker, except in
15053 the case of TLSLD where we'll use one entry per
15054 module. */
25f23106
AM
15055 asection *relgot;
15056 bfd_boolean ifunc;
e717da7e 15057
d881513a 15058 *offp = off | 1;
25f23106
AM
15059 relgot = NULL;
15060 ifunc = (h != NULL
15061 ? h->elf.type == STT_GNU_IFUNC
15062 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 15063 if (ifunc)
82e66161
AM
15064 {
15065 relgot = htab->elf.irelplt;
15066 if (indx == 0)
15067 htab->local_ifunc_resolver = 1;
15068 else if (is_static_defined (&h->elf))
15069 htab->maybe_local_ifunc_resolver = 1;
15070 }
f0158f44
AM
15071 else if (indx != 0
15072 || (bfd_link_pic (info)
15073 && (h == NULL
21d68fcd 15074 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf)
f0158f44 15075 || (tls_type == (TLS_TLS | TLS_LD)
f15d0b54
AM
15076 && !h->elf.def_dynamic))
15077 && !(tls_type == (TLS_TLS | TLS_TPREL)
15078 && bfd_link_executable (info)
15079 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
19e08130 15080 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 15081 if (relgot != NULL)
5bd4f169 15082 {
e717da7e
AM
15083 outrel.r_offset = (got->output_section->vma
15084 + got->output_offset
411e1bfb 15085 + off);
4cc603a5 15086 outrel.r_addend = addend;
d881513a 15087 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 15088 {
411e1bfb 15089 outrel.r_addend = 0;
e515b051 15090 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
15091 if (tls_type == (TLS_TLS | TLS_GD))
15092 {
e717da7e
AM
15093 loc = relgot->contents;
15094 loc += (relgot->reloc_count++
d881513a
AM
15095 * sizeof (Elf64_External_Rela));
15096 bfd_elf64_swap_reloca_out (output_bfd,
15097 &outrel, loc);
e515b051 15098 outrel.r_offset += 8;
4cc603a5 15099 outrel.r_addend = addend;
d881513a
AM
15100 outrel.r_info
15101 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 15102 }
411e1bfb 15103 }
951fd09b 15104 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 15105 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 15106 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 15107 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
15108 else if (indx != 0)
15109 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
15110 else
81407a69 15111 {
25f23106
AM
15112 if (ifunc)
15113 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15114 else
15115 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
15116
15117 /* Write the .got section contents for the sake
15118 of prelink. */
e717da7e 15119 loc = got->contents + off;
23fbd6fa
JJ
15120 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
15121 loc);
81407a69 15122 }
81407a69
AM
15123
15124 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
15125 {
15126 outrel.r_addend += relocation;
15127 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
989f9879
AM
15128 {
15129 if (htab->elf.tls_sec == NULL)
15130 outrel.r_addend = 0;
15131 else
15132 outrel.r_addend -= htab->elf.tls_sec->vma;
15133 }
e515b051 15134 }
e717da7e
AM
15135 loc = relgot->contents;
15136 loc += (relgot->reloc_count++
411e1bfb
AM
15137 * sizeof (Elf64_External_Rela));
15138 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
15139 }
15140
ad8e1ba5 15141 /* Init the .got section contents here if we're not
81407a69 15142 emitting a reloc. */
d881513a 15143 else
411e1bfb 15144 {
4cc603a5 15145 relocation += addend;
f0158f44 15146 if (tls_type != 0)
411e1bfb 15147 {
989f9879
AM
15148 if (htab->elf.tls_sec == NULL)
15149 relocation = 0;
15150 else
15151 {
f0158f44
AM
15152 if (tls_type & TLS_LD)
15153 relocation = 0;
15154 else
15155 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
676ee2b5 15156 if (tls_type & TLS_TPREL)
989f9879
AM
15157 relocation += DTP_OFFSET - TP_OFFSET;
15158 }
5bd4f169 15159
f0158f44 15160 if (tls_type & (TLS_GD | TLS_LD))
7b609f53
AM
15161 {
15162 bfd_put_64 (output_bfd, relocation,
e717da7e 15163 got->contents + off + 8);
676ee2b5 15164 relocation = 1;
7b609f53 15165 }
411e1bfb
AM
15166 }
15167 bfd_put_64 (output_bfd, relocation,
e717da7e 15168 got->contents + off);
5bd4f169
AM
15169 }
15170 }
15171
65f38f15
AM
15172 if (off >= (bfd_vma) -2)
15173 abort ();
15174
bf102f86 15175 relocation = got->output_section->vma + got->output_offset + off;
6f20ed8a 15176 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
5bd4f169 15177 }
65f38f15
AM
15178 break;
15179
15180 case R_PPC64_PLT16_HA:
15181 case R_PPC64_PLT16_HI:
15182 case R_PPC64_PLT16_LO:
08be3224 15183 case R_PPC64_PLT16_LO_DS:
65f38f15
AM
15184 case R_PPC64_PLT32:
15185 case R_PPC64_PLT64:
23cedd1d
AM
15186 case R_PPC64_PLTSEQ:
15187 case R_PPC64_PLTCALL:
65f38f15
AM
15188 /* Relocation is to the entry for this symbol in the
15189 procedure linkage table. */
23cedd1d 15190 unresolved_reloc = TRUE;
cbf95972
AM
15191 {
15192 struct plt_entry **plt_list = NULL;
15193 if (h != NULL)
15194 plt_list = &h->elf.plt.plist;
15195 else if (local_got_ents != NULL)
15196 {
15197 struct plt_entry **local_plt = (struct plt_entry **)
15198 (local_got_ents + symtab_hdr->sh_info);
2d7ad24e 15199 plt_list = local_plt + r_symndx;
cbf95972
AM
15200 }
15201 if (plt_list)
15202 {
15203 struct plt_entry *ent;
65f38f15 15204
cbf95972
AM
15205 for (ent = *plt_list; ent != NULL; ent = ent->next)
15206 if (ent->plt.offset != (bfd_vma) -1
15207 && ent->addend == orig_rel.r_addend)
15208 {
15209 asection *plt;
08be3224 15210 bfd_vma got;
cbf95972
AM
15211
15212 plt = htab->elf.splt;
15213 if (!htab->elf.dynamic_sections_created
15214 || h == NULL
15215 || h->elf.dynindx == -1)
2d7ad24e
AM
15216 {
15217 if (h != NULL
15218 ? h->elf.type == STT_GNU_IFUNC
15219 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15220 plt = htab->elf.iplt;
15221 else
15222 plt = htab->pltlocal;
15223 }
15224 relocation = (plt->output_section->vma
15225 + plt->output_offset
15226 + ent->plt.offset);
08be3224
AM
15227 if (r_type == R_PPC64_PLT16_HA
15228 || r_type ==R_PPC64_PLT16_HI
15229 || r_type ==R_PPC64_PLT16_LO
15230 || r_type ==R_PPC64_PLT16_LO_DS)
15231 {
15232 got = (elf_gp (output_bfd)
15233 + htab->sec_info[input_section->id].toc_off);
15234 relocation -= got;
15235 }
cbf95972
AM
15236 addend = 0;
15237 unresolved_reloc = FALSE;
15238 break;
15239 }
15240 }
15241 }
65f38f15 15242 break;
5bd4f169 15243
0b13192e
AM
15244 case R_PPC64_TOC:
15245 /* Relocation value is TOC base. */
15246 relocation = TOCstart;
cf35638d 15247 if (r_symndx == STN_UNDEF)
6f20ed8a 15248 relocation += htab->sec_info[input_section->id].toc_off;
8517fae7
AM
15249 else if (unresolved_reloc)
15250 ;
6f20ed8a
AM
15251 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
15252 relocation += htab->sec_info[sec->id].toc_off;
0b13192e
AM
15253 else
15254 unresolved_reloc = TRUE;
ab96bf03 15255 goto dodyn;
0b13192e 15256
5bd4f169
AM
15257 /* TOC16 relocs. We want the offset relative to the TOC base,
15258 which is the address of the start of the TOC plus 0x8000.
15259 The TOC consists of sections .got, .toc, .tocbss, and .plt,
15260 in this order. */
65f38f15
AM
15261 case R_PPC64_TOC16:
15262 case R_PPC64_TOC16_LO:
15263 case R_PPC64_TOC16_HI:
15264 case R_PPC64_TOC16_DS:
15265 case R_PPC64_TOC16_LO_DS:
15266 case R_PPC64_TOC16_HA:
6f20ed8a 15267 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
5bd4f169
AM
15268 break;
15269
15270 /* Relocate against the beginning of the section. */
65f38f15
AM
15271 case R_PPC64_SECTOFF:
15272 case R_PPC64_SECTOFF_LO:
15273 case R_PPC64_SECTOFF_HI:
15274 case R_PPC64_SECTOFF_DS:
15275 case R_PPC64_SECTOFF_LO_DS:
15276 case R_PPC64_SECTOFF_HA:
4ce794b7 15277 if (sec != NULL)
65f38f15 15278 addend -= sec->output_section->vma;
5bd4f169
AM
15279 break;
15280
25f23106
AM
15281 case R_PPC64_REL16:
15282 case R_PPC64_REL16_LO:
15283 case R_PPC64_REL16_HI:
15284 case R_PPC64_REL16_HA:
a680de9a 15285 case R_PPC64_REL16DX_HA:
25f23106
AM
15286 break;
15287
721956f4
AM
15288 case R_PPC64_REL14:
15289 case R_PPC64_REL14_BRNTAKEN:
15290 case R_PPC64_REL14_BRTAKEN:
5d1634d7
AM
15291 case R_PPC64_REL24:
15292 break;
15293
411e1bfb
AM
15294 case R_PPC64_TPREL16:
15295 case R_PPC64_TPREL16_LO:
15296 case R_PPC64_TPREL16_HI:
15297 case R_PPC64_TPREL16_HA:
15298 case R_PPC64_TPREL16_DS:
15299 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
15300 case R_PPC64_TPREL16_HIGH:
15301 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
15302 case R_PPC64_TPREL16_HIGHER:
15303 case R_PPC64_TPREL16_HIGHERA:
15304 case R_PPC64_TPREL16_HIGHEST:
15305 case R_PPC64_TPREL16_HIGHESTA:
766bc656
AM
15306 if (h != NULL
15307 && h->elf.root.type == bfd_link_hash_undefweak
15308 && h->elf.dynindx == -1)
15309 {
15310 /* Make this relocation against an undefined weak symbol
15311 resolve to zero. This is really just a tweak, since
15312 code using weak externs ought to check that they are
15313 defined before using them. */
15314 bfd_byte *p = contents + rel->r_offset - d_offset;
15315
95f0d0d2 15316 insn = bfd_get_32 (input_bfd, p);
766bc656
AM
15317 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
15318 if (insn != 0)
95f0d0d2 15319 bfd_put_32 (input_bfd, insn, p);
766bc656
AM
15320 break;
15321 }
989f9879
AM
15322 if (htab->elf.tls_sec != NULL)
15323 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7c8bbca5
AM
15324 /* The TPREL16 relocs shouldn't really be used in shared
15325 libs or with non-local symbols as that will result in
15326 DT_TEXTREL being set, but support them anyway. */
15327 goto dodyn;
411e1bfb
AM
15328
15329 case R_PPC64_DTPREL16:
15330 case R_PPC64_DTPREL16_LO:
15331 case R_PPC64_DTPREL16_HI:
15332 case R_PPC64_DTPREL16_HA:
15333 case R_PPC64_DTPREL16_DS:
15334 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
15335 case R_PPC64_DTPREL16_HIGH:
15336 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
15337 case R_PPC64_DTPREL16_HIGHER:
15338 case R_PPC64_DTPREL16_HIGHERA:
15339 case R_PPC64_DTPREL16_HIGHEST:
15340 case R_PPC64_DTPREL16_HIGHESTA:
989f9879
AM
15341 if (htab->elf.tls_sec != NULL)
15342 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
15343 break;
15344
45965137
AM
15345 case R_PPC64_ADDR64_LOCAL:
15346 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
15347 ? h->elf.other
15348 : sym->st_other);
15349 break;
15350
e515b051
AM
15351 case R_PPC64_DTPMOD64:
15352 relocation = 1;
15353 addend = 0;
15354 goto dodyn;
15355
411e1bfb 15356 case R_PPC64_TPREL64:
989f9879
AM
15357 if (htab->elf.tls_sec != NULL)
15358 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
15359 goto dodyn;
15360
15361 case R_PPC64_DTPREL64:
989f9879
AM
15362 if (htab->elf.tls_sec != NULL)
15363 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
1a0670f3 15364 /* Fall through. */
411e1bfb 15365
65f38f15
AM
15366 /* Relocations that may need to be propagated if this is a
15367 dynamic object. */
04c9666a 15368 case R_PPC64_REL30:
65f38f15
AM
15369 case R_PPC64_REL32:
15370 case R_PPC64_REL64:
15371 case R_PPC64_ADDR14:
15372 case R_PPC64_ADDR14_BRNTAKEN:
15373 case R_PPC64_ADDR14_BRTAKEN:
15374 case R_PPC64_ADDR16:
15375 case R_PPC64_ADDR16_DS:
15376 case R_PPC64_ADDR16_HA:
15377 case R_PPC64_ADDR16_HI:
f9c6b907
AM
15378 case R_PPC64_ADDR16_HIGH:
15379 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
15380 case R_PPC64_ADDR16_HIGHER:
15381 case R_PPC64_ADDR16_HIGHERA:
15382 case R_PPC64_ADDR16_HIGHEST:
15383 case R_PPC64_ADDR16_HIGHESTA:
15384 case R_PPC64_ADDR16_LO:
15385 case R_PPC64_ADDR16_LO_DS:
15386 case R_PPC64_ADDR24:
65f38f15
AM
15387 case R_PPC64_ADDR32:
15388 case R_PPC64_ADDR64:
15389 case R_PPC64_UADDR16:
15390 case R_PPC64_UADDR32:
15391 case R_PPC64_UADDR64:
411e1bfb 15392 dodyn:
5d1634d7 15393 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
15394 break;
15395
41bd81ab
AM
15396 if (NO_OPD_RELOCS && is_opd)
15397 break;
15398
8a9e8e72 15399 if (bfd_link_pic (info)
b1b07054
AM
15400 ? ((h == NULL
15401 || h->dyn_relocs != NULL)
15402 && ((h != NULL && pc_dynrelocs (h))
15403 || must_be_dyn_reloc (info, r_type)))
8a9e8e72
AM
15404 : (h != NULL
15405 ? h->dyn_relocs != NULL
d311bc8b 15406 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
65f38f15 15407 {
b34976b6 15408 bfd_boolean skip, relocate;
65f38f15 15409 asection *sreloc;
1cf1f670 15410 bfd_vma out_off;
82e66161 15411 long indx = 0;
65f38f15
AM
15412
15413 /* When generating a dynamic object, these relocations
15414 are copied into the output file to be resolved at run
15415 time. */
15416
b34976b6
AM
15417 skip = FALSE;
15418 relocate = FALSE;
65f38f15 15419
1cf1f670
AM
15420 out_off = _bfd_elf_section_offset (output_bfd, info,
15421 input_section, rel->r_offset);
15422 if (out_off == (bfd_vma) -1)
b34976b6 15423 skip = TRUE;
1cf1f670 15424 else if (out_off == (bfd_vma) -2)
b34976b6 15425 skip = TRUE, relocate = TRUE;
1cf1f670
AM
15426 out_off += (input_section->output_section->vma
15427 + input_section->output_offset);
15428 outrel.r_offset = out_off;
411e1bfb 15429 outrel.r_addend = rel->r_addend;
65f38f15 15430
1cf1f670
AM
15431 /* Optimize unaligned reloc use. */
15432 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
15433 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
15434 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
15435 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
15436 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
15437 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
15438 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
15439 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
15440 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
15441
65f38f15 15442 if (skip)
0bb2d96a 15443 memset (&outrel, 0, sizeof outrel);
afe397ea 15444 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
15445 && !is_opd
15446 && r_type != R_PPC64_TOC)
14acf4dc 15447 {
82e66161
AM
15448 indx = h->elf.dynindx;
15449 BFD_ASSERT (indx != -1);
15450 outrel.r_info = ELF64_R_INFO (indx, r_type);
14acf4dc 15451 }
65f38f15
AM
15452 else
15453 {
41bd81ab
AM
15454 /* This symbol is local, or marked to become local,
15455 or this is an opd section reloc which must point
15456 at a local function. */
65f38f15 15457 outrel.r_addend += relocation;
e86ce104 15458 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 15459 {
3fad3c7c 15460 if (is_opd && h != NULL)
afbe61cf
AM
15461 {
15462 /* Lie about opd entries. This case occurs
15463 when building shared libraries and we
15464 reference a function in another shared
3fad3c7c
AM
15465 lib. The same thing happens for a weak
15466 definition in an application that's
15467 overridden by a strong definition in a
15468 shared lib. (I believe this is a generic
15469 bug in binutils handling of weak syms.)
15470 In these cases we won't use the opd
1e2f5b6e 15471 entry in this lib. */
b34976b6 15472 unresolved_reloc = FALSE;
afbe61cf 15473 }
25f23106
AM
15474 if (!is_opd
15475 && r_type == R_PPC64_ADDR64
15476 && (h != NULL
15477 ? h->elf.type == STT_GNU_IFUNC
15478 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
15479 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15480 else
15481 {
15482 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 15483
25f23106
AM
15484 /* We need to relocate .opd contents for ld.so.
15485 Prelink also wants simple and consistent rules
15486 for relocs. This make all RELATIVE relocs have
15487 *r_offset equal to r_addend. */
15488 relocate = TRUE;
15489 }
65f38f15
AM
15490 }
15491 else
15492 {
25f23106
AM
15493 if (h != NULL
15494 ? h->elf.type == STT_GNU_IFUNC
15495 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15496 {
25f53a85 15497 info->callbacks->einfo
695344c0 15498 /* xgettext:c-format */
174d0a74 15499 (_("%H: %s for indirect "
c1c8c1ef 15500 "function `%pT' unsupported\n"),
25f53a85 15501 input_bfd, input_section, rel->r_offset,
25f23106
AM
15502 ppc64_elf_howto_table[r_type]->name,
15503 sym_name);
15504 ret = FALSE;
15505 }
cf35638d 15506 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
15507 ;
15508 else if (sec == NULL || sec->owner == NULL)
15509 {
15510 bfd_set_error (bfd_error_bad_value);
b34976b6 15511 return FALSE;
65f38f15
AM
15512 }
15513 else
15514 {
15515 asection *osec;
15516
15517 osec = sec->output_section;
15518 indx = elf_section_data (osec)->dynindx;
15519
74541ad4
AM
15520 if (indx == 0)
15521 {
15522 if ((osec->flags & SEC_READONLY) == 0
15523 && htab->elf.data_index_section != NULL)
15524 osec = htab->elf.data_index_section;
15525 else
15526 osec = htab->elf.text_index_section;
15527 indx = elf_section_data (osec)->dynindx;
15528 }
15529 BFD_ASSERT (indx != 0);
15530
65f38f15
AM
15531 /* We are turning this relocation into one
15532 against a section symbol, so subtract out
15533 the output section's address but not the
15534 offset of the input section in the output
15535 section. */
15536 outrel.r_addend -= osec->vma;
15537 }
15538
15539 outrel.r_info = ELF64_R_INFO (indx, r_type);
15540 }
15541 }
15542
15543 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
15544 if (h != NULL
15545 ? h->elf.type == STT_GNU_IFUNC
15546 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
82e66161
AM
15547 {
15548 sreloc = htab->elf.irelplt;
15549 if (indx == 0)
15550 htab->local_ifunc_resolver = 1;
15551 else if (is_static_defined (&h->elf))
15552 htab->maybe_local_ifunc_resolver = 1;
15553 }
65f38f15
AM
15554 if (sreloc == NULL)
15555 abort ();
15556
dfbb6ac9
AM
15557 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
15558 >= sreloc->size)
15559 abort ();
947216bf
AM
15560 loc = sreloc->contents;
15561 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
15562 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
15563
15564 /* If this reloc is against an external symbol, it will
15565 be computed at runtime, so there's no need to do
81407a69
AM
15566 anything now. However, for the sake of prelink ensure
15567 that the section contents are a known value. */
65f38f15 15568 if (! relocate)
81407a69
AM
15569 {
15570 unresolved_reloc = FALSE;
15571 /* The value chosen here is quite arbitrary as ld.so
15572 ignores section contents except for the special
15573 case of .opd where the contents might be accessed
15574 before relocation. Choose zero, as that won't
15575 cause reloc overflow. */
15576 relocation = 0;
15577 addend = 0;
15578 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
15579 to improve backward compatibility with older
15580 versions of ld. */
15581 if (r_type == R_PPC64_ADDR64)
15582 addend = outrel.r_addend;
15583 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 15584 else if (ppc64_elf_howto_table[r_type]->pc_relative)
f0158f44 15585 addend = outrel.r_offset;
81407a69 15586 }
65f38f15 15587 }
5bd4f169
AM
15588 break;
15589
65f38f15
AM
15590 case R_PPC64_COPY:
15591 case R_PPC64_GLOB_DAT:
15592 case R_PPC64_JMP_SLOT:
25f23106 15593 case R_PPC64_JMP_IREL:
65f38f15
AM
15594 case R_PPC64_RELATIVE:
15595 /* We shouldn't ever see these dynamic relocs in relocatable
15596 files. */
ae9a127f 15597 /* Fall through. */
65f38f15
AM
15598
15599 case R_PPC64_PLTGOT16:
15600 case R_PPC64_PLTGOT16_DS:
15601 case R_PPC64_PLTGOT16_HA:
15602 case R_PPC64_PLTGOT16_HI:
15603 case R_PPC64_PLTGOT16_LO:
15604 case R_PPC64_PLTGOT16_LO_DS:
15605 case R_PPC64_PLTREL32:
15606 case R_PPC64_PLTREL64:
15607 /* These ones haven't been implemented yet. */
15608
25f53a85 15609 info->callbacks->einfo
695344c0 15610 /* xgettext:c-format */
c1c8c1ef 15611 (_("%P: %pB: %s is not supported for `%pT'\n"),
d003868e 15612 input_bfd,
4ce794b7 15613 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
15614
15615 bfd_set_error (bfd_error_invalid_operation);
b34976b6 15616 ret = FALSE;
c316a17c 15617 goto copy_reloc;
65f38f15 15618 }
5bd4f169 15619
67f0cbdb
AM
15620 /* Multi-instruction sequences that access the TOC can be
15621 optimized, eg. addis ra,r2,0; addi rb,ra,x;
07d6d2b8 15622 to nop; addi rb,r2,x; */
67f0cbdb
AM
15623 switch (r_type)
15624 {
15625 default:
15626 break;
15627
15628 case R_PPC64_GOT_TLSLD16_HI:
15629 case R_PPC64_GOT_TLSGD16_HI:
15630 case R_PPC64_GOT_TPREL16_HI:
15631 case R_PPC64_GOT_DTPREL16_HI:
15632 case R_PPC64_GOT16_HI:
15633 case R_PPC64_TOC16_HI:
15634 /* These relocs would only be useful if building up an
15635 offset to later add to r2, perhaps in an indexed
15636 addressing mode instruction. Don't try to optimize.
15637 Unfortunately, the possibility of someone building up an
15638 offset like this or even with the HA relocs, means that
15639 we need to check the high insn when optimizing the low
15640 insn. */
15641 break;
15642
23cedd1d
AM
15643 case R_PPC64_PLTCALL:
15644 if (unresolved_reloc)
15645 {
15646 /* No plt entry. Make this into a direct call. */
15647 bfd_byte *p = contents + rel->r_offset;
15648 insn = bfd_get_32 (input_bfd, p);
15649 insn &= 1;
15650 bfd_put_32 (input_bfd, B_DOT | insn, p);
15651 bfd_put_32 (input_bfd, NOP, p + 4);
15652 unresolved_reloc = save_unresolved_reloc;
15653 r_type = R_PPC64_REL24;
15654 }
15655 break;
15656
15657 case R_PPC64_PLTSEQ:
15658 if (unresolved_reloc)
15659 {
15660 unresolved_reloc = FALSE;
15661 goto nop_it;
15662 }
15663 break;
15664
15665 case R_PPC64_PLT16_HA:
15666 if (unresolved_reloc)
15667 {
15668 unresolved_reloc = FALSE;
15669 goto nop_it;
15670 }
15671 /* Fall through. */
67f0cbdb
AM
15672 case R_PPC64_GOT_TLSLD16_HA:
15673 case R_PPC64_GOT_TLSGD16_HA:
15674 case R_PPC64_GOT_TPREL16_HA:
15675 case R_PPC64_GOT_DTPREL16_HA:
15676 case R_PPC64_GOT16_HA:
15677 case R_PPC64_TOC16_HA:
98528052 15678 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 15679 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052 15680 {
23cedd1d
AM
15681 bfd_byte *p;
15682 nop_it:
15683 p = contents + (rel->r_offset & ~3);
98528052 15684 bfd_put_32 (input_bfd, NOP, p);
d830549d 15685 goto copy_reloc;
98528052 15686 }
67f0cbdb
AM
15687 break;
15688
23cedd1d
AM
15689 case R_PPC64_PLT16_LO:
15690 case R_PPC64_PLT16_LO_DS:
15691 if (unresolved_reloc)
15692 {
15693 unresolved_reloc = FALSE;
15694 goto nop_it;
15695 }
15696 /* Fall through. */
67f0cbdb
AM
15697 case R_PPC64_GOT_TLSLD16_LO:
15698 case R_PPC64_GOT_TLSGD16_LO:
15699 case R_PPC64_GOT_TPREL16_LO_DS:
15700 case R_PPC64_GOT_DTPREL16_LO_DS:
15701 case R_PPC64_GOT16_LO:
15702 case R_PPC64_GOT16_LO_DS:
15703 case R_PPC64_TOC16_LO:
15704 case R_PPC64_TOC16_LO_DS:
98528052 15705 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 15706 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
15707 {
15708 bfd_byte *p = contents + (rel->r_offset & ~3);
15709 insn = bfd_get_32 (input_bfd, p);
560c8763
AM
15710 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
15711 {
15712 /* Transform addic to addi when we change reg. */
15713 insn &= ~((0x3f << 26) | (0x1f << 16));
15714 insn |= (14u << 26) | (2 << 16);
15715 }
15716 else
67f0cbdb 15717 {
98528052
AM
15718 insn &= ~(0x1f << 16);
15719 insn |= 2 << 16;
67f0cbdb 15720 }
560c8763 15721 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
15722 }
15723 break;
9a23f96e
AM
15724
15725 case R_PPC64_TPREL16_HA:
15726 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
15727 {
15728 bfd_byte *p = contents + (rel->r_offset & ~3);
15729 insn = bfd_get_32 (input_bfd, p);
15730 if ((insn & ((0x3f << 26) | 0x1f << 16))
15731 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */)
15732 /* xgettext:c-format */
15733 info->callbacks->minfo
15734 (_("%H: warning: %s unexpected insn %#x.\n"),
d830549d
AM
15735 input_bfd, input_section, rel->r_offset,
15736 ppc64_elf_howto_table[r_type]->name, insn);
9a23f96e 15737 else
d830549d
AM
15738 {
15739 bfd_put_32 (input_bfd, NOP, p);
15740 goto copy_reloc;
15741 }
9a23f96e
AM
15742 }
15743 break;
15744
15745 case R_PPC64_TPREL16_LO:
15746 case R_PPC64_TPREL16_LO_DS:
15747 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
15748 {
15749 bfd_byte *p = contents + (rel->r_offset & ~3);
15750 insn = bfd_get_32 (input_bfd, p);
15751 insn &= ~(0x1f << 16);
15752 insn |= 13 << 16;
15753 bfd_put_32 (input_bfd, insn, p);
15754 }
15755 break;
67f0cbdb
AM
15756 }
15757
65f38f15
AM
15758 /* Do any further special processing. */
15759 switch (r_type)
15760 {
15761 default:
15762 break;
15763
25f23106 15764 case R_PPC64_REL16_HA:
a680de9a 15765 case R_PPC64_REL16DX_HA:
f9c6b907
AM
15766 case R_PPC64_ADDR16_HA:
15767 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
15768 case R_PPC64_ADDR16_HIGHERA:
15769 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
15770 case R_PPC64_TOC16_HA:
15771 case R_PPC64_SECTOFF_HA:
411e1bfb 15772 case R_PPC64_TPREL16_HA:
f9c6b907 15773 case R_PPC64_TPREL16_HIGHA:
411e1bfb 15774 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 15775 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
15776 case R_PPC64_DTPREL16_HA:
15777 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 15778 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 15779 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
15780 /* It's just possible that this symbol is a weak symbol
15781 that's not actually defined anywhere. In that case,
15782 'sec' would be NULL, and we should leave the symbol
15783 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
15784 if (sec == NULL)
15785 break;
1a0670f3 15786 /* Fall through. */
5c5f6e17
AM
15787
15788 case R_PPC64_GOT16_HA:
15789 case R_PPC64_PLTGOT16_HA:
15790 case R_PPC64_PLT16_HA:
15791 case R_PPC64_GOT_TLSGD16_HA:
15792 case R_PPC64_GOT_TLSLD16_HA:
15793 case R_PPC64_GOT_TPREL16_HA:
15794 case R_PPC64_GOT_DTPREL16_HA:
15795 /* Add 0x10000 if sign bit in 0:15 is set.
15796 Bits 0:15 are not used. */
15797 addend += 0x8000;
65f38f15
AM
15798 break;
15799
15800 case R_PPC64_ADDR16_DS:
15801 case R_PPC64_ADDR16_LO_DS:
15802 case R_PPC64_GOT16_DS:
15803 case R_PPC64_GOT16_LO_DS:
15804 case R_PPC64_PLT16_LO_DS:
15805 case R_PPC64_SECTOFF_DS:
15806 case R_PPC64_SECTOFF_LO_DS:
15807 case R_PPC64_TOC16_DS:
15808 case R_PPC64_TOC16_LO_DS:
15809 case R_PPC64_PLTGOT16_DS:
15810 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
15811 case R_PPC64_GOT_TPREL16_DS:
15812 case R_PPC64_GOT_TPREL16_LO_DS:
15813 case R_PPC64_GOT_DTPREL16_DS:
15814 case R_PPC64_GOT_DTPREL16_LO_DS:
15815 case R_PPC64_TPREL16_DS:
15816 case R_PPC64_TPREL16_LO_DS:
15817 case R_PPC64_DTPREL16_DS:
15818 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
15819 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
15820 mask = 3;
a680de9a
PB
15821 /* If this reloc is against an lq, lxv, or stxv insn, then
15822 the value must be a multiple of 16. This is somewhat of
15823 a hack, but the "correct" way to do this by defining _DQ
15824 forms of all the _DS relocs bloats all reloc switches in
15825 this file. It doesn't make much sense to use these
15826 relocs in data, so testing the insn should be safe. */
15827 if ((insn & (0x3f << 26)) == (56u << 26)
15828 || ((insn & (0x3f << 26)) == (61u << 26) && (insn & 3) == 1))
adadcc0c 15829 mask = 15;
a680de9a
PB
15830 relocation += addend;
15831 addend = insn & (mask ^ 3);
15832 if ((relocation & mask) != 0)
65f38f15 15833 {
a680de9a 15834 relocation ^= relocation & mask;
25f53a85 15835 info->callbacks->einfo
695344c0 15836 /* xgettext:c-format */
174d0a74 15837 (_("%H: error: %s not a multiple of %u\n"),
25f53a85 15838 input_bfd, input_section, rel->r_offset,
d830549d 15839 ppc64_elf_howto_table[r_type]->name,
adadcc0c 15840 mask + 1);
65f38f15 15841 bfd_set_error (bfd_error_bad_value);
b34976b6 15842 ret = FALSE;
c316a17c 15843 goto copy_reloc;
65f38f15
AM
15844 }
15845 break;
5bd4f169
AM
15846 }
15847
239e1f3a
AM
15848 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
15849 because such sections are not SEC_ALLOC and thus ld.so will
15850 not process them. */
d830549d 15851 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15 15852 if (unresolved_reloc
239e1f3a 15853 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
15854 && h->elf.def_dynamic)
15855 && _bfd_elf_section_offset (output_bfd, info, input_section,
15856 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 15857 {
25f53a85 15858 info->callbacks->einfo
695344c0 15859 /* xgettext:c-format */
c1c8c1ef 15860 (_("%H: unresolvable %s against `%pT'\n"),
25f53a85 15861 input_bfd, input_section, rel->r_offset,
b80eed39 15862 howto->name,
039b3fef 15863 h->elf.root.root.string);
b34976b6 15864 ret = FALSE;
9c07fe7c 15865 }
5bd4f169 15866
b80eed39
AM
15867 /* 16-bit fields in insns mostly have signed values, but a
15868 few insns have 16-bit unsigned values. Really, we should
15869 have different reloc types. */
15870 if (howto->complain_on_overflow != complain_overflow_dont
15871 && howto->dst_mask == 0xffff
15872 && (input_section->flags & SEC_CODE) != 0)
15873 {
15874 enum complain_overflow complain = complain_overflow_signed;
15875
15876 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
a47622ac
AM
15877 if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
15878 complain = complain_overflow_bitfield;
15879 else if (howto->rightshift == 0
15880 ? ((insn & (0x3f << 26)) == 28u << 26 /* andi */
15881 || (insn & (0x3f << 26)) == 24u << 26 /* ori */
15882 || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
15883 : ((insn & (0x3f << 26)) == 29u << 26 /* andis */
15884 || (insn & (0x3f << 26)) == 25u << 26 /* oris */
15885 || (insn & (0x3f << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
15886 complain = complain_overflow_unsigned;
15887 if (howto->complain_on_overflow != complain)
15888 {
15889 alt_howto = *howto;
15890 alt_howto.complain_on_overflow = complain;
15891 howto = &alt_howto;
15892 }
15893 }
15894
a680de9a
PB
15895 if (r_type == R_PPC64_REL16DX_HA)
15896 {
15897 /* Split field reloc isn't handled by _bfd_final_link_relocate. */
15898 if (rel->r_offset + 4 > input_section->size)
15899 r = bfd_reloc_outofrange;
15900 else
15901 {
15902 relocation += addend;
15903 relocation -= (rel->r_offset
15904 + input_section->output_offset
15905 + input_section->output_section->vma);
3de43e7b 15906 relocation = (bfd_signed_vma) relocation >> 16;
a680de9a
PB
15907 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15908 insn &= ~0x1fffc1;
3de43e7b 15909 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
a680de9a
PB
15910 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
15911 r = bfd_reloc_ok;
3de43e7b 15912 if (relocation + 0x8000 > 0xffff)
a680de9a
PB
15913 r = bfd_reloc_overflow;
15914 }
15915 }
15916 else
15917 r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
15918 rel->r_offset, relocation, addend);
5bd4f169 15919
ef60b7ff 15920 if (r != bfd_reloc_ok)
5bd4f169 15921 {
bc30df16 15922 char *more_info = NULL;
b80eed39 15923 const char *reloc_name = howto->name;
bc30df16
AM
15924
15925 if (reloc_dest != DEST_NORMAL)
15926 {
15927 more_info = bfd_malloc (strlen (reloc_name) + 8);
15928 if (more_info != NULL)
15929 {
15930 strcpy (more_info, reloc_name);
15931 strcat (more_info, (reloc_dest == DEST_OPD
15932 ? " (OPD)" : " (stub)"));
15933 reloc_name = more_info;
15934 }
15935 }
15936
cd27b276 15937 if (r == bfd_reloc_overflow)
5bd4f169 15938 {
8131c122
AM
15939 /* On code like "if (foo) foo();" don't report overflow
15940 on a branch to zero when foo is undefined. */
15941 if (!warned
15942 && (reloc_dest == DEST_STUB
15943 || !(h != NULL
15944 && (h->elf.root.type == bfd_link_hash_undefweak
15945 || h->elf.root.type == bfd_link_hash_undefined)
15946 && is_branch_reloc (r_type))))
1a72702b
AM
15947 info->callbacks->reloc_overflow (info, &h->elf.root,
15948 sym_name, reloc_name,
15949 orig_rel.r_addend,
15950 input_bfd, input_section,
15951 rel->r_offset);
ef60b7ff
AM
15952 }
15953 else
15954 {
25f53a85 15955 info->callbacks->einfo
695344c0 15956 /* xgettext:c-format */
c1c8c1ef 15957 (_("%H: %s against `%pT': error %d\n"),
25f53a85 15958 input_bfd, input_section, rel->r_offset,
bc30df16 15959 reloc_name, sym_name, (int) r);
b34976b6 15960 ret = FALSE;
ef60b7ff 15961 }
bc30df16
AM
15962 if (more_info != NULL)
15963 free (more_info);
5bd4f169 15964 }
c316a17c
AM
15965 copy_reloc:
15966 if (wrel != rel)
15967 *wrel = *rel;
15968 }
15969
15970 if (wrel != rel)
15971 {
15972 Elf_Internal_Shdr *rel_hdr;
15973 size_t deleted = rel - wrel;
15974
15975 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
15976 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15977 if (rel_hdr->sh_size == 0)
15978 {
15979 /* It is too late to remove an empty reloc section. Leave
15980 one NONE reloc.
15981 ??? What is wrong with an empty section??? */
15982 rel_hdr->sh_size = rel_hdr->sh_entsize;
15983 deleted -= 1;
15984 }
15985 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
15986 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15987 input_section->reloc_count -= deleted;
5bd4f169
AM
15988 }
15989
645ea6a9
AM
15990 /* If we're emitting relocations, then shortly after this function
15991 returns, reloc offsets and addends for this section will be
15992 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
15993 file rather than the input. Save a copy of the relocs for
15994 opd_entry_value. */
0e1862bb 15995 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
8860955f
AM
15996 {
15997 bfd_size_type amt;
15998 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
15999 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
16000 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
16001 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
16002 if (rel == NULL)
16003 return FALSE;
16004 memcpy (rel, relocs, amt);
16005 }
5bd4f169
AM
16006 return ret;
16007}
16008
754021d0
AM
16009/* Adjust the value of any local symbols in opd sections. */
16010
6e0b88f1 16011static int
754021d0
AM
16012ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
16013 const char *name ATTRIBUTE_UNUSED,
16014 Elf_Internal_Sym *elfsym,
16015 asection *input_sec,
16016 struct elf_link_hash_entry *h)
16017{
74f0fb50
AM
16018 struct _opd_sec_data *opd;
16019 long adjust;
754021d0
AM
16020 bfd_vma value;
16021
4025353c 16022 if (h != NULL)
6e0b88f1 16023 return 1;
4025353c 16024
74f0fb50
AM
16025 opd = get_opd_info (input_sec);
16026 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 16027 return 1;
754021d0
AM
16028
16029 value = elfsym->st_value - input_sec->output_offset;
0e1862bb 16030 if (!bfd_link_relocatable (info))
754021d0
AM
16031 value -= input_sec->output_section->vma;
16032
51aecdc5 16033 adjust = opd->adjust[OPD_NDX (value)];
4025353c 16034 if (adjust == -1)
6e0b88f1
AM
16035 return 2;
16036
16037 elfsym->st_value += adjust;
16038 return 1;
754021d0
AM
16039}
16040
5bd4f169
AM
16041/* Finish up dynamic symbol handling. We set the contents of various
16042 dynamic sections here. */
16043
b34976b6 16044static bfd_boolean
4ce794b7
AM
16045ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
16046 struct bfd_link_info *info,
16047 struct elf_link_hash_entry *h,
4aef7643 16048 Elf_Internal_Sym *sym)
5bd4f169 16049{
65f38f15 16050 struct ppc_link_hash_table *htab;
8387904d 16051 struct plt_entry *ent;
5bd4f169 16052
65f38f15 16053 htab = ppc_hash_table (info);
4dfe6ac6
NC
16054 if (htab == NULL)
16055 return FALSE;
5bd4f169 16056
49c09209
AM
16057 if (!htab->opd_abi && !h->def_regular)
16058 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
16059 if (ent->plt.offset != (bfd_vma) -1)
16060 {
16061 /* Mark the symbol as undefined, rather than as
16062 defined in glink. Leave the value if there were
16063 any relocations where pointer equality matters
16064 (this is a clue for the dynamic linker, to make
16065 function pointer comparisons work between an
16066 application and shared library), otherwise set it
16067 to zero. */
16068 sym->st_shndx = SHN_UNDEF;
16069 if (!h->pointer_equality_needed)
16070 sym->st_value = 0;
16071 else if (!h->ref_regular_nonweak)
16072 {
16073 /* This breaks function pointer comparisons, but
16074 that is better than breaking tests for a NULL
16075 function pointer. */
16076 sym->st_value = 0;
16077 }
16078 break;
16079 }
5bd4f169 16080
f5385ebf 16081 if (h->needs_copy)
5bd4f169 16082 {
65f38f15 16083 /* This symbol needs a copy reloc. Set it up. */
49c09209 16084 Elf_Internal_Rela rela;
5474d94f 16085 asection *srel;
49c09209 16086 bfd_byte *loc;
5bd4f169 16087
65f38f15
AM
16088 if (h->dynindx == -1
16089 || (h->root.type != bfd_link_hash_defined
16090 && h->root.type != bfd_link_hash_defweak)
5474d94f
AM
16091 || htab->elf.srelbss == NULL
16092 || htab->elf.sreldynrelro == NULL)
65f38f15 16093 abort ();
5bd4f169
AM
16094
16095 rela.r_offset = (h->root.u.def.value
16096 + h->root.u.def.section->output_section->vma
16097 + h->root.u.def.section->output_offset);
16098 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
16099 rela.r_addend = 0;
afbf7e8e 16100 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
16101 srel = htab->elf.sreldynrelro;
16102 else
16103 srel = htab->elf.srelbss;
16104 loc = srel->contents;
16105 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 16106 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
16107 }
16108
b34976b6 16109 return TRUE;
5bd4f169
AM
16110}
16111
65f38f15
AM
16112/* Used to decide how to sort relocs in an optimal manner for the
16113 dynamic linker, before writing them out. */
16114
16115static enum elf_reloc_type_class
7e612e98
AM
16116ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
16117 const asection *rel_sec,
16118 const Elf_Internal_Rela *rela)
65f38f15 16119{
04c9666a 16120 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
16121 struct ppc_link_hash_table *htab = ppc_hash_table (info);
16122
33e44f2e 16123 if (rel_sec == htab->elf.irelplt)
7e612e98 16124 return reloc_class_ifunc;
a33d1f77 16125
4ce794b7 16126 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 16127 switch (r_type)
65f38f15
AM
16128 {
16129 case R_PPC64_RELATIVE:
16130 return reloc_class_relative;
16131 case R_PPC64_JMP_SLOT:
16132 return reloc_class_plt;
16133 case R_PPC64_COPY:
16134 return reloc_class_copy;
16135 default:
16136 return reloc_class_normal;
16137 }
16138}
16139
5bd4f169
AM
16140/* Finish up the dynamic sections. */
16141
b34976b6 16142static bfd_boolean
4ce794b7
AM
16143ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
16144 struct bfd_link_info *info)
5bd4f169 16145{
65f38f15
AM
16146 struct ppc_link_hash_table *htab;
16147 bfd *dynobj;
5bd4f169 16148 asection *sdyn;
5bd4f169 16149
65f38f15 16150 htab = ppc_hash_table (info);
4dfe6ac6
NC
16151 if (htab == NULL)
16152 return FALSE;
16153
65f38f15 16154 dynobj = htab->elf.dynobj;
3d4d4302 16155 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 16156
65f38f15 16157 if (htab->elf.dynamic_sections_created)
5bd4f169 16158 {
5bd4f169
AM
16159 Elf64_External_Dyn *dyncon, *dynconend;
16160
33e44f2e 16161 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 16162 abort ();
5bd4f169
AM
16163
16164 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 16165 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
16166 for (; dyncon < dynconend; dyncon++)
16167 {
16168 Elf_Internal_Dyn dyn;
19397422 16169 asection *s;
5bd4f169
AM
16170
16171 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
16172
16173 switch (dyn.d_tag)
16174 {
65f38f15
AM
16175 default:
16176 continue;
5bd4f169 16177
5d1634d7 16178 case DT_PPC64_GLINK:
4ce794b7 16179 s = htab->glink;
6348e046 16180 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
16181 /* We stupidly defined DT_PPC64_GLINK to be the start
16182 of glink rather than the first entry point, which is
16183 what ld.so needs, and now have a bigger stub to
16184 support automatic multiple TOCs. */
9e390558 16185 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
5d1634d7
AM
16186 break;
16187
19397422
AM
16188 case DT_PPC64_OPD:
16189 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
16190 if (s == NULL)
16191 continue;
16192 dyn.d_un.d_ptr = s->vma;
19397422
AM
16193 break;
16194
e8910a83
AM
16195 case DT_PPC64_OPT:
16196 if (htab->do_multi_toc && htab->multi_toc_needed)
16197 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
f378ab09
AM
16198 if (htab->has_plt_localentry0)
16199 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
e8910a83
AM
16200 break;
16201
19397422
AM
16202 case DT_PPC64_OPDSZ:
16203 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
16204 if (s == NULL)
16205 continue;
eea6121a 16206 dyn.d_un.d_val = s->size;
19397422
AM
16207 break;
16208
65f38f15 16209 case DT_PLTGOT:
33e44f2e 16210 s = htab->elf.splt;
6348e046 16211 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
16212 break;
16213
16214 case DT_JMPREL:
33e44f2e 16215 s = htab->elf.srelplt;
6348e046 16216 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 16217 break;
5bd4f169 16218
65f38f15 16219 case DT_PLTRELSZ:
33e44f2e 16220 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7 16221 break;
82e66161
AM
16222
16223 case DT_TEXTREL:
16224 if (htab->local_ifunc_resolver)
16225 info->callbacks->einfo
16226 (_("%X%P: text relocations and GNU indirect "
16227 "functions will result in a segfault at runtime\n"));
16228 else if (htab->maybe_local_ifunc_resolver)
16229 info->callbacks->einfo
16230 (_("%P: warning: text relocations and GNU indirect "
16231 "functions may result in a segfault at runtime\n"));
16232 continue;
5bd4f169 16233 }
5bd4f169 16234
65f38f15 16235 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 16236 }
5bd4f169
AM
16237 }
16238
6528b6eb
AM
16239 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
16240 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
5d1634d7
AM
16241 {
16242 /* Fill in the first entry in the global offset table.
16243 We use it to hold the link-time TOCbase. */
16244 bfd_put_64 (output_bfd,
60ee0d4a 16245 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 16246 htab->elf.sgot->contents);
5d1634d7
AM
16247
16248 /* Set .got entry size. */
33e44f2e 16249 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 8;
5d1634d7
AM
16250 }
16251
6528b6eb
AM
16252 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
16253 && htab->elf.splt->output_section != bfd_abs_section_ptr)
5d1634d7
AM
16254 {
16255 /* Set .plt entry size. */
33e44f2e 16256 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 16257 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
16258 }
16259
84f5d08e
AM
16260 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
16261 brlt ourselves if emitrelocations. */
16262 if (htab->brlt != NULL
16263 && htab->brlt->reloc_count != 0
16264 && !_bfd_elf_link_output_relocs (output_bfd,
16265 htab->brlt,
d4730f92 16266 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
16267 elf_section_data (htab->brlt)->relocs,
16268 NULL))
16269 return FALSE;
16270
176a0d42
AM
16271 if (htab->glink != NULL
16272 && htab->glink->reloc_count != 0
16273 && !_bfd_elf_link_output_relocs (output_bfd,
16274 htab->glink,
d4730f92 16275 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
16276 elf_section_data (htab->glink)->relocs,
16277 NULL))
16278 return FALSE;
16279
58d180e8 16280 if (htab->glink_eh_frame != NULL
da44f4e5
AM
16281 && htab->glink_eh_frame->size != 0)
16282 {
16283 bfd_vma val;
16284 bfd_byte *p;
d4aaa2a0 16285 struct map_stub *group;
2e0ce1c8 16286 size_t align = 4;
da44f4e5 16287
2e0ce1c8
AM
16288 p = htab->glink_eh_frame->contents;
16289 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
d4aaa2a0
AM
16290
16291 for (group = htab->group; group != NULL; group = group->next)
16292 if (group->stub_sec != NULL)
da44f4e5 16293 {
da44f4e5 16294 /* Offset to stub section. */
d4aaa2a0
AM
16295 val = (group->stub_sec->output_section->vma
16296 + group->stub_sec->output_offset);
da44f4e5
AM
16297 val -= (htab->glink_eh_frame->output_section->vma
16298 + htab->glink_eh_frame->output_offset
d4aaa2a0 16299 + (p + 8 - htab->glink_eh_frame->contents));
da44f4e5
AM
16300 if (val + 0x80000000 > 0xffffffff)
16301 {
cf97bcb0
AM
16302 _bfd_error_handler
16303 (_("%s offset too large for .eh_frame sdata4 encoding"),
d4aaa2a0 16304 group->stub_sec->name);
da44f4e5
AM
16305 return FALSE;
16306 }
d4aaa2a0
AM
16307 bfd_put_32 (dynobj, val, p + 8);
16308 p += stub_eh_frame_size (group, align);
da44f4e5
AM
16309 }
16310 if (htab->glink != NULL && htab->glink->size != 0)
16311 {
da44f4e5
AM
16312 /* Offset to .glink. */
16313 val = (htab->glink->output_section->vma
16314 + htab->glink->output_offset
16315 + 8);
16316 val -= (htab->glink_eh_frame->output_section->vma
16317 + htab->glink_eh_frame->output_offset
d4aaa2a0 16318 + (p + 8 - htab->glink_eh_frame->contents));
da44f4e5
AM
16319 if (val + 0x80000000 > 0xffffffff)
16320 {
cf97bcb0
AM
16321 _bfd_error_handler
16322 (_("%s offset too large for .eh_frame sdata4 encoding"),
da44f4e5
AM
16323 htab->glink->name);
16324 return FALSE;
16325 }
d4aaa2a0
AM
16326 bfd_put_32 (dynobj, val, p + 8);
16327 p += (24 + align - 1) & -align;
da44f4e5
AM
16328 }
16329
16330 if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
16331 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
16332 htab->glink_eh_frame,
16333 htab->glink_eh_frame->contents))
16334 return FALSE;
16335 }
58d180e8 16336
e717da7e 16337 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
16338 since we didn't add them to DYNOBJ. We know dynobj is the first
16339 bfd. */
c72f2fb2 16340 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
16341 {
16342 asection *s;
7b53ace3 16343
0c8d6e5c 16344 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
16345 continue;
16346
e717da7e
AM
16347 s = ppc64_elf_tdata (dynobj)->got;
16348 if (s != NULL
eea6121a 16349 && s->size != 0
e717da7e
AM
16350 && s->output_section != bfd_abs_section_ptr
16351 && !bfd_set_section_contents (output_bfd, s->output_section,
16352 s->contents, s->output_offset,
eea6121a 16353 s->size))
e717da7e
AM
16354 return FALSE;
16355 s = ppc64_elf_tdata (dynobj)->relgot;
16356 if (s != NULL
eea6121a 16357 && s->size != 0
e717da7e
AM
16358 && s->output_section != bfd_abs_section_ptr
16359 && !bfd_set_section_contents (output_bfd, s->output_section,
16360 s->contents, s->output_offset,
eea6121a 16361 s->size))
e717da7e
AM
16362 return FALSE;
16363 }
f6c52c13 16364
b34976b6 16365 return TRUE;
5bd4f169
AM
16366}
16367
5bd4f169 16368#include "elf64-target.h"
7b8e7dad
AM
16369
16370/* FreeBSD support */
16371
16372#undef TARGET_LITTLE_SYM
16373#undef TARGET_LITTLE_NAME
16374
16375#undef TARGET_BIG_SYM
6d00b590 16376#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
16377#undef TARGET_BIG_NAME
16378#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
16379
16380#undef ELF_OSABI
16381#define ELF_OSABI ELFOSABI_FREEBSD
16382
16383#undef elf64_bed
16384#define elf64_bed elf64_powerpc_fbsd_bed
16385
16386#include "elf64-target.h"
This page took 2.645258 seconds and 4 git commands to generate.