daily update
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
4b95cf5c 2 Copyright (C) 1999-2014 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
24718e3b 67#define ELF_COMMONPAGESIZE 0x1000
ad8e1ba5
AM
68#define elf_info_to_howto ppc64_elf_info_to_howto
69
70#define elf_backend_want_got_sym 0
71#define elf_backend_want_plt_sym 0
72#define elf_backend_plt_alignment 3
73#define elf_backend_plt_not_loaded 1
ad8e1ba5 74#define elf_backend_got_header_size 8
ad8e1ba5
AM
75#define elf_backend_can_gc_sections 1
76#define elf_backend_can_refcount 1
77#define elf_backend_rela_normal 1
6bfdb61b 78#define elf_backend_default_execstack 0
ad8e1ba5 79
e717da7e 80#define bfd_elf64_mkobject ppc64_elf_mkobject
ad8e1ba5 81#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
aa374f67 82#define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
ee67d69a
AM
83#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
84#define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
ad8e1ba5
AM
85#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
86#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
90e3cdf2 87#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
aa374f67 88#define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
ad8e1ba5
AM
89
90#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
91#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
92#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
183e98be 93#define elf_backend_write_core_note ppc64_elf_write_core_note
ad8e1ba5
AM
94#define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
95#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 96#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
f6c7c3e8 97#define elf_backend_check_directives ppc64_elf_before_check_relocs
e5034e59 98#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
8387904d 99#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5 100#define elf_backend_check_relocs ppc64_elf_check_relocs
74f0fb50 101#define elf_backend_gc_keep ppc64_elf_gc_keep
64d03ab5 102#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
ad8e1ba5
AM
103#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
104#define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
105#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
106#define elf_backend_hide_symbol ppc64_elf_hide_symbol
9f296da3 107#define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
ad8e1ba5
AM
108#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
109#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
a345bc8d 110#define elf_backend_hash_symbol ppc64_elf_hash_symbol
74541ad4 111#define elf_backend_init_index_section _bfd_elf_init_2_index_sections
60124e18 112#define elf_backend_action_discarded ppc64_elf_action_discarded
ad8e1ba5
AM
113#define elf_backend_relocate_section ppc64_elf_relocate_section
114#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
115#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
116#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 117#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
29ef7005 118#define elf_backend_special_sections ppc64_elf_special_sections
6911b7dc 119#define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
ad8e1ba5 120
5bd4f169
AM
121/* The name of the dynamic interpreter. This is put in the .interp
122 section. */
123#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
124
125/* The size in bytes of an entry in the procedure linkage table. */
b9e5796b 126#define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
5bd4f169
AM
127
128/* The initial size of the plt reserved for the dynamic linker. */
b9e5796b 129#define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
5bd4f169 130
a078d95a
AM
131/* Offsets to some stack save slots. */
132#define STK_LR 16
133#define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
eb8d7fda 134/* This one is dodgy. ELFv2 does not have a linker word, so use the
a078d95a
AM
135 CR save slot. Used only by optimised __tls_get_addr call stub,
136 relying on __tls_get_addr_opt not saving CR.. */
137#define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
138
5bd4f169 139/* TOC base pointers offset from start of TOC. */
411e1bfb
AM
140#define TOC_BASE_OFF 0x8000
141
142/* Offset of tp and dtp pointers from start of TLS block. */
143#define TP_OFFSET 0x7000
144#define DTP_OFFSET 0x8000
5bd4f169 145
ad8e1ba5
AM
146/* .plt call stub instructions. The normal stub is like this, but
147 sometimes the .plt entry crosses a 64k boundary and we need to
71a39c98 148 insert an addi to adjust r11. */
a078d95a 149#define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
71a39c98
AM
150#define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
151#define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
152#define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
153#define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
154#define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
5d1634d7
AM
155#define BCTR 0x4e800420 /* bctr */
156
71a39c98 157#define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
ad8e1ba5
AM
158#define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
159#define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
160
71a39c98
AM
161#define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
162#define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
163#define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
794e51c0
AM
164#define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
165#define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
166#define BNECTR 0x4ca20420 /* bnectr+ */
167#define BNECTR_P4 0x4ce20420 /* bnectr+ */
168
71a39c98 169#define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
ac2df442
AM
170#define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
171#define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
172
a078d95a 173#define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
ad8e1ba5 174
397998fc 175#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
a345bc8d
AM
176#define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
177#define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
178
ee4bf8d2 179/* glink call stub instructions. We enter with the index in R0. */
ad8e1ba5 180#define GLINK_CALL_STUB_SIZE (16*4)
ee4bf8d2
AM
181 /* 0: */
182 /* .quad plt0-1f */
183 /* __glink: */
184#define MFLR_R12 0x7d8802a6 /* mflr %12 */
185#define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
186 /* 1: */
187#define MFLR_R11 0x7d6802a6 /* mflr %11 */
71a39c98 188 /* ld %2,(0b-1b)(%11) */
ee4bf8d2 189#define MTLR_R12 0x7d8803a6 /* mtlr %12 */
71a39c98
AM
190#define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
191 /* ld %12,0(%11) */
192 /* ld %2,8(%11) */
193 /* mtctr %12 */
194 /* ld %11,16(%11) */
ee4bf8d2 195 /* bctr */
b9e5796b
AM
196#define MFLR_R0 0x7c0802a6 /* mflr %r0 */
197#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
198#define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
199#define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
200#define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
5d1634d7
AM
201
202/* Pad with this. */
203#define NOP 0x60000000
204
721956f4
AM
205/* Some other nops. */
206#define CROR_151515 0x4def7b82
207#define CROR_313131 0x4ffffb82
208
cedb70c5 209/* .glink entries for the first 32k functions are two instructions. */
5d1634d7
AM
210#define LI_R0_0 0x38000000 /* li %r0,0 */
211#define B_DOT 0x48000000 /* b . */
212
213/* After that, we need two instructions to load the index, followed by
214 a branch. */
215#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 216#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 217
deb0e272
AM
218/* Instructions used by the save and restore reg functions. */
219#define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
220#define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
221#define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
222#define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
82bd7b59
AM
223#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
224#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
deb0e272
AM
225#define LI_R12_0 0x39800000 /* li %r12,0 */
226#define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
227#define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
228#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
82bd7b59
AM
229#define BLR 0x4e800020 /* blr */
230
41bd81ab
AM
231/* Since .opd is an array of descriptors and each entry will end up
232 with identical R_PPC64_RELATIVE relocs, there is really no need to
233 propagate .opd relocs; The dynamic linker should be taught to
1e2f5b6e 234 relocate .opd without reloc entries. */
41bd81ab
AM
235#ifndef NO_OPD_RELOCS
236#define NO_OPD_RELOCS 0
237#endif
810d4e75
AM
238
239static inline int
240abiversion (bfd *abfd)
241{
242 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
243}
244
245static inline void
246set_abiversion (bfd *abfd, int ver)
247{
248 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
249 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
250}
5bd4f169 251\f
f5e87a1d 252#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
b34976b6 253
5bd4f169 254/* Relocation HOWTO's. */
04c9666a 255static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
5bd4f169
AM
256
257static reloc_howto_type ppc64_elf_howto_raw[] = {
258 /* This reloc does nothing. */
259 HOWTO (R_PPC64_NONE, /* type */
260 0, /* rightshift */
411e1bfb
AM
261 2, /* size (0 = byte, 1 = short, 2 = long) */
262 32, /* bitsize */
b34976b6 263 FALSE, /* pc_relative */
5bd4f169 264 0, /* bitpos */
f5e87a1d 265 complain_overflow_dont, /* complain_on_overflow */
5bd4f169
AM
266 bfd_elf_generic_reloc, /* special_function */
267 "R_PPC64_NONE", /* name */
b34976b6 268 FALSE, /* partial_inplace */
d006db6c 269 0, /* src_mask */
5bd4f169 270 0, /* dst_mask */
b34976b6 271 FALSE), /* pcrel_offset */
5bd4f169
AM
272
273 /* A standard 32 bit relocation. */
274 HOWTO (R_PPC64_ADDR32, /* type */
275 0, /* rightshift */
276 2, /* size (0 = byte, 1 = short, 2 = long) */
277 32, /* bitsize */
b34976b6 278 FALSE, /* pc_relative */
5bd4f169
AM
279 0, /* bitpos */
280 complain_overflow_bitfield, /* complain_on_overflow */
281 bfd_elf_generic_reloc, /* special_function */
282 "R_PPC64_ADDR32", /* name */
b34976b6 283 FALSE, /* partial_inplace */
5bd4f169
AM
284 0, /* src_mask */
285 0xffffffff, /* dst_mask */
b34976b6 286 FALSE), /* pcrel_offset */
5bd4f169
AM
287
288 /* An absolute 26 bit branch; the lower two bits must be zero.
289 FIXME: we don't check that, we just clear them. */
290 HOWTO (R_PPC64_ADDR24, /* type */
291 0, /* rightshift */
292 2, /* size (0 = byte, 1 = short, 2 = long) */
293 26, /* bitsize */
b34976b6 294 FALSE, /* pc_relative */
5bd4f169
AM
295 0, /* bitpos */
296 complain_overflow_bitfield, /* complain_on_overflow */
297 bfd_elf_generic_reloc, /* special_function */
298 "R_PPC64_ADDR24", /* name */
b34976b6 299 FALSE, /* partial_inplace */
d006db6c 300 0, /* src_mask */
f5e87a1d 301 0x03fffffc, /* dst_mask */
b34976b6 302 FALSE), /* pcrel_offset */
5bd4f169
AM
303
304 /* A standard 16 bit relocation. */
305 HOWTO (R_PPC64_ADDR16, /* type */
306 0, /* rightshift */
307 1, /* size (0 = byte, 1 = short, 2 = long) */
308 16, /* bitsize */
b34976b6 309 FALSE, /* pc_relative */
5bd4f169
AM
310 0, /* bitpos */
311 complain_overflow_bitfield, /* complain_on_overflow */
312 bfd_elf_generic_reloc, /* special_function */
313 "R_PPC64_ADDR16", /* name */
b34976b6 314 FALSE, /* partial_inplace */
5bd4f169
AM
315 0, /* src_mask */
316 0xffff, /* dst_mask */
b34976b6 317 FALSE), /* pcrel_offset */
5bd4f169
AM
318
319 /* A 16 bit relocation without overflow. */
320 HOWTO (R_PPC64_ADDR16_LO, /* type */
321 0, /* rightshift */
322 1, /* size (0 = byte, 1 = short, 2 = long) */
323 16, /* bitsize */
b34976b6 324 FALSE, /* pc_relative */
5bd4f169
AM
325 0, /* bitpos */
326 complain_overflow_dont,/* complain_on_overflow */
327 bfd_elf_generic_reloc, /* special_function */
328 "R_PPC64_ADDR16_LO", /* name */
b34976b6 329 FALSE, /* partial_inplace */
5bd4f169
AM
330 0, /* src_mask */
331 0xffff, /* dst_mask */
b34976b6 332 FALSE), /* pcrel_offset */
5bd4f169
AM
333
334 /* Bits 16-31 of an address. */
335 HOWTO (R_PPC64_ADDR16_HI, /* type */
336 16, /* rightshift */
337 1, /* size (0 = byte, 1 = short, 2 = long) */
338 16, /* bitsize */
b34976b6 339 FALSE, /* pc_relative */
5bd4f169 340 0, /* bitpos */
f9c6b907 341 complain_overflow_signed, /* complain_on_overflow */
5bd4f169
AM
342 bfd_elf_generic_reloc, /* special_function */
343 "R_PPC64_ADDR16_HI", /* name */
b34976b6 344 FALSE, /* partial_inplace */
5bd4f169
AM
345 0, /* src_mask */
346 0xffff, /* dst_mask */
b34976b6 347 FALSE), /* pcrel_offset */
5bd4f169
AM
348
349 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
350 bits, treated as a signed number, is negative. */
351 HOWTO (R_PPC64_ADDR16_HA, /* type */
352 16, /* rightshift */
353 1, /* size (0 = byte, 1 = short, 2 = long) */
354 16, /* bitsize */
b34976b6 355 FALSE, /* pc_relative */
5bd4f169 356 0, /* bitpos */
f9c6b907 357 complain_overflow_signed, /* complain_on_overflow */
805fc799 358 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 359 "R_PPC64_ADDR16_HA", /* name */
b34976b6 360 FALSE, /* partial_inplace */
5bd4f169
AM
361 0, /* src_mask */
362 0xffff, /* dst_mask */
b34976b6 363 FALSE), /* pcrel_offset */
5bd4f169
AM
364
365 /* An absolute 16 bit branch; the lower two bits must be zero.
366 FIXME: we don't check that, we just clear them. */
367 HOWTO (R_PPC64_ADDR14, /* type */
368 0, /* rightshift */
369 2, /* size (0 = byte, 1 = short, 2 = long) */
370 16, /* bitsize */
b34976b6 371 FALSE, /* pc_relative */
5bd4f169 372 0, /* bitpos */
b80eed39 373 complain_overflow_signed, /* complain_on_overflow */
2441e016 374 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 375 "R_PPC64_ADDR14", /* name */
b34976b6 376 FALSE, /* partial_inplace */
d006db6c 377 0, /* src_mask */
f5e87a1d 378 0x0000fffc, /* dst_mask */
b34976b6 379 FALSE), /* pcrel_offset */
5bd4f169
AM
380
381 /* An absolute 16 bit branch, for which bit 10 should be set to
382 indicate that the branch is expected to be taken. The lower two
383 bits must be zero. */
384 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
385 0, /* rightshift */
386 2, /* size (0 = byte, 1 = short, 2 = long) */
387 16, /* bitsize */
b34976b6 388 FALSE, /* pc_relative */
5bd4f169 389 0, /* bitpos */
b80eed39 390 complain_overflow_signed, /* complain_on_overflow */
805fc799 391 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 392 "R_PPC64_ADDR14_BRTAKEN",/* name */
b34976b6 393 FALSE, /* partial_inplace */
d006db6c 394 0, /* src_mask */
f5e87a1d 395 0x0000fffc, /* dst_mask */
b34976b6 396 FALSE), /* pcrel_offset */
5bd4f169
AM
397
398 /* An absolute 16 bit branch, for which bit 10 should be set to
399 indicate that the branch is not expected to be taken. The lower
400 two bits must be zero. */
401 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
402 0, /* rightshift */
403 2, /* size (0 = byte, 1 = short, 2 = long) */
404 16, /* bitsize */
b34976b6 405 FALSE, /* pc_relative */
5bd4f169 406 0, /* bitpos */
b80eed39 407 complain_overflow_signed, /* complain_on_overflow */
805fc799 408 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 409 "R_PPC64_ADDR14_BRNTAKEN",/* name */
b34976b6 410 FALSE, /* partial_inplace */
d006db6c 411 0, /* src_mask */
f5e87a1d 412 0x0000fffc, /* dst_mask */
b34976b6 413 FALSE), /* pcrel_offset */
5bd4f169
AM
414
415 /* A relative 26 bit branch; the lower two bits must be zero. */
416 HOWTO (R_PPC64_REL24, /* type */
417 0, /* rightshift */
418 2, /* size (0 = byte, 1 = short, 2 = long) */
419 26, /* bitsize */
b34976b6 420 TRUE, /* pc_relative */
5bd4f169
AM
421 0, /* bitpos */
422 complain_overflow_signed, /* complain_on_overflow */
2441e016 423 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 424 "R_PPC64_REL24", /* name */
b34976b6 425 FALSE, /* partial_inplace */
d006db6c 426 0, /* src_mask */
f5e87a1d 427 0x03fffffc, /* dst_mask */
b34976b6 428 TRUE), /* pcrel_offset */
5bd4f169
AM
429
430 /* A relative 16 bit branch; the lower two bits must be zero. */
431 HOWTO (R_PPC64_REL14, /* type */
432 0, /* rightshift */
433 2, /* size (0 = byte, 1 = short, 2 = long) */
434 16, /* bitsize */
b34976b6 435 TRUE, /* pc_relative */
5bd4f169
AM
436 0, /* bitpos */
437 complain_overflow_signed, /* complain_on_overflow */
2441e016 438 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 439 "R_PPC64_REL14", /* name */
b34976b6 440 FALSE, /* partial_inplace */
d006db6c 441 0, /* src_mask */
f5e87a1d 442 0x0000fffc, /* dst_mask */
b34976b6 443 TRUE), /* pcrel_offset */
5bd4f169
AM
444
445 /* A relative 16 bit branch. Bit 10 should be set to indicate that
446 the branch is expected to be taken. The lower two bits must be
447 zero. */
448 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
449 0, /* rightshift */
450 2, /* size (0 = byte, 1 = short, 2 = long) */
451 16, /* bitsize */
b34976b6 452 TRUE, /* pc_relative */
5bd4f169
AM
453 0, /* bitpos */
454 complain_overflow_signed, /* complain_on_overflow */
805fc799 455 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 456 "R_PPC64_REL14_BRTAKEN", /* name */
b34976b6 457 FALSE, /* partial_inplace */
d006db6c 458 0, /* src_mask */
f5e87a1d 459 0x0000fffc, /* dst_mask */
b34976b6 460 TRUE), /* pcrel_offset */
5bd4f169
AM
461
462 /* A relative 16 bit branch. Bit 10 should be set to indicate that
463 the branch is not expected to be taken. The lower two bits must
464 be zero. */
465 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
466 0, /* rightshift */
467 2, /* size (0 = byte, 1 = short, 2 = long) */
468 16, /* bitsize */
b34976b6 469 TRUE, /* pc_relative */
5bd4f169
AM
470 0, /* bitpos */
471 complain_overflow_signed, /* complain_on_overflow */
805fc799 472 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 473 "R_PPC64_REL14_BRNTAKEN",/* name */
b34976b6 474 FALSE, /* partial_inplace */
d006db6c 475 0, /* src_mask */
f5e87a1d 476 0x0000fffc, /* dst_mask */
b34976b6 477 TRUE), /* pcrel_offset */
5bd4f169
AM
478
479 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
480 symbol. */
481 HOWTO (R_PPC64_GOT16, /* type */
482 0, /* rightshift */
483 1, /* size (0 = byte, 1 = short, 2 = long) */
484 16, /* bitsize */
b34976b6 485 FALSE, /* pc_relative */
5bd4f169
AM
486 0, /* bitpos */
487 complain_overflow_signed, /* complain_on_overflow */
805fc799 488 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 489 "R_PPC64_GOT16", /* name */
b34976b6 490 FALSE, /* partial_inplace */
5bd4f169
AM
491 0, /* src_mask */
492 0xffff, /* dst_mask */
b34976b6 493 FALSE), /* pcrel_offset */
5bd4f169
AM
494
495 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
496 the symbol. */
497 HOWTO (R_PPC64_GOT16_LO, /* type */
498 0, /* rightshift */
499 1, /* size (0 = byte, 1 = short, 2 = long) */
500 16, /* bitsize */
b34976b6 501 FALSE, /* pc_relative */
5bd4f169
AM
502 0, /* bitpos */
503 complain_overflow_dont, /* complain_on_overflow */
805fc799 504 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 505 "R_PPC64_GOT16_LO", /* name */
b34976b6 506 FALSE, /* partial_inplace */
5bd4f169
AM
507 0, /* src_mask */
508 0xffff, /* dst_mask */
b34976b6 509 FALSE), /* pcrel_offset */
5bd4f169
AM
510
511 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
512 the symbol. */
513 HOWTO (R_PPC64_GOT16_HI, /* type */
514 16, /* rightshift */
515 1, /* size (0 = byte, 1 = short, 2 = long) */
516 16, /* bitsize */
b34976b6 517 FALSE, /* pc_relative */
5bd4f169 518 0, /* bitpos */
f9c6b907 519 complain_overflow_signed,/* complain_on_overflow */
805fc799 520 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 521 "R_PPC64_GOT16_HI", /* name */
b34976b6 522 FALSE, /* partial_inplace */
5bd4f169
AM
523 0, /* src_mask */
524 0xffff, /* dst_mask */
b34976b6 525 FALSE), /* pcrel_offset */
5bd4f169
AM
526
527 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
528 the symbol. */
529 HOWTO (R_PPC64_GOT16_HA, /* type */
530 16, /* rightshift */
531 1, /* size (0 = byte, 1 = short, 2 = long) */
532 16, /* bitsize */
b34976b6 533 FALSE, /* pc_relative */
5bd4f169 534 0, /* bitpos */
f9c6b907 535 complain_overflow_signed,/* complain_on_overflow */
805fc799 536 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 537 "R_PPC64_GOT16_HA", /* name */
b34976b6 538 FALSE, /* partial_inplace */
5bd4f169
AM
539 0, /* src_mask */
540 0xffff, /* dst_mask */
b34976b6 541 FALSE), /* pcrel_offset */
5bd4f169
AM
542
543 /* This is used only by the dynamic linker. The symbol should exist
544 both in the object being run and in some shared library. The
545 dynamic linker copies the data addressed by the symbol from the
546 shared library into the object, because the object being
547 run has to have the data at some particular address. */
548 HOWTO (R_PPC64_COPY, /* type */
549 0, /* rightshift */
f5e87a1d
AM
550 0, /* this one is variable size */
551 0, /* bitsize */
b34976b6 552 FALSE, /* pc_relative */
5bd4f169 553 0, /* bitpos */
f5e87a1d
AM
554 complain_overflow_dont, /* complain_on_overflow */
555 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 556 "R_PPC64_COPY", /* name */
b34976b6 557 FALSE, /* partial_inplace */
5bd4f169
AM
558 0, /* src_mask */
559 0, /* dst_mask */
b34976b6 560 FALSE), /* pcrel_offset */
5bd4f169
AM
561
562 /* Like R_PPC64_ADDR64, but used when setting global offset table
563 entries. */
564 HOWTO (R_PPC64_GLOB_DAT, /* type */
565 0, /* rightshift */
566 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
567 64, /* bitsize */
b34976b6 568 FALSE, /* pc_relative */
5bd4f169
AM
569 0, /* bitpos */
570 complain_overflow_dont, /* complain_on_overflow */
805fc799 571 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 572 "R_PPC64_GLOB_DAT", /* name */
b34976b6 573 FALSE, /* partial_inplace */
5bd4f169 574 0, /* src_mask */
f5e87a1d 575 ONES (64), /* dst_mask */
b34976b6 576 FALSE), /* pcrel_offset */
5bd4f169
AM
577
578 /* Created by the link editor. Marks a procedure linkage table
579 entry for a symbol. */
580 HOWTO (R_PPC64_JMP_SLOT, /* type */
581 0, /* rightshift */
582 0, /* size (0 = byte, 1 = short, 2 = long) */
583 0, /* bitsize */
b34976b6 584 FALSE, /* pc_relative */
5bd4f169
AM
585 0, /* bitpos */
586 complain_overflow_dont, /* complain_on_overflow */
805fc799 587 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 588 "R_PPC64_JMP_SLOT", /* name */
b34976b6 589 FALSE, /* partial_inplace */
5bd4f169
AM
590 0, /* src_mask */
591 0, /* dst_mask */
b34976b6 592 FALSE), /* pcrel_offset */
5bd4f169
AM
593
594 /* Used only by the dynamic linker. When the object is run, this
595 doubleword64 is set to the load address of the object, plus the
596 addend. */
597 HOWTO (R_PPC64_RELATIVE, /* type */
598 0, /* rightshift */
599 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
600 64, /* bitsize */
b34976b6 601 FALSE, /* pc_relative */
5bd4f169
AM
602 0, /* bitpos */
603 complain_overflow_dont, /* complain_on_overflow */
604 bfd_elf_generic_reloc, /* special_function */
605 "R_PPC64_RELATIVE", /* name */
b34976b6 606 FALSE, /* partial_inplace */
5bd4f169 607 0, /* src_mask */
f5e87a1d 608 ONES (64), /* dst_mask */
b34976b6 609 FALSE), /* pcrel_offset */
5bd4f169
AM
610
611 /* Like R_PPC64_ADDR32, but may be unaligned. */
612 HOWTO (R_PPC64_UADDR32, /* type */
613 0, /* rightshift */
614 2, /* size (0 = byte, 1 = short, 2 = long) */
615 32, /* bitsize */
b34976b6 616 FALSE, /* pc_relative */
5bd4f169
AM
617 0, /* bitpos */
618 complain_overflow_bitfield, /* complain_on_overflow */
619 bfd_elf_generic_reloc, /* special_function */
620 "R_PPC64_UADDR32", /* name */
b34976b6 621 FALSE, /* partial_inplace */
5bd4f169
AM
622 0, /* src_mask */
623 0xffffffff, /* dst_mask */
b34976b6 624 FALSE), /* pcrel_offset */
5bd4f169
AM
625
626 /* Like R_PPC64_ADDR16, but may be unaligned. */
627 HOWTO (R_PPC64_UADDR16, /* type */
628 0, /* rightshift */
629 1, /* size (0 = byte, 1 = short, 2 = long) */
630 16, /* bitsize */
b34976b6 631 FALSE, /* pc_relative */
5bd4f169
AM
632 0, /* bitpos */
633 complain_overflow_bitfield, /* complain_on_overflow */
634 bfd_elf_generic_reloc, /* special_function */
635 "R_PPC64_UADDR16", /* name */
b34976b6 636 FALSE, /* partial_inplace */
5bd4f169
AM
637 0, /* src_mask */
638 0xffff, /* dst_mask */
b34976b6 639 FALSE), /* pcrel_offset */
5bd4f169
AM
640
641 /* 32-bit PC relative. */
642 HOWTO (R_PPC64_REL32, /* type */
643 0, /* rightshift */
644 2, /* size (0 = byte, 1 = short, 2 = long) */
645 32, /* bitsize */
b34976b6 646 TRUE, /* pc_relative */
5bd4f169 647 0, /* bitpos */
5bd4f169
AM
648 complain_overflow_signed, /* complain_on_overflow */
649 bfd_elf_generic_reloc, /* special_function */
650 "R_PPC64_REL32", /* name */
b34976b6 651 FALSE, /* partial_inplace */
5bd4f169
AM
652 0, /* src_mask */
653 0xffffffff, /* dst_mask */
b34976b6 654 TRUE), /* pcrel_offset */
5bd4f169 655
10ed1bba 656 /* 32-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
657 HOWTO (R_PPC64_PLT32, /* type */
658 0, /* rightshift */
659 2, /* size (0 = byte, 1 = short, 2 = long) */
660 32, /* bitsize */
b34976b6 661 FALSE, /* pc_relative */
5bd4f169
AM
662 0, /* bitpos */
663 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 664 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 665 "R_PPC64_PLT32", /* name */
b34976b6 666 FALSE, /* partial_inplace */
5bd4f169 667 0, /* src_mask */
f5e87a1d 668 0xffffffff, /* dst_mask */
b34976b6 669 FALSE), /* pcrel_offset */
5bd4f169
AM
670
671 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
672 FIXME: R_PPC64_PLTREL32 not supported. */
673 HOWTO (R_PPC64_PLTREL32, /* type */
674 0, /* rightshift */
675 2, /* size (0 = byte, 1 = short, 2 = long) */
676 32, /* bitsize */
b34976b6 677 TRUE, /* pc_relative */
5bd4f169
AM
678 0, /* bitpos */
679 complain_overflow_signed, /* complain_on_overflow */
680 bfd_elf_generic_reloc, /* special_function */
681 "R_PPC64_PLTREL32", /* name */
b34976b6 682 FALSE, /* partial_inplace */
5bd4f169 683 0, /* src_mask */
f5e87a1d 684 0xffffffff, /* dst_mask */
b34976b6 685 TRUE), /* pcrel_offset */
5bd4f169
AM
686
687 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
688 the symbol. */
689 HOWTO (R_PPC64_PLT16_LO, /* type */
690 0, /* rightshift */
691 1, /* size (0 = byte, 1 = short, 2 = long) */
692 16, /* bitsize */
b34976b6 693 FALSE, /* pc_relative */
5bd4f169
AM
694 0, /* bitpos */
695 complain_overflow_dont, /* complain_on_overflow */
805fc799 696 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 697 "R_PPC64_PLT16_LO", /* name */
b34976b6 698 FALSE, /* partial_inplace */
5bd4f169
AM
699 0, /* src_mask */
700 0xffff, /* dst_mask */
b34976b6 701 FALSE), /* pcrel_offset */
5bd4f169
AM
702
703 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
704 the symbol. */
705 HOWTO (R_PPC64_PLT16_HI, /* type */
706 16, /* rightshift */
707 1, /* size (0 = byte, 1 = short, 2 = long) */
708 16, /* bitsize */
b34976b6 709 FALSE, /* pc_relative */
5bd4f169 710 0, /* bitpos */
f9c6b907 711 complain_overflow_signed, /* complain_on_overflow */
805fc799 712 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 713 "R_PPC64_PLT16_HI", /* name */
b34976b6 714 FALSE, /* partial_inplace */
5bd4f169
AM
715 0, /* src_mask */
716 0xffff, /* dst_mask */
b34976b6 717 FALSE), /* pcrel_offset */
5bd4f169
AM
718
719 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
720 the symbol. */
721 HOWTO (R_PPC64_PLT16_HA, /* type */
722 16, /* rightshift */
723 1, /* size (0 = byte, 1 = short, 2 = long) */
724 16, /* bitsize */
b34976b6 725 FALSE, /* pc_relative */
5bd4f169 726 0, /* bitpos */
f9c6b907 727 complain_overflow_signed, /* complain_on_overflow */
805fc799 728 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 729 "R_PPC64_PLT16_HA", /* name */
b34976b6 730 FALSE, /* partial_inplace */
5bd4f169
AM
731 0, /* src_mask */
732 0xffff, /* dst_mask */
b34976b6 733 FALSE), /* pcrel_offset */
5bd4f169 734
c061c2d8 735 /* 16-bit section relative relocation. */
5bd4f169
AM
736 HOWTO (R_PPC64_SECTOFF, /* type */
737 0, /* rightshift */
c061c2d8
AM
738 1, /* size (0 = byte, 1 = short, 2 = long) */
739 16, /* bitsize */
b34976b6 740 FALSE, /* pc_relative */
5bd4f169 741 0, /* bitpos */
b80eed39 742 complain_overflow_signed, /* complain_on_overflow */
805fc799 743 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 744 "R_PPC64_SECTOFF", /* name */
b34976b6 745 FALSE, /* partial_inplace */
5bd4f169 746 0, /* src_mask */
c061c2d8 747 0xffff, /* dst_mask */
b34976b6 748 FALSE), /* pcrel_offset */
5bd4f169 749
c061c2d8 750 /* Like R_PPC64_SECTOFF, but no overflow warning. */
5bd4f169
AM
751 HOWTO (R_PPC64_SECTOFF_LO, /* type */
752 0, /* rightshift */
753 1, /* size (0 = byte, 1 = short, 2 = long) */
754 16, /* bitsize */
b34976b6 755 FALSE, /* pc_relative */
5bd4f169
AM
756 0, /* bitpos */
757 complain_overflow_dont, /* complain_on_overflow */
805fc799 758 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 759 "R_PPC64_SECTOFF_LO", /* name */
b34976b6 760 FALSE, /* partial_inplace */
5bd4f169
AM
761 0, /* src_mask */
762 0xffff, /* dst_mask */
b34976b6 763 FALSE), /* pcrel_offset */
5bd4f169
AM
764
765 /* 16-bit upper half section relative relocation. */
766 HOWTO (R_PPC64_SECTOFF_HI, /* type */
767 16, /* rightshift */
768 1, /* size (0 = byte, 1 = short, 2 = long) */
769 16, /* bitsize */
b34976b6 770 FALSE, /* pc_relative */
5bd4f169 771 0, /* bitpos */
f9c6b907 772 complain_overflow_signed, /* complain_on_overflow */
805fc799 773 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 774 "R_PPC64_SECTOFF_HI", /* name */
b34976b6 775 FALSE, /* partial_inplace */
5bd4f169
AM
776 0, /* src_mask */
777 0xffff, /* dst_mask */
b34976b6 778 FALSE), /* pcrel_offset */
5bd4f169
AM
779
780 /* 16-bit upper half adjusted section relative relocation. */
781 HOWTO (R_PPC64_SECTOFF_HA, /* type */
782 16, /* rightshift */
783 1, /* size (0 = byte, 1 = short, 2 = long) */
784 16, /* bitsize */
b34976b6 785 FALSE, /* pc_relative */
5bd4f169 786 0, /* bitpos */
f9c6b907 787 complain_overflow_signed, /* complain_on_overflow */
805fc799 788 ppc64_elf_sectoff_ha_reloc, /* special_function */
5bd4f169 789 "R_PPC64_SECTOFF_HA", /* name */
b34976b6 790 FALSE, /* partial_inplace */
5bd4f169
AM
791 0, /* src_mask */
792 0xffff, /* dst_mask */
b34976b6 793 FALSE), /* pcrel_offset */
5bd4f169 794
04c9666a
AM
795 /* Like R_PPC64_REL24 without touching the two least significant bits. */
796 HOWTO (R_PPC64_REL30, /* type */
5bd4f169
AM
797 2, /* rightshift */
798 2, /* size (0 = byte, 1 = short, 2 = long) */
799 30, /* bitsize */
b34976b6 800 TRUE, /* pc_relative */
5bd4f169
AM
801 0, /* bitpos */
802 complain_overflow_dont, /* complain_on_overflow */
803 bfd_elf_generic_reloc, /* special_function */
04c9666a 804 "R_PPC64_REL30", /* name */
b34976b6 805 FALSE, /* partial_inplace */
d006db6c 806 0, /* src_mask */
5bd4f169 807 0xfffffffc, /* dst_mask */
b34976b6 808 TRUE), /* pcrel_offset */
5bd4f169
AM
809
810 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
811
812 /* A standard 64-bit relocation. */
813 HOWTO (R_PPC64_ADDR64, /* type */
814 0, /* rightshift */
815 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
816 64, /* bitsize */
b34976b6 817 FALSE, /* pc_relative */
5bd4f169
AM
818 0, /* bitpos */
819 complain_overflow_dont, /* complain_on_overflow */
820 bfd_elf_generic_reloc, /* special_function */
821 "R_PPC64_ADDR64", /* name */
b34976b6 822 FALSE, /* partial_inplace */
5bd4f169 823 0, /* src_mask */
f5e87a1d 824 ONES (64), /* dst_mask */
b34976b6 825 FALSE), /* pcrel_offset */
5bd4f169
AM
826
827 /* The bits 32-47 of an address. */
828 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
829 32, /* rightshift */
830 1, /* size (0 = byte, 1 = short, 2 = long) */
831 16, /* bitsize */
b34976b6 832 FALSE, /* pc_relative */
5bd4f169
AM
833 0, /* bitpos */
834 complain_overflow_dont, /* complain_on_overflow */
835 bfd_elf_generic_reloc, /* special_function */
836 "R_PPC64_ADDR16_HIGHER", /* name */
b34976b6 837 FALSE, /* partial_inplace */
5bd4f169
AM
838 0, /* src_mask */
839 0xffff, /* dst_mask */
b34976b6 840 FALSE), /* pcrel_offset */
5bd4f169
AM
841
842 /* The bits 32-47 of an address, plus 1 if the contents of the low
843 16 bits, treated as a signed number, is negative. */
844 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
845 32, /* rightshift */
846 1, /* size (0 = byte, 1 = short, 2 = long) */
847 16, /* bitsize */
b34976b6 848 FALSE, /* pc_relative */
5bd4f169
AM
849 0, /* bitpos */
850 complain_overflow_dont, /* complain_on_overflow */
805fc799 851 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 852 "R_PPC64_ADDR16_HIGHERA", /* name */
b34976b6 853 FALSE, /* partial_inplace */
5bd4f169
AM
854 0, /* src_mask */
855 0xffff, /* dst_mask */
b34976b6 856 FALSE), /* pcrel_offset */
5bd4f169
AM
857
858 /* The bits 48-63 of an address. */
859 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
860 48, /* rightshift */
861 1, /* size (0 = byte, 1 = short, 2 = long) */
862 16, /* bitsize */
b34976b6 863 FALSE, /* pc_relative */
5bd4f169
AM
864 0, /* bitpos */
865 complain_overflow_dont, /* complain_on_overflow */
866 bfd_elf_generic_reloc, /* special_function */
867 "R_PPC64_ADDR16_HIGHEST", /* name */
b34976b6 868 FALSE, /* partial_inplace */
5bd4f169
AM
869 0, /* src_mask */
870 0xffff, /* dst_mask */
b34976b6 871 FALSE), /* pcrel_offset */
5bd4f169
AM
872
873 /* The bits 48-63 of an address, plus 1 if the contents of the low
874 16 bits, treated as a signed number, is negative. */
875 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
876 48, /* rightshift */
877 1, /* size (0 = byte, 1 = short, 2 = long) */
878 16, /* bitsize */
b34976b6 879 FALSE, /* pc_relative */
5bd4f169
AM
880 0, /* bitpos */
881 complain_overflow_dont, /* complain_on_overflow */
805fc799 882 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 883 "R_PPC64_ADDR16_HIGHESTA", /* name */
b34976b6 884 FALSE, /* partial_inplace */
5bd4f169
AM
885 0, /* src_mask */
886 0xffff, /* dst_mask */
b34976b6 887 FALSE), /* pcrel_offset */
5bd4f169
AM
888
889 /* Like ADDR64, but may be unaligned. */
890 HOWTO (R_PPC64_UADDR64, /* type */
891 0, /* rightshift */
892 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
893 64, /* bitsize */
b34976b6 894 FALSE, /* pc_relative */
5bd4f169
AM
895 0, /* bitpos */
896 complain_overflow_dont, /* complain_on_overflow */
897 bfd_elf_generic_reloc, /* special_function */
898 "R_PPC64_UADDR64", /* name */
b34976b6 899 FALSE, /* partial_inplace */
5bd4f169 900 0, /* src_mask */
f5e87a1d 901 ONES (64), /* dst_mask */
b34976b6 902 FALSE), /* pcrel_offset */
5bd4f169
AM
903
904 /* 64-bit relative relocation. */
905 HOWTO (R_PPC64_REL64, /* type */
906 0, /* rightshift */
907 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
908 64, /* bitsize */
b34976b6 909 TRUE, /* pc_relative */
5bd4f169
AM
910 0, /* bitpos */
911 complain_overflow_dont, /* complain_on_overflow */
912 bfd_elf_generic_reloc, /* special_function */
913 "R_PPC64_REL64", /* name */
b34976b6 914 FALSE, /* partial_inplace */
5bd4f169 915 0, /* src_mask */
f5e87a1d 916 ONES (64), /* dst_mask */
b34976b6 917 TRUE), /* pcrel_offset */
5bd4f169 918
cedb70c5 919 /* 64-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
920 HOWTO (R_PPC64_PLT64, /* type */
921 0, /* rightshift */
922 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
923 64, /* bitsize */
b34976b6 924 FALSE, /* pc_relative */
5bd4f169
AM
925 0, /* bitpos */
926 complain_overflow_dont, /* complain_on_overflow */
805fc799 927 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 928 "R_PPC64_PLT64", /* name */
b34976b6 929 FALSE, /* partial_inplace */
5bd4f169 930 0, /* src_mask */
f5e87a1d 931 ONES (64), /* dst_mask */
b34976b6 932 FALSE), /* pcrel_offset */
5bd4f169
AM
933
934 /* 64-bit PC relative relocation to the symbol's procedure linkage
935 table. */
936 /* FIXME: R_PPC64_PLTREL64 not supported. */
937 HOWTO (R_PPC64_PLTREL64, /* type */
938 0, /* rightshift */
939 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
940 64, /* bitsize */
b34976b6 941 TRUE, /* pc_relative */
5bd4f169
AM
942 0, /* bitpos */
943 complain_overflow_dont, /* complain_on_overflow */
805fc799 944 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 945 "R_PPC64_PLTREL64", /* name */
b34976b6 946 FALSE, /* partial_inplace */
5bd4f169 947 0, /* src_mask */
f5e87a1d 948 ONES (64), /* dst_mask */
b34976b6 949 TRUE), /* pcrel_offset */
5bd4f169
AM
950
951 /* 16 bit TOC-relative relocation. */
952
953 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
954 HOWTO (R_PPC64_TOC16, /* type */
955 0, /* rightshift */
956 1, /* size (0 = byte, 1 = short, 2 = long) */
957 16, /* bitsize */
b34976b6 958 FALSE, /* pc_relative */
5bd4f169
AM
959 0, /* bitpos */
960 complain_overflow_signed, /* complain_on_overflow */
805fc799 961 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 962 "R_PPC64_TOC16", /* name */
b34976b6 963 FALSE, /* partial_inplace */
5bd4f169
AM
964 0, /* src_mask */
965 0xffff, /* dst_mask */
b34976b6 966 FALSE), /* pcrel_offset */
5bd4f169
AM
967
968 /* 16 bit TOC-relative relocation without overflow. */
969
970 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
971 HOWTO (R_PPC64_TOC16_LO, /* type */
972 0, /* rightshift */
973 1, /* size (0 = byte, 1 = short, 2 = long) */
974 16, /* bitsize */
b34976b6 975 FALSE, /* pc_relative */
5bd4f169
AM
976 0, /* bitpos */
977 complain_overflow_dont, /* complain_on_overflow */
805fc799 978 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 979 "R_PPC64_TOC16_LO", /* name */
b34976b6 980 FALSE, /* partial_inplace */
5bd4f169
AM
981 0, /* src_mask */
982 0xffff, /* dst_mask */
b34976b6 983 FALSE), /* pcrel_offset */
5bd4f169
AM
984
985 /* 16 bit TOC-relative relocation, high 16 bits. */
986
987 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
988 HOWTO (R_PPC64_TOC16_HI, /* type */
989 16, /* rightshift */
990 1, /* size (0 = byte, 1 = short, 2 = long) */
991 16, /* bitsize */
b34976b6 992 FALSE, /* pc_relative */
5bd4f169 993 0, /* bitpos */
f9c6b907 994 complain_overflow_signed, /* complain_on_overflow */
805fc799 995 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 996 "R_PPC64_TOC16_HI", /* name */
b34976b6 997 FALSE, /* partial_inplace */
5bd4f169
AM
998 0, /* src_mask */
999 0xffff, /* dst_mask */
b34976b6 1000 FALSE), /* pcrel_offset */
5bd4f169
AM
1001
1002 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
1003 contents of the low 16 bits, treated as a signed number, is
1004 negative. */
1005
1006 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
1007 HOWTO (R_PPC64_TOC16_HA, /* 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_ha_reloc, /* special_function */
5bd4f169 1015 "R_PPC64_TOC16_HA", /* 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 /* 64-bit relocation; insert value of TOC base (.TOC.). */
1022
1023 /* R_PPC64_TOC 51 doubleword64 .TOC. */
1024 HOWTO (R_PPC64_TOC, /* type */
1025 0, /* rightshift */
1026 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1027 64, /* bitsize */
b34976b6 1028 FALSE, /* pc_relative */
5bd4f169 1029 0, /* bitpos */
b80eed39 1030 complain_overflow_dont, /* complain_on_overflow */
805fc799 1031 ppc64_elf_toc64_reloc, /* special_function */
5bd4f169 1032 "R_PPC64_TOC", /* name */
b34976b6 1033 FALSE, /* partial_inplace */
5bd4f169 1034 0, /* src_mask */
f5e87a1d 1035 ONES (64), /* dst_mask */
b34976b6 1036 FALSE), /* pcrel_offset */
5bd4f169
AM
1037
1038 /* Like R_PPC64_GOT16, but also informs the link editor that the
1039 value to relocate may (!) refer to a PLT entry which the link
1040 editor (a) may replace with the symbol value. If the link editor
1041 is unable to fully resolve the symbol, it may (b) create a PLT
1042 entry and store the address to the new PLT entry in the GOT.
1043 This permits lazy resolution of function symbols at run time.
1044 The link editor may also skip all of this and just (c) emit a
1045 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1046 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1047 HOWTO (R_PPC64_PLTGOT16, /* type */
1048 0, /* rightshift */
1049 1, /* size (0 = byte, 1 = short, 2 = long) */
1050 16, /* bitsize */
b34976b6 1051 FALSE, /* pc_relative */
5bd4f169
AM
1052 0, /* bitpos */
1053 complain_overflow_signed, /* complain_on_overflow */
805fc799 1054 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb
AM
1055 "R_PPC64_PLTGOT16", /* name */
1056 FALSE, /* partial_inplace */
1057 0, /* src_mask */
1058 0xffff, /* dst_mask */
1059 FALSE), /* pcrel_offset */
1060
1061 /* Like R_PPC64_PLTGOT16, but without overflow. */
1062 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1063 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1064 0, /* rightshift */
1065 1, /* size (0 = byte, 1 = short, 2 = long) */
1066 16, /* bitsize */
1067 FALSE, /* pc_relative */
1068 0, /* bitpos */
1069 complain_overflow_dont, /* complain_on_overflow */
1070 ppc64_elf_unhandled_reloc, /* special_function */
1071 "R_PPC64_PLTGOT16_LO", /* name */
1072 FALSE, /* partial_inplace */
1073 0, /* src_mask */
1074 0xffff, /* dst_mask */
1075 FALSE), /* pcrel_offset */
1076
1077 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1078 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1079 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1080 16, /* rightshift */
1081 1, /* size (0 = byte, 1 = short, 2 = long) */
1082 16, /* bitsize */
1083 FALSE, /* pc_relative */
1084 0, /* bitpos */
f9c6b907 1085 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1086 ppc64_elf_unhandled_reloc, /* special_function */
1087 "R_PPC64_PLTGOT16_HI", /* name */
1088 FALSE, /* partial_inplace */
1089 0, /* src_mask */
1090 0xffff, /* dst_mask */
1091 FALSE), /* pcrel_offset */
1092
1093 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1094 1 if the contents of the low 16 bits, treated as a signed number,
1095 is negative. */
1096 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1097 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1098 16, /* rightshift */
1099 1, /* size (0 = byte, 1 = short, 2 = long) */
1100 16, /* bitsize */
1101 FALSE, /* pc_relative */
1102 0, /* bitpos */
f9c6b907 1103 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1104 ppc64_elf_unhandled_reloc, /* special_function */
1105 "R_PPC64_PLTGOT16_HA", /* name */
1106 FALSE, /* partial_inplace */
1107 0, /* src_mask */
1108 0xffff, /* dst_mask */
1109 FALSE), /* pcrel_offset */
1110
1111 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1112 HOWTO (R_PPC64_ADDR16_DS, /* type */
1113 0, /* rightshift */
1114 1, /* size (0 = byte, 1 = short, 2 = long) */
1115 16, /* bitsize */
1116 FALSE, /* pc_relative */
1117 0, /* bitpos */
b80eed39 1118 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1119 bfd_elf_generic_reloc, /* special_function */
1120 "R_PPC64_ADDR16_DS", /* name */
1121 FALSE, /* partial_inplace */
1122 0, /* src_mask */
1123 0xfffc, /* dst_mask */
1124 FALSE), /* pcrel_offset */
1125
1126 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1127 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1128 0, /* rightshift */
1129 1, /* size (0 = byte, 1 = short, 2 = long) */
1130 16, /* bitsize */
1131 FALSE, /* pc_relative */
1132 0, /* bitpos */
1133 complain_overflow_dont,/* complain_on_overflow */
1134 bfd_elf_generic_reloc, /* special_function */
1135 "R_PPC64_ADDR16_LO_DS",/* name */
1136 FALSE, /* partial_inplace */
1137 0, /* src_mask */
1138 0xfffc, /* dst_mask */
1139 FALSE), /* pcrel_offset */
1140
1141 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1142 HOWTO (R_PPC64_GOT16_DS, /* type */
1143 0, /* rightshift */
1144 1, /* size (0 = byte, 1 = short, 2 = long) */
1145 16, /* bitsize */
1146 FALSE, /* pc_relative */
1147 0, /* bitpos */
1148 complain_overflow_signed, /* complain_on_overflow */
1149 ppc64_elf_unhandled_reloc, /* special_function */
1150 "R_PPC64_GOT16_DS", /* name */
1151 FALSE, /* partial_inplace */
1152 0, /* src_mask */
1153 0xfffc, /* dst_mask */
1154 FALSE), /* pcrel_offset */
1155
1156 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1157 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1158 0, /* rightshift */
1159 1, /* size (0 = byte, 1 = short, 2 = long) */
1160 16, /* bitsize */
1161 FALSE, /* pc_relative */
1162 0, /* bitpos */
1163 complain_overflow_dont, /* complain_on_overflow */
1164 ppc64_elf_unhandled_reloc, /* special_function */
1165 "R_PPC64_GOT16_LO_DS", /* name */
1166 FALSE, /* partial_inplace */
1167 0, /* src_mask */
1168 0xfffc, /* dst_mask */
1169 FALSE), /* pcrel_offset */
1170
1171 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1172 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1173 0, /* rightshift */
1174 1, /* size (0 = byte, 1 = short, 2 = long) */
1175 16, /* bitsize */
1176 FALSE, /* pc_relative */
1177 0, /* bitpos */
1178 complain_overflow_dont, /* complain_on_overflow */
1179 ppc64_elf_unhandled_reloc, /* special_function */
1180 "R_PPC64_PLT16_LO_DS", /* name */
1181 FALSE, /* partial_inplace */
1182 0, /* src_mask */
1183 0xfffc, /* dst_mask */
1184 FALSE), /* pcrel_offset */
1185
1186 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1187 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1188 0, /* rightshift */
1189 1, /* size (0 = byte, 1 = short, 2 = long) */
1190 16, /* bitsize */
1191 FALSE, /* pc_relative */
1192 0, /* bitpos */
b80eed39 1193 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1194 ppc64_elf_sectoff_reloc, /* special_function */
1195 "R_PPC64_SECTOFF_DS", /* name */
1196 FALSE, /* partial_inplace */
1197 0, /* src_mask */
1198 0xfffc, /* dst_mask */
1199 FALSE), /* pcrel_offset */
1200
1201 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1202 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1203 0, /* rightshift */
1204 1, /* size (0 = byte, 1 = short, 2 = long) */
1205 16, /* bitsize */
1206 FALSE, /* pc_relative */
1207 0, /* bitpos */
1208 complain_overflow_dont, /* complain_on_overflow */
1209 ppc64_elf_sectoff_reloc, /* special_function */
1210 "R_PPC64_SECTOFF_LO_DS",/* name */
1211 FALSE, /* partial_inplace */
1212 0, /* src_mask */
1213 0xfffc, /* dst_mask */
1214 FALSE), /* pcrel_offset */
1215
1216 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1217 HOWTO (R_PPC64_TOC16_DS, /* type */
1218 0, /* rightshift */
1219 1, /* size (0 = byte, 1 = short, 2 = long) */
1220 16, /* bitsize */
1221 FALSE, /* pc_relative */
1222 0, /* bitpos */
1223 complain_overflow_signed, /* complain_on_overflow */
1224 ppc64_elf_toc_reloc, /* special_function */
1225 "R_PPC64_TOC16_DS", /* name */
1226 FALSE, /* partial_inplace */
1227 0, /* src_mask */
1228 0xfffc, /* dst_mask */
1229 FALSE), /* pcrel_offset */
1230
1231 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1232 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1233 0, /* rightshift */
1234 1, /* size (0 = byte, 1 = short, 2 = long) */
1235 16, /* bitsize */
1236 FALSE, /* pc_relative */
1237 0, /* bitpos */
1238 complain_overflow_dont, /* complain_on_overflow */
1239 ppc64_elf_toc_reloc, /* special_function */
1240 "R_PPC64_TOC16_LO_DS", /* name */
1241 FALSE, /* partial_inplace */
1242 0, /* src_mask */
1243 0xfffc, /* dst_mask */
1244 FALSE), /* pcrel_offset */
1245
1246 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1247 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
6bfdb61b 1248 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
411e1bfb
AM
1249 0, /* rightshift */
1250 1, /* size (0 = byte, 1 = short, 2 = long) */
1251 16, /* bitsize */
1252 FALSE, /* pc_relative */
1253 0, /* bitpos */
1254 complain_overflow_signed, /* complain_on_overflow */
1255 ppc64_elf_unhandled_reloc, /* special_function */
1256 "R_PPC64_PLTGOT16_DS", /* name */
1257 FALSE, /* partial_inplace */
1258 0, /* src_mask */
1259 0xfffc, /* dst_mask */
1260 FALSE), /* pcrel_offset */
1261
1262 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1263 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1264 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1265 0, /* rightshift */
1266 1, /* size (0 = byte, 1 = short, 2 = long) */
1267 16, /* bitsize */
1268 FALSE, /* pc_relative */
1269 0, /* bitpos */
1270 complain_overflow_dont, /* complain_on_overflow */
1271 ppc64_elf_unhandled_reloc, /* special_function */
1272 "R_PPC64_PLTGOT16_LO_DS",/* name */
1273 FALSE, /* partial_inplace */
1274 0, /* src_mask */
1275 0xfffc, /* dst_mask */
1276 FALSE), /* pcrel_offset */
1277
727fc41e 1278 /* Marker relocs for TLS. */
411e1bfb
AM
1279 HOWTO (R_PPC64_TLS,
1280 0, /* rightshift */
1281 2, /* size (0 = byte, 1 = short, 2 = long) */
1282 32, /* bitsize */
1283 FALSE, /* pc_relative */
1284 0, /* bitpos */
1285 complain_overflow_dont, /* complain_on_overflow */
1286 bfd_elf_generic_reloc, /* special_function */
1287 "R_PPC64_TLS", /* name */
1288 FALSE, /* partial_inplace */
1289 0, /* src_mask */
1290 0, /* dst_mask */
1291 FALSE), /* pcrel_offset */
1292
727fc41e
AM
1293 HOWTO (R_PPC64_TLSGD,
1294 0, /* rightshift */
1295 2, /* size (0 = byte, 1 = short, 2 = long) */
1296 32, /* bitsize */
1297 FALSE, /* pc_relative */
1298 0, /* bitpos */
1299 complain_overflow_dont, /* complain_on_overflow */
1300 bfd_elf_generic_reloc, /* special_function */
1301 "R_PPC64_TLSGD", /* name */
1302 FALSE, /* partial_inplace */
1303 0, /* src_mask */
1304 0, /* dst_mask */
1305 FALSE), /* pcrel_offset */
1306
1307 HOWTO (R_PPC64_TLSLD,
1308 0, /* rightshift */
1309 2, /* size (0 = byte, 1 = short, 2 = long) */
1310 32, /* bitsize */
1311 FALSE, /* pc_relative */
1312 0, /* bitpos */
1313 complain_overflow_dont, /* complain_on_overflow */
1314 bfd_elf_generic_reloc, /* special_function */
1315 "R_PPC64_TLSLD", /* name */
1316 FALSE, /* partial_inplace */
1317 0, /* src_mask */
1318 0, /* dst_mask */
1319 FALSE), /* pcrel_offset */
1320
3b421ab3
AM
1321 HOWTO (R_PPC64_TOCSAVE,
1322 0, /* rightshift */
1323 2, /* size (0 = byte, 1 = short, 2 = long) */
1324 32, /* bitsize */
1325 FALSE, /* pc_relative */
1326 0, /* bitpos */
1327 complain_overflow_dont, /* complain_on_overflow */
1328 bfd_elf_generic_reloc, /* special_function */
1329 "R_PPC64_TOCSAVE", /* name */
1330 FALSE, /* partial_inplace */
1331 0, /* src_mask */
1332 0, /* dst_mask */
1333 FALSE), /* pcrel_offset */
1334
411e1bfb
AM
1335 /* Computes the load module index of the load module that contains the
1336 definition of its TLS sym. */
1337 HOWTO (R_PPC64_DTPMOD64,
1338 0, /* rightshift */
1339 4, /* size (0 = byte, 1 = short, 2 = long) */
1340 64, /* bitsize */
1341 FALSE, /* pc_relative */
1342 0, /* bitpos */
1343 complain_overflow_dont, /* complain_on_overflow */
1344 ppc64_elf_unhandled_reloc, /* special_function */
1345 "R_PPC64_DTPMOD64", /* name */
1346 FALSE, /* partial_inplace */
1347 0, /* src_mask */
1348 ONES (64), /* dst_mask */
1349 FALSE), /* pcrel_offset */
1350
1351 /* Computes a dtv-relative displacement, the difference between the value
1352 of sym+add and the base address of the thread-local storage block that
1353 contains the definition of sym, minus 0x8000. */
1354 HOWTO (R_PPC64_DTPREL64,
1355 0, /* rightshift */
1356 4, /* size (0 = byte, 1 = short, 2 = long) */
1357 64, /* bitsize */
1358 FALSE, /* pc_relative */
1359 0, /* bitpos */
1360 complain_overflow_dont, /* complain_on_overflow */
1361 ppc64_elf_unhandled_reloc, /* special_function */
1362 "R_PPC64_DTPREL64", /* name */
1363 FALSE, /* partial_inplace */
1364 0, /* src_mask */
1365 ONES (64), /* dst_mask */
1366 FALSE), /* pcrel_offset */
1367
1368 /* A 16 bit dtprel reloc. */
1369 HOWTO (R_PPC64_DTPREL16,
1370 0, /* rightshift */
1371 1, /* size (0 = byte, 1 = short, 2 = long) */
1372 16, /* bitsize */
1373 FALSE, /* pc_relative */
1374 0, /* bitpos */
1375 complain_overflow_signed, /* complain_on_overflow */
1376 ppc64_elf_unhandled_reloc, /* special_function */
1377 "R_PPC64_DTPREL16", /* name */
1378 FALSE, /* partial_inplace */
1379 0, /* src_mask */
1380 0xffff, /* dst_mask */
1381 FALSE), /* pcrel_offset */
1382
1383 /* Like DTPREL16, but no overflow. */
1384 HOWTO (R_PPC64_DTPREL16_LO,
1385 0, /* rightshift */
1386 1, /* size (0 = byte, 1 = short, 2 = long) */
1387 16, /* bitsize */
1388 FALSE, /* pc_relative */
1389 0, /* bitpos */
1390 complain_overflow_dont, /* complain_on_overflow */
1391 ppc64_elf_unhandled_reloc, /* special_function */
1392 "R_PPC64_DTPREL16_LO", /* name */
1393 FALSE, /* partial_inplace */
1394 0, /* src_mask */
1395 0xffff, /* dst_mask */
1396 FALSE), /* pcrel_offset */
1397
1398 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1399 HOWTO (R_PPC64_DTPREL16_HI,
1400 16, /* rightshift */
1401 1, /* size (0 = byte, 1 = short, 2 = long) */
1402 16, /* bitsize */
1403 FALSE, /* pc_relative */
1404 0, /* bitpos */
f9c6b907 1405 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1406 ppc64_elf_unhandled_reloc, /* special_function */
1407 "R_PPC64_DTPREL16_HI", /* name */
1408 FALSE, /* partial_inplace */
1409 0, /* src_mask */
1410 0xffff, /* dst_mask */
1411 FALSE), /* pcrel_offset */
1412
1413 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1414 HOWTO (R_PPC64_DTPREL16_HA,
1415 16, /* rightshift */
1416 1, /* size (0 = byte, 1 = short, 2 = long) */
1417 16, /* bitsize */
1418 FALSE, /* pc_relative */
1419 0, /* bitpos */
f9c6b907 1420 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1421 ppc64_elf_unhandled_reloc, /* special_function */
1422 "R_PPC64_DTPREL16_HA", /* name */
1423 FALSE, /* partial_inplace */
1424 0, /* src_mask */
1425 0xffff, /* dst_mask */
1426 FALSE), /* pcrel_offset */
1427
1428 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1429 HOWTO (R_PPC64_DTPREL16_HIGHER,
1430 32, /* rightshift */
1431 1, /* size (0 = byte, 1 = short, 2 = long) */
1432 16, /* bitsize */
1433 FALSE, /* pc_relative */
1434 0, /* bitpos */
1435 complain_overflow_dont, /* complain_on_overflow */
1436 ppc64_elf_unhandled_reloc, /* special_function */
1437 "R_PPC64_DTPREL16_HIGHER", /* name */
1438 FALSE, /* partial_inplace */
1439 0, /* src_mask */
1440 0xffff, /* dst_mask */
1441 FALSE), /* pcrel_offset */
1442
1443 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1444 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1445 32, /* rightshift */
1446 1, /* size (0 = byte, 1 = short, 2 = long) */
1447 16, /* bitsize */
1448 FALSE, /* pc_relative */
1449 0, /* bitpos */
1450 complain_overflow_dont, /* complain_on_overflow */
1451 ppc64_elf_unhandled_reloc, /* special_function */
1452 "R_PPC64_DTPREL16_HIGHERA", /* name */
1453 FALSE, /* partial_inplace */
1454 0, /* src_mask */
1455 0xffff, /* dst_mask */
1456 FALSE), /* pcrel_offset */
1457
1458 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1459 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1460 48, /* rightshift */
1461 1, /* size (0 = byte, 1 = short, 2 = long) */
1462 16, /* bitsize */
1463 FALSE, /* pc_relative */
1464 0, /* bitpos */
1465 complain_overflow_dont, /* complain_on_overflow */
1466 ppc64_elf_unhandled_reloc, /* special_function */
1467 "R_PPC64_DTPREL16_HIGHEST", /* name */
1468 FALSE, /* partial_inplace */
1469 0, /* src_mask */
1470 0xffff, /* dst_mask */
1471 FALSE), /* pcrel_offset */
1472
1473 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1474 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1475 48, /* rightshift */
1476 1, /* size (0 = byte, 1 = short, 2 = long) */
1477 16, /* bitsize */
1478 FALSE, /* pc_relative */
1479 0, /* bitpos */
1480 complain_overflow_dont, /* complain_on_overflow */
1481 ppc64_elf_unhandled_reloc, /* special_function */
1482 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1483 FALSE, /* partial_inplace */
1484 0, /* src_mask */
1485 0xffff, /* dst_mask */
1486 FALSE), /* pcrel_offset */
1487
1488 /* Like DTPREL16, but for insns with a DS field. */
1489 HOWTO (R_PPC64_DTPREL16_DS,
1490 0, /* rightshift */
1491 1, /* size (0 = byte, 1 = short, 2 = long) */
1492 16, /* bitsize */
1493 FALSE, /* pc_relative */
1494 0, /* bitpos */
1495 complain_overflow_signed, /* complain_on_overflow */
1496 ppc64_elf_unhandled_reloc, /* special_function */
1497 "R_PPC64_DTPREL16_DS", /* name */
1498 FALSE, /* partial_inplace */
1499 0, /* src_mask */
1500 0xfffc, /* dst_mask */
1501 FALSE), /* pcrel_offset */
1502
1503 /* Like DTPREL16_DS, but no overflow. */
1504 HOWTO (R_PPC64_DTPREL16_LO_DS,
1505 0, /* rightshift */
1506 1, /* size (0 = byte, 1 = short, 2 = long) */
1507 16, /* bitsize */
1508 FALSE, /* pc_relative */
1509 0, /* bitpos */
1510 complain_overflow_dont, /* complain_on_overflow */
1511 ppc64_elf_unhandled_reloc, /* special_function */
1512 "R_PPC64_DTPREL16_LO_DS", /* name */
1513 FALSE, /* partial_inplace */
1514 0, /* src_mask */
1515 0xfffc, /* dst_mask */
1516 FALSE), /* pcrel_offset */
1517
1518 /* Computes a tp-relative displacement, the difference between the value of
1519 sym+add and the value of the thread pointer (r13). */
1520 HOWTO (R_PPC64_TPREL64,
1521 0, /* rightshift */
1522 4, /* size (0 = byte, 1 = short, 2 = long) */
1523 64, /* bitsize */
1524 FALSE, /* pc_relative */
1525 0, /* bitpos */
1526 complain_overflow_dont, /* complain_on_overflow */
1527 ppc64_elf_unhandled_reloc, /* special_function */
1528 "R_PPC64_TPREL64", /* name */
1529 FALSE, /* partial_inplace */
1530 0, /* src_mask */
1531 ONES (64), /* dst_mask */
1532 FALSE), /* pcrel_offset */
1533
1534 /* A 16 bit tprel reloc. */
1535 HOWTO (R_PPC64_TPREL16,
1536 0, /* rightshift */
1537 1, /* size (0 = byte, 1 = short, 2 = long) */
1538 16, /* bitsize */
1539 FALSE, /* pc_relative */
1540 0, /* bitpos */
1541 complain_overflow_signed, /* complain_on_overflow */
1542 ppc64_elf_unhandled_reloc, /* special_function */
1543 "R_PPC64_TPREL16", /* name */
1544 FALSE, /* partial_inplace */
1545 0, /* src_mask */
1546 0xffff, /* dst_mask */
1547 FALSE), /* pcrel_offset */
1548
1549 /* Like TPREL16, but no overflow. */
1550 HOWTO (R_PPC64_TPREL16_LO,
1551 0, /* rightshift */
1552 1, /* size (0 = byte, 1 = short, 2 = long) */
1553 16, /* bitsize */
1554 FALSE, /* pc_relative */
1555 0, /* bitpos */
1556 complain_overflow_dont, /* complain_on_overflow */
1557 ppc64_elf_unhandled_reloc, /* special_function */
1558 "R_PPC64_TPREL16_LO", /* name */
1559 FALSE, /* partial_inplace */
1560 0, /* src_mask */
1561 0xffff, /* dst_mask */
1562 FALSE), /* pcrel_offset */
1563
1564 /* Like TPREL16_LO, but next higher group of 16 bits. */
1565 HOWTO (R_PPC64_TPREL16_HI,
1566 16, /* rightshift */
1567 1, /* size (0 = byte, 1 = short, 2 = long) */
1568 16, /* bitsize */
1569 FALSE, /* pc_relative */
1570 0, /* bitpos */
f9c6b907 1571 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1572 ppc64_elf_unhandled_reloc, /* special_function */
1573 "R_PPC64_TPREL16_HI", /* name */
1574 FALSE, /* partial_inplace */
1575 0, /* src_mask */
1576 0xffff, /* dst_mask */
1577 FALSE), /* pcrel_offset */
1578
1579 /* Like TPREL16_HI, but adjust for low 16 bits. */
1580 HOWTO (R_PPC64_TPREL16_HA,
1581 16, /* rightshift */
1582 1, /* size (0 = byte, 1 = short, 2 = long) */
1583 16, /* bitsize */
1584 FALSE, /* pc_relative */
1585 0, /* bitpos */
f9c6b907 1586 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1587 ppc64_elf_unhandled_reloc, /* special_function */
1588 "R_PPC64_TPREL16_HA", /* name */
1589 FALSE, /* partial_inplace */
1590 0, /* src_mask */
1591 0xffff, /* dst_mask */
1592 FALSE), /* pcrel_offset */
1593
1594 /* Like TPREL16_HI, but next higher group of 16 bits. */
1595 HOWTO (R_PPC64_TPREL16_HIGHER,
1596 32, /* rightshift */
1597 1, /* size (0 = byte, 1 = short, 2 = long) */
1598 16, /* bitsize */
1599 FALSE, /* pc_relative */
1600 0, /* bitpos */
1601 complain_overflow_dont, /* complain_on_overflow */
1602 ppc64_elf_unhandled_reloc, /* special_function */
1603 "R_PPC64_TPREL16_HIGHER", /* name */
1604 FALSE, /* partial_inplace */
1605 0, /* src_mask */
1606 0xffff, /* dst_mask */
1607 FALSE), /* pcrel_offset */
1608
1609 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1610 HOWTO (R_PPC64_TPREL16_HIGHERA,
1611 32, /* rightshift */
1612 1, /* size (0 = byte, 1 = short, 2 = long) */
1613 16, /* bitsize */
1614 FALSE, /* pc_relative */
1615 0, /* bitpos */
1616 complain_overflow_dont, /* complain_on_overflow */
1617 ppc64_elf_unhandled_reloc, /* special_function */
1618 "R_PPC64_TPREL16_HIGHERA", /* name */
1619 FALSE, /* partial_inplace */
1620 0, /* src_mask */
1621 0xffff, /* dst_mask */
1622 FALSE), /* pcrel_offset */
1623
1624 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1625 HOWTO (R_PPC64_TPREL16_HIGHEST,
1626 48, /* rightshift */
1627 1, /* size (0 = byte, 1 = short, 2 = long) */
1628 16, /* bitsize */
1629 FALSE, /* pc_relative */
1630 0, /* bitpos */
1631 complain_overflow_dont, /* complain_on_overflow */
1632 ppc64_elf_unhandled_reloc, /* special_function */
1633 "R_PPC64_TPREL16_HIGHEST", /* name */
1634 FALSE, /* partial_inplace */
1635 0, /* src_mask */
1636 0xffff, /* dst_mask */
1637 FALSE), /* pcrel_offset */
1638
1639 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1640 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1641 48, /* rightshift */
1642 1, /* size (0 = byte, 1 = short, 2 = long) */
1643 16, /* bitsize */
1644 FALSE, /* pc_relative */
1645 0, /* bitpos */
1646 complain_overflow_dont, /* complain_on_overflow */
1647 ppc64_elf_unhandled_reloc, /* special_function */
1648 "R_PPC64_TPREL16_HIGHESTA", /* name */
1649 FALSE, /* partial_inplace */
1650 0, /* src_mask */
1651 0xffff, /* dst_mask */
1652 FALSE), /* pcrel_offset */
1653
1654 /* Like TPREL16, but for insns with a DS field. */
1655 HOWTO (R_PPC64_TPREL16_DS,
1656 0, /* rightshift */
1657 1, /* size (0 = byte, 1 = short, 2 = long) */
1658 16, /* bitsize */
1659 FALSE, /* pc_relative */
1660 0, /* bitpos */
1661 complain_overflow_signed, /* complain_on_overflow */
1662 ppc64_elf_unhandled_reloc, /* special_function */
1663 "R_PPC64_TPREL16_DS", /* name */
1664 FALSE, /* partial_inplace */
1665 0, /* src_mask */
1666 0xfffc, /* dst_mask */
1667 FALSE), /* pcrel_offset */
1668
1669 /* Like TPREL16_DS, but no overflow. */
1670 HOWTO (R_PPC64_TPREL16_LO_DS,
1671 0, /* rightshift */
1672 1, /* size (0 = byte, 1 = short, 2 = long) */
1673 16, /* bitsize */
1674 FALSE, /* pc_relative */
1675 0, /* bitpos */
1676 complain_overflow_dont, /* complain_on_overflow */
1677 ppc64_elf_unhandled_reloc, /* special_function */
1678 "R_PPC64_TPREL16_LO_DS", /* name */
1679 FALSE, /* partial_inplace */
1680 0, /* src_mask */
1681 0xfffc, /* dst_mask */
1682 FALSE), /* pcrel_offset */
1683
1684 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1685 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1686 to the first entry relative to the TOC base (r2). */
1687 HOWTO (R_PPC64_GOT_TLSGD16,
1688 0, /* rightshift */
1689 1, /* size (0 = byte, 1 = short, 2 = long) */
1690 16, /* bitsize */
1691 FALSE, /* pc_relative */
1692 0, /* bitpos */
1693 complain_overflow_signed, /* complain_on_overflow */
1694 ppc64_elf_unhandled_reloc, /* special_function */
1695 "R_PPC64_GOT_TLSGD16", /* name */
b34976b6 1696 FALSE, /* partial_inplace */
5bd4f169
AM
1697 0, /* src_mask */
1698 0xffff, /* dst_mask */
b34976b6 1699 FALSE), /* pcrel_offset */
5bd4f169 1700
411e1bfb
AM
1701 /* Like GOT_TLSGD16, but no overflow. */
1702 HOWTO (R_PPC64_GOT_TLSGD16_LO,
5bd4f169
AM
1703 0, /* rightshift */
1704 1, /* size (0 = byte, 1 = short, 2 = long) */
1705 16, /* bitsize */
b34976b6 1706 FALSE, /* pc_relative */
5bd4f169
AM
1707 0, /* bitpos */
1708 complain_overflow_dont, /* complain_on_overflow */
805fc799 1709 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1710 "R_PPC64_GOT_TLSGD16_LO", /* name */
b34976b6 1711 FALSE, /* partial_inplace */
5bd4f169
AM
1712 0, /* src_mask */
1713 0xffff, /* dst_mask */
b34976b6 1714 FALSE), /* pcrel_offset */
5bd4f169 1715
411e1bfb
AM
1716 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1717 HOWTO (R_PPC64_GOT_TLSGD16_HI,
5bd4f169
AM
1718 16, /* rightshift */
1719 1, /* size (0 = byte, 1 = short, 2 = long) */
1720 16, /* bitsize */
b34976b6 1721 FALSE, /* pc_relative */
5bd4f169 1722 0, /* bitpos */
f9c6b907 1723 complain_overflow_signed, /* complain_on_overflow */
805fc799 1724 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1725 "R_PPC64_GOT_TLSGD16_HI", /* name */
b34976b6 1726 FALSE, /* partial_inplace */
5bd4f169
AM
1727 0, /* src_mask */
1728 0xffff, /* dst_mask */
b34976b6 1729 FALSE), /* pcrel_offset */
5bd4f169 1730
411e1bfb
AM
1731 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1732 HOWTO (R_PPC64_GOT_TLSGD16_HA,
5bd4f169
AM
1733 16, /* rightshift */
1734 1, /* size (0 = byte, 1 = short, 2 = long) */
1735 16, /* bitsize */
b34976b6 1736 FALSE, /* pc_relative */
5bd4f169 1737 0, /* bitpos */
f9c6b907 1738 complain_overflow_signed, /* complain_on_overflow */
805fc799 1739 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1740 "R_PPC64_GOT_TLSGD16_HA", /* name */
b34976b6 1741 FALSE, /* partial_inplace */
5bd4f169
AM
1742 0, /* src_mask */
1743 0xffff, /* dst_mask */
b34976b6 1744 FALSE), /* pcrel_offset */
5bd4f169 1745
411e1bfb
AM
1746 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1747 with values (sym+add)@dtpmod and zero, and computes the offset to the
1748 first entry relative to the TOC base (r2). */
1749 HOWTO (R_PPC64_GOT_TLSLD16,
5bd4f169
AM
1750 0, /* rightshift */
1751 1, /* size (0 = byte, 1 = short, 2 = long) */
1752 16, /* bitsize */
b34976b6 1753 FALSE, /* pc_relative */
5bd4f169 1754 0, /* bitpos */
411e1bfb
AM
1755 complain_overflow_signed, /* complain_on_overflow */
1756 ppc64_elf_unhandled_reloc, /* special_function */
1757 "R_PPC64_GOT_TLSLD16", /* name */
b34976b6 1758 FALSE, /* partial_inplace */
d006db6c 1759 0, /* src_mask */
411e1bfb 1760 0xffff, /* dst_mask */
b34976b6 1761 FALSE), /* pcrel_offset */
5bd4f169 1762
411e1bfb
AM
1763 /* Like GOT_TLSLD16, but no overflow. */
1764 HOWTO (R_PPC64_GOT_TLSLD16_LO,
5bd4f169
AM
1765 0, /* rightshift */
1766 1, /* size (0 = byte, 1 = short, 2 = long) */
1767 16, /* bitsize */
b34976b6 1768 FALSE, /* pc_relative */
5bd4f169 1769 0, /* bitpos */
411e1bfb
AM
1770 complain_overflow_dont, /* complain_on_overflow */
1771 ppc64_elf_unhandled_reloc, /* special_function */
1772 "R_PPC64_GOT_TLSLD16_LO", /* name */
b34976b6 1773 FALSE, /* partial_inplace */
d006db6c 1774 0, /* src_mask */
411e1bfb 1775 0xffff, /* dst_mask */
b34976b6 1776 FALSE), /* pcrel_offset */
5bd4f169 1777
411e1bfb
AM
1778 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1779 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1780 16, /* rightshift */
5bd4f169
AM
1781 1, /* size (0 = byte, 1 = short, 2 = long) */
1782 16, /* bitsize */
b34976b6 1783 FALSE, /* pc_relative */
5bd4f169 1784 0, /* bitpos */
f9c6b907 1785 complain_overflow_signed, /* complain_on_overflow */
805fc799 1786 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1787 "R_PPC64_GOT_TLSLD16_HI", /* name */
b34976b6 1788 FALSE, /* partial_inplace */
d006db6c 1789 0, /* src_mask */
411e1bfb 1790 0xffff, /* dst_mask */
b34976b6 1791 FALSE), /* pcrel_offset */
5bd4f169 1792
411e1bfb
AM
1793 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1794 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1795 16, /* rightshift */
5bd4f169
AM
1796 1, /* size (0 = byte, 1 = short, 2 = long) */
1797 16, /* bitsize */
b34976b6 1798 FALSE, /* pc_relative */
5bd4f169 1799 0, /* bitpos */
f9c6b907 1800 complain_overflow_signed, /* complain_on_overflow */
805fc799 1801 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1802 "R_PPC64_GOT_TLSLD16_HA", /* name */
b34976b6 1803 FALSE, /* partial_inplace */
d006db6c 1804 0, /* src_mask */
411e1bfb 1805 0xffff, /* dst_mask */
b34976b6 1806 FALSE), /* pcrel_offset */
5bd4f169 1807
411e1bfb
AM
1808 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1809 the offset to the entry relative to the TOC base (r2). */
1810 HOWTO (R_PPC64_GOT_DTPREL16_DS,
5bd4f169
AM
1811 0, /* rightshift */
1812 1, /* size (0 = byte, 1 = short, 2 = long) */
1813 16, /* bitsize */
b34976b6 1814 FALSE, /* pc_relative */
5bd4f169 1815 0, /* bitpos */
411e1bfb 1816 complain_overflow_signed, /* complain_on_overflow */
805fc799 1817 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1818 "R_PPC64_GOT_DTPREL16_DS", /* name */
b34976b6 1819 FALSE, /* partial_inplace */
d006db6c 1820 0, /* src_mask */
5bd4f169 1821 0xfffc, /* dst_mask */
b34976b6 1822 FALSE), /* pcrel_offset */
5bd4f169 1823
411e1bfb
AM
1824 /* Like GOT_DTPREL16_DS, but no overflow. */
1825 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
5bd4f169 1826 0, /* rightshift */
c061c2d8
AM
1827 1, /* size (0 = byte, 1 = short, 2 = long) */
1828 16, /* bitsize */
b34976b6 1829 FALSE, /* pc_relative */
5bd4f169 1830 0, /* bitpos */
411e1bfb
AM
1831 complain_overflow_dont, /* complain_on_overflow */
1832 ppc64_elf_unhandled_reloc, /* special_function */
1833 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
b34976b6 1834 FALSE, /* partial_inplace */
d006db6c 1835 0, /* src_mask */
c061c2d8 1836 0xfffc, /* dst_mask */
b34976b6 1837 FALSE), /* pcrel_offset */
5bd4f169 1838
411e1bfb
AM
1839 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1840 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1841 16, /* rightshift */
5bd4f169
AM
1842 1, /* size (0 = byte, 1 = short, 2 = long) */
1843 16, /* bitsize */
b34976b6 1844 FALSE, /* pc_relative */
5bd4f169 1845 0, /* bitpos */
f9c6b907 1846 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1847 ppc64_elf_unhandled_reloc, /* special_function */
1848 "R_PPC64_GOT_DTPREL16_HI", /* name */
b34976b6 1849 FALSE, /* partial_inplace */
d006db6c 1850 0, /* src_mask */
411e1bfb 1851 0xffff, /* dst_mask */
b34976b6 1852 FALSE), /* pcrel_offset */
5bd4f169 1853
411e1bfb
AM
1854 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1855 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1856 16, /* rightshift */
1857 1, /* size (0 = byte, 1 = short, 2 = long) */
1858 16, /* bitsize */
1859 FALSE, /* pc_relative */
1860 0, /* bitpos */
f9c6b907 1861 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1862 ppc64_elf_unhandled_reloc, /* special_function */
1863 "R_PPC64_GOT_DTPREL16_HA", /* name */
1864 FALSE, /* partial_inplace */
1865 0, /* src_mask */
1866 0xffff, /* dst_mask */
1867 FALSE), /* pcrel_offset */
1868
1869 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1870 offset to the entry relative to the TOC base (r2). */
1871 HOWTO (R_PPC64_GOT_TPREL16_DS,
5bd4f169
AM
1872 0, /* rightshift */
1873 1, /* size (0 = byte, 1 = short, 2 = long) */
1874 16, /* bitsize */
b34976b6 1875 FALSE, /* pc_relative */
5bd4f169
AM
1876 0, /* bitpos */
1877 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1878 ppc64_elf_unhandled_reloc, /* special_function */
1879 "R_PPC64_GOT_TPREL16_DS", /* name */
b34976b6 1880 FALSE, /* partial_inplace */
d006db6c 1881 0, /* src_mask */
ad8e1ba5 1882 0xfffc, /* dst_mask */
b34976b6 1883 FALSE), /* pcrel_offset */
5bd4f169 1884
411e1bfb
AM
1885 /* Like GOT_TPREL16_DS, but no overflow. */
1886 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
5bd4f169
AM
1887 0, /* rightshift */
1888 1, /* size (0 = byte, 1 = short, 2 = long) */
1889 16, /* bitsize */
b34976b6 1890 FALSE, /* pc_relative */
5bd4f169
AM
1891 0, /* bitpos */
1892 complain_overflow_dont, /* complain_on_overflow */
411e1bfb
AM
1893 ppc64_elf_unhandled_reloc, /* special_function */
1894 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
b34976b6 1895 FALSE, /* partial_inplace */
d006db6c 1896 0, /* src_mask */
ad8e1ba5 1897 0xfffc, /* dst_mask */
b34976b6 1898 FALSE), /* pcrel_offset */
5bd4f169 1899
411e1bfb
AM
1900 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1901 HOWTO (R_PPC64_GOT_TPREL16_HI,
1902 16, /* rightshift */
5bd4f169
AM
1903 1, /* size (0 = byte, 1 = short, 2 = long) */
1904 16, /* bitsize */
b34976b6 1905 FALSE, /* pc_relative */
5bd4f169 1906 0, /* bitpos */
f9c6b907 1907 complain_overflow_signed, /* complain_on_overflow */
805fc799 1908 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1909 "R_PPC64_GOT_TPREL16_HI", /* name */
b34976b6 1910 FALSE, /* partial_inplace */
d006db6c 1911 0, /* src_mask */
411e1bfb 1912 0xffff, /* dst_mask */
b34976b6 1913 FALSE), /* pcrel_offset */
5bd4f169 1914
411e1bfb
AM
1915 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1916 HOWTO (R_PPC64_GOT_TPREL16_HA,
1917 16, /* rightshift */
5bd4f169
AM
1918 1, /* size (0 = byte, 1 = short, 2 = long) */
1919 16, /* bitsize */
b34976b6 1920 FALSE, /* pc_relative */
5bd4f169 1921 0, /* bitpos */
f9c6b907 1922 complain_overflow_signed, /* complain_on_overflow */
805fc799 1923 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1924 "R_PPC64_GOT_TPREL16_HA", /* name */
b34976b6 1925 FALSE, /* partial_inplace */
d006db6c 1926 0, /* src_mask */
411e1bfb 1927 0xffff, /* dst_mask */
b34976b6 1928 FALSE), /* pcrel_offset */
5bd4f169 1929
25f23106
AM
1930 HOWTO (R_PPC64_JMP_IREL, /* type */
1931 0, /* rightshift */
1932 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1933 0, /* bitsize */
1934 FALSE, /* pc_relative */
1935 0, /* bitpos */
1936 complain_overflow_dont, /* complain_on_overflow */
1937 ppc64_elf_unhandled_reloc, /* special_function */
1938 "R_PPC64_JMP_IREL", /* name */
1939 FALSE, /* partial_inplace */
1940 0, /* src_mask */
1941 0, /* dst_mask */
1942 FALSE), /* pcrel_offset */
1943
e054468f
AM
1944 HOWTO (R_PPC64_IRELATIVE, /* type */
1945 0, /* rightshift */
1946 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1947 64, /* bitsize */
1948 FALSE, /* pc_relative */
1949 0, /* bitpos */
1950 complain_overflow_dont, /* complain_on_overflow */
1951 bfd_elf_generic_reloc, /* special_function */
1952 "R_PPC64_IRELATIVE", /* name */
1953 FALSE, /* partial_inplace */
1954 0, /* src_mask */
1955 ONES (64), /* dst_mask */
1956 FALSE), /* pcrel_offset */
1957
25f23106
AM
1958 /* A 16 bit relative relocation. */
1959 HOWTO (R_PPC64_REL16, /* type */
1960 0, /* rightshift */
1961 1, /* size (0 = byte, 1 = short, 2 = long) */
1962 16, /* bitsize */
1963 TRUE, /* pc_relative */
1964 0, /* bitpos */
b80eed39 1965 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
1966 bfd_elf_generic_reloc, /* special_function */
1967 "R_PPC64_REL16", /* name */
1968 FALSE, /* partial_inplace */
1969 0, /* src_mask */
1970 0xffff, /* dst_mask */
1971 TRUE), /* pcrel_offset */
1972
1973 /* A 16 bit relative relocation without overflow. */
1974 HOWTO (R_PPC64_REL16_LO, /* type */
1975 0, /* rightshift */
1976 1, /* size (0 = byte, 1 = short, 2 = long) */
1977 16, /* bitsize */
1978 TRUE, /* pc_relative */
1979 0, /* bitpos */
1980 complain_overflow_dont,/* complain_on_overflow */
1981 bfd_elf_generic_reloc, /* special_function */
1982 "R_PPC64_REL16_LO", /* name */
1983 FALSE, /* partial_inplace */
1984 0, /* src_mask */
1985 0xffff, /* dst_mask */
1986 TRUE), /* pcrel_offset */
1987
1988 /* The high order 16 bits of a relative address. */
1989 HOWTO (R_PPC64_REL16_HI, /* type */
1990 16, /* rightshift */
1991 1, /* size (0 = byte, 1 = short, 2 = long) */
1992 16, /* bitsize */
1993 TRUE, /* pc_relative */
1994 0, /* bitpos */
f9c6b907 1995 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
1996 bfd_elf_generic_reloc, /* special_function */
1997 "R_PPC64_REL16_HI", /* name */
1998 FALSE, /* partial_inplace */
1999 0, /* src_mask */
2000 0xffff, /* dst_mask */
2001 TRUE), /* pcrel_offset */
2002
2003 /* The high order 16 bits of a relative address, plus 1 if the contents of
2004 the low 16 bits, treated as a signed number, is negative. */
2005 HOWTO (R_PPC64_REL16_HA, /* type */
2006 16, /* rightshift */
2007 1, /* size (0 = byte, 1 = short, 2 = long) */
2008 16, /* bitsize */
2009 TRUE, /* pc_relative */
2010 0, /* bitpos */
f9c6b907 2011 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
2012 ppc64_elf_ha_reloc, /* special_function */
2013 "R_PPC64_REL16_HA", /* name */
2014 FALSE, /* partial_inplace */
2015 0, /* src_mask */
2016 0xffff, /* dst_mask */
2017 TRUE), /* pcrel_offset */
2018
f9c6b907
AM
2019 /* Like R_PPC64_ADDR16_HI, but no overflow. */
2020 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
2021 16, /* rightshift */
2022 1, /* size (0 = byte, 1 = short, 2 = long) */
2023 16, /* bitsize */
2024 FALSE, /* pc_relative */
2025 0, /* bitpos */
2026 complain_overflow_dont, /* complain_on_overflow */
2027 bfd_elf_generic_reloc, /* special_function */
2028 "R_PPC64_ADDR16_HIGH", /* name */
2029 FALSE, /* partial_inplace */
2030 0, /* src_mask */
2031 0xffff, /* dst_mask */
2032 FALSE), /* pcrel_offset */
2033
2034 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2035 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2036 16, /* rightshift */
2037 1, /* size (0 = byte, 1 = short, 2 = long) */
2038 16, /* bitsize */
2039 FALSE, /* pc_relative */
2040 0, /* bitpos */
2041 complain_overflow_dont, /* complain_on_overflow */
2042 ppc64_elf_ha_reloc, /* special_function */
2043 "R_PPC64_ADDR16_HIGHA", /* name */
2044 FALSE, /* partial_inplace */
2045 0, /* src_mask */
2046 0xffff, /* dst_mask */
2047 FALSE), /* pcrel_offset */
2048
2049 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2050 HOWTO (R_PPC64_DTPREL16_HIGH,
2051 16, /* rightshift */
2052 1, /* size (0 = byte, 1 = short, 2 = long) */
2053 16, /* bitsize */
2054 FALSE, /* pc_relative */
2055 0, /* bitpos */
2056 complain_overflow_dont, /* complain_on_overflow */
2057 ppc64_elf_unhandled_reloc, /* special_function */
2058 "R_PPC64_DTPREL16_HIGH", /* name */
2059 FALSE, /* partial_inplace */
2060 0, /* src_mask */
2061 0xffff, /* dst_mask */
2062 FALSE), /* pcrel_offset */
2063
2064 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2065 HOWTO (R_PPC64_DTPREL16_HIGHA,
2066 16, /* rightshift */
2067 1, /* size (0 = byte, 1 = short, 2 = long) */
2068 16, /* bitsize */
2069 FALSE, /* pc_relative */
2070 0, /* bitpos */
2071 complain_overflow_dont, /* complain_on_overflow */
2072 ppc64_elf_unhandled_reloc, /* special_function */
2073 "R_PPC64_DTPREL16_HIGHA", /* name */
2074 FALSE, /* partial_inplace */
2075 0, /* src_mask */
2076 0xffff, /* dst_mask */
2077 FALSE), /* pcrel_offset */
2078
2079 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2080 HOWTO (R_PPC64_TPREL16_HIGH,
2081 16, /* rightshift */
2082 1, /* size (0 = byte, 1 = short, 2 = long) */
2083 16, /* bitsize */
2084 FALSE, /* pc_relative */
2085 0, /* bitpos */
2086 complain_overflow_dont, /* complain_on_overflow */
2087 ppc64_elf_unhandled_reloc, /* special_function */
2088 "R_PPC64_TPREL16_HIGH", /* name */
2089 FALSE, /* partial_inplace */
2090 0, /* src_mask */
2091 0xffff, /* dst_mask */
2092 FALSE), /* pcrel_offset */
2093
2094 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2095 HOWTO (R_PPC64_TPREL16_HIGHA,
2096 16, /* rightshift */
2097 1, /* size (0 = byte, 1 = short, 2 = long) */
2098 16, /* bitsize */
2099 FALSE, /* pc_relative */
2100 0, /* bitpos */
2101 complain_overflow_dont, /* complain_on_overflow */
2102 ppc64_elf_unhandled_reloc, /* special_function */
2103 "R_PPC64_TPREL16_HIGHA", /* name */
2104 FALSE, /* partial_inplace */
2105 0, /* src_mask */
2106 0xffff, /* dst_mask */
2107 FALSE), /* pcrel_offset */
2108
45965137
AM
2109 /* Like ADDR64, but use local entry point of function. */
2110 HOWTO (R_PPC64_ADDR64_LOCAL, /* type */
2111 0, /* rightshift */
2112 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
2113 64, /* bitsize */
2114 FALSE, /* pc_relative */
2115 0, /* bitpos */
2116 complain_overflow_dont, /* complain_on_overflow */
2117 bfd_elf_generic_reloc, /* special_function */
2118 "R_PPC64_ADDR64_LOCAL", /* name */
2119 FALSE, /* partial_inplace */
2120 0, /* src_mask */
2121 ONES (64), /* dst_mask */
2122 FALSE), /* pcrel_offset */
2123
5bd4f169
AM
2124 /* GNU extension to record C++ vtable hierarchy. */
2125 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2126 0, /* rightshift */
2127 0, /* size (0 = byte, 1 = short, 2 = long) */
2128 0, /* bitsize */
b34976b6 2129 FALSE, /* pc_relative */
5bd4f169
AM
2130 0, /* bitpos */
2131 complain_overflow_dont, /* complain_on_overflow */
2132 NULL, /* special_function */
2133 "R_PPC64_GNU_VTINHERIT", /* name */
b34976b6 2134 FALSE, /* partial_inplace */
5bd4f169
AM
2135 0, /* src_mask */
2136 0, /* dst_mask */
b34976b6 2137 FALSE), /* pcrel_offset */
5bd4f169
AM
2138
2139 /* GNU extension to record C++ vtable member usage. */
2140 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2141 0, /* rightshift */
2142 0, /* size (0 = byte, 1 = short, 2 = long) */
2143 0, /* bitsize */
b34976b6 2144 FALSE, /* pc_relative */
5bd4f169
AM
2145 0, /* bitpos */
2146 complain_overflow_dont, /* complain_on_overflow */
2147 NULL, /* special_function */
2148 "R_PPC64_GNU_VTENTRY", /* name */
b34976b6 2149 FALSE, /* partial_inplace */
5bd4f169
AM
2150 0, /* src_mask */
2151 0, /* dst_mask */
b34976b6 2152 FALSE), /* pcrel_offset */
5bd4f169
AM
2153};
2154
2155\f
2156/* Initialize the ppc64_elf_howto_table, so that linear accesses can
2157 be done. */
2158
2159static void
4ce794b7 2160ppc_howto_init (void)
5bd4f169
AM
2161{
2162 unsigned int i, type;
2163
2164 for (i = 0;
2165 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2166 i++)
2167 {
2168 type = ppc64_elf_howto_raw[i].type;
2169 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2170 / sizeof (ppc64_elf_howto_table[0])));
2171 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2172 }
2173}
2174
2175static reloc_howto_type *
4ce794b7
AM
2176ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2177 bfd_reloc_code_real_type code)
5bd4f169 2178{
411e1bfb 2179 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
5bd4f169
AM
2180
2181 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2182 /* Initialize howto table if needed. */
2183 ppc_howto_init ();
2184
4ce794b7 2185 switch (code)
5bd4f169
AM
2186 {
2187 default:
4ce794b7 2188 return NULL;
5bd4f169 2189
411e1bfb
AM
2190 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2191 break;
2192 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2193 break;
2194 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2195 break;
2196 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2197 break;
2198 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2199 break;
2200 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2201 break;
f9c6b907
AM
2202 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2203 break;
411e1bfb 2204 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
5bd4f169 2205 break;
f9c6b907
AM
2206 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2207 break;
411e1bfb 2208 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
5bd4f169 2209 break;
411e1bfb 2210 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
5bd4f169 2211 break;
411e1bfb 2212 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
5bd4f169 2213 break;
411e1bfb 2214 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
5bd4f169 2215 break;
411e1bfb 2216 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
5bd4f169 2217 break;
411e1bfb 2218 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
5bd4f169 2219 break;
411e1bfb 2220 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
5bd4f169 2221 break;
411e1bfb 2222 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
5bd4f169 2223 break;
411e1bfb 2224 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
5bd4f169 2225 break;
411e1bfb 2226 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
5bd4f169 2227 break;
411e1bfb 2228 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
5bd4f169 2229 break;
411e1bfb 2230 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
5bd4f169 2231 break;
411e1bfb 2232 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
5bd4f169 2233 break;
411e1bfb 2234 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
5bd4f169 2235 break;
411e1bfb 2236 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
5bd4f169 2237 break;
411e1bfb 2238 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
5bd4f169 2239 break;
411e1bfb 2240 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
5bd4f169 2241 break;
411e1bfb 2242 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
5bd4f169 2243 break;
411e1bfb 2244 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
5bd4f169 2245 break;
411e1bfb 2246 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
5bd4f169 2247 break;
411e1bfb 2248 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
5bd4f169 2249 break;
411e1bfb 2250 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
5bd4f169 2251 break;
411e1bfb 2252 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
5bd4f169 2253 break;
411e1bfb 2254 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
5bd4f169 2255 break;
411e1bfb 2256 case BFD_RELOC_64: r = R_PPC64_ADDR64;
5bd4f169 2257 break;
411e1bfb 2258 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
5bd4f169 2259 break;
411e1bfb 2260 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
5bd4f169 2261 break;
411e1bfb 2262 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
5bd4f169 2263 break;
411e1bfb 2264 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
5bd4f169 2265 break;
411e1bfb 2266 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
5bd4f169 2267 break;
411e1bfb 2268 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
5bd4f169 2269 break;
411e1bfb 2270 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
5bd4f169 2271 break;
411e1bfb 2272 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
5bd4f169 2273 break;
411e1bfb 2274 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
5bd4f169 2275 break;
411e1bfb 2276 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
5bd4f169 2277 break;
411e1bfb 2278 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
5bd4f169 2279 break;
411e1bfb 2280 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
5bd4f169 2281 break;
411e1bfb 2282 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
5bd4f169 2283 break;
411e1bfb 2284 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
5bd4f169 2285 break;
411e1bfb 2286 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
5bd4f169 2287 break;
411e1bfb 2288 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
5bd4f169 2289 break;
411e1bfb 2290 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
5bd4f169 2291 break;
411e1bfb 2292 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
5bd4f169 2293 break;
411e1bfb 2294 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
5bd4f169 2295 break;
411e1bfb 2296 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
5bd4f169 2297 break;
411e1bfb 2298 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
5bd4f169 2299 break;
411e1bfb 2300 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
5bd4f169 2301 break;
411e1bfb 2302 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
5bd4f169 2303 break;
411e1bfb 2304 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
5bd4f169 2305 break;
411e1bfb 2306 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
5bd4f169 2307 break;
411e1bfb 2308 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
5bd4f169 2309 break;
411e1bfb 2310 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
5bd4f169 2311 break;
411e1bfb 2312 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
5bd4f169 2313 break;
727fc41e
AM
2314 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2315 break;
2316 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2317 break;
411e1bfb 2318 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
5bd4f169 2319 break;
411e1bfb 2320 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
5bd4f169 2321 break;
411e1bfb 2322 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
5bd4f169 2323 break;
411e1bfb 2324 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
5bd4f169 2325 break;
f9c6b907
AM
2326 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2327 break;
411e1bfb 2328 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
5bd4f169 2329 break;
f9c6b907
AM
2330 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2331 break;
411e1bfb 2332 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
5bd4f169 2333 break;
411e1bfb
AM
2334 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2335 break;
2336 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2337 break;
2338 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2339 break;
f9c6b907
AM
2340 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2341 break;
411e1bfb
AM
2342 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2343 break;
f9c6b907
AM
2344 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2345 break;
411e1bfb
AM
2346 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2347 break;
2348 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2349 break;
2350 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2351 break;
2352 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2353 break;
2354 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2355 break;
2356 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2357 break;
2358 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2359 break;
2360 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2361 break;
2362 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2363 break;
2364 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2365 break;
2366 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2367 break;
2368 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2369 break;
2370 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2371 break;
2372 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2373 break;
2374 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2375 break;
2376 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2377 break;
2378 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2379 break;
2380 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2381 break;
2382 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2383 break;
2384 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2385 break;
2386 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2387 break;
2388 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2389 break;
2390 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2391 break;
2392 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2393 break;
2394 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2395 break;
2396 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2397 break;
2398 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2399 break;
2400 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2401 break;
2402 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2403 break;
25f23106
AM
2404 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2405 break;
2406 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2407 break;
2408 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2409 break;
2410 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2411 break;
45965137
AM
2412 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
2413 break;
411e1bfb
AM
2414 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2415 break;
2416 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
5bd4f169
AM
2417 break;
2418 }
2419
4ce794b7 2420 return ppc64_elf_howto_table[r];
5bd4f169
AM
2421};
2422
157090f7
AM
2423static reloc_howto_type *
2424ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2425 const char *r_name)
2426{
2427 unsigned int i;
2428
2429 for (i = 0;
2430 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2431 i++)
2432 if (ppc64_elf_howto_raw[i].name != NULL
2433 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2434 return &ppc64_elf_howto_raw[i];
2435
2436 return NULL;
2437}
2438
5bd4f169
AM
2439/* Set the howto pointer for a PowerPC ELF reloc. */
2440
2441static void
4ce794b7
AM
2442ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2443 Elf_Internal_Rela *dst)
5bd4f169 2444{
65f38f15
AM
2445 unsigned int type;
2446
ef60b7ff 2447 /* Initialize howto table if needed. */
5bd4f169 2448 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
2449 ppc_howto_init ();
2450
65f38f15 2451 type = ELF64_R_TYPE (dst->r_info);
d0fb9a8d
JJ
2452 if (type >= (sizeof (ppc64_elf_howto_table)
2453 / sizeof (ppc64_elf_howto_table[0])))
2454 {
2455 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
3ec2b351
NC
2456 abfd, (int) type);
2457 type = R_PPC64_NONE;
d0fb9a8d 2458 }
65f38f15 2459 cache_ptr->howto = ppc64_elf_howto_table[type];
5bd4f169
AM
2460}
2461
04c9666a 2462/* Handle the R_PPC64_ADDR16_HA and similar relocs. */
5bd4f169
AM
2463
2464static bfd_reloc_status_type
4ce794b7
AM
2465ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2466 void *data, asection *input_section,
2467 bfd *output_bfd, char **error_message)
5bd4f169 2468{
805fc799
AM
2469 /* If this is a relocatable link (output_bfd test tells us), just
2470 call the generic function. Any adjustment will be done at final
2471 link time. */
2472 if (output_bfd != NULL)
cedb70c5 2473 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2474 input_section, output_bfd, error_message);
2475
2476 /* Adjust the addend for sign extension of the low 16 bits.
2477 We won't actually be using the low 16 bits, so trashing them
2478 doesn't matter. */
2479 reloc_entry->addend += 0x8000;
2480 return bfd_reloc_continue;
2481}
5bd4f169 2482
2441e016
AM
2483static bfd_reloc_status_type
2484ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2485 void *data, asection *input_section,
2486 bfd *output_bfd, char **error_message)
2487{
2488 if (output_bfd != NULL)
2489 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2490 input_section, output_bfd, error_message);
2491
699733f6
AM
2492 if (strcmp (symbol->section->name, ".opd") == 0
2493 && (symbol->section->owner->flags & DYNAMIC) == 0)
2441e016
AM
2494 {
2495 bfd_vma dest = opd_entry_value (symbol->section,
2496 symbol->value + reloc_entry->addend,
aef36ac1 2497 NULL, NULL, FALSE);
2441e016
AM
2498 if (dest != (bfd_vma) -1)
2499 reloc_entry->addend = dest - (symbol->value
2500 + symbol->section->output_section->vma
2501 + symbol->section->output_offset);
2502 }
810d4e75
AM
2503 else
2504 {
2505 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
2506
2507 if (symbol->section->owner != abfd
2508 && abiversion (symbol->section->owner) >= 2)
2509 {
2510 unsigned int i;
2511
2512 for (i = 0; i < symbol->section->owner->symcount; ++i)
2513 {
2514 asymbol *symdef = symbol->section->owner->outsymbols[i];
2515
2516 if (strcmp (symdef->name, symbol->name) == 0)
2517 {
2518 elfsym = (elf_symbol_type *) symdef;
2519 break;
2520 }
2521 }
2522 }
2523 reloc_entry->addend
2524 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
2525 }
2441e016
AM
2526 return bfd_reloc_continue;
2527}
2528
805fc799 2529static bfd_reloc_status_type
4ce794b7
AM
2530ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2531 void *data, asection *input_section,
2532 bfd *output_bfd, char **error_message)
805fc799
AM
2533{
2534 long insn;
04c9666a 2535 enum elf_ppc64_reloc_type r_type;
805fc799 2536 bfd_size_type octets;
794e51c0
AM
2537 /* Assume 'at' branch hints. */
2538 bfd_boolean is_isa_v2 = TRUE;
805fc799
AM
2539
2540 /* If this is a relocatable link (output_bfd test tells us), just
2541 call the generic function. Any adjustment will be done at final
2542 link time. */
5bd4f169 2543 if (output_bfd != NULL)
cedb70c5 2544 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2545 input_section, output_bfd, error_message);
2546
2547 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2548 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2549 insn &= ~(0x01 << 21);
4ce794b7 2550 r_type = reloc_entry->howto->type;
805fc799
AM
2551 if (r_type == R_PPC64_ADDR14_BRTAKEN
2552 || r_type == R_PPC64_REL14_BRTAKEN)
cedb70c5 2553 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
805fc799 2554
794e51c0 2555 if (is_isa_v2)
5bd4f169 2556 {
805fc799
AM
2557 /* Set 'a' bit. This is 0b00010 in BO field for branch
2558 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2559 for branch on CTR insns (BO == 1a00t or 1a01t). */
2560 if ((insn & (0x14 << 21)) == (0x04 << 21))
2561 insn |= 0x02 << 21;
2562 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2563 insn |= 0x08 << 21;
2564 else
2441e016 2565 goto out;
5bd4f169 2566 }
805fc799
AM
2567 else
2568 {
2569 bfd_vma target = 0;
2570 bfd_vma from;
5bd4f169 2571
805fc799
AM
2572 if (!bfd_is_com_section (symbol->section))
2573 target = symbol->value;
2574 target += symbol->section->output_section->vma;
2575 target += symbol->section->output_offset;
2576 target += reloc_entry->addend;
5bd4f169 2577
805fc799
AM
2578 from = (reloc_entry->address
2579 + input_section->output_offset
2580 + input_section->output_section->vma);
5bd4f169 2581
805fc799
AM
2582 /* Invert 'y' bit if not the default. */
2583 if ((bfd_signed_vma) (target - from) < 0)
2584 insn ^= 0x01 << 21;
2585 }
4ce794b7 2586 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2441e016
AM
2587 out:
2588 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2589 input_section, output_bfd, error_message);
805fc799 2590}
5bd4f169 2591
805fc799 2592static bfd_reloc_status_type
4ce794b7
AM
2593ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2594 void *data, asection *input_section,
2595 bfd *output_bfd, char **error_message)
805fc799
AM
2596{
2597 /* If this is a relocatable link (output_bfd test tells us), just
2598 call the generic function. Any adjustment will be done at final
2599 link time. */
2600 if (output_bfd != NULL)
cedb70c5 2601 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799 2602 input_section, output_bfd, error_message);
5bd4f169 2603
805fc799
AM
2604 /* Subtract the symbol section base address. */
2605 reloc_entry->addend -= symbol->section->output_section->vma;
5bd4f169
AM
2606 return bfd_reloc_continue;
2607}
2608
805fc799 2609static bfd_reloc_status_type
4ce794b7
AM
2610ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2611 void *data, asection *input_section,
2612 bfd *output_bfd, char **error_message)
805fc799
AM
2613{
2614 /* If this is a relocatable link (output_bfd test tells us), just
2615 call the generic function. Any adjustment will be done at final
2616 link time. */
2617 if (output_bfd != NULL)
cedb70c5 2618 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2619 input_section, output_bfd, error_message);
2620
2621 /* Subtract the symbol section base address. */
2622 reloc_entry->addend -= symbol->section->output_section->vma;
2623
2624 /* Adjust the addend for sign extension of the low 16 bits. */
2625 reloc_entry->addend += 0x8000;
2626 return bfd_reloc_continue;
2627}
2628
2629static bfd_reloc_status_type
4ce794b7
AM
2630ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2631 void *data, asection *input_section,
2632 bfd *output_bfd, char **error_message)
805fc799
AM
2633{
2634 bfd_vma TOCstart;
2635
2636 /* If this is a relocatable link (output_bfd test tells us), just
2637 call the generic function. Any adjustment will be done at final
2638 link time. */
2639 if (output_bfd != NULL)
cedb70c5 2640 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2641 input_section, output_bfd, error_message);
2642
2643 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2644 if (TOCstart == 0)
1c865ab2 2645 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2646
2647 /* Subtract the TOC base address. */
2648 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2649 return bfd_reloc_continue;
2650}
2651
2652static bfd_reloc_status_type
4ce794b7
AM
2653ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2654 void *data, asection *input_section,
2655 bfd *output_bfd, char **error_message)
805fc799
AM
2656{
2657 bfd_vma TOCstart;
2658
2659 /* If this is a relocatable link (output_bfd test tells us), just
2660 call the generic function. Any adjustment will be done at final
2661 link time. */
2662 if (output_bfd != NULL)
cedb70c5 2663 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2664 input_section, output_bfd, error_message);
2665
2666 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2667 if (TOCstart == 0)
1c865ab2 2668 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2669
2670 /* Subtract the TOC base address. */
2671 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2672
2673 /* Adjust the addend for sign extension of the low 16 bits. */
2674 reloc_entry->addend += 0x8000;
2675 return bfd_reloc_continue;
2676}
2677
2678static bfd_reloc_status_type
4ce794b7
AM
2679ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2680 void *data, asection *input_section,
2681 bfd *output_bfd, char **error_message)
805fc799
AM
2682{
2683 bfd_vma TOCstart;
2684 bfd_size_type octets;
2685
2686 /* If this is a relocatable link (output_bfd test tells us), just
2687 call the generic function. Any adjustment will be done at final
2688 link time. */
2689 if (output_bfd != NULL)
cedb70c5 2690 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2691 input_section, output_bfd, error_message);
2692
2693 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2694 if (TOCstart == 0)
1c865ab2 2695 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2696
2697 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2698 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2699 return bfd_reloc_ok;
2700}
2701
2702static bfd_reloc_status_type
4ce794b7
AM
2703ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2704 void *data, asection *input_section,
2705 bfd *output_bfd, char **error_message)
805fc799
AM
2706{
2707 /* If this is a relocatable link (output_bfd test tells us), just
2708 call the generic function. Any adjustment will be done at final
2709 link time. */
2710 if (output_bfd != NULL)
cedb70c5 2711 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2712 input_section, output_bfd, error_message);
2713
2714 if (error_message != NULL)
2715 {
2716 static char buf[60];
2717 sprintf (buf, "generic linker can't handle %s",
2718 reloc_entry->howto->name);
2719 *error_message = buf;
2720 }
2721 return bfd_reloc_dangerous;
2722}
2723
927be08e
AM
2724/* Track GOT entries needed for a given symbol. We might need more
2725 than one got entry per symbol. */
2726struct got_entry
2727{
2728 struct got_entry *next;
2729
2730 /* The symbol addend that we'll be placing in the GOT. */
2731 bfd_vma addend;
2732
2733 /* Unlike other ELF targets, we use separate GOT entries for the same
2734 symbol referenced from different input files. This is to support
2735 automatic multiple TOC/GOT sections, where the TOC base can vary
2736 from one input file to another. After partitioning into TOC groups
2737 we merge entries within the group.
2738
2739 Point to the BFD owning this GOT entry. */
2740 bfd *owner;
2741
2742 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2743 TLS_TPREL or TLS_DTPREL for tls entries. */
f961d9dd 2744 unsigned char tls_type;
927be08e
AM
2745
2746 /* Non-zero if got.ent points to real entry. */
f961d9dd 2747 unsigned char is_indirect;
927be08e
AM
2748
2749 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2750 union
2751 {
2752 bfd_signed_vma refcount;
2753 bfd_vma offset;
2754 struct got_entry *ent;
2755 } got;
2756};
2757
2758/* The same for PLT. */
2759struct plt_entry
2760{
2761 struct plt_entry *next;
2762
2763 bfd_vma addend;
2764
2765 union
2766 {
2767 bfd_signed_vma refcount;
2768 bfd_vma offset;
2769 } plt;
2770};
2771
e717da7e
AM
2772struct ppc64_elf_obj_tdata
2773{
2774 struct elf_obj_tdata elf;
2775
2776 /* Shortcuts to dynamic linker sections. */
2777 asection *got;
2778 asection *relgot;
2779
b3fac117
AM
2780 /* Used during garbage collection. We attach global symbols defined
2781 on removed .opd entries to this section so that the sym is removed. */
2782 asection *deleted_section;
81688140 2783
927be08e 2784 /* TLS local dynamic got entry handling. Support for multiple GOT
e717da7e 2785 sections means we potentially need one of these for each input bfd. */
927be08e 2786 struct got_entry tlsld_got;
8860955f 2787
729eabd5
AM
2788 union {
2789 /* A copy of relocs before they are modified for --emit-relocs. */
2790 Elf_Internal_Rela *relocs;
2791
2792 /* Section contents. */
2793 bfd_byte *contents;
2794 } opd;
d77c8a4b
AM
2795
2796 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2797 the reloc to be in the range -32768 to 32767. */
98528052
AM
2798 unsigned int has_small_toc_reloc : 1;
2799
560c8763
AM
2800 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2801 instruction not one we handle. */
2802 unsigned int unexpected_toc_insn : 1;
e717da7e
AM
2803};
2804
2805#define ppc64_elf_tdata(bfd) \
2806 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2807
2808#define ppc64_tlsld_got(bfd) \
2809 (&ppc64_elf_tdata (bfd)->tlsld_got)
2810
0c8d6e5c
AM
2811#define is_ppc64_elf(bfd) \
2812 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
4dfe6ac6 2813 && elf_object_id (bfd) == PPC64_ELF_DATA)
0c8d6e5c 2814
e717da7e
AM
2815/* Override the generic function because we store some extras. */
2816
2817static bfd_boolean
2818ppc64_elf_mkobject (bfd *abfd)
2819{
0ffa91dd 2820 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
4dfe6ac6 2821 PPC64_ELF_DATA);
e717da7e
AM
2822}
2823
feee612b
AM
2824/* Fix bad default arch selected for a 64 bit input bfd when the
2825 default is 32 bit. */
2826
b34976b6 2827static bfd_boolean
4ce794b7 2828ppc64_elf_object_p (bfd *abfd)
feee612b
AM
2829{
2830 if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2831 {
2832 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2833
2834 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2835 {
2836 /* Relies on arch after 32 bit default being 64 bit default. */
2837 abfd->arch_info = abfd->arch_info->next;
2838 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2839 }
2840 }
b34976b6 2841 return TRUE;
feee612b
AM
2842}
2843
d37c89e5
AM
2844/* Support for core dump NOTE sections. */
2845
2846static bfd_boolean
2847ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2848{
eea6121a 2849 size_t offset, size;
d37c89e5
AM
2850
2851 if (note->descsz != 504)
2852 return FALSE;
2853
2854 /* pr_cursig */
228e534f 2855 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
d37c89e5
AM
2856
2857 /* pr_pid */
228e534f 2858 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
d37c89e5
AM
2859
2860 /* pr_reg */
2861 offset = 112;
eea6121a 2862 size = 384;
d37c89e5
AM
2863
2864 /* Make a ".reg/999" section. */
2865 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 2866 size, note->descpos + offset);
d37c89e5
AM
2867}
2868
2869static bfd_boolean
2870ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2871{
2872 if (note->descsz != 136)
2873 return FALSE;
2874
228e534f 2875 elf_tdata (abfd)->core->pid
bc989cdc 2876 = bfd_get_32 (abfd, note->descdata + 24);
228e534f 2877 elf_tdata (abfd)->core->program
d37c89e5 2878 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
228e534f 2879 elf_tdata (abfd)->core->command
d37c89e5
AM
2880 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2881
2882 return TRUE;
2883}
2884
183e98be
AM
2885static char *
2886ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2887 ...)
2888{
2889 switch (note_type)
2890 {
2891 default:
2892 return NULL;
2893
2894 case NT_PRPSINFO:
2895 {
2896 char data[136];
2897 va_list ap;
2898
2899 va_start (ap, note_type);
75cd47ed 2900 memset (data, 0, sizeof (data));
183e98be
AM
2901 strncpy (data + 40, va_arg (ap, const char *), 16);
2902 strncpy (data + 56, va_arg (ap, const char *), 80);
2903 va_end (ap);
2904 return elfcore_write_note (abfd, buf, bufsiz,
2905 "CORE", note_type, data, sizeof (data));
2906 }
2907
2908 case NT_PRSTATUS:
2909 {
2910 char data[504];
2911 va_list ap;
2912 long pid;
2913 int cursig;
2914 const void *greg;
2915
2916 va_start (ap, note_type);
2917 memset (data, 0, 112);
2918 pid = va_arg (ap, long);
2919 bfd_put_32 (abfd, pid, data + 32);
2920 cursig = va_arg (ap, int);
2921 bfd_put_16 (abfd, cursig, data + 12);
2922 greg = va_arg (ap, const void *);
2923 memcpy (data + 112, greg, 384);
2924 memset (data + 496, 0, 8);
2925 va_end (ap);
2926 return elfcore_write_note (abfd, buf, bufsiz,
2927 "CORE", note_type, data, sizeof (data));
2928 }
2929 }
2930}
2931
5d35169e
AM
2932/* Add extra PPC sections. */
2933
b35d266b 2934static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
7f4d3958 2935{
0112cd26
NC
2936 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
2937 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2938 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2939 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2940 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2941 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2942 { NULL, 0, 0, 0, 0 }
5d35169e
AM
2943};
2944
7c8fe5c4
AM
2945enum _ppc64_sec_type {
2946 sec_normal = 0,
2947 sec_opd = 1,
2948 sec_toc = 2
2949};
2950
f0abc2a1
AM
2951struct _ppc64_elf_section_data
2952{
2953 struct bfd_elf_section_data elf;
411e1bfb 2954
f0abc2a1
AM
2955 union
2956 {
74f0fb50
AM
2957 /* An array with one entry for each opd function descriptor. */
2958 struct _opd_sec_data
2959 {
2960 /* Points to the function code section for local opd entries. */
2961 asection **func_sec;
2962
2963 /* After editing .opd, adjust references to opd local syms. */
2964 long *adjust;
2965 } opd;
7c8fe5c4 2966
3a71aa26
AM
2967 /* An array for toc sections, indexed by offset/8. */
2968 struct _toc_sec_data
2969 {
2970 /* Specifies the relocation symbol index used at a given toc offset. */
2971 unsigned *symndx;
2972
2973 /* And the relocation addend. */
2974 bfd_vma *add;
2975 } toc;
7c8fe5c4
AM
2976 } u;
2977
2978 enum _ppc64_sec_type sec_type:2;
411e1bfb 2979
7c8fe5c4
AM
2980 /* Flag set when small branches are detected. Used to
2981 select suitable defaults for the stub group size. */
2982 unsigned int has_14bit_branch:1;
f0abc2a1
AM
2983};
2984
2985#define ppc64_elf_section_data(sec) \
411e1bfb 2986 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
f0abc2a1
AM
2987
2988static bfd_boolean
4ce794b7 2989ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 2990{
f592407e
AM
2991 if (!sec->used_by_bfd)
2992 {
2993 struct _ppc64_elf_section_data *sdata;
2994 bfd_size_type amt = sizeof (*sdata);
f0abc2a1 2995
f592407e
AM
2996 sdata = bfd_zalloc (abfd, amt);
2997 if (sdata == NULL)
2998 return FALSE;
2999 sec->used_by_bfd = sdata;
3000 }
f0abc2a1
AM
3001
3002 return _bfd_elf_new_section_hook (abfd, sec);
3003}
4025353c 3004
74f0fb50 3005static struct _opd_sec_data *
4025353c
AM
3006get_opd_info (asection * sec)
3007{
3008 if (sec != NULL
3009 && ppc64_elf_section_data (sec) != NULL
7c8fe5c4 3010 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
74f0fb50 3011 return &ppc64_elf_section_data (sec)->u.opd;
4025353c
AM
3012 return NULL;
3013}
90e3cdf2
JJ
3014\f
3015/* Parameters for the qsort hook. */
90e3cdf2
JJ
3016static bfd_boolean synthetic_relocatable;
3017
699733f6 3018/* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
90e3cdf2
JJ
3019
3020static int
3021compare_symbols (const void *ap, const void *bp)
3022{
3023 const asymbol *a = * (const asymbol **) ap;
3024 const asymbol *b = * (const asymbol **) bp;
3025
699733f6
AM
3026 /* Section symbols first. */
3027 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
90e3cdf2 3028 return -1;
699733f6 3029 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
90e3cdf2
JJ
3030 return 1;
3031
699733f6 3032 /* then .opd symbols. */
ffcfec52
AM
3033 if (strcmp (a->section->name, ".opd") == 0
3034 && strcmp (b->section->name, ".opd") != 0)
90e3cdf2 3035 return -1;
ffcfec52
AM
3036 if (strcmp (a->section->name, ".opd") != 0
3037 && strcmp (b->section->name, ".opd") == 0)
90e3cdf2
JJ
3038 return 1;
3039
699733f6 3040 /* then other code symbols. */
90e3cdf2
JJ
3041 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3042 == (SEC_CODE | SEC_ALLOC)
3043 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3044 != (SEC_CODE | SEC_ALLOC))
3045 return -1;
3046
3047 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3048 != (SEC_CODE | SEC_ALLOC)
3049 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3050 == (SEC_CODE | SEC_ALLOC))
3051 return 1;
3052
3053 if (synthetic_relocatable)
3054 {
3055 if (a->section->id < b->section->id)
3056 return -1;
3057
3058 if (a->section->id > b->section->id)
3059 return 1;
3060 }
3061
3062 if (a->value + a->section->vma < b->value + b->section->vma)
3063 return -1;
3064
3065 if (a->value + a->section->vma > b->value + b->section->vma)
3066 return 1;
3067
4d35a0aa
AM
3068 /* For syms with the same value, prefer strong dynamic global function
3069 syms over other syms. */
3070 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3071 return -1;
3072
3073 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3074 return 1;
3075
3076 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3077 return -1;
3078
3079 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3080 return 1;
3081
3082 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3083 return -1;
3084
3085 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3086 return 1;
3087
3088 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3089 return -1;
3090
3091 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3092 return 1;
3093
90e3cdf2
JJ
3094 return 0;
3095}
3096
699733f6 3097/* Search SYMS for a symbol of the given VALUE. */
90e3cdf2 3098
699733f6
AM
3099static asymbol *
3100sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
90e3cdf2 3101{
699733f6 3102 long mid;
90e3cdf2 3103
699733f6
AM
3104 if (id == -1)
3105 {
3106 while (lo < hi)
3107 {
3108 mid = (lo + hi) >> 1;
3109 if (syms[mid]->value + syms[mid]->section->vma < value)
3110 lo = mid + 1;
3111 else if (syms[mid]->value + syms[mid]->section->vma > value)
3112 hi = mid;
3113 else
3114 return syms[mid];
3115 }
3116 }
3117 else
3118 {
3119 while (lo < hi)
3120 {
3121 mid = (lo + hi) >> 1;
3122 if (syms[mid]->section->id < id)
3123 lo = mid + 1;
3124 else if (syms[mid]->section->id > id)
3125 hi = mid;
3126 else if (syms[mid]->value < value)
3127 lo = mid + 1;
3128 else if (syms[mid]->value > value)
3129 hi = mid;
3130 else
3131 return syms[mid];
3132 }
3133 }
3134 return NULL;
90e3cdf2
JJ
3135}
3136
468392fb
AM
3137static bfd_boolean
3138section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3139{
3140 bfd_vma vma = *(bfd_vma *) ptr;
3141 return ((section->flags & SEC_ALLOC) != 0
3142 && section->vma <= vma
3143 && vma < section->vma + section->size);
3144}
3145
699733f6 3146/* Create synthetic symbols, effectively restoring "dot-symbol" function
468392fb 3147 entry syms. Also generate @plt symbols for the glink branch table. */
90e3cdf2
JJ
3148
3149static long
a7535cf3
AM
3150ppc64_elf_get_synthetic_symtab (bfd *abfd,
3151 long static_count, asymbol **static_syms,
3152 long dyn_count, asymbol **dyn_syms,
c9727e01 3153 asymbol **ret)
90e3cdf2
JJ
3154{
3155 asymbol *s;
699733f6
AM
3156 long i;
3157 long count;
90e3cdf2 3158 char *names;
a7535cf3 3159 long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
ee67d69a 3160 asection *opd = NULL;
90e3cdf2 3161 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 3162 asymbol **syms;
ee67d69a 3163 int abi = abiversion (abfd);
90e3cdf2
JJ
3164
3165 *ret = NULL;
3166
ee67d69a
AM
3167 if (abi < 2)
3168 {
3169 opd = bfd_get_section_by_name (abfd, ".opd");
3170 if (opd == NULL && abi == 1)
3171 return 0;
3172 }
90e3cdf2 3173
a7535cf3 3174 symcount = static_count;
c9727e01 3175 if (!relocatable)
a7535cf3 3176 symcount += dyn_count;
90e3cdf2 3177 if (symcount == 0)
c9727e01 3178 return 0;
90e3cdf2 3179
a7535cf3
AM
3180 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3181 if (syms == NULL)
7356fed5 3182 return -1;
a7535cf3
AM
3183
3184 if (!relocatable && static_count != 0 && dyn_count != 0)
3185 {
3186 /* Use both symbol tables. */
3187 memcpy (syms, static_syms, static_count * sizeof (*syms));
3188 memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
3189 }
3190 else if (!relocatable && static_count == 0)
3191 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3192 else
3193 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3194
90e3cdf2 3195 synthetic_relocatable = relocatable;
595da8c5 3196 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 3197
c9727e01
AM
3198 if (!relocatable && symcount > 1)
3199 {
3200 long j;
3201 /* Trim duplicate syms, since we may have merged the normal and
3202 dynamic symbols. Actually, we only care about syms that have
3b36f7e6 3203 different values, so trim any with the same value. */
c9727e01
AM
3204 for (i = 1, j = 1; i < symcount; ++i)
3205 if (syms[i - 1]->value + syms[i - 1]->section->vma
3206 != syms[i]->value + syms[i]->section->vma)
3207 syms[j++] = syms[i];
3208 symcount = j;
3209 }
3210
699733f6 3211 i = 0;
ffcfec52 3212 if (strcmp (syms[i]->section->name, ".opd") == 0)
699733f6
AM
3213 ++i;
3214 codesecsym = i;
90e3cdf2 3215
699733f6
AM
3216 for (; i < symcount; ++i)
3217 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3218 != (SEC_CODE | SEC_ALLOC))
3219 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3220 break;
3221 codesecsymend = i;
90e3cdf2 3222
699733f6
AM
3223 for (; i < symcount; ++i)
3224 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3225 break;
3226 secsymend = i;
90e3cdf2 3227
699733f6 3228 for (; i < symcount; ++i)
ffcfec52 3229 if (strcmp (syms[i]->section->name, ".opd") != 0)
699733f6
AM
3230 break;
3231 opdsymend = i;
90e3cdf2 3232
699733f6
AM
3233 for (; i < symcount; ++i)
3234 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3235 != (SEC_CODE | SEC_ALLOC))
3236 break;
3237 symcount = i;
3238
c9727e01 3239 count = 0;
90e3cdf2 3240
699733f6 3241 if (relocatable)
90e3cdf2 3242 {
699733f6
AM
3243 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3244 arelent *r;
3245 size_t size;
3246 long relcount;
90e3cdf2 3247
468392fb
AM
3248 if (opdsymend == secsymend)
3249 goto done;
3250
699733f6 3251 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2 3252 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
7356fed5 3253 if (relcount == 0)
c9727e01 3254 goto done;
90e3cdf2 3255
7356fed5
AM
3256 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3257 {
3258 count = -1;
3259 goto done;
3260 }
3261
699733f6 3262 size = 0;
595da8c5 3263 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
3264 {
3265 asymbol *sym;
90e3cdf2 3266
595da8c5 3267 while (r < opd->relocation + relcount
699733f6
AM
3268 && r->address < syms[i]->value + opd->vma)
3269 ++r;
90e3cdf2 3270
595da8c5 3271 if (r == opd->relocation + relcount)
699733f6 3272 break;
90e3cdf2 3273
699733f6
AM
3274 if (r->address != syms[i]->value + opd->vma)
3275 continue;
90e3cdf2 3276
699733f6
AM
3277 if (r->howto->type != R_PPC64_ADDR64)
3278 continue;
90e3cdf2 3279
699733f6
AM
3280 sym = *r->sym_ptr_ptr;
3281 if (!sym_exists_at (syms, opdsymend, symcount,
3282 sym->section->id, sym->value + r->addend))
3283 {
3284 ++count;
3285 size += sizeof (asymbol);
3286 size += strlen (syms[i]->name) + 2;
3287 }
3288 }
90e3cdf2 3289
699733f6
AM
3290 s = *ret = bfd_malloc (size);
3291 if (s == NULL)
3292 {
7356fed5 3293 count = -1;
c9727e01 3294 goto done;
699733f6 3295 }
90e3cdf2 3296
699733f6 3297 names = (char *) (s + count);
90e3cdf2 3298
595da8c5 3299 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 3300 {
699733f6 3301 asymbol *sym;
90e3cdf2 3302
595da8c5 3303 while (r < opd->relocation + relcount
699733f6
AM
3304 && r->address < syms[i]->value + opd->vma)
3305 ++r;
90e3cdf2 3306
595da8c5 3307 if (r == opd->relocation + relcount)
699733f6
AM
3308 break;
3309
3310 if (r->address != syms[i]->value + opd->vma)
3311 continue;
3312
3313 if (r->howto->type != R_PPC64_ADDR64)
3314 continue;
90e3cdf2 3315
699733f6
AM
3316 sym = *r->sym_ptr_ptr;
3317 if (!sym_exists_at (syms, opdsymend, symcount,
3318 sym->section->id, sym->value + r->addend))
3319 {
3320 size_t len;
3321
3322 *s = *syms[i];
6ba2a415 3323 s->flags |= BSF_SYNTHETIC;
699733f6
AM
3324 s->section = sym->section;
3325 s->value = sym->value + r->addend;
3326 s->name = names;
3327 *names++ = '.';
3328 len = strlen (syms[i]->name);
3329 memcpy (names, syms[i]->name, len + 1);
3330 names += len + 1;
6f610d07
UW
3331 /* Have udata.p point back to the original symbol this
3332 synthetic symbol was derived from. */
3333 s->udata.p = syms[i];
699733f6
AM
3334 s++;
3335 }
3336 }
3337 }
3338 else
90e3cdf2 3339 {
468392fb 3340 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
ee67d69a 3341 bfd_byte *contents = NULL;
699733f6 3342 size_t size;
468392fb
AM
3343 long plt_count = 0;
3344 bfd_vma glink_vma = 0, resolv_vma = 0;
3345 asection *dynamic, *glink = NULL, *relplt = NULL;
3346 arelent *p;
90e3cdf2 3347
ee67d69a 3348 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
699733f6 3349 {
ee67d69a 3350 free_contents_and_exit:
699733f6 3351 if (contents)
ee67d69a 3352 free (contents);
7356fed5 3353 count = -1;
c9727e01 3354 goto done;
699733f6 3355 }
90e3cdf2 3356
699733f6
AM
3357 size = 0;
3358 for (i = secsymend; i < opdsymend; ++i)
3359 {
3360 bfd_vma ent;
90e3cdf2 3361
5ef11c02
AM
3362 /* Ignore bogus symbols. */
3363 if (syms[i]->value > opd->size - 8)
3364 continue;
3365
699733f6
AM
3366 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3367 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3368 {
3369 ++count;
3370 size += sizeof (asymbol);
3371 size += strlen (syms[i]->name) + 2;
3372 }
3373 }
90e3cdf2 3374
468392fb 3375 /* Get start of .glink stubs from DT_PPC64_GLINK. */
066ee829
AM
3376 if (dyn_count != 0
3377 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
468392fb
AM
3378 {
3379 bfd_byte *dynbuf, *extdyn, *extdynend;
3380 size_t extdynsize;
3381 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3382
3383 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3384 goto free_contents_and_exit;
3385
3386 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3387 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3388
3389 extdyn = dynbuf;
3390 extdynend = extdyn + dynamic->size;
3391 for (; extdyn < extdynend; extdyn += extdynsize)
3392 {
3393 Elf_Internal_Dyn dyn;
3394 (*swap_dyn_in) (abfd, extdyn, &dyn);
3395
3396 if (dyn.d_tag == DT_NULL)
3397 break;
3398
3399 if (dyn.d_tag == DT_PPC64_GLINK)
3400 {
b9e5796b
AM
3401 /* The first glink stub starts at offset 32; see
3402 comment in ppc64_elf_finish_dynamic_sections. */
3403 glink_vma = dyn.d_un.d_val + GLINK_CALL_STUB_SIZE - 8 * 4;
468392fb
AM
3404 /* The .glink section usually does not survive the final
3405 link; search for the section (usually .text) where the
3406 glink stubs now reside. */
3407 glink = bfd_sections_find_if (abfd, section_covers_vma,
3408 &glink_vma);
3409 break;
3410 }
3411 }
3412
3413 free (dynbuf);
3414 }
3415
3416 if (glink != NULL)
3417 {
3418 /* Determine __glink trampoline by reading the relative branch
3419 from the first glink stub. */
3420 bfd_byte buf[4];
b9e5796b
AM
3421 unsigned int off = 0;
3422
3423 while (bfd_get_section_contents (abfd, glink, buf,
3424 glink_vma + off - glink->vma, 4))
468392fb
AM
3425 {
3426 unsigned int insn = bfd_get_32 (abfd, buf);
3427 insn ^= B_DOT;
3428 if ((insn & ~0x3fffffc) == 0)
b9e5796b
AM
3429 {
3430 resolv_vma = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
3431 break;
3432 }
3433 off += 4;
3434 if (off > 4)
3435 break;
468392fb
AM
3436 }
3437
3438 if (resolv_vma)
3439 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
468392fb 3440
066ee829
AM
3441 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3442 if (relplt != NULL)
3443 {
3444 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3445 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3446 goto free_contents_and_exit;
68ffbac6 3447
066ee829
AM
3448 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3449 size += plt_count * sizeof (asymbol);
468392fb 3450
066ee829
AM
3451 p = relplt->relocation;
3452 for (i = 0; i < plt_count; i++, p++)
e054468f
AM
3453 {
3454 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3455 if (p->addend != 0)
3456 size += sizeof ("+0x") - 1 + 16;
3457 }
066ee829 3458 }
468392fb
AM
3459 }
3460
699733f6
AM
3461 s = *ret = bfd_malloc (size);
3462 if (s == NULL)
7356fed5 3463 goto free_contents_and_exit;
90e3cdf2 3464
468392fb 3465 names = (char *) (s + count + plt_count + (resolv_vma != 0));
90e3cdf2 3466
699733f6 3467 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 3468 {
699733f6 3469 bfd_vma ent;
90e3cdf2 3470
5ef11c02
AM
3471 if (syms[i]->value > opd->size - 8)
3472 continue;
3473
699733f6
AM
3474 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3475 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 3476 {
c9727e01 3477 long lo, hi;
699733f6 3478 size_t len;
c9727e01 3479 asection *sec = abfd->sections;
90e3cdf2 3480
699733f6
AM
3481 *s = *syms[i];
3482 lo = codesecsym;
3483 hi = codesecsymend;
3484 while (lo < hi)
3485 {
c9727e01 3486 long mid = (lo + hi) >> 1;
699733f6
AM
3487 if (syms[mid]->section->vma < ent)
3488 lo = mid + 1;
3489 else if (syms[mid]->section->vma > ent)
3490 hi = mid;
3491 else
c9727e01
AM
3492 {
3493 sec = syms[mid]->section;
3494 break;
3495 }
699733f6
AM
3496 }
3497
c9727e01 3498 if (lo >= hi && lo > codesecsym)
699733f6 3499 sec = syms[lo - 1]->section;
699733f6
AM
3500
3501 for (; sec != NULL; sec = sec->next)
3502 {
3503 if (sec->vma > ent)
3504 break;
63524580
JK
3505 /* SEC_LOAD may not be set if SEC is from a separate debug
3506 info file. */
3507 if ((sec->flags & SEC_ALLOC) == 0)
699733f6
AM
3508 break;
3509 if ((sec->flags & SEC_CODE) != 0)
3510 s->section = sec;
3511 }
6ba2a415 3512 s->flags |= BSF_SYNTHETIC;
699733f6
AM
3513 s->value = ent - s->section->vma;
3514 s->name = names;
3515 *names++ = '.';
3516 len = strlen (syms[i]->name);
3517 memcpy (names, syms[i]->name, len + 1);
3518 names += len + 1;
6f610d07
UW
3519 /* Have udata.p point back to the original symbol this
3520 synthetic symbol was derived from. */
3521 s->udata.p = syms[i];
699733f6 3522 s++;
90e3cdf2 3523 }
90e3cdf2 3524 }
699733f6 3525 free (contents);
468392fb
AM
3526
3527 if (glink != NULL && relplt != NULL)
3528 {
3529 if (resolv_vma)
3530 {
3531 /* Add a symbol for the main glink trampoline. */
86a4952b 3532 memset (s, 0, sizeof *s);
468392fb 3533 s->the_bfd = abfd;
6ba2a415 3534 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
468392fb
AM
3535 s->section = glink;
3536 s->value = resolv_vma - glink->vma;
3537 s->name = names;
3538 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3539 names += sizeof ("__glink_PLTresolve");
3540 s++;
3541 count++;
3542 }
3543
3544 /* FIXME: It would be very much nicer to put sym@plt on the
3545 stub rather than on the glink branch table entry. The
3546 objdump disassembler would then use a sensible symbol
3547 name on plt calls. The difficulty in doing so is
3548 a) finding the stubs, and,
3549 b) matching stubs against plt entries, and,
3550 c) there can be multiple stubs for a given plt entry.
3551
3552 Solving (a) could be done by code scanning, but older
3553 ppc64 binaries used different stubs to current code.
3554 (b) is the tricky one since you need to known the toc
3555 pointer for at least one function that uses a pic stub to
3556 be able to calculate the plt address referenced.
3557 (c) means gdb would need to set multiple breakpoints (or
3558 find the glink branch itself) when setting breakpoints
3559 for pending shared library loads. */
3560 p = relplt->relocation;
3561 for (i = 0; i < plt_count; i++, p++)
3562 {
3563 size_t len;
3564
3565 *s = **p->sym_ptr_ptr;
3566 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3567 we are defining a symbol, ensure one of them is set. */
3568 if ((s->flags & BSF_LOCAL) == 0)
3569 s->flags |= BSF_GLOBAL;
6ba2a415 3570 s->flags |= BSF_SYNTHETIC;
468392fb
AM
3571 s->section = glink;
3572 s->value = glink_vma - glink->vma;
3573 s->name = names;
3574 s->udata.p = NULL;
3575 len = strlen ((*p->sym_ptr_ptr)->name);
3576 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3577 names += len;
e054468f
AM
3578 if (p->addend != 0)
3579 {
3580 memcpy (names, "+0x", sizeof ("+0x") - 1);
3581 names += sizeof ("+0x") - 1;
3582 bfd_sprintf_vma (abfd, names, p->addend);
3583 names += strlen (names);
3584 }
468392fb
AM
3585 memcpy (names, "@plt", sizeof ("@plt"));
3586 names += sizeof ("@plt");
3587 s++;
b9e5796b
AM
3588 if (abi < 2)
3589 {
3590 glink_vma += 8;
3591 if (i >= 0x8000)
3592 glink_vma += 4;
3593 }
3594 else
468392fb
AM
3595 glink_vma += 4;
3596 }
3597 count += plt_count;
3598 }
90e3cdf2
JJ
3599 }
3600
c9727e01 3601 done:
a7535cf3 3602 free (syms);
90e3cdf2
JJ
3603 return count;
3604}
5bd4f169 3605\f
65f38f15
AM
3606/* The following functions are specific to the ELF linker, while
3607 functions above are used generally. Those named ppc64_elf_* are
3608 called by the main ELF linker code. They appear in this file more
3609 or less in the order in which they are called. eg.
3610 ppc64_elf_check_relocs is called early in the link process,
3611 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
3612 called.
3613
3614 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3615 functions have both a function code symbol and a function descriptor
3616 symbol. A call to foo in a relocatable object file looks like:
3617
3618 . .text
3619 . x:
3620 . bl .foo
3621 . nop
3622
3623 The function definition in another object file might be:
3624
3625 . .section .opd
3626 . foo: .quad .foo
3627 . .quad .TOC.@tocbase
3628 . .quad 0
3629 .
3630 . .text
3631 . .foo: blr
3632
3633 When the linker resolves the call during a static link, the branch
3634 unsurprisingly just goes to .foo and the .opd information is unused.
3635 If the function definition is in a shared library, things are a little
3636 different: The call goes via a plt call stub, the opd information gets
3637 copied to the plt, and the linker patches the nop.
3638
3639 . x:
3640 . bl .foo_stub
3641 . ld 2,40(1)
3642 .
3643 .
3644 . .foo_stub:
71a39c98
AM
3645 . std 2,40(1) # in practice, the call stub
3646 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3647 . addi 11,11,Lfoo@toc@l # this is the general idea
3648 . ld 12,0(11)
3649 . ld 2,8(11)
3650 . mtctr 12
3651 . ld 11,16(11)
e86ce104
AM
3652 . bctr
3653 .
3654 . .section .plt
3655 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3656
3657 The "reloc ()" notation is supposed to indicate that the linker emits
3658 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3659 copying.
3660
3661 What are the difficulties here? Well, firstly, the relocations
3662 examined by the linker in check_relocs are against the function code
3663 sym .foo, while the dynamic relocation in the plt is emitted against
3664 the function descriptor symbol, foo. Somewhere along the line, we need
3665 to carefully copy dynamic link information from one symbol to the other.
3666 Secondly, the generic part of the elf linker will make .foo a dynamic
3667 symbol as is normal for most other backends. We need foo dynamic
3668 instead, at least for an application final link. However, when
3669 creating a shared library containing foo, we need to have both symbols
3670 dynamic so that references to .foo are satisfied during the early
3671 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
3672 definition from some other object, eg. a static library.
3673
3674 Update: As of August 2004, we support a new convention. Function
3675 calls may use the function descriptor symbol, ie. "bl foo". This
3676 behaves exactly as "bl .foo". */
65f38f15 3677
1d483afe 3678/* Of those relocs that might be copied as dynamic relocs, this function
58ac9f71
AM
3679 selects those that must be copied when linking a shared library,
3680 even when the symbol is local. */
65f38f15 3681
1d483afe
AM
3682static int
3683must_be_dyn_reloc (struct bfd_link_info *info,
3684 enum elf_ppc64_reloc_type r_type)
3685{
3686 switch (r_type)
3687 {
3688 default:
3689 return 1;
3690
3691 case R_PPC64_REL32:
3692 case R_PPC64_REL64:
3693 case R_PPC64_REL30:
3694 return 0;
3695
3696 case R_PPC64_TPREL16:
3697 case R_PPC64_TPREL16_LO:
3698 case R_PPC64_TPREL16_HI:
3699 case R_PPC64_TPREL16_HA:
3700 case R_PPC64_TPREL16_DS:
3701 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
3702 case R_PPC64_TPREL16_HIGH:
3703 case R_PPC64_TPREL16_HIGHA:
1d483afe
AM
3704 case R_PPC64_TPREL16_HIGHER:
3705 case R_PPC64_TPREL16_HIGHERA:
3706 case R_PPC64_TPREL16_HIGHEST:
3707 case R_PPC64_TPREL16_HIGHESTA:
3708 case R_PPC64_TPREL64:
3709 return !info->executable;
3710 }
3711}
65f38f15 3712
f4656909
AM
3713/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3714 copying dynamic variables from a shared lib into an app's dynbss
3715 section, and instead use a dynamic relocation to point into the
5d35169e
AM
3716 shared lib. With code that gcc generates, it's vital that this be
3717 enabled; In the PowerPC64 ABI, the address of a function is actually
3718 the address of a function descriptor, which resides in the .opd
3719 section. gcc uses the descriptor directly rather than going via the
3720 GOT as some other ABI's do, which means that initialized function
3721 pointers must reference the descriptor. Thus, a function pointer
3722 initialized to the address of a function in a shared library will
3723 either require a copy reloc, or a dynamic reloc. Using a copy reloc
4cc11e76 3724 redefines the function descriptor symbol to point to the copy. This
5d35169e
AM
3725 presents a problem as a plt entry for that function is also
3726 initialized from the function descriptor symbol and the copy reloc
3727 may not be initialized first. */
a23b6845 3728#define ELIMINATE_COPY_RELOCS 1
f4656909 3729
721956f4 3730/* Section name for stubs is the associated section name plus this
29942be8
NC
3731 string. */
3732#define STUB_SUFFIX ".stub"
721956f4
AM
3733
3734/* Linker stubs.
3735 ppc_stub_long_branch:
3736 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3737 destination, but a 24 bit branch in a stub section will reach.
3738 . b dest
3739
3740 ppc_stub_plt_branch:
3741 Similar to the above, but a 24 bit branch in the stub section won't
3742 reach its destination.
71a39c98
AM
3743 . addis %r11,%r2,xxx@toc@ha
3744 . ld %r12,xxx@toc@l(%r11)
3745 . mtctr %r12
721956f4
AM
3746 . bctr
3747
3748 ppc_stub_plt_call:
2c66dc6c
AM
3749 Used to call a function in a shared library. If it so happens that
3750 the plt entry referenced crosses a 64k boundary, then an extra
71a39c98 3751 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
721956f4 3752 . std %r2,40(%r1)
71a39c98
AM
3753 . addis %r11,%r2,xxx@toc@ha
3754 . ld %r12,xxx+0@toc@l(%r11)
3755 . mtctr %r12
3756 . ld %r2,xxx+8@toc@l(%r11)
3757 . ld %r11,xxx+16@toc@l(%r11)
721956f4 3758 . bctr
ad8e1ba5
AM
3759
3760 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3761 code to adjust the value and save r2 to support multiple toc sections.
3762 A ppc_stub_long_branch with an r2 offset looks like:
3763 . std %r2,40(%r1)
3764 . addis %r2,%r2,off@ha
3765 . addi %r2,%r2,off@l
3766 . b dest
3767
3768 A ppc_stub_plt_branch with an r2 offset looks like:
3769 . std %r2,40(%r1)
71a39c98
AM
3770 . addis %r11,%r2,xxx@toc@ha
3771 . ld %r12,xxx@toc@l(%r11)
ad8e1ba5
AM
3772 . addis %r2,%r2,off@ha
3773 . addi %r2,%r2,off@l
71a39c98 3774 . mtctr %r12
ad8e1ba5 3775 . bctr
ac2df442
AM
3776
3777 In cases where the "addis" instruction would add zero, the "addis" is
3778 omitted and following instructions modified slightly in some cases.
721956f4
AM
3779*/
3780
3781enum ppc_stub_type {
3782 ppc_stub_none,
3783 ppc_stub_long_branch,
ad8e1ba5 3784 ppc_stub_long_branch_r2off,
721956f4 3785 ppc_stub_plt_branch,
ad8e1ba5 3786 ppc_stub_plt_branch_r2off,
794e51c0 3787 ppc_stub_plt_call,
7341d5e2
AM
3788 ppc_stub_plt_call_r2save,
3789 ppc_stub_global_entry
721956f4
AM
3790};
3791
3792struct ppc_stub_hash_entry {
3793
3794 /* Base hash table entry structure. */
3795 struct bfd_hash_entry root;
3796
ad8e1ba5
AM
3797 enum ppc_stub_type stub_type;
3798
721956f4
AM
3799 /* The stub section. */
3800 asection *stub_sec;
3801
3802 /* Offset within stub_sec of the beginning of this stub. */
3803 bfd_vma stub_offset;
3804
3805 /* Given the symbol's value and its section we can determine its final
3806 value when building the stubs (so the stub knows where to jump. */
3807 bfd_vma target_value;
3808 asection *target_section;
3809
721956f4
AM
3810 /* The symbol table entry, if any, that this was derived from. */
3811 struct ppc_link_hash_entry *h;
e054468f 3812 struct plt_entry *plt_ent;
721956f4
AM
3813
3814 /* Where this stub is being called from, or, in the case of combined
3815 stub sections, the first input section in the group. */
3816 asection *id_sec;
6911b7dc
AM
3817
3818 /* Symbol st_other. */
3819 unsigned char other;
721956f4
AM
3820};
3821
3822struct ppc_branch_hash_entry {
3823
3824 /* Base hash table entry structure. */
3825 struct bfd_hash_entry root;
3826
c456f082 3827 /* Offset within branch lookup table. */
721956f4
AM
3828 unsigned int offset;
3829
3830 /* Generation marker. */
3831 unsigned int iter;
3832};
65f38f15 3833
19e08130
AM
3834/* Used to track dynamic relocations for local symbols. */
3835struct ppc_dyn_relocs
3836{
3837 struct ppc_dyn_relocs *next;
3838
3839 /* The input section of the reloc. */
3840 asection *sec;
3841
3842 /* Total number of relocs copied for the input section. */
3843 unsigned int count : 31;
3844
3845 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3846 unsigned int ifunc : 1;
3847};
3848
65f38f15
AM
3849struct ppc_link_hash_entry
3850{
3851 struct elf_link_hash_entry elf;
3852
b3fac117
AM
3853 union {
3854 /* A pointer to the most recently used stub hash entry against this
3855 symbol. */
3856 struct ppc_stub_hash_entry *stub_cache;
3857
3858 /* A pointer to the next symbol starting with a '.' */
3859 struct ppc_link_hash_entry *next_dot_sym;
3860 } u;
721956f4 3861
65f38f15 3862 /* Track dynamic relocs copied for this symbol. */
6061a67d 3863 struct elf_dyn_relocs *dyn_relocs;
e86ce104 3864
721956f4 3865 /* Link between function code and descriptor symbols. */
34814b9f 3866 struct ppc_link_hash_entry *oh;
721956f4 3867
e86ce104
AM
3868 /* Flag function code and descriptor symbols. */
3869 unsigned int is_func:1;
3870 unsigned int is_func_descriptor:1;
908b32fc 3871 unsigned int fake:1;
411e1bfb 3872
c5614fa4
AM
3873 /* Whether global opd/toc sym has been adjusted or not.
3874 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3875 should be set for all globals defined in any opd/toc section. */
754021d0
AM
3876 unsigned int adjust_done:1;
3877
99877b66
AM
3878 /* Set if we twiddled this symbol to weak at some stage. */
3879 unsigned int was_undefined:1;
3880
411e1bfb 3881 /* Contexts in which symbol is used in the GOT (or TOC).
e7b938ca
AM
3882 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3883 corresponding relocs are encountered during check_relocs.
3884 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3885 indicate the corresponding GOT entry type is not needed.
3886 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3887 a TPREL one. We use a separate flag rather than setting TPREL
3888 just for convenience in distinguishing the two cases. */
3889#define TLS_GD 1 /* GD reloc. */
3890#define TLS_LD 2 /* LD reloc. */
3891#define TLS_TPREL 4 /* TPREL reloc, => IE. */
3892#define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
3893#define TLS_TLS 16 /* Any TLS reloc. */
3894#define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
3895#define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
e054468f 3896#define PLT_IFUNC 128 /* STT_GNU_IFUNC. */
f961d9dd 3897 unsigned char tls_mask;
65f38f15
AM
3898};
3899
3900/* ppc64 ELF linker hash table. */
3901
3902struct ppc_link_hash_table
3903{
3904 struct elf_link_hash_table elf;
3905
721956f4
AM
3906 /* The stub hash table. */
3907 struct bfd_hash_table stub_hash_table;
3908
3909 /* Another hash table for plt_branch stubs. */
3910 struct bfd_hash_table branch_hash_table;
3911
3b421ab3
AM
3912 /* Hash table for function prologue tocsave. */
3913 htab_t tocsave_htab;
3914
e7d1c40c
AM
3915 /* Various options and other info passed from the linker. */
3916 struct ppc64_elf_params *params;
721956f4
AM
3917
3918 /* Array to keep track of which stub sections have been created, and
3919 information on stub grouping. */
3920 struct map_stub {
3921 /* This is the section to which stubs in the group will be attached. */
3922 asection *link_sec;
3923 /* The stub section. */
3924 asection *stub_sec;
ad8e1ba5
AM
3925 /* Along with elf_gp, specifies the TOC pointer used in this group. */
3926 bfd_vma toc_off;
721956f4
AM
3927 } *stub_group;
3928
ad8e1ba5
AM
3929 /* Temp used when calculating TOC pointers. */
3930 bfd_vma toc_curr;
bf102f86
AM
3931 bfd *toc_bfd;
3932 asection *toc_first_sec;
ad8e1ba5 3933
8f3bab57
AM
3934 /* Highest input section id. */
3935 int top_id;
3936
734b6cf9
AM
3937 /* Highest output section index. */
3938 int top_index;
3939
b3fac117
AM
3940 /* Used when adding symbols. */
3941 struct ppc_link_hash_entry *dot_syms;
3942
734b6cf9
AM
3943 /* List of input sections for each output section. */
3944 asection **input_list;
721956f4 3945
33e44f2e 3946 /* Shortcuts to get to dynamic linker sections. */
4ce794b7
AM
3947 asection *dynbss;
3948 asection *relbss;
3949 asection *glink;
82bd7b59 3950 asection *sfpr;
4ce794b7
AM
3951 asection *brlt;
3952 asection *relbrlt;
58d180e8 3953 asection *glink_eh_frame;
ec338859 3954
8387904d
AM
3955 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3956 struct ppc_link_hash_entry *tls_get_addr;
3957 struct ppc_link_hash_entry *tls_get_addr_fd;
411e1bfb 3958
927be08e
AM
3959 /* The size of reliplt used by got entry relocs. */
3960 bfd_size_type got_reli_size;
3961
9b5ecbd0 3962 /* Statistics. */
7341d5e2 3963 unsigned long stub_count[ppc_stub_global_entry];
9b5ecbd0 3964
ee75fd95
AM
3965 /* Number of stubs against global syms. */
3966 unsigned long stub_globals;
3967
ee67d69a
AM
3968 /* Set if we're linking code with function descriptors. */
3969 unsigned int opd_abi:1;
3970
4c52953f 3971 /* Support for multiple toc sections. */
33c0ec9d 3972 unsigned int do_multi_toc:1;
4c52953f 3973 unsigned int multi_toc_needed:1;
927be08e 3974 unsigned int second_toc_pass:1;
67f0cbdb 3975 unsigned int do_toc_opt:1;
4c52953f 3976
5d1634d7 3977 /* Set on error. */
99877b66 3978 unsigned int stub_error:1;
721956f4 3979
f6c7c3e8 3980 /* Temp used by ppc64_elf_before_check_relocs. */
99877b66 3981 unsigned int twiddled_syms:1;
721956f4
AM
3982
3983 /* Incremented every time we size stubs. */
3984 unsigned int stub_iteration;
5d1634d7 3985
87d72d41
AM
3986 /* Small local sym cache. */
3987 struct sym_cache sym_cache;
65f38f15
AM
3988};
3989
4c52953f
AM
3990/* Rename some of the generic section flags to better document how they
3991 are used here. */
b0dddeec
AM
3992
3993/* Nonzero if this section has TLS related relocations. */
3994#define has_tls_reloc sec_flg0
3995
3996/* Nonzero if this section has a call to __tls_get_addr. */
3997#define has_tls_get_addr_call sec_flg1
3998
3999/* Nonzero if this section has any toc or got relocs. */
4000#define has_toc_reloc sec_flg2
4001
4002/* Nonzero if this section has a call to another section that uses
4003 the toc or got. */
d77c8a4b 4004#define makes_toc_func_call sec_flg3
b0dddeec
AM
4005
4006/* Recursion protection when determining above flag. */
d77c8a4b 4007#define call_check_in_progress sec_flg4
70cc837d 4008#define call_check_done sec_flg5
4c52953f 4009
65f38f15
AM
4010/* Get the ppc64 ELF linker hash table from a link_info structure. */
4011
4012#define ppc_hash_table(p) \
4dfe6ac6
NC
4013 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
4014 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
65f38f15 4015
721956f4
AM
4016#define ppc_stub_hash_lookup(table, string, create, copy) \
4017 ((struct ppc_stub_hash_entry *) \
4018 bfd_hash_lookup ((table), (string), (create), (copy)))
4019
4020#define ppc_branch_hash_lookup(table, string, create, copy) \
4021 ((struct ppc_branch_hash_entry *) \
4022 bfd_hash_lookup ((table), (string), (create), (copy)))
4023
4024/* Create an entry in the stub hash table. */
4025
4026static struct bfd_hash_entry *
4ce794b7
AM
4027stub_hash_newfunc (struct bfd_hash_entry *entry,
4028 struct bfd_hash_table *table,
4029 const char *string)
721956f4
AM
4030{
4031 /* Allocate the structure if it has not already been allocated by a
4032 subclass. */
4033 if (entry == NULL)
4034 {
4035 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
4036 if (entry == NULL)
4037 return entry;
4038 }
4039
4040 /* Call the allocation method of the superclass. */
4041 entry = bfd_hash_newfunc (entry, table, string);
4042 if (entry != NULL)
4043 {
4044 struct ppc_stub_hash_entry *eh;
4045
4046 /* Initialize the local fields. */
4047 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 4048 eh->stub_type = ppc_stub_none;
721956f4
AM
4049 eh->stub_sec = NULL;
4050 eh->stub_offset = 0;
4051 eh->target_value = 0;
4052 eh->target_section = NULL;
721956f4 4053 eh->h = NULL;
6911b7dc 4054 eh->plt_ent = NULL;
721956f4 4055 eh->id_sec = NULL;
6911b7dc 4056 eh->other = 0;
721956f4
AM
4057 }
4058
4059 return entry;
4060}
4061
4062/* Create an entry in the branch hash table. */
4063
4064static struct bfd_hash_entry *
4ce794b7
AM
4065branch_hash_newfunc (struct bfd_hash_entry *entry,
4066 struct bfd_hash_table *table,
4067 const char *string)
721956f4
AM
4068{
4069 /* Allocate the structure if it has not already been allocated by a
4070 subclass. */
4071 if (entry == NULL)
4072 {
4073 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4074 if (entry == NULL)
4075 return entry;
4076 }
4077
4078 /* Call the allocation method of the superclass. */
4079 entry = bfd_hash_newfunc (entry, table, string);
4080 if (entry != NULL)
4081 {
4082 struct ppc_branch_hash_entry *eh;
4083
4084 /* Initialize the local fields. */
4085 eh = (struct ppc_branch_hash_entry *) entry;
4086 eh->offset = 0;
4087 eh->iter = 0;
4088 }
4089
4090 return entry;
4091}
4092
65f38f15
AM
4093/* Create an entry in a ppc64 ELF linker hash table. */
4094
4095static struct bfd_hash_entry *
4ce794b7
AM
4096link_hash_newfunc (struct bfd_hash_entry *entry,
4097 struct bfd_hash_table *table,
4098 const char *string)
65f38f15
AM
4099{
4100 /* Allocate the structure if it has not already been allocated by a
4101 subclass. */
4102 if (entry == NULL)
4103 {
4104 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4105 if (entry == NULL)
4106 return entry;
4107 }
4108
4109 /* Call the allocation method of the superclass. */
4110 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4111 if (entry != NULL)
4112 {
4113 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4114
b3fac117 4115 memset (&eh->u.stub_cache, 0,
908b32fc 4116 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
4117 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4118
4119 /* When making function calls, old ABI code references function entry
4120 points (dot symbols), while new ABI code references the function
4121 descriptor symbol. We need to make any combination of reference and
4122 definition work together, without breaking archive linking.
4123
4124 For a defined function "foo" and an undefined call to "bar":
4125 An old object defines "foo" and ".foo", references ".bar" (possibly
4126 "bar" too).
4127 A new object defines "foo" and references "bar".
4128
4129 A new object thus has no problem with its undefined symbols being
4130 satisfied by definitions in an old object. On the other hand, the
4131 old object won't have ".bar" satisfied by a new object.
4132
4133 Keep a list of newly added dot-symbols. */
4134
4135 if (string[0] == '.')
4136 {
4137 struct ppc_link_hash_table *htab;
4138
4139 htab = (struct ppc_link_hash_table *) table;
4140 eh->u.next_dot_sym = htab->dot_syms;
4141 htab->dot_syms = eh;
4142 }
65f38f15
AM
4143 }
4144
4145 return entry;
4146}
4147
3b421ab3
AM
4148struct tocsave_entry {
4149 asection *sec;
4150 bfd_vma offset;
4151};
4152
4153static hashval_t
4154tocsave_htab_hash (const void *p)
4155{
4156 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4157 return ((bfd_vma)(intptr_t) e->sec ^ e->offset) >> 3;
4158}
4159
4160static int
4161tocsave_htab_eq (const void *p1, const void *p2)
4162{
4163 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4164 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4165 return e1->sec == e2->sec && e1->offset == e2->offset;
4166}
4167
68faa637
AM
4168/* Destroy a ppc64 ELF linker hash table. */
4169
4170static void
d495ab0d 4171ppc64_elf_link_hash_table_free (bfd *obfd)
68faa637 4172{
d495ab0d 4173 struct ppc_link_hash_table *htab;
68faa637 4174
d495ab0d 4175 htab = (struct ppc_link_hash_table *) obfd->link.hash;
68faa637
AM
4176 if (htab->tocsave_htab)
4177 htab_delete (htab->tocsave_htab);
d495ab0d
AM
4178 bfd_hash_table_free (&htab->branch_hash_table);
4179 bfd_hash_table_free (&htab->stub_hash_table);
4180 _bfd_elf_link_hash_table_free (obfd);
68faa637
AM
4181}
4182
65f38f15
AM
4183/* Create a ppc64 ELF linker hash table. */
4184
4185static struct bfd_link_hash_table *
4ce794b7 4186ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
4187{
4188 struct ppc_link_hash_table *htab;
4189 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4190
4ce794b7 4191 htab = bfd_zmalloc (amt);
65f38f15
AM
4192 if (htab == NULL)
4193 return NULL;
4194
66eb6687 4195 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
4196 sizeof (struct ppc_link_hash_entry),
4197 PPC64_ELF_DATA))
65f38f15 4198 {
e2d34d7d 4199 free (htab);
65f38f15
AM
4200 return NULL;
4201 }
4202
721956f4 4203 /* Init the stub hash table too. */
66eb6687
AM
4204 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4205 sizeof (struct ppc_stub_hash_entry)))
2915c55b 4206 {
d495ab0d 4207 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
4208 return NULL;
4209 }
721956f4
AM
4210
4211 /* And the branch hash table. */
66eb6687
AM
4212 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4213 sizeof (struct ppc_branch_hash_entry)))
2915c55b
JK
4214 {
4215 bfd_hash_table_free (&htab->stub_hash_table);
d495ab0d 4216 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
4217 return NULL;
4218 }
721956f4 4219
3b421ab3
AM
4220 htab->tocsave_htab = htab_try_create (1024,
4221 tocsave_htab_hash,
4222 tocsave_htab_eq,
4223 NULL);
4224 if (htab->tocsave_htab == NULL)
2915c55b 4225 {
d495ab0d 4226 ppc64_elf_link_hash_table_free (abfd);
2915c55b
JK
4227 return NULL;
4228 }
d495ab0d 4229 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
3b421ab3 4230
3254fd24
AM
4231 /* Initializing two fields of the union is just cosmetic. We really
4232 only care about glist, but when compiled on a 32-bit host the
4233 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4234 debugger inspection of these fields look nicer. */
a6aa5195
AM
4235 htab->elf.init_got_refcount.refcount = 0;
4236 htab->elf.init_got_refcount.glist = NULL;
4237 htab->elf.init_plt_refcount.refcount = 0;
4238 htab->elf.init_plt_refcount.glist = NULL;
4239 htab->elf.init_got_offset.offset = 0;
4240 htab->elf.init_got_offset.glist = NULL;
4241 htab->elf.init_plt_offset.offset = 0;
4242 htab->elf.init_plt_offset.glist = NULL;
3254fd24 4243
65f38f15
AM
4244 return &htab->elf.root;
4245}
4246
bfeb4a28
AM
4247/* Create sections for linker generated code. */
4248
4249static bfd_boolean
4250create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4251{
4252 struct ppc_link_hash_table *htab;
4253 flagword flags;
4254
4255 htab = ppc_hash_table (info);
4256
4257 /* Create .sfpr for code to save and restore fp regs. */
4258 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4259 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4260 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4261 flags);
4262 if (htab->sfpr == NULL
4263 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4264 return FALSE;
4265
4266 /* Create .glink for lazy dynamic linking support. */
4267 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4268 flags);
4269 if (htab->glink == NULL
4270 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4271 return FALSE;
4272
4273 if (!info->no_ld_generated_unwind_info)
4274 {
4275 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4276 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4277 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4278 ".eh_frame",
4279 flags);
4280 if (htab->glink_eh_frame == NULL
4281 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4282 return FALSE;
4283 }
4284
4285 flags = SEC_ALLOC | SEC_LINKER_CREATED;
33e44f2e
AM
4286 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4287 if (htab->elf.iplt == NULL
4288 || ! bfd_set_section_alignment (dynobj, htab->elf.iplt, 3))
bfeb4a28
AM
4289 return FALSE;
4290
4291 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4292 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
33e44f2e
AM
4293 htab->elf.irelplt
4294 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
4295 if (htab->elf.irelplt == NULL
4296 || ! bfd_set_section_alignment (dynobj, htab->elf.irelplt, 3))
bfeb4a28
AM
4297 return FALSE;
4298
4299 /* Create branch lookup table for plt_branch stubs. */
4300 flags = (SEC_ALLOC | SEC_LOAD
4301 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4302 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4303 flags);
4304 if (htab->brlt == NULL
4305 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4306 return FALSE;
4307
4308 if (!info->shared)
4309 return TRUE;
4310
4311 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4312 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4313 htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4314 ".rela.branch_lt",
4315 flags);
4316 if (htab->relbrlt == NULL
4317 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4318 return FALSE;
4319
4320 return TRUE;
4321}
4322
e717da7e
AM
4323/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4324
bfeb4a28 4325bfd_boolean
e7d1c40c
AM
4326ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
4327 struct ppc64_elf_params *params)
e717da7e
AM
4328{
4329 struct ppc_link_hash_table *htab;
4330
e7d1c40c 4331 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
e717da7e
AM
4332
4333/* Always hook our dynamic sections into the first bfd, which is the
4334 linker created stub bfd. This ensures that the GOT header is at
4335 the start of the output TOC section. */
4336 htab = ppc_hash_table (info);
4dfe6ac6 4337 if (htab == NULL)
bfeb4a28 4338 return FALSE;
e7d1c40c
AM
4339 htab->elf.dynobj = params->stub_bfd;
4340 htab->params = params;
bfeb4a28
AM
4341
4342 if (info->relocatable)
4343 return TRUE;
4344
4345 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
4346}
4347
721956f4
AM
4348/* Build a name for an entry in the stub hash table. */
4349
4350static char *
4ce794b7
AM
4351ppc_stub_name (const asection *input_section,
4352 const asection *sym_sec,
4353 const struct ppc_link_hash_entry *h,
4354 const Elf_Internal_Rela *rel)
721956f4
AM
4355{
4356 char *stub_name;
bcaa2f82 4357 ssize_t len;
721956f4
AM
4358
4359 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4360 offsets from a sym as a branch target? In fact, we could
4361 probably assume the addend is always zero. */
4362 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4363
4364 if (h)
4365 {
4366 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4367 stub_name = bfd_malloc (len);
46de2a7c
AM
4368 if (stub_name == NULL)
4369 return stub_name;
4370
bcaa2f82
AM
4371 len = sprintf (stub_name, "%08x.%s+%x",
4372 input_section->id & 0xffffffff,
4373 h->elf.root.root.string,
4374 (int) rel->r_addend & 0xffffffff);
721956f4
AM
4375 }
4376 else
4377 {
ad8e1ba5 4378 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 4379 stub_name = bfd_malloc (len);
46de2a7c
AM
4380 if (stub_name == NULL)
4381 return stub_name;
4382
bcaa2f82
AM
4383 len = sprintf (stub_name, "%08x.%x:%x+%x",
4384 input_section->id & 0xffffffff,
4385 sym_sec->id & 0xffffffff,
4386 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4387 (int) rel->r_addend & 0xffffffff);
721956f4 4388 }
bcaa2f82 4389 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 4390 stub_name[len - 2] = 0;
721956f4
AM
4391 return stub_name;
4392}
4393
4394/* Look up an entry in the stub hash. Stub entries are cached because
4395 creating the stub name takes a bit of time. */
4396
4397static struct ppc_stub_hash_entry *
4ce794b7
AM
4398ppc_get_stub_entry (const asection *input_section,
4399 const asection *sym_sec,
039b3fef 4400 struct ppc_link_hash_entry *h,
4ce794b7
AM
4401 const Elf_Internal_Rela *rel,
4402 struct ppc_link_hash_table *htab)
721956f4
AM
4403{
4404 struct ppc_stub_hash_entry *stub_entry;
721956f4
AM
4405 const asection *id_sec;
4406
4407 /* If this input section is part of a group of sections sharing one
4408 stub section, then use the id of the first section in the group.
4409 Stub names need to include a section id, as there may well be
4410 more than one stub used to reach say, printf, and we need to
4411 distinguish between them. */
4412 id_sec = htab->stub_group[input_section->id].link_sec;
4413
b3fac117
AM
4414 if (h != NULL && h->u.stub_cache != NULL
4415 && h->u.stub_cache->h == h
4416 && h->u.stub_cache->id_sec == id_sec)
721956f4 4417 {
b3fac117 4418 stub_entry = h->u.stub_cache;
721956f4
AM
4419 }
4420 else
4421 {
4422 char *stub_name;
4423
4424 stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
4425 if (stub_name == NULL)
4426 return NULL;
4427
4428 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 4429 stub_name, FALSE, FALSE);
721956f4 4430 if (h != NULL)
b3fac117 4431 h->u.stub_cache = stub_entry;
721956f4
AM
4432
4433 free (stub_name);
4434 }
4435
4436 return stub_entry;
4437}
4438
4439/* Add a new stub entry to the stub hash. Not all fields of the new
4440 stub entry are initialised. */
4441
4442static struct ppc_stub_hash_entry *
4ce794b7
AM
4443ppc_add_stub (const char *stub_name,
4444 asection *section,
25f53a85 4445 struct bfd_link_info *info)
721956f4 4446{
25f53a85 4447 struct ppc_link_hash_table *htab = ppc_hash_table (info);
721956f4
AM
4448 asection *link_sec;
4449 asection *stub_sec;
4450 struct ppc_stub_hash_entry *stub_entry;
4451
4452 link_sec = htab->stub_group[section->id].link_sec;
4453 stub_sec = htab->stub_group[section->id].stub_sec;
4454 if (stub_sec == NULL)
4455 {
4456 stub_sec = htab->stub_group[link_sec->id].stub_sec;
4457 if (stub_sec == NULL)
4458 {
d4c88bbb 4459 size_t namelen;
721956f4
AM
4460 bfd_size_type len;
4461 char *s_name;
4462
d4c88bbb
AM
4463 namelen = strlen (link_sec->name);
4464 len = namelen + sizeof (STUB_SUFFIX);
e7d1c40c 4465 s_name = bfd_alloc (htab->params->stub_bfd, len);
721956f4
AM
4466 if (s_name == NULL)
4467 return NULL;
4468
d4c88bbb
AM
4469 memcpy (s_name, link_sec->name, namelen);
4470 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
e7d1c40c 4471 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
721956f4
AM
4472 if (stub_sec == NULL)
4473 return NULL;
4474 htab->stub_group[link_sec->id].stub_sec = stub_sec;
4475 }
4476 htab->stub_group[section->id].stub_sec = stub_sec;
4477 }
4478
4479 /* Enter this entry into the linker stub hash table. */
4480 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 4481 TRUE, FALSE);
721956f4
AM
4482 if (stub_entry == NULL)
4483 {
8de848d8 4484 info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
25f53a85 4485 section->owner, stub_name);
721956f4
AM
4486 return NULL;
4487 }
4488
4489 stub_entry->stub_sec = stub_sec;
4490 stub_entry->stub_offset = 0;
4491 stub_entry->id_sec = link_sec;
4492 return stub_entry;
4493}
4494
e717da7e
AM
4495/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4496 not already done. */
65f38f15 4497
b34976b6 4498static bfd_boolean
e717da7e 4499create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 4500{
e717da7e
AM
4501 asection *got, *relgot;
4502 flagword flags;
4503 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 4504
0c8d6e5c 4505 if (!is_ppc64_elf (abfd))
0ffa91dd 4506 return FALSE;
4dfe6ac6
NC
4507 if (htab == NULL)
4508 return FALSE;
0ffa91dd 4509
33e44f2e
AM
4510 if (!htab->elf.sgot
4511 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
4512 return FALSE;
e717da7e
AM
4513
4514 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4515 | SEC_LINKER_CREATED);
4516
c456f082 4517 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 4518 if (!got
e717da7e
AM
4519 || !bfd_set_section_alignment (abfd, got, 3))
4520 return FALSE;
65f38f15 4521
c456f082
AM
4522 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4523 flags | SEC_READONLY);
e717da7e 4524 if (!relgot
e717da7e 4525 || ! bfd_set_section_alignment (abfd, relgot, 3))
b34976b6 4526 return FALSE;
e717da7e
AM
4527
4528 ppc64_elf_tdata (abfd)->got = got;
4529 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 4530 return TRUE;
65f38f15 4531}
5bd4f169 4532
82bd7b59 4533/* Create the dynamic sections, and set up shortcuts. */
5bd4f169 4534
b34976b6 4535static bfd_boolean
4ce794b7 4536ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
5bd4f169 4537{
65f38f15 4538 struct ppc_link_hash_table *htab;
5bd4f169 4539
65f38f15 4540 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
b34976b6 4541 return FALSE;
65f38f15 4542
e717da7e 4543 htab = ppc_hash_table (info);
4dfe6ac6
NC
4544 if (htab == NULL)
4545 return FALSE;
4546
3d4d4302 4547 htab->dynbss = bfd_get_linker_section (dynobj, ".dynbss");
65f38f15 4548 if (!info->shared)
3d4d4302 4549 htab->relbss = bfd_get_linker_section (dynobj, ".rela.bss");
65f38f15 4550
33e44f2e 4551 if (!htab->elf.sgot || !htab->elf.splt || !htab->elf.srelplt || !htab->dynbss
4ce794b7 4552 || (!info->shared && !htab->relbss))
65f38f15
AM
4553 abort ();
4554
b34976b6 4555 return TRUE;
5bd4f169
AM
4556}
4557
b31867b6
AM
4558/* Follow indirect and warning symbol links. */
4559
4560static inline struct bfd_link_hash_entry *
4561follow_link (struct bfd_link_hash_entry *h)
4562{
4563 while (h->type == bfd_link_hash_indirect
4564 || h->type == bfd_link_hash_warning)
4565 h = h->u.i.link;
4566 return h;
4567}
4568
4569static inline struct elf_link_hash_entry *
4570elf_follow_link (struct elf_link_hash_entry *h)
4571{
4572 return (struct elf_link_hash_entry *) follow_link (&h->root);
4573}
4574
4575static inline struct ppc_link_hash_entry *
4576ppc_follow_link (struct ppc_link_hash_entry *h)
4577{
4578 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4579}
4580
40d16e0b
AM
4581/* Merge PLT info on FROM with that on TO. */
4582
4583static void
4584move_plt_plist (struct ppc_link_hash_entry *from,
4585 struct ppc_link_hash_entry *to)
4586{
4587 if (from->elf.plt.plist != NULL)
4588 {
4589 if (to->elf.plt.plist != NULL)
4590 {
4591 struct plt_entry **entp;
4592 struct plt_entry *ent;
4593
4594 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4595 {
4596 struct plt_entry *dent;
4597
4598 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4599 if (dent->addend == ent->addend)
4600 {
4601 dent->plt.refcount += ent->plt.refcount;
4602 *entp = ent->next;
4603 break;
4604 }
4605 if (dent == NULL)
4606 entp = &ent->next;
4607 }
4608 *entp = to->elf.plt.plist;
4609 }
4610
4611 to->elf.plt.plist = from->elf.plt.plist;
4612 from->elf.plt.plist = NULL;
4613 }
4614}
4615
65f38f15
AM
4616/* Copy the extra info we tack onto an elf_link_hash_entry. */
4617
4618static void
fcfa13d2
AM
4619ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4620 struct elf_link_hash_entry *dir,
4621 struct elf_link_hash_entry *ind)
65f38f15
AM
4622{
4623 struct ppc_link_hash_entry *edir, *eind;
4624
4625 edir = (struct ppc_link_hash_entry *) dir;
4626 eind = (struct ppc_link_hash_entry *) ind;
4627
c79d6685
AM
4628 edir->is_func |= eind->is_func;
4629 edir->is_func_descriptor |= eind->is_func_descriptor;
4630 edir->tls_mask |= eind->tls_mask;
4631 if (eind->oh != NULL)
4632 edir->oh = ppc_follow_link (eind->oh);
4633
4634 /* If called to transfer flags for a weakdef during processing
4635 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4636 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
4637 if (!(ELIMINATE_COPY_RELOCS
4638 && eind->elf.root.type != bfd_link_hash_indirect
4639 && edir->elf.dynamic_adjusted))
4640 edir->elf.non_got_ref |= eind->elf.non_got_ref;
4641
4642 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4643 edir->elf.ref_regular |= eind->elf.ref_regular;
4644 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4645 edir->elf.needs_plt |= eind->elf.needs_plt;
a345bc8d 4646 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
c79d6685 4647
411e1bfb 4648 /* Copy over any dynamic relocs we may have on the indirect sym. */
bbd7ec4a 4649 if (eind->dyn_relocs != NULL)
65f38f15 4650 {
bbd7ec4a
AM
4651 if (edir->dyn_relocs != NULL)
4652 {
6061a67d
AM
4653 struct elf_dyn_relocs **pp;
4654 struct elf_dyn_relocs *p;
bbd7ec4a 4655
fcfa13d2 4656 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a
AM
4657 list. Merge any entries against the same section. */
4658 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4659 {
6061a67d 4660 struct elf_dyn_relocs *q;
bbd7ec4a
AM
4661
4662 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4663 if (q->sec == p->sec)
4664 {
4665 q->pc_count += p->pc_count;
4666 q->count += p->count;
4667 *pp = p->next;
4668 break;
4669 }
4670 if (q == NULL)
4671 pp = &p->next;
4672 }
4673 *pp = edir->dyn_relocs;
4674 }
4675
65f38f15
AM
4676 edir->dyn_relocs = eind->dyn_relocs;
4677 eind->dyn_relocs = NULL;
4678 }
65f38f15 4679
68ba6d40
AM
4680 /* If we were called to copy over info for a weak sym, that's all.
4681 You might think dyn_relocs need not be copied over; After all,
4682 both syms will be dynamic or both non-dynamic so we're just
68ffbac6 4683 moving reloc accounting around. However, ELIMINATE_COPY_RELOCS
68ba6d40
AM
4684 code in ppc64_elf_adjust_dynamic_symbol needs to check for
4685 dyn_relocs in read-only sections, and it does so on what is the
4686 DIR sym here. */
4687 if (eind->elf.root.type != bfd_link_hash_indirect)
4688 return;
4689
81848ca0
AM
4690 /* Copy over got entries that we may have already seen to the
4691 symbol which just became indirect. */
411e1bfb
AM
4692 if (eind->elf.got.glist != NULL)
4693 {
4694 if (edir->elf.got.glist != NULL)
4695 {
4696 struct got_entry **entp;
4697 struct got_entry *ent;
4698
4699 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4700 {
4701 struct got_entry *dent;
4702
4703 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4704 if (dent->addend == ent->addend
e717da7e 4705 && dent->owner == ent->owner
411e1bfb
AM
4706 && dent->tls_type == ent->tls_type)
4707 {
4708 dent->got.refcount += ent->got.refcount;
4709 *entp = ent->next;
4710 break;
4711 }
4712 if (dent == NULL)
4713 entp = &ent->next;
4714 }
4715 *entp = edir->elf.got.glist;
4716 }
4717
4718 edir->elf.got.glist = eind->elf.got.glist;
4719 eind->elf.got.glist = NULL;
4720 }
4721
4722 /* And plt entries. */
40d16e0b 4723 move_plt_plist (eind, edir);
411e1bfb 4724
fcfa13d2 4725 if (eind->elf.dynindx != -1)
411e1bfb 4726 {
fcfa13d2
AM
4727 if (edir->elf.dynindx != -1)
4728 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4729 edir->elf.dynstr_index);
411e1bfb
AM
4730 edir->elf.dynindx = eind->elf.dynindx;
4731 edir->elf.dynstr_index = eind->elf.dynstr_index;
4732 eind->elf.dynindx = -1;
4733 eind->elf.dynstr_index = 0;
4734 }
411e1bfb
AM
4735}
4736
8387904d
AM
4737/* Find the function descriptor hash entry from the given function code
4738 hash entry FH. Link the entries via their OH fields. */
4739
4740static struct ppc_link_hash_entry *
b31867b6 4741lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
4742{
4743 struct ppc_link_hash_entry *fdh = fh->oh;
4744
4745 if (fdh == NULL)
4746 {
4747 const char *fd_name = fh->elf.root.root.string + 1;
4748
4749 fdh = (struct ppc_link_hash_entry *)
4750 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
b31867b6
AM
4751 if (fdh == NULL)
4752 return fdh;
4753
4754 fdh->is_func_descriptor = 1;
4755 fdh->oh = fh;
4756 fh->is_func = 1;
4757 fh->oh = fdh;
8387904d
AM
4758 }
4759
b31867b6 4760 return ppc_follow_link (fdh);
8387904d
AM
4761}
4762
bb700d78
AM
4763/* Make a fake function descriptor sym for the code sym FH. */
4764
4765static struct ppc_link_hash_entry *
4766make_fdh (struct bfd_link_info *info,
908b32fc 4767 struct ppc_link_hash_entry *fh)
bb700d78
AM
4768{
4769 bfd *abfd;
4770 asymbol *newsym;
4771 struct bfd_link_hash_entry *bh;
4772 struct ppc_link_hash_entry *fdh;
4773
4774 abfd = fh->elf.root.u.undef.abfd;
4775 newsym = bfd_make_empty_symbol (abfd);
4776 newsym->name = fh->elf.root.root.string + 1;
4777 newsym->section = bfd_und_section_ptr;
4778 newsym->value = 0;
908b32fc 4779 newsym->flags = BSF_WEAK;
bb700d78
AM
4780
4781 bh = NULL;
4782 if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
4783 newsym->flags, newsym->section,
4784 newsym->value, NULL, FALSE, FALSE,
4785 &bh))
4786 return NULL;
4787
4788 fdh = (struct ppc_link_hash_entry *) bh;
4789 fdh->elf.non_elf = 0;
908b32fc
AM
4790 fdh->fake = 1;
4791 fdh->is_func_descriptor = 1;
4792 fdh->oh = fh;
4793 fh->is_func = 1;
4794 fh->oh = fdh;
bb700d78
AM
4795 return fdh;
4796}
4797
8387904d
AM
4798/* Fix function descriptor symbols defined in .opd sections to be
4799 function type. */
555cd476
AM
4800
4801static bfd_boolean
c16153ae 4802ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 4803 struct bfd_link_info *info,
555cd476 4804 Elf_Internal_Sym *isym,
6911b7dc 4805 const char **name,
555cd476
AM
4806 flagword *flags ATTRIBUTE_UNUSED,
4807 asection **sec,
4808 bfd_vma *value ATTRIBUTE_UNUSED)
4809{
f64b2e8d
NC
4810 if ((ibfd->flags & DYNAMIC) == 0
4811 && ELF_ST_BIND (isym->st_info) == STB_GNU_UNIQUE)
4812 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4813
e054468f 4814 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
c16153ae
L
4815 {
4816 if ((ibfd->flags & DYNAMIC) == 0)
f64b2e8d 4817 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
c16153ae 4818 }
e054468f
AM
4819 else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC)
4820 ;
4821 else if (*sec != NULL
70cc837d 4822 && strcmp ((*sec)->name, ".opd") == 0)
555cd476 4823 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
433817dd 4824
6911b7dc
AM
4825 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4826 {
4827 if (abiversion (ibfd) == 0)
4828 set_abiversion (ibfd, 2);
4829 else if (abiversion (ibfd) == 1)
4830 {
4831 info->callbacks->einfo (_("%P: symbol '%s' has invalid st_other"
4832 " for ABI version 1\n"), name);
4833 bfd_set_error (bfd_error_bad_value);
4834 return FALSE;
4835 }
4836 }
4837
555cd476
AM
4838 return TRUE;
4839}
4840
6911b7dc
AM
4841/* Merge non-visibility st_other attributes: local entry point. */
4842
4843static void
4844ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4845 const Elf_Internal_Sym *isym,
4846 bfd_boolean definition,
4847 bfd_boolean dynamic)
4848{
4849 if (definition && !dynamic)
4850 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4851 | ELF_ST_VISIBILITY (h->other));
4852}
4853
8387904d 4854/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
4855 inclusion of a new ABI object archive that defines "bar".
4856 NAME is a symbol defined in an archive. Return a symbol in the hash
4857 table that might be satisfied by the archive symbols. */
8387904d
AM
4858
4859static struct elf_link_hash_entry *
4860ppc64_elf_archive_symbol_lookup (bfd *abfd,
4861 struct bfd_link_info *info,
4862 const char *name)
4863{
4864 struct elf_link_hash_entry *h;
4865 char *dot_name;
4866 size_t len;
4867
4868 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
4869 if (h != NULL
4870 /* Don't return this sym if it is a fake function descriptor
4871 created by add_symbol_adjust. */
4872 && !(h->root.type == bfd_link_hash_undefweak
4873 && ((struct ppc_link_hash_entry *) h)->fake))
8387904d
AM
4874 return h;
4875
4876 if (name[0] == '.')
4877 return h;
4878
4879 len = strlen (name);
4880 dot_name = bfd_alloc (abfd, len + 2);
4881 if (dot_name == NULL)
4882 return (struct elf_link_hash_entry *) 0 - 1;
4883 dot_name[0] = '.';
4884 memcpy (dot_name + 1, name, len + 1);
4885 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4886 bfd_release (abfd, dot_name);
4887 return h;
4888}
4889
4890/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
4891 new ABI object defines "bar". Well, at least, undefined dot symbols
4892 are made weak. This stops later archive searches from including an
4893 object if we already have a function descriptor definition. It also
35b0ce59
AM
4894 prevents the linker complaining about undefined symbols.
4895 We also check and correct mismatched symbol visibility here. The
4896 most restrictive visibility of the function descriptor and the
4897 function entry symbol is used. */
8387904d
AM
4898
4899static bfd_boolean
b3fac117 4900add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 4901{
8387904d
AM
4902 struct ppc_link_hash_table *htab;
4903 struct ppc_link_hash_entry *fdh;
4904
b3fac117 4905 if (eh->elf.root.type == bfd_link_hash_indirect)
8387904d
AM
4906 return TRUE;
4907
b3fac117
AM
4908 if (eh->elf.root.type == bfd_link_hash_warning)
4909 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 4910
b3fac117
AM
4911 if (eh->elf.root.root.string[0] != '.')
4912 abort ();
8387904d 4913
b3fac117 4914 htab = ppc_hash_table (info);
4dfe6ac6
NC
4915 if (htab == NULL)
4916 return FALSE;
4917
b31867b6
AM
4918 fdh = lookup_fdh (eh, htab);
4919 if (fdh == NULL)
4920 {
4921 if (!info->relocatable
4922 && (eh->elf.root.type == bfd_link_hash_undefined
4923 || eh->elf.root.type == bfd_link_hash_undefweak)
4924 && eh->elf.ref_regular)
4925 {
4926 /* Make an undefweak function descriptor sym, which is enough to
4927 pull in an --as-needed shared lib, but won't cause link
4928 errors. Archives are handled elsewhere. */
4929 fdh = make_fdh (info, eh);
4930 if (fdh == NULL)
4931 return FALSE;
4932 fdh->elf.ref_regular = 1;
4933 }
bb700d78 4934 }
b31867b6 4935 else
8387904d 4936 {
35b0ce59
AM
4937 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4938 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4939 if (entry_vis < descr_vis)
4940 fdh->elf.other += entry_vis - descr_vis;
4941 else if (entry_vis > descr_vis)
4942 eh->elf.other += descr_vis - entry_vis;
4943
e87d886e
AM
4944 if ((fdh->elf.root.type == bfd_link_hash_defined
4945 || fdh->elf.root.type == bfd_link_hash_defweak)
4946 && eh->elf.root.type == bfd_link_hash_undefined)
35b0ce59
AM
4947 {
4948 eh->elf.root.type = bfd_link_hash_undefweak;
4949 eh->was_undefined = 1;
4950 htab->twiddled_syms = 1;
4951 }
8387904d 4952 }
99877b66 4953
8387904d
AM
4954 return TRUE;
4955}
4956
f6c7c3e8
AM
4957/* Set up opd section info and abiversion for IBFD, and process list
4958 of dot-symbols we made in link_hash_newfunc. */
b3fac117 4959
8387904d 4960static bfd_boolean
f6c7c3e8 4961ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
8387904d 4962{
99877b66 4963 struct ppc_link_hash_table *htab;
b3fac117 4964 struct ppc_link_hash_entry **p, *eh;
433817dd 4965
0c8d6e5c 4966 if (!is_ppc64_elf (info->output_bfd))
35b0ce59 4967 return TRUE;
4dfe6ac6
NC
4968 htab = ppc_hash_table (info);
4969 if (htab == NULL)
4970 return FALSE;
35b0ce59 4971
0c8d6e5c 4972 if (is_ppc64_elf (ibfd))
b3fac117 4973 {
f6c7c3e8
AM
4974 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
4975
4976 if (opd != NULL && opd->size != 0)
4977 {
4978 if (abiversion (ibfd) == 0)
4979 set_abiversion (ibfd, 1);
4980 else if (abiversion (ibfd) == 2)
4981 {
4982 info->callbacks->einfo (_("%P: %B .opd not allowed in ABI"
4983 " version %d\n"),
4984 ibfd, abiversion (ibfd));
4985 bfd_set_error (bfd_error_bad_value);
4986 return FALSE;
4987 }
4988
4989 if ((ibfd->flags & DYNAMIC) == 0
4990 && (opd->flags & SEC_RELOC) != 0
4991 && opd->reloc_count != 0
4992 && !bfd_is_abs_section (opd->output_section))
4993 {
4994 /* Garbage collection needs some extra help with .opd sections.
4995 We don't want to necessarily keep everything referenced by
4996 relocs in .opd, as that would keep all functions. Instead,
4997 if we reference an .opd symbol (a function descriptor), we
4998 want to keep the function code symbol's section. This is
4999 easy for global symbols, but for local syms we need to keep
5000 information about the associated function section. */
5001 bfd_size_type amt;
5002 asection **opd_sym_map;
5003
5004 amt = opd->size * sizeof (*opd_sym_map) / 8;
5005 opd_sym_map = bfd_zalloc (ibfd, amt);
5006 if (opd_sym_map == NULL)
5007 return FALSE;
5008 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
5009 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
5010 ppc64_elf_section_data (opd)->sec_type = sec_opd;
5011 }
5012 }
5013
5014 /* For input files without an explicit abiversion in e_flags
5015 we should have flagged any with symbol st_other bits set
5016 as ELFv1 and above flagged those with .opd as ELFv2.
5017 Set the output abiversion if not yet set, and for any input
5018 still ambiguous, take its abiversion from the output.
5019 Differences in ABI are reported later. */
5020 if (abiversion (info->output_bfd) == 0)
5021 set_abiversion (info->output_bfd, abiversion (ibfd));
5022 else if (abiversion (ibfd) == 0)
5023 set_abiversion (ibfd, abiversion (info->output_bfd));
5024
b3fac117
AM
5025 p = &htab->dot_syms;
5026 while ((eh = *p) != NULL)
5027 {
5028 *p = NULL;
1c865ab2
AM
5029 if (&eh->elf == htab->elf.hgot)
5030 ;
5031 else if (htab->elf.hgot == NULL
5032 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
5033 htab->elf.hgot = &eh->elf;
5034 else if (!add_symbol_adjust (eh, info))
b3fac117
AM
5035 return FALSE;
5036 p = &eh->u.next_dot_sym;
5037 }
5038 }
5039
5040 /* Clear the list for non-ppc64 input files. */
5041 p = &htab->dot_syms;
5042 while ((eh = *p) != NULL)
5043 {
5044 *p = NULL;
5045 p = &eh->u.next_dot_sym;
5046 }
99877b66
AM
5047
5048 /* We need to fix the undefs list for any syms we have twiddled to
5049 undef_weak. */
5050 if (htab->twiddled_syms)
5051 {
77cfaee6 5052 bfd_link_repair_undef_list (&htab->elf.root);
99877b66
AM
5053 htab->twiddled_syms = 0;
5054 }
b3fac117 5055 return TRUE;
8387904d
AM
5056}
5057
97fed1c9
JJ
5058/* Undo hash table changes when an --as-needed input file is determined
5059 not to be needed. */
5060
5061static bfd_boolean
e5034e59
AM
5062ppc64_elf_notice_as_needed (bfd *ibfd,
5063 struct bfd_link_info *info,
5064 enum notice_asneeded_action act)
97fed1c9 5065{
e5034e59
AM
5066 if (act == notice_not_needed)
5067 {
5068 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 5069
e5034e59
AM
5070 if (htab == NULL)
5071 return FALSE;
4dfe6ac6 5072
e5034e59
AM
5073 htab->dot_syms = NULL;
5074 }
5075 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
5076}
5077
aa374f67
AM
5078/* If --just-symbols against a final linked binary, then assume we need
5079 toc adjusting stubs when calling functions defined there. */
5080
5081static void
5082ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
5083{
5084 if ((sec->flags & SEC_CODE) != 0
5085 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
5086 && is_ppc64_elf (sec->owner))
5087 {
2c3f079f
AM
5088 if (abiversion (sec->owner) >= 2
5089 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
aa374f67
AM
5090 sec->has_toc_reloc = 1;
5091 }
5092 _bfd_elf_link_just_syms (sec, info);
5093}
5094
e054468f 5095static struct plt_entry **
4ce794b7
AM
5096update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
5097 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
5098{
5099 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 5100 struct plt_entry **local_plt;
f961d9dd 5101 unsigned char *local_got_tls_masks;
411e1bfb
AM
5102
5103 if (local_got_ents == NULL)
5104 {
5105 bfd_size_type size = symtab_hdr->sh_info;
5106
e054468f
AM
5107 size *= (sizeof (*local_got_ents)
5108 + sizeof (*local_plt)
5109 + sizeof (*local_got_tls_masks));
4ce794b7 5110 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 5111 if (local_got_ents == NULL)
e054468f 5112 return NULL;
411e1bfb
AM
5113 elf_local_got_ents (abfd) = local_got_ents;
5114 }
5115
e054468f 5116 if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
411e1bfb
AM
5117 {
5118 struct got_entry *ent;
5119
5120 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
5121 if (ent->addend == r_addend
5122 && ent->owner == abfd
5123 && ent->tls_type == tls_type)
411e1bfb
AM
5124 break;
5125 if (ent == NULL)
5126 {
5127 bfd_size_type amt = sizeof (*ent);
4ce794b7 5128 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
5129 if (ent == NULL)
5130 return FALSE;
5131 ent->next = local_got_ents[r_symndx];
5132 ent->addend = r_addend;
e717da7e 5133 ent->owner = abfd;
411e1bfb 5134 ent->tls_type = tls_type;
927be08e 5135 ent->is_indirect = FALSE;
411e1bfb
AM
5136 ent->got.refcount = 0;
5137 local_got_ents[r_symndx] = ent;
5138 }
5139 ent->got.refcount += 1;
5140 }
5141
e054468f 5142 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 5143 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
e7b938ca 5144 local_got_tls_masks[r_symndx] |= tls_type;
e054468f
AM
5145
5146 return local_plt + r_symndx;
65f38f15
AM
5147}
5148
411e1bfb 5149static bfd_boolean
e054468f 5150update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 5151{
411e1bfb 5152 struct plt_entry *ent;
1e2f5b6e 5153
e054468f 5154 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
5155 if (ent->addend == addend)
5156 break;
5157 if (ent == NULL)
1e2f5b6e 5158 {
411e1bfb 5159 bfd_size_type amt = sizeof (*ent);
4ce794b7 5160 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
5161 if (ent == NULL)
5162 return FALSE;
e054468f 5163 ent->next = *plist;
411e1bfb
AM
5164 ent->addend = addend;
5165 ent->plt.refcount = 0;
e054468f 5166 *plist = ent;
1e2f5b6e 5167 }
411e1bfb 5168 ent->plt.refcount += 1;
b34976b6 5169 return TRUE;
1e2f5b6e
AM
5170}
5171
e054468f
AM
5172static bfd_boolean
5173is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5174{
5175 return (r_type == R_PPC64_REL24
5176 || r_type == R_PPC64_REL14
5177 || r_type == R_PPC64_REL14_BRTAKEN
5178 || r_type == R_PPC64_REL14_BRNTAKEN
5179 || r_type == R_PPC64_ADDR24
5180 || r_type == R_PPC64_ADDR14
5181 || r_type == R_PPC64_ADDR14_BRTAKEN
5182 || r_type == R_PPC64_ADDR14_BRNTAKEN);
5183}
5184
5bd4f169 5185/* Look through the relocs for a section during the first phase, and
65f38f15 5186 calculate needed space in the global offset table, procedure
5d1634d7 5187 linkage table, and dynamic reloc sections. */
5bd4f169 5188
b34976b6 5189static bfd_boolean
4ce794b7
AM
5190ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5191 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 5192{
65f38f15 5193 struct ppc_link_hash_table *htab;
5bd4f169 5194 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 5195 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
5196 const Elf_Internal_Rela *rel;
5197 const Elf_Internal_Rela *rel_end;
5bd4f169 5198 asection *sreloc;
1e2f5b6e 5199 asection **opd_sym_map;
3a71aa26 5200 struct elf_link_hash_entry *tga, *dottga;
5bd4f169 5201
1049f94e 5202 if (info->relocatable)
b34976b6 5203 return TRUE;
5bd4f169 5204
680a3378
AM
5205 /* Don't do anything special with non-loaded, non-alloced sections.
5206 In particular, any relocs in such sections should not affect GOT
5207 and PLT reference counting (ie. we don't allow them to create GOT
5208 or PLT entries), there's no possibility or desire to optimize TLS
5209 relocs, and there's not much point in propagating relocs to shared
5210 libs that the dynamic linker won't relocate. */
5211 if ((sec->flags & SEC_ALLOC) == 0)
5212 return TRUE;
5213
0c8d6e5c 5214 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 5215
65f38f15 5216 htab = ppc_hash_table (info);
4dfe6ac6
NC
5217 if (htab == NULL)
5218 return FALSE;
5219
3a71aa26
AM
5220 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5221 FALSE, FALSE, TRUE);
5222 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5223 FALSE, FALSE, TRUE);
0ffa91dd 5224 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 5225 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 5226 sreloc = NULL;
1e2f5b6e 5227 opd_sym_map = NULL;
f6c7c3e8
AM
5228 if (ppc64_elf_section_data (sec) != NULL
5229 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
5230 opd_sym_map = ppc64_elf_section_data (sec)->u.opd.func_sec;
5bd4f169
AM
5231
5232 rel_end = relocs + sec->reloc_count;
5233 for (rel = relocs; rel < rel_end; rel++)
5234 {
5235 unsigned long r_symndx;
5236 struct elf_link_hash_entry *h;
04c9666a 5237 enum elf_ppc64_reloc_type r_type;
727fc41e 5238 int tls_type;
7c8fe5c4 5239 struct _ppc64_elf_section_data *ppc64_sec;
e054468f 5240 struct plt_entry **ifunc;
5bd4f169
AM
5241
5242 r_symndx = ELF64_R_SYM (rel->r_info);
5243 if (r_symndx < symtab_hdr->sh_info)
5244 h = NULL;
5245 else
973a3492
L
5246 {
5247 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 5248 h = elf_follow_link (h);
81fbe831
AM
5249
5250 /* PR15323, ref flags aren't set for references in the same
5251 object. */
5252 h->root.non_ir_ref = 1;
1c865ab2
AM
5253
5254 if (h == htab->elf.hgot)
5255 sec->has_toc_reloc = 1;
973a3492 5256 }
5bd4f169 5257
727fc41e 5258 tls_type = 0;
e054468f 5259 ifunc = NULL;
25f23106
AM
5260 if (h != NULL)
5261 {
5262 if (h->type == STT_GNU_IFUNC)
5263 {
5264 h->needs_plt = 1;
5265 ifunc = &h->plt.plist;
5266 }
5267 }
5268 else
5269 {
5270 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5271 abfd, r_symndx);
5272 if (isym == NULL)
5273 return FALSE;
5274
5275 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5276 {
5277 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5278 rel->r_addend, PLT_IFUNC);
5279 if (ifunc == NULL)
5280 return FALSE;
5281 }
5282 }
4ce794b7 5283 r_type = ELF64_R_TYPE (rel->r_info);
e054468f
AM
5284 if (is_branch_reloc (r_type))
5285 {
5286 if (h != NULL && (h == tga || h == dottga))
5287 {
5288 if (rel != relocs
5289 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5290 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5291 /* We have a new-style __tls_get_addr call with a marker
5292 reloc. */
5293 ;
5294 else
5295 /* Mark this section as having an old-style call. */
5296 sec->has_tls_get_addr_call = 1;
5297 }
727fc41e 5298
e054468f 5299 /* STT_GNU_IFUNC symbols must have a PLT entry. */
e054468f
AM
5300 if (ifunc != NULL
5301 && !update_plt_info (abfd, ifunc, rel->r_addend))
5302 return FALSE;
5303 }
727fc41e 5304
a33d1f77 5305 switch (r_type)
5bd4f169 5306 {
727fc41e
AM
5307 case R_PPC64_TLSGD:
5308 case R_PPC64_TLSLD:
5309 /* These special tls relocs tie a call to __tls_get_addr with
5310 its parameter symbol. */
5311 break;
5312
411e1bfb
AM
5313 case R_PPC64_GOT_TLSLD16:
5314 case R_PPC64_GOT_TLSLD16_LO:
5315 case R_PPC64_GOT_TLSLD16_HI:
5316 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 5317 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
5318 goto dogottls;
5319
5320 case R_PPC64_GOT_TLSGD16:
5321 case R_PPC64_GOT_TLSGD16_LO:
5322 case R_PPC64_GOT_TLSGD16_HI:
5323 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 5324 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
5325 goto dogottls;
5326
5327 case R_PPC64_GOT_TPREL16_DS:
5328 case R_PPC64_GOT_TPREL16_LO_DS:
5329 case R_PPC64_GOT_TPREL16_HI:
5330 case R_PPC64_GOT_TPREL16_HA:
1d483afe 5331 if (!info->executable)
411e1bfb
AM
5332 info->flags |= DF_STATIC_TLS;
5333 tls_type = TLS_TLS | TLS_TPREL;
5334 goto dogottls;
5335
5336 case R_PPC64_GOT_DTPREL16_DS:
5337 case R_PPC64_GOT_DTPREL16_LO_DS:
5338 case R_PPC64_GOT_DTPREL16_HI:
5339 case R_PPC64_GOT_DTPREL16_HA:
5340 tls_type = TLS_TLS | TLS_DTPREL;
5341 dogottls:
5342 sec->has_tls_reloc = 1;
5343 /* Fall thru */
5344
5bd4f169 5345 case R_PPC64_GOT16:
5bd4f169 5346 case R_PPC64_GOT16_DS:
65f38f15
AM
5347 case R_PPC64_GOT16_HA:
5348 case R_PPC64_GOT16_HI:
5349 case R_PPC64_GOT16_LO:
5bd4f169 5350 case R_PPC64_GOT16_LO_DS:
65f38f15 5351 /* This symbol requires a global offset table entry. */
4c52953f 5352 sec->has_toc_reloc = 1;
33c0ec9d
AM
5353 if (r_type == R_PPC64_GOT_TLSLD16
5354 || r_type == R_PPC64_GOT_TLSGD16
5355 || r_type == R_PPC64_GOT_TPREL16_DS
5356 || r_type == R_PPC64_GOT_DTPREL16_DS
5357 || r_type == R_PPC64_GOT16
5358 || r_type == R_PPC64_GOT16_DS)
5359 {
5360 htab->do_multi_toc = 1;
d77c8a4b 5361 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
5362 }
5363
e717da7e
AM
5364 if (ppc64_elf_tdata (abfd)->got == NULL
5365 && !create_got_section (abfd, info))
b34976b6 5366 return FALSE;
5bd4f169
AM
5367
5368 if (h != NULL)
5369 {
411e1bfb
AM
5370 struct ppc_link_hash_entry *eh;
5371 struct got_entry *ent;
65f38f15 5372
411e1bfb
AM
5373 eh = (struct ppc_link_hash_entry *) h;
5374 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5375 if (ent->addend == rel->r_addend
e717da7e 5376 && ent->owner == abfd
411e1bfb
AM
5377 && ent->tls_type == tls_type)
5378 break;
5379 if (ent == NULL)
5bd4f169 5380 {
411e1bfb 5381 bfd_size_type amt = sizeof (*ent);
4ce794b7 5382 ent = bfd_alloc (abfd, amt);
411e1bfb 5383 if (ent == NULL)
b34976b6 5384 return FALSE;
411e1bfb
AM
5385 ent->next = eh->elf.got.glist;
5386 ent->addend = rel->r_addend;
e717da7e 5387 ent->owner = abfd;
411e1bfb 5388 ent->tls_type = tls_type;
927be08e 5389 ent->is_indirect = FALSE;
411e1bfb
AM
5390 ent->got.refcount = 0;
5391 eh->elf.got.glist = ent;
5bd4f169 5392 }
411e1bfb 5393 ent->got.refcount += 1;
e7b938ca 5394 eh->tls_mask |= tls_type;
5bd4f169 5395 }
411e1bfb
AM
5396 else
5397 /* This is a global offset table entry for a local symbol. */
5398 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5399 rel->r_addend, tls_type))
5400 return FALSE;
a345bc8d
AM
5401
5402 /* We may also need a plt entry if the symbol turns out to be
5403 an ifunc. */
f6c7c3e8 5404 if (h != NULL && !info->shared && abiversion (abfd) != 1)
a345bc8d
AM
5405 {
5406 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5407 return FALSE;
5408 }
5bd4f169
AM
5409 break;
5410
5bd4f169 5411 case R_PPC64_PLT16_HA:
65f38f15
AM
5412 case R_PPC64_PLT16_HI:
5413 case R_PPC64_PLT16_LO:
5414 case R_PPC64_PLT32:
5415 case R_PPC64_PLT64:
5bd4f169 5416 /* This symbol requires a procedure linkage table entry. We
3fad3c7c
AM
5417 actually build the entry in adjust_dynamic_symbol,
5418 because this might be a case of linking PIC code without
5419 linking in any dynamic objects, in which case we don't
5420 need to generate a procedure linkage table after all. */
5bd4f169
AM
5421 if (h == NULL)
5422 {
5423 /* It does not make sense to have a procedure linkage
3fad3c7c 5424 table entry for a local symbol. */
5bd4f169 5425 bfd_set_error (bfd_error_bad_value);
b34976b6 5426 return FALSE;
5bd4f169 5427 }
411e1bfb 5428 else
e054468f
AM
5429 {
5430 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5431 return FALSE;
5432 h->needs_plt = 1;
5433 if (h->root.root.string[0] == '.'
5434 && h->root.root.string[1] != '\0')
5435 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5436 }
5bd4f169
AM
5437 break;
5438
5439 /* The following relocations don't need to propagate the
5440 relocation if linking a shared object since they are
5441 section relative. */
5442 case R_PPC64_SECTOFF:
5443 case R_PPC64_SECTOFF_LO:
5444 case R_PPC64_SECTOFF_HI:
5445 case R_PPC64_SECTOFF_HA:
5446 case R_PPC64_SECTOFF_DS:
5447 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
5448 case R_PPC64_DTPREL16:
5449 case R_PPC64_DTPREL16_LO:
5450 case R_PPC64_DTPREL16_HI:
5451 case R_PPC64_DTPREL16_HA:
5452 case R_PPC64_DTPREL16_DS:
5453 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
5454 case R_PPC64_DTPREL16_HIGH:
5455 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
5456 case R_PPC64_DTPREL16_HIGHER:
5457 case R_PPC64_DTPREL16_HIGHERA:
5458 case R_PPC64_DTPREL16_HIGHEST:
5459 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
5460 break;
5461
ad8e1ba5 5462 /* Nor do these. */
25f23106
AM
5463 case R_PPC64_REL16:
5464 case R_PPC64_REL16_LO:
5465 case R_PPC64_REL16_HI:
5466 case R_PPC64_REL16_HA:
5467 break;
5468
45965137
AM
5469 /* Not supported as a dynamic relocation. */
5470 case R_PPC64_ADDR64_LOCAL:
5471 if (info->shared)
5472 {
5473 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5474 ppc_howto_init ();
5475 info->callbacks->einfo (_("%P: %H: %s reloc unsupported "
5476 "in shared libraries and PIEs.\n"),
5477 abfd, sec, rel->r_offset,
5478 ppc64_elf_howto_table[r_type]->name);
5479 bfd_set_error (bfd_error_bad_value);
5480 return FALSE;
5481 }
5482 break;
5483
ad8e1ba5 5484 case R_PPC64_TOC16:
33c0ec9d
AM
5485 case R_PPC64_TOC16_DS:
5486 htab->do_multi_toc = 1;
d77c8a4b 5487 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
ad8e1ba5
AM
5488 case R_PPC64_TOC16_LO:
5489 case R_PPC64_TOC16_HI:
5490 case R_PPC64_TOC16_HA:
ad8e1ba5 5491 case R_PPC64_TOC16_LO_DS:
4c52953f 5492 sec->has_toc_reloc = 1;
ad8e1ba5
AM
5493 break;
5494
5bd4f169
AM
5495 /* This relocation describes the C++ object vtable hierarchy.
5496 Reconstruct it for later use during GC. */
5497 case R_PPC64_GNU_VTINHERIT:
c152c796 5498 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 5499 return FALSE;
5bd4f169
AM
5500 break;
5501
5502 /* This relocation describes which C++ vtable entries are actually
5503 used. Record for later use during GC. */
5504 case R_PPC64_GNU_VTENTRY:
d17e0c6e
JB
5505 BFD_ASSERT (h != NULL);
5506 if (h != NULL
5507 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 5508 return FALSE;
5bd4f169
AM
5509 break;
5510
721956f4
AM
5511 case R_PPC64_REL14:
5512 case R_PPC64_REL14_BRTAKEN:
5513 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
5514 {
5515 asection *dest = NULL;
5516
5517 /* Heuristic: If jumping outside our section, chances are
5518 we are going to need a stub. */
5519 if (h != NULL)
5520 {
5521 /* If the sym is weak it may be overridden later, so
5522 don't assume we know where a weak sym lives. */
5523 if (h->root.type == bfd_link_hash_defined)
5524 dest = h->root.u.def.section;
5525 }
5526 else
87d72d41
AM
5527 {
5528 Elf_Internal_Sym *isym;
5529
5530 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5531 abfd, r_symndx);
5532 if (isym == NULL)
5533 return FALSE;
5534
5535 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5536 }
5537
220c76dd 5538 if (dest != sec)
7c8fe5c4 5539 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 5540 }
721956f4
AM
5541 /* Fall through. */
5542
5d1634d7 5543 case R_PPC64_REL24:
e054468f 5544 if (h != NULL && ifunc == NULL)
5d1634d7
AM
5545 {
5546 /* We may need a .plt entry if the function this reloc
5547 refers to is in a shared lib. */
e054468f 5548 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
411e1bfb 5549 return FALSE;
e054468f
AM
5550 h->needs_plt = 1;
5551 if (h->root.root.string[0] == '.'
5552 && h->root.root.string[1] != '\0')
5553 ((struct ppc_link_hash_entry *) h)->is_func = 1;
3a71aa26 5554 if (h == tga || h == dottga)
411e1bfb 5555 sec->has_tls_reloc = 1;
411e1bfb
AM
5556 }
5557 break;
5558
5559 case R_PPC64_TPREL64:
5560 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
1d483afe 5561 if (!info->executable)
411e1bfb
AM
5562 info->flags |= DF_STATIC_TLS;
5563 goto dotlstoc;
5564
5565 case R_PPC64_DTPMOD64:
5566 if (rel + 1 < rel_end
5567 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5568 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 5569 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 5570 else
951fd09b 5571 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
5572 goto dotlstoc;
5573
5574 case R_PPC64_DTPREL64:
5575 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5576 if (rel != relocs
5577 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5578 && rel[-1].r_offset == rel->r_offset - 8)
5579 /* This is the second reloc of a dtpmod, dtprel pair.
5580 Don't mark with TLS_DTPREL. */
5581 goto dodyn;
5582
5583 dotlstoc:
5584 sec->has_tls_reloc = 1;
5585 if (h != NULL)
5586 {
5587 struct ppc_link_hash_entry *eh;
5588 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 5589 eh->tls_mask |= tls_type;
411e1bfb
AM
5590 }
5591 else
5592 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5593 rel->r_addend, tls_type))
5594 return FALSE;
5595
7c8fe5c4
AM
5596 ppc64_sec = ppc64_elf_section_data (sec);
5597 if (ppc64_sec->sec_type != sec_toc)
411e1bfb 5598 {
3a71aa26
AM
5599 bfd_size_type amt;
5600
e7b938ca 5601 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5602 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5603 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5604 if (ppc64_sec->u.toc.symndx == NULL)
5605 return FALSE;
5606 amt = sec->size * sizeof (bfd_vma) / 8;
5607 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5608 if (ppc64_sec->u.toc.add == NULL)
411e1bfb 5609 return FALSE;
7c8fe5c4
AM
5610 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5611 ppc64_sec->sec_type = sec_toc;
411e1bfb
AM
5612 }
5613 BFD_ASSERT (rel->r_offset % 8 == 0);
3a71aa26
AM
5614 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5615 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5616
5617 /* Mark the second slot of a GD or LD entry.
5618 -1 to indicate GD and -2 to indicate LD. */
5619 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5620 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5621 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5622 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5623 goto dodyn;
5624
5625 case R_PPC64_TPREL16:
5626 case R_PPC64_TPREL16_LO:
5627 case R_PPC64_TPREL16_HI:
5628 case R_PPC64_TPREL16_HA:
5629 case R_PPC64_TPREL16_DS:
5630 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
5631 case R_PPC64_TPREL16_HIGH:
5632 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5633 case R_PPC64_TPREL16_HIGHER:
5634 case R_PPC64_TPREL16_HIGHERA:
5635 case R_PPC64_TPREL16_HIGHEST:
5636 case R_PPC64_TPREL16_HIGHESTA:
5637 if (info->shared)
5638 {
1d483afe
AM
5639 if (!info->executable)
5640 info->flags |= DF_STATIC_TLS;
411e1bfb 5641 goto dodyn;
5d1634d7
AM
5642 }
5643 break;
5644
e86ce104 5645 case R_PPC64_ADDR64:
1e2f5b6e 5646 if (opd_sym_map != NULL
1e2f5b6e 5647 && rel + 1 < rel_end
4ce794b7 5648 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 5649 {
8387904d
AM
5650 if (h != NULL)
5651 {
5652 if (h->root.root.string[0] == '.'
5653 && h->root.root.string[1] != 0
b31867b6 5654 && lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
8387904d
AM
5655 ;
5656 else
5657 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5658 }
5659 else
5660 {
5661 asection *s;
87d72d41 5662 Elf_Internal_Sym *isym;
1e2f5b6e 5663
87d72d41
AM
5664 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5665 abfd, r_symndx);
5666 if (isym == NULL)
8387904d 5667 return FALSE;
87d72d41
AM
5668
5669 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5670 if (s != NULL && s != sec)
3f764659 5671 opd_sym_map[rel->r_offset / 8] = s;
8387904d 5672 }
1e2f5b6e 5673 }
e86ce104
AM
5674 /* Fall through. */
5675
65f38f15
AM
5676 case R_PPC64_ADDR16:
5677 case R_PPC64_ADDR16_DS:
5678 case R_PPC64_ADDR16_HA:
5679 case R_PPC64_ADDR16_HI:
f9c6b907
AM
5680 case R_PPC64_ADDR16_HIGH:
5681 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
5682 case R_PPC64_ADDR16_HIGHER:
5683 case R_PPC64_ADDR16_HIGHERA:
5684 case R_PPC64_ADDR16_HIGHEST:
5685 case R_PPC64_ADDR16_HIGHESTA:
5686 case R_PPC64_ADDR16_LO:
5687 case R_PPC64_ADDR16_LO_DS:
f6c7c3e8 5688 if (h != NULL && !info->shared && abiversion (abfd) != 1
a345bc8d
AM
5689 && rel->r_addend == 0)
5690 {
5691 /* We may need a .plt entry if this reloc refers to a
5692 function in a shared lib. */
5693 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5694 return FALSE;
5695 h->pointer_equality_needed = 1;
5696 }
5697 /* Fall through. */
5698
5699 case R_PPC64_REL30:
5700 case R_PPC64_REL32:
5701 case R_PPC64_REL64:
5702 case R_PPC64_ADDR14:
5703 case R_PPC64_ADDR14_BRNTAKEN:
5704 case R_PPC64_ADDR14_BRTAKEN:
65f38f15 5705 case R_PPC64_ADDR24:
65f38f15 5706 case R_PPC64_ADDR32:
65f38f15
AM
5707 case R_PPC64_UADDR16:
5708 case R_PPC64_UADDR32:
5709 case R_PPC64_UADDR64:
5bd4f169 5710 case R_PPC64_TOC:
81848ca0
AM
5711 if (h != NULL && !info->shared)
5712 /* We may need a copy reloc. */
f5385ebf 5713 h->non_got_ref = 1;
81848ca0 5714
41bd81ab 5715 /* Don't propagate .opd relocs. */
1e2f5b6e 5716 if (NO_OPD_RELOCS && opd_sym_map != NULL)
e86ce104 5717 break;
e86ce104 5718
65f38f15
AM
5719 /* If we are creating a shared library, and this is a reloc
5720 against a global symbol, or a non PC relative reloc
5721 against a local symbol, then we need to copy the reloc
5722 into the shared library. However, if we are linking with
5723 -Bsymbolic, we do not need to copy a reloc against a
5724 global symbol which is defined in an object we are
5725 including in the link (i.e., DEF_REGULAR is set). At
5726 this point we have not seen all the input files, so it is
5727 possible that DEF_REGULAR is not set now but will be set
5728 later (it is never cleared). In case of a weak definition,
5729 DEF_REGULAR may be cleared later by a strong definition in
5730 a shared library. We account for that possibility below by
f4656909 5731 storing information in the dyn_relocs field of the hash
65f38f15
AM
5732 table entry. A similar situation occurs when creating
5733 shared libraries and symbol visibility changes render the
5734 symbol local.
5735
5736 If on the other hand, we are creating an executable, we
5737 may need to keep relocations for symbols satisfied by a
5738 dynamic library if we manage to avoid copy relocs for the
5739 symbol. */
411e1bfb 5740 dodyn:
65f38f15 5741 if ((info->shared
1d483afe 5742 && (must_be_dyn_reloc (info, r_type)
65f38f15 5743 || (h != NULL
198f1157 5744 && (!SYMBOLIC_BIND (info, h)
65f38f15 5745 || h->root.type == bfd_link_hash_defweak
f5385ebf 5746 || !h->def_regular))))
f4656909
AM
5747 || (ELIMINATE_COPY_RELOCS
5748 && !info->shared
65f38f15
AM
5749 && h != NULL
5750 && (h->root.type == bfd_link_hash_defweak
25f23106
AM
5751 || !h->def_regular))
5752 || (!info->shared
5753 && ifunc != NULL))
5bd4f169 5754 {
65f38f15
AM
5755 /* We must copy these reloc types into the output file.
5756 Create a reloc section in dynobj and make room for
5757 this reloc. */
5bd4f169
AM
5758 if (sreloc == NULL)
5759 {
83bac4b0
NC
5760 sreloc = _bfd_elf_make_dynamic_reloc_section
5761 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
65f38f15 5762
5bd4f169 5763 if (sreloc == NULL)
83bac4b0 5764 return FALSE;
5bd4f169
AM
5765 }
5766
65f38f15
AM
5767 /* If this is a global symbol, we count the number of
5768 relocations we need for this symbol. */
5769 if (h != NULL)
5770 {
19e08130
AM
5771 struct elf_dyn_relocs *p;
5772 struct elf_dyn_relocs **head;
5773
ec338859 5774 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
19e08130
AM
5775 p = *head;
5776 if (p == NULL || p->sec != sec)
5777 {
5778 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5779 if (p == NULL)
5780 return FALSE;
5781 p->next = *head;
5782 *head = p;
5783 p->sec = sec;
5784 p->count = 0;
5785 p->pc_count = 0;
5786 }
5787 p->count += 1;
5788 if (!must_be_dyn_reloc (info, r_type))
5789 p->pc_count += 1;
65f38f15
AM
5790 }
5791 else
5792 {
ec338859
AM
5793 /* Track dynamic relocs needed for local syms too.
5794 We really need local syms available to do this
5795 easily. Oh well. */
19e08130
AM
5796 struct ppc_dyn_relocs *p;
5797 struct ppc_dyn_relocs **head;
5798 bfd_boolean is_ifunc;
ec338859 5799 asection *s;
6edfbbad 5800 void *vpp;
87d72d41 5801 Elf_Internal_Sym *isym;
6edfbbad 5802
87d72d41
AM
5803 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5804 abfd, r_symndx);
5805 if (isym == NULL)
b34976b6 5806 return FALSE;
ec338859 5807
87d72d41
AM
5808 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5809 if (s == NULL)
5810 s = sec;
5811
6edfbbad 5812 vpp = &elf_section_data (s)->local_dynrel;
19e08130
AM
5813 head = (struct ppc_dyn_relocs **) vpp;
5814 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5815 p = *head;
5816 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5817 p = p->next;
5818 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5819 {
5820 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5821 if (p == NULL)
5822 return FALSE;
5823 p->next = *head;
5824 *head = p;
5825 p->sec = sec;
5826 p->ifunc = is_ifunc;
5827 p->count = 0;
5828 }
5829 p->count += 1;
ec338859 5830 }
65f38f15 5831 }
5bd4f169 5832 break;
65f38f15
AM
5833
5834 default:
96e0dda4 5835 break;
5bd4f169
AM
5836 }
5837 }
5838
b34976b6 5839 return TRUE;
5bd4f169
AM
5840}
5841
ee67d69a
AM
5842/* Merge backend specific data from an object file to the output
5843 object file when linking. */
5844
5845static bfd_boolean
5846ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
5847{
5848 unsigned long iflags, oflags;
5849
5850 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5851 return TRUE;
5852
5853 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5854 return TRUE;
5855
5856 if (!_bfd_generic_verify_endian_match (ibfd, obfd))
5857 return FALSE;
5858
5859 iflags = elf_elfheader (ibfd)->e_flags;
5860 oflags = elf_elfheader (obfd)->e_flags;
5861
f6c7c3e8 5862 if (iflags & ~EF_PPC64_ABI)
ee67d69a
AM
5863 {
5864 (*_bfd_error_handler)
5865 (_("%B uses unknown e_flags 0x%lx"), ibfd, iflags);
5866 bfd_set_error (bfd_error_bad_value);
5867 return FALSE;
5868 }
f6c7c3e8 5869 else if (iflags != oflags && iflags != 0)
ee67d69a
AM
5870 {
5871 (*_bfd_error_handler)
5872 (_("%B: ABI version %ld is not compatible with ABI version %ld output"),
5873 ibfd, iflags, oflags);
5874 bfd_set_error (bfd_error_bad_value);
5875 return FALSE;
5876 }
5877
5878 /* Merge Tag_compatibility attributes and any common GNU ones. */
5879 _bfd_elf_merge_object_attributes (ibfd, obfd);
5880
5881 return TRUE;
5882}
5883
5884static bfd_boolean
5885ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5886{
5887 /* Print normal ELF private data. */
5888 _bfd_elf_print_private_bfd_data (abfd, ptr);
5889
5890 if (elf_elfheader (abfd)->e_flags != 0)
5891 {
5892 FILE *file = ptr;
5893
5894 /* xgettext:c-format */
5895 fprintf (file, _("private flags = 0x%lx:"),
5896 elf_elfheader (abfd)->e_flags);
5897
5898 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5899 fprintf (file, _(" [abiv%ld]"),
5900 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5901 fputc ('\n', file);
5902 }
5903
5904 return TRUE;
5905}
5906
8387904d
AM
5907/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
5908 of the code entry point, and its section. */
5909
5910static bfd_vma
5911opd_entry_value (asection *opd_sec,
5912 bfd_vma offset,
5913 asection **code_sec,
aef36ac1
AM
5914 bfd_vma *code_off,
5915 bfd_boolean in_code_sec)
8387904d
AM
5916{
5917 bfd *opd_bfd = opd_sec->owner;
8860955f 5918 Elf_Internal_Rela *relocs;
8387904d 5919 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 5920 bfd_vma val;
8387904d 5921
9f296da3
AM
5922 /* No relocs implies we are linking a --just-symbols object, or looking
5923 at a final linked executable with addr2line or somesuch. */
4b85d634
AM
5924 if (opd_sec->reloc_count == 0)
5925 {
729eabd5 5926 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
3b36f7e6 5927
729eabd5
AM
5928 if (contents == NULL)
5929 {
5930 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5931 return (bfd_vma) -1;
5932 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5933 }
ee1e4ede 5934
729eabd5 5935 val = bfd_get_64 (opd_bfd, contents + offset);
aef36ac1
AM
5936 if (code_sec != NULL)
5937 {
5938 asection *sec, *likely = NULL;
ee1e4ede 5939
aef36ac1 5940 if (in_code_sec)
4b85d634 5941 {
aef36ac1
AM
5942 sec = *code_sec;
5943 if (sec->vma <= val
5944 && val < sec->vma + sec->size)
5945 likely = sec;
5946 else
5947 val = -1;
5948 }
5949 else
5950 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5951 if (sec->vma <= val
5952 && (sec->flags & SEC_LOAD) != 0
5953 && (sec->flags & SEC_ALLOC) != 0)
5954 likely = sec;
5955 if (likely != NULL)
5956 {
5957 *code_sec = likely;
5958 if (code_off != NULL)
5959 *code_off = val - likely->vma;
4b85d634
AM
5960 }
5961 }
aef36ac1 5962 return val;
4b85d634
AM
5963 }
5964
0c8d6e5c 5965 BFD_ASSERT (is_ppc64_elf (opd_bfd));
0ffa91dd 5966
729eabd5 5967 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
8860955f
AM
5968 if (relocs == NULL)
5969 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
645ea6a9 5970
8387904d 5971 /* Go find the opd reloc at the sym address. */
8860955f 5972 lo = relocs;
8387904d
AM
5973 BFD_ASSERT (lo != NULL);
5974 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 5975 val = (bfd_vma) -1;
8387904d
AM
5976 while (lo < hi)
5977 {
5978 look = lo + (hi - lo) / 2;
5979 if (look->r_offset < offset)
5980 lo = look + 1;
5981 else if (look->r_offset > offset)
5982 hi = look;
5983 else
5984 {
0ffa91dd
NC
5985 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5986
8387904d
AM
5987 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5988 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5989 {
5990 unsigned long symndx = ELF64_R_SYM (look->r_info);
8387904d
AM
5991 asection *sec;
5992
62599110
AM
5993 if (symndx < symtab_hdr->sh_info
5994 || elf_sym_hashes (opd_bfd) == NULL)
8387904d
AM
5995 {
5996 Elf_Internal_Sym *sym;
5997
5998 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5999 if (sym == NULL)
6000 {
62599110
AM
6001 size_t symcnt = symtab_hdr->sh_info;
6002 if (elf_sym_hashes (opd_bfd) == NULL)
6003 symcnt = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
6004 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, symcnt,
8387904d
AM
6005 0, NULL, NULL, NULL);
6006 if (sym == NULL)
645ea6a9 6007 break;
8387904d
AM
6008 symtab_hdr->contents = (bfd_byte *) sym;
6009 }
6010
6011 sym += symndx;
6012 val = sym->st_value;
cb33740c 6013 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
8387904d
AM
6014 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
6015 }
6016 else
6017 {
6018 struct elf_link_hash_entry **sym_hashes;
6019 struct elf_link_hash_entry *rh;
6020
6021 sym_hashes = elf_sym_hashes (opd_bfd);
6022 rh = sym_hashes[symndx - symtab_hdr->sh_info];
128205bb
AM
6023 if (rh != NULL)
6024 {
6025 rh = elf_follow_link (rh);
6026 BFD_ASSERT (rh->root.type == bfd_link_hash_defined
6027 || rh->root.type == bfd_link_hash_defweak);
6028 val = rh->root.u.def.value;
6029 sec = rh->root.u.def.section;
6030 }
6031 else
6032 {
6033 /* Handle the odd case where we can be called
6034 during bfd_elf_link_add_symbols before the
6035 symbol hashes have been fully populated. */
6036 Elf_Internal_Sym *sym;
6037
6038 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, 1,
6039 symndx, NULL, NULL, NULL);
6040 if (sym == NULL)
6041 break;
6042
6043 val = sym->st_value;
6044 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
6045 free (sym);
6046 }
8387904d
AM
6047 }
6048 val += look->r_addend;
6049 if (code_off != NULL)
6050 *code_off = val;
6051 if (code_sec != NULL)
aef36ac1
AM
6052 {
6053 if (in_code_sec && *code_sec != sec)
6054 return -1;
6055 else
6056 *code_sec = sec;
6057 }
8387904d
AM
6058 if (sec != NULL && sec->output_section != NULL)
6059 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
6060 }
6061 break;
6062 }
6063 }
645ea6a9 6064
645ea6a9 6065 return val;
8387904d
AM
6066}
6067
aef36ac1
AM
6068/* If the ELF symbol SYM might be a function in SEC, return the
6069 function size and set *CODE_OFF to the function's entry point,
6070 otherwise return zero. */
9f296da3 6071
aef36ac1
AM
6072static bfd_size_type
6073ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
6074 bfd_vma *code_off)
9f296da3 6075{
aef36ac1
AM
6076 bfd_size_type size;
6077
6078 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
6079 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
6080 return 0;
6081
6082 size = 0;
6083 if (!(sym->flags & BSF_SYNTHETIC))
6084 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
6085
6086 if (strcmp (sym->section->name, ".opd") == 0)
9f296da3 6087 {
aef36ac1
AM
6088 if (opd_entry_value (sym->section, sym->value,
6089 &sec, code_off, TRUE) == (bfd_vma) -1)
6090 return 0;
6091 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6092 symbol. This size has nothing to do with the code size of the
6093 function, which is what we're supposed to return, but the
6094 code size isn't available without looking up the dot-sym.
6095 However, doing that would be a waste of time particularly
6096 since elf_find_function will look at the dot-sym anyway.
6097 Now, elf_find_function will keep the largest size of any
6098 function sym found at the code address of interest, so return
6099 1 here to avoid it incorrectly caching a larger function size
6100 for a small function. This does mean we return the wrong
6101 size for a new-ABI function of size 24, but all that does is
6102 disable caching for such functions. */
6103 if (size == 24)
6104 size = 1;
9f296da3 6105 }
aef36ac1
AM
6106 else
6107 {
6108 if (sym->section != sec)
6109 return 0;
6110 *code_off = sym->value;
6111 }
6112 if (size == 0)
6113 size = 1;
6114 return size;
9f296da3
AM
6115}
6116
854b41e7
AM
6117/* Return true if symbol is defined in a regular object file. */
6118
6119static bfd_boolean
6120is_static_defined (struct elf_link_hash_entry *h)
6121{
6122 return ((h->root.type == bfd_link_hash_defined
6123 || h->root.type == bfd_link_hash_defweak)
6124 && h->root.u.def.section != NULL
6125 && h->root.u.def.section->output_section != NULL);
6126}
6127
b31867b6
AM
6128/* If FDH is a function descriptor symbol, return the associated code
6129 entry symbol if it is defined. Return NULL otherwise. */
6130
6131static struct ppc_link_hash_entry *
6132defined_code_entry (struct ppc_link_hash_entry *fdh)
6133{
6134 if (fdh->is_func_descriptor)
6135 {
6136 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6137 if (fh->elf.root.type == bfd_link_hash_defined
6138 || fh->elf.root.type == bfd_link_hash_defweak)
6139 return fh;
6140 }
6141 return NULL;
6142}
6143
6144/* If FH is a function code entry symbol, return the associated
6145 function descriptor symbol if it is defined. Return NULL otherwise. */
6146
6147static struct ppc_link_hash_entry *
6148defined_func_desc (struct ppc_link_hash_entry *fh)
6149{
6150 if (fh->oh != NULL
6151 && fh->oh->is_func_descriptor)
6152 {
6153 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6154 if (fdh->elf.root.type == bfd_link_hash_defined
6155 || fdh->elf.root.type == bfd_link_hash_defweak)
6156 return fdh;
6157 }
6158 return NULL;
6159}
6160
74f0fb50
AM
6161/* Mark all our entry sym sections, both opd and code section. */
6162
6163static void
6164ppc64_elf_gc_keep (struct bfd_link_info *info)
6165{
6166 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6167 struct bfd_sym_chain *sym;
6168
4dfe6ac6
NC
6169 if (htab == NULL)
6170 return;
6171
74f0fb50
AM
6172 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6173 {
b31867b6 6174 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
6175 asection *sec;
6176
6177 eh = (struct ppc_link_hash_entry *)
b31867b6 6178 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
74f0fb50
AM
6179 if (eh == NULL)
6180 continue;
6181 if (eh->elf.root.type != bfd_link_hash_defined
6182 && eh->elf.root.type != bfd_link_hash_defweak)
6183 continue;
6184
b31867b6
AM
6185 fh = defined_code_entry (eh);
6186 if (fh != NULL)
74f0fb50 6187 {
b31867b6 6188 sec = fh->elf.root.u.def.section;
74f0fb50
AM
6189 sec->flags |= SEC_KEEP;
6190 }
6191 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6192 && opd_entry_value (eh->elf.root.u.def.section,
6193 eh->elf.root.u.def.value,
aef36ac1 6194 &sec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50
AM
6195 sec->flags |= SEC_KEEP;
6196
6197 sec = eh->elf.root.u.def.section;
6198 sec->flags |= SEC_KEEP;
6199 }
6200}
6201
64d03ab5
AM
6202/* Mark sections containing dynamically referenced symbols. When
6203 building shared libraries, we must assume that any visible symbol is
6204 referenced. */
6205
6206static bfd_boolean
6207ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6208{
6209 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6210 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
b31867b6 6211 struct ppc_link_hash_entry *fdh;
b407645f 6212 struct bfd_elf_dynamic_list *d = info->dynamic_list;
64d03ab5 6213
64d03ab5 6214 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
6215 fdh = defined_func_desc (eh);
6216 if (fdh != NULL)
6217 eh = fdh;
64d03ab5
AM
6218
6219 if ((eh->elf.root.type == bfd_link_hash_defined
6220 || eh->elf.root.type == bfd_link_hash_defweak)
6221 && (eh->elf.ref_dynamic
b407645f 6222 || (eh->elf.def_regular
64d03ab5 6223 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8 6224 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
b407645f
AM
6225 && (!info->executable
6226 || info->export_dynamic
6227 || (eh->elf.dynamic
6228 && d != NULL
6229 && (*d->match) (&d->head, NULL, eh->elf.root.root.string)))
4c58e0d8
AM
6230 && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
6231 || !bfd_hide_sym_by_version (info->version_info,
6232 eh->elf.root.root.string)))))
64d03ab5
AM
6233 {
6234 asection *code_sec;
b31867b6 6235 struct ppc_link_hash_entry *fh;
64d03ab5
AM
6236
6237 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6238
6239 /* Function descriptor syms cause the associated
6240 function code sym section to be marked. */
b31867b6
AM
6241 fh = defined_code_entry (eh);
6242 if (fh != NULL)
6243 {
6244 code_sec = fh->elf.root.u.def.section;
6245 code_sec->flags |= SEC_KEEP;
6246 }
64d03ab5
AM
6247 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6248 && opd_entry_value (eh->elf.root.u.def.section,
6249 eh->elf.root.u.def.value,
aef36ac1 6250 &code_sec, NULL, FALSE) != (bfd_vma) -1)
64d03ab5
AM
6251 code_sec->flags |= SEC_KEEP;
6252 }
6253
6254 return TRUE;
6255}
6256
5bd4f169
AM
6257/* Return the section that should be marked against GC for a given
6258 relocation. */
6259
6260static asection *
4ce794b7 6261ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 6262 struct bfd_link_info *info,
4ce794b7
AM
6263 Elf_Internal_Rela *rel,
6264 struct elf_link_hash_entry *h,
6265 Elf_Internal_Sym *sym)
5bd4f169 6266{
ccfa59ea
AM
6267 asection *rsec;
6268
ccfa59ea
AM
6269 /* Syms return NULL if we're marking .opd, so we avoid marking all
6270 function sections, as all functions are referenced in .opd. */
6271 rsec = NULL;
6272 if (get_opd_info (sec) != NULL)
6273 return rsec;
1e2f5b6e 6274
5bd4f169
AM
6275 if (h != NULL)
6276 {
04c9666a 6277 enum elf_ppc64_reloc_type r_type;
b31867b6 6278 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 6279
4ce794b7 6280 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 6281 switch (r_type)
5bd4f169
AM
6282 {
6283 case R_PPC64_GNU_VTINHERIT:
6284 case R_PPC64_GNU_VTENTRY:
6285 break;
6286
6287 default:
6288 switch (h->root.type)
6289 {
6290 case bfd_link_hash_defined:
6291 case bfd_link_hash_defweak:
ccfa59ea 6292 eh = (struct ppc_link_hash_entry *) h;
b31867b6
AM
6293 fdh = defined_func_desc (eh);
6294 if (fdh != NULL)
6295 eh = fdh;
1e2f5b6e
AM
6296
6297 /* Function descriptor syms cause the associated
6298 function code sym section to be marked. */
b31867b6
AM
6299 fh = defined_code_entry (eh);
6300 if (fh != NULL)
ccfa59ea
AM
6301 {
6302 /* They also mark their opd section. */
74f0fb50 6303 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 6304
b31867b6 6305 rsec = fh->elf.root.u.def.section;
ccfa59ea 6306 }
8387904d
AM
6307 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6308 && opd_entry_value (eh->elf.root.u.def.section,
6309 eh->elf.root.u.def.value,
aef36ac1 6310 &rsec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50 6311 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 6312 else
1e2f5b6e
AM
6313 rsec = h->root.u.def.section;
6314 break;
5bd4f169
AM
6315
6316 case bfd_link_hash_common:
1e2f5b6e
AM
6317 rsec = h->root.u.c.p->section;
6318 break;
5bd4f169
AM
6319
6320 default:
fb34365b 6321 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
6322 }
6323 }
6324 }
6325 else
6326 {
74f0fb50 6327 struct _opd_sec_data *opd;
1e2f5b6e
AM
6328
6329 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
6330 opd = get_opd_info (rsec);
6331 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 6332 {
74f0fb50 6333 rsec->gc_mark = 1;
ccfa59ea 6334
74f0fb50 6335 rsec = opd->func_sec[(sym->st_value + rel->r_addend) / 8];
ccfa59ea 6336 }
5bd4f169
AM
6337 }
6338
1e2f5b6e 6339 return rsec;
5bd4f169
AM
6340}
6341
65f38f15
AM
6342/* Update the .got, .plt. and dynamic reloc reference counts for the
6343 section being removed. */
5bd4f169 6344
b34976b6 6345static bfd_boolean
4ce794b7
AM
6346ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
6347 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 6348{
411e1bfb 6349 struct ppc_link_hash_table *htab;
5bd4f169
AM
6350 Elf_Internal_Shdr *symtab_hdr;
6351 struct elf_link_hash_entry **sym_hashes;
411e1bfb 6352 struct got_entry **local_got_ents;
5bd4f169 6353 const Elf_Internal_Rela *rel, *relend;
5bd4f169 6354
7dda2462
TG
6355 if (info->relocatable)
6356 return TRUE;
6357
680a3378
AM
6358 if ((sec->flags & SEC_ALLOC) == 0)
6359 return TRUE;
6360
ec338859
AM
6361 elf_section_data (sec)->local_dynrel = NULL;
6362
411e1bfb 6363 htab = ppc_hash_table (info);
4dfe6ac6
NC
6364 if (htab == NULL)
6365 return FALSE;
6366
0ffa91dd 6367 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 6368 sym_hashes = elf_sym_hashes (abfd);
411e1bfb 6369 local_got_ents = elf_local_got_ents (abfd);
5bd4f169
AM
6370
6371 relend = relocs + sec->reloc_count;
6372 for (rel = relocs; rel < relend; rel++)
a33d1f77
AM
6373 {
6374 unsigned long r_symndx;
04c9666a 6375 enum elf_ppc64_reloc_type r_type;
58ac9f71 6376 struct elf_link_hash_entry *h = NULL;
f961d9dd 6377 unsigned char tls_type = 0;
5bd4f169 6378
a33d1f77 6379 r_symndx = ELF64_R_SYM (rel->r_info);
4ce794b7 6380 r_type = ELF64_R_TYPE (rel->r_info);
58ac9f71
AM
6381 if (r_symndx >= symtab_hdr->sh_info)
6382 {
6383 struct ppc_link_hash_entry *eh;
6061a67d
AM
6384 struct elf_dyn_relocs **pp;
6385 struct elf_dyn_relocs *p;
58ac9f71
AM
6386
6387 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 6388 h = elf_follow_link (h);
58ac9f71
AM
6389 eh = (struct ppc_link_hash_entry *) h;
6390
6391 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6392 if (p->sec == sec)
6393 {
6394 /* Everything must go for SEC. */
6395 *pp = p->next;
6396 break;
6397 }
6398 }
6399
e054468f
AM
6400 if (is_branch_reloc (r_type))
6401 {
6402 struct plt_entry **ifunc = NULL;
6403 if (h != NULL)
6404 {
6405 if (h->type == STT_GNU_IFUNC)
6406 ifunc = &h->plt.plist;
6407 }
6408 else if (local_got_ents != NULL)
6409 {
6410 struct plt_entry **local_plt = (struct plt_entry **)
6411 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 6412 unsigned char *local_got_tls_masks = (unsigned char *)
e054468f
AM
6413 (local_plt + symtab_hdr->sh_info);
6414 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
6415 ifunc = local_plt + r_symndx;
6416 }
6417 if (ifunc != NULL)
6418 {
6419 struct plt_entry *ent;
6420
6421 for (ent = *ifunc; ent != NULL; ent = ent->next)
6422 if (ent->addend == rel->r_addend)
6423 break;
6424 if (ent == NULL)
6425 abort ();
6426 if (ent->plt.refcount > 0)
6427 ent->plt.refcount -= 1;
6428 continue;
6429 }
6430 }
6431
a33d1f77
AM
6432 switch (r_type)
6433 {
411e1bfb
AM
6434 case R_PPC64_GOT_TLSLD16:
6435 case R_PPC64_GOT_TLSLD16_LO:
6436 case R_PPC64_GOT_TLSLD16_HI:
6437 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 6438 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
6439 goto dogot;
6440
6441 case R_PPC64_GOT_TLSGD16:
6442 case R_PPC64_GOT_TLSGD16_LO:
6443 case R_PPC64_GOT_TLSGD16_HI:
6444 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 6445 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
6446 goto dogot;
6447
6448 case R_PPC64_GOT_TPREL16_DS:
6449 case R_PPC64_GOT_TPREL16_LO_DS:
6450 case R_PPC64_GOT_TPREL16_HI:
6451 case R_PPC64_GOT_TPREL16_HA:
6452 tls_type = TLS_TLS | TLS_TPREL;
6453 goto dogot;
6454
6455 case R_PPC64_GOT_DTPREL16_DS:
6456 case R_PPC64_GOT_DTPREL16_LO_DS:
6457 case R_PPC64_GOT_DTPREL16_HI:
6458 case R_PPC64_GOT_DTPREL16_HA:
6459 tls_type = TLS_TLS | TLS_DTPREL;
6460 goto dogot;
6461
a33d1f77
AM
6462 case R_PPC64_GOT16:
6463 case R_PPC64_GOT16_DS:
6464 case R_PPC64_GOT16_HA:
6465 case R_PPC64_GOT16_HI:
6466 case R_PPC64_GOT16_LO:
6467 case R_PPC64_GOT16_LO_DS:
411e1bfb
AM
6468 dogot:
6469 {
6470 struct got_entry *ent;
6471
58ac9f71
AM
6472 if (h != NULL)
6473 ent = h->got.glist;
411e1bfb
AM
6474 else
6475 ent = local_got_ents[r_symndx];
6476
6477 for (; ent != NULL; ent = ent->next)
6478 if (ent->addend == rel->r_addend
e717da7e 6479 && ent->owner == abfd
411e1bfb
AM
6480 && ent->tls_type == tls_type)
6481 break;
6482 if (ent == NULL)
6483 abort ();
6484 if (ent->got.refcount > 0)
6485 ent->got.refcount -= 1;
6486 }
a33d1f77 6487 break;
65f38f15 6488
a33d1f77
AM
6489 case R_PPC64_PLT16_HA:
6490 case R_PPC64_PLT16_HI:
6491 case R_PPC64_PLT16_LO:
6492 case R_PPC64_PLT32:
6493 case R_PPC64_PLT64:
721956f4
AM
6494 case R_PPC64_REL14:
6495 case R_PPC64_REL14_BRNTAKEN:
6496 case R_PPC64_REL14_BRTAKEN:
5d1634d7 6497 case R_PPC64_REL24:
58ac9f71 6498 if (h != NULL)
5d1634d7 6499 {
411e1bfb
AM
6500 struct plt_entry *ent;
6501
411e1bfb
AM
6502 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6503 if (ent->addend == rel->r_addend)
6504 break;
7c6c1722 6505 if (ent != NULL && ent->plt.refcount > 0)
411e1bfb 6506 ent->plt.refcount -= 1;
5d1634d7 6507 }
e86ce104 6508 break;
5d1634d7 6509
a33d1f77
AM
6510 default:
6511 break;
6512 }
6513 }
b34976b6 6514 return TRUE;
5bd4f169
AM
6515}
6516
deb0e272
AM
6517/* The maximum size of .sfpr. */
6518#define SFPR_MAX (218*4)
6519
6520struct sfpr_def_parms
6521{
699733f6
AM
6522 const char name[12];
6523 unsigned char lo, hi;
deb0e272
AM
6524 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6525 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6526};
6527
6528/* Auto-generate _save*, _rest* functions in .sfpr. */
6529
4dfe6ac6 6530static bfd_boolean
deb0e272
AM
6531sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
6532{
6533 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6534 unsigned int i;
6535 size_t len = strlen (parm->name);
6536 bfd_boolean writing = FALSE;
699733f6 6537 char sym[16];
deb0e272 6538
4dfe6ac6
NC
6539 if (htab == NULL)
6540 return FALSE;
6541
deb0e272
AM
6542 memcpy (sym, parm->name, len);
6543 sym[len + 2] = 0;
6544
6545 for (i = parm->lo; i <= parm->hi; i++)
6546 {
6547 struct elf_link_hash_entry *h;
6548
6549 sym[len + 0] = i / 10 + '0';
6550 sym[len + 1] = i % 10 + '0';
6551 h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
6552 if (h != NULL
f5385ebf 6553 && !h->def_regular)
deb0e272
AM
6554 {
6555 h->root.type = bfd_link_hash_defined;
6556 h->root.u.def.section = htab->sfpr;
6557 h->root.u.def.value = htab->sfpr->size;
6558 h->type = STT_FUNC;
f5385ebf 6559 h->def_regular = 1;
deb0e272
AM
6560 _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
6561 writing = TRUE;
6562 if (htab->sfpr->contents == NULL)
6563 {
6564 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6565 if (htab->sfpr->contents == NULL)
6566 return FALSE;
6567 }
6568 }
6569 if (writing)
6570 {
6571 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6572 if (i != parm->hi)
6573 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6574 else
6575 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6576 htab->sfpr->size = p - htab->sfpr->contents;
6577 }
6578 }
6579
6580 return TRUE;
6581}
6582
6583static bfd_byte *
6584savegpr0 (bfd *abfd, bfd_byte *p, int r)
6585{
6586 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6587 return p + 4;
6588}
6589
6590static bfd_byte *
6591savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6592{
6593 p = savegpr0 (abfd, p, r);
a078d95a 6594 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6595 p = p + 4;
6596 bfd_put_32 (abfd, BLR, p);
6597 return p + 4;
6598}
6599
6600static bfd_byte *
6601restgpr0 (bfd *abfd, bfd_byte *p, int r)
6602{
6603 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6604 return p + 4;
6605}
6606
6607static bfd_byte *
6608restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6609{
a078d95a 6610 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6611 p = p + 4;
6612 p = restgpr0 (abfd, p, r);
6613 bfd_put_32 (abfd, MTLR_R0, p);
6614 p = p + 4;
6615 if (r == 29)
6616 {
6617 p = restgpr0 (abfd, p, 30);
6618 p = restgpr0 (abfd, p, 31);
6619 }
6620 bfd_put_32 (abfd, BLR, p);
6621 return p + 4;
6622}
6623
6624static bfd_byte *
6625savegpr1 (bfd *abfd, bfd_byte *p, int r)
6626{
6627 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6628 return p + 4;
6629}
6630
6631static bfd_byte *
6632savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6633{
6634 p = savegpr1 (abfd, p, r);
6635 bfd_put_32 (abfd, BLR, p);
6636 return p + 4;
6637}
6638
6639static bfd_byte *
6640restgpr1 (bfd *abfd, bfd_byte *p, int r)
6641{
6642 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6643 return p + 4;
6644}
6645
6646static bfd_byte *
6647restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6648{
6649 p = restgpr1 (abfd, p, r);
6650 bfd_put_32 (abfd, BLR, p);
6651 return p + 4;
6652}
6653
6654static bfd_byte *
6655savefpr (bfd *abfd, bfd_byte *p, int r)
6656{
6657 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6658 return p + 4;
6659}
6660
6661static bfd_byte *
6662savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6663{
6664 p = savefpr (abfd, p, r);
a078d95a 6665 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6666 p = p + 4;
6667 bfd_put_32 (abfd, BLR, p);
6668 return p + 4;
6669}
6670
6671static bfd_byte *
6672restfpr (bfd *abfd, bfd_byte *p, int r)
6673{
6674 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6675 return p + 4;
6676}
6677
6678static bfd_byte *
6679restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6680{
a078d95a 6681 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6682 p = p + 4;
6683 p = restfpr (abfd, p, r);
6684 bfd_put_32 (abfd, MTLR_R0, p);
6685 p = p + 4;
6686 if (r == 29)
6687 {
6688 p = restfpr (abfd, p, 30);
6689 p = restfpr (abfd, p, 31);
6690 }
6691 bfd_put_32 (abfd, BLR, p);
6692 return p + 4;
6693}
6694
6695static bfd_byte *
6696savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6697{
6698 p = savefpr (abfd, p, r);
6699 bfd_put_32 (abfd, BLR, p);
6700 return p + 4;
6701}
6702
6703static bfd_byte *
6704restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6705{
6706 p = restfpr (abfd, p, r);
6707 bfd_put_32 (abfd, BLR, p);
6708 return p + 4;
6709}
6710
6711static bfd_byte *
6712savevr (bfd *abfd, bfd_byte *p, int r)
6713{
6714 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6715 p = p + 4;
6716 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6717 return p + 4;
6718}
6719
6720static bfd_byte *
6721savevr_tail (bfd *abfd, bfd_byte *p, int r)
6722{
6723 p = savevr (abfd, p, r);
6724 bfd_put_32 (abfd, BLR, p);
6725 return p + 4;
6726}
6727
6728static bfd_byte *
6729restvr (bfd *abfd, bfd_byte *p, int r)
6730{
6731 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6732 p = p + 4;
6733 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6734 return p + 4;
6735}
6736
6737static bfd_byte *
6738restvr_tail (bfd *abfd, bfd_byte *p, int r)
6739{
6740 p = restvr (abfd, p, r);
6741 bfd_put_32 (abfd, BLR, p);
6742 return p + 4;
6743}
6744
e86ce104
AM
6745/* Called via elf_link_hash_traverse to transfer dynamic linking
6746 information on function code symbol entries to their corresponding
6747 function descriptor symbol entries. */
deb0e272 6748
b34976b6 6749static bfd_boolean
4ce794b7 6750func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6751{
e86ce104 6752 struct bfd_link_info *info;
65f38f15 6753 struct ppc_link_hash_table *htab;
411e1bfb 6754 struct plt_entry *ent;
50bc7936
AM
6755 struct ppc_link_hash_entry *fh;
6756 struct ppc_link_hash_entry *fdh;
6757 bfd_boolean force_local;
5bd4f169 6758
50bc7936
AM
6759 fh = (struct ppc_link_hash_entry *) h;
6760 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 6761 return TRUE;
e86ce104 6762
4ce794b7 6763 info = inf;
65f38f15 6764 htab = ppc_hash_table (info);
4dfe6ac6
NC
6765 if (htab == NULL)
6766 return FALSE;
5bd4f169 6767
c09bdfe5
AM
6768 /* Resolve undefined references to dot-symbols as the value
6769 in the function descriptor, if we have one in a regular object.
6770 This is to satisfy cases like ".quad .foo". Calls to functions
6771 in dynamic objects are handled elsewhere. */
6772 if (fh->elf.root.type == bfd_link_hash_undefweak
6773 && fh->was_undefined
b31867b6
AM
6774 && (fdh = defined_func_desc (fh)) != NULL
6775 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6776 && opd_entry_value (fdh->elf.root.u.def.section,
6777 fdh->elf.root.u.def.value,
c09bdfe5 6778 &fh->elf.root.u.def.section,
aef36ac1 6779 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
c09bdfe5 6780 {
b31867b6 6781 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 6782 fh->elf.forced_local = 1;
b31867b6
AM
6783 fh->elf.def_regular = fdh->elf.def_regular;
6784 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
6785 }
6786
e86ce104
AM
6787 /* If this is a function code symbol, transfer dynamic linking
6788 information to the function descriptor symbol. */
50bc7936 6789 if (!fh->is_func)
b34976b6 6790 return TRUE;
e86ce104 6791
50bc7936 6792 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
411e1bfb
AM
6793 if (ent->plt.refcount > 0)
6794 break;
50bc7936
AM
6795 if (ent == NULL
6796 || fh->elf.root.root.string[0] != '.'
6797 || fh->elf.root.root.string[1] == '\0')
6798 return TRUE;
5bd4f169 6799
50bc7936
AM
6800 /* Find the corresponding function descriptor symbol. Create it
6801 as undefined if necessary. */
5bd4f169 6802
b31867b6 6803 fdh = lookup_fdh (fh, htab);
50bc7936 6804 if (fdh == NULL
df131623 6805 && !info->executable
50bc7936
AM
6806 && (fh->elf.root.type == bfd_link_hash_undefined
6807 || fh->elf.root.type == bfd_link_hash_undefweak))
6808 {
908b32fc 6809 fdh = make_fdh (info, fh);
bb700d78
AM
6810 if (fdh == NULL)
6811 return FALSE;
50bc7936 6812 }
648cca2c 6813
908b32fc 6814 /* Fake function descriptors are made undefweak. If the function
433817dd
AM
6815 code symbol is strong undefined, make the fake sym the same.
6816 If the function code symbol is defined, then force the fake
6817 descriptor local; We can't support overriding of symbols in a
6818 shared library on a fake descriptor. */
908b32fc
AM
6819
6820 if (fdh != NULL
6821 && fdh->fake
433817dd 6822 && fdh->elf.root.type == bfd_link_hash_undefweak)
908b32fc 6823 {
433817dd
AM
6824 if (fh->elf.root.type == bfd_link_hash_undefined)
6825 {
6826 fdh->elf.root.type = bfd_link_hash_undefined;
6827 bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
6828 }
6829 else if (fh->elf.root.type == bfd_link_hash_defined
6830 || fh->elf.root.type == bfd_link_hash_defweak)
6831 {
6832 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
6833 }
908b32fc
AM
6834 }
6835
50bc7936 6836 if (fdh != NULL
f5385ebf 6837 && !fdh->elf.forced_local
df131623 6838 && (!info->executable
f5385ebf
AM
6839 || fdh->elf.def_dynamic
6840 || fdh->elf.ref_dynamic
50bc7936
AM
6841 || (fdh->elf.root.type == bfd_link_hash_undefweak
6842 && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
6843 {
6844 if (fdh->elf.dynindx == -1)
c152c796 6845 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
50bc7936 6846 return FALSE;
f5385ebf
AM
6847 fdh->elf.ref_regular |= fh->elf.ref_regular;
6848 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6849 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6850 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
50bc7936 6851 if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
e86ce104 6852 {
40d16e0b 6853 move_plt_plist (fh, fdh);
f5385ebf 6854 fdh->elf.needs_plt = 1;
e86ce104 6855 }
50bc7936 6856 fdh->is_func_descriptor = 1;
34814b9f
AM
6857 fdh->oh = fh;
6858 fh->oh = fdh;
e86ce104
AM
6859 }
6860
50bc7936
AM
6861 /* Now that the info is on the function descriptor, clear the
6862 function code sym info. Any function code syms for which we
6863 don't have a definition in a regular file, we force local.
6864 This prevents a shared library from exporting syms that have
6865 been imported from another library. Function code syms that
6866 are really in the library we must leave global to prevent the
6867 linker dragging in a definition from a static library. */
93f3fa99
AM
6868 force_local = (!fh->elf.def_regular
6869 || fdh == NULL
6870 || !fdh->elf.def_regular
6871 || fdh->elf.forced_local);
50bc7936
AM
6872 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6873
b34976b6 6874 return TRUE;
e86ce104 6875}
40b8271b 6876
e86ce104 6877/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
6878 this hook to a) provide some gcc support functions, and b) transfer
6879 dynamic linking information gathered so far on function code symbol
6880 entries, to their corresponding function descriptor symbol entries. */
deb0e272 6881
b34976b6 6882static bfd_boolean
4ce794b7
AM
6883ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6884 struct bfd_link_info *info)
e86ce104
AM
6885{
6886 struct ppc_link_hash_table *htab;
82bd7b59 6887 unsigned int i;
27fc25a1 6888 static const struct sfpr_def_parms funcs[] =
deb0e272
AM
6889 {
6890 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6891 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6892 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6893 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6894 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6895 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6896 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6897 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6898 { "._savef", 14, 31, savefpr, savefpr1_tail },
6899 { "._restf", 14, 31, restfpr, restfpr1_tail },
6900 { "_savevr_", 20, 31, savevr, savevr_tail },
6901 { "_restvr_", 20, 31, restvr, restvr_tail }
6902 };
e86ce104
AM
6903
6904 htab = ppc_hash_table (info);
4dfe6ac6
NC
6905 if (htab == NULL)
6906 return FALSE;
6907
5295321c
AM
6908 if (!info->relocatable
6909 && htab->elf.hgot != NULL)
dba6fa9b
AM
6910 {
6911 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
6912 /* Make .TOC. defined so as to prevent it being made dynamic.
6913 The wrong value here is fixed later in ppc64_elf_set_toc. */
6914 htab->elf.hgot->type = STT_OBJECT;
6915 htab->elf.hgot->root.type = bfd_link_hash_defined;
6916 htab->elf.hgot->root.u.def.value = 0;
6917 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
6918 htab->elf.hgot->def_regular = 1;
6919 htab->elf.hgot->other = ((htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1))
6920 | STV_HIDDEN);
6921 }
c66bb0ee 6922
82bd7b59
AM
6923 if (htab->sfpr == NULL)
6924 /* We don't have any relocs. */
b34976b6 6925 return TRUE;
82bd7b59 6926
deb0e272
AM
6927 /* Provide any missing _save* and _rest* functions. */
6928 htab->sfpr->size = 0;
7d4c687d 6929 if (htab->params->save_restore_funcs)
27fc25a1
AM
6930 for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
6931 if (!sfpr_define (info, &funcs[i]))
6932 return FALSE;
82bd7b59 6933
4ce794b7 6934 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
805fc799 6935
eea6121a 6936 if (htab->sfpr->size == 0)
8423293d 6937 htab->sfpr->flags |= SEC_EXCLUDE;
82bd7b59 6938
b34976b6 6939 return TRUE;
e86ce104
AM
6940}
6941
a345bc8d
AM
6942/* Return true if we have dynamic relocs that apply to read-only sections. */
6943
6944static bfd_boolean
6945readonly_dynrelocs (struct elf_link_hash_entry *h)
6946{
6947 struct ppc_link_hash_entry *eh;
6948 struct elf_dyn_relocs *p;
6949
6950 eh = (struct ppc_link_hash_entry *) h;
6951 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6952 {
6953 asection *s = p->sec->output_section;
6954
6955 if (s != NULL && (s->flags & SEC_READONLY) != 0)
6956 return TRUE;
6957 }
6958 return FALSE;
6959}
6960
e86ce104
AM
6961/* Adjust a symbol defined by a dynamic object and referenced by a
6962 regular object. The current definition is in some section of the
6963 dynamic object, but we're not including those sections. We have to
6964 change the definition to something the rest of the link can
6965 understand. */
6966
b34976b6 6967static bfd_boolean
4ce794b7
AM
6968ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6969 struct elf_link_hash_entry *h)
e86ce104
AM
6970{
6971 struct ppc_link_hash_table *htab;
e86ce104 6972 asection *s;
e86ce104
AM
6973
6974 htab = ppc_hash_table (info);
4dfe6ac6
NC
6975 if (htab == NULL)
6976 return FALSE;
e86ce104
AM
6977
6978 /* Deal with function syms. */
6979 if (h->type == STT_FUNC
e054468f 6980 || h->type == STT_GNU_IFUNC
f5385ebf 6981 || h->needs_plt)
e86ce104
AM
6982 {
6983 /* Clear procedure linkage table information for any symbol that
6984 won't need a .plt entry. */
411e1bfb
AM
6985 struct plt_entry *ent;
6986 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6987 if (ent->plt.refcount > 0)
6988 break;
8387904d 6989 if (ent == NULL
e054468f
AM
6990 || (h->type != STT_GNU_IFUNC
6991 && (SYMBOL_CALLS_LOCAL (info, h)
6992 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6993 && h->root.type == bfd_link_hash_undefweak))))
40b8271b 6994 {
411e1bfb 6995 h->plt.plist = NULL;
f5385ebf 6996 h->needs_plt = 0;
40b8271b 6997 }
a345bc8d
AM
6998 else if (abiversion (info->output_bfd) == 2)
6999 {
7000 /* After adjust_dynamic_symbol, non_got_ref set in the
7001 non-shared case means that we have allocated space in
7002 .dynbss for the symbol and thus dyn_relocs for this
7003 symbol should be discarded.
7004 If we get here we know we are making a PLT entry for this
7005 symbol, and in an executable we'd normally resolve
7006 relocations against this symbol to the PLT entry. Allow
7007 dynamic relocs if the reference is weak, and the dynamic
7008 relocs will not cause text relocation. */
7009 if (!h->ref_regular_nonweak
7010 && h->non_got_ref
7011 && h->type != STT_GNU_IFUNC
7012 && !readonly_dynrelocs (h))
7013 h->non_got_ref = 0;
7014
7015 /* If making a plt entry, then we don't need copy relocs. */
7016 return TRUE;
7017 }
5bd4f169 7018 }
bbd7ec4a 7019 else
411e1bfb 7020 h->plt.plist = NULL;
5bd4f169
AM
7021
7022 /* If this is a weak symbol, and there is a real definition, the
7023 processor independent code will have arranged for us to see the
7024 real definition first, and we can just use the same value. */
f6e332e6 7025 if (h->u.weakdef != NULL)
5bd4f169 7026 {
f6e332e6
AM
7027 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7028 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7029 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7030 h->root.u.def.value = h->u.weakdef->root.u.def.value;
a23b6845 7031 if (ELIMINATE_COPY_RELOCS)
f6e332e6 7032 h->non_got_ref = h->u.weakdef->non_got_ref;
b34976b6 7033 return TRUE;
5bd4f169
AM
7034 }
7035
5bd4f169
AM
7036 /* If we are creating a shared library, we must presume that the
7037 only references to the symbol are via the global offset table.
7038 For such cases we need not do anything here; the relocations will
7039 be handled correctly by relocate_section. */
7040 if (info->shared)
b34976b6 7041 return TRUE;
5bd4f169 7042
65f38f15
AM
7043 /* If there are no references to this symbol that do not use the
7044 GOT, we don't need to generate a copy reloc. */
f5385ebf 7045 if (!h->non_got_ref)
b34976b6 7046 return TRUE;
65f38f15 7047
b186458a
JJ
7048 /* Don't generate a copy reloc for symbols defined in the executable. */
7049 if (!h->def_dynamic || !h->ref_regular || h->def_regular)
7050 return TRUE;
7051
a345bc8d
AM
7052 /* If we didn't find any dynamic relocs in read-only sections, then
7053 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
7054 if (ELIMINATE_COPY_RELOCS && !readonly_dynrelocs (h))
65f38f15 7055 {
a345bc8d
AM
7056 h->non_got_ref = 0;
7057 return TRUE;
65f38f15
AM
7058 }
7059
5d35169e 7060 if (h->plt.plist != NULL)
97b639ba
AM
7061 {
7062 /* We should never get here, but unfortunately there are versions
7063 of gcc out there that improperly (for this ABI) put initialized
7064 function pointers, vtable refs and suchlike in read-only
7065 sections. Allow them to proceed, but warn that this might
7066 break at runtime. */
25f53a85 7067 info->callbacks->einfo
bc30df16 7068 (_("%P: copy reloc against `%T' requires lazy plt linking; "
25f53a85 7069 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
7070 h->root.root.string);
7071 }
5d35169e
AM
7072
7073 /* This is a reference to a symbol defined by a dynamic object which
7074 is not a function. */
7075
5bd4f169
AM
7076 /* We must allocate the symbol in our .dynbss section, which will
7077 become part of the .bss section of the executable. There will be
7078 an entry for this symbol in the .dynsym section. The dynamic
7079 object will contain position independent code, so all references
7080 from the dynamic object to this symbol will go through the global
7081 offset table. The dynamic linker will use the .dynsym entry to
7082 determine the address it must put in the global offset table, so
7083 both the dynamic object and the regular object will refer to the
7084 same memory location for the variable. */
5bd4f169 7085
04c9666a
AM
7086 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
7087 to copy the initial value out of the dynamic object and into the
5bd4f169
AM
7088 runtime process image. We need to remember the offset into the
7089 .rela.bss section we are going to use. */
1d7e9d18 7090 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 7091 {
eea6121a 7092 htab->relbss->size += sizeof (Elf64_External_Rela);
f5385ebf 7093 h->needs_copy = 1;
5bd4f169
AM
7094 }
7095
4ce794b7 7096 s = htab->dynbss;
5bd4f169 7097
027297b7 7098 return _bfd_elf_adjust_dynamic_copy (h, s);
5bd4f169
AM
7099}
7100
e86ce104
AM
7101/* If given a function descriptor symbol, hide both the function code
7102 sym and the descriptor. */
7103static void
4ce794b7
AM
7104ppc64_elf_hide_symbol (struct bfd_link_info *info,
7105 struct elf_link_hash_entry *h,
7106 bfd_boolean force_local)
e86ce104 7107{
34814b9f 7108 struct ppc_link_hash_entry *eh;
e86ce104
AM
7109 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
7110
34814b9f
AM
7111 eh = (struct ppc_link_hash_entry *) h;
7112 if (eh->is_func_descriptor)
e86ce104 7113 {
34814b9f 7114 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 7115
721956f4 7116 if (fh == NULL)
d1329ca3
AM
7117 {
7118 const char *p, *q;
7119 struct ppc_link_hash_table *htab;
7120 char save;
7121
7122 /* We aren't supposed to use alloca in BFD because on
7123 systems which do not have alloca the version in libiberty
7124 calls xmalloc, which might cause the program to crash
7125 when it runs out of memory. This function doesn't have a
7126 return status, so there's no way to gracefully return an
7127 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
7128 accessed; It's either a string in an ELF string table,
7129 or allocated in an objalloc structure. */
d1329ca3 7130
34814b9f 7131 p = eh->elf.root.root.string - 1;
d1329ca3
AM
7132 save = *p;
7133 *(char *) p = '.';
7134 htab = ppc_hash_table (info);
4dfe6ac6
NC
7135 if (htab == NULL)
7136 return;
7137
34814b9f
AM
7138 fh = (struct ppc_link_hash_entry *)
7139 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
d1329ca3
AM
7140 *(char *) p = save;
7141
7142 /* Unfortunately, if it so happens that the string we were
7143 looking for was allocated immediately before this string,
7144 then we overwrote the string terminator. That's the only
7145 reason the lookup should fail. */
7146 if (fh == NULL)
7147 {
34814b9f
AM
7148 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
7149 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 7150 --q, --p;
34814b9f
AM
7151 if (q < eh->elf.root.root.string && *p == '.')
7152 fh = (struct ppc_link_hash_entry *)
7153 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
d1329ca3
AM
7154 }
7155 if (fh != NULL)
7156 {
34814b9f
AM
7157 eh->oh = fh;
7158 fh->oh = eh;
d1329ca3
AM
7159 }
7160 }
e86ce104 7161 if (fh != NULL)
34814b9f 7162 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
7163 }
7164}
7165
411e1bfb 7166static bfd_boolean
8843416a
AM
7167get_sym_h (struct elf_link_hash_entry **hp,
7168 Elf_Internal_Sym **symp,
7169 asection **symsecp,
f961d9dd 7170 unsigned char **tls_maskp,
8843416a
AM
7171 Elf_Internal_Sym **locsymsp,
7172 unsigned long r_symndx,
7173 bfd *ibfd)
411e1bfb 7174{
0ffa91dd 7175 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
7176
7177 if (r_symndx >= symtab_hdr->sh_info)
7178 {
7179 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7180 struct elf_link_hash_entry *h;
7181
7182 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7183 h = elf_follow_link (h);
411e1bfb
AM
7184
7185 if (hp != NULL)
7186 *hp = h;
7187
7188 if (symp != NULL)
7189 *symp = NULL;
7190
7191 if (symsecp != NULL)
7192 {
7193 asection *symsec = NULL;
7194 if (h->root.type == bfd_link_hash_defined
7195 || h->root.type == bfd_link_hash_defweak)
7196 symsec = h->root.u.def.section;
7197 *symsecp = symsec;
7198 }
7199
e7b938ca 7200 if (tls_maskp != NULL)
411e1bfb
AM
7201 {
7202 struct ppc_link_hash_entry *eh;
7203
7204 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 7205 *tls_maskp = &eh->tls_mask;
411e1bfb
AM
7206 }
7207 }
7208 else
7209 {
7210 Elf_Internal_Sym *sym;
7211 Elf_Internal_Sym *locsyms = *locsymsp;
7212
7213 if (locsyms == NULL)
7214 {
7215 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7216 if (locsyms == NULL)
7217 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7218 symtab_hdr->sh_info,
7219 0, NULL, NULL, NULL);
7220 if (locsyms == NULL)
7221 return FALSE;
7222 *locsymsp = locsyms;
7223 }
7224 sym = locsyms + r_symndx;
7225
7226 if (hp != NULL)
7227 *hp = NULL;
7228
7229 if (symp != NULL)
7230 *symp = sym;
7231
7232 if (symsecp != NULL)
cb33740c 7233 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 7234
e7b938ca 7235 if (tls_maskp != NULL)
411e1bfb
AM
7236 {
7237 struct got_entry **lgot_ents;
f961d9dd 7238 unsigned char *tls_mask;
411e1bfb 7239
e7b938ca 7240 tls_mask = NULL;
411e1bfb
AM
7241 lgot_ents = elf_local_got_ents (ibfd);
7242 if (lgot_ents != NULL)
7243 {
e054468f
AM
7244 struct plt_entry **local_plt = (struct plt_entry **)
7245 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 7246 unsigned char *lgot_masks = (unsigned char *)
e054468f 7247 (local_plt + symtab_hdr->sh_info);
e7b938ca 7248 tls_mask = &lgot_masks[r_symndx];
411e1bfb 7249 }
e7b938ca 7250 *tls_maskp = tls_mask;
411e1bfb
AM
7251 }
7252 }
7253 return TRUE;
7254}
7255
e7b938ca 7256/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 7257 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 7258 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
7259
7260static int
f961d9dd 7261get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
7262 unsigned long *toc_symndx,
7263 bfd_vma *toc_addend,
0d4792f7 7264 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
7265 const Elf_Internal_Rela *rel,
7266 bfd *ibfd)
411e1bfb
AM
7267{
7268 unsigned long r_symndx;
0d4792f7 7269 int next_r;
411e1bfb
AM
7270 struct elf_link_hash_entry *h;
7271 Elf_Internal_Sym *sym;
7272 asection *sec;
7273 bfd_vma off;
7274
7275 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 7276 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 7277 return 0;
411e1bfb 7278
e7b938ca 7279 if ((*tls_maskp != NULL && **tls_maskp != 0)
411e1bfb 7280 || sec == NULL
6bee8834 7281 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 7282 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 7283 return 1;
411e1bfb
AM
7284
7285 /* Look inside a TOC section too. */
7286 if (h != NULL)
7287 {
7288 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7289 off = h->root.u.def.value;
7290 }
7291 else
7292 off = sym->st_value;
7293 off += rel->r_addend;
7294 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
7295 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7296 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
7297 if (toc_symndx != NULL)
7298 *toc_symndx = r_symndx;
3a71aa26
AM
7299 if (toc_addend != NULL)
7300 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7301 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7302 return 0;
854b41e7 7303 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
7304 && (next_r == -1 || next_r == -2))
7305 return 1 - next_r;
951fd09b 7306 return 1;
411e1bfb
AM
7307}
7308
3b421ab3
AM
7309/* Find (or create) an entry in the tocsave hash table. */
7310
7311static struct tocsave_entry *
7312tocsave_find (struct ppc_link_hash_table *htab,
7313 enum insert_option insert,
7314 Elf_Internal_Sym **local_syms,
7315 const Elf_Internal_Rela *irela,
7316 bfd *ibfd)
7317{
7318 unsigned long r_indx;
7319 struct elf_link_hash_entry *h;
7320 Elf_Internal_Sym *sym;
7321 struct tocsave_entry ent, *p;
7322 hashval_t hash;
7323 struct tocsave_entry **slot;
7324
7325 r_indx = ELF64_R_SYM (irela->r_info);
7326 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7327 return NULL;
7328 if (ent.sec == NULL || ent.sec->output_section == NULL)
7329 {
7330 (*_bfd_error_handler)
7331 (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
7332 return NULL;
7333 }
7334
7335 if (h != NULL)
7336 ent.offset = h->root.u.def.value;
7337 else
7338 ent.offset = sym->st_value;
7339 ent.offset += irela->r_addend;
7340
7341 hash = tocsave_htab_hash (&ent);
7342 slot = ((struct tocsave_entry **)
7343 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7344 if (slot == NULL)
7345 return NULL;
7346
7347 if (*slot == NULL)
7348 {
7349 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7350 if (p == NULL)
7351 return NULL;
7352 *p = ent;
7353 *slot = p;
7354 }
7355 return *slot;
7356}
7357
754021d0 7358/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 7359 code for the old ABI, these will already have been done. */
754021d0
AM
7360
7361static bfd_boolean
7362adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7363{
7364 struct ppc_link_hash_entry *eh;
7365 asection *sym_sec;
74f0fb50 7366 struct _opd_sec_data *opd;
754021d0
AM
7367
7368 if (h->root.type == bfd_link_hash_indirect)
7369 return TRUE;
7370
754021d0
AM
7371 if (h->root.type != bfd_link_hash_defined
7372 && h->root.type != bfd_link_hash_defweak)
7373 return TRUE;
7374
7375 eh = (struct ppc_link_hash_entry *) h;
7376 if (eh->adjust_done)
7377 return TRUE;
7378
7379 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
7380 opd = get_opd_info (sym_sec);
7381 if (opd != NULL && opd->adjust != NULL)
754021d0 7382 {
74f0fb50 7383 long adjust = opd->adjust[eh->elf.root.u.def.value / 8];
4025353c
AM
7384 if (adjust == -1)
7385 {
7386 /* This entry has been deleted. */
b3fac117 7387 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
7388 if (dsec == NULL)
7389 {
7390 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 7391 if (discarded_section (dsec))
81688140 7392 {
b3fac117 7393 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
7394 break;
7395 }
7396 }
4025353c 7397 eh->elf.root.u.def.value = 0;
81688140 7398 eh->elf.root.u.def.section = dsec;
4025353c
AM
7399 }
7400 else
7401 eh->elf.root.u.def.value += adjust;
754021d0
AM
7402 eh->adjust_done = 1;
7403 }
7404 return TRUE;
7405}
7406
8c1d1bb8 7407/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 7408 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
7409 have already been determined. */
7410
7411static bfd_boolean
7412dec_dynrel_count (bfd_vma r_info,
7413 asection *sec,
7414 struct bfd_link_info *info,
7415 Elf_Internal_Sym **local_syms,
7416 struct elf_link_hash_entry *h,
19e08130 7417 Elf_Internal_Sym *sym)
8c1d1bb8
AM
7418{
7419 enum elf_ppc64_reloc_type r_type;
19e08130 7420 asection *sym_sec = NULL;
8c1d1bb8
AM
7421
7422 /* Can this reloc be dynamic? This switch, and later tests here
7423 should be kept in sync with the code in check_relocs. */
7424 r_type = ELF64_R_TYPE (r_info);
7425 switch (r_type)
7426 {
7427 default:
7428 return TRUE;
7429
7430 case R_PPC64_TPREL16:
7431 case R_PPC64_TPREL16_LO:
7432 case R_PPC64_TPREL16_HI:
7433 case R_PPC64_TPREL16_HA:
7434 case R_PPC64_TPREL16_DS:
7435 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
7436 case R_PPC64_TPREL16_HIGH:
7437 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
7438 case R_PPC64_TPREL16_HIGHER:
7439 case R_PPC64_TPREL16_HIGHERA:
7440 case R_PPC64_TPREL16_HIGHEST:
7441 case R_PPC64_TPREL16_HIGHESTA:
7442 if (!info->shared)
7443 return TRUE;
7444
7445 case R_PPC64_TPREL64:
7446 case R_PPC64_DTPMOD64:
7447 case R_PPC64_DTPREL64:
7448 case R_PPC64_ADDR64:
7449 case R_PPC64_REL30:
7450 case R_PPC64_REL32:
7451 case R_PPC64_REL64:
7452 case R_PPC64_ADDR14:
7453 case R_PPC64_ADDR14_BRNTAKEN:
7454 case R_PPC64_ADDR14_BRTAKEN:
7455 case R_PPC64_ADDR16:
7456 case R_PPC64_ADDR16_DS:
7457 case R_PPC64_ADDR16_HA:
7458 case R_PPC64_ADDR16_HI:
f9c6b907
AM
7459 case R_PPC64_ADDR16_HIGH:
7460 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
7461 case R_PPC64_ADDR16_HIGHER:
7462 case R_PPC64_ADDR16_HIGHERA:
7463 case R_PPC64_ADDR16_HIGHEST:
7464 case R_PPC64_ADDR16_HIGHESTA:
7465 case R_PPC64_ADDR16_LO:
7466 case R_PPC64_ADDR16_LO_DS:
7467 case R_PPC64_ADDR24:
7468 case R_PPC64_ADDR32:
7469 case R_PPC64_UADDR16:
7470 case R_PPC64_UADDR32:
7471 case R_PPC64_UADDR64:
7472 case R_PPC64_TOC:
7473 break;
7474 }
7475
7476 if (local_syms != NULL)
7477 {
7478 unsigned long r_symndx;
8c1d1bb8
AM
7479 bfd *ibfd = sec->owner;
7480
7481 r_symndx = ELF64_R_SYM (r_info);
7482 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7483 return FALSE;
7484 }
7485
7486 if ((info->shared
1d483afe 7487 && (must_be_dyn_reloc (info, r_type)
8c1d1bb8 7488 || (h != NULL
198f1157 7489 && (!SYMBOLIC_BIND (info, h)
8c1d1bb8
AM
7490 || h->root.type == bfd_link_hash_defweak
7491 || !h->def_regular))))
7492 || (ELIMINATE_COPY_RELOCS
7493 && !info->shared
7494 && h != NULL
7495 && (h->root.type == bfd_link_hash_defweak
7496 || !h->def_regular)))
7497 ;
7498 else
7499 return TRUE;
7500
7501 if (h != NULL)
6edfbbad 7502 {
19e08130
AM
7503 struct elf_dyn_relocs *p;
7504 struct elf_dyn_relocs **pp;
7505 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7506
7507 /* elf_gc_sweep may have already removed all dyn relocs associated
7508 with local syms for a given section. Also, symbol flags are
7509 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7510 report a dynreloc miscount. */
7511 if (*pp == NULL && info->gc_sections)
7512 return TRUE;
7513
7514 while ((p = *pp) != NULL)
60124e18 7515 {
19e08130
AM
7516 if (p->sec == sec)
7517 {
7518 if (!must_be_dyn_reloc (info, r_type))
7519 p->pc_count -= 1;
7520 p->count -= 1;
7521 if (p->count == 0)
7522 *pp = p->next;
7523 return TRUE;
7524 }
7525 pp = &p->next;
60124e18 7526 }
6edfbbad 7527 }
19e08130
AM
7528 else
7529 {
7530 struct ppc_dyn_relocs *p;
7531 struct ppc_dyn_relocs **pp;
7532 void *vpp;
7533 bfd_boolean is_ifunc;
8c1d1bb8 7534
19e08130
AM
7535 if (local_syms == NULL)
7536 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7537 if (sym_sec == NULL)
7538 sym_sec = sec;
c57da1a7 7539
19e08130
AM
7540 vpp = &elf_section_data (sym_sec)->local_dynrel;
7541 pp = (struct ppc_dyn_relocs **) vpp;
7542
7543 if (*pp == NULL && info->gc_sections)
7544 return TRUE;
7545
7546 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7547 while ((p = *pp) != NULL)
8c1d1bb8 7548 {
19e08130
AM
7549 if (p->sec == sec && p->ifunc == is_ifunc)
7550 {
7551 p->count -= 1;
7552 if (p->count == 0)
7553 *pp = p->next;
7554 return TRUE;
7555 }
7556 pp = &p->next;
8c1d1bb8 7557 }
8c1d1bb8
AM
7558 }
7559
8de848d8 7560 info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
25f53a85 7561 sec->owner, sec);
8c1d1bb8
AM
7562 bfd_set_error (bfd_error_bad_value);
7563 return FALSE;
7564}
7565
754021d0
AM
7566/* Remove unused Official Procedure Descriptor entries. Currently we
7567 only remove those associated with functions in discarded link-once
7568 sections, or weakly defined functions that have been overridden. It
7569 would be possible to remove many more entries for statically linked
7570 applications. */
7571
b34976b6 7572bfd_boolean
e7d1c40c 7573ppc64_elf_edit_opd (struct bfd_link_info *info)
1e2f5b6e
AM
7574{
7575 bfd *ibfd;
754021d0 7576 bfd_boolean some_edited = FALSE;
3f764659 7577 asection *need_pad = NULL;
e7d1c40c
AM
7578 struct ppc_link_hash_table *htab;
7579
7580 htab = ppc_hash_table (info);
7581 if (htab == NULL)
7582 return FALSE;
1e2f5b6e 7583
c72f2fb2 7584 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1e2f5b6e
AM
7585 {
7586 asection *sec;
7587 Elf_Internal_Rela *relstart, *rel, *relend;
7588 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7589 Elf_Internal_Sym *local_syms;
1e2f5b6e 7590 bfd_vma offset;
74f0fb50 7591 struct _opd_sec_data *opd;
3f764659
JJ
7592 bfd_boolean need_edit, add_aux_fields;
7593 bfd_size_type cnt_16b = 0;
1e2f5b6e 7594
854b41e7
AM
7595 if (!is_ppc64_elf (ibfd))
7596 continue;
7597
1e2f5b6e 7598 sec = bfd_get_section_by_name (ibfd, ".opd");
46de2a7c 7599 if (sec == NULL || sec->size == 0)
1e2f5b6e
AM
7600 continue;
7601
dbaa2011 7602 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7603 continue;
7604
1e2f5b6e
AM
7605 if (sec->output_section == bfd_abs_section_ptr)
7606 continue;
7607
7608 /* Look through the section relocs. */
7609 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7610 continue;
7611
6cdc0ccc 7612 local_syms = NULL;
0ffa91dd 7613 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7614
7615 /* Read the relocations. */
4ce794b7 7616 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7617 info->keep_memory);
1e2f5b6e 7618 if (relstart == NULL)
b34976b6 7619 return FALSE;
1e2f5b6e
AM
7620
7621 /* First run through the relocs to check they are sane, and to
7622 determine whether we need to edit this opd section. */
b34976b6 7623 need_edit = FALSE;
3f764659 7624 need_pad = sec;
1e2f5b6e
AM
7625 offset = 0;
7626 relend = relstart + sec->reloc_count;
50bc7936 7627 for (rel = relstart; rel < relend; )
1e2f5b6e 7628 {
04c9666a 7629 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7630 unsigned long r_symndx;
7631 asection *sym_sec;
7632 struct elf_link_hash_entry *h;
7633 Elf_Internal_Sym *sym;
7634
3f764659 7635 /* .opd contains a regular array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7636 only interested in the reloc pointing to a function entry
7637 point. */
50bc7936
AM
7638 if (rel->r_offset != offset
7639 || rel + 1 >= relend
7640 || (rel + 1)->r_offset != offset + 8)
1e2f5b6e
AM
7641 {
7642 /* If someone messes with .opd alignment then after a
7643 "ld -r" we might have padding in the middle of .opd.
7644 Also, there's nothing to prevent someone putting
7645 something silly in .opd with the assembler. No .opd
b34976b6 7646 optimization for them! */
3f764659 7647 broken_opd:
1e2f5b6e 7648 (*_bfd_error_handler)
d003868e 7649 (_("%B: .opd is not a regular array of opd entries"), ibfd);
b34976b6 7650 need_edit = FALSE;
1e2f5b6e
AM
7651 break;
7652 }
7653
50bc7936
AM
7654 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7655 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7656 {
7657 (*_bfd_error_handler)
d003868e
AM
7658 (_("%B: unexpected reloc type %u in .opd section"),
7659 ibfd, r_type);
50bc7936
AM
7660 need_edit = FALSE;
7661 break;
7662 }
7663
1e2f5b6e 7664 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7665 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7666 r_symndx, ibfd))
50bc7936 7667 goto error_ret;
1e2f5b6e
AM
7668
7669 if (sym_sec == NULL || sym_sec->owner == NULL)
7670 {
411e1bfb
AM
7671 const char *sym_name;
7672 if (h != NULL)
7673 sym_name = h->root.root.string;
7674 else
26c61ae5
L
7675 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7676 sym_sec);
411e1bfb 7677
1e2f5b6e 7678 (*_bfd_error_handler)
d003868e
AM
7679 (_("%B: undefined sym `%s' in .opd section"),
7680 ibfd, sym_name);
b34976b6 7681 need_edit = FALSE;
1e2f5b6e
AM
7682 break;
7683 }
7684
51020317
AM
7685 /* opd entries are always for functions defined in the
7686 current input bfd. If the symbol isn't defined in the
7687 input bfd, then we won't be using the function in this
7688 bfd; It must be defined in a linkonce section in another
7689 bfd, or is weak. It's also possible that we are
7690 discarding the function due to a linker script /DISCARD/,
7691 which we test for via the output_section. */
7692 if (sym_sec->owner != ibfd
7693 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 7694 need_edit = TRUE;
1e2f5b6e 7695
50bc7936 7696 rel += 2;
3f764659
JJ
7697 if (rel == relend
7698 || (rel + 1 == relend && rel->r_offset == offset + 16))
7699 {
7700 if (sec->size == offset + 24)
7701 {
7702 need_pad = NULL;
7703 break;
7704 }
7705 if (rel == relend && sec->size == offset + 16)
7706 {
7707 cnt_16b++;
7708 break;
7709 }
7710 goto broken_opd;
7711 }
7712
7713 if (rel->r_offset == offset + 24)
7714 offset += 24;
7715 else if (rel->r_offset != offset + 16)
7716 goto broken_opd;
7717 else if (rel + 1 < relend
7718 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7719 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7720 {
7721 offset += 16;
7722 cnt_16b++;
7723 }
7724 else if (rel + 2 < relend
7725 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
7726 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
7727 {
7728 offset += 24;
7729 rel += 1;
7730 }
7731 else
7732 goto broken_opd;
1e2f5b6e
AM
7733 }
7734
e7d1c40c 7735 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
3f764659
JJ
7736
7737 if (need_edit || add_aux_fields)
1e2f5b6e
AM
7738 {
7739 Elf_Internal_Rela *write_rel;
d4730f92 7740 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 7741 bfd_byte *rptr, *wptr;
983bddc8 7742 bfd_byte *new_contents;
b34976b6 7743 bfd_boolean skip;
3f764659 7744 long opd_ent_size;
74f0fb50
AM
7745 bfd_size_type amt;
7746
983bddc8 7747 new_contents = NULL;
74f0fb50
AM
7748 amt = sec->size * sizeof (long) / 8;
7749 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 7750 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50
AM
7751 if (opd->adjust == NULL)
7752 return FALSE;
7753 ppc64_elf_section_data (sec)->sec_type = sec_opd;
1e2f5b6e
AM
7754
7755 /* This seems a waste of time as input .opd sections are all
7756 zeros as generated by gcc, but I suppose there's no reason
7757 this will always be so. We might start putting something in
7758 the third word of .opd entries. */
7759 if ((sec->flags & SEC_IN_MEMORY) == 0)
7760 {
eea6121a
AM
7761 bfd_byte *loc;
7762 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 7763 {
eea6121a
AM
7764 if (loc != NULL)
7765 free (loc);
50bc7936 7766 error_ret:
6cdc0ccc
AM
7767 if (local_syms != NULL
7768 && symtab_hdr->contents != (unsigned char *) local_syms)
7769 free (local_syms);
6cdc0ccc
AM
7770 if (elf_section_data (sec)->relocs != relstart)
7771 free (relstart);
b34976b6 7772 return FALSE;
6cdc0ccc 7773 }
1e2f5b6e
AM
7774 sec->contents = loc;
7775 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7776 }
7777
7778 elf_section_data (sec)->relocs = relstart;
7779
3f764659 7780 new_contents = sec->contents;
3f764659
JJ
7781 if (add_aux_fields)
7782 {
7783 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7784 if (new_contents == NULL)
7785 return FALSE;
7786 need_pad = FALSE;
3f764659 7787 }
b4f4e59f
AM
7788 wptr = new_contents;
7789 rptr = sec->contents;
3f764659 7790
1e2f5b6e 7791 write_rel = relstart;
b34976b6 7792 skip = FALSE;
1e2f5b6e 7793 offset = 0;
3f764659 7794 opd_ent_size = 0;
1e2f5b6e
AM
7795 for (rel = relstart; rel < relend; rel++)
7796 {
50bc7936
AM
7797 unsigned long r_symndx;
7798 asection *sym_sec;
7799 struct elf_link_hash_entry *h;
7800 Elf_Internal_Sym *sym;
7801
7802 r_symndx = ELF64_R_SYM (rel->r_info);
7803 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 7804 r_symndx, ibfd))
50bc7936
AM
7805 goto error_ret;
7806
1e2f5b6e
AM
7807 if (rel->r_offset == offset)
7808 {
50bc7936 7809 struct ppc_link_hash_entry *fdh = NULL;
3f764659
JJ
7810
7811 /* See if the .opd entry is full 24 byte or
7812 16 byte (with fd_aux entry overlapped with next
7813 fd_func). */
7814 opd_ent_size = 24;
7815 if ((rel + 2 == relend && sec->size == offset + 16)
7816 || (rel + 3 < relend
7817 && rel[2].r_offset == offset + 16
7818 && rel[3].r_offset == offset + 24
7819 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
7820 && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
7821 opd_ent_size = 16;
7822
4025353c
AM
7823 if (h != NULL
7824 && h->root.root.string[0] == '.')
c4f68ce3 7825 {
e7d1c40c 7826 fdh = lookup_fdh ((struct ppc_link_hash_entry *) h, htab);
c4f68ce3
AM
7827 if (fdh != NULL
7828 && fdh->elf.root.type != bfd_link_hash_defined
7829 && fdh->elf.root.type != bfd_link_hash_defweak)
7830 fdh = NULL;
7831 }
1e2f5b6e 7832
51020317
AM
7833 skip = (sym_sec->owner != ibfd
7834 || sym_sec->output_section == bfd_abs_section_ptr);
a4aa0fb7
AM
7835 if (skip)
7836 {
4025353c 7837 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7
AM
7838 {
7839 /* Arrange for the function descriptor sym
7840 to be dropped. */
d6fe2dc1
AM
7841 fdh->elf.root.u.def.value = 0;
7842 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 7843 }
74f0fb50 7844 opd->adjust[rel->r_offset / 8] = -1;
a4aa0fb7
AM
7845 }
7846 else
1e2f5b6e
AM
7847 {
7848 /* We'll be keeping this opd entry. */
7849
4025353c 7850 if (fdh != NULL)
1e2f5b6e 7851 {
754021d0
AM
7852 /* Redefine the function descriptor symbol to
7853 this location in the opd section. It is
7854 necessary to update the value here rather
7855 than using an array of adjustments as we do
7856 for local symbols, because various places
7857 in the generic ELF code use the value
7858 stored in u.def.value. */
3f764659 7859 fdh->elf.root.u.def.value = wptr - new_contents;
754021d0 7860 fdh->adjust_done = 1;
1e2f5b6e 7861 }
754021d0
AM
7862
7863 /* Local syms are a bit tricky. We could
7864 tweak them as they can be cached, but
7865 we'd need to look through the local syms
7866 for the function descriptor sym which we
7867 don't have at the moment. So keep an
7868 array of adjustments. */
74f0fb50 7869 opd->adjust[rel->r_offset / 8]
3f764659 7870 = (wptr - new_contents) - (rptr - sec->contents);
1e2f5b6e
AM
7871
7872 if (wptr != rptr)
3f764659
JJ
7873 memcpy (wptr, rptr, opd_ent_size);
7874 wptr += opd_ent_size;
7875 if (add_aux_fields && opd_ent_size == 16)
7876 {
7877 memset (wptr, '\0', 8);
7878 wptr += 8;
7879 }
1e2f5b6e 7880 }
3f764659
JJ
7881 rptr += opd_ent_size;
7882 offset += opd_ent_size;
1e2f5b6e
AM
7883 }
7884
50bc7936
AM
7885 if (skip)
7886 {
60124e18
AM
7887 if (!NO_OPD_RELOCS
7888 && !info->relocatable
18d944df 7889 && !dec_dynrel_count (rel->r_info, sec, info,
19e08130 7890 NULL, h, sym))
8c1d1bb8 7891 goto error_ret;
50bc7936
AM
7892 }
7893 else
1e2f5b6e 7894 {
50bc7936
AM
7895 /* We need to adjust any reloc offsets to point to the
7896 new opd entries. While we're at it, we may as well
7897 remove redundant relocs. */
74f0fb50 7898 rel->r_offset += opd->adjust[(offset - opd_ent_size) / 8];
1e2f5b6e
AM
7899 if (write_rel != rel)
7900 memcpy (write_rel, rel, sizeof (*rel));
7901 ++write_rel;
7902 }
7903 }
7904
3f764659 7905 sec->size = wptr - new_contents;
1e2f5b6e 7906 sec->reloc_count = write_rel - relstart;
3f764659
JJ
7907 if (add_aux_fields)
7908 {
7909 free (sec->contents);
7910 sec->contents = new_contents;
7911 }
7912
05bf9422 7913 /* Fudge the header size too, as this is used later in
cdcf6e38 7914 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
7915 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7916 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
754021d0 7917 some_edited = TRUE;
1e2f5b6e 7918 }
6cdc0ccc 7919 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 7920 free (relstart);
6cdc0ccc 7921
411e1bfb
AM
7922 if (local_syms != NULL
7923 && symtab_hdr->contents != (unsigned char *) local_syms)
7924 {
7925 if (!info->keep_memory)
7926 free (local_syms);
7927 else
7928 symtab_hdr->contents = (unsigned char *) local_syms;
7929 }
7930 }
7931
754021d0
AM
7932 if (some_edited)
7933 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7934
3f764659
JJ
7935 /* If we are doing a final link and the last .opd entry is just 16 byte
7936 long, add a 8 byte padding after it. */
7937 if (need_pad != NULL && !info->relocatable)
7938 {
7939 bfd_byte *p;
7940
7941 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7942 {
7943 BFD_ASSERT (need_pad->size > 0);
7944
7945 p = bfd_malloc (need_pad->size + 8);
7946 if (p == NULL)
7947 return FALSE;
699733f6 7948
3f764659
JJ
7949 if (! bfd_get_section_contents (need_pad->owner, need_pad,
7950 p, 0, need_pad->size))
7951 return FALSE;
7952
7953 need_pad->contents = p;
7954 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7955 }
7956 else
7957 {
7958 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7959 if (p == NULL)
7960 return FALSE;
7961
7962 need_pad->contents = p;
7963 }
7964
7965 memset (need_pad->contents + need_pad->size, 0, 8);
7966 need_pad->size += 8;
7967 }
7968
411e1bfb
AM
7969 return TRUE;
7970}
7971
e1918d23 7972/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 7973
e1918d23 7974asection *
e7d1c40c 7975ppc64_elf_tls_setup (struct bfd_link_info *info)
411e1bfb 7976{
411e1bfb
AM
7977 struct ppc_link_hash_table *htab;
7978
411e1bfb 7979 htab = ppc_hash_table (info);
4dfe6ac6
NC
7980 if (htab == NULL)
7981 return NULL;
7982
ee67d69a
AM
7983 if (abiversion (info->output_bfd) == 1)
7984 htab->opd_abi = 1;
7985
e7d1c40c 7986 if (htab->params->no_multi_toc)
33c0ec9d
AM
7987 htab->do_multi_toc = 0;
7988 else if (!htab->do_multi_toc)
e7d1c40c 7989 htab->params->no_multi_toc = 1;
33c0ec9d 7990
3a71aa26
AM
7991 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7992 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7993 FALSE, FALSE, TRUE));
a7f2871e
AM
7994 /* Move dynamic linking info to the function descriptor sym. */
7995 if (htab->tls_get_addr != NULL)
7996 func_desc_adjust (&htab->tls_get_addr->elf, info);
3a71aa26
AM
7997 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7998 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7999 FALSE, FALSE, TRUE));
e7d1c40c 8000 if (!htab->params->no_tls_get_addr_opt)
a7f2871e
AM
8001 {
8002 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
8003
8004 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
8005 FALSE, FALSE, TRUE);
8006 if (opt != NULL)
8007 func_desc_adjust (opt, info);
8008 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
8009 FALSE, FALSE, TRUE);
8010 if (opt_fd != NULL
8011 && (opt_fd->root.type == bfd_link_hash_defined
8012 || opt_fd->root.type == bfd_link_hash_defweak))
8013 {
8014 /* If glibc supports an optimized __tls_get_addr call stub,
8015 signalled by the presence of __tls_get_addr_opt, and we'll
8016 be calling __tls_get_addr via a plt call stub, then
8017 make __tls_get_addr point to __tls_get_addr_opt. */
8018 tga_fd = &htab->tls_get_addr_fd->elf;
8019 if (htab->elf.dynamic_sections_created
8020 && tga_fd != NULL
8021 && (tga_fd->type == STT_FUNC
8022 || tga_fd->needs_plt)
8023 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
8024 || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
8025 && tga_fd->root.type == bfd_link_hash_undefweak)))
8026 {
8027 struct plt_entry *ent;
8028
8029 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
8030 if (ent->plt.refcount > 0)
8031 break;
8032 if (ent != NULL)
8033 {
8034 tga_fd->root.type = bfd_link_hash_indirect;
8035 tga_fd->root.u.i.link = &opt_fd->root;
8036 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
8037 if (opt_fd->dynindx != -1)
8038 {
8039 /* Use __tls_get_addr_opt in dynamic relocations. */
8040 opt_fd->dynindx = -1;
8041 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
8042 opt_fd->dynstr_index);
8043 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
854b41e7 8044 return NULL;
a7f2871e
AM
8045 }
8046 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
8047 tga = &htab->tls_get_addr->elf;
8048 if (opt != NULL && tga != NULL)
8049 {
8050 tga->root.type = bfd_link_hash_indirect;
8051 tga->root.u.i.link = &opt->root;
8052 ppc64_elf_copy_indirect_symbol (info, opt, tga);
8053 _bfd_elf_link_hash_hide_symbol (info, opt,
8054 tga->forced_local);
8055 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
8056 }
8057 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
8058 htab->tls_get_addr_fd->is_func_descriptor = 1;
8059 if (htab->tls_get_addr != NULL)
8060 {
8061 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8062 htab->tls_get_addr->is_func = 1;
8063 }
8064 }
8065 }
8066 }
8067 else
e7d1c40c 8068 htab->params->no_tls_get_addr_opt = TRUE;
a7f2871e 8069 }
33c0ec9d 8070 return _bfd_elf_tls_setup (info->output_bfd, info);
3a71aa26 8071}
8387904d 8072
3a71aa26
AM
8073/* Return TRUE iff REL is a branch reloc with a global symbol matching
8074 HASH1 or HASH2. */
8387904d 8075
3a71aa26
AM
8076static bfd_boolean
8077branch_reloc_hash_match (const bfd *ibfd,
8078 const Elf_Internal_Rela *rel,
8079 const struct ppc_link_hash_entry *hash1,
8080 const struct ppc_link_hash_entry *hash2)
8081{
8082 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8083 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8084 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8085
e054468f 8086 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 8087 {
3a71aa26
AM
8088 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8089 struct elf_link_hash_entry *h;
8387904d 8090
3a71aa26 8091 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 8092 h = elf_follow_link (h);
3a71aa26
AM
8093 if (h == &hash1->elf || h == &hash2->elf)
8094 return TRUE;
a48ebf4d 8095 }
3a71aa26 8096 return FALSE;
951fd09b 8097}
411e1bfb 8098
951fd09b
AM
8099/* Run through all the TLS relocs looking for optimization
8100 opportunities. The linker has been hacked (see ppc64elf.em) to do
8101 a preliminary section layout so that we know the TLS segment
8102 offsets. We can't optimize earlier because some optimizations need
8103 to know the tp offset, and we need to optimize before allocating
8104 dynamic relocations. */
8105
8106bfd_boolean
33c0ec9d 8107ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
8108{
8109 bfd *ibfd;
8110 asection *sec;
8111 struct ppc_link_hash_table *htab;
663a1470 8112 unsigned char *toc_ref;
102890f0 8113 int pass;
951fd09b 8114
1d483afe 8115 if (info->relocatable || !info->executable)
411e1bfb
AM
8116 return TRUE;
8117
951fd09b 8118 htab = ppc_hash_table (info);
4dfe6ac6
NC
8119 if (htab == NULL)
8120 return FALSE;
8121
663a1470
AM
8122 /* Make two passes over the relocs. On the first pass, mark toc
8123 entries involved with tls relocs, and check that tls relocs
8124 involved in setting up a tls_get_addr call are indeed followed by
8125 such a call. If they are not, we can't do any tls optimization.
8126 On the second pass twiddle tls_mask flags to notify
8127 relocate_section that optimization can be done, and adjust got
8128 and plt refcounts. */
8129 toc_ref = NULL;
8130 for (pass = 0; pass < 2; ++pass)
c72f2fb2 8131 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
663a1470
AM
8132 {
8133 Elf_Internal_Sym *locsyms = NULL;
8134 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8135
102890f0
AM
8136 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8137 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8138 {
8139 Elf_Internal_Rela *relstart, *rel, *relend;
663a1470 8140 bfd_boolean found_tls_get_addr_arg = 0;
411e1bfb 8141
102890f0
AM
8142 /* Read the relocations. */
8143 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8144 info->keep_memory);
8145 if (relstart == NULL)
2915c55b
JK
8146 {
8147 free (toc_ref);
8148 return FALSE;
8149 }
411e1bfb 8150
102890f0
AM
8151 relend = relstart + sec->reloc_count;
8152 for (rel = relstart; rel < relend; rel++)
8153 {
8154 enum elf_ppc64_reloc_type r_type;
8155 unsigned long r_symndx;
8156 struct elf_link_hash_entry *h;
8157 Elf_Internal_Sym *sym;
8158 asection *sym_sec;
f961d9dd
AM
8159 unsigned char *tls_mask;
8160 unsigned char tls_set, tls_clear, tls_type = 0;
102890f0
AM
8161 bfd_vma value;
8162 bfd_boolean ok_tprel, is_local;
8163 long toc_ref_index = 0;
8164 int expecting_tls_get_addr = 0;
663a1470 8165 bfd_boolean ret = FALSE;
411e1bfb 8166
102890f0
AM
8167 r_symndx = ELF64_R_SYM (rel->r_info);
8168 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8169 r_symndx, ibfd))
8170 {
8171 err_free_rel:
8172 if (elf_section_data (sec)->relocs != relstart)
8173 free (relstart);
8174 if (toc_ref != NULL)
8175 free (toc_ref);
8176 if (locsyms != NULL
0ffa91dd 8177 && (elf_symtab_hdr (ibfd).contents
102890f0
AM
8178 != (unsigned char *) locsyms))
8179 free (locsyms);
663a1470 8180 return ret;
102890f0 8181 }
411e1bfb 8182
102890f0
AM
8183 if (h != NULL)
8184 {
766bc656
AM
8185 if (h->root.type == bfd_link_hash_defined
8186 || h->root.type == bfd_link_hash_defweak)
8187 value = h->root.u.def.value;
8188 else if (h->root.type == bfd_link_hash_undefweak)
8189 value = 0;
8190 else
663a1470
AM
8191 {
8192 found_tls_get_addr_arg = 0;
8193 continue;
8194 }
102890f0
AM
8195 }
8196 else
8197 /* Symbols referenced by TLS relocs must be of type
8198 STT_TLS. So no need for .opd local sym adjust. */
8199 value = sym->st_value;
8200
8201 ok_tprel = FALSE;
8202 is_local = FALSE;
8203 if (h == NULL
8204 || !h->def_dynamic)
8205 {
8206 is_local = TRUE;
766bc656
AM
8207 if (h != NULL
8208 && h->root.type == bfd_link_hash_undefweak)
8209 ok_tprel = TRUE;
8210 else
8211 {
8212 value += sym_sec->output_offset;
8213 value += sym_sec->output_section->vma;
8214 value -= htab->elf.tls_sec->vma;
8215 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8216 < (bfd_vma) 1 << 32);
8217 }
102890f0 8218 }
951fd09b 8219
102890f0 8220 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
8221 /* If this section has old-style __tls_get_addr calls
8222 without marker relocs, then check that each
8223 __tls_get_addr call reloc is preceded by a reloc
8224 that conceivably belongs to the __tls_get_addr arg
8225 setup insn. If we don't find matching arg setup
8226 relocs, don't do any tls optimization. */
8227 if (pass == 0
8228 && sec->has_tls_get_addr_call
8229 && h != NULL
8230 && (h == &htab->tls_get_addr->elf
8231 || h == &htab->tls_get_addr_fd->elf)
8232 && !found_tls_get_addr_arg
8233 && is_branch_reloc (r_type))
8234 {
25f53a85 8235 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
8236 "TLS optimization disabled\n"),
8237 ibfd, sec, rel->r_offset);
8238 ret = TRUE;
8239 goto err_free_rel;
8240 }
8241
8242 found_tls_get_addr_arg = 0;
102890f0
AM
8243 switch (r_type)
8244 {
8245 case R_PPC64_GOT_TLSLD16:
8246 case R_PPC64_GOT_TLSLD16_LO:
8247 expecting_tls_get_addr = 1;
663a1470 8248 found_tls_get_addr_arg = 1;
102890f0
AM
8249 /* Fall thru */
8250
8251 case R_PPC64_GOT_TLSLD16_HI:
8252 case R_PPC64_GOT_TLSLD16_HA:
8253 /* These relocs should never be against a symbol
8254 defined in a shared lib. Leave them alone if
8255 that turns out to be the case. */
8256 if (!is_local)
8257 continue;
411e1bfb 8258
102890f0 8259 /* LD -> LE */
411e1bfb 8260 tls_set = 0;
102890f0
AM
8261 tls_clear = TLS_LD;
8262 tls_type = TLS_TLS | TLS_LD;
8263 break;
411e1bfb 8264
102890f0
AM
8265 case R_PPC64_GOT_TLSGD16:
8266 case R_PPC64_GOT_TLSGD16_LO:
8267 expecting_tls_get_addr = 1;
663a1470 8268 found_tls_get_addr_arg = 1;
102890f0
AM
8269 /* Fall thru */
8270
8271 case R_PPC64_GOT_TLSGD16_HI:
8272 case R_PPC64_GOT_TLSGD16_HA:
8273 if (ok_tprel)
8274 /* GD -> LE */
411e1bfb 8275 tls_set = 0;
102890f0
AM
8276 else
8277 /* GD -> IE */
8278 tls_set = TLS_TLS | TLS_TPRELGD;
8279 tls_clear = TLS_GD;
8280 tls_type = TLS_TLS | TLS_GD;
8281 break;
8282
8283 case R_PPC64_GOT_TPREL16_DS:
8284 case R_PPC64_GOT_TPREL16_LO_DS:
8285 case R_PPC64_GOT_TPREL16_HI:
8286 case R_PPC64_GOT_TPREL16_HA:
8287 if (ok_tprel)
8288 {
8289 /* IE -> LE */
8290 tls_set = 0;
8291 tls_clear = TLS_TPREL;
8292 tls_type = TLS_TLS | TLS_TPREL;
8293 break;
8294 }
411e1bfb
AM
8295 continue;
8296
727fc41e
AM
8297 case R_PPC64_TLSGD:
8298 case R_PPC64_TLSLD:
663a1470
AM
8299 found_tls_get_addr_arg = 1;
8300 /* Fall thru */
8301
8302 case R_PPC64_TLS:
8303 case R_PPC64_TOC16:
8304 case R_PPC64_TOC16_LO:
102890f0
AM
8305 if (sym_sec == NULL || sym_sec != toc)
8306 continue;
8307
8308 /* Mark this toc entry as referenced by a TLS
8309 code sequence. We can do that now in the
8310 case of R_PPC64_TLS, and after checking for
8311 tls_get_addr for the TOC16 relocs. */
8312 if (toc_ref == NULL)
663a1470
AM
8313 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8314 if (toc_ref == NULL)
8315 goto err_free_rel;
8316
102890f0
AM
8317 if (h != NULL)
8318 value = h->root.u.def.value;
8319 else
8320 value = sym->st_value;
8321 value += rel->r_addend;
8322 BFD_ASSERT (value < toc->size && value % 8 == 0);
663a1470 8323 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
8324 if (r_type == R_PPC64_TLS
8325 || r_type == R_PPC64_TLSGD
8326 || r_type == R_PPC64_TLSLD)
102890f0
AM
8327 {
8328 toc_ref[toc_ref_index] = 1;
8329 continue;
8330 }
8331
8332 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8333 continue;
8334
8335 tls_set = 0;
8336 tls_clear = 0;
8337 expecting_tls_get_addr = 2;
8338 break;
8339
8340 case R_PPC64_TPREL64:
8341 if (pass == 0
8342 || sec != toc
8343 || toc_ref == NULL
663a1470 8344 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8345 continue;
8346 if (ok_tprel)
8347 {
8348 /* IE -> LE */
8349 tls_set = TLS_EXPLICIT;
8350 tls_clear = TLS_TPREL;
8351 break;
8352 }
8353 continue;
8354
8355 case R_PPC64_DTPMOD64:
8356 if (pass == 0
8357 || sec != toc
8358 || toc_ref == NULL
663a1470 8359 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8360 continue;
8361 if (rel + 1 < relend
8362 && (rel[1].r_info
8363 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8364 && rel[1].r_offset == rel->r_offset + 8)
8365 {
8366 if (ok_tprel)
8367 /* GD -> LE */
8368 tls_set = TLS_EXPLICIT | TLS_GD;
8369 else
8370 /* GD -> IE */
8371 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8372 tls_clear = TLS_GD;
8373 }
8374 else
8375 {
8376 if (!is_local)
8377 continue;
8378
8379 /* LD -> LE */
8380 tls_set = TLS_EXPLICIT;
8381 tls_clear = TLS_LD;
8382 }
8383 break;
8384
8385 default:
8386 continue;
8387 }
8388
8389 if (pass == 0)
8390 {
727fc41e
AM
8391 if (!expecting_tls_get_addr
8392 || !sec->has_tls_get_addr_call)
102890f0
AM
8393 continue;
8394
3a71aa26
AM
8395 if (rel + 1 < relend
8396 && branch_reloc_hash_match (ibfd, rel + 1,
8397 htab->tls_get_addr,
8398 htab->tls_get_addr_fd))
102890f0 8399 {
3a71aa26 8400 if (expecting_tls_get_addr == 2)
102890f0 8401 {
3a71aa26 8402 /* Check for toc tls entries. */
f961d9dd 8403 unsigned char *toc_tls;
3a71aa26
AM
8404 int retval;
8405
8406 retval = get_tls_mask (&toc_tls, NULL, NULL,
8407 &locsyms,
8408 rel, ibfd);
8409 if (retval == 0)
8410 goto err_free_rel;
663a1470
AM
8411 if (toc_tls != NULL)
8412 {
8413 if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
8414 found_tls_get_addr_arg = 1;
8415 if (retval > 1)
8416 toc_ref[toc_ref_index] = 1;
8417 }
102890f0 8418 }
3a71aa26 8419 continue;
102890f0
AM
8420 }
8421
8422 if (expecting_tls_get_addr != 1)
8423 continue;
8424
8425 /* Uh oh, we didn't find the expected call. We
8426 could just mark this symbol to exclude it
8427 from tls optimization but it's safer to skip
663a1470 8428 the entire optimization. */
25f53a85 8429 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8430 "TLS optimization disabled\n"),
8431 ibfd, sec, rel->r_offset);
8432 ret = TRUE;
8433 goto err_free_rel;
102890f0
AM
8434 }
8435
85f7a9cb 8436 if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
102890f0
AM
8437 {
8438 struct plt_entry *ent;
8439 for (ent = htab->tls_get_addr->elf.plt.plist;
8440 ent != NULL;
8441 ent = ent->next)
8442 if (ent->addend == 0)
411e1bfb 8443 {
102890f0 8444 if (ent->plt.refcount > 0)
30038c59 8445 {
102890f0
AM
8446 ent->plt.refcount -= 1;
8447 expecting_tls_get_addr = 0;
30038c59 8448 }
102890f0 8449 break;
411e1bfb 8450 }
102890f0 8451 }
411e1bfb 8452
85f7a9cb 8453 if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
102890f0
AM
8454 {
8455 struct plt_entry *ent;
8456 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8457 ent != NULL;
8458 ent = ent->next)
8459 if (ent->addend == 0)
411e1bfb 8460 {
102890f0
AM
8461 if (ent->plt.refcount > 0)
8462 ent->plt.refcount -= 1;
8463 break;
411e1bfb 8464 }
102890f0 8465 }
411e1bfb 8466
102890f0 8467 if (tls_clear == 0)
30038c59
AM
8468 continue;
8469
102890f0
AM
8470 if ((tls_set & TLS_EXPLICIT) == 0)
8471 {
8472 struct got_entry *ent;
411e1bfb 8473
102890f0
AM
8474 /* Adjust got entry for this reloc. */
8475 if (h != NULL)
8476 ent = h->got.glist;
8477 else
8478 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 8479
102890f0
AM
8480 for (; ent != NULL; ent = ent->next)
8481 if (ent->addend == rel->r_addend
8482 && ent->owner == ibfd
8483 && ent->tls_type == tls_type)
8484 break;
8485 if (ent == NULL)
8486 abort ();
411e1bfb 8487
102890f0
AM
8488 if (tls_set == 0)
8489 {
8490 /* We managed to get rid of a got entry. */
8491 if (ent->got.refcount > 0)
8492 ent->got.refcount -= 1;
8493 }
8494 }
8495 else
8496 {
8497 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8498 we'll lose one or two dyn relocs. */
8499 if (!dec_dynrel_count (rel->r_info, sec, info,
19e08130 8500 NULL, h, sym))
102890f0 8501 return FALSE;
411e1bfb 8502
102890f0
AM
8503 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8504 {
8505 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
19e08130 8506 NULL, h, sym))
102890f0
AM
8507 return FALSE;
8508 }
8509 }
411e1bfb 8510
102890f0
AM
8511 *tls_mask |= tls_set;
8512 *tls_mask &= ~tls_clear;
8513 }
8c1d1bb8 8514
102890f0
AM
8515 if (elf_section_data (sec)->relocs != relstart)
8516 free (relstart);
8517 }
411e1bfb 8518
663a1470
AM
8519 if (locsyms != NULL
8520 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8521 {
8522 if (!info->keep_memory)
8523 free (locsyms);
8524 else
8525 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8526 }
8527 }
411e1bfb 8528
663a1470
AM
8529 if (toc_ref != NULL)
8530 free (toc_ref);
b34976b6 8531 return TRUE;
1e2f5b6e 8532}
b34976b6 8533
c5614fa4
AM
8534/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8535 the values of any global symbols in a toc section that has been
8536 edited. Globals in toc sections should be a rarity, so this function
8537 sets a flag if any are found in toc sections other than the one just
8538 edited, so that futher hash table traversals can be avoided. */
8539
8540struct adjust_toc_info
8541{
8542 asection *toc;
8543 unsigned long *skip;
8544 bfd_boolean global_toc_syms;
8545};
8546
ba761f19
AM
8547enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8548
c5614fa4
AM
8549static bfd_boolean
8550adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8551{
8552 struct ppc_link_hash_entry *eh;
8553 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 8554 unsigned long i;
c5614fa4 8555
c5614fa4
AM
8556 if (h->root.type != bfd_link_hash_defined
8557 && h->root.type != bfd_link_hash_defweak)
8558 return TRUE;
8559
8560 eh = (struct ppc_link_hash_entry *) h;
8561 if (eh->adjust_done)
8562 return TRUE;
8563
8564 if (eh->elf.root.u.def.section == toc_inf->toc)
8565 {
854b41e7
AM
8566 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8567 i = toc_inf->toc->rawsize >> 3;
c5614fa4 8568 else
854b41e7
AM
8569 i = eh->elf.root.u.def.value >> 3;
8570
ba761f19 8571 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4
AM
8572 {
8573 (*_bfd_error_handler)
854b41e7
AM
8574 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8575 do
8576 ++i;
ba761f19 8577 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 8578 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 8579 }
854b41e7
AM
8580
8581 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
8582 eh->adjust_done = 1;
8583 }
8584 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8585 toc_inf->global_toc_syms = TRUE;
8586
8587 return TRUE;
8588}
8589
560c8763
AM
8590/* Return TRUE iff INSN is one we expect on a _LO variety toc/got reloc. */
8591
8592static bfd_boolean
8593ok_lo_toc_insn (unsigned int insn)
8594{
8595 return ((insn & (0x3f << 26)) == 14u << 26 /* addi */
8596 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8597 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8598 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8599 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8600 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8601 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8602 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8603 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8604 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8605 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8606 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8607 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8608 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8609 || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8610 && (insn & 3) != 1)
8611 || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8612 && ((insn & 3) == 0 || (insn & 3) == 3))
8613 || (insn & (0x3f << 26)) == 12u << 26 /* addic */);
8614}
8615
c5614fa4
AM
8616/* Examine all relocs referencing .toc sections in order to remove
8617 unused .toc entries. */
8618
8619bfd_boolean
33c0ec9d 8620ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
8621{
8622 bfd *ibfd;
8623 struct adjust_toc_info toc_inf;
67f0cbdb 8624 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 8625
67f0cbdb 8626 htab->do_toc_opt = 1;
c5614fa4 8627 toc_inf.global_toc_syms = TRUE;
c72f2fb2 8628 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
c5614fa4
AM
8629 {
8630 asection *toc, *sec;
8631 Elf_Internal_Shdr *symtab_hdr;
8632 Elf_Internal_Sym *local_syms;
425b145b 8633 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
8634 unsigned long *skip, *drop;
8635 unsigned char *used;
8636 unsigned char *keep, last, some_unused;
8637
854b41e7
AM
8638 if (!is_ppc64_elf (ibfd))
8639 continue;
8640
c5614fa4
AM
8641 toc = bfd_get_section_by_name (ibfd, ".toc");
8642 if (toc == NULL
92b7a70f 8643 || toc->size == 0
dbaa2011
AM
8644 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8645 || discarded_section (toc))
c5614fa4
AM
8646 continue;
8647
425b145b 8648 toc_relocs = NULL;
c5614fa4 8649 local_syms = NULL;
0ffa91dd 8650 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
8651
8652 /* Look at sections dropped from the final link. */
8653 skip = NULL;
8654 relstart = NULL;
8655 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8656 {
8657 if (sec->reloc_count == 0
dbaa2011 8658 || !discarded_section (sec)
c5614fa4
AM
8659 || get_opd_info (sec)
8660 || (sec->flags & SEC_ALLOC) == 0
8661 || (sec->flags & SEC_DEBUGGING) != 0)
8662 continue;
8663
8664 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8665 if (relstart == NULL)
8666 goto error_ret;
8667
8668 /* Run through the relocs to see which toc entries might be
8669 unused. */
8670 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8671 {
8672 enum elf_ppc64_reloc_type r_type;
8673 unsigned long r_symndx;
8674 asection *sym_sec;
8675 struct elf_link_hash_entry *h;
8676 Elf_Internal_Sym *sym;
8677 bfd_vma val;
8678
8679 r_type = ELF64_R_TYPE (rel->r_info);
8680 switch (r_type)
8681 {
8682 default:
8683 continue;
8684
8685 case R_PPC64_TOC16:
8686 case R_PPC64_TOC16_LO:
8687 case R_PPC64_TOC16_HI:
8688 case R_PPC64_TOC16_HA:
8689 case R_PPC64_TOC16_DS:
8690 case R_PPC64_TOC16_LO_DS:
8691 break;
8692 }
8693
8694 r_symndx = ELF64_R_SYM (rel->r_info);
8695 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8696 r_symndx, ibfd))
8697 goto error_ret;
8698
8699 if (sym_sec != toc)
8700 continue;
8701
8702 if (h != NULL)
8703 val = h->root.u.def.value;
8704 else
8705 val = sym->st_value;
8706 val += rel->r_addend;
8707
8708 if (val >= toc->size)
8709 continue;
8710
8711 /* Anything in the toc ought to be aligned to 8 bytes.
8712 If not, don't mark as unused. */
8713 if (val & 7)
8714 continue;
8715
8716 if (skip == NULL)
8717 {
854b41e7 8718 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
8719 if (skip == NULL)
8720 goto error_ret;
8721 }
8722
ba761f19 8723 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
8724 }
8725
8726 if (elf_section_data (sec)->relocs != relstart)
8727 free (relstart);
8728 }
8729
ba761f19
AM
8730 /* For largetoc loads of address constants, we can convert
8731 . addis rx,2,addr@got@ha
8732 . ld ry,addr@got@l(rx)
8733 to
8734 . addis rx,2,addr@toc@ha
8735 . addi ry,rx,addr@toc@l
8736 when addr is within 2G of the toc pointer. This then means
8737 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 8738
ba761f19
AM
8739 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8740 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8741 && toc->reloc_count != 0)
8742 {
8743 /* Read toc relocs. */
425b145b
AM
8744 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8745 info->keep_memory);
8746 if (toc_relocs == NULL)
ba761f19
AM
8747 goto error_ret;
8748
425b145b 8749 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
8750 {
8751 enum elf_ppc64_reloc_type r_type;
8752 unsigned long r_symndx;
8753 asection *sym_sec;
8754 struct elf_link_hash_entry *h;
8755 Elf_Internal_Sym *sym;
8756 bfd_vma val, addr;
8757
8758 r_type = ELF64_R_TYPE (rel->r_info);
8759 if (r_type != R_PPC64_ADDR64)
8760 continue;
8761
8762 r_symndx = ELF64_R_SYM (rel->r_info);
8763 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8764 r_symndx, ibfd))
8765 goto error_ret;
8766
425b145b 8767 if (sym_sec == NULL
dbaa2011 8768 || discarded_section (sym_sec))
425b145b
AM
8769 continue;
8770
afe397ea 8771 if (!SYMBOL_REFERENCES_LOCAL (info, h))
ba761f19
AM
8772 continue;
8773
8774 if (h != NULL)
bddc25c9
AM
8775 {
8776 if (h->type == STT_GNU_IFUNC)
8777 continue;
8778 val = h->root.u.def.value;
8779 }
ba761f19 8780 else
bddc25c9
AM
8781 {
8782 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8783 continue;
8784 val = sym->st_value;
8785 }
ba761f19
AM
8786 val += rel->r_addend;
8787 val += sym_sec->output_section->vma + sym_sec->output_offset;
8788
8789 /* We don't yet know the exact toc pointer value, but we
8790 know it will be somewhere in the toc section. Don't
8791 optimize if the difference from any possible toc
8792 pointer is outside [ff..f80008000, 7fff7fff]. */
8793 addr = toc->output_section->vma + TOC_BASE_OFF;
8794 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8795 continue;
8796
8797 addr = toc->output_section->vma + toc->output_section->rawsize;
8798 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8799 continue;
8800
8801 if (skip == NULL)
8802 {
8803 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8804 if (skip == NULL)
8805 goto error_ret;
8806 }
8807
8808 skip[rel->r_offset >> 3]
425b145b 8809 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 8810 }
ba761f19
AM
8811 }
8812
c5614fa4
AM
8813 if (skip == NULL)
8814 continue;
8815
8816 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8817 if (used == NULL)
8818 {
8819 error_ret:
8820 if (local_syms != NULL
8821 && symtab_hdr->contents != (unsigned char *) local_syms)
8822 free (local_syms);
8823 if (sec != NULL
8824 && relstart != NULL
8825 && elf_section_data (sec)->relocs != relstart)
8826 free (relstart);
425b145b
AM
8827 if (toc_relocs != NULL
8828 && elf_section_data (toc)->relocs != toc_relocs)
8829 free (toc_relocs);
c5614fa4
AM
8830 if (skip != NULL)
8831 free (skip);
8832 return FALSE;
8833 }
8834
30038c59
AM
8835 /* Now check all kept sections that might reference the toc.
8836 Check the toc itself last. */
8837 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8838 : ibfd->sections);
c5614fa4 8839 sec != NULL;
c5614fa4 8840 sec = (sec == toc ? NULL
c5614fa4 8841 : sec->next == NULL ? toc
30038c59 8842 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
8843 : sec->next))
8844 {
8845 int repeat;
8846
8847 if (sec->reloc_count == 0
dbaa2011 8848 || discarded_section (sec)
c5614fa4
AM
8849 || get_opd_info (sec)
8850 || (sec->flags & SEC_ALLOC) == 0
8851 || (sec->flags & SEC_DEBUGGING) != 0)
8852 continue;
8853
854b41e7
AM
8854 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8855 info->keep_memory);
c5614fa4 8856 if (relstart == NULL)
2915c55b
JK
8857 {
8858 free (used);
8859 goto error_ret;
8860 }
c5614fa4
AM
8861
8862 /* Mark toc entries referenced as used. */
c5614fa4 8863 do
d4f1ee75
AM
8864 {
8865 repeat = 0;
8866 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8867 {
8868 enum elf_ppc64_reloc_type r_type;
8869 unsigned long r_symndx;
8870 asection *sym_sec;
8871 struct elf_link_hash_entry *h;
8872 Elf_Internal_Sym *sym;
8873 bfd_vma val;
8874 enum {no_check, check_lo, check_ha} insn_check;
98528052 8875
d4f1ee75
AM
8876 r_type = ELF64_R_TYPE (rel->r_info);
8877 switch (r_type)
8878 {
8879 default:
8880 insn_check = no_check;
8881 break;
98528052 8882
d4f1ee75
AM
8883 case R_PPC64_GOT_TLSLD16_HA:
8884 case R_PPC64_GOT_TLSGD16_HA:
8885 case R_PPC64_GOT_TPREL16_HA:
8886 case R_PPC64_GOT_DTPREL16_HA:
8887 case R_PPC64_GOT16_HA:
8888 case R_PPC64_TOC16_HA:
8889 insn_check = check_ha;
8890 break;
98528052 8891
d4f1ee75
AM
8892 case R_PPC64_GOT_TLSLD16_LO:
8893 case R_PPC64_GOT_TLSGD16_LO:
8894 case R_PPC64_GOT_TPREL16_LO_DS:
8895 case R_PPC64_GOT_DTPREL16_LO_DS:
8896 case R_PPC64_GOT16_LO:
8897 case R_PPC64_GOT16_LO_DS:
8898 case R_PPC64_TOC16_LO:
8899 case R_PPC64_TOC16_LO_DS:
8900 insn_check = check_lo;
8901 break;
8902 }
560c8763 8903
d4f1ee75
AM
8904 if (insn_check != no_check)
8905 {
8906 bfd_vma off = rel->r_offset & ~3;
8907 unsigned char buf[4];
8908 unsigned int insn;
c5614fa4 8909
d4f1ee75
AM
8910 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
8911 {
8912 free (used);
8913 goto error_ret;
8914 }
8915 insn = bfd_get_32 (ibfd, buf);
8916 if (insn_check == check_lo
8917 ? !ok_lo_toc_insn (insn)
8918 : ((insn & ((0x3f << 26) | 0x1f << 16))
8919 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
8920 {
8921 char str[12];
8922
8923 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
8924 sprintf (str, "%#08x", insn);
8925 info->callbacks->einfo
8926 (_("%P: %H: toc optimization is not supported for"
8927 " %s instruction.\n"),
8928 ibfd, sec, rel->r_offset & ~3, str);
8929 }
8930 }
c5614fa4 8931
d4f1ee75
AM
8932 switch (r_type)
8933 {
8934 case R_PPC64_TOC16:
8935 case R_PPC64_TOC16_LO:
8936 case R_PPC64_TOC16_HI:
8937 case R_PPC64_TOC16_HA:
8938 case R_PPC64_TOC16_DS:
8939 case R_PPC64_TOC16_LO_DS:
8940 /* In case we're taking addresses of toc entries. */
8941 case R_PPC64_ADDR64:
8942 break;
c5614fa4 8943
d4f1ee75
AM
8944 default:
8945 continue;
8946 }
c5614fa4 8947
d4f1ee75
AM
8948 r_symndx = ELF64_R_SYM (rel->r_info);
8949 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8950 r_symndx, ibfd))
8951 {
8952 free (used);
8953 goto error_ret;
8954 }
c5614fa4 8955
d4f1ee75
AM
8956 if (sym_sec != toc)
8957 continue;
c5614fa4 8958
d4f1ee75
AM
8959 if (h != NULL)
8960 val = h->root.u.def.value;
8961 else
8962 val = sym->st_value;
8963 val += rel->r_addend;
ba761f19 8964
d4f1ee75
AM
8965 if (val >= toc->size)
8966 continue;
ba761f19 8967
d4f1ee75
AM
8968 if ((skip[val >> 3] & can_optimize) != 0)
8969 {
8970 bfd_vma off;
8971 unsigned char opc;
8972
8973 switch (r_type)
8974 {
8975 case R_PPC64_TOC16_HA:
ba761f19 8976 break;
ba761f19 8977
d4f1ee75
AM
8978 case R_PPC64_TOC16_LO_DS:
8979 off = rel->r_offset;
8980 off += (bfd_big_endian (ibfd) ? -2 : 3);
8981 if (!bfd_get_section_contents (ibfd, sec, &opc,
8982 off, 1))
8983 {
8984 free (used);
8985 goto error_ret;
8986 }
8987 if ((opc & (0x3f << 2)) == (58u << 2))
8988 break;
8989 /* Fall thru */
ba761f19 8990
d4f1ee75
AM
8991 default:
8992 /* Wrong sort of reloc, or not a ld. We may
8993 as well clear ref_from_discarded too. */
8994 skip[val >> 3] = 0;
8995 }
8996 }
8997
8998 if (sec != toc)
8999 used[val >> 3] = 1;
9000 /* For the toc section, we only mark as used if this
9001 entry itself isn't unused. */
9002 else if ((used[rel->r_offset >> 3]
9003 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
9004 && !used[val >> 3])
9005 {
9006 /* Do all the relocs again, to catch reference
9007 chains. */
9008 repeat = 1;
9009 used[val >> 3] = 1;
9010 }
9011 }
9012 }
c5614fa4 9013 while (repeat);
854b41e7
AM
9014
9015 if (elf_section_data (sec)->relocs != relstart)
9016 free (relstart);
c5614fa4
AM
9017 }
9018
9019 /* Merge the used and skip arrays. Assume that TOC
9020 doublewords not appearing as either used or unused belong
9021 to to an entry more than one doubleword in size. */
9022 for (drop = skip, keep = used, last = 0, some_unused = 0;
9023 drop < skip + (toc->size + 7) / 8;
9024 ++drop, ++keep)
9025 {
9026 if (*keep)
9027 {
ba761f19
AM
9028 *drop &= ~ref_from_discarded;
9029 if ((*drop & can_optimize) != 0)
9030 some_unused = 1;
c5614fa4
AM
9031 last = 0;
9032 }
b140b010 9033 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
9034 {
9035 some_unused = 1;
ba761f19 9036 last = ref_from_discarded;
c5614fa4
AM
9037 }
9038 else
9039 *drop = last;
9040 }
9041
9042 free (used);
9043
9044 if (some_unused)
9045 {
9046 bfd_byte *contents, *src;
9047 unsigned long off;
d62b3684 9048 Elf_Internal_Sym *sym;
ba761f19 9049 bfd_boolean local_toc_syms = FALSE;
c5614fa4
AM
9050
9051 /* Shuffle the toc contents, and at the same time convert the
9052 skip array from booleans into offsets. */
9053 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
9054 goto error_ret;
9055
9056 elf_section_data (toc)->this_hdr.contents = contents;
9057
9058 for (src = contents, off = 0, drop = skip;
9059 src < contents + toc->size;
9060 src += 8, ++drop)
9061 {
ba761f19
AM
9062 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9063 off += 8;
c5614fa4
AM
9064 else if (off != 0)
9065 {
9066 *drop = off;
9067 memcpy (src - off, src, 8);
9068 }
9069 }
854b41e7 9070 *drop = off;
c5614fa4
AM
9071 toc->rawsize = toc->size;
9072 toc->size = src - contents - off;
9073
ba761f19
AM
9074 /* Adjust addends for relocs against the toc section sym,
9075 and optimize any accesses we can. */
c5614fa4
AM
9076 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9077 {
9078 if (sec->reloc_count == 0
dbaa2011 9079 || discarded_section (sec))
c5614fa4
AM
9080 continue;
9081
9082 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 9083 info->keep_memory);
c5614fa4
AM
9084 if (relstart == NULL)
9085 goto error_ret;
9086
9087 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9088 {
9089 enum elf_ppc64_reloc_type r_type;
9090 unsigned long r_symndx;
9091 asection *sym_sec;
9092 struct elf_link_hash_entry *h;
854b41e7 9093 bfd_vma val;
c5614fa4
AM
9094
9095 r_type = ELF64_R_TYPE (rel->r_info);
9096 switch (r_type)
9097 {
9098 default:
9099 continue;
9100
9101 case R_PPC64_TOC16:
9102 case R_PPC64_TOC16_LO:
9103 case R_PPC64_TOC16_HI:
9104 case R_PPC64_TOC16_HA:
9105 case R_PPC64_TOC16_DS:
9106 case R_PPC64_TOC16_LO_DS:
9107 case R_PPC64_ADDR64:
9108 break;
9109 }
9110
9111 r_symndx = ELF64_R_SYM (rel->r_info);
9112 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9113 r_symndx, ibfd))
9114 goto error_ret;
9115
ba761f19 9116 if (sym_sec != toc)
c5614fa4
AM
9117 continue;
9118
ba761f19
AM
9119 if (h != NULL)
9120 val = h->root.u.def.value;
9121 else
9122 {
9123 val = sym->st_value;
9124 if (val != 0)
9125 local_toc_syms = TRUE;
9126 }
9127
9128 val += rel->r_addend;
854b41e7
AM
9129
9130 if (val > toc->rawsize)
9131 val = toc->rawsize;
ba761f19
AM
9132 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9133 continue;
9134 else if ((skip[val >> 3] & can_optimize) != 0)
9135 {
9136 Elf_Internal_Rela *tocrel
425b145b 9137 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
9138 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9139
9140 switch (r_type)
9141 {
9142 case R_PPC64_TOC16_HA:
9143 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9144 break;
9145
9146 case R_PPC64_TOC16_LO_DS:
9147 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9148 break;
9149
9150 default:
28942f62
AM
9151 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9152 ppc_howto_init ();
b140b010 9153 info->callbacks->einfo
bc30df16 9154 (_("%P: %H: %s references "
b140b010
AM
9155 "optimized away TOC entry\n"),
9156 ibfd, sec, rel->r_offset,
9157 ppc64_elf_howto_table[r_type]->name);
9158 bfd_set_error (bfd_error_bad_value);
9159 goto error_ret;
ba761f19
AM
9160 }
9161 rel->r_addend = tocrel->r_addend;
9162 elf_section_data (sec)->relocs = relstart;
9163 continue;
9164 }
9165
9166 if (h != NULL || sym->st_value != 0)
9167 continue;
854b41e7
AM
9168
9169 rel->r_addend -= skip[val >> 3];
9170 elf_section_data (sec)->relocs = relstart;
c5614fa4 9171 }
854b41e7
AM
9172
9173 if (elf_section_data (sec)->relocs != relstart)
9174 free (relstart);
c5614fa4
AM
9175 }
9176
9177 /* We shouldn't have local or global symbols defined in the TOC,
9178 but handle them anyway. */
df22d223
AM
9179 if (local_syms != NULL)
9180 for (sym = local_syms;
9181 sym < local_syms + symtab_hdr->sh_info;
9182 ++sym)
9183 if (sym->st_value != 0
9184 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9185 {
9186 unsigned long i;
854b41e7 9187
df22d223
AM
9188 if (sym->st_value > toc->rawsize)
9189 i = toc->rawsize >> 3;
9190 else
9191 i = sym->st_value >> 3;
854b41e7 9192
df22d223
AM
9193 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9194 {
9195 if (local_toc_syms)
9196 (*_bfd_error_handler)
9197 (_("%s defined on removed toc entry"),
9198 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9199 do
9200 ++i;
9201 while ((skip[i] & (ref_from_discarded | can_optimize)));
9202 sym->st_value = (bfd_vma) i << 3;
9203 }
d62b3684 9204
df22d223
AM
9205 sym->st_value -= skip[i];
9206 symtab_hdr->contents = (unsigned char *) local_syms;
9207 }
c5614fa4 9208
854b41e7 9209 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
9210 if (toc_inf.global_toc_syms)
9211 {
9212 toc_inf.toc = toc;
9213 toc_inf.skip = skip;
9214 toc_inf.global_toc_syms = FALSE;
9215 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9216 &toc_inf);
9217 }
854b41e7
AM
9218
9219 if (toc->reloc_count != 0)
9220 {
d4730f92 9221 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
9222 Elf_Internal_Rela *wrel;
9223 bfd_size_type sz;
9224
854b41e7 9225 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
9226 if (toc_relocs == NULL)
9227 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9228 info->keep_memory);
9229 if (toc_relocs == NULL)
9230 goto error_ret;
9231
425b145b
AM
9232 wrel = toc_relocs;
9233 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9234 if ((skip[rel->r_offset >> 3]
9235 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
9236 {
9237 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9238 wrel->r_info = rel->r_info;
9239 wrel->r_addend = rel->r_addend;
9240 ++wrel;
9241 }
9242 else if (!dec_dynrel_count (rel->r_info, toc, info,
9243 &local_syms, NULL, NULL))
9244 goto error_ret;
9245
425b145b
AM
9246 elf_section_data (toc)->relocs = toc_relocs;
9247 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
9248 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9249 sz = rel_hdr->sh_entsize;
9250 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9251 }
c5614fa4 9252 }
28be611c
AM
9253 else if (toc_relocs != NULL
9254 && elf_section_data (toc)->relocs != toc_relocs)
425b145b 9255 free (toc_relocs);
c5614fa4
AM
9256
9257 if (local_syms != NULL
9258 && symtab_hdr->contents != (unsigned char *) local_syms)
9259 {
9260 if (!info->keep_memory)
9261 free (local_syms);
9262 else
9263 symtab_hdr->contents = (unsigned char *) local_syms;
9264 }
9265 free (skip);
9266 }
9267
9268 return TRUE;
9269}
9270
1bbe0902
AM
9271/* Return true iff input section I references the TOC using
9272 instructions limited to +/-32k offsets. */
9273
9274bfd_boolean
9275ppc64_elf_has_small_toc_reloc (asection *i)
9276{
9277 return (is_ppc64_elf (i->owner)
9278 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9279}
9280
927be08e
AM
9281/* Allocate space for one GOT entry. */
9282
9283static void
9284allocate_got (struct elf_link_hash_entry *h,
9285 struct bfd_link_info *info,
9286 struct got_entry *gent)
9287{
9288 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9289 bfd_boolean dyn;
9290 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9291 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9292 ? 16 : 8);
9293 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9294 ? 2 : 1) * sizeof (Elf64_External_Rela);
9295 asection *got = ppc64_elf_tdata (gent->owner)->got;
9296
9297 gent->got.offset = got->size;
9298 got->size += entsize;
9299
9300 dyn = htab->elf.dynamic_sections_created;
19e08130 9301 if (h->type == STT_GNU_IFUNC)
927be08e 9302 {
33e44f2e 9303 htab->elf.irelplt->size += rentsize;
19e08130 9304 htab->got_reli_size += rentsize;
927be08e 9305 }
19e08130
AM
9306 else if ((info->shared
9307 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
9308 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9309 || h->root.type != bfd_link_hash_undefweak))
927be08e 9310 {
19e08130 9311 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9312 relgot->size += rentsize;
927be08e
AM
9313 }
9314}
9315
7865406b
AM
9316/* This function merges got entries in the same toc group. */
9317
9318static void
9319merge_got_entries (struct got_entry **pent)
9320{
9321 struct got_entry *ent, *ent2;
9322
9323 for (ent = *pent; ent != NULL; ent = ent->next)
9324 if (!ent->is_indirect)
9325 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9326 if (!ent2->is_indirect
9327 && ent2->addend == ent->addend
9328 && ent2->tls_type == ent->tls_type
9329 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9330 {
9331 ent2->is_indirect = TRUE;
9332 ent2->got.ent = ent;
9333 }
9334}
9335
65f38f15
AM
9336/* Allocate space in .plt, .got and associated reloc sections for
9337 dynamic relocs. */
5bd4f169 9338
b34976b6 9339static bfd_boolean
4ce794b7 9340allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9341{
65f38f15
AM
9342 struct bfd_link_info *info;
9343 struct ppc_link_hash_table *htab;
5bd4f169 9344 asection *s;
65f38f15 9345 struct ppc_link_hash_entry *eh;
6061a67d 9346 struct elf_dyn_relocs *p;
0b8bcf0d 9347 struct got_entry **pgent, *gent;
5bd4f169 9348
e92d460e 9349 if (h->root.type == bfd_link_hash_indirect)
b34976b6 9350 return TRUE;
5bd4f169 9351
65f38f15
AM
9352 info = (struct bfd_link_info *) inf;
9353 htab = ppc_hash_table (info);
4dfe6ac6
NC
9354 if (htab == NULL)
9355 return FALSE;
5bd4f169 9356
e054468f
AM
9357 if ((htab->elf.dynamic_sections_created
9358 && h->dynindx != -1
9359 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
9360 || h->type == STT_GNU_IFUNC)
5bd4f169 9361 {
411e1bfb
AM
9362 struct plt_entry *pent;
9363 bfd_boolean doneone = FALSE;
9364 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9365 if (pent->plt.refcount > 0)
9366 {
25f23106
AM
9367 if (!htab->elf.dynamic_sections_created
9368 || h->dynindx == -1)
e054468f 9369 {
33e44f2e 9370 s = htab->elf.iplt;
e054468f 9371 pent->plt.offset = s->size;
b9e5796b 9372 s->size += PLT_ENTRY_SIZE (htab);
33e44f2e 9373 s = htab->elf.irelplt;
e054468f
AM
9374 }
9375 else
9376 {
9377 /* If this is the first .plt entry, make room for the special
9378 first entry. */
33e44f2e 9379 s = htab->elf.splt;
e054468f 9380 if (s->size == 0)
b9e5796b 9381 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
e054468f
AM
9382
9383 pent->plt.offset = s->size;
9384
9385 /* Make room for this entry. */
b9e5796b 9386 s->size += PLT_ENTRY_SIZE (htab);
e054468f
AM
9387
9388 /* Make room for the .glink code. */
9389 s = htab->glink;
9390 if (s->size == 0)
9391 s->size += GLINK_CALL_STUB_SIZE;
b9e5796b
AM
9392 if (htab->opd_abi)
9393 {
9394 /* We need bigger stubs past index 32767. */
9395 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
9396 s->size += 4;
9397 s->size += 2*4;
9398 }
9399 else
e054468f 9400 s->size += 4;
e054468f
AM
9401
9402 /* We also need to make an entry in the .rela.plt section. */
33e44f2e 9403 s = htab->elf.srelplt;
e054468f 9404 }
eea6121a 9405 s->size += sizeof (Elf64_External_Rela);
411e1bfb
AM
9406 doneone = TRUE;
9407 }
9408 else
9409 pent->plt.offset = (bfd_vma) -1;
9410 if (!doneone)
65f38f15 9411 {
411e1bfb 9412 h->plt.plist = NULL;
f5385ebf 9413 h->needs_plt = 0;
65f38f15
AM
9414 }
9415 }
9416 else
9417 {
411e1bfb 9418 h->plt.plist = NULL;
f5385ebf 9419 h->needs_plt = 0;
65f38f15
AM
9420 }
9421
951fd09b
AM
9422 eh = (struct ppc_link_hash_entry *) h;
9423 /* Run through the TLS GD got entries first if we're changing them
9424 to TPREL. */
e7b938ca 9425 if ((eh->tls_mask & TLS_TPRELGD) != 0)
951fd09b
AM
9426 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9427 if (gent->got.refcount > 0
9428 && (gent->tls_type & TLS_GD) != 0)
9429 {
9430 /* This was a GD entry that has been converted to TPREL. If
9431 there happens to be a TPREL entry we can use that one. */
9432 struct got_entry *ent;
9433 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9434 if (ent->got.refcount > 0
9435 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9436 && ent->addend == gent->addend
9437 && ent->owner == gent->owner)
951fd09b
AM
9438 {
9439 gent->got.refcount = 0;
9440 break;
9441 }
9442
9443 /* If not, then we'll be using our own TPREL entry. */
9444 if (gent->got.refcount != 0)
9445 gent->tls_type = TLS_TLS | TLS_TPREL;
9446 }
9447
7865406b
AM
9448 /* Remove any list entry that won't generate a word in the GOT before
9449 we call merge_got_entries. Otherwise we risk merging to empty
9450 entries. */
0b8bcf0d
AM
9451 pgent = &h->got.glist;
9452 while ((gent = *pgent) != NULL)
411e1bfb 9453 if (gent->got.refcount > 0)
7865406b
AM
9454 {
9455 if ((gent->tls_type & TLS_LD) != 0
9456 && !h->def_dynamic)
9457 {
9458 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9459 *pgent = gent->next;
9460 }
9461 else
9462 pgent = &gent->next;
9463 }
9464 else
9465 *pgent = gent->next;
9466
9467 if (!htab->do_multi_toc)
9468 merge_got_entries (&h->got.glist);
9469
9470 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9471 if (!gent->is_indirect)
411e1bfb
AM
9472 {
9473 /* Make sure this symbol is output as a dynamic symbol.
951fd09b
AM
9474 Undefined weak syms won't yet be marked as dynamic,
9475 nor will all TLS symbols. */
411e1bfb 9476 if (h->dynindx == -1
b099ab9f 9477 && !h->forced_local
25f23106 9478 && h->type != STT_GNU_IFUNC
b099ab9f 9479 && htab->elf.dynamic_sections_created)
411e1bfb 9480 {
c152c796 9481 if (! bfd_elf_link_record_dynamic_symbol (info, h))
411e1bfb
AM
9482 return FALSE;
9483 }
65f38f15 9484
0c8d6e5c 9485 if (!is_ppc64_elf (gent->owner))
927be08e 9486 abort ();
0ffa91dd 9487
927be08e 9488 allocate_got (h, info, gent);
411e1bfb 9489 }
65f38f15 9490
b099ab9f 9491 if (eh->dyn_relocs == NULL
25f23106 9492 || (!htab->elf.dynamic_sections_created
14b5f73f 9493 && h->type != STT_GNU_IFUNC))
b34976b6 9494 return TRUE;
65f38f15
AM
9495
9496 /* In the shared -Bsymbolic case, discard space allocated for
9497 dynamic pc-relative relocs against symbols which turn out to be
9498 defined in regular objects. For the normal shared case, discard
9499 space for relocs that have become local due to symbol visibility
9500 changes. */
9501
9502 if (info->shared)
9503 {
9c7a29a3 9504 /* Relocs that use pc_count are those that appear on a call insn,
1d483afe 9505 or certain REL relocs (see must_be_dyn_reloc) that can be
9c7a29a3
AM
9506 generated via assembly. We want calls to protected symbols to
9507 resolve directly to the function rather than going via the plt.
9508 If people want function pointer comparisons to work as expected
9509 then they should avoid writing weird assembly. */
09695f56 9510 if (SYMBOL_CALLS_LOCAL (info, h))
65f38f15 9511 {
6061a67d 9512 struct elf_dyn_relocs **pp;
65f38f15
AM
9513
9514 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5bd4f169 9515 {
65f38f15
AM
9516 p->count -= p->pc_count;
9517 p->pc_count = 0;
9518 if (p->count == 0)
9519 *pp = p->next;
9520 else
9521 pp = &p->next;
5bd4f169 9522 }
65f38f15 9523 }
4e795f50
AM
9524
9525 /* Also discard relocs on undefined weak syms with non-default
9526 visibility. */
cab87ef9
AM
9527 if (eh->dyn_relocs != NULL
9528 && h->root.type == bfd_link_hash_undefweak)
dfbb6ac9
AM
9529 {
9530 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9531 eh->dyn_relocs = NULL;
9532
9533 /* Make sure this symbol is output as a dynamic symbol.
9534 Undefined weak syms won't yet be marked as dynamic. */
9535 else if (h->dynindx == -1
9536 && !h->forced_local)
9537 {
9538 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9539 return FALSE;
9540 }
9541 }
65f38f15 9542 }
25f23106
AM
9543 else if (h->type == STT_GNU_IFUNC)
9544 {
9545 if (!h->non_got_ref)
9546 eh->dyn_relocs = NULL;
9547 }
f4656909 9548 else if (ELIMINATE_COPY_RELOCS)
65f38f15
AM
9549 {
9550 /* For the non-shared case, discard space for relocs against
9551 symbols which turn out to need copy relocs or are not
9552 dynamic. */
9553
f5385ebf 9554 if (!h->non_got_ref
f5385ebf 9555 && !h->def_regular)
65f38f15
AM
9556 {
9557 /* Make sure this symbol is output as a dynamic symbol.
9558 Undefined weak syms won't yet be marked as dynamic. */
9559 if (h->dynindx == -1
f5385ebf 9560 && !h->forced_local)
65f38f15 9561 {
c152c796 9562 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 9563 return FALSE;
65f38f15
AM
9564 }
9565
9566 /* If that succeeded, we know we'll be keeping all the
9567 relocs. */
9568 if (h->dynindx != -1)
9569 goto keep;
9570 }
9571
9572 eh->dyn_relocs = NULL;
9573
ec338859 9574 keep: ;
65f38f15
AM
9575 }
9576
9577 /* Finally, allocate space. */
9578 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9579 {
9580 asection *sreloc = elf_section_data (p->sec)->sreloc;
19e08130 9581 if (eh->elf.type == STT_GNU_IFUNC)
33e44f2e 9582 sreloc = htab->elf.irelplt;
eea6121a 9583 sreloc->size += p->count * sizeof (Elf64_External_Rela);
65f38f15
AM
9584 }
9585
b34976b6 9586 return TRUE;
65f38f15
AM
9587}
9588
a345bc8d
AM
9589/* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9590 to set up space for global entry stubs. These are put in glink,
9591 after the branch table. */
65f38f15 9592
b34976b6 9593static bfd_boolean
a345bc8d 9594size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
65f38f15 9595{
a345bc8d
AM
9596 struct bfd_link_info *info;
9597 struct ppc_link_hash_table *htab;
9598 struct plt_entry *pent;
9599 asection *s;
65f38f15 9600
a345bc8d
AM
9601 if (h->root.type == bfd_link_hash_indirect)
9602 return TRUE;
65f38f15 9603
a345bc8d
AM
9604 if (!h->pointer_equality_needed)
9605 return TRUE;
65f38f15 9606
a345bc8d
AM
9607 if (h->def_regular)
9608 return TRUE;
65f38f15 9609
a345bc8d
AM
9610 info = inf;
9611 htab = ppc_hash_table (info);
9612 if (htab == NULL)
9613 return FALSE;
9614
9615 s = htab->glink;
9616 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9617 if (pent->plt.offset != (bfd_vma) -1
9618 && pent->addend == 0)
9619 {
afe397ea
AM
9620 /* For ELFv2, if this symbol is not defined in a regular file
9621 and we are not generating a shared library or pie, then we
9622 need to define the symbol in the executable on a call stub.
9623 This is to avoid text relocations. */
a345bc8d 9624 s->size = (s->size + 15) & -16;
afe397ea
AM
9625 h->root.u.def.section = s;
9626 h->root.u.def.value = s->size;
a345bc8d
AM
9627 s->size += 16;
9628 break;
9629 }
9630 return TRUE;
9631}
9632
9633/* Set DF_TEXTREL if we find any dynamic relocs that apply to
9634 read-only sections. */
9635
9636static bfd_boolean
9637maybe_set_textrel (struct elf_link_hash_entry *h, void *info)
9638{
9639 if (h->root.type == bfd_link_hash_indirect)
9640 return TRUE;
9641
9642 if (readonly_dynrelocs (h))
9643 {
9644 ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
9645
9646 /* Not an error, just cut short the traversal. */
9647 return FALSE;
65f38f15 9648 }
b34976b6 9649 return TRUE;
65f38f15
AM
9650}
9651
9652/* Set the sizes of the dynamic sections. */
9653
b34976b6 9654static bfd_boolean
ee67d69a 9655ppc64_elf_size_dynamic_sections (bfd *output_bfd,
4ce794b7 9656 struct bfd_link_info *info)
65f38f15
AM
9657{
9658 struct ppc_link_hash_table *htab;
9659 bfd *dynobj;
9660 asection *s;
b34976b6 9661 bfd_boolean relocs;
65f38f15 9662 bfd *ibfd;
7865406b 9663 struct got_entry *first_tlsld;
65f38f15
AM
9664
9665 htab = ppc_hash_table (info);
4dfe6ac6
NC
9666 if (htab == NULL)
9667 return FALSE;
9668
65f38f15
AM
9669 dynobj = htab->elf.dynobj;
9670 if (dynobj == NULL)
9671 abort ();
9672
9673 if (htab->elf.dynamic_sections_created)
9674 {
9675 /* Set the contents of the .interp section to the interpreter. */
36af4a4e 9676 if (info->executable)
65f38f15 9677 {
3d4d4302 9678 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
9679 if (s == NULL)
9680 abort ();
eea6121a 9681 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
9682 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9683 }
9684 }
9685
9686 /* Set up .got offsets for local syms, and space for local dynamic
9687 relocs. */
c72f2fb2 9688 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
65f38f15 9689 {
411e1bfb
AM
9690 struct got_entry **lgot_ents;
9691 struct got_entry **end_lgot_ents;
e054468f
AM
9692 struct plt_entry **local_plt;
9693 struct plt_entry **end_local_plt;
f961d9dd 9694 unsigned char *lgot_masks;
65f38f15
AM
9695 bfd_size_type locsymcount;
9696 Elf_Internal_Shdr *symtab_hdr;
65f38f15 9697
0c8d6e5c 9698 if (!is_ppc64_elf (ibfd))
65f38f15
AM
9699 continue;
9700
9701 for (s = ibfd->sections; s != NULL; s = s->next)
9702 {
19e08130 9703 struct ppc_dyn_relocs *p;
65f38f15 9704
6edfbbad 9705 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 9706 {
ec338859
AM
9707 if (!bfd_is_abs_section (p->sec)
9708 && bfd_is_abs_section (p->sec->output_section))
9709 {
9710 /* Input section has been discarded, either because
9711 it is a copy of a linkonce section or due to
9712 linker script /DISCARD/, so we'll be discarding
9713 the relocs too. */
9714 }
248866a8 9715 else if (p->count != 0)
ec338859 9716 {
19e08130
AM
9717 asection *srel = elf_section_data (p->sec)->sreloc;
9718 if (p->ifunc)
33e44f2e 9719 srel = htab->elf.irelplt;
eea6121a 9720 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
9721 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9722 info->flags |= DF_TEXTREL;
ec338859 9723 }
65f38f15
AM
9724 }
9725 }
9726
411e1bfb
AM
9727 lgot_ents = elf_local_got_ents (ibfd);
9728 if (!lgot_ents)
65f38f15
AM
9729 continue;
9730
0ffa91dd 9731 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 9732 locsymcount = symtab_hdr->sh_info;
411e1bfb 9733 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
9734 local_plt = (struct plt_entry **) end_lgot_ents;
9735 end_local_plt = local_plt + locsymcount;
f961d9dd 9736 lgot_masks = (unsigned char *) end_local_plt;
e717da7e 9737 s = ppc64_elf_tdata (ibfd)->got;
e7b938ca 9738 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 9739 {
0b8bcf0d 9740 struct got_entry **pent, *ent;
411e1bfb 9741
0b8bcf0d
AM
9742 pent = lgot_ents;
9743 while ((ent = *pent) != NULL)
411e1bfb
AM
9744 if (ent->got.refcount > 0)
9745 {
e7b938ca 9746 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 9747 {
927be08e 9748 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 9749 *pent = ent->next;
411e1bfb
AM
9750 }
9751 else
9752 {
19e08130
AM
9753 unsigned int ent_size = 8;
9754 unsigned int rel_size = sizeof (Elf64_External_Rela);
9755
eea6121a 9756 ent->got.offset = s->size;
e7b938ca 9757 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 9758 {
19e08130
AM
9759 ent_size *= 2;
9760 rel_size *= 2;
9761 }
9762 s->size += ent_size;
9763 if ((*lgot_masks & PLT_IFUNC) != 0)
9764 {
33e44f2e 9765 htab->elf.irelplt->size += rel_size;
19e08130
AM
9766 htab->got_reli_size += rel_size;
9767 }
9768 else if (info->shared)
9769 {
9770 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9771 srel->size += rel_size;
927be08e 9772 }
0b8bcf0d 9773 pent = &ent->next;
411e1bfb
AM
9774 }
9775 }
9776 else
0b8bcf0d 9777 *pent = ent->next;
65f38f15 9778 }
e054468f
AM
9779
9780 /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
9781 for (; local_plt < end_local_plt; ++local_plt)
9782 {
9783 struct plt_entry *ent;
9784
9785 for (ent = *local_plt; ent != NULL; ent = ent->next)
9786 if (ent->plt.refcount > 0)
9787 {
33e44f2e 9788 s = htab->elf.iplt;
e054468f 9789 ent->plt.offset = s->size;
b9e5796b 9790 s->size += PLT_ENTRY_SIZE (htab);
e054468f 9791
33e44f2e 9792 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
e054468f
AM
9793 }
9794 else
9795 ent->plt.offset = (bfd_vma) -1;
9796 }
65f38f15
AM
9797 }
9798
9799 /* Allocate global sym .plt and .got entries, and space for global
9800 sym dynamic relocs. */
4ce794b7 9801 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
a345bc8d
AM
9802 /* Stash the end of glink branch table. */
9803 if (htab->glink != NULL)
9804 htab->glink->rawsize = htab->glink->size;
9805
9806 if (!htab->opd_abi && !info->shared)
9807 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
65f38f15 9808
7865406b 9809 first_tlsld = NULL;
c72f2fb2 9810 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
102890f0 9811 {
7865406b
AM
9812 struct got_entry *ent;
9813
0c8d6e5c 9814 if (!is_ppc64_elf (ibfd))
102890f0
AM
9815 continue;
9816
7865406b
AM
9817 ent = ppc64_tlsld_got (ibfd);
9818 if (ent->got.refcount > 0)
102890f0 9819 {
7865406b 9820 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 9821 {
7865406b
AM
9822 ent->is_indirect = TRUE;
9823 ent->got.ent = first_tlsld;
9824 }
9825 else
9826 {
9827 if (first_tlsld == NULL)
9828 first_tlsld = ent;
9829 s = ppc64_elf_tdata (ibfd)->got;
9830 ent->got.offset = s->size;
9831 ent->owner = ibfd;
9832 s->size += 16;
9833 if (info->shared)
9834 {
9835 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9836 srel->size += sizeof (Elf64_External_Rela);
9837 }
102890f0
AM
9838 }
9839 }
9840 else
7865406b 9841 ent->got.offset = (bfd_vma) -1;
102890f0
AM
9842 }
9843
65f38f15
AM
9844 /* We now have determined the sizes of the various dynamic sections.
9845 Allocate memory for them. */
b34976b6 9846 relocs = FALSE;
65f38f15
AM
9847 for (s = dynobj->sections; s != NULL; s = s->next)
9848 {
9849 if ((s->flags & SEC_LINKER_CREATED) == 0)
9850 continue;
9851
4ce794b7 9852 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
9853 /* These haven't been allocated yet; don't strip. */
9854 continue;
33e44f2e
AM
9855 else if (s == htab->elf.sgot
9856 || s == htab->elf.splt
9857 || s == htab->elf.iplt
c456f082
AM
9858 || s == htab->glink
9859 || s == htab->dynbss)
65f38f15
AM
9860 {
9861 /* Strip this section if we don't need it; see the
9862 comment below. */
5bd4f169 9863 }
58d180e8
AM
9864 else if (s == htab->glink_eh_frame)
9865 {
9866 if (!bfd_is_abs_section (s->output_section))
9867 /* Not sized yet. */
9868 continue;
9869 }
70cc837d 9870 else if (CONST_STRNEQ (s->name, ".rela"))
5bd4f169 9871 {
c456f082 9872 if (s->size != 0)
5bd4f169 9873 {
33e44f2e 9874 if (s != htab->elf.srelplt)
b34976b6 9875 relocs = TRUE;
5bd4f169
AM
9876
9877 /* We use the reloc_count field as a counter if we need
9878 to copy relocs into the output file. */
9879 s->reloc_count = 0;
9880 }
9881 }
65f38f15 9882 else
5bd4f169
AM
9883 {
9884 /* It's not one of our sections, so don't allocate space. */
9885 continue;
9886 }
9887
eea6121a 9888 if (s->size == 0)
5bd4f169 9889 {
c456f082
AM
9890 /* If we don't need this section, strip it from the
9891 output file. This is mostly to handle .rela.bss and
9892 .rela.plt. We must create both sections in
9893 create_dynamic_sections, because they must be created
9894 before the linker maps input sections to output
9895 sections. The linker does that before
9896 adjust_dynamic_symbol is called, and it is that
9897 function which decides whether anything needs to go
9898 into these sections. */
8423293d 9899 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
9900 continue;
9901 }
9902
c456f082 9903 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
9904 continue;
9905
65f38f15
AM
9906 /* Allocate memory for the section contents. We use bfd_zalloc
9907 here in case unused entries are not reclaimed before the
9908 section's contents are written out. This should not happen,
411e1bfb
AM
9909 but this way if it does we get a R_PPC64_NONE reloc in .rela
9910 sections instead of garbage.
9911 We also rely on the section contents being zero when writing
9912 the GOT. */
eea6121a 9913 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 9914 if (s->contents == NULL)
b34976b6 9915 return FALSE;
5bd4f169
AM
9916 }
9917
c72f2fb2 9918 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
e717da7e 9919 {
0c8d6e5c 9920 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
9921 continue;
9922
e717da7e 9923 s = ppc64_elf_tdata (ibfd)->got;
33e44f2e 9924 if (s != NULL && s != htab->elf.sgot)
e717da7e 9925 {
eea6121a 9926 if (s->size == 0)
8423293d 9927 s->flags |= SEC_EXCLUDE;
e717da7e
AM
9928 else
9929 {
eea6121a 9930 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
9931 if (s->contents == NULL)
9932 return FALSE;
9933 }
9934 }
9935 s = ppc64_elf_tdata (ibfd)->relgot;
9936 if (s != NULL)
9937 {
eea6121a 9938 if (s->size == 0)
8423293d 9939 s->flags |= SEC_EXCLUDE;
e717da7e
AM
9940 else
9941 {
eea6121a 9942 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
9943 if (s->contents == NULL)
9944 return FALSE;
9945 relocs = TRUE;
9946 s->reloc_count = 0;
9947 }
9948 }
9949 }
9950
e86ce104 9951 if (htab->elf.dynamic_sections_created)
5bd4f169 9952 {
e8910a83
AM
9953 bfd_boolean tls_opt;
9954
5bd4f169
AM
9955 /* Add some entries to the .dynamic section. We fill in the
9956 values later, in ppc64_elf_finish_dynamic_sections, but we
9957 must add the entries now so that we get the correct size for
9958 the .dynamic section. The DT_DEBUG entry is filled in by the
9959 dynamic linker and used by the debugger. */
dc810e39 9960#define add_dynamic_entry(TAG, VAL) \
5a580b3a 9961 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 9962
36af4a4e 9963 if (info->executable)
5bd4f169 9964 {
dc810e39 9965 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 9966 return FALSE;
5bd4f169
AM
9967 }
9968
33e44f2e 9969 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5bd4f169 9970 {
dc810e39
AM
9971 if (!add_dynamic_entry (DT_PLTGOT, 0)
9972 || !add_dynamic_entry (DT_PLTRELSZ, 0)
9973 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
9974 || !add_dynamic_entry (DT_JMPREL, 0)
9975 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 9976 return FALSE;
5bd4f169
AM
9977 }
9978
ee67d69a 9979 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
9980 {
9981 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
9982 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 9983 return FALSE;
19397422
AM
9984 }
9985
e7d1c40c 9986 tls_opt = (!htab->params->no_tls_get_addr_opt
e8910a83
AM
9987 && htab->tls_get_addr_fd != NULL
9988 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
9989 if (tls_opt || !htab->opd_abi)
9990 {
9991 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
9992 return FALSE;
9993 }
a7f2871e 9994
5bd4f169
AM
9995 if (relocs)
9996 {
dc810e39
AM
9997 if (!add_dynamic_entry (DT_RELA, 0)
9998 || !add_dynamic_entry (DT_RELASZ, 0)
9999 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 10000 return FALSE;
5bd4f169 10001
65f38f15
AM
10002 /* If any dynamic relocs apply to a read-only section,
10003 then we need a DT_TEXTREL entry. */
248866a8 10004 if ((info->flags & DF_TEXTREL) == 0)
a345bc8d 10005 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
5bd4f169 10006
65f38f15 10007 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 10008 {
65f38f15 10009 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 10010 return FALSE;
5bd4f169 10011 }
5bd4f169 10012 }
5bd4f169 10013 }
65f38f15 10014#undef add_dynamic_entry
5bd4f169 10015
b34976b6 10016 return TRUE;
5bd4f169
AM
10017}
10018
a345bc8d
AM
10019/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10020
10021static bfd_boolean
10022ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10023{
10024 if (h->plt.plist != NULL
10025 && !h->def_regular
10026 && !h->pointer_equality_needed)
10027 return FALSE;
10028
10029 return _bfd_elf_hash_symbol (h);
10030}
10031
721956f4 10032/* Determine the type of stub needed, if any, for a call. */
5bd4f169 10033
4ce794b7
AM
10034static inline enum ppc_stub_type
10035ppc_type_of_stub (asection *input_sec,
10036 const Elf_Internal_Rela *rel,
10037 struct ppc_link_hash_entry **hash,
e054468f 10038 struct plt_entry **plt_ent,
6911b7dc
AM
10039 bfd_vma destination,
10040 unsigned long local_off)
5bd4f169 10041{
721956f4
AM
10042 struct ppc_link_hash_entry *h = *hash;
10043 bfd_vma location;
10044 bfd_vma branch_offset;
10045 bfd_vma max_branch_offset;
4ce794b7 10046 enum elf_ppc64_reloc_type r_type;
5bd4f169 10047
721956f4
AM
10048 if (h != NULL)
10049 {
e054468f 10050 struct plt_entry *ent;
7fe2b9a6 10051 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
10052 if (h->oh != NULL
10053 && h->oh->is_func_descriptor)
7b8f6675
AM
10054 {
10055 fdh = ppc_follow_link (h->oh);
10056 *hash = fdh;
10057 }
8387904d 10058
e054468f
AM
10059 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10060 if (ent->addend == rel->r_addend
10061 && ent->plt.offset != (bfd_vma) -1)
10062 {
e054468f
AM
10063 *plt_ent = ent;
10064 return ppc_stub_plt_call;
10065 }
5bd4f169 10066
7fe2b9a6
AM
10067 /* Here, we know we don't have a plt entry. If we don't have a
10068 either a defined function descriptor or a defined entry symbol
10069 in a regular object file, then it is pointless trying to make
10070 any other type of stub. */
854b41e7
AM
10071 if (!is_static_defined (&fdh->elf)
10072 && !is_static_defined (&h->elf))
721956f4 10073 return ppc_stub_none;
5d1634d7 10074 }
e054468f
AM
10075 else if (elf_local_got_ents (input_sec->owner) != NULL)
10076 {
10077 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10078 struct plt_entry **local_plt = (struct plt_entry **)
10079 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10080 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10081
10082 if (local_plt[r_symndx] != NULL)
10083 {
10084 struct plt_entry *ent;
10085
10086 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10087 if (ent->addend == rel->r_addend
10088 && ent->plt.offset != (bfd_vma) -1)
10089 {
10090 *plt_ent = ent;
10091 return ppc_stub_plt_call;
10092 }
10093 }
10094 }
5d1634d7 10095
721956f4
AM
10096 /* Determine where the call point is. */
10097 location = (input_sec->output_offset
10098 + input_sec->output_section->vma
10099 + rel->r_offset);
5d1634d7 10100
721956f4
AM
10101 branch_offset = destination - location;
10102 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 10103
721956f4
AM
10104 /* Determine if a long branch stub is needed. */
10105 max_branch_offset = 1 << 25;
4ce794b7 10106 if (r_type != R_PPC64_REL24)
721956f4 10107 max_branch_offset = 1 << 15;
5d1634d7 10108
6911b7dc 10109 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
721956f4
AM
10110 /* We need a stub. Figure out whether a long_branch or plt_branch
10111 is needed later. */
10112 return ppc_stub_long_branch;
5d1634d7 10113
721956f4 10114 return ppc_stub_none;
5d1634d7
AM
10115}
10116
794e51c0
AM
10117/* With power7 weakly ordered memory model, it is possible for ld.so
10118 to update a plt entry in one thread and have another thread see a
10119 stale zero toc entry. To avoid this we need some sort of acquire
10120 barrier in the call stub. One solution is to make the load of the
10121 toc word seem to appear to depend on the load of the function entry
10122 word. Another solution is to test for r2 being zero, and branch to
10123 the appropriate glink entry if so.
10124
10125 . fake dep barrier compare
71a39c98
AM
10126 . ld 12,xxx(2) ld 12,xxx(2)
10127 . mtctr 12 mtctr 12
10128 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
10129 . add 2,2,11 cmpldi 2,0
10130 . ld 2,xxx+8(2) bnectr+
10131 . bctr b <glink_entry>
10132
10133 The solution involving the compare turns out to be faster, so
10134 that's what we use unless the branch won't reach. */
10135
10136#define ALWAYS_USE_FAKE_DEP 0
10137#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 10138
5d1634d7
AM
10139#define PPC_LO(v) ((v) & 0xffff)
10140#define PPC_HI(v) (((v) >> 16) & 0xffff)
10141#define PPC_HA(v) PPC_HI ((v) + 0x8000)
10142
794e51c0
AM
10143static inline unsigned int
10144plt_stub_size (struct ppc_link_hash_table *htab,
10145 struct ppc_stub_hash_entry *stub_entry,
10146 bfd_vma off)
10147{
b9e5796b
AM
10148 unsigned size = 12;
10149
10150 if (ALWAYS_EMIT_R2SAVE
10151 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10152 size += 4;
10153 if (PPC_HA (off) != 0)
794e51c0 10154 size += 4;
b9e5796b
AM
10155 if (htab->opd_abi)
10156 {
10157 size += 4;
e7d1c40c 10158 if (htab->params->plt_static_chain)
b9e5796b 10159 size += 4;
e7d1c40c 10160 if (htab->params->plt_thread_safe)
b9e5796b 10161 size += 8;
e7d1c40c 10162 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
b9e5796b
AM
10163 size += 4;
10164 }
794e51c0
AM
10165 if (stub_entry->h != NULL
10166 && (stub_entry->h == htab->tls_get_addr_fd
10167 || stub_entry->h == htab->tls_get_addr)
e7d1c40c 10168 && !htab->params->no_tls_get_addr_opt)
794e51c0
AM
10169 size += 13 * 4;
10170 return size;
10171}
10172
10173/* If this stub would cross fewer 2**plt_stub_align boundaries if we align,
10174 then return the padding needed to do so. */
10175static inline unsigned int
10176plt_stub_pad (struct ppc_link_hash_table *htab,
10177 struct ppc_stub_hash_entry *stub_entry,
10178 bfd_vma plt_off)
10179{
e7d1c40c 10180 int stub_align = 1 << htab->params->plt_stub_align;
794e51c0
AM
10181 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
10182 bfd_vma stub_off = stub_entry->stub_sec->size;
10183
10184 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
10185 > (stub_size & -stub_align))
10186 return stub_align - (stub_off & (stub_align - 1));
10187 return 0;
10188}
10189
10190/* Build a .plt call stub. */
10191
10192static inline bfd_byte *
10193build_plt_stub (struct ppc_link_hash_table *htab,
10194 struct ppc_stub_hash_entry *stub_entry,
10195 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10196{
e7d1c40c 10197 bfd *obfd = htab->params->stub_bfd;
b9e5796b 10198 bfd_boolean plt_load_toc = htab->opd_abi;
e7d1c40c
AM
10199 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
10200 bfd_boolean plt_thread_safe = htab->params->plt_thread_safe;
794e51c0
AM
10201 bfd_boolean use_fake_dep = plt_thread_safe;
10202 bfd_vma cmp_branch_off = 0;
10203
10204 if (!ALWAYS_USE_FAKE_DEP
b9e5796b 10205 && plt_load_toc
794e51c0
AM
10206 && plt_thread_safe
10207 && !(stub_entry->h != NULL
10208 && (stub_entry->h == htab->tls_get_addr_fd
10209 || stub_entry->h == htab->tls_get_addr)
e7d1c40c 10210 && !htab->params->no_tls_get_addr_opt))
794e51c0
AM
10211 {
10212 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
b9e5796b
AM
10213 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10214 / PLT_ENTRY_SIZE (htab));
794e51c0
AM
10215 bfd_vma glinkoff = GLINK_CALL_STUB_SIZE + pltindex * 8;
10216 bfd_vma to, from;
10217
68d62958
AM
10218 if (pltindex > 32768)
10219 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
10220 to = (glinkoff
10221 + htab->glink->output_offset
10222 + htab->glink->output_section->vma);
10223 from = (p - stub_entry->stub_sec->contents
10224 + 4 * (ALWAYS_EMIT_R2SAVE
10225 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10226 + 4 * (PPC_HA (offset) != 0)
10227 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10228 != PPC_HA (offset))
10229 + 4 * (plt_static_chain != 0)
10230 + 20
10231 + stub_entry->stub_sec->output_offset
10232 + stub_entry->stub_sec->output_section->vma);
10233 cmp_branch_off = to - from;
10234 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10235 }
10236
ac2df442
AM
10237 if (PPC_HA (offset) != 0)
10238 {
176a0d42
AM
10239 if (r != NULL)
10240 {
794e51c0
AM
10241 if (ALWAYS_EMIT_R2SAVE
10242 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10243 r[0].r_offset += 4;
176a0d42 10244 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 10245 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
10246 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10247 r[1].r_addend = r[0].r_addend;
b9e5796b 10248 if (plt_load_toc)
176a0d42 10249 {
b9e5796b 10250 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10251 {
b9e5796b
AM
10252 r[2].r_offset = r[1].r_offset + 4;
10253 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10254 r[2].r_addend = r[0].r_addend;
10255 }
10256 else
10257 {
10258 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10259 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10260 r[2].r_addend = r[0].r_addend + 8;
10261 if (plt_static_chain)
10262 {
10263 r[3].r_offset = r[2].r_offset + 4;
10264 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10265 r[3].r_addend = r[0].r_addend + 16;
10266 }
c7131b65 10267 }
176a0d42
AM
10268 }
10269 }
794e51c0
AM
10270 if (ALWAYS_EMIT_R2SAVE
10271 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10272 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
397998fc
AM
10273 if (plt_load_toc)
10274 {
10275 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10276 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10277 }
10278 else
10279 {
10280 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10281 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10282 }
b9e5796b
AM
10283 if (plt_load_toc
10284 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 10285 {
71a39c98 10286 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
10287 offset = 0;
10288 }
71a39c98 10289 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10290 if (plt_load_toc)
794e51c0 10291 {
b9e5796b
AM
10292 if (use_fake_dep)
10293 {
10294 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10295 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10296 }
10297 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10298 if (plt_static_chain)
10299 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
794e51c0 10300 }
ac2df442
AM
10301 }
10302 else
10303 {
176a0d42
AM
10304 if (r != NULL)
10305 {
794e51c0
AM
10306 if (ALWAYS_EMIT_R2SAVE
10307 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10308 r[0].r_offset += 4;
176a0d42 10309 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
b9e5796b 10310 if (plt_load_toc)
176a0d42 10311 {
b9e5796b 10312 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10313 {
b9e5796b
AM
10314 r[1].r_offset = r[0].r_offset + 4;
10315 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10316 r[1].r_addend = r[0].r_addend;
10317 }
10318 else
10319 {
10320 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10321 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10322 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10323 if (plt_static_chain)
10324 {
10325 r[2].r_offset = r[1].r_offset + 4;
10326 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10327 r[2].r_addend = r[0].r_addend + 8;
10328 }
c7131b65 10329 }
176a0d42
AM
10330 }
10331 }
794e51c0
AM
10332 if (ALWAYS_EMIT_R2SAVE
10333 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10334 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
71a39c98 10335 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
b9e5796b
AM
10336 if (plt_load_toc
10337 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
10338 {
10339 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10340 offset = 0;
10341 }
71a39c98 10342 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10343 if (plt_load_toc)
794e51c0 10344 {
b9e5796b
AM
10345 if (use_fake_dep)
10346 {
10347 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10348 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10349 }
10350 if (plt_static_chain)
10351 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10352 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
794e51c0 10353 }
ac2df442 10354 }
b9e5796b 10355 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
794e51c0
AM
10356 {
10357 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10358 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 10359 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
10360 }
10361 else
10362 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
10363 return p;
10364}
10365
a7f2871e
AM
10366/* Build a special .plt call stub for __tls_get_addr. */
10367
10368#define LD_R11_0R3 0xe9630000
10369#define LD_R12_0R3 0xe9830000
10370#define MR_R0_R3 0x7c601b78
10371#define CMPDI_R11_0 0x2c2b0000
10372#define ADD_R3_R12_R13 0x7c6c6a14
10373#define BEQLR 0x4d820020
10374#define MR_R3_R0 0x7c030378
a7f2871e
AM
10375#define STD_R11_0R1 0xf9610000
10376#define BCTRL 0x4e800421
10377#define LD_R11_0R1 0xe9610000
a7f2871e
AM
10378#define MTLR_R11 0x7d6803a6
10379
10380static inline bfd_byte *
794e51c0
AM
10381build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10382 struct ppc_stub_hash_entry *stub_entry,
10383 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 10384{
e7d1c40c 10385 bfd *obfd = htab->params->stub_bfd;
794e51c0 10386
a7f2871e
AM
10387 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10388 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10389 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10390 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10391 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10392 bfd_put_32 (obfd, BEQLR, p), p += 4;
10393 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
10394 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
a078d95a 10395 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
10396
10397 if (r != NULL)
10398 r[0].r_offset += 9 * 4;
794e51c0 10399 p = build_plt_stub (htab, stub_entry, p, offset, r);
a7f2871e
AM
10400 bfd_put_32 (obfd, BCTRL, p - 4);
10401
a078d95a
AM
10402 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10403 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
a7f2871e
AM
10404 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10405 bfd_put_32 (obfd, BLR, p), p += 4;
10406
10407 return p;
10408}
10409
176a0d42
AM
10410static Elf_Internal_Rela *
10411get_relocs (asection *sec, int count)
10412{
10413 Elf_Internal_Rela *relocs;
10414 struct bfd_elf_section_data *elfsec_data;
10415
10416 elfsec_data = elf_section_data (sec);
10417 relocs = elfsec_data->relocs;
10418 if (relocs == NULL)
10419 {
10420 bfd_size_type relsize;
10421 relsize = sec->reloc_count * sizeof (*relocs);
10422 relocs = bfd_alloc (sec->owner, relsize);
10423 if (relocs == NULL)
10424 return NULL;
10425 elfsec_data->relocs = relocs;
d4730f92
BS
10426 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10427 sizeof (Elf_Internal_Shdr));
10428 if (elfsec_data->rela.hdr == NULL)
10429 return NULL;
10430 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10431 * sizeof (Elf64_External_Rela));
10432 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
10433 sec->reloc_count = 0;
10434 }
10435 relocs += sec->reloc_count;
10436 sec->reloc_count += count;
10437 return relocs;
10438}
10439
aa374f67 10440static bfd_vma
25f53a85 10441get_r2off (struct bfd_link_info *info,
aa374f67
AM
10442 struct ppc_stub_hash_entry *stub_entry)
10443{
25f53a85 10444 struct ppc_link_hash_table *htab = ppc_hash_table (info);
aa374f67
AM
10445 bfd_vma r2off = htab->stub_group[stub_entry->target_section->id].toc_off;
10446
10447 if (r2off == 0)
10448 {
10449 /* Support linking -R objects. Get the toc pointer from the
10450 opd entry. */
10451 char buf[8];
b9e5796b
AM
10452 if (!htab->opd_abi)
10453 return r2off;
aa374f67
AM
10454 asection *opd = stub_entry->h->elf.root.u.def.section;
10455 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
10456
10457 if (strcmp (opd->name, ".opd") != 0
10458 || opd->reloc_count != 0)
10459 {
bc30df16 10460 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%T'\n"),
25f53a85 10461 stub_entry->h->elf.root.root.string);
aa374f67
AM
10462 bfd_set_error (bfd_error_bad_value);
10463 return 0;
10464 }
10465 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
10466 return 0;
10467 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 10468 r2off -= elf_gp (info->output_bfd);
aa374f67
AM
10469 }
10470 r2off -= htab->stub_group[stub_entry->id_sec->id].toc_off;
10471 return r2off;
10472}
10473
b34976b6 10474static bfd_boolean
4ce794b7 10475ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 10476{
721956f4
AM
10477 struct ppc_stub_hash_entry *stub_entry;
10478 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
10479 struct bfd_link_info *info;
10480 struct ppc_link_hash_table *htab;
721956f4
AM
10481 bfd_byte *loc;
10482 bfd_byte *p;
ee75fd95 10483 bfd_vma dest, off;
721956f4 10484 int size;
176a0d42 10485 Elf_Internal_Rela *r;
e054468f 10486 asection *plt;
5d1634d7 10487
721956f4
AM
10488 /* Massage our args to the form they really have. */
10489 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 10490 info = in_arg;
5d1634d7 10491
5d1634d7 10492 htab = ppc_hash_table (info);
4dfe6ac6
NC
10493 if (htab == NULL)
10494 return FALSE;
5d1634d7 10495
721956f4 10496 /* Make a note of the offset within the stubs for this entry. */
eea6121a 10497 stub_entry->stub_offset = stub_entry->stub_sec->size;
97b639ba 10498 loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
721956f4 10499
4ce794b7 10500 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 10501 switch (stub_entry->stub_type)
5d1634d7 10502 {
721956f4 10503 case ppc_stub_long_branch:
ad8e1ba5 10504 case ppc_stub_long_branch_r2off:
721956f4 10505 /* Branches are relative. This is where we are going to. */
6911b7dc
AM
10506 dest = (stub_entry->target_value
10507 + stub_entry->target_section->output_offset
10508 + stub_entry->target_section->output_section->vma);
10509 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10510 off = dest;
5d1634d7 10511
721956f4
AM
10512 /* And this is where we are coming from. */
10513 off -= (stub_entry->stub_offset
97b639ba
AM
10514 + stub_entry->stub_sec->output_offset
10515 + stub_entry->stub_sec->output_section->vma);
e86ce104 10516
ac2df442
AM
10517 size = 4;
10518 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 10519 {
25f53a85 10520 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 10521
aa374f67
AM
10522 if (r2off == 0)
10523 {
10524 htab->stub_error = TRUE;
10525 return FALSE;
10526 }
e7d1c40c 10527 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
ad8e1ba5 10528 loc += 4;
ac2df442
AM
10529 size = 12;
10530 if (PPC_HA (r2off) != 0)
10531 {
10532 size = 16;
e7d1c40c
AM
10533 bfd_put_32 (htab->params->stub_bfd,
10534 ADDIS_R2_R2 | PPC_HA (r2off), loc);
ac2df442
AM
10535 loc += 4;
10536 }
e7d1c40c 10537 bfd_put_32 (htab->params->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
ad8e1ba5 10538 loc += 4;
ac2df442 10539 off -= size - 4;
ad8e1ba5 10540 }
e7d1c40c 10541 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
ad8e1ba5 10542
5c3dead3
AM
10543 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10544 {
bc30df16
AM
10545 info->callbacks->einfo
10546 (_("%P: long branch stub `%s' offset overflow\n"),
10547 stub_entry->root.string);
5c3dead3
AM
10548 htab->stub_error = TRUE;
10549 return FALSE;
10550 }
ee75fd95
AM
10551
10552 if (info->emitrelocations)
10553 {
176a0d42
AM
10554 r = get_relocs (stub_entry->stub_sec, 1);
10555 if (r == NULL)
10556 return FALSE;
ee75fd95
AM
10557 r->r_offset = loc - stub_entry->stub_sec->contents;
10558 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
10559 r->r_addend = dest;
10560 if (stub_entry->h != NULL)
10561 {
10562 struct elf_link_hash_entry **hashes;
10563 unsigned long symndx;
10564 struct ppc_link_hash_entry *h;
10565
e7d1c40c 10566 hashes = elf_sym_hashes (htab->params->stub_bfd);
ee75fd95
AM
10567 if (hashes == NULL)
10568 {
10569 bfd_size_type hsize;
10570
10571 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
e7d1c40c 10572 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
ee75fd95
AM
10573 if (hashes == NULL)
10574 return FALSE;
e7d1c40c 10575 elf_sym_hashes (htab->params->stub_bfd) = hashes;
ee75fd95
AM
10576 htab->stub_globals = 1;
10577 }
10578 symndx = htab->stub_globals++;
10579 h = stub_entry->h;
10580 hashes[symndx] = &h->elf;
10581 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
10582 if (h->oh != NULL && h->oh->is_func)
b31867b6 10583 h = ppc_follow_link (h->oh);
ee75fd95
AM
10584 if (h->elf.root.u.def.section != stub_entry->target_section)
10585 /* H is an opd symbol. The addend must be zero. */
10586 r->r_addend = 0;
10587 else
10588 {
10589 off = (h->elf.root.u.def.value
10590 + h->elf.root.u.def.section->output_offset
10591 + h->elf.root.u.def.section->output_section->vma);
10592 r->r_addend -= off;
10593 }
10594 }
10595 }
721956f4 10596 break;
e86ce104 10597
721956f4 10598 case ppc_stub_plt_branch:
ad8e1ba5 10599 case ppc_stub_plt_branch_r2off:
721956f4
AM
10600 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10601 stub_entry->root.string + 9,
b34976b6 10602 FALSE, FALSE);
721956f4
AM
10603 if (br_entry == NULL)
10604 {
8de848d8 10605 info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
25f53a85 10606 stub_entry->root.string);
b34976b6
AM
10607 htab->stub_error = TRUE;
10608 return FALSE;
721956f4
AM
10609 }
10610
176a0d42
AM
10611 dest = (stub_entry->target_value
10612 + stub_entry->target_section->output_offset
10613 + stub_entry->target_section->output_section->vma);
6911b7dc
AM
10614 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10615 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 10616
176a0d42 10617 bfd_put_64 (htab->brlt->owner, dest,
4ce794b7 10618 htab->brlt->contents + br_entry->offset);
721956f4 10619
f94498ff 10620 if (br_entry->iter == htab->stub_iteration)
721956f4 10621 {
f94498ff 10622 br_entry->iter = 0;
84f5d08e 10623
f94498ff 10624 if (htab->relbrlt != NULL)
84f5d08e 10625 {
f94498ff
AM
10626 /* Create a reloc for the branch lookup table entry. */
10627 Elf_Internal_Rela rela;
10628 bfd_byte *rl;
10629
10630 rela.r_offset = (br_entry->offset
10631 + htab->brlt->output_offset
10632 + htab->brlt->output_section->vma);
10633 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
176a0d42 10634 rela.r_addend = dest;
f94498ff
AM
10635
10636 rl = htab->relbrlt->contents;
10637 rl += (htab->relbrlt->reloc_count++
10638 * sizeof (Elf64_External_Rela));
10639 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
10640 }
10641 else if (info->emitrelocations)
10642 {
176a0d42
AM
10643 r = get_relocs (htab->brlt, 1);
10644 if (r == NULL)
10645 return FALSE;
10646 /* brlt, being SEC_LINKER_CREATED does not go through the
10647 normal reloc processing. Symbols and offsets are not
10648 translated from input file to output file form, so
10649 set up the offset per the output file. */
f94498ff
AM
10650 r->r_offset = (br_entry->offset
10651 + htab->brlt->output_offset
10652 + htab->brlt->output_section->vma);
10653 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
176a0d42 10654 r->r_addend = dest;
84f5d08e 10655 }
84f5d08e 10656 }
721956f4 10657
176a0d42
AM
10658 dest = (br_entry->offset
10659 + htab->brlt->output_offset
10660 + htab->brlt->output_section->vma);
10661
10662 off = (dest
4ce794b7 10663 - elf_gp (htab->brlt->output_section->owner)
ad8e1ba5 10664 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 10665
ad8e1ba5 10666 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 10667 {
25f53a85 10668 info->callbacks->einfo
bc30df16 10669 (_("%P: linkage table error against `%T'\n"),
721956f4 10670 stub_entry->root.string);
5d1634d7 10671 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
10672 htab->stub_error = TRUE;
10673 return FALSE;
5d1634d7 10674 }
41bd81ab 10675
176a0d42
AM
10676 if (info->emitrelocations)
10677 {
10678 r = get_relocs (stub_entry->stub_sec, 1 + (PPC_HA (off) != 0));
10679 if (r == NULL)
10680 return FALSE;
10681 r[0].r_offset = loc - stub_entry->stub_sec->contents;
7cfbafbc
AM
10682 if (bfd_big_endian (info->output_bfd))
10683 r[0].r_offset += 2;
00f412ee 10684 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
176a0d42
AM
10685 r[0].r_offset += 4;
10686 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10687 r[0].r_addend = dest;
10688 if (PPC_HA (off) != 0)
10689 {
10690 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10691 r[1].r_offset = r[0].r_offset + 4;
10692 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10693 r[1].r_addend = r[0].r_addend;
10694 }
10695 }
10696
00f412ee 10697 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ad8e1ba5 10698 {
176a0d42 10699 if (PPC_HA (off) != 0)
ac2df442
AM
10700 {
10701 size = 16;
e7d1c40c 10702 bfd_put_32 (htab->params->stub_bfd,
397998fc 10703 ADDIS_R12_R2 | PPC_HA (off), loc);
ac2df442 10704 loc += 4;
e7d1c40c 10705 bfd_put_32 (htab->params->stub_bfd,
397998fc 10706 LD_R12_0R12 | PPC_LO (off), loc);
ac2df442
AM
10707 }
10708 else
10709 {
10710 size = 12;
e7d1c40c
AM
10711 bfd_put_32 (htab->params->stub_bfd,
10712 LD_R12_0R2 | PPC_LO (off), loc);
ac2df442 10713 }
ad8e1ba5
AM
10714 }
10715 else
10716 {
25f53a85 10717 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 10718
00f412ee 10719 if (r2off == 0 && htab->opd_abi)
aa374f67
AM
10720 {
10721 htab->stub_error = TRUE;
10722 return FALSE;
10723 }
ad8e1ba5 10724
e7d1c40c 10725 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
ad8e1ba5 10726 loc += 4;
00f412ee 10727 size = 16;
176a0d42 10728 if (PPC_HA (off) != 0)
ac2df442
AM
10729 {
10730 size += 4;
e7d1c40c 10731 bfd_put_32 (htab->params->stub_bfd,
397998fc 10732 ADDIS_R12_R2 | PPC_HA (off), loc);
ac2df442 10733 loc += 4;
e7d1c40c 10734 bfd_put_32 (htab->params->stub_bfd,
397998fc 10735 LD_R12_0R12 | PPC_LO (off), loc);
ac2df442
AM
10736 }
10737 else
e7d1c40c 10738 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
ac2df442
AM
10739
10740 if (PPC_HA (r2off) != 0)
10741 {
10742 size += 4;
00f412ee 10743 loc += 4;
e7d1c40c
AM
10744 bfd_put_32 (htab->params->stub_bfd,
10745 ADDIS_R2_R2 | PPC_HA (r2off), loc);
00f412ee
AM
10746 }
10747 if (PPC_LO (r2off) != 0)
10748 {
10749 size += 4;
ac2df442 10750 loc += 4;
e7d1c40c
AM
10751 bfd_put_32 (htab->params->stub_bfd,
10752 ADDI_R2_R2 | PPC_LO (r2off), loc);
ac2df442 10753 }
ad8e1ba5
AM
10754 }
10755 loc += 4;
e7d1c40c 10756 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, loc);
ad8e1ba5 10757 loc += 4;
e7d1c40c 10758 bfd_put_32 (htab->params->stub_bfd, BCTR, loc);
721956f4 10759 break;
5d1634d7 10760
721956f4 10761 case ppc_stub_plt_call:
794e51c0 10762 case ppc_stub_plt_call_r2save:
e054468f 10763 if (stub_entry->h != NULL
b31867b6
AM
10764 && stub_entry->h->is_func_descriptor
10765 && stub_entry->h->oh != NULL)
c862ae31 10766 {
b31867b6
AM
10767 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
10768
10769 /* If the old-ABI "dot-symbol" is undefined make it weak so
10770 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL.
10771 FIXME: We used to define the symbol on one of the call
10772 stubs instead, which is why we test symbol section id
10773 against htab->top_id in various places. Likely all
10774 these checks could now disappear. */
10775 if (fh->elf.root.type == bfd_link_hash_undefined)
10776 fh->elf.root.type = bfd_link_hash_undefweak;
9507a174
AM
10777 /* Stop undo_symbol_twiddle changing it back to undefined. */
10778 fh->was_undefined = 0;
c862ae31
AM
10779 }
10780
721956f4 10781 /* Now build the stub. */
e054468f 10782 dest = stub_entry->plt_ent->plt.offset & ~1;
176a0d42 10783 if (dest >= (bfd_vma) -2)
721956f4
AM
10784 abort ();
10785
33e44f2e 10786 plt = htab->elf.splt;
25f23106
AM
10787 if (!htab->elf.dynamic_sections_created
10788 || stub_entry->h == NULL
10789 || stub_entry->h->elf.dynindx == -1)
33e44f2e 10790 plt = htab->elf.iplt;
e054468f
AM
10791
10792 dest += plt->output_offset + plt->output_section->vma;
10793
10794 if (stub_entry->h == NULL
10795 && (stub_entry->plt_ent->plt.offset & 1) == 0)
10796 {
10797 Elf_Internal_Rela rela;
10798 bfd_byte *rl;
10799
10800 rela.r_offset = dest;
ee67d69a
AM
10801 if (htab->opd_abi)
10802 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
10803 else
10804 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
e054468f
AM
10805 rela.r_addend = (stub_entry->target_value
10806 + stub_entry->target_section->output_offset
10807 + stub_entry->target_section->output_section->vma);
10808
33e44f2e
AM
10809 rl = (htab->elf.irelplt->contents
10810 + (htab->elf.irelplt->reloc_count++
25f23106
AM
10811 * sizeof (Elf64_External_Rela)));
10812 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
e054468f
AM
10813 stub_entry->plt_ent->plt.offset |= 1;
10814 }
176a0d42
AM
10815
10816 off = (dest
e054468f 10817 - elf_gp (plt->output_section->owner)
176a0d42 10818 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 10819
ad8e1ba5 10820 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 10821 {
25f53a85 10822 info->callbacks->einfo
bc30df16 10823 (_("%P: linkage table error against `%T'\n"),
e054468f
AM
10824 stub_entry->h != NULL
10825 ? stub_entry->h->elf.root.root.string
10826 : "<local sym>");
721956f4 10827 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
10828 htab->stub_error = TRUE;
10829 return FALSE;
721956f4
AM
10830 }
10831
e7d1c40c 10832 if (htab->params->plt_stub_align != 0)
794e51c0
AM
10833 {
10834 unsigned pad = plt_stub_pad (htab, stub_entry, off);
10835
10836 stub_entry->stub_sec->size += pad;
10837 stub_entry->stub_offset = stub_entry->stub_sec->size;
10838 loc += pad;
10839 }
10840
176a0d42
AM
10841 r = NULL;
10842 if (info->emitrelocations)
10843 {
10844 r = get_relocs (stub_entry->stub_sec,
3ba720c7
AM
10845 ((PPC_HA (off) != 0)
10846 + (htab->opd_abi
e7d1c40c 10847 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
10848 && PPC_HA (off + 16) == PPC_HA (off))
10849 : 1)));
176a0d42
AM
10850 if (r == NULL)
10851 return FALSE;
10852 r[0].r_offset = loc - stub_entry->stub_sec->contents;
7cfbafbc
AM
10853 if (bfd_big_endian (info->output_bfd))
10854 r[0].r_offset += 2;
176a0d42
AM
10855 r[0].r_addend = dest;
10856 }
a7f2871e
AM
10857 if (stub_entry->h != NULL
10858 && (stub_entry->h == htab->tls_get_addr_fd
10859 || stub_entry->h == htab->tls_get_addr)
e7d1c40c 10860 && !htab->params->no_tls_get_addr_opt)
794e51c0 10861 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 10862 else
794e51c0 10863 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
10864 size = p - loc;
10865 break;
10866
10867 default:
10868 BFD_FAIL ();
b34976b6 10869 return FALSE;
721956f4
AM
10870 }
10871
eea6121a 10872 stub_entry->stub_sec->size += size;
97b639ba 10873
e7d1c40c 10874 if (htab->params->emit_stub_syms)
97b639ba
AM
10875 {
10876 struct elf_link_hash_entry *h;
ee75fd95
AM
10877 size_t len1, len2;
10878 char *name;
10879 const char *const stub_str[] = { "long_branch",
10880 "long_branch_r2off",
10881 "plt_branch",
10882 "plt_branch_r2off",
794e51c0 10883 "plt_call",
ee75fd95
AM
10884 "plt_call" };
10885
10886 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
10887 len2 = strlen (stub_entry->root.string);
10888 name = bfd_malloc (len1 + len2 + 2);
10889 if (name == NULL)
10890 return FALSE;
10891 memcpy (name, stub_entry->root.string, 9);
10892 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
10893 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
10894 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
10895 if (h == NULL)
10896 return FALSE;
10897 if (h->root.type == bfd_link_hash_new)
10898 {
10899 h->root.type = bfd_link_hash_defined;
10900 h->root.u.def.section = stub_entry->stub_sec;
10901 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
10902 h->ref_regular = 1;
10903 h->def_regular = 1;
10904 h->ref_regular_nonweak = 1;
10905 h->forced_local = 1;
10906 h->non_elf = 0;
97b639ba
AM
10907 }
10908 }
10909
b34976b6 10910 return TRUE;
721956f4
AM
10911}
10912
10913/* As above, but don't actually build the stub. Just bump offset so
10914 we know stub section sizes, and select plt_branch stubs where
10915 long_branch stubs won't do. */
10916
b34976b6 10917static bfd_boolean
4ce794b7 10918ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
10919{
10920 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 10921 struct bfd_link_info *info;
721956f4
AM
10922 struct ppc_link_hash_table *htab;
10923 bfd_vma off;
10924 int size;
10925
10926 /* Massage our args to the form they really have. */
10927 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
10928 info = in_arg;
10929
10930 htab = ppc_hash_table (info);
4dfe6ac6
NC
10931 if (htab == NULL)
10932 return FALSE;
721956f4 10933
794e51c0
AM
10934 if (stub_entry->stub_type == ppc_stub_plt_call
10935 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
721956f4 10936 {
e054468f
AM
10937 asection *plt;
10938 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
58ac9f71 10939 if (off >= (bfd_vma) -2)
411e1bfb 10940 abort ();
33e44f2e 10941 plt = htab->elf.splt;
25f23106
AM
10942 if (!htab->elf.dynamic_sections_created
10943 || stub_entry->h == NULL
10944 || stub_entry->h->elf.dynindx == -1)
33e44f2e 10945 plt = htab->elf.iplt;
e054468f
AM
10946 off += (plt->output_offset
10947 + plt->output_section->vma
10948 - elf_gp (plt->output_section->owner)
ad8e1ba5 10949 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 10950
794e51c0 10951 size = plt_stub_size (htab, stub_entry, off);
e7d1c40c 10952 if (htab->params->plt_stub_align)
794e51c0 10953 size += plt_stub_pad (htab, stub_entry, off);
176a0d42
AM
10954 if (info->emitrelocations)
10955 {
10956 stub_entry->stub_sec->reloc_count
b9e5796b
AM
10957 += ((PPC_HA (off) != 0)
10958 + (htab->opd_abi
e7d1c40c 10959 ? 2 + (htab->params->plt_static_chain
b9e5796b
AM
10960 && PPC_HA (off + 16) == PPC_HA (off))
10961 : 1));
176a0d42
AM
10962 stub_entry->stub_sec->flags |= SEC_RELOC;
10963 }
721956f4
AM
10964 }
10965 else
10966 {
ad8e1ba5
AM
10967 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
10968 variants. */
ac2df442 10969 bfd_vma r2off = 0;
6911b7dc 10970 bfd_vma local_off = 0;
ac2df442 10971
721956f4
AM
10972 off = (stub_entry->target_value
10973 + stub_entry->target_section->output_offset
10974 + stub_entry->target_section->output_section->vma);
eea6121a 10975 off -= (stub_entry->stub_sec->size
721956f4
AM
10976 + stub_entry->stub_sec->output_offset
10977 + stub_entry->stub_sec->output_section->vma);
10978
ad8e1ba5
AM
10979 /* Reset the stub type from the plt variant in case we now
10980 can reach with a shorter stub. */
10981 if (stub_entry->stub_type >= ppc_stub_plt_branch)
10982 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
10983
10984 size = 4;
10985 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10986 {
25f53a85 10987 r2off = get_r2off (info, stub_entry);
b9e5796b 10988 if (r2off == 0 && htab->opd_abi)
aa374f67
AM
10989 {
10990 htab->stub_error = TRUE;
10991 return FALSE;
10992 }
ac2df442
AM
10993 size = 12;
10994 if (PPC_HA (r2off) != 0)
10995 size = 16;
10996 off -= size - 4;
ad8e1ba5
AM
10997 }
10998
6911b7dc
AM
10999 local_off = PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11000
b9e5796b
AM
11001 /* If the branch offset if too big, use a ppc_stub_plt_branch.
11002 Do the same for -R objects without function descriptors. */
11003 if (off + (1 << 25) >= (bfd_vma) (1 << 26) - local_off
11004 || (stub_entry->stub_type == ppc_stub_long_branch_r2off
11005 && r2off == 0))
721956f4
AM
11006 {
11007 struct ppc_branch_hash_entry *br_entry;
11008
11009 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11010 stub_entry->root.string + 9,
b34976b6 11011 TRUE, FALSE);
721956f4
AM
11012 if (br_entry == NULL)
11013 {
8de848d8 11014 info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
25f53a85 11015 stub_entry->root.string);
b34976b6
AM
11016 htab->stub_error = TRUE;
11017 return FALSE;
721956f4
AM
11018 }
11019
11020 if (br_entry->iter != htab->stub_iteration)
11021 {
11022 br_entry->iter = htab->stub_iteration;
eea6121a
AM
11023 br_entry->offset = htab->brlt->size;
11024 htab->brlt->size += 8;
63bc6f6c 11025
ee75fd95 11026 if (htab->relbrlt != NULL)
eea6121a 11027 htab->relbrlt->size += sizeof (Elf64_External_Rela);
84f5d08e
AM
11028 else if (info->emitrelocations)
11029 {
11030 htab->brlt->reloc_count += 1;
11031 htab->brlt->flags |= SEC_RELOC;
11032 }
721956f4 11033 }
ad8e1ba5
AM
11034
11035 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
ac2df442
AM
11036 off = (br_entry->offset
11037 + htab->brlt->output_offset
11038 + htab->brlt->output_section->vma
11039 - elf_gp (htab->brlt->output_section->owner)
11040 - htab->stub_group[stub_entry->id_sec->id].toc_off);
11041
176a0d42
AM
11042 if (info->emitrelocations)
11043 {
11044 stub_entry->stub_sec->reloc_count += 1 + (PPC_HA (off) != 0);
11045 stub_entry->stub_sec->flags |= SEC_RELOC;
11046 }
11047
00f412ee 11048 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ac2df442
AM
11049 {
11050 size = 12;
176a0d42 11051 if (PPC_HA (off) != 0)
ac2df442
AM
11052 size = 16;
11053 }
11054 else
11055 {
00f412ee 11056 size = 16;
176a0d42 11057 if (PPC_HA (off) != 0)
ac2df442
AM
11058 size += 4;
11059
11060 if (PPC_HA (r2off) != 0)
11061 size += 4;
00f412ee
AM
11062 if (PPC_LO (r2off) != 0)
11063 size += 4;
ac2df442 11064 }
721956f4 11065 }
84f5d08e
AM
11066 else if (info->emitrelocations)
11067 {
11068 stub_entry->stub_sec->reloc_count += 1;
11069 stub_entry->stub_sec->flags |= SEC_RELOC;
11070 }
721956f4
AM
11071 }
11072
eea6121a 11073 stub_entry->stub_sec->size += size;
b34976b6 11074 return TRUE;
721956f4
AM
11075}
11076
11077/* Set up various things so that we can make a list of input sections
11078 for each output section included in the link. Returns -1 on error,
cedb70c5 11079 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
11080
11081int
e7d1c40c 11082ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4
AM
11083{
11084 bfd *input_bfd;
734b6cf9 11085 int top_id, top_index, id;
721956f4 11086 asection *section;
734b6cf9 11087 asection **input_list;
721956f4
AM
11088 bfd_size_type amt;
11089 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11090
4dfe6ac6
NC
11091 if (htab == NULL)
11092 return -1;
4c52953f 11093
1e2f5b6e 11094 /* Find the top input section id. */
3d6f9012 11095 for (input_bfd = info->input_bfds, top_id = 3;
721956f4 11096 input_bfd != NULL;
c72f2fb2 11097 input_bfd = input_bfd->link.next)
721956f4 11098 {
721956f4
AM
11099 for (section = input_bfd->sections;
11100 section != NULL;
11101 section = section->next)
11102 {
11103 if (top_id < section->id)
11104 top_id = section->id;
11105 }
11106 }
721956f4 11107
8f3bab57 11108 htab->top_id = top_id;
721956f4 11109 amt = sizeof (struct map_stub) * (top_id + 1);
4ce794b7 11110 htab->stub_group = bfd_zmalloc (amt);
721956f4
AM
11111 if (htab->stub_group == NULL)
11112 return -1;
11113
3d6f9012
AM
11114 /* Set toc_off for com, und, abs and ind sections. */
11115 for (id = 0; id < 3; id++)
11116 htab->stub_group[id].toc_off = TOC_BASE_OFF;
721956f4 11117
734b6cf9
AM
11118 /* We can't use output_bfd->section_count here to find the top output
11119 section index as some sections may have been removed, and
8423293d 11120 strip_excluded_output_sections doesn't renumber the indices. */
927be08e 11121 for (section = info->output_bfd->sections, top_index = 0;
734b6cf9
AM
11122 section != NULL;
11123 section = section->next)
11124 {
11125 if (top_index < section->index)
11126 top_index = section->index;
11127 }
11128
11129 htab->top_index = top_index;
11130 amt = sizeof (asection *) * (top_index + 1);
4ce794b7 11131 input_list = bfd_zmalloc (amt);
734b6cf9
AM
11132 htab->input_list = input_list;
11133 if (input_list == NULL)
11134 return -1;
11135
721956f4
AM
11136 return 1;
11137}
11138
927be08e
AM
11139/* Set up for first pass at multitoc partitioning. */
11140
11141void
11142ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11143{
11144 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11145
1c865ab2 11146 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
11147 htab->toc_bfd = NULL;
11148 htab->toc_first_sec = NULL;
11149}
11150
e717da7e
AM
11151/* The linker repeatedly calls this function for each TOC input section
11152 and linker generated GOT section. Group input bfds such that the toc
927be08e 11153 within a group is less than 64k in size. */
ad8e1ba5 11154
927be08e 11155bfd_boolean
4ce794b7 11156ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
11157{
11158 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 11159 bfd_vma addr, off, limit;
ad8e1ba5 11160
4dfe6ac6
NC
11161 if (htab == NULL)
11162 return FALSE;
11163
927be08e 11164 if (!htab->second_toc_pass)
4c52953f 11165 {
927be08e 11166 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
11167 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11168
11169 if (new_bfd)
bf102f86
AM
11170 {
11171 htab->toc_bfd = isec->owner;
11172 htab->toc_first_sec = isec;
11173 }
927be08e 11174
bf102f86
AM
11175 addr = isec->output_offset + isec->output_section->vma;
11176 off = addr - htab->toc_curr;
d77c8a4b
AM
11177 limit = 0x80008000;
11178 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
11179 limit = 0x10000;
11180 if (off + isec->size > limit)
bf102f86
AM
11181 {
11182 addr = (htab->toc_first_sec->output_offset
11183 + htab->toc_first_sec->output_section->vma);
11184 htab->toc_curr = addr;
11185 }
99877b66 11186
927be08e
AM
11187 /* toc_curr is the base address of this toc group. Set elf_gp
11188 for the input section to be the offset relative to the
11189 output toc base plus 0x8000. Making the input elf_gp an
11190 offset allows us to move the toc as a whole without
11191 recalculating input elf_gp. */
11192 off = htab->toc_curr - elf_gp (isec->output_section->owner);
11193 off += TOC_BASE_OFF;
11194
11195 /* Die if someone uses a linker script that doesn't keep input
11196 file .toc and .got together. */
a4fd3de5
AM
11197 if (new_bfd
11198 && elf_gp (isec->owner) != 0
927be08e
AM
11199 && elf_gp (isec->owner) != off)
11200 return FALSE;
11201
11202 elf_gp (isec->owner) = off;
11203 return TRUE;
4c52953f 11204 }
927be08e
AM
11205
11206 /* During the second pass toc_first_sec points to the start of
11207 a toc group, and toc_curr is used to track the old elf_gp.
11208 We use toc_bfd to ensure we only look at each bfd once. */
11209 if (htab->toc_bfd == isec->owner)
11210 return TRUE;
11211 htab->toc_bfd = isec->owner;
11212
11213 if (htab->toc_first_sec == NULL
11214 || htab->toc_curr != elf_gp (isec->owner))
11215 {
11216 htab->toc_curr = elf_gp (isec->owner);
11217 htab->toc_first_sec = isec;
11218 }
11219 addr = (htab->toc_first_sec->output_offset
11220 + htab->toc_first_sec->output_section->vma);
11221 off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
11222 elf_gp (isec->owner) = off;
11223
11224 return TRUE;
ad8e1ba5
AM
11225}
11226
927be08e
AM
11227/* Called via elf_link_hash_traverse to merge GOT entries for global
11228 symbol H. */
11229
11230static bfd_boolean
11231merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11232{
11233 if (h->root.type == bfd_link_hash_indirect)
11234 return TRUE;
11235
927be08e
AM
11236 merge_got_entries (&h->got.glist);
11237
11238 return TRUE;
11239}
11240
11241/* Called via elf_link_hash_traverse to allocate GOT entries for global
11242 symbol H. */
11243
11244static bfd_boolean
11245reallocate_got (struct elf_link_hash_entry *h, void *inf)
11246{
11247 struct got_entry *gent;
11248
11249 if (h->root.type == bfd_link_hash_indirect)
11250 return TRUE;
11251
927be08e
AM
11252 for (gent = h->got.glist; gent != NULL; gent = gent->next)
11253 if (!gent->is_indirect)
11254 allocate_got (h, (struct bfd_link_info *) inf, gent);
11255 return TRUE;
11256}
11257
11258/* Called on the first multitoc pass after the last call to
11259 ppc64_elf_next_toc_section. This function removes duplicate GOT
11260 entries. */
11261
11262bfd_boolean
11263ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
11264{
11265 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
11266 struct bfd *ibfd, *ibfd2;
11267 bfd_boolean done_something;
11268
11269 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 11270
7865406b
AM
11271 if (!htab->do_multi_toc)
11272 return FALSE;
11273
d0fae19d 11274 /* Merge global sym got entries within a toc group. */
927be08e
AM
11275 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
11276
11277 /* And tlsld_got. */
c72f2fb2 11278 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11279 {
11280 struct got_entry *ent, *ent2;
11281
11282 if (!is_ppc64_elf (ibfd))
11283 continue;
11284
11285 ent = ppc64_tlsld_got (ibfd);
11286 if (!ent->is_indirect
11287 && ent->got.offset != (bfd_vma) -1)
11288 {
c72f2fb2 11289 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
11290 {
11291 if (!is_ppc64_elf (ibfd2))
11292 continue;
11293
11294 ent2 = ppc64_tlsld_got (ibfd2);
11295 if (!ent2->is_indirect
11296 && ent2->got.offset != (bfd_vma) -1
11297 && elf_gp (ibfd2) == elf_gp (ibfd))
11298 {
11299 ent2->is_indirect = TRUE;
11300 ent2->got.ent = ent;
11301 }
11302 }
11303 }
11304 }
11305
11306 /* Zap sizes of got sections. */
33e44f2e
AM
11307 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
11308 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
11309 htab->got_reli_size = 0;
11310
c72f2fb2 11311 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11312 {
11313 asection *got, *relgot;
11314
11315 if (!is_ppc64_elf (ibfd))
11316 continue;
11317
11318 got = ppc64_elf_tdata (ibfd)->got;
11319 if (got != NULL)
11320 {
11321 got->rawsize = got->size;
11322 got->size = 0;
11323 relgot = ppc64_elf_tdata (ibfd)->relgot;
11324 relgot->rawsize = relgot->size;
11325 relgot->size = 0;
11326 }
11327 }
11328
11329 /* Now reallocate the got, local syms first. We don't need to
11330 allocate section contents again since we never increase size. */
c72f2fb2 11331 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11332 {
11333 struct got_entry **lgot_ents;
11334 struct got_entry **end_lgot_ents;
11335 struct plt_entry **local_plt;
11336 struct plt_entry **end_local_plt;
f961d9dd 11337 unsigned char *lgot_masks;
927be08e
AM
11338 bfd_size_type locsymcount;
11339 Elf_Internal_Shdr *symtab_hdr;
19e08130 11340 asection *s;
927be08e
AM
11341
11342 if (!is_ppc64_elf (ibfd))
11343 continue;
11344
11345 lgot_ents = elf_local_got_ents (ibfd);
11346 if (!lgot_ents)
11347 continue;
11348
11349 symtab_hdr = &elf_symtab_hdr (ibfd);
11350 locsymcount = symtab_hdr->sh_info;
11351 end_lgot_ents = lgot_ents + locsymcount;
11352 local_plt = (struct plt_entry **) end_lgot_ents;
11353 end_local_plt = local_plt + locsymcount;
f961d9dd 11354 lgot_masks = (unsigned char *) end_local_plt;
927be08e 11355 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
11356 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11357 {
11358 struct got_entry *ent;
11359
11360 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 11361 {
19e08130
AM
11362 unsigned int ent_size = 8;
11363 unsigned int rel_size = sizeof (Elf64_External_Rela);
11364
d0fae19d
AM
11365 ent->got.offset = s->size;
11366 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 11367 {
19e08130
AM
11368 ent_size *= 2;
11369 rel_size *= 2;
11370 }
11371 s->size += ent_size;
11372 if ((*lgot_masks & PLT_IFUNC) != 0)
11373 {
33e44f2e 11374 htab->elf.irelplt->size += rel_size;
19e08130
AM
11375 htab->got_reli_size += rel_size;
11376 }
11377 else if (info->shared)
11378 {
11379 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11380 srel->size += rel_size;
d0fae19d
AM
11381 }
11382 }
927be08e
AM
11383 }
11384 }
11385
11386 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
11387
c72f2fb2 11388 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11389 {
11390 struct got_entry *ent;
11391
11392 if (!is_ppc64_elf (ibfd))
11393 continue;
11394
11395 ent = ppc64_tlsld_got (ibfd);
11396 if (!ent->is_indirect
11397 && ent->got.offset != (bfd_vma) -1)
11398 {
11399 asection *s = ppc64_elf_tdata (ibfd)->got;
11400 ent->got.offset = s->size;
11401 s->size += 16;
11402 if (info->shared)
11403 {
11404 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11405 srel->size += sizeof (Elf64_External_Rela);
11406 }
11407 }
11408 }
11409
33e44f2e 11410 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 11411 if (!done_something)
c72f2fb2 11412 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11413 {
11414 asection *got;
11415
11416 if (!is_ppc64_elf (ibfd))
11417 continue;
11418
11419 got = ppc64_elf_tdata (ibfd)->got;
11420 if (got != NULL)
11421 {
11422 done_something = got->rawsize != got->size;
11423 if (done_something)
11424 break;
11425 }
11426 }
11427
11428 if (done_something)
e7d1c40c 11429 (*htab->params->layout_sections_again) ();
927be08e
AM
11430
11431 /* Set up for second pass over toc sections to recalculate elf_gp
11432 on input sections. */
11433 htab->toc_bfd = NULL;
11434 htab->toc_first_sec = NULL;
11435 htab->second_toc_pass = TRUE;
11436 return done_something;
11437}
11438
11439/* Called after second pass of multitoc partitioning. */
11440
11441void
11442ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
11443{
11444 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11445
11446 /* After the second pass, toc_curr tracks the TOC offset used
11447 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 11448 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
11449}
11450
9b5ecbd0
AM
11451/* No toc references were found in ISEC. If the code in ISEC makes no
11452 calls, then there's no need to use toc adjusting stubs when branching
11453 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
11454 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11455 needed, and 2 if a cyclical call-graph was found but no other reason
11456 for a stub was detected. If called from the top level, a return of
11457 2 means the same as a return of 0. */
9b5ecbd0
AM
11458
11459static int
4ce794b7 11460toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 11461{
9b5ecbd0 11462 int ret;
70cc837d
AM
11463
11464 /* Mark this section as checked. */
11465 isec->call_check_done = 1;
9b5ecbd0 11466
772119ce
AM
11467 /* We know none of our code bearing sections will need toc stubs. */
11468 if ((isec->flags & SEC_LINKER_CREATED) != 0)
11469 return 0;
11470
eea6121a 11471 if (isec->size == 0)
082c50f8
AM
11472 return 0;
11473
4c52953f
AM
11474 if (isec->output_section == NULL)
11475 return 0;
11476
4c52953f 11477 ret = 0;
70cc837d 11478 if (isec->reloc_count != 0)
9b5ecbd0 11479 {
70cc837d
AM
11480 Elf_Internal_Rela *relstart, *rel;
11481 Elf_Internal_Sym *local_syms;
11482 struct ppc_link_hash_table *htab;
2917689a 11483
70cc837d
AM
11484 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
11485 info->keep_memory);
11486 if (relstart == NULL)
11487 return -1;
90aecf7a 11488
70cc837d
AM
11489 /* Look for branches to outside of this section. */
11490 local_syms = NULL;
11491 htab = ppc_hash_table (info);
11492 if (htab == NULL)
11493 return -1;
4c52953f 11494
70cc837d 11495 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 11496 {
70cc837d
AM
11497 enum elf_ppc64_reloc_type r_type;
11498 unsigned long r_symndx;
11499 struct elf_link_hash_entry *h;
11500 struct ppc_link_hash_entry *eh;
11501 Elf_Internal_Sym *sym;
11502 asection *sym_sec;
11503 struct _opd_sec_data *opd;
11504 bfd_vma sym_value;
11505 bfd_vma dest;
11506
11507 r_type = ELF64_R_TYPE (rel->r_info);
11508 if (r_type != R_PPC64_REL24
11509 && r_type != R_PPC64_REL14
11510 && r_type != R_PPC64_REL14_BRTAKEN
11511 && r_type != R_PPC64_REL14_BRNTAKEN)
11512 continue;
4c52953f 11513
70cc837d
AM
11514 r_symndx = ELF64_R_SYM (rel->r_info);
11515 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
11516 isec->owner))
4c52953f 11517 {
70cc837d
AM
11518 ret = -1;
11519 break;
11520 }
4c52953f 11521
70cc837d
AM
11522 /* Calls to dynamic lib functions go through a plt call stub
11523 that uses r2. */
11524 eh = (struct ppc_link_hash_entry *) h;
11525 if (eh != NULL
11526 && (eh->elf.plt.plist != NULL
11527 || (eh->oh != NULL
11528 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
11529 {
11530 ret = 1;
11531 break;
4c52953f
AM
11532 }
11533
70cc837d
AM
11534 if (sym_sec == NULL)
11535 /* Ignore other undefined symbols. */
4c52953f 11536 continue;
4c52953f 11537
70cc837d
AM
11538 /* Assume branches to other sections not included in the
11539 link need stubs too, to cover -R and absolute syms. */
11540 if (sym_sec->output_section == NULL)
11541 {
11542 ret = 1;
11543 break;
11544 }
4c52953f 11545
70cc837d
AM
11546 if (h == NULL)
11547 sym_value = sym->st_value;
11548 else
11549 {
11550 if (h->root.type != bfd_link_hash_defined
11551 && h->root.type != bfd_link_hash_defweak)
11552 abort ();
11553 sym_value = h->root.u.def.value;
11554 }
11555 sym_value += rel->r_addend;
4c52953f 11556
70cc837d
AM
11557 /* If this branch reloc uses an opd sym, find the code section. */
11558 opd = get_opd_info (sym_sec);
11559 if (opd != NULL)
11560 {
11561 if (h == NULL && opd->adjust != NULL)
11562 {
11563 long adjust;
4c52953f 11564
70cc837d
AM
11565 adjust = opd->adjust[sym->st_value / 8];
11566 if (adjust == -1)
11567 /* Assume deleted functions won't ever be called. */
11568 continue;
11569 sym_value += adjust;
11570 }
4c52953f 11571
aef36ac1
AM
11572 dest = opd_entry_value (sym_sec, sym_value,
11573 &sym_sec, NULL, FALSE);
70cc837d
AM
11574 if (dest == (bfd_vma) -1)
11575 continue;
11576 }
11577 else
11578 dest = (sym_value
11579 + sym_sec->output_offset
11580 + sym_sec->output_section->vma);
4c52953f 11581
70cc837d
AM
11582 /* Ignore branch to self. */
11583 if (sym_sec == isec)
11584 continue;
4c52953f 11585
70cc837d
AM
11586 /* If the called function uses the toc, we need a stub. */
11587 if (sym_sec->has_toc_reloc
11588 || sym_sec->makes_toc_func_call)
4c52953f 11589 {
70cc837d 11590 ret = 1;
4c52953f
AM
11591 break;
11592 }
70cc837d
AM
11593
11594 /* Assume any branch that needs a long branch stub might in fact
11595 need a plt_branch stub. A plt_branch stub uses r2. */
11596 else if (dest - (isec->output_offset
11597 + isec->output_section->vma
6911b7dc
AM
11598 + rel->r_offset) + (1 << 25)
11599 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
11600 ? h->other
11601 : sym->st_other))
4c52953f 11602 {
70cc837d
AM
11603 ret = 1;
11604 break;
11605 }
11606
11607 /* If calling back to a section in the process of being
11608 tested, we can't say for sure that no toc adjusting stubs
11609 are needed, so don't return zero. */
11610 else if (sym_sec->call_check_in_progress)
11611 ret = 2;
11612
11613 /* Branches to another section that itself doesn't have any TOC
11614 references are OK. Recursively call ourselves to check. */
11615 else if (!sym_sec->call_check_done)
11616 {
11617 int recur;
11618
11619 /* Mark current section as indeterminate, so that other
11620 sections that call back to current won't be marked as
11621 known. */
11622 isec->call_check_in_progress = 1;
11623 recur = toc_adjusting_stub_needed (info, sym_sec);
11624 isec->call_check_in_progress = 0;
11625
4c52953f
AM
11626 if (recur != 0)
11627 {
70cc837d
AM
11628 ret = recur;
11629 if (recur != 2)
11630 break;
4c52953f
AM
11631 }
11632 }
4c52953f 11633 }
70cc837d
AM
11634
11635 if (local_syms != NULL
11636 && (elf_symtab_hdr (isec->owner).contents
11637 != (unsigned char *) local_syms))
11638 free (local_syms);
11639 if (elf_section_data (isec)->relocs != relstart)
11640 free (relstart);
9b5ecbd0
AM
11641 }
11642
70cc837d
AM
11643 if ((ret & 1) == 0
11644 && isec->map_head.s != NULL
11645 && (strcmp (isec->output_section->name, ".init") == 0
11646 || strcmp (isec->output_section->name, ".fini") == 0))
11647 {
11648 if (isec->map_head.s->has_toc_reloc
11649 || isec->map_head.s->makes_toc_func_call)
11650 ret = 1;
11651 else if (!isec->map_head.s->call_check_done)
11652 {
11653 int recur;
11654 isec->call_check_in_progress = 1;
11655 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
11656 isec->call_check_in_progress = 0;
11657 if (recur != 0)
11658 ret = recur;
11659 }
11660 }
11661
11662 if (ret == 1)
11663 isec->makes_toc_func_call = 1;
4c52953f 11664
9b5ecbd0
AM
11665 return ret;
11666}
11667
721956f4
AM
11668/* The linker repeatedly calls this function for each input section,
11669 in the order that input sections are linked into output sections.
11670 Build lists of input sections to determine groupings between which
11671 we may insert linker stubs. */
11672
9b5ecbd0 11673bfd_boolean
4ce794b7 11674ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
11675{
11676 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11677
4dfe6ac6
NC
11678 if (htab == NULL)
11679 return FALSE;
11680
734b6cf9
AM
11681 if ((isec->output_section->flags & SEC_CODE) != 0
11682 && isec->output_section->index <= htab->top_index)
721956f4 11683 {
734b6cf9 11684 asection **list = htab->input_list + isec->output_section->index;
3d6f9012 11685 /* Steal the link_sec pointer for our list. */
721956f4 11686#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3d6f9012
AM
11687 /* This happens to make the list in reverse order,
11688 which is what we want. */
734b6cf9
AM
11689 PREV_SEC (isec) = *list;
11690 *list = isec;
721956f4 11691 }
ad8e1ba5 11692
4c52953f 11693 if (htab->multi_toc_needed)
9b5ecbd0 11694 {
8b974ba3
AM
11695 /* Analyse sections that aren't already flagged as needing a
11696 valid toc pointer. Exclude .fixup for the linux kernel.
11697 .fixup contains branches, but only back to the function that
11698 hit an exception. */
11699 if (!(isec->has_toc_reloc
11700 || (isec->flags & SEC_CODE) == 0
11701 || strcmp (isec->name, ".fixup") == 0
11702 || isec->call_check_done))
11703 {
11704 if (toc_adjusting_stub_needed (info, isec) < 0)
6683a28d 11705 return FALSE;
8b974ba3
AM
11706 }
11707 /* Make all sections use the TOC assigned for this object file.
11708 This will be wrong for pasted sections; We fix that in
11709 check_pasted_section(). */
11710 if (elf_gp (isec->owner) != 0)
11711 htab->toc_curr = elf_gp (isec->owner);
11712 }
11713
ad8e1ba5 11714 htab->stub_group[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 11715 return TRUE;
721956f4
AM
11716}
11717
70cc837d
AM
11718/* Check that all .init and .fini sections use the same toc, if they
11719 have toc relocs. */
11720
11721static bfd_boolean
11722check_pasted_section (struct bfd_link_info *info, const char *name)
11723{
11724 asection *o = bfd_get_section_by_name (info->output_bfd, name);
11725
11726 if (o != NULL)
11727 {
11728 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11729 bfd_vma toc_off = 0;
11730 asection *i;
11731
11732 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11733 if (i->has_toc_reloc)
11734 {
11735 if (toc_off == 0)
11736 toc_off = htab->stub_group[i->id].toc_off;
11737 else if (toc_off != htab->stub_group[i->id].toc_off)
11738 return FALSE;
11739 }
6683a28d
AM
11740
11741 if (toc_off == 0)
11742 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11743 if (i->makes_toc_func_call)
11744 {
11745 toc_off = htab->stub_group[i->id].toc_off;
11746 break;
11747 }
11748
70cc837d
AM
11749 /* Make sure the whole pasted function uses the same toc offset. */
11750 if (toc_off != 0)
11751 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11752 htab->stub_group[i->id].toc_off = toc_off;
11753 }
11754 return TRUE;
11755}
11756
11757bfd_boolean
11758ppc64_elf_check_init_fini (struct bfd_link_info *info)
11759{
11760 return (check_pasted_section (info, ".init")
11761 & check_pasted_section (info, ".fini"));
11762}
11763
721956f4
AM
11764/* See whether we can group stub sections together. Grouping stub
11765 sections may result in fewer stubs. More importantly, we need to
11766 put all .init* and .fini* stubs at the beginning of the .init or
11767 .fini output sections respectively, because glibc splits the
11768 _init and _fini functions into multiple parts. Putting a stub in
11769 the middle of a function is not a good idea. */
11770
11771static void
4ce794b7
AM
11772group_sections (struct ppc_link_hash_table *htab,
11773 bfd_size_type stub_group_size,
11774 bfd_boolean stubs_always_before_branch)
721956f4 11775{
7c8fe5c4
AM
11776 asection **list;
11777 bfd_size_type stub14_group_size;
11778 bfd_boolean suppress_size_errors;
11779
11780 suppress_size_errors = FALSE;
11781 stub14_group_size = stub_group_size;
11782 if (stub_group_size == 1)
11783 {
11784 /* Default values. */
11785 if (stubs_always_before_branch)
11786 {
11787 stub_group_size = 0x1e00000;
11788 stub14_group_size = 0x7800;
11789 }
11790 else
11791 {
11792 stub_group_size = 0x1c00000;
11793 stub14_group_size = 0x7000;
11794 }
11795 suppress_size_errors = TRUE;
11796 }
11797
11798 list = htab->input_list + htab->top_index;
734b6cf9 11799 do
721956f4 11800 {
734b6cf9
AM
11801 asection *tail = *list;
11802 while (tail != NULL)
721956f4 11803 {
734b6cf9
AM
11804 asection *curr;
11805 asection *prev;
11806 bfd_size_type total;
11807 bfd_boolean big_sec;
11808 bfd_vma curr_toc;
11809
11810 curr = tail;
eea6121a 11811 total = tail->size;
6bee8834
AM
11812 big_sec = total > (ppc64_elf_section_data (tail) != NULL
11813 && ppc64_elf_section_data (tail)->has_14bit_branch
7c8fe5c4
AM
11814 ? stub14_group_size : stub_group_size);
11815 if (big_sec && !suppress_size_errors)
5c3dead3
AM
11816 (*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
11817 tail->owner, tail);
734b6cf9
AM
11818 curr_toc = htab->stub_group[tail->id].toc_off;
11819
11820 while ((prev = PREV_SEC (curr)) != NULL
11821 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
11822 < (ppc64_elf_section_data (prev) != NULL
11823 && ppc64_elf_section_data (prev)->has_14bit_branch
7c8fe5c4 11824 ? stub14_group_size : stub_group_size))
ad8e1ba5 11825 && htab->stub_group[prev->id].toc_off == curr_toc)
734b6cf9
AM
11826 curr = prev;
11827
11828 /* OK, the size from the start of CURR to the end is less
11829 than stub_group_size and thus can be handled by one stub
11830 section. (or the tail section is itself larger than
11831 stub_group_size, in which case we may be toast.) We
11832 should really be keeping track of the total size of stubs
11833 added here, as stubs contribute to the final output
11834 section size. That's a little tricky, and this way will
11835 only break if stubs added make the total size more than
11836 2^25, ie. for the default stub_group_size, if stubs total
11837 more than 2097152 bytes, or nearly 75000 plt call stubs. */
11838 do
721956f4
AM
11839 {
11840 prev = PREV_SEC (tail);
734b6cf9 11841 /* Set up this stub group. */
721956f4
AM
11842 htab->stub_group[tail->id].link_sec = curr;
11843 }
734b6cf9
AM
11844 while (tail != curr && (tail = prev) != NULL);
11845
11846 /* But wait, there's more! Input sections up to stub_group_size
11847 bytes before the stub section can be handled by it too.
11848 Don't do this if we have a really large section after the
11849 stubs, as adding more stubs increases the chance that
11850 branches may not reach into the stub section. */
11851 if (!stubs_always_before_branch && !big_sec)
11852 {
11853 total = 0;
11854 while (prev != NULL
11855 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
11856 < (ppc64_elf_section_data (prev) != NULL
11857 && ppc64_elf_section_data (prev)->has_14bit_branch
7c8fe5c4 11858 ? stub14_group_size : stub_group_size))
734b6cf9
AM
11859 && htab->stub_group[prev->id].toc_off == curr_toc)
11860 {
11861 tail = prev;
11862 prev = PREV_SEC (tail);
11863 htab->stub_group[tail->id].link_sec = curr;
11864 }
11865 }
11866 tail = prev;
721956f4
AM
11867 }
11868 }
734b6cf9
AM
11869 while (list-- != htab->input_list);
11870 free (htab->input_list);
721956f4
AM
11871#undef PREV_SEC
11872}
11873
58d180e8
AM
11874static const unsigned char glink_eh_frame_cie[] =
11875{
11876 0, 0, 0, 16, /* length. */
11877 0, 0, 0, 0, /* id. */
11878 1, /* CIE version. */
11879 'z', 'R', 0, /* Augmentation string. */
11880 4, /* Code alignment. */
11881 0x78, /* Data alignment. */
11882 65, /* RA reg. */
11883 1, /* Augmentation size. */
11884 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
11885 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
11886};
11887
d969d15f
AM
11888/* Stripping output sections is normally done before dynamic section
11889 symbols have been allocated. This function is called later, and
11890 handles cases like htab->brlt which is mapped to its own output
11891 section. */
11892
11893static void
11894maybe_strip_output (struct bfd_link_info *info, asection *isec)
11895{
11896 if (isec->size == 0
11897 && isec->output_section->size == 0
53d8967a 11898 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
11899 && !bfd_section_removed_from_list (info->output_bfd,
11900 isec->output_section)
11901 && elf_section_data (isec->output_section)->dynindx == 0)
11902 {
11903 isec->output_section->flags |= SEC_EXCLUDE;
11904 bfd_section_list_remove (info->output_bfd, isec->output_section);
11905 info->output_bfd->section_count--;
11906 }
11907}
11908
721956f4
AM
11909/* Determine and set the size of the stub section for a final link.
11910
11911 The basic idea here is to examine all the relocations looking for
11912 PC-relative calls to a target that is unreachable with a "bl"
11913 instruction. */
11914
b34976b6 11915bfd_boolean
e7d1c40c 11916ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
11917{
11918 bfd_size_type stub_group_size;
b34976b6 11919 bfd_boolean stubs_always_before_branch;
721956f4
AM
11920 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11921
4dfe6ac6
NC
11922 if (htab == NULL)
11923 return FALSE;
11924
e7d1c40c
AM
11925 if (htab->params->plt_thread_safe == -1 && !info->executable)
11926 htab->params->plt_thread_safe = 1;
b9e5796b 11927 if (!htab->opd_abi)
e7d1c40c
AM
11928 htab->params->plt_thread_safe = 0;
11929 else if (htab->params->plt_thread_safe == -1)
794e51c0 11930 {
e2458743 11931 static const char *const thread_starter[] =
794e51c0
AM
11932 {
11933 "pthread_create",
11934 /* libstdc++ */
11935 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
11936 /* librt */
11937 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
11938 "mq_notify", "create_timer",
11939 /* libanl */
11940 "getaddrinfo_a",
11941 /* libgomp */
11942 "GOMP_parallel_start",
11943 "GOMP_parallel_loop_static_start",
11944 "GOMP_parallel_loop_dynamic_start",
11945 "GOMP_parallel_loop_guided_start",
11946 "GOMP_parallel_loop_runtime_start",
68ffbac6 11947 "GOMP_parallel_sections_start",
794e51c0
AM
11948 };
11949 unsigned i;
11950
11951 for (i = 0; i < sizeof (thread_starter)/ sizeof (thread_starter[0]); i++)
11952 {
11953 struct elf_link_hash_entry *h;
11954 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
11955 FALSE, FALSE, TRUE);
e7d1c40c
AM
11956 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
11957 if (htab->params->plt_thread_safe)
794e51c0
AM
11958 break;
11959 }
11960 }
e7d1c40c
AM
11961 stubs_always_before_branch = htab->params->group_size < 0;
11962 if (htab->params->group_size < 0)
11963 stub_group_size = -htab->params->group_size;
721956f4 11964 else
e7d1c40c 11965 stub_group_size = htab->params->group_size;
721956f4
AM
11966
11967 group_sections (htab, stub_group_size, stubs_always_before_branch);
11968
721956f4
AM
11969 while (1)
11970 {
11971 bfd *input_bfd;
11972 unsigned int bfd_indx;
11973 asection *stub_sec;
721956f4
AM
11974
11975 htab->stub_iteration += 1;
721956f4
AM
11976
11977 for (input_bfd = info->input_bfds, bfd_indx = 0;
11978 input_bfd != NULL;
c72f2fb2 11979 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
11980 {
11981 Elf_Internal_Shdr *symtab_hdr;
11982 asection *section;
6cdc0ccc 11983 Elf_Internal_Sym *local_syms = NULL;
721956f4 11984
0c8d6e5c 11985 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
11986 continue;
11987
721956f4 11988 /* We'll need the symbol table in a second. */
0ffa91dd 11989 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
11990 if (symtab_hdr->sh_info == 0)
11991 continue;
11992
721956f4
AM
11993 /* Walk over each section attached to the input bfd. */
11994 for (section = input_bfd->sections;
11995 section != NULL;
11996 section = section->next)
11997 {
721956f4 11998 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
11999
12000 /* If there aren't any relocs, then there's nothing more
12001 to do. */
12002 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
12003 || (section->flags & SEC_ALLOC) == 0
12004 || (section->flags & SEC_LOAD) == 0
12005 || (section->flags & SEC_CODE) == 0
721956f4
AM
12006 || section->reloc_count == 0)
12007 continue;
12008
12009 /* If this section is a link-once section that will be
12010 discarded, then don't create any stubs. */
12011 if (section->output_section == NULL
927be08e 12012 || section->output_section->owner != info->output_bfd)
721956f4
AM
12013 continue;
12014
1e2f5b6e
AM
12015 /* Get the relocs. */
12016 internal_relocs
4ce794b7 12017 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 12018 info->keep_memory);
721956f4 12019 if (internal_relocs == NULL)
1e2f5b6e 12020 goto error_ret_free_local;
721956f4
AM
12021
12022 /* Now examine each relocation. */
12023 irela = internal_relocs;
12024 irelaend = irela + section->reloc_count;
12025 for (; irela < irelaend; irela++)
12026 {
4ce794b7
AM
12027 enum elf_ppc64_reloc_type r_type;
12028 unsigned int r_indx;
721956f4
AM
12029 enum ppc_stub_type stub_type;
12030 struct ppc_stub_hash_entry *stub_entry;
8387904d 12031 asection *sym_sec, *code_sec;
e054468f 12032 bfd_vma sym_value, code_value;
721956f4 12033 bfd_vma destination;
6911b7dc 12034 unsigned long local_off;
8843416a 12035 bfd_boolean ok_dest;
721956f4 12036 struct ppc_link_hash_entry *hash;
8387904d 12037 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
12038 struct elf_link_hash_entry *h;
12039 Elf_Internal_Sym *sym;
721956f4
AM
12040 char *stub_name;
12041 const asection *id_sec;
74f0fb50 12042 struct _opd_sec_data *opd;
e054468f 12043 struct plt_entry *plt_ent;
721956f4
AM
12044
12045 r_type = ELF64_R_TYPE (irela->r_info);
12046 r_indx = ELF64_R_SYM (irela->r_info);
12047
4ce794b7 12048 if (r_type >= R_PPC64_max)
721956f4
AM
12049 {
12050 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 12051 goto error_ret_free_internal;
721956f4
AM
12052 }
12053
12054 /* Only look for stubs on branch instructions. */
4ce794b7
AM
12055 if (r_type != R_PPC64_REL24
12056 && r_type != R_PPC64_REL14
12057 && r_type != R_PPC64_REL14_BRTAKEN
12058 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
12059 continue;
12060
12061 /* Now determine the call target, its name, value,
12062 section. */
411e1bfb
AM
12063 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12064 r_indx, input_bfd))
12065 goto error_ret_free_internal;
12066 hash = (struct ppc_link_hash_entry *) h;
12067
8843416a 12068 ok_dest = FALSE;
8387904d 12069 fdh = NULL;
7fe2b9a6 12070 sym_value = 0;
411e1bfb 12071 if (hash == NULL)
721956f4 12072 {
411e1bfb 12073 sym_value = sym->st_value;
8843416a 12074 ok_dest = TRUE;
721956f4 12075 }
7fe2b9a6
AM
12076 else if (hash->elf.root.type == bfd_link_hash_defined
12077 || hash->elf.root.type == bfd_link_hash_defweak)
12078 {
12079 sym_value = hash->elf.root.u.def.value;
12080 if (sym_sec->output_section != NULL)
12081 ok_dest = TRUE;
12082 }
12083 else if (hash->elf.root.type == bfd_link_hash_undefweak
12084 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 12085 {
99877b66 12086 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
12087 use the func descriptor sym instead if it is
12088 defined. */
ceb1f1ef 12089 if (hash->elf.root.root.string[0] == '.'
b31867b6 12090 && (fdh = lookup_fdh (hash, htab)) != NULL)
8387904d 12091 {
8387904d
AM
12092 if (fdh->elf.root.type == bfd_link_hash_defined
12093 || fdh->elf.root.type == bfd_link_hash_defweak)
12094 {
12095 sym_sec = fdh->elf.root.u.def.section;
12096 sym_value = fdh->elf.root.u.def.value;
12097 if (sym_sec->output_section != NULL)
12098 ok_dest = TRUE;
12099 }
99877b66
AM
12100 else
12101 fdh = NULL;
8387904d 12102 }
7fe2b9a6
AM
12103 }
12104 else
12105 {
12106 bfd_set_error (bfd_error_bad_value);
12107 goto error_ret_free_internal;
721956f4
AM
12108 }
12109
8843416a 12110 destination = 0;
6911b7dc 12111 local_off = 0;
8843416a
AM
12112 if (ok_dest)
12113 {
12114 sym_value += irela->r_addend;
12115 destination = (sym_value
12116 + sym_sec->output_offset
12117 + sym_sec->output_section->vma);
6911b7dc
AM
12118 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12119 ? hash->elf.other
12120 : sym->st_other);
8843416a
AM
12121 }
12122
8387904d 12123 code_sec = sym_sec;
e054468f 12124 code_value = sym_value;
74f0fb50
AM
12125 opd = get_opd_info (sym_sec);
12126 if (opd != NULL)
8387904d
AM
12127 {
12128 bfd_vma dest;
12129
74f0fb50 12130 if (hash == NULL && opd->adjust != NULL)
8387904d 12131 {
74f0fb50 12132 long adjust = opd->adjust[sym_value / 8];
8387904d
AM
12133 if (adjust == -1)
12134 continue;
e054468f 12135 code_value += adjust;
8387904d
AM
12136 sym_value += adjust;
12137 }
12138 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 12139 &code_sec, &code_value, FALSE);
8387904d
AM
12140 if (dest != (bfd_vma) -1)
12141 {
12142 destination = dest;
12143 if (fdh != NULL)
12144 {
12145 /* Fixup old ABI sym to point at code
12146 entry. */
99877b66 12147 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 12148 hash->elf.root.u.def.section = code_sec;
e054468f 12149 hash->elf.root.u.def.value = code_value;
8387904d
AM
12150 }
12151 }
12152 }
12153
721956f4 12154 /* Determine what (if any) linker stub is needed. */
e054468f 12155 plt_ent = NULL;
721956f4 12156 stub_type = ppc_type_of_stub (section, irela, &hash,
6911b7dc
AM
12157 &plt_ent, destination,
12158 local_off);
ad8e1ba5
AM
12159
12160 if (stub_type != ppc_stub_plt_call)
12161 {
12162 /* Check whether we need a TOC adjusting stub.
12163 Since the linker pastes together pieces from
12164 different object files when creating the
12165 _init and _fini functions, it may be that a
12166 call to what looks like a local sym is in
12167 fact a call needing a TOC adjustment. */
8387904d
AM
12168 if (code_sec != NULL
12169 && code_sec->output_section != NULL
12170 && (htab->stub_group[code_sec->id].toc_off
9b5ecbd0 12171 != htab->stub_group[section->id].toc_off)
4c52953f
AM
12172 && (code_sec->has_toc_reloc
12173 || code_sec->makes_toc_func_call))
ad8e1ba5
AM
12174 stub_type = ppc_stub_long_branch_r2off;
12175 }
12176
721956f4
AM
12177 if (stub_type == ppc_stub_none)
12178 continue;
12179
411e1bfb
AM
12180 /* __tls_get_addr calls might be eliminated. */
12181 if (stub_type != ppc_stub_plt_call
12182 && hash != NULL
8387904d
AM
12183 && (hash == htab->tls_get_addr
12184 || hash == htab->tls_get_addr_fd)
411e1bfb
AM
12185 && section->has_tls_reloc
12186 && irela != internal_relocs)
12187 {
12188 /* Get tls info. */
f961d9dd 12189 unsigned char *tls_mask;
411e1bfb 12190
3a71aa26 12191 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
12192 irela - 1, input_bfd))
12193 goto error_ret_free_internal;
e7b938ca 12194 if (*tls_mask != 0)
411e1bfb
AM
12195 continue;
12196 }
12197
3b421ab3
AM
12198 if (stub_type == ppc_stub_plt_call
12199 && irela + 1 < irelaend
12200 && irela[1].r_offset == irela->r_offset + 4
794e51c0
AM
12201 && ELF64_R_TYPE (irela[1].r_info) == R_PPC64_TOCSAVE)
12202 {
12203 if (!tocsave_find (htab, INSERT,
12204 &local_syms, irela + 1, input_bfd))
12205 goto error_ret_free_internal;
12206 }
12207 else if (stub_type == ppc_stub_plt_call)
12208 stub_type = ppc_stub_plt_call_r2save;
3b421ab3 12209
721956f4
AM
12210 /* Support for grouping stub sections. */
12211 id_sec = htab->stub_group[section->id].link_sec;
12212
12213 /* Get the name of this stub. */
12214 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
12215 if (!stub_name)
12216 goto error_ret_free_internal;
12217
12218 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 12219 stub_name, FALSE, FALSE);
721956f4
AM
12220 if (stub_entry != NULL)
12221 {
12222 /* The proper stub has already been created. */
12223 free (stub_name);
794e51c0
AM
12224 if (stub_type == ppc_stub_plt_call_r2save)
12225 stub_entry->stub_type = stub_type;
721956f4
AM
12226 continue;
12227 }
12228
25f53a85 12229 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
12230 if (stub_entry == NULL)
12231 {
12232 free (stub_name);
6cdc0ccc
AM
12233 error_ret_free_internal:
12234 if (elf_section_data (section)->relocs == NULL)
12235 free (internal_relocs);
12236 error_ret_free_local:
12237 if (local_syms != NULL
12238 && (symtab_hdr->contents
12239 != (unsigned char *) local_syms))
12240 free (local_syms);
b34976b6 12241 return FALSE;
721956f4
AM
12242 }
12243
ad8e1ba5 12244 stub_entry->stub_type = stub_type;
794e51c0
AM
12245 if (stub_type != ppc_stub_plt_call
12246 && stub_type != ppc_stub_plt_call_r2save)
e054468f
AM
12247 {
12248 stub_entry->target_value = code_value;
12249 stub_entry->target_section = code_sec;
12250 }
12251 else
12252 {
12253 stub_entry->target_value = sym_value;
12254 stub_entry->target_section = sym_sec;
12255 }
721956f4 12256 stub_entry->h = hash;
e054468f 12257 stub_entry->plt_ent = plt_ent;
6911b7dc 12258 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95
AM
12259
12260 if (stub_entry->h != NULL)
12261 htab->stub_globals += 1;
721956f4
AM
12262 }
12263
12264 /* We're done with the internal relocs, free them. */
6cdc0ccc 12265 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 12266 free (internal_relocs);
721956f4 12267 }
6cdc0ccc
AM
12268
12269 if (local_syms != NULL
12270 && symtab_hdr->contents != (unsigned char *) local_syms)
12271 {
12272 if (!info->keep_memory)
12273 free (local_syms);
12274 else
12275 symtab_hdr->contents = (unsigned char *) local_syms;
12276 }
721956f4
AM
12277 }
12278
5c3dead3 12279 /* We may have added some stubs. Find out the new size of the
721956f4 12280 stub sections. */
e7d1c40c 12281 for (stub_sec = htab->params->stub_bfd->sections;
721956f4
AM
12282 stub_sec != NULL;
12283 stub_sec = stub_sec->next)
e717da7e 12284 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
ee75fd95 12285 {
5c3dead3 12286 stub_sec->rawsize = stub_sec->size;
ee75fd95
AM
12287 stub_sec->size = 0;
12288 stub_sec->reloc_count = 0;
84f5d08e 12289 stub_sec->flags &= ~SEC_RELOC;
ee75fd95 12290 }
eea6121a
AM
12291
12292 htab->brlt->size = 0;
84f5d08e
AM
12293 htab->brlt->reloc_count = 0;
12294 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 12295 if (htab->relbrlt != NULL)
eea6121a 12296 htab->relbrlt->size = 0;
721956f4 12297
63bc6f6c 12298 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 12299
176a0d42
AM
12300 if (info->emitrelocations
12301 && htab->glink != NULL && htab->glink->size != 0)
12302 {
12303 htab->glink->reloc_count = 1;
12304 htab->glink->flags |= SEC_RELOC;
12305 }
12306
58d180e8
AM
12307 if (htab->glink_eh_frame != NULL
12308 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
9a2a56cc 12309 && htab->glink_eh_frame->output_section->size != 0)
58d180e8 12310 {
4bbe044a 12311 size_t size = 0, align;
58d180e8 12312
e7d1c40c 12313 for (stub_sec = htab->params->stub_bfd->sections;
58d180e8
AM
12314 stub_sec != NULL;
12315 stub_sec = stub_sec->next)
12316 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12317 size += 20;
12318 if (htab->glink != NULL && htab->glink->size != 0)
12319 size += 24;
12320 if (size != 0)
12321 size += sizeof (glink_eh_frame_cie);
4bbe044a
AM
12322 align = 1;
12323 align <<= htab->glink_eh_frame->output_section->alignment_power;
12324 align -= 1;
12325 size = (size + align) & ~align;
58d180e8
AM
12326 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12327 htab->glink_eh_frame->size = size;
12328 }
12329
e7d1c40c
AM
12330 if (htab->params->plt_stub_align != 0)
12331 for (stub_sec = htab->params->stub_bfd->sections;
794e51c0
AM
12332 stub_sec != NULL;
12333 stub_sec = stub_sec->next)
12334 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
e7d1c40c
AM
12335 stub_sec->size = ((stub_sec->size
12336 + (1 << htab->params->plt_stub_align) - 1)
12337 & (-1 << htab->params->plt_stub_align));
794e51c0 12338
e7d1c40c 12339 for (stub_sec = htab->params->stub_bfd->sections;
5c3dead3
AM
12340 stub_sec != NULL;
12341 stub_sec = stub_sec->next)
12342 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12343 && stub_sec->rawsize != stub_sec->size)
12344 break;
12345
12346 /* Exit from this loop when no stubs have been added, and no stubs
12347 have changed size. */
58d180e8
AM
12348 if (stub_sec == NULL
12349 && (htab->glink_eh_frame == NULL
12350 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
5c3dead3
AM
12351 break;
12352
721956f4 12353 /* Ask the linker to do its stuff. */
e7d1c40c 12354 (*htab->params->layout_sections_again) ();
721956f4
AM
12355 }
12356
d969d15f
AM
12357 maybe_strip_output (info, htab->brlt);
12358 if (htab->glink_eh_frame != NULL)
12359 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 12360
b34976b6 12361 return TRUE;
721956f4
AM
12362}
12363
12364/* Called after we have determined section placement. If sections
805fc799 12365 move, we'll be called again. Provide a value for TOCstart. */
721956f4 12366
805fc799 12367bfd_vma
1c865ab2 12368ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 12369{
805fc799
AM
12370 asection *s;
12371 bfd_vma TOCstart;
721956f4 12372
805fc799
AM
12373 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
12374 order. The TOC starts where the first of these sections starts. */
12375 s = bfd_get_section_by_name (obfd, ".got");
e054468f 12376 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 12377 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 12378 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 12379 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 12380 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 12381 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 12382 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
12383 {
12384 /* This may happen for
12385 o references to TOC base (SYM@toc / TOC[tc0]) without a
12386 .toc directive
12387 o bad linker script
12388 o --gc-sections and empty TOC sections
12389
12390 FIXME: Warn user? */
12391
12392 /* Look for a likely section. We probably won't even be
12393 using TOCstart. */
12394 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
12395 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
12396 | SEC_EXCLUDE))
805fc799
AM
12397 == (SEC_ALLOC | SEC_SMALL_DATA))
12398 break;
721956f4 12399 if (s == NULL)
805fc799 12400 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 12401 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
12402 == (SEC_ALLOC | SEC_SMALL_DATA))
12403 break;
721956f4 12404 if (s == NULL)
805fc799 12405 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
12406 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
12407 == SEC_ALLOC)
805fc799 12408 break;
721956f4 12409 if (s == NULL)
805fc799 12410 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 12411 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
12412 break;
12413 }
721956f4 12414
805fc799
AM
12415 TOCstart = 0;
12416 if (s != NULL)
12417 TOCstart = s->output_section->vma + s->output_offset;
721956f4 12418
1c865ab2
AM
12419 _bfd_set_gp_value (obfd, TOCstart);
12420
810d4e75 12421 if (info != NULL && s != NULL)
1c865ab2
AM
12422 {
12423 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12424
810d4e75
AM
12425 if (htab != NULL)
12426 {
12427 if (htab->elf.hgot != NULL)
12428 {
12429 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF;
12430 htab->elf.hgot->root.u.def.section = s;
12431 }
12432 }
12433 else
1c865ab2 12434 {
810d4e75
AM
12435 struct bfd_link_hash_entry *bh = NULL;
12436 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
12437 s, TOC_BASE_OFF, NULL, FALSE,
12438 FALSE, &bh);
1c865ab2
AM
12439 }
12440 }
805fc799 12441 return TOCstart;
721956f4
AM
12442}
12443
a345bc8d
AM
12444/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
12445 write out any global entry stubs. */
12446
12447static bfd_boolean
12448build_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
12449{
12450 struct bfd_link_info *info;
12451 struct ppc_link_hash_table *htab;
12452 struct plt_entry *pent;
12453 asection *s;
12454
12455 if (h->root.type == bfd_link_hash_indirect)
12456 return TRUE;
12457
12458 if (!h->pointer_equality_needed)
12459 return TRUE;
12460
12461 if (h->def_regular)
12462 return TRUE;
12463
12464 info = inf;
12465 htab = ppc_hash_table (info);
12466 if (htab == NULL)
12467 return FALSE;
12468
12469 s = htab->glink;
12470 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
12471 if (pent->plt.offset != (bfd_vma) -1
12472 && pent->addend == 0)
12473 {
12474 bfd_byte *p;
12475 asection *plt;
12476 bfd_vma off;
12477
a345bc8d 12478 p = s->contents + h->root.u.def.value;
33e44f2e 12479 plt = htab->elf.splt;
a345bc8d
AM
12480 if (!htab->elf.dynamic_sections_created
12481 || h->dynindx == -1)
33e44f2e 12482 plt = htab->elf.iplt;
a345bc8d
AM
12483 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
12484 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
12485
12486 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
12487 {
12488 info->callbacks->einfo
12489 (_("%P: linkage table error against `%T'\n"),
12490 h->root.root.string);
12491 bfd_set_error (bfd_error_bad_value);
12492 htab->stub_error = TRUE;
12493 }
12494
7341d5e2
AM
12495 htab->stub_count[ppc_stub_global_entry - 1] += 1;
12496 if (htab->params->emit_stub_syms)
12497 {
12498 size_t len = strlen (h->root.root.string);
12499 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
12500
12501 if (name == NULL)
12502 return FALSE;
12503
12504 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
12505 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
12506 if (h == NULL)
12507 return FALSE;
12508 if (h->root.type == bfd_link_hash_new)
12509 {
12510 h->root.type = bfd_link_hash_defined;
12511 h->root.u.def.section = s;
12512 h->root.u.def.value = p - s->contents;
12513 h->ref_regular = 1;
12514 h->def_regular = 1;
12515 h->ref_regular_nonweak = 1;
12516 h->forced_local = 1;
12517 h->non_elf = 0;
12518 }
12519 }
12520
a345bc8d
AM
12521 if (PPC_HA (off) != 0)
12522 {
12523 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
12524 p += 4;
12525 }
12526 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
12527 p += 4;
12528 bfd_put_32 (s->owner, MTCTR_R12, p);
12529 p += 4;
12530 bfd_put_32 (s->owner, BCTR, p);
12531 break;
12532 }
12533 return TRUE;
12534}
12535
721956f4
AM
12536/* Build all the stubs associated with the current output file.
12537 The stubs are kept in a hash table attached to the main linker
12538 hash table. This function is called via gldelf64ppc_finish. */
12539
b34976b6 12540bfd_boolean
e7d1c40c 12541ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 12542 char **stats)
5d1634d7
AM
12543{
12544 struct ppc_link_hash_table *htab = ppc_hash_table (info);
721956f4 12545 asection *stub_sec;
5d1634d7 12546 bfd_byte *p;
e717da7e 12547 int stub_sec_count = 0;
5d1634d7 12548
4dfe6ac6
NC
12549 if (htab == NULL)
12550 return FALSE;
12551
eea6121a 12552 /* Allocate memory to hold the linker stubs. */
e7d1c40c 12553 for (stub_sec = htab->params->stub_bfd->sections;
721956f4
AM
12554 stub_sec != NULL;
12555 stub_sec = stub_sec->next)
eea6121a
AM
12556 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12557 && stub_sec->size != 0)
e717da7e 12558 {
e7d1c40c 12559 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, stub_sec->size);
eea6121a
AM
12560 if (stub_sec->contents == NULL)
12561 return FALSE;
12562 /* We want to check that built size is the same as calculated
12563 size. rawsize is a convenient location to use. */
12564 stub_sec->rawsize = stub_sec->size;
12565 stub_sec->size = 0;
e717da7e 12566 }
5d1634d7 12567
23eb7e01 12568 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 12569 {
9f951329 12570 unsigned int indx;
ad8e1ba5 12571 bfd_vma plt0;
9f951329 12572
721956f4 12573 /* Build the .glink plt call stub. */
e7d1c40c 12574 if (htab->params->emit_stub_syms)
97b639ba
AM
12575 {
12576 struct elf_link_hash_entry *h;
468392fb
AM
12577 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
12578 TRUE, FALSE, FALSE);
97b639ba
AM
12579 if (h == NULL)
12580 return FALSE;
12581 if (h->root.type == bfd_link_hash_new)
12582 {
12583 h->root.type = bfd_link_hash_defined;
12584 h->root.u.def.section = htab->glink;
ee4bf8d2 12585 h->root.u.def.value = 8;
f5385ebf
AM
12586 h->ref_regular = 1;
12587 h->def_regular = 1;
12588 h->ref_regular_nonweak = 1;
12589 h->forced_local = 1;
12590 h->non_elf = 0;
97b639ba
AM
12591 }
12592 }
33e44f2e
AM
12593 plt0 = (htab->elf.splt->output_section->vma
12594 + htab->elf.splt->output_offset
12595 - 16);
176a0d42
AM
12596 if (info->emitrelocations)
12597 {
12598 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
12599 if (r == NULL)
12600 return FALSE;
12601 r->r_offset = (htab->glink->output_offset
12602 + htab->glink->output_section->vma);
12603 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
12604 r->r_addend = plt0;
12605 }
4ce794b7 12606 p = htab->glink->contents;
176a0d42 12607 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
12608 bfd_put_64 (htab->glink->owner, plt0, p);
12609 p += 8;
b9e5796b
AM
12610 if (htab->opd_abi)
12611 {
12612 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
12613 p += 4;
12614 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
12615 p += 4;
12616 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
12617 p += 4;
12618 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
12619 p += 4;
12620 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
12621 p += 4;
12622 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
12623 p += 4;
12624 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
12625 p += 4;
12626 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
12627 p += 4;
12628 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
12629 p += 4;
12630 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
12631 p += 4;
12632 }
12633 else
12634 {
12635 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
12636 p += 4;
12637 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
12638 p += 4;
12639 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
12640 p += 4;
12641 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
12642 p += 4;
12643 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
12644 p += 4;
12645 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
12646 p += 4;
12647 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
12648 p += 4;
12649 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
12650 p += 4;
12651 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
12652 p += 4;
12653 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
12654 p += 4;
12655 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
12656 p += 4;
12657 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
12658 p += 4;
12659 }
4ce794b7 12660 bfd_put_32 (htab->glink->owner, BCTR, p);
ad8e1ba5 12661 p += 4;
ee4bf8d2
AM
12662 while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
12663 {
12664 bfd_put_32 (htab->glink->owner, NOP, p);
12665 p += 4;
12666 }
ad8e1ba5 12667
9f951329
AM
12668 /* Build the .glink lazy link call stubs. */
12669 indx = 0;
a345bc8d 12670 while (p < htab->glink->contents + htab->glink->rawsize)
9f951329 12671 {
b9e5796b 12672 if (htab->opd_abi)
9f951329 12673 {
b9e5796b
AM
12674 if (indx < 0x8000)
12675 {
12676 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
12677 p += 4;
12678 }
12679 else
12680 {
12681 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
12682 p += 4;
12683 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
12684 p);
12685 p += 4;
12686 }
9f951329 12687 }
4ce794b7 12688 bfd_put_32 (htab->glink->owner,
ee4bf8d2 12689 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 12690 indx++;
9f951329
AM
12691 p += 4;
12692 }
a345bc8d
AM
12693
12694 /* Build .glink global entry stubs. */
12695 if (htab->glink->size > htab->glink->rawsize)
afe397ea 12696 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
5d1634d7 12697 }
5d1634d7 12698
7341d5e2 12699 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 12700 {
4ce794b7 12701 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 12702 htab->brlt->size);
4ce794b7 12703 if (htab->brlt->contents == NULL)
b34976b6 12704 return FALSE;
721956f4 12705 }
ee75fd95 12706 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
12707 {
12708 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 12709 htab->relbrlt->size);
63bc6f6c
AM
12710 if (htab->relbrlt->contents == NULL)
12711 return FALSE;
12712 }
5d1634d7 12713
58d180e8
AM
12714 if (htab->glink_eh_frame != NULL
12715 && htab->glink_eh_frame->size != 0)
12716 {
12717 bfd_vma val;
4bbe044a
AM
12718 bfd_byte *last_fde;
12719 size_t last_fde_len, size, align, pad;
58d180e8
AM
12720
12721 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
12722 if (p == NULL)
12723 return FALSE;
12724 htab->glink_eh_frame->contents = p;
4bbe044a 12725 last_fde = p;
58d180e8
AM
12726
12727 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12728
12729 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
12730 /* CIE length (rewrite in case little-endian). */
4bbe044a
AM
12731 last_fde_len = sizeof (glink_eh_frame_cie) - 4;
12732 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
58d180e8
AM
12733 p += sizeof (glink_eh_frame_cie);
12734
e7d1c40c 12735 for (stub_sec = htab->params->stub_bfd->sections;
58d180e8
AM
12736 stub_sec != NULL;
12737 stub_sec = stub_sec->next)
12738 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12739 {
4bbe044a
AM
12740 last_fde = p;
12741 last_fde_len = 16;
58d180e8
AM
12742 /* FDE length. */
12743 bfd_put_32 (htab->elf.dynobj, 16, p);
12744 p += 4;
12745 /* CIE pointer. */
12746 val = p - htab->glink_eh_frame->contents;
12747 bfd_put_32 (htab->elf.dynobj, val, p);
12748 p += 4;
12749 /* Offset to stub section. */
12750 val = (stub_sec->output_section->vma
12751 + stub_sec->output_offset);
12752 val -= (htab->glink_eh_frame->output_section->vma
12753 + htab->glink_eh_frame->output_offset);
12754 val -= p - htab->glink_eh_frame->contents;
12755 if (val + 0x80000000 > 0xffffffff)
12756 {
12757 info->callbacks->einfo
8de848d8 12758 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
58d180e8
AM
12759 stub_sec->name);
12760 return FALSE;
12761 }
12762 bfd_put_32 (htab->elf.dynobj, val, p);
12763 p += 4;
12764 /* stub section size. */
12765 bfd_put_32 (htab->elf.dynobj, stub_sec->rawsize, p);
12766 p += 4;
12767 /* Augmentation. */
12768 p += 1;
12769 /* Pad. */
12770 p += 3;
12771 }
12772 if (htab->glink != NULL && htab->glink->size != 0)
12773 {
4bbe044a
AM
12774 last_fde = p;
12775 last_fde_len = 20;
58d180e8
AM
12776 /* FDE length. */
12777 bfd_put_32 (htab->elf.dynobj, 20, p);
12778 p += 4;
12779 /* CIE pointer. */
12780 val = p - htab->glink_eh_frame->contents;
12781 bfd_put_32 (htab->elf.dynobj, val, p);
12782 p += 4;
12783 /* Offset to .glink. */
12784 val = (htab->glink->output_section->vma
12785 + htab->glink->output_offset
12786 + 8);
12787 val -= (htab->glink_eh_frame->output_section->vma
12788 + htab->glink_eh_frame->output_offset);
12789 val -= p - htab->glink_eh_frame->contents;
12790 if (val + 0x80000000 > 0xffffffff)
12791 {
12792 info->callbacks->einfo
8de848d8 12793 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
58d180e8
AM
12794 htab->glink->name);
12795 return FALSE;
12796 }
12797 bfd_put_32 (htab->elf.dynobj, val, p);
12798 p += 4;
12799 /* .glink size. */
a345bc8d 12800 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
58d180e8
AM
12801 p += 4;
12802 /* Augmentation. */
12803 p += 1;
12804
12805 *p++ = DW_CFA_advance_loc + 1;
12806 *p++ = DW_CFA_register;
12807 *p++ = 65;
12808 *p++ = 12;
12809 *p++ = DW_CFA_advance_loc + 4;
12810 *p++ = DW_CFA_restore_extended;
12811 *p++ = 65;
12812 }
4bbe044a
AM
12813 /* Subsume any padding into the last FDE if user .eh_frame
12814 sections are aligned more than glink_eh_frame. Otherwise any
12815 zero padding will be seen as a terminator. */
12816 size = p - htab->glink_eh_frame->contents;
12817 align = 1;
12818 align <<= htab->glink_eh_frame->output_section->alignment_power;
12819 align -= 1;
12820 pad = ((size + align) & ~align) - size;
12821 htab->glink_eh_frame->size = size + pad;
12822 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
58d180e8
AM
12823 }
12824
721956f4
AM
12825 /* Build the stubs as directed by the stub hash table. */
12826 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 12827
aa8a7074
AM
12828 if (htab->relbrlt != NULL)
12829 htab->relbrlt->reloc_count = 0;
12830
e7d1c40c
AM
12831 if (htab->params->plt_stub_align != 0)
12832 for (stub_sec = htab->params->stub_bfd->sections;
794e51c0
AM
12833 stub_sec != NULL;
12834 stub_sec = stub_sec->next)
12835 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
e7d1c40c
AM
12836 stub_sec->size = ((stub_sec->size
12837 + (1 << htab->params->plt_stub_align) - 1)
12838 & (-1 << htab->params->plt_stub_align));
794e51c0 12839
e7d1c40c 12840 for (stub_sec = htab->params->stub_bfd->sections;
721956f4
AM
12841 stub_sec != NULL;
12842 stub_sec = stub_sec->next)
e717da7e
AM
12843 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12844 {
12845 stub_sec_count += 1;
eea6121a 12846 if (stub_sec->rawsize != stub_sec->size)
e717da7e
AM
12847 break;
12848 }
5d1634d7 12849
721956f4 12850 if (stub_sec != NULL
58d180e8
AM
12851 || (htab->glink_eh_frame != NULL
12852 && htab->glink_eh_frame->rawsize != htab->glink_eh_frame->size))
5d1634d7 12853 {
b34976b6 12854 htab->stub_error = TRUE;
8de848d8 12855 info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
5d1634d7 12856 }
721956f4 12857
d2a300cf
AM
12858 if (htab->stub_error)
12859 return FALSE;
12860
12861 if (stats != NULL)
12862 {
12863 *stats = bfd_malloc (500);
12864 if (*stats == NULL)
12865 return FALSE;
12866
ee75fd95 12867 sprintf (*stats, _("linker stubs in %u group%s\n"
d2a300cf
AM
12868 " branch %lu\n"
12869 " toc adjust %lu\n"
12870 " long branch %lu\n"
12871 " long toc adj %lu\n"
794e51c0 12872 " plt call %lu\n"
7341d5e2
AM
12873 " plt call toc %lu\n"
12874 " global entry %lu"),
e717da7e 12875 stub_sec_count,
ee75fd95 12876 stub_sec_count == 1 ? "" : "s",
4ce794b7
AM
12877 htab->stub_count[ppc_stub_long_branch - 1],
12878 htab->stub_count[ppc_stub_long_branch_r2off - 1],
12879 htab->stub_count[ppc_stub_plt_branch - 1],
12880 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
794e51c0 12881 htab->stub_count[ppc_stub_plt_call - 1],
7341d5e2
AM
12882 htab->stub_count[ppc_stub_plt_call_r2save - 1],
12883 htab->stub_count[ppc_stub_global_entry - 1]);
d2a300cf
AM
12884 }
12885 return TRUE;
5bd4f169
AM
12886}
12887
99877b66
AM
12888/* This function undoes the changes made by add_symbol_adjust. */
12889
12890static bfd_boolean
12891undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12892{
12893 struct ppc_link_hash_entry *eh;
12894
12895 if (h->root.type == bfd_link_hash_indirect)
12896 return TRUE;
12897
99877b66
AM
12898 eh = (struct ppc_link_hash_entry *) h;
12899 if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
12900 return TRUE;
12901
12902 eh->elf.root.type = bfd_link_hash_undefined;
12903 return TRUE;
12904}
12905
12906void
12907ppc64_elf_restore_symbols (struct bfd_link_info *info)
12908{
12909 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6
NC
12910
12911 if (htab != NULL)
12912 elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
99877b66
AM
12913}
12914
60124e18
AM
12915/* What to do when ld finds relocations against symbols defined in
12916 discarded sections. */
12917
12918static unsigned int
12919ppc64_elf_action_discarded (asection *sec)
12920{
12921 if (strcmp (".opd", sec->name) == 0)
12922 return 0;
12923
12924 if (strcmp (".toc", sec->name) == 0)
12925 return 0;
12926
bce50a28
JJ
12927 if (strcmp (".toc1", sec->name) == 0)
12928 return 0;
12929
60124e18
AM
12930 return _bfd_elf_default_action_discarded (sec);
12931}
12932
5bd4f169
AM
12933/* The RELOCATE_SECTION function is called by the ELF backend linker
12934 to handle the relocations for a section.
12935
12936 The relocs are always passed as Rela structures; if the section
12937 actually uses Rel structures, the r_addend field will always be
12938 zero.
12939
12940 This function is responsible for adjust the section contents as
12941 necessary, and (if using Rela relocs and generating a
1049f94e 12942 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
12943 necessary.
12944
12945 This function does not have to worry about setting the reloc
12946 address or the reloc symbol index.
12947
12948 LOCAL_SYMS is a pointer to the swapped in local symbols.
12949
12950 LOCAL_SECTIONS is an array giving the section in the input file
12951 corresponding to the st_shndx field of each local symbol.
12952
12953 The global hash table entry for the global symbols can be found
12954 via elf_sym_hashes (input_bfd).
12955
1049f94e 12956 When generating relocatable output, this function must handle
5bd4f169
AM
12957 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
12958 going to be the section symbol corresponding to the output
12959 section, which means that the addend must be adjusted
12960 accordingly. */
12961
b34976b6 12962static bfd_boolean
4ce794b7
AM
12963ppc64_elf_relocate_section (bfd *output_bfd,
12964 struct bfd_link_info *info,
12965 bfd *input_bfd,
12966 asection *input_section,
12967 bfd_byte *contents,
12968 Elf_Internal_Rela *relocs,
12969 Elf_Internal_Sym *local_syms,
12970 asection **local_sections)
5bd4f169 12971{
65f38f15 12972 struct ppc_link_hash_table *htab;
5bd4f169
AM
12973 Elf_Internal_Shdr *symtab_hdr;
12974 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
12975 Elf_Internal_Rela *rel;
12976 Elf_Internal_Rela *relend;
411e1bfb
AM
12977 Elf_Internal_Rela outrel;
12978 bfd_byte *loc;
411e1bfb 12979 struct got_entry **local_got_ents;
5bd4f169 12980 bfd_vma TOCstart;
b34976b6
AM
12981 bfd_boolean ret = TRUE;
12982 bfd_boolean is_opd;
794e51c0
AM
12983 /* Assume 'at' branch hints. */
12984 bfd_boolean is_isa_v2 = TRUE;
4fe5ca5b 12985 bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
5bd4f169 12986
65f38f15 12987 /* Initialize howto table if needed. */
5bd4f169 12988 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
12989 ppc_howto_init ();
12990
65f38f15 12991 htab = ppc_hash_table (info);
4dfe6ac6
NC
12992 if (htab == NULL)
12993 return FALSE;
ee75fd95
AM
12994
12995 /* Don't relocate stub sections. */
e7d1c40c 12996 if (input_section->owner == htab->params->stub_bfd)
ee75fd95
AM
12997 return TRUE;
12998
0c8d6e5c 12999 BFD_ASSERT (is_ppc64_elf (input_bfd));
0ffa91dd 13000
411e1bfb 13001 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 13002 TOCstart = elf_gp (output_bfd);
0ffa91dd 13003 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 13004 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 13005 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 13006
5bd4f169
AM
13007 rel = relocs;
13008 relend = relocs + input_section->reloc_count;
13009 for (; rel < relend; rel++)
13010 {
04c9666a 13011 enum elf_ppc64_reloc_type r_type;
31c76678 13012 bfd_vma addend;
5bd4f169
AM
13013 bfd_reloc_status_type r;
13014 Elf_Internal_Sym *sym;
13015 asection *sec;
039b3fef
AM
13016 struct elf_link_hash_entry *h_elf;
13017 struct ppc_link_hash_entry *h;
13018 struct ppc_link_hash_entry *fdh;
5bd4f169 13019 const char *sym_name;
0d4792f7 13020 unsigned long r_symndx, toc_symndx;
3a71aa26 13021 bfd_vma toc_addend;
f961d9dd
AM
13022 unsigned char tls_mask, tls_gd, tls_type;
13023 unsigned char sym_type;
5bd4f169 13024 bfd_vma relocation;
b34976b6
AM
13025 bfd_boolean unresolved_reloc;
13026 bfd_boolean warned;
bc30df16 13027 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 13028 unsigned int insn;
e11840f9 13029 unsigned int mask;
721956f4
AM
13030 struct ppc_stub_hash_entry *stub_entry;
13031 bfd_vma max_br_offset;
13032 bfd_vma from;
31c76678 13033 const Elf_Internal_Rela orig_rel = *rel;
b80eed39
AM
13034 reloc_howto_type *howto;
13035 struct reloc_howto_struct alt_howto;
5bd4f169 13036
4ce794b7 13037 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 13038 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
13039
13040 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
13041 symbol of the previous ADDR64 reloc. The symbol gives us the
13042 proper TOC base to use. */
13043 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
13044 && rel != relocs
13045 && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
13046 && is_opd)
13047 r_symndx = ELF64_R_SYM (rel[-1].r_info);
13048
4ce794b7
AM
13049 sym = NULL;
13050 sec = NULL;
039b3fef 13051 h_elf = NULL;
4ce794b7 13052 sym_name = NULL;
b34976b6
AM
13053 unresolved_reloc = FALSE;
13054 warned = FALSE;
65f38f15 13055
0b13192e 13056 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
13057 {
13058 /* It's a local symbol. */
74f0fb50 13059 struct _opd_sec_data *opd;
4025353c 13060
5bd4f169
AM
13061 sym = local_syms + r_symndx;
13062 sec = local_sections[r_symndx];
26c61ae5 13063 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 13064 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 13065 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
13066 opd = get_opd_info (sec);
13067 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 13068 {
74f0fb50 13069 long adjust = opd->adjust[(sym->st_value + rel->r_addend) / 8];
4025353c
AM
13070 if (adjust == -1)
13071 relocation = 0;
13072 else
4cc603a5
AM
13073 {
13074 /* If this is a relocation against the opd section sym
13075 and we have edited .opd, adjust the reloc addend so
13076 that ld -r and ld --emit-relocs output is correct.
13077 If it is a reloc against some other .opd symbol,
13078 then the symbol value will be adjusted later. */
13079 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
13080 rel->r_addend += adjust;
13081 else
13082 relocation += adjust;
13083 }
1e2f5b6e 13084 }
5bd4f169
AM
13085 }
13086 else
13087 {
62d887d4
L
13088 bfd_boolean ignored;
13089
b2a8e766
AM
13090 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
13091 r_symndx, symtab_hdr, sym_hashes,
039b3fef 13092 h_elf, sec, relocation,
62d887d4 13093 unresolved_reloc, warned, ignored);
039b3fef
AM
13094 sym_name = h_elf->root.root.string;
13095 sym_type = h_elf->type;
b69fdb4e
AM
13096 if (sec != NULL
13097 && sec->owner == output_bfd
13098 && strcmp (sec->name, ".opd") == 0)
13099 {
13100 /* This is a symbol defined in a linker script. All
13101 such are defined in output sections, even those
13102 defined by simple assignment from a symbol defined in
13103 an input section. Transfer the symbol to an
13104 appropriate input .opd section, so that a branch to
13105 this symbol will be mapped to the location specified
13106 by the opd entry. */
13107 struct bfd_link_order *lo;
13108 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
13109 if (lo->type == bfd_indirect_link_order)
13110 {
13111 asection *isec = lo->u.indirect.section;
13112 if (h_elf->root.u.def.value >= isec->output_offset
13113 && h_elf->root.u.def.value < (isec->output_offset
13114 + isec->size))
13115 {
13116 h_elf->root.u.def.value -= isec->output_offset;
13117 h_elf->root.u.def.section = isec;
13118 sec = isec;
13119 break;
13120 }
13121 }
13122 }
5bd4f169 13123 }
039b3fef 13124 h = (struct ppc_link_hash_entry *) h_elf;
5bd4f169 13125
dbaa2011 13126 if (sec != NULL && discarded_section (sec))
e4067dbb 13127 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
545fd46b
MR
13128 rel, 1, relend,
13129 ppc64_elf_howto_table[r_type], 0,
e4067dbb 13130 contents);
ab96bf03
AM
13131
13132 if (info->relocatable)
13133 continue;
13134
f40da81b
AM
13135 if (h != NULL && &h->elf == htab->elf.hgot)
13136 {
13137 relocation = (TOCstart
13138 + htab->stub_group[input_section->id].toc_off);
13139 sec = bfd_abs_section_ptr;
13140 unresolved_reloc = FALSE;
13141 }
13142
951fd09b
AM
13143 /* TLS optimizations. Replace instruction sequences and relocs
13144 based on information we collected in tls_optimize. We edit
13145 RELOCS so that --emit-relocs will output something sensible
13146 for the final instruction stream. */
13147 tls_mask = 0;
13148 tls_gd = 0;
0d4792f7 13149 toc_symndx = 0;
727fc41e
AM
13150 if (h != NULL)
13151 tls_mask = h->tls_mask;
13152 else if (local_got_ents != NULL)
411e1bfb 13153 {
e054468f
AM
13154 struct plt_entry **local_plt = (struct plt_entry **)
13155 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 13156 unsigned char *lgot_masks = (unsigned char *)
e054468f 13157 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
13158 tls_mask = lgot_masks[r_symndx];
13159 }
13160 if (tls_mask == 0
13161 && (r_type == R_PPC64_TLS
13162 || r_type == R_PPC64_TLSGD
13163 || r_type == R_PPC64_TLSLD))
13164 {
13165 /* Check for toc tls entries. */
f961d9dd 13166 unsigned char *toc_tls;
0d4792f7 13167
727fc41e
AM
13168 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13169 &local_syms, rel, input_bfd))
13170 return FALSE;
0d4792f7 13171
727fc41e
AM
13172 if (toc_tls)
13173 tls_mask = *toc_tls;
0d4792f7
AM
13174 }
13175
13176 /* Check that tls relocs are used with tls syms, and non-tls
13177 relocs are used with non-tls syms. */
cf35638d 13178 if (r_symndx != STN_UNDEF
0d4792f7
AM
13179 && r_type != R_PPC64_NONE
13180 && (h == NULL
039b3fef
AM
13181 || h->elf.root.type == bfd_link_hash_defined
13182 || h->elf.root.type == bfd_link_hash_defweak)
1d483afe
AM
13183 && (IS_PPC64_TLS_RELOC (r_type)
13184 != (sym_type == STT_TLS
13185 || (sym_type == STT_SECTION
13186 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
0d4792f7 13187 {
727fc41e
AM
13188 if (tls_mask != 0
13189 && (r_type == R_PPC64_TLS
13190 || r_type == R_PPC64_TLSGD
13191 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
13192 /* R_PPC64_TLS is OK against a symbol in the TOC. */
13193 ;
13194 else
25f53a85 13195 info->callbacks->einfo
1d483afe 13196 (!IS_PPC64_TLS_RELOC (r_type)
bc30df16
AM
13197 ? _("%P: %H: %s used with TLS symbol `%T'\n")
13198 : _("%P: %H: %s used with non-TLS symbol `%T'\n"),
25f53a85 13199 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
13200 ppc64_elf_howto_table[r_type]->name,
13201 sym_name);
411e1bfb
AM
13202 }
13203
13204 /* Ensure reloc mapping code below stays sane. */
13205 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
13206 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
13207 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
13208 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
13209 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
13210 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
13211 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
13212 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
13213 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
13214 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
13215 abort ();
0d4792f7 13216
411e1bfb
AM
13217 switch (r_type)
13218 {
13219 default:
411e1bfb
AM
13220 break;
13221
ba761f19
AM
13222 case R_PPC64_LO_DS_OPT:
13223 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
13224 if ((insn & (0x3f << 26)) != 58u << 26)
13225 abort ();
13226 insn += (14u << 26) - (58u << 26);
13227 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
13228 r_type = R_PPC64_TOC16_LO;
13229 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13230 break;
13231
411e1bfb
AM
13232 case R_PPC64_TOC16:
13233 case R_PPC64_TOC16_LO:
13234 case R_PPC64_TOC16_DS:
13235 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
13236 {
13237 /* Check for toc tls entries. */
f961d9dd 13238 unsigned char *toc_tls;
951fd09b 13239 int retval;
411e1bfb 13240
3a71aa26
AM
13241 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13242 &local_syms, rel, input_bfd);
951fd09b 13243 if (retval == 0)
411e1bfb
AM
13244 return FALSE;
13245
13246 if (toc_tls)
13247 {
951fd09b 13248 tls_mask = *toc_tls;
411e1bfb
AM
13249 if (r_type == R_PPC64_TOC16_DS
13250 || r_type == R_PPC64_TOC16_LO_DS)
81407a69
AM
13251 {
13252 if (tls_mask != 0
13253 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
13254 goto toctprel;
13255 }
411e1bfb 13256 else
951fd09b
AM
13257 {
13258 /* If we found a GD reloc pair, then we might be
13259 doing a GD->IE transition. */
13260 if (retval == 2)
13261 {
13262 tls_gd = TLS_TPRELGD;
13263 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
102890f0 13264 goto tls_ldgd_opt;
951fd09b
AM
13265 }
13266 else if (retval == 3)
13267 {
13268 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
102890f0 13269 goto tls_ldgd_opt;
951fd09b
AM
13270 }
13271 }
411e1bfb
AM
13272 }
13273 }
13274 break;
13275
9d6ded02
AM
13276 case R_PPC64_GOT_TPREL16_HI:
13277 case R_PPC64_GOT_TPREL16_HA:
13278 if (tls_mask != 0
13279 && (tls_mask & TLS_TPREL) == 0)
13280 {
13281 rel->r_offset -= d_offset;
13282 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13283 r_type = R_PPC64_NONE;
13284 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13285 }
13286 break;
13287
411e1bfb
AM
13288 case R_PPC64_GOT_TPREL16_DS:
13289 case R_PPC64_GOT_TPREL16_LO_DS:
951fd09b
AM
13290 if (tls_mask != 0
13291 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 13292 {
81407a69 13293 toctprel:
4fe5ca5b 13294 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
411e1bfb
AM
13295 insn &= 31 << 21;
13296 insn |= 0x3c0d0000; /* addis 0,13,0 */
4fe5ca5b 13297 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
411e1bfb 13298 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
13299 if (toc_symndx != 0)
13300 {
13301 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 13302 rel->r_addend = toc_addend;
0d4792f7
AM
13303 /* We changed the symbol. Start over in order to
13304 get h, sym, sec etc. right. */
13305 rel--;
13306 continue;
13307 }
13308 else
13309 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
13310 }
13311 break;
13312
13313 case R_PPC64_TLS:
951fd09b
AM
13314 if (tls_mask != 0
13315 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 13316 {
411e1bfb 13317 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
2d0f3896
AM
13318 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
13319 if (insn == 0)
411e1bfb 13320 abort ();
411e1bfb 13321 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
411e1bfb 13322 /* Was PPC64_TLS which sits on insn boundary, now
4fe5ca5b
GM
13323 PPC64_TPREL16_LO which is at low-order half-word. */
13324 rel->r_offset += d_offset;
0d4792f7
AM
13325 r_type = R_PPC64_TPREL16_LO;
13326 if (toc_symndx != 0)
13327 {
13328 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 13329 rel->r_addend = toc_addend;
0d4792f7
AM
13330 /* We changed the symbol. Start over in order to
13331 get h, sym, sec etc. right. */
13332 rel--;
13333 continue;
13334 }
13335 else
13336 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
13337 }
13338 break;
13339
411e1bfb
AM
13340 case R_PPC64_GOT_TLSGD16_HI:
13341 case R_PPC64_GOT_TLSGD16_HA:
951fd09b
AM
13342 tls_gd = TLS_TPRELGD;
13343 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13344 goto tls_gdld_hi;
13345 break;
13346
411e1bfb
AM
13347 case R_PPC64_GOT_TLSLD16_HI:
13348 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 13349 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 13350 {
951fd09b
AM
13351 tls_gdld_hi:
13352 if ((tls_mask & tls_gd) != 0)
13353 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13354 + R_PPC64_GOT_TPREL16_DS);
13355 else
411e1bfb 13356 {
4fe5ca5b 13357 rel->r_offset -= d_offset;
727ac201 13358 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
951fd09b 13359 r_type = R_PPC64_NONE;
411e1bfb 13360 }
951fd09b 13361 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
13362 }
13363 break;
13364
951fd09b
AM
13365 case R_PPC64_GOT_TLSGD16:
13366 case R_PPC64_GOT_TLSGD16_LO:
13367 tls_gd = TLS_TPRELGD;
13368 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
102890f0 13369 goto tls_ldgd_opt;
951fd09b 13370 break;
411e1bfb 13371
951fd09b
AM
13372 case R_PPC64_GOT_TLSLD16:
13373 case R_PPC64_GOT_TLSLD16_LO:
13374 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13375 {
3a71aa26 13376 unsigned int insn1, insn2, insn3;
102890f0
AM
13377 bfd_vma offset;
13378
13379 tls_ldgd_opt:
727fc41e
AM
13380 offset = (bfd_vma) -1;
13381 /* If not using the newer R_PPC64_TLSGD/LD to mark
13382 __tls_get_addr calls, we must trust that the call
13383 stays with its arg setup insns, ie. that the next
13384 reloc is the __tls_get_addr call associated with
13385 the current reloc. Edit both insns. */
13386 if (input_section->has_tls_get_addr_call
13387 && rel + 1 < relend
13388 && branch_reloc_hash_match (input_bfd, rel + 1,
13389 htab->tls_get_addr,
13390 htab->tls_get_addr_fd))
13391 offset = rel[1].r_offset;
102890f0 13392 if ((tls_mask & tls_gd) != 0)
411e1bfb 13393 {
102890f0 13394 /* IE */
3a71aa26
AM
13395 insn1 = bfd_get_32 (output_bfd,
13396 contents + rel->r_offset - d_offset);
102890f0
AM
13397 insn1 &= (1 << 26) - (1 << 2);
13398 insn1 |= 58 << 26; /* ld */
13399 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 13400 if (offset != (bfd_vma) -1)
f58d5a2d 13401 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
102890f0
AM
13402 if ((tls_mask & TLS_EXPLICIT) == 0)
13403 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13404 + R_PPC64_GOT_TPREL16_DS);
411e1bfb 13405 else
102890f0
AM
13406 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
13407 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13408 }
13409 else
13410 {
13411 /* LE */
13412 insn1 = 0x3c6d0000; /* addis 3,13,0 */
13413 insn2 = 0x38630000; /* addi 3,3,0 */
13414 if (tls_gd == 0)
951fd09b 13415 {
102890f0 13416 /* Was an LD reloc. */
1d483afe
AM
13417 if (toc_symndx)
13418 sec = local_sections[toc_symndx];
13419 for (r_symndx = 0;
13420 r_symndx < symtab_hdr->sh_info;
13421 r_symndx++)
13422 if (local_sections[r_symndx] == sec)
13423 break;
13424 if (r_symndx >= symtab_hdr->sh_info)
cf35638d 13425 r_symndx = STN_UNDEF;
102890f0 13426 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
cf35638d 13427 if (r_symndx != STN_UNDEF)
1d483afe
AM
13428 rel->r_addend -= (local_syms[r_symndx].st_value
13429 + sec->output_offset
13430 + sec->output_section->vma);
951fd09b 13431 }
102890f0 13432 else if (toc_symndx != 0)
3a71aa26
AM
13433 {
13434 r_symndx = toc_symndx;
13435 rel->r_addend = toc_addend;
13436 }
102890f0
AM
13437 r_type = R_PPC64_TPREL16_HA;
13438 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
13439 if (offset != (bfd_vma) -1)
13440 {
13441 rel[1].r_info = ELF64_R_INFO (r_symndx,
13442 R_PPC64_TPREL16_LO);
13443 rel[1].r_offset = offset + d_offset;
13444 rel[1].r_addend = rel->r_addend;
13445 }
102890f0 13446 }
3a71aa26
AM
13447 bfd_put_32 (output_bfd, insn1,
13448 contents + rel->r_offset - d_offset);
727fc41e
AM
13449 if (offset != (bfd_vma) -1)
13450 {
13451 insn3 = bfd_get_32 (output_bfd,
13452 contents + offset + 4);
13453 if (insn3 == NOP
13454 || insn3 == CROR_151515 || insn3 == CROR_313131)
13455 {
13456 rel[1].r_offset += 4;
13457 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13458 insn2 = NOP;
13459 }
13460 bfd_put_32 (output_bfd, insn2, contents + offset);
13461 }
13462 if ((tls_mask & tls_gd) == 0
13463 && (tls_gd == 0 || toc_symndx != 0))
13464 {
13465 /* We changed the symbol. Start over in order
13466 to get h, sym, sec etc. right. */
13467 rel--;
13468 continue;
13469 }
13470 }
13471 break;
13472
13473 case R_PPC64_TLSGD:
13474 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13475 {
13476 unsigned int insn2, insn3;
13477 bfd_vma offset = rel->r_offset;
13478
13479 if ((tls_mask & TLS_TPRELGD) != 0)
13480 {
13481 /* IE */
13482 r_type = R_PPC64_NONE;
13483 insn2 = 0x7c636a14; /* add 3,3,13 */
13484 }
13485 else
13486 {
13487 /* LE */
13488 if (toc_symndx != 0)
13489 {
13490 r_symndx = toc_symndx;
13491 rel->r_addend = toc_addend;
13492 }
13493 r_type = R_PPC64_TPREL16_LO;
13494 rel->r_offset = offset + d_offset;
13495 insn2 = 0x38630000; /* addi 3,3,0 */
13496 }
13497 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13498 /* Zap the reloc on the _tls_get_addr call too. */
13499 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 13500 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
3a71aa26
AM
13501 insn3 = bfd_get_32 (output_bfd,
13502 contents + offset + 4);
102890f0
AM
13503 if (insn3 == NOP
13504 || insn3 == CROR_151515 || insn3 == CROR_313131)
13505 {
727fc41e 13506 rel->r_offset += 4;
3a71aa26
AM
13507 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13508 insn2 = NOP;
102890f0 13509 }
102890f0 13510 bfd_put_32 (output_bfd, insn2, contents + offset);
727fc41e 13511 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
102890f0 13512 {
102890f0
AM
13513 rel--;
13514 continue;
411e1bfb 13515 }
411e1bfb 13516 }
411e1bfb
AM
13517 break;
13518
727fc41e
AM
13519 case R_PPC64_TLSLD:
13520 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13521 {
13522 unsigned int insn2, insn3;
13523 bfd_vma offset = rel->r_offset;
13524
13525 if (toc_symndx)
13526 sec = local_sections[toc_symndx];
13527 for (r_symndx = 0;
13528 r_symndx < symtab_hdr->sh_info;
13529 r_symndx++)
13530 if (local_sections[r_symndx] == sec)
13531 break;
13532 if (r_symndx >= symtab_hdr->sh_info)
cf35638d 13533 r_symndx = STN_UNDEF;
727fc41e 13534 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
cf35638d 13535 if (r_symndx != STN_UNDEF)
727fc41e
AM
13536 rel->r_addend -= (local_syms[r_symndx].st_value
13537 + sec->output_offset
13538 + sec->output_section->vma);
13539
13540 r_type = R_PPC64_TPREL16_LO;
13541 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13542 rel->r_offset = offset + d_offset;
13543 /* Zap the reloc on the _tls_get_addr call too. */
13544 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 13545 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
727fc41e
AM
13546 insn2 = 0x38630000; /* addi 3,3,0 */
13547 insn3 = bfd_get_32 (output_bfd,
13548 contents + offset + 4);
13549 if (insn3 == NOP
13550 || insn3 == CROR_151515 || insn3 == CROR_313131)
13551 {
13552 rel->r_offset += 4;
13553 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13554 insn2 = NOP;
13555 }
13556 bfd_put_32 (output_bfd, insn2, contents + offset);
13557 rel--;
13558 continue;
13559 }
13560 break;
13561
411e1bfb 13562 case R_PPC64_DTPMOD64:
951fd09b
AM
13563 if (rel + 1 < relend
13564 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
13565 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 13566 {
951fd09b
AM
13567 if ((tls_mask & TLS_GD) == 0)
13568 {
13569 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
13570 if ((tls_mask & TLS_TPRELGD) != 0)
13571 r_type = R_PPC64_TPREL64;
13572 else
13573 {
4ce794b7 13574 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
13575 r_type = R_PPC64_NONE;
13576 }
13577 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13578 }
13579 }
13580 else
13581 {
13582 if ((tls_mask & TLS_LD) == 0)
411e1bfb 13583 {
4ce794b7 13584 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 13585 r_type = R_PPC64_NONE;
951fd09b 13586 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 13587 }
411e1bfb
AM
13588 }
13589 break;
13590
13591 case R_PPC64_TPREL64:
951fd09b 13592 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
13593 {
13594 r_type = R_PPC64_NONE;
13595 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13596 }
13597 break;
52a82034
AM
13598
13599 case R_PPC64_REL16_HA:
13600 /* If we are generating a non-PIC executable, edit
13601 . 0: addis 2,12,.TOC.-0b@ha
13602 . addi 2,2,.TOC.-0b@l
13603 used by ELFv2 global entry points to set up r2, to
13604 . lis 2,.TOC.@ha
13605 . addi 2,2,.TOC.@l
13606 if .TOC. is in range. */
13607 if (!info->shared
810d4e75 13608 && !info->traditional_format
52a82034
AM
13609 && h != NULL && &h->elf == htab->elf.hgot
13610 && rel + 1 < relend
13611 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
13612 && rel[1].r_offset == rel->r_offset + 4
13613 && rel[1].r_addend == rel->r_addend + 4
13614 && relocation + 0x80008000 <= 0xffffffff)
13615 {
13616 unsigned int insn1, insn2;
13617 bfd_vma offset = rel->r_offset - d_offset;
13618 insn1 = bfd_get_32 (output_bfd, contents + offset);
13619 insn2 = bfd_get_32 (output_bfd, contents + offset + 4);
13620 if ((insn1 & 0xffff0000) == 0x3c4c0000 /* addis 2,12 */
13621 && (insn2 & 0xffff0000) == 0x38420000 /* addi 2,2 */)
13622 {
13623 r_type = R_PPC64_ADDR16_HA;
13624 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13625 rel->r_addend -= d_offset;
13626 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
13627 rel[1].r_addend -= d_offset + 4;
13628 bfd_put_32 (output_bfd, 0x3c400000, contents + offset);
13629 }
13630 }
13631 break;
411e1bfb
AM
13632 }
13633
13634 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 13635 insn = 0;
b25116a9
AM
13636 max_br_offset = 1 << 25;
13637 addend = rel->r_addend;
bc30df16 13638 reloc_dest = DEST_NORMAL;
65f38f15 13639 switch (r_type)
5bd4f169
AM
13640 {
13641 default:
65f38f15 13642 break;
5bd4f169 13643
3b421ab3
AM
13644 case R_PPC64_TOCSAVE:
13645 if (relocation + addend == (rel->r_offset
13646 + input_section->output_offset
13647 + input_section->output_section->vma)
13648 && tocsave_find (htab, NO_INSERT,
13649 &local_syms, rel, input_bfd))
13650 {
13651 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
13652 if (insn == NOP
13653 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
13654 bfd_put_32 (input_bfd,
13655 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
13656 contents + rel->r_offset);
13657 }
13658 break;
13659
65f38f15
AM
13660 /* Branch taken prediction relocations. */
13661 case R_PPC64_ADDR14_BRTAKEN:
13662 case R_PPC64_REL14_BRTAKEN:
cedb70c5
KH
13663 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
13664 /* Fall thru. */
65f38f15 13665
86c76c7b 13666 /* Branch not taken prediction relocations. */
65f38f15
AM
13667 case R_PPC64_ADDR14_BRNTAKEN:
13668 case R_PPC64_REL14_BRNTAKEN:
411e1bfb
AM
13669 insn |= bfd_get_32 (output_bfd,
13670 contents + rel->r_offset) & ~(0x01 << 21);
b25116a9 13671 /* Fall thru. */
86c76c7b 13672
b25116a9
AM
13673 case R_PPC64_REL14:
13674 max_br_offset = 1 << 15;
13675 /* Fall thru. */
5bd4f169 13676
65f38f15 13677 case R_PPC64_REL24:
ad8e1ba5
AM
13678 /* Calls to functions with a different TOC, such as calls to
13679 shared objects, need to alter the TOC pointer. This is
13680 done using a linkage stub. A REL24 branching to these
13681 linkage stubs needs to be followed by a nop, as the nop
13682 will be replaced with an instruction to restore the TOC
13683 base pointer. */
8387904d 13684 fdh = h;
b31867b6
AM
13685 if (h != NULL
13686 && h->oh != NULL
13687 && h->oh->is_func_descriptor)
13688 fdh = ppc_follow_link (h->oh);
31c76678
DK
13689 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
13690 htab);
6abec6bc 13691 if (stub_entry != NULL
ad8e1ba5 13692 && (stub_entry->stub_type == ppc_stub_plt_call
794e51c0 13693 || stub_entry->stub_type == ppc_stub_plt_call_r2save
ad8e1ba5
AM
13694 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
13695 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
41bd81ab 13696 {
b25116a9 13697 bfd_boolean can_plt_call = FALSE;
721956f4 13698
ba8ca3e7
AM
13699 /* All of these stubs will modify r2, so there must be a
13700 branch and link followed by a nop. The nop is
13701 replaced by an insn to restore r2. */
eea6121a 13702 if (rel->r_offset + 8 <= input_section->size)
41bd81ab 13703 {
ba8ca3e7
AM
13704 unsigned long br;
13705
13706 br = bfd_get_32 (input_bfd,
13707 contents + rel->r_offset);
13708 if ((br & 1) != 0)
41bd81ab 13709 {
ba8ca3e7
AM
13710 unsigned long nop;
13711
13712 nop = bfd_get_32 (input_bfd,
13713 contents + rel->r_offset + 4);
13714 if (nop == NOP
13715 || nop == CROR_151515 || nop == CROR_313131)
a7f2871e 13716 {
ba8ca3e7
AM
13717 if (h != NULL
13718 && (h == htab->tls_get_addr_fd
13719 || h == htab->tls_get_addr)
e7d1c40c 13720 && !htab->params->no_tls_get_addr_opt)
ba8ca3e7
AM
13721 {
13722 /* Special stub used, leave nop alone. */
13723 }
13724 else
a078d95a
AM
13725 bfd_put_32 (input_bfd,
13726 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7
AM
13727 contents + rel->r_offset + 4);
13728 can_plt_call = TRUE;
a7f2871e 13729 }
41bd81ab 13730 }
5bd4f169 13731 }
721956f4 13732
ba8ca3e7 13733 if (!can_plt_call && h != NULL)
721956f4 13734 {
ba8ca3e7
AM
13735 const char *name = h->elf.root.root.string;
13736
13737 if (*name == '.')
13738 ++name;
13739
13740 if (strncmp (name, "__libc_start_main", 17) == 0
13741 && (name[17] == 0 || name[17] == '@'))
6ab189d5 13742 {
ba8ca3e7
AM
13743 /* Allow crt1 branch to go via a toc adjusting
13744 stub. Other calls that never return could do
13745 the same, if we could detect such. */
b25116a9 13746 can_plt_call = TRUE;
6ab189d5 13747 }
ba8ca3e7
AM
13748 }
13749
13750 if (!can_plt_call)
13751 {
13752 /* g++ as of 20130507 emits self-calls without a
13753 following nop. This is arguably wrong since we
13754 have conflicting information. On the one hand a
13755 global symbol and on the other a local call
13756 sequence, but don't error for this special case.
13757 It isn't possible to cheaply verify we have
13758 exactly such a call. Allow all calls to the same
13759 section. */
13760 asection *code_sec = sec;
13761
13762 if (get_opd_info (sec) != NULL)
ad8e1ba5 13763 {
ba8ca3e7
AM
13764 bfd_vma off = (relocation + addend
13765 - sec->output_section->vma
13766 - sec->output_offset);
bc30df16 13767
ba8ca3e7 13768 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 13769 }
ba8ca3e7
AM
13770 if (code_sec == input_section)
13771 can_plt_call = TRUE;
13772 }
13773
13774 if (!can_plt_call)
13775 {
13776 info->callbacks->einfo
13777 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
1a1fb627 13778 "recompile with -fPIC\n"),
ba8ca3e7
AM
13779 input_bfd, input_section, rel->r_offset, sym_name);
13780
13781 bfd_set_error (bfd_error_bad_value);
13782 ret = FALSE;
721956f4
AM
13783 }
13784
b25116a9 13785 if (can_plt_call
794e51c0
AM
13786 && (stub_entry->stub_type == ppc_stub_plt_call
13787 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
b25116a9
AM
13788 unresolved_reloc = FALSE;
13789 }
13790
6abec6bc
AM
13791 if ((stub_entry == NULL
13792 || stub_entry->stub_type == ppc_stub_long_branch
13793 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
13794 && get_opd_info (sec) != NULL)
13795 {
13796 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
13797 bfd_vma off = (relocation + addend
13798 - sec->output_section->vma
13799 - sec->output_offset);
aef36ac1 13800 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
13801 if (dest != (bfd_vma) -1)
13802 {
13803 relocation = dest;
13804 addend = 0;
bc30df16 13805 reloc_dest = DEST_OPD;
8387904d
AM
13806 }
13807 }
13808
b25116a9
AM
13809 /* If the branch is out of reach we ought to have a long
13810 branch stub. */
13811 from = (rel->r_offset
13812 + input_section->output_offset
13813 + input_section->output_section->vma);
13814
6911b7dc
AM
13815 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
13816 ? fdh->elf.other
13817 : sym->st_other);
13818
6abec6bc
AM
13819 if (stub_entry != NULL
13820 && (stub_entry->stub_type == ppc_stub_long_branch
13821 || stub_entry->stub_type == ppc_stub_plt_branch)
13822 && (r_type == R_PPC64_ADDR14_BRTAKEN
13823 || r_type == R_PPC64_ADDR14_BRNTAKEN
13824 || (relocation + addend - from + max_br_offset
13825 < 2 * max_br_offset)))
13826 /* Don't use the stub if this branch is in range. */
13827 stub_entry = NULL;
b25116a9
AM
13828
13829 if (stub_entry != NULL)
13830 {
13831 /* Munge up the value and addend so that we call the stub
13832 rather than the procedure directly. */
13833 relocation = (stub_entry->stub_offset
13834 + stub_entry->stub_sec->output_offset
13835 + stub_entry->stub_sec->output_section->vma);
13836 addend = 0;
bc30df16 13837 reloc_dest = DEST_STUB;
3b421ab3 13838
794e51c0
AM
13839 if ((stub_entry->stub_type == ppc_stub_plt_call
13840 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
13841 && (ALWAYS_EMIT_R2SAVE
13842 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
3b421ab3
AM
13843 && rel + 1 < relend
13844 && rel[1].r_offset == rel->r_offset + 4
13845 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
13846 relocation += 4;
b25116a9
AM
13847 }
13848
13849 if (insn != 0)
13850 {
794e51c0 13851 if (is_isa_v2)
721956f4 13852 {
b25116a9
AM
13853 /* Set 'a' bit. This is 0b00010 in BO field for branch
13854 on CR(BI) insns (BO == 001at or 011at), and 0b01000
13855 for branch on CTR insns (BO == 1a00t or 1a01t). */
13856 if ((insn & (0x14 << 21)) == (0x04 << 21))
13857 insn |= 0x02 << 21;
13858 else if ((insn & (0x14 << 21)) == (0x10 << 21))
13859 insn |= 0x08 << 21;
13860 else
13861 break;
13862 }
13863 else
13864 {
13865 /* Invert 'y' bit if not the default. */
4cc603a5 13866 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 13867 insn ^= 0x01 << 21;
721956f4 13868 }
b25116a9
AM
13869
13870 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5bd4f169 13871 }
e86ce104 13872
06da1e8e
AM
13873 /* NOP out calls to undefined weak functions.
13874 We can thus call a weak function without first
13875 checking whether the function is defined. */
b25116a9 13876 else if (h != NULL
039b3fef 13877 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 13878 && h->elf.dynindx == -1
b25116a9
AM
13879 && r_type == R_PPC64_REL24
13880 && relocation == 0
4cc603a5 13881 && addend == 0)
e86ce104 13882 {
06da1e8e
AM
13883 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13884 continue;
e86ce104 13885 }
65f38f15
AM
13886 break;
13887 }
5bd4f169 13888
65f38f15 13889 /* Set `addend'. */
411e1bfb 13890 tls_type = 0;
65f38f15
AM
13891 switch (r_type)
13892 {
13893 default:
25f53a85 13894 info->callbacks->einfo
bc30df16 13895 (_("%P: %B: unknown relocation type %d for `%T'\n"),
d003868e 13896 input_bfd, (int) r_type, sym_name);
5bd4f169 13897
65f38f15 13898 bfd_set_error (bfd_error_bad_value);
b34976b6 13899 ret = FALSE;
65f38f15 13900 continue;
5bd4f169 13901
65f38f15 13902 case R_PPC64_NONE:
411e1bfb 13903 case R_PPC64_TLS:
727fc41e
AM
13904 case R_PPC64_TLSGD:
13905 case R_PPC64_TLSLD:
3b421ab3 13906 case R_PPC64_TOCSAVE:
04c9666a
AM
13907 case R_PPC64_GNU_VTINHERIT:
13908 case R_PPC64_GNU_VTENTRY:
65f38f15 13909 continue;
5bd4f169
AM
13910
13911 /* GOT16 relocations. Like an ADDR16 using the symbol's
13912 address in the GOT as relocation value instead of the
411e1bfb 13913 symbol's value itself. Also, create a GOT entry for the
5bd4f169 13914 symbol and put the symbol value there. */
411e1bfb
AM
13915 case R_PPC64_GOT_TLSGD16:
13916 case R_PPC64_GOT_TLSGD16_LO:
13917 case R_PPC64_GOT_TLSGD16_HI:
13918 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 13919 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
13920 goto dogot;
13921
13922 case R_PPC64_GOT_TLSLD16:
13923 case R_PPC64_GOT_TLSLD16_LO:
13924 case R_PPC64_GOT_TLSLD16_HI:
13925 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 13926 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
13927 goto dogot;
13928
13929 case R_PPC64_GOT_TPREL16_DS:
13930 case R_PPC64_GOT_TPREL16_LO_DS:
13931 case R_PPC64_GOT_TPREL16_HI:
13932 case R_PPC64_GOT_TPREL16_HA:
13933 tls_type = TLS_TLS | TLS_TPREL;
13934 goto dogot;
13935
13936 case R_PPC64_GOT_DTPREL16_DS:
13937 case R_PPC64_GOT_DTPREL16_LO_DS:
13938 case R_PPC64_GOT_DTPREL16_HI:
13939 case R_PPC64_GOT_DTPREL16_HA:
13940 tls_type = TLS_TLS | TLS_DTPREL;
13941 goto dogot;
13942
65f38f15
AM
13943 case R_PPC64_GOT16:
13944 case R_PPC64_GOT16_LO:
13945 case R_PPC64_GOT16_HI:
13946 case R_PPC64_GOT16_HA:
13947 case R_PPC64_GOT16_DS:
13948 case R_PPC64_GOT16_LO_DS:
411e1bfb 13949 dogot:
5bd4f169
AM
13950 {
13951 /* Relocation is to the entry for this symbol in the global
13952 offset table. */
e717da7e 13953 asection *got;
d881513a 13954 bfd_vma *offp;
5bd4f169 13955 bfd_vma off;
d881513a 13956 unsigned long indx = 0;
927be08e 13957 struct got_entry *ent;
65f38f15 13958
d881513a
AM
13959 if (tls_type == (TLS_TLS | TLS_LD)
13960 && (h == NULL
f5385ebf 13961 || !h->elf.def_dynamic))
927be08e 13962 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 13963 else
5bd4f169 13964 {
5bd4f169 13965
d881513a
AM
13966 if (h != NULL)
13967 {
13968 bfd_boolean dyn = htab->elf.dynamic_sections_created;
039b3fef
AM
13969 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
13970 &h->elf)
d881513a 13971 || (info->shared
afe397ea 13972 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
d881513a
AM
13973 /* This is actually a static link, or it is a
13974 -Bsymbolic link and the symbol is defined
13975 locally, or the symbol was forced to be local
13976 because of a version file. */
13977 ;
13978 else
13979 {
14acf4dc 13980 BFD_ASSERT (h->elf.dynindx != -1);
039b3fef 13981 indx = h->elf.dynindx;
d881513a
AM
13982 unresolved_reloc = FALSE;
13983 }
039b3fef 13984 ent = h->elf.got.glist;
d881513a 13985 }
411e1bfb 13986 else
5bd4f169 13987 {
d881513a
AM
13988 if (local_got_ents == NULL)
13989 abort ();
13990 ent = local_got_ents[r_symndx];
5bd4f169 13991 }
d881513a
AM
13992
13993 for (; ent != NULL; ent = ent->next)
31c76678 13994 if (ent->addend == orig_rel.r_addend
e717da7e 13995 && ent->owner == input_bfd
d881513a
AM
13996 && ent->tls_type == tls_type)
13997 break;
5bd4f169 13998 }
411e1bfb 13999
927be08e
AM
14000 if (ent == NULL)
14001 abort ();
14002 if (ent->is_indirect)
14003 ent = ent->got.ent;
14004 offp = &ent->got.offset;
14005 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
14006 if (got == NULL)
14007 abort ();
14008
411e1bfb
AM
14009 /* The offset must always be a multiple of 8. We use the
14010 least significant bit to record whether we have already
14011 processed this entry. */
d881513a 14012 off = *offp;
411e1bfb
AM
14013 if ((off & 1) != 0)
14014 off &= ~1;
5bd4f169
AM
14015 else
14016 {
411e1bfb
AM
14017 /* Generate relocs for the dynamic linker, except in
14018 the case of TLSLD where we'll use one entry per
14019 module. */
25f23106
AM
14020 asection *relgot;
14021 bfd_boolean ifunc;
e717da7e 14022
d881513a 14023 *offp = off | 1;
25f23106
AM
14024 relgot = NULL;
14025 ifunc = (h != NULL
14026 ? h->elf.type == STT_GNU_IFUNC
14027 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 14028 if (ifunc)
33e44f2e 14029 relgot = htab->elf.irelplt;
19e08130
AM
14030 else if ((info->shared || indx != 0)
14031 && (h == NULL
14032 || (tls_type == (TLS_TLS | TLS_LD)
14033 && !h->elf.def_dynamic)
14034 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
14035 || h->elf.root.type != bfd_link_hash_undefweak))
14036 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 14037 if (relgot != NULL)
5bd4f169 14038 {
e717da7e
AM
14039 outrel.r_offset = (got->output_section->vma
14040 + got->output_offset
411e1bfb 14041 + off);
4cc603a5 14042 outrel.r_addend = addend;
d881513a 14043 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 14044 {
411e1bfb 14045 outrel.r_addend = 0;
e515b051 14046 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
14047 if (tls_type == (TLS_TLS | TLS_GD))
14048 {
e717da7e
AM
14049 loc = relgot->contents;
14050 loc += (relgot->reloc_count++
d881513a
AM
14051 * sizeof (Elf64_External_Rela));
14052 bfd_elf64_swap_reloca_out (output_bfd,
14053 &outrel, loc);
e515b051 14054 outrel.r_offset += 8;
4cc603a5 14055 outrel.r_addend = addend;
d881513a
AM
14056 outrel.r_info
14057 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 14058 }
411e1bfb 14059 }
951fd09b 14060 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 14061 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 14062 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 14063 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
14064 else if (indx != 0)
14065 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
14066 else
81407a69 14067 {
25f23106
AM
14068 if (ifunc)
14069 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14070 else
14071 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
14072
14073 /* Write the .got section contents for the sake
14074 of prelink. */
e717da7e 14075 loc = got->contents + off;
23fbd6fa
JJ
14076 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
14077 loc);
81407a69 14078 }
81407a69
AM
14079
14080 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
14081 {
14082 outrel.r_addend += relocation;
14083 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
e1918d23 14084 outrel.r_addend -= htab->elf.tls_sec->vma;
e515b051 14085 }
e717da7e
AM
14086 loc = relgot->contents;
14087 loc += (relgot->reloc_count++
411e1bfb
AM
14088 * sizeof (Elf64_External_Rela));
14089 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14090 }
14091
ad8e1ba5 14092 /* Init the .got section contents here if we're not
81407a69 14093 emitting a reloc. */
d881513a 14094 else
411e1bfb 14095 {
4cc603a5 14096 relocation += addend;
7b609f53
AM
14097 if (tls_type == (TLS_TLS | TLS_LD))
14098 relocation = 1;
14099 else if (tls_type != 0)
411e1bfb 14100 {
e1918d23 14101 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
7b609f53 14102 if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 14103 relocation += DTP_OFFSET - TP_OFFSET;
5bd4f169 14104
7b609f53
AM
14105 if (tls_type == (TLS_TLS | TLS_GD))
14106 {
14107 bfd_put_64 (output_bfd, relocation,
e717da7e 14108 got->contents + off + 8);
7b609f53
AM
14109 relocation = 1;
14110 }
411e1bfb 14111 }
7b609f53 14112
411e1bfb 14113 bfd_put_64 (output_bfd, relocation,
e717da7e 14114 got->contents + off);
5bd4f169
AM
14115 }
14116 }
14117
65f38f15
AM
14118 if (off >= (bfd_vma) -2)
14119 abort ();
14120
bf102f86
AM
14121 relocation = got->output_section->vma + got->output_offset + off;
14122 addend = -(TOCstart + htab->stub_group[input_section->id].toc_off);
5bd4f169 14123 }
65f38f15
AM
14124 break;
14125
14126 case R_PPC64_PLT16_HA:
14127 case R_PPC64_PLT16_HI:
14128 case R_PPC64_PLT16_LO:
14129 case R_PPC64_PLT32:
14130 case R_PPC64_PLT64:
14131 /* Relocation is to the entry for this symbol in the
14132 procedure linkage table. */
14133
14134 /* Resolve a PLT reloc against a local symbol directly,
14135 without using the procedure linkage table. */
14136 if (h == NULL)
14137 break;
14138
411e1bfb
AM
14139 /* It's possible that we didn't make a PLT entry for this
14140 symbol. This happens when statically linking PIC code,
14141 or when using -Bsymbolic. Go find a match if there is a
14142 PLT entry. */
33e44f2e 14143 if (htab->elf.splt != NULL)
65f38f15 14144 {
411e1bfb 14145 struct plt_entry *ent;
039b3fef 14146 for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
a345bc8d
AM
14147 if (ent->plt.offset != (bfd_vma) -1
14148 && ent->addend == orig_rel.r_addend)
411e1bfb 14149 {
33e44f2e
AM
14150 relocation = (htab->elf.splt->output_section->vma
14151 + htab->elf.splt->output_offset
411e1bfb
AM
14152 + ent->plt.offset);
14153 unresolved_reloc = FALSE;
a345bc8d 14154 break;
411e1bfb 14155 }
65f38f15 14156 }
65f38f15 14157 break;
5bd4f169 14158
0b13192e
AM
14159 case R_PPC64_TOC:
14160 /* Relocation value is TOC base. */
14161 relocation = TOCstart;
cf35638d 14162 if (r_symndx == STN_UNDEF)
0b13192e 14163 relocation += htab->stub_group[input_section->id].toc_off;
8517fae7
AM
14164 else if (unresolved_reloc)
14165 ;
14166 else if (sec != NULL && sec->id <= htab->top_id)
0b13192e
AM
14167 relocation += htab->stub_group[sec->id].toc_off;
14168 else
14169 unresolved_reloc = TRUE;
ab96bf03 14170 goto dodyn;
0b13192e 14171
5bd4f169
AM
14172 /* TOC16 relocs. We want the offset relative to the TOC base,
14173 which is the address of the start of the TOC plus 0x8000.
14174 The TOC consists of sections .got, .toc, .tocbss, and .plt,
14175 in this order. */
65f38f15
AM
14176 case R_PPC64_TOC16:
14177 case R_PPC64_TOC16_LO:
14178 case R_PPC64_TOC16_HI:
14179 case R_PPC64_TOC16_DS:
14180 case R_PPC64_TOC16_LO_DS:
14181 case R_PPC64_TOC16_HA:
ad8e1ba5 14182 addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
5bd4f169
AM
14183 break;
14184
14185 /* Relocate against the beginning of the section. */
65f38f15
AM
14186 case R_PPC64_SECTOFF:
14187 case R_PPC64_SECTOFF_LO:
14188 case R_PPC64_SECTOFF_HI:
14189 case R_PPC64_SECTOFF_DS:
14190 case R_PPC64_SECTOFF_LO_DS:
14191 case R_PPC64_SECTOFF_HA:
4ce794b7 14192 if (sec != NULL)
65f38f15 14193 addend -= sec->output_section->vma;
5bd4f169
AM
14194 break;
14195
25f23106
AM
14196 case R_PPC64_REL16:
14197 case R_PPC64_REL16_LO:
14198 case R_PPC64_REL16_HI:
14199 case R_PPC64_REL16_HA:
14200 break;
14201
721956f4
AM
14202 case R_PPC64_REL14:
14203 case R_PPC64_REL14_BRNTAKEN:
14204 case R_PPC64_REL14_BRTAKEN:
5d1634d7
AM
14205 case R_PPC64_REL24:
14206 break;
14207
411e1bfb
AM
14208 case R_PPC64_TPREL16:
14209 case R_PPC64_TPREL16_LO:
14210 case R_PPC64_TPREL16_HI:
14211 case R_PPC64_TPREL16_HA:
14212 case R_PPC64_TPREL16_DS:
14213 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
14214 case R_PPC64_TPREL16_HIGH:
14215 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
14216 case R_PPC64_TPREL16_HIGHER:
14217 case R_PPC64_TPREL16_HIGHERA:
14218 case R_PPC64_TPREL16_HIGHEST:
14219 case R_PPC64_TPREL16_HIGHESTA:
766bc656
AM
14220 if (h != NULL
14221 && h->elf.root.type == bfd_link_hash_undefweak
14222 && h->elf.dynindx == -1)
14223 {
14224 /* Make this relocation against an undefined weak symbol
14225 resolve to zero. This is really just a tweak, since
14226 code using weak externs ought to check that they are
14227 defined before using them. */
14228 bfd_byte *p = contents + rel->r_offset - d_offset;
14229
14230 insn = bfd_get_32 (output_bfd, p);
14231 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
14232 if (insn != 0)
14233 bfd_put_32 (output_bfd, insn, p);
14234 break;
14235 }
e1918d23 14236 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
14237 if (info->shared)
14238 /* The TPREL16 relocs shouldn't really be used in shared
14239 libs as they will result in DT_TEXTREL being set, but
14240 support them anyway. */
14241 goto dodyn;
14242 break;
14243
14244 case R_PPC64_DTPREL16:
14245 case R_PPC64_DTPREL16_LO:
14246 case R_PPC64_DTPREL16_HI:
14247 case R_PPC64_DTPREL16_HA:
14248 case R_PPC64_DTPREL16_DS:
14249 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
14250 case R_PPC64_DTPREL16_HIGH:
14251 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
14252 case R_PPC64_DTPREL16_HIGHER:
14253 case R_PPC64_DTPREL16_HIGHERA:
14254 case R_PPC64_DTPREL16_HIGHEST:
14255 case R_PPC64_DTPREL16_HIGHESTA:
e1918d23 14256 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
14257 break;
14258
45965137
AM
14259 case R_PPC64_ADDR64_LOCAL:
14260 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
14261 ? h->elf.other
14262 : sym->st_other);
14263 break;
14264
e515b051
AM
14265 case R_PPC64_DTPMOD64:
14266 relocation = 1;
14267 addend = 0;
14268 goto dodyn;
14269
411e1bfb 14270 case R_PPC64_TPREL64:
e1918d23 14271 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
14272 goto dodyn;
14273
14274 case R_PPC64_DTPREL64:
e1918d23 14275 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
14276 /* Fall thru */
14277
65f38f15
AM
14278 /* Relocations that may need to be propagated if this is a
14279 dynamic object. */
04c9666a 14280 case R_PPC64_REL30:
65f38f15
AM
14281 case R_PPC64_REL32:
14282 case R_PPC64_REL64:
14283 case R_PPC64_ADDR14:
14284 case R_PPC64_ADDR14_BRNTAKEN:
14285 case R_PPC64_ADDR14_BRTAKEN:
14286 case R_PPC64_ADDR16:
14287 case R_PPC64_ADDR16_DS:
14288 case R_PPC64_ADDR16_HA:
14289 case R_PPC64_ADDR16_HI:
f9c6b907
AM
14290 case R_PPC64_ADDR16_HIGH:
14291 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
14292 case R_PPC64_ADDR16_HIGHER:
14293 case R_PPC64_ADDR16_HIGHERA:
14294 case R_PPC64_ADDR16_HIGHEST:
14295 case R_PPC64_ADDR16_HIGHESTA:
14296 case R_PPC64_ADDR16_LO:
14297 case R_PPC64_ADDR16_LO_DS:
14298 case R_PPC64_ADDR24:
65f38f15
AM
14299 case R_PPC64_ADDR32:
14300 case R_PPC64_ADDR64:
14301 case R_PPC64_UADDR16:
14302 case R_PPC64_UADDR32:
14303 case R_PPC64_UADDR64:
411e1bfb 14304 dodyn:
5d1634d7 14305 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
14306 break;
14307
41bd81ab
AM
14308 if (NO_OPD_RELOCS && is_opd)
14309 break;
14310
65f38f15 14311 if ((info->shared
4e795f50 14312 && (h == NULL
039b3fef
AM
14313 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
14314 || h->elf.root.type != bfd_link_hash_undefweak)
1d483afe 14315 && (must_be_dyn_reloc (info, r_type)
039b3fef 14316 || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
f4656909
AM
14317 || (ELIMINATE_COPY_RELOCS
14318 && !info->shared
65f38f15 14319 && h != NULL
039b3fef 14320 && h->elf.dynindx != -1
f5385ebf 14321 && !h->elf.non_got_ref
25f23106
AM
14322 && !h->elf.def_regular)
14323 || (!info->shared
14324 && (h != NULL
14325 ? h->elf.type == STT_GNU_IFUNC
14326 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
65f38f15 14327 {
b34976b6 14328 bfd_boolean skip, relocate;
65f38f15 14329 asection *sreloc;
1cf1f670 14330 bfd_vma out_off;
65f38f15
AM
14331
14332 /* When generating a dynamic object, these relocations
14333 are copied into the output file to be resolved at run
14334 time. */
14335
b34976b6
AM
14336 skip = FALSE;
14337 relocate = FALSE;
65f38f15 14338
1cf1f670
AM
14339 out_off = _bfd_elf_section_offset (output_bfd, info,
14340 input_section, rel->r_offset);
14341 if (out_off == (bfd_vma) -1)
b34976b6 14342 skip = TRUE;
1cf1f670 14343 else if (out_off == (bfd_vma) -2)
b34976b6 14344 skip = TRUE, relocate = TRUE;
1cf1f670
AM
14345 out_off += (input_section->output_section->vma
14346 + input_section->output_offset);
14347 outrel.r_offset = out_off;
411e1bfb 14348 outrel.r_addend = rel->r_addend;
65f38f15 14349
1cf1f670
AM
14350 /* Optimize unaligned reloc use. */
14351 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
14352 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
14353 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
14354 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
14355 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
14356 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
14357 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
14358 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
14359 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
14360
65f38f15 14361 if (skip)
0bb2d96a 14362 memset (&outrel, 0, sizeof outrel);
afe397ea 14363 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
14364 && !is_opd
14365 && r_type != R_PPC64_TOC)
14acf4dc
MR
14366 {
14367 BFD_ASSERT (h->elf.dynindx != -1);
14368 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
14369 }
65f38f15
AM
14370 else
14371 {
41bd81ab
AM
14372 /* This symbol is local, or marked to become local,
14373 or this is an opd section reloc which must point
14374 at a local function. */
65f38f15 14375 outrel.r_addend += relocation;
e86ce104 14376 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 14377 {
3fad3c7c 14378 if (is_opd && h != NULL)
afbe61cf
AM
14379 {
14380 /* Lie about opd entries. This case occurs
14381 when building shared libraries and we
14382 reference a function in another shared
3fad3c7c
AM
14383 lib. The same thing happens for a weak
14384 definition in an application that's
14385 overridden by a strong definition in a
14386 shared lib. (I believe this is a generic
14387 bug in binutils handling of weak syms.)
14388 In these cases we won't use the opd
1e2f5b6e 14389 entry in this lib. */
b34976b6 14390 unresolved_reloc = FALSE;
afbe61cf 14391 }
25f23106
AM
14392 if (!is_opd
14393 && r_type == R_PPC64_ADDR64
14394 && (h != NULL
14395 ? h->elf.type == STT_GNU_IFUNC
14396 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
14397 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14398 else
14399 {
14400 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 14401
25f23106
AM
14402 /* We need to relocate .opd contents for ld.so.
14403 Prelink also wants simple and consistent rules
14404 for relocs. This make all RELATIVE relocs have
14405 *r_offset equal to r_addend. */
14406 relocate = TRUE;
14407 }
65f38f15
AM
14408 }
14409 else
14410 {
14411 long indx = 0;
14412
25f23106
AM
14413 if (h != NULL
14414 ? h->elf.type == STT_GNU_IFUNC
14415 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14416 {
25f53a85 14417 info->callbacks->einfo
bc30df16
AM
14418 (_("%P: %H: %s for indirect "
14419 "function `%T' unsupported\n"),
25f53a85 14420 input_bfd, input_section, rel->r_offset,
25f23106
AM
14421 ppc64_elf_howto_table[r_type]->name,
14422 sym_name);
14423 ret = FALSE;
14424 }
cf35638d 14425 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
14426 ;
14427 else if (sec == NULL || sec->owner == NULL)
14428 {
14429 bfd_set_error (bfd_error_bad_value);
b34976b6 14430 return FALSE;
65f38f15
AM
14431 }
14432 else
14433 {
14434 asection *osec;
14435
14436 osec = sec->output_section;
14437 indx = elf_section_data (osec)->dynindx;
14438
74541ad4
AM
14439 if (indx == 0)
14440 {
14441 if ((osec->flags & SEC_READONLY) == 0
14442 && htab->elf.data_index_section != NULL)
14443 osec = htab->elf.data_index_section;
14444 else
14445 osec = htab->elf.text_index_section;
14446 indx = elf_section_data (osec)->dynindx;
14447 }
14448 BFD_ASSERT (indx != 0);
14449
65f38f15
AM
14450 /* We are turning this relocation into one
14451 against a section symbol, so subtract out
14452 the output section's address but not the
14453 offset of the input section in the output
14454 section. */
14455 outrel.r_addend -= osec->vma;
14456 }
14457
14458 outrel.r_info = ELF64_R_INFO (indx, r_type);
14459 }
14460 }
14461
14462 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
14463 if (h != NULL
14464 ? h->elf.type == STT_GNU_IFUNC
14465 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
33e44f2e 14466 sreloc = htab->elf.irelplt;
65f38f15
AM
14467 if (sreloc == NULL)
14468 abort ();
14469
dfbb6ac9
AM
14470 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
14471 >= sreloc->size)
14472 abort ();
947216bf
AM
14473 loc = sreloc->contents;
14474 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
14475 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14476
14477 /* If this reloc is against an external symbol, it will
14478 be computed at runtime, so there's no need to do
81407a69
AM
14479 anything now. However, for the sake of prelink ensure
14480 that the section contents are a known value. */
65f38f15 14481 if (! relocate)
81407a69
AM
14482 {
14483 unresolved_reloc = FALSE;
14484 /* The value chosen here is quite arbitrary as ld.so
14485 ignores section contents except for the special
14486 case of .opd where the contents might be accessed
14487 before relocation. Choose zero, as that won't
14488 cause reloc overflow. */
14489 relocation = 0;
14490 addend = 0;
14491 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
14492 to improve backward compatibility with older
14493 versions of ld. */
14494 if (r_type == R_PPC64_ADDR64)
14495 addend = outrel.r_addend;
14496 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 14497 else if (ppc64_elf_howto_table[r_type]->pc_relative)
000732f7
AM
14498 addend = (input_section->output_section->vma
14499 + input_section->output_offset
14500 + rel->r_offset);
81407a69 14501 }
65f38f15 14502 }
5bd4f169
AM
14503 break;
14504
65f38f15
AM
14505 case R_PPC64_COPY:
14506 case R_PPC64_GLOB_DAT:
14507 case R_PPC64_JMP_SLOT:
25f23106 14508 case R_PPC64_JMP_IREL:
65f38f15
AM
14509 case R_PPC64_RELATIVE:
14510 /* We shouldn't ever see these dynamic relocs in relocatable
14511 files. */
ae9a127f 14512 /* Fall through. */
65f38f15
AM
14513
14514 case R_PPC64_PLTGOT16:
14515 case R_PPC64_PLTGOT16_DS:
14516 case R_PPC64_PLTGOT16_HA:
14517 case R_PPC64_PLTGOT16_HI:
14518 case R_PPC64_PLTGOT16_LO:
14519 case R_PPC64_PLTGOT16_LO_DS:
14520 case R_PPC64_PLTREL32:
14521 case R_PPC64_PLTREL64:
14522 /* These ones haven't been implemented yet. */
14523
25f53a85 14524 info->callbacks->einfo
bc30df16 14525 (_("%P: %B: %s is not supported for `%T'\n"),
d003868e 14526 input_bfd,
4ce794b7 14527 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
14528
14529 bfd_set_error (bfd_error_invalid_operation);
b34976b6 14530 ret = FALSE;
5bd4f169 14531 continue;
65f38f15 14532 }
5bd4f169 14533
67f0cbdb
AM
14534 /* Multi-instruction sequences that access the TOC can be
14535 optimized, eg. addis ra,r2,0; addi rb,ra,x;
14536 to nop; addi rb,r2,x; */
14537 switch (r_type)
14538 {
14539 default:
14540 break;
14541
14542 case R_PPC64_GOT_TLSLD16_HI:
14543 case R_PPC64_GOT_TLSGD16_HI:
14544 case R_PPC64_GOT_TPREL16_HI:
14545 case R_PPC64_GOT_DTPREL16_HI:
14546 case R_PPC64_GOT16_HI:
14547 case R_PPC64_TOC16_HI:
14548 /* These relocs would only be useful if building up an
14549 offset to later add to r2, perhaps in an indexed
14550 addressing mode instruction. Don't try to optimize.
14551 Unfortunately, the possibility of someone building up an
14552 offset like this or even with the HA relocs, means that
14553 we need to check the high insn when optimizing the low
14554 insn. */
14555 break;
14556
14557 case R_PPC64_GOT_TLSLD16_HA:
14558 case R_PPC64_GOT_TLSGD16_HA:
14559 case R_PPC64_GOT_TPREL16_HA:
14560 case R_PPC64_GOT_DTPREL16_HA:
14561 case R_PPC64_GOT16_HA:
14562 case R_PPC64_TOC16_HA:
98528052 14563 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 14564 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052
AM
14565 {
14566 bfd_byte *p = contents + (rel->r_offset & ~3);
14567 bfd_put_32 (input_bfd, NOP, p);
14568 }
67f0cbdb
AM
14569 break;
14570
14571 case R_PPC64_GOT_TLSLD16_LO:
14572 case R_PPC64_GOT_TLSGD16_LO:
14573 case R_PPC64_GOT_TPREL16_LO_DS:
14574 case R_PPC64_GOT_DTPREL16_LO_DS:
14575 case R_PPC64_GOT16_LO:
14576 case R_PPC64_GOT16_LO_DS:
14577 case R_PPC64_TOC16_LO:
14578 case R_PPC64_TOC16_LO_DS:
98528052 14579 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 14580 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
14581 {
14582 bfd_byte *p = contents + (rel->r_offset & ~3);
14583 insn = bfd_get_32 (input_bfd, p);
560c8763
AM
14584 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
14585 {
14586 /* Transform addic to addi when we change reg. */
14587 insn &= ~((0x3f << 26) | (0x1f << 16));
14588 insn |= (14u << 26) | (2 << 16);
14589 }
14590 else
67f0cbdb 14591 {
98528052
AM
14592 insn &= ~(0x1f << 16);
14593 insn |= 2 << 16;
67f0cbdb 14594 }
560c8763 14595 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
14596 }
14597 break;
14598 }
14599
65f38f15 14600 /* Do any further special processing. */
b80eed39 14601 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15
AM
14602 switch (r_type)
14603 {
14604 default:
14605 break;
14606
25f23106 14607 case R_PPC64_REL16_HA:
f9c6b907
AM
14608 case R_PPC64_ADDR16_HA:
14609 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
14610 case R_PPC64_ADDR16_HIGHERA:
14611 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
14612 case R_PPC64_TOC16_HA:
14613 case R_PPC64_SECTOFF_HA:
411e1bfb 14614 case R_PPC64_TPREL16_HA:
f9c6b907 14615 case R_PPC64_TPREL16_HIGHA:
411e1bfb 14616 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 14617 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
14618 case R_PPC64_DTPREL16_HA:
14619 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 14620 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 14621 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
14622 /* It's just possible that this symbol is a weak symbol
14623 that's not actually defined anywhere. In that case,
14624 'sec' would be NULL, and we should leave the symbol
14625 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
14626 if (sec == NULL)
14627 break;
14628 /* Fall thru */
14629
14630 case R_PPC64_GOT16_HA:
14631 case R_PPC64_PLTGOT16_HA:
14632 case R_PPC64_PLT16_HA:
14633 case R_PPC64_GOT_TLSGD16_HA:
14634 case R_PPC64_GOT_TLSLD16_HA:
14635 case R_PPC64_GOT_TPREL16_HA:
14636 case R_PPC64_GOT_DTPREL16_HA:
14637 /* Add 0x10000 if sign bit in 0:15 is set.
14638 Bits 0:15 are not used. */
14639 addend += 0x8000;
65f38f15
AM
14640 break;
14641
14642 case R_PPC64_ADDR16_DS:
14643 case R_PPC64_ADDR16_LO_DS:
14644 case R_PPC64_GOT16_DS:
14645 case R_PPC64_GOT16_LO_DS:
14646 case R_PPC64_PLT16_LO_DS:
14647 case R_PPC64_SECTOFF_DS:
14648 case R_PPC64_SECTOFF_LO_DS:
14649 case R_PPC64_TOC16_DS:
14650 case R_PPC64_TOC16_LO_DS:
14651 case R_PPC64_PLTGOT16_DS:
14652 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
14653 case R_PPC64_GOT_TPREL16_DS:
14654 case R_PPC64_GOT_TPREL16_LO_DS:
14655 case R_PPC64_GOT_DTPREL16_DS:
14656 case R_PPC64_GOT_DTPREL16_LO_DS:
14657 case R_PPC64_TPREL16_DS:
14658 case R_PPC64_TPREL16_LO_DS:
14659 case R_PPC64_DTPREL16_DS:
14660 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
14661 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
14662 mask = 3;
14663 /* If this reloc is against an lq insn, then the value must be
14664 a multiple of 16. This is somewhat of a hack, but the
14665 "correct" way to do this by defining _DQ forms of all the
14666 _DS relocs bloats all reloc switches in this file. It
14667 doesn't seem to make much sense to use any of these relocs
14668 in data, so testing the insn should be safe. */
494dac0c 14669 if ((insn & (0x3f << 26)) == (56u << 26))
adadcc0c
AM
14670 mask = 15;
14671 if (((relocation + addend) & mask) != 0)
65f38f15 14672 {
25f53a85 14673 info->callbacks->einfo
8de848d8 14674 (_("%P: %H: error: %s not a multiple of %u\n"),
25f53a85 14675 input_bfd, input_section, rel->r_offset,
b80eed39 14676 howto->name,
adadcc0c 14677 mask + 1);
65f38f15 14678 bfd_set_error (bfd_error_bad_value);
b34976b6 14679 ret = FALSE;
65f38f15
AM
14680 continue;
14681 }
14682 break;
5bd4f169
AM
14683 }
14684
239e1f3a
AM
14685 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
14686 because such sections are not SEC_ALLOC and thus ld.so will
14687 not process them. */
65f38f15 14688 if (unresolved_reloc
239e1f3a 14689 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
14690 && h->elf.def_dynamic)
14691 && _bfd_elf_section_offset (output_bfd, info, input_section,
14692 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 14693 {
25f53a85 14694 info->callbacks->einfo
bc30df16 14695 (_("%P: %H: unresolvable %s against `%T'\n"),
25f53a85 14696 input_bfd, input_section, rel->r_offset,
b80eed39 14697 howto->name,
039b3fef 14698 h->elf.root.root.string);
b34976b6 14699 ret = FALSE;
9c07fe7c 14700 }
5bd4f169 14701
b80eed39
AM
14702 /* 16-bit fields in insns mostly have signed values, but a
14703 few insns have 16-bit unsigned values. Really, we should
14704 have different reloc types. */
14705 if (howto->complain_on_overflow != complain_overflow_dont
14706 && howto->dst_mask == 0xffff
14707 && (input_section->flags & SEC_CODE) != 0)
14708 {
14709 enum complain_overflow complain = complain_overflow_signed;
14710
14711 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
a47622ac
AM
14712 if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
14713 complain = complain_overflow_bitfield;
14714 else if (howto->rightshift == 0
14715 ? ((insn & (0x3f << 26)) == 28u << 26 /* andi */
14716 || (insn & (0x3f << 26)) == 24u << 26 /* ori */
14717 || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
14718 : ((insn & (0x3f << 26)) == 29u << 26 /* andis */
14719 || (insn & (0x3f << 26)) == 25u << 26 /* oris */
14720 || (insn & (0x3f << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
14721 complain = complain_overflow_unsigned;
14722 if (howto->complain_on_overflow != complain)
14723 {
14724 alt_howto = *howto;
14725 alt_howto.complain_on_overflow = complain;
14726 howto = &alt_howto;
14727 }
14728 }
14729
14730 r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
14731 rel->r_offset, relocation, addend);
5bd4f169 14732
ef60b7ff 14733 if (r != bfd_reloc_ok)
5bd4f169 14734 {
bc30df16 14735 char *more_info = NULL;
b80eed39 14736 const char *reloc_name = howto->name;
bc30df16
AM
14737
14738 if (reloc_dest != DEST_NORMAL)
14739 {
14740 more_info = bfd_malloc (strlen (reloc_name) + 8);
14741 if (more_info != NULL)
14742 {
14743 strcpy (more_info, reloc_name);
14744 strcat (more_info, (reloc_dest == DEST_OPD
14745 ? " (OPD)" : " (stub)"));
14746 reloc_name = more_info;
14747 }
14748 }
14749
cd27b276 14750 if (r == bfd_reloc_overflow)
5bd4f169 14751 {
cd27b276
AM
14752 if (warned)
14753 continue;
14754 if (h != NULL
039b3fef 14755 && h->elf.root.type == bfd_link_hash_undefweak
b80eed39 14756 && howto->pc_relative)
5bd4f169
AM
14757 {
14758 /* Assume this is a call protected by other code that
14759 detects the symbol is undefined. If this is the case,
14760 we can safely ignore the overflow. If not, the
14761 program is hosed anyway, and a little warning isn't
14762 going to help. */
14763
14764 continue;
14765 }
14766
ef60b7ff 14767 if (!((*info->callbacks->reloc_overflow)
bc30df16
AM
14768 (info, &h->elf.root, sym_name,
14769 reloc_name, orig_rel.r_addend,
14770 input_bfd, input_section, rel->r_offset)))
b34976b6 14771 return FALSE;
ef60b7ff
AM
14772 }
14773 else
14774 {
25f53a85 14775 info->callbacks->einfo
bc30df16 14776 (_("%P: %H: %s against `%T': error %d\n"),
25f53a85 14777 input_bfd, input_section, rel->r_offset,
bc30df16 14778 reloc_name, sym_name, (int) r);
b34976b6 14779 ret = FALSE;
ef60b7ff 14780 }
bc30df16
AM
14781 if (more_info != NULL)
14782 free (more_info);
5bd4f169 14783 }
5bd4f169
AM
14784 }
14785
645ea6a9
AM
14786 /* If we're emitting relocations, then shortly after this function
14787 returns, reloc offsets and addends for this section will be
14788 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
14789 file rather than the input. Save a copy of the relocs for
14790 opd_entry_value. */
4cc603a5 14791 if (is_opd && (info->emitrelocations || info->relocatable))
8860955f
AM
14792 {
14793 bfd_size_type amt;
14794 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
14795 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
14796 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
14797 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
14798 if (rel == NULL)
14799 return FALSE;
14800 memcpy (rel, relocs, amt);
14801 }
5bd4f169
AM
14802 return ret;
14803}
14804
754021d0
AM
14805/* Adjust the value of any local symbols in opd sections. */
14806
6e0b88f1 14807static int
754021d0
AM
14808ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
14809 const char *name ATTRIBUTE_UNUSED,
14810 Elf_Internal_Sym *elfsym,
14811 asection *input_sec,
14812 struct elf_link_hash_entry *h)
14813{
74f0fb50
AM
14814 struct _opd_sec_data *opd;
14815 long adjust;
754021d0
AM
14816 bfd_vma value;
14817
4025353c 14818 if (h != NULL)
6e0b88f1 14819 return 1;
4025353c 14820
74f0fb50
AM
14821 opd = get_opd_info (input_sec);
14822 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 14823 return 1;
754021d0
AM
14824
14825 value = elfsym->st_value - input_sec->output_offset;
14826 if (!info->relocatable)
14827 value -= input_sec->output_section->vma;
14828
74f0fb50 14829 adjust = opd->adjust[value / 8];
4025353c 14830 if (adjust == -1)
6e0b88f1
AM
14831 return 2;
14832
14833 elfsym->st_value += adjust;
14834 return 1;
754021d0
AM
14835}
14836
5bd4f169
AM
14837/* Finish up dynamic symbol handling. We set the contents of various
14838 dynamic sections here. */
14839
b34976b6 14840static bfd_boolean
4ce794b7
AM
14841ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
14842 struct bfd_link_info *info,
14843 struct elf_link_hash_entry *h,
ab6dce23 14844 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
5bd4f169 14845{
65f38f15 14846 struct ppc_link_hash_table *htab;
8387904d
AM
14847 struct plt_entry *ent;
14848 Elf_Internal_Rela rela;
14849 bfd_byte *loc;
5bd4f169 14850
65f38f15 14851 htab = ppc_hash_table (info);
4dfe6ac6
NC
14852 if (htab == NULL)
14853 return FALSE;
5bd4f169 14854
8387904d
AM
14855 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
14856 if (ent->plt.offset != (bfd_vma) -1)
14857 {
14858 /* This symbol has an entry in the procedure linkage
14859 table. Set it up. */
e054468f
AM
14860 if (!htab->elf.dynamic_sections_created
14861 || h->dynindx == -1)
14862 {
14863 BFD_ASSERT (h->type == STT_GNU_IFUNC
14864 && h->def_regular
14865 && (h->root.type == bfd_link_hash_defined
14866 || h->root.type == bfd_link_hash_defweak));
33e44f2e
AM
14867 rela.r_offset = (htab->elf.iplt->output_section->vma
14868 + htab->elf.iplt->output_offset
25f23106 14869 + ent->plt.offset);
ee67d69a
AM
14870 if (htab->opd_abi)
14871 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
14872 else
14873 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
e054468f
AM
14874 rela.r_addend = (h->root.u.def.value
14875 + h->root.u.def.section->output_offset
14876 + h->root.u.def.section->output_section->vma
14877 + ent->addend);
33e44f2e
AM
14878 loc = (htab->elf.irelplt->contents
14879 + (htab->elf.irelplt->reloc_count++
25f23106 14880 * sizeof (Elf64_External_Rela)));
e054468f
AM
14881 }
14882 else
14883 {
33e44f2e
AM
14884 rela.r_offset = (htab->elf.splt->output_section->vma
14885 + htab->elf.splt->output_offset
25f23106 14886 + ent->plt.offset);
e054468f
AM
14887 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
14888 rela.r_addend = ent->addend;
33e44f2e 14889 loc = (htab->elf.srelplt->contents
b9e5796b
AM
14890 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
14891 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
e054468f 14892 }
8387904d 14893 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
a345bc8d
AM
14894
14895 if (!htab->opd_abi)
14896 {
14897 if (!h->def_regular)
14898 {
14899 /* Mark the symbol as undefined, rather than as
14900 defined in glink. Leave the value if there were
14901 any relocations where pointer equality matters
14902 (this is a clue for the dynamic linker, to make
14903 function pointer comparisons work between an
14904 application and shared library), otherwise set it
14905 to zero. */
14906 sym->st_shndx = SHN_UNDEF;
14907 if (!h->pointer_equality_needed)
14908 sym->st_value = 0;
14909 else if (!h->ref_regular_nonweak)
14910 {
14911 /* This breaks function pointer comparisons, but
14912 that is better than breaking tests for a NULL
14913 function pointer. */
14914 sym->st_value = 0;
14915 }
14916 }
14917 }
8387904d 14918 }
5bd4f169 14919
f5385ebf 14920 if (h->needs_copy)
5bd4f169 14921 {
65f38f15 14922 /* This symbol needs a copy reloc. Set it up. */
5bd4f169 14923
65f38f15
AM
14924 if (h->dynindx == -1
14925 || (h->root.type != bfd_link_hash_defined
14926 && h->root.type != bfd_link_hash_defweak)
4ce794b7 14927 || htab->relbss == NULL)
65f38f15 14928 abort ();
5bd4f169
AM
14929
14930 rela.r_offset = (h->root.u.def.value
14931 + h->root.u.def.section->output_section->vma
14932 + h->root.u.def.section->output_offset);
14933 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
14934 rela.r_addend = 0;
4ce794b7
AM
14935 loc = htab->relbss->contents;
14936 loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 14937 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
14938 }
14939
b34976b6 14940 return TRUE;
5bd4f169
AM
14941}
14942
65f38f15
AM
14943/* Used to decide how to sort relocs in an optimal manner for the
14944 dynamic linker, before writing them out. */
14945
14946static enum elf_reloc_type_class
7e612e98
AM
14947ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
14948 const asection *rel_sec,
14949 const Elf_Internal_Rela *rela)
65f38f15 14950{
04c9666a 14951 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
14952 struct ppc_link_hash_table *htab = ppc_hash_table (info);
14953
33e44f2e 14954 if (rel_sec == htab->elf.irelplt)
7e612e98 14955 return reloc_class_ifunc;
a33d1f77 14956
4ce794b7 14957 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 14958 switch (r_type)
65f38f15
AM
14959 {
14960 case R_PPC64_RELATIVE:
14961 return reloc_class_relative;
14962 case R_PPC64_JMP_SLOT:
14963 return reloc_class_plt;
14964 case R_PPC64_COPY:
14965 return reloc_class_copy;
14966 default:
14967 return reloc_class_normal;
14968 }
14969}
14970
5bd4f169
AM
14971/* Finish up the dynamic sections. */
14972
b34976b6 14973static bfd_boolean
4ce794b7
AM
14974ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
14975 struct bfd_link_info *info)
5bd4f169 14976{
65f38f15
AM
14977 struct ppc_link_hash_table *htab;
14978 bfd *dynobj;
5bd4f169 14979 asection *sdyn;
5bd4f169 14980
65f38f15 14981 htab = ppc_hash_table (info);
4dfe6ac6
NC
14982 if (htab == NULL)
14983 return FALSE;
14984
65f38f15 14985 dynobj = htab->elf.dynobj;
3d4d4302 14986 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 14987
65f38f15 14988 if (htab->elf.dynamic_sections_created)
5bd4f169 14989 {
5bd4f169
AM
14990 Elf64_External_Dyn *dyncon, *dynconend;
14991
33e44f2e 14992 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 14993 abort ();
5bd4f169
AM
14994
14995 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 14996 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
14997 for (; dyncon < dynconend; dyncon++)
14998 {
14999 Elf_Internal_Dyn dyn;
19397422 15000 asection *s;
5bd4f169
AM
15001
15002 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
15003
15004 switch (dyn.d_tag)
15005 {
65f38f15
AM
15006 default:
15007 continue;
5bd4f169 15008
5d1634d7 15009 case DT_PPC64_GLINK:
4ce794b7 15010 s = htab->glink;
6348e046 15011 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
15012 /* We stupidly defined DT_PPC64_GLINK to be the start
15013 of glink rather than the first entry point, which is
15014 what ld.so needs, and now have a bigger stub to
15015 support automatic multiple TOCs. */
b9e5796b 15016 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 8 * 4;
5d1634d7
AM
15017 break;
15018
19397422
AM
15019 case DT_PPC64_OPD:
15020 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
15021 if (s == NULL)
15022 continue;
15023 dyn.d_un.d_ptr = s->vma;
19397422
AM
15024 break;
15025
e8910a83
AM
15026 case DT_PPC64_OPT:
15027 if (htab->do_multi_toc && htab->multi_toc_needed)
15028 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
15029 break;
15030
19397422
AM
15031 case DT_PPC64_OPDSZ:
15032 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
15033 if (s == NULL)
15034 continue;
eea6121a 15035 dyn.d_un.d_val = s->size;
19397422
AM
15036 break;
15037
65f38f15 15038 case DT_PLTGOT:
33e44f2e 15039 s = htab->elf.splt;
6348e046 15040 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
15041 break;
15042
15043 case DT_JMPREL:
33e44f2e 15044 s = htab->elf.srelplt;
6348e046 15045 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 15046 break;
5bd4f169 15047
65f38f15 15048 case DT_PLTRELSZ:
33e44f2e 15049 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7
AM
15050 break;
15051
15052 case DT_RELASZ:
15053 /* Don't count procedure linkage table relocs in the
15054 overall reloc count. */
33e44f2e 15055 s = htab->elf.srelplt;
6348e046
AM
15056 if (s == NULL)
15057 continue;
eea6121a 15058 dyn.d_un.d_val -= s->size;
6348e046
AM
15059 break;
15060
15061 case DT_RELA:
15062 /* We may not be using the standard ELF linker script.
15063 If .rela.plt is the first .rela section, we adjust
15064 DT_RELA to not include it. */
33e44f2e 15065 s = htab->elf.srelplt;
6348e046
AM
15066 if (s == NULL)
15067 continue;
15068 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
15069 continue;
eea6121a 15070 dyn.d_un.d_ptr += s->size;
65f38f15 15071 break;
5bd4f169 15072 }
5bd4f169 15073
65f38f15 15074 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 15075 }
5bd4f169
AM
15076 }
15077
33e44f2e 15078 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0)
5d1634d7
AM
15079 {
15080 /* Fill in the first entry in the global offset table.
15081 We use it to hold the link-time TOCbase. */
15082 bfd_put_64 (output_bfd,
60ee0d4a 15083 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 15084 htab->elf.sgot->contents);
5d1634d7
AM
15085
15086 /* Set .got entry size. */
33e44f2e 15087 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 8;
5d1634d7
AM
15088 }
15089
33e44f2e 15090 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5d1634d7
AM
15091 {
15092 /* Set .plt entry size. */
33e44f2e 15093 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 15094 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
15095 }
15096
84f5d08e
AM
15097 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
15098 brlt ourselves if emitrelocations. */
15099 if (htab->brlt != NULL
15100 && htab->brlt->reloc_count != 0
15101 && !_bfd_elf_link_output_relocs (output_bfd,
15102 htab->brlt,
d4730f92 15103 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
15104 elf_section_data (htab->brlt)->relocs,
15105 NULL))
15106 return FALSE;
15107
176a0d42
AM
15108 if (htab->glink != NULL
15109 && htab->glink->reloc_count != 0
15110 && !_bfd_elf_link_output_relocs (output_bfd,
15111 htab->glink,
d4730f92 15112 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
15113 elf_section_data (htab->glink)->relocs,
15114 NULL))
15115 return FALSE;
15116
58d180e8
AM
15117
15118 if (htab->glink_eh_frame != NULL
dbaa2011 15119 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
58d180e8
AM
15120 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
15121 htab->glink_eh_frame,
15122 htab->glink_eh_frame->contents))
15123 return FALSE;
15124
e717da7e 15125 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
15126 since we didn't add them to DYNOBJ. We know dynobj is the first
15127 bfd. */
c72f2fb2 15128 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
15129 {
15130 asection *s;
7b53ace3 15131
0c8d6e5c 15132 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
15133 continue;
15134
e717da7e
AM
15135 s = ppc64_elf_tdata (dynobj)->got;
15136 if (s != NULL
eea6121a 15137 && s->size != 0
e717da7e
AM
15138 && s->output_section != bfd_abs_section_ptr
15139 && !bfd_set_section_contents (output_bfd, s->output_section,
15140 s->contents, s->output_offset,
eea6121a 15141 s->size))
e717da7e
AM
15142 return FALSE;
15143 s = ppc64_elf_tdata (dynobj)->relgot;
15144 if (s != NULL
eea6121a 15145 && s->size != 0
e717da7e
AM
15146 && s->output_section != bfd_abs_section_ptr
15147 && !bfd_set_section_contents (output_bfd, s->output_section,
15148 s->contents, s->output_offset,
eea6121a 15149 s->size))
e717da7e
AM
15150 return FALSE;
15151 }
f6c52c13 15152
b34976b6 15153 return TRUE;
5bd4f169
AM
15154}
15155
5bd4f169 15156#include "elf64-target.h"
7b8e7dad
AM
15157
15158/* FreeBSD support */
15159
15160#undef TARGET_LITTLE_SYM
15161#undef TARGET_LITTLE_NAME
15162
15163#undef TARGET_BIG_SYM
6d00b590 15164#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
15165#undef TARGET_BIG_NAME
15166#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
15167
15168#undef ELF_OSABI
15169#define ELF_OSABI ELFOSABI_FREEBSD
15170
15171#undef elf64_bed
15172#define elf64_bed elf64_powerpc_fbsd_bed
15173
15174#include "elf64-target.h"
15175
This page took 2.488834 seconds and 4 git commands to generate.