]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf64-ppc.c
Add .abiversion related support for ELFv2
[thirdparty/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
3a71aa26 2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
794e51c0 3 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
5bd4f169
AM
4 Written by Linus Nordberg, Swox AB <info@swox.com>,
5 based on elf32-ppc.c by Ian Lance Taylor.
32ca9640 6 Largely rewritten by Alan Modra.
5bd4f169 7
ae9a127f 8 This file is part of BFD, the Binary File Descriptor library.
5bd4f169 9
ae9a127f
NC
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
cd123cb7 12 the Free Software Foundation; either version 3 of the License, or
ae9a127f 13 (at your option) any later version.
5bd4f169 14
ae9a127f
NC
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
5bd4f169 19
4ce794b7
AM
20 You should have received a copy of the GNU General Public License along
21 with this program; if not, write to the Free Software Foundation, Inc.,
3e110533 22 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
5bd4f169 23
cd123cb7 24
4ce794b7
AM
25/* The 64-bit PowerPC ELF ABI may be found at
26 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
27 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
5bd4f169 28
3db64b00 29#include "sysdep.h"
183e98be 30#include <stdarg.h>
5bd4f169 31#include "bfd.h"
5bd4f169
AM
32#include "bfdlink.h"
33#include "libbfd.h"
34#include "elf-bfd.h"
04c9666a 35#include "elf/ppc64.h"
5d1634d7 36#include "elf64-ppc.h"
58d180e8 37#include "dwarf2.h"
5bd4f169 38
805fc799 39static bfd_reloc_status_type ppc64_elf_ha_reloc
4ce794b7 40 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
41static bfd_reloc_status_type ppc64_elf_branch_reloc
42 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 43static bfd_reloc_status_type ppc64_elf_brtaken_reloc
4ce794b7 44 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 45static bfd_reloc_status_type ppc64_elf_sectoff_reloc
4ce794b7 46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 47static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
4ce794b7 48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 49static bfd_reloc_status_type ppc64_elf_toc_reloc
4ce794b7 50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 51static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
4ce794b7 52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 53static bfd_reloc_status_type ppc64_elf_toc64_reloc
4ce794b7 54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 55static bfd_reloc_status_type ppc64_elf_unhandled_reloc
4ce794b7 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016 57static bfd_vma opd_entry_value
aef36ac1 58 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
5bd4f169 59
ad8e1ba5
AM
60#define TARGET_LITTLE_SYM bfd_elf64_powerpcle_vec
61#define TARGET_LITTLE_NAME "elf64-powerpcle"
62#define TARGET_BIG_SYM bfd_elf64_powerpc_vec
63#define TARGET_BIG_NAME "elf64-powerpc"
64#define ELF_ARCH bfd_arch_powerpc
ae95ffa6 65#define ELF_TARGET_ID PPC64_ELF_DATA
ad8e1ba5
AM
66#define ELF_MACHINE_CODE EM_PPC64
67#define ELF_MAXPAGESIZE 0x10000
24718e3b 68#define ELF_COMMONPAGESIZE 0x1000
ad8e1ba5
AM
69#define elf_info_to_howto ppc64_elf_info_to_howto
70
71#define elf_backend_want_got_sym 0
72#define elf_backend_want_plt_sym 0
73#define elf_backend_plt_alignment 3
74#define elf_backend_plt_not_loaded 1
ad8e1ba5 75#define elf_backend_got_header_size 8
ad8e1ba5
AM
76#define elf_backend_can_gc_sections 1
77#define elf_backend_can_refcount 1
78#define elf_backend_rela_normal 1
6bfdb61b 79#define elf_backend_default_execstack 0
ad8e1ba5 80
e717da7e 81#define bfd_elf64_mkobject ppc64_elf_mkobject
ad8e1ba5 82#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
aa374f67 83#define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
ee67d69a
AM
84#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
85#define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
ad8e1ba5
AM
86#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
87#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
88#define bfd_elf64_bfd_link_hash_table_free ppc64_elf_link_hash_table_free
90e3cdf2 89#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
aa374f67 90#define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
ad8e1ba5
AM
91
92#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
93#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
94#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
183e98be 95#define elf_backend_write_core_note ppc64_elf_write_core_note
ad8e1ba5
AM
96#define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
97#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 98#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
7d9616d7 99#define elf_backend_check_directives ppc64_elf_process_dot_syms
e5034e59 100#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
8387904d 101#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5 102#define elf_backend_check_relocs ppc64_elf_check_relocs
74f0fb50 103#define elf_backend_gc_keep ppc64_elf_gc_keep
64d03ab5 104#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
ad8e1ba5
AM
105#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
106#define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
107#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
108#define elf_backend_hide_symbol ppc64_elf_hide_symbol
9f296da3 109#define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
ad8e1ba5
AM
110#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
111#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
74541ad4 112#define elf_backend_init_index_section _bfd_elf_init_2_index_sections
60124e18 113#define elf_backend_action_discarded ppc64_elf_action_discarded
ad8e1ba5
AM
114#define elf_backend_relocate_section ppc64_elf_relocate_section
115#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
116#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
117#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 118#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
29ef7005 119#define elf_backend_special_sections ppc64_elf_special_sections
e054468f 120#define elf_backend_post_process_headers _bfd_elf_set_osabi
ad8e1ba5 121
5bd4f169
AM
122/* The name of the dynamic interpreter. This is put in the .interp
123 section. */
124#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
125
126/* The size in bytes of an entry in the procedure linkage table. */
127#define PLT_ENTRY_SIZE 24
128
129/* The initial size of the plt reserved for the dynamic linker. */
5d1634d7 130#define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
5bd4f169
AM
131
132/* TOC base pointers offset from start of TOC. */
411e1bfb
AM
133#define TOC_BASE_OFF 0x8000
134
135/* Offset of tp and dtp pointers from start of TLS block. */
136#define TP_OFFSET 0x7000
137#define DTP_OFFSET 0x8000
5bd4f169 138
ad8e1ba5
AM
139/* .plt call stub instructions. The normal stub is like this, but
140 sometimes the .plt entry crosses a 64k boundary and we need to
71a39c98 141 insert an addi to adjust r11. */
ad8e1ba5 142#define PLT_CALL_STUB_SIZE (7*4)
5d1634d7 143#define STD_R2_40R1 0xf8410028 /* std %r2,40(%r1) */
71a39c98
AM
144#define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
145#define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
146#define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
147#define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
148#define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
5d1634d7
AM
149#define BCTR 0x4e800420 /* bctr */
150
71a39c98 151#define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
ad8e1ba5
AM
152#define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
153#define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
154
71a39c98
AM
155#define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
156#define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
157#define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
794e51c0
AM
158#define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
159#define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
160#define BNECTR 0x4ca20420 /* bnectr+ */
161#define BNECTR_P4 0x4ce20420 /* bnectr+ */
162
71a39c98 163#define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
ac2df442
AM
164#define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
165#define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
166
ad8e1ba5
AM
167#define LD_R2_40R1 0xe8410028 /* ld %r2,40(%r1) */
168
ee4bf8d2 169/* glink call stub instructions. We enter with the index in R0. */
ad8e1ba5 170#define GLINK_CALL_STUB_SIZE (16*4)
ee4bf8d2
AM
171 /* 0: */
172 /* .quad plt0-1f */
173 /* __glink: */
174#define MFLR_R12 0x7d8802a6 /* mflr %12 */
175#define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
176 /* 1: */
177#define MFLR_R11 0x7d6802a6 /* mflr %11 */
71a39c98 178 /* ld %2,(0b-1b)(%11) */
ee4bf8d2 179#define MTLR_R12 0x7d8803a6 /* mtlr %12 */
71a39c98
AM
180#define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
181 /* ld %12,0(%11) */
182 /* ld %2,8(%11) */
183 /* mtctr %12 */
184 /* ld %11,16(%11) */
ee4bf8d2 185 /* bctr */
5d1634d7
AM
186
187/* Pad with this. */
188#define NOP 0x60000000
189
721956f4
AM
190/* Some other nops. */
191#define CROR_151515 0x4def7b82
192#define CROR_313131 0x4ffffb82
193
cedb70c5 194/* .glink entries for the first 32k functions are two instructions. */
5d1634d7
AM
195#define LI_R0_0 0x38000000 /* li %r0,0 */
196#define B_DOT 0x48000000 /* b . */
197
198/* After that, we need two instructions to load the index, followed by
199 a branch. */
200#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 201#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 202
deb0e272
AM
203/* Instructions used by the save and restore reg functions. */
204#define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
205#define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
206#define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
207#define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
82bd7b59
AM
208#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
209#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
deb0e272
AM
210#define LI_R12_0 0x39800000 /* li %r12,0 */
211#define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
212#define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
213#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
82bd7b59
AM
214#define BLR 0x4e800020 /* blr */
215
41bd81ab
AM
216/* Since .opd is an array of descriptors and each entry will end up
217 with identical R_PPC64_RELATIVE relocs, there is really no need to
218 propagate .opd relocs; The dynamic linker should be taught to
1e2f5b6e 219 relocate .opd without reloc entries. */
41bd81ab
AM
220#ifndef NO_OPD_RELOCS
221#define NO_OPD_RELOCS 0
222#endif
5bd4f169 223\f
f5e87a1d 224#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
b34976b6 225
5bd4f169 226/* Relocation HOWTO's. */
04c9666a 227static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
5bd4f169
AM
228
229static reloc_howto_type ppc64_elf_howto_raw[] = {
230 /* This reloc does nothing. */
231 HOWTO (R_PPC64_NONE, /* type */
232 0, /* rightshift */
411e1bfb
AM
233 2, /* size (0 = byte, 1 = short, 2 = long) */
234 32, /* bitsize */
b34976b6 235 FALSE, /* pc_relative */
5bd4f169 236 0, /* bitpos */
f5e87a1d 237 complain_overflow_dont, /* complain_on_overflow */
5bd4f169
AM
238 bfd_elf_generic_reloc, /* special_function */
239 "R_PPC64_NONE", /* name */
b34976b6 240 FALSE, /* partial_inplace */
d006db6c 241 0, /* src_mask */
5bd4f169 242 0, /* dst_mask */
b34976b6 243 FALSE), /* pcrel_offset */
5bd4f169
AM
244
245 /* A standard 32 bit relocation. */
246 HOWTO (R_PPC64_ADDR32, /* type */
247 0, /* rightshift */
248 2, /* size (0 = byte, 1 = short, 2 = long) */
249 32, /* bitsize */
b34976b6 250 FALSE, /* pc_relative */
5bd4f169
AM
251 0, /* bitpos */
252 complain_overflow_bitfield, /* complain_on_overflow */
253 bfd_elf_generic_reloc, /* special_function */
254 "R_PPC64_ADDR32", /* name */
b34976b6 255 FALSE, /* partial_inplace */
5bd4f169
AM
256 0, /* src_mask */
257 0xffffffff, /* dst_mask */
b34976b6 258 FALSE), /* pcrel_offset */
5bd4f169
AM
259
260 /* An absolute 26 bit branch; the lower two bits must be zero.
261 FIXME: we don't check that, we just clear them. */
262 HOWTO (R_PPC64_ADDR24, /* type */
263 0, /* rightshift */
264 2, /* size (0 = byte, 1 = short, 2 = long) */
265 26, /* bitsize */
b34976b6 266 FALSE, /* pc_relative */
5bd4f169
AM
267 0, /* bitpos */
268 complain_overflow_bitfield, /* complain_on_overflow */
269 bfd_elf_generic_reloc, /* special_function */
270 "R_PPC64_ADDR24", /* name */
b34976b6 271 FALSE, /* partial_inplace */
d006db6c 272 0, /* src_mask */
f5e87a1d 273 0x03fffffc, /* dst_mask */
b34976b6 274 FALSE), /* pcrel_offset */
5bd4f169
AM
275
276 /* A standard 16 bit relocation. */
277 HOWTO (R_PPC64_ADDR16, /* type */
278 0, /* rightshift */
279 1, /* size (0 = byte, 1 = short, 2 = long) */
280 16, /* bitsize */
b34976b6 281 FALSE, /* pc_relative */
5bd4f169
AM
282 0, /* bitpos */
283 complain_overflow_bitfield, /* complain_on_overflow */
284 bfd_elf_generic_reloc, /* special_function */
285 "R_PPC64_ADDR16", /* name */
b34976b6 286 FALSE, /* partial_inplace */
5bd4f169
AM
287 0, /* src_mask */
288 0xffff, /* dst_mask */
b34976b6 289 FALSE), /* pcrel_offset */
5bd4f169
AM
290
291 /* A 16 bit relocation without overflow. */
292 HOWTO (R_PPC64_ADDR16_LO, /* type */
293 0, /* rightshift */
294 1, /* size (0 = byte, 1 = short, 2 = long) */
295 16, /* bitsize */
b34976b6 296 FALSE, /* pc_relative */
5bd4f169
AM
297 0, /* bitpos */
298 complain_overflow_dont,/* complain_on_overflow */
299 bfd_elf_generic_reloc, /* special_function */
300 "R_PPC64_ADDR16_LO", /* name */
b34976b6 301 FALSE, /* partial_inplace */
5bd4f169
AM
302 0, /* src_mask */
303 0xffff, /* dst_mask */
b34976b6 304 FALSE), /* pcrel_offset */
5bd4f169
AM
305
306 /* Bits 16-31 of an address. */
307 HOWTO (R_PPC64_ADDR16_HI, /* type */
308 16, /* rightshift */
309 1, /* size (0 = byte, 1 = short, 2 = long) */
310 16, /* bitsize */
b34976b6 311 FALSE, /* pc_relative */
5bd4f169 312 0, /* bitpos */
f9c6b907 313 complain_overflow_signed, /* complain_on_overflow */
5bd4f169
AM
314 bfd_elf_generic_reloc, /* special_function */
315 "R_PPC64_ADDR16_HI", /* name */
b34976b6 316 FALSE, /* partial_inplace */
5bd4f169
AM
317 0, /* src_mask */
318 0xffff, /* dst_mask */
b34976b6 319 FALSE), /* pcrel_offset */
5bd4f169
AM
320
321 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
322 bits, treated as a signed number, is negative. */
323 HOWTO (R_PPC64_ADDR16_HA, /* type */
324 16, /* rightshift */
325 1, /* size (0 = byte, 1 = short, 2 = long) */
326 16, /* bitsize */
b34976b6 327 FALSE, /* pc_relative */
5bd4f169 328 0, /* bitpos */
f9c6b907 329 complain_overflow_signed, /* complain_on_overflow */
805fc799 330 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 331 "R_PPC64_ADDR16_HA", /* name */
b34976b6 332 FALSE, /* partial_inplace */
5bd4f169
AM
333 0, /* src_mask */
334 0xffff, /* dst_mask */
b34976b6 335 FALSE), /* pcrel_offset */
5bd4f169
AM
336
337 /* An absolute 16 bit branch; the lower two bits must be zero.
338 FIXME: we don't check that, we just clear them. */
339 HOWTO (R_PPC64_ADDR14, /* type */
340 0, /* rightshift */
341 2, /* size (0 = byte, 1 = short, 2 = long) */
342 16, /* bitsize */
b34976b6 343 FALSE, /* pc_relative */
5bd4f169
AM
344 0, /* bitpos */
345 complain_overflow_bitfield, /* complain_on_overflow */
2441e016 346 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 347 "R_PPC64_ADDR14", /* name */
b34976b6 348 FALSE, /* partial_inplace */
d006db6c 349 0, /* src_mask */
f5e87a1d 350 0x0000fffc, /* dst_mask */
b34976b6 351 FALSE), /* pcrel_offset */
5bd4f169
AM
352
353 /* An absolute 16 bit branch, for which bit 10 should be set to
354 indicate that the branch is expected to be taken. The lower two
355 bits must be zero. */
356 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
357 0, /* rightshift */
358 2, /* size (0 = byte, 1 = short, 2 = long) */
359 16, /* bitsize */
b34976b6 360 FALSE, /* pc_relative */
5bd4f169
AM
361 0, /* bitpos */
362 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 363 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 364 "R_PPC64_ADDR14_BRTAKEN",/* name */
b34976b6 365 FALSE, /* partial_inplace */
d006db6c 366 0, /* src_mask */
f5e87a1d 367 0x0000fffc, /* dst_mask */
b34976b6 368 FALSE), /* pcrel_offset */
5bd4f169
AM
369
370 /* An absolute 16 bit branch, for which bit 10 should be set to
371 indicate that the branch is not expected to be taken. The lower
372 two bits must be zero. */
373 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
374 0, /* rightshift */
375 2, /* size (0 = byte, 1 = short, 2 = long) */
376 16, /* bitsize */
b34976b6 377 FALSE, /* pc_relative */
5bd4f169
AM
378 0, /* bitpos */
379 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 380 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 381 "R_PPC64_ADDR14_BRNTAKEN",/* name */
b34976b6 382 FALSE, /* partial_inplace */
d006db6c 383 0, /* src_mask */
f5e87a1d 384 0x0000fffc, /* dst_mask */
b34976b6 385 FALSE), /* pcrel_offset */
5bd4f169
AM
386
387 /* A relative 26 bit branch; the lower two bits must be zero. */
388 HOWTO (R_PPC64_REL24, /* type */
389 0, /* rightshift */
390 2, /* size (0 = byte, 1 = short, 2 = long) */
391 26, /* bitsize */
b34976b6 392 TRUE, /* pc_relative */
5bd4f169
AM
393 0, /* bitpos */
394 complain_overflow_signed, /* complain_on_overflow */
2441e016 395 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 396 "R_PPC64_REL24", /* name */
b34976b6 397 FALSE, /* partial_inplace */
d006db6c 398 0, /* src_mask */
f5e87a1d 399 0x03fffffc, /* dst_mask */
b34976b6 400 TRUE), /* pcrel_offset */
5bd4f169
AM
401
402 /* A relative 16 bit branch; the lower two bits must be zero. */
403 HOWTO (R_PPC64_REL14, /* type */
404 0, /* rightshift */
405 2, /* size (0 = byte, 1 = short, 2 = long) */
406 16, /* bitsize */
b34976b6 407 TRUE, /* pc_relative */
5bd4f169
AM
408 0, /* bitpos */
409 complain_overflow_signed, /* complain_on_overflow */
2441e016 410 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 411 "R_PPC64_REL14", /* name */
b34976b6 412 FALSE, /* partial_inplace */
d006db6c 413 0, /* src_mask */
f5e87a1d 414 0x0000fffc, /* dst_mask */
b34976b6 415 TRUE), /* pcrel_offset */
5bd4f169
AM
416
417 /* A relative 16 bit branch. Bit 10 should be set to indicate that
418 the branch is expected to be taken. The lower two bits must be
419 zero. */
420 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
421 0, /* rightshift */
422 2, /* size (0 = byte, 1 = short, 2 = long) */
423 16, /* bitsize */
b34976b6 424 TRUE, /* pc_relative */
5bd4f169
AM
425 0, /* bitpos */
426 complain_overflow_signed, /* complain_on_overflow */
805fc799 427 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 428 "R_PPC64_REL14_BRTAKEN", /* name */
b34976b6 429 FALSE, /* partial_inplace */
d006db6c 430 0, /* src_mask */
f5e87a1d 431 0x0000fffc, /* dst_mask */
b34976b6 432 TRUE), /* pcrel_offset */
5bd4f169
AM
433
434 /* A relative 16 bit branch. Bit 10 should be set to indicate that
435 the branch is not expected to be taken. The lower two bits must
436 be zero. */
437 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
438 0, /* rightshift */
439 2, /* size (0 = byte, 1 = short, 2 = long) */
440 16, /* bitsize */
b34976b6 441 TRUE, /* pc_relative */
5bd4f169
AM
442 0, /* bitpos */
443 complain_overflow_signed, /* complain_on_overflow */
805fc799 444 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 445 "R_PPC64_REL14_BRNTAKEN",/* name */
b34976b6 446 FALSE, /* partial_inplace */
d006db6c 447 0, /* src_mask */
f5e87a1d 448 0x0000fffc, /* dst_mask */
b34976b6 449 TRUE), /* pcrel_offset */
5bd4f169
AM
450
451 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
452 symbol. */
453 HOWTO (R_PPC64_GOT16, /* type */
454 0, /* rightshift */
455 1, /* size (0 = byte, 1 = short, 2 = long) */
456 16, /* bitsize */
b34976b6 457 FALSE, /* pc_relative */
5bd4f169
AM
458 0, /* bitpos */
459 complain_overflow_signed, /* complain_on_overflow */
805fc799 460 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 461 "R_PPC64_GOT16", /* name */
b34976b6 462 FALSE, /* partial_inplace */
5bd4f169
AM
463 0, /* src_mask */
464 0xffff, /* dst_mask */
b34976b6 465 FALSE), /* pcrel_offset */
5bd4f169
AM
466
467 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
468 the symbol. */
469 HOWTO (R_PPC64_GOT16_LO, /* type */
470 0, /* rightshift */
471 1, /* size (0 = byte, 1 = short, 2 = long) */
472 16, /* bitsize */
b34976b6 473 FALSE, /* pc_relative */
5bd4f169
AM
474 0, /* bitpos */
475 complain_overflow_dont, /* complain_on_overflow */
805fc799 476 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 477 "R_PPC64_GOT16_LO", /* name */
b34976b6 478 FALSE, /* partial_inplace */
5bd4f169
AM
479 0, /* src_mask */
480 0xffff, /* dst_mask */
b34976b6 481 FALSE), /* pcrel_offset */
5bd4f169
AM
482
483 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
484 the symbol. */
485 HOWTO (R_PPC64_GOT16_HI, /* type */
486 16, /* rightshift */
487 1, /* size (0 = byte, 1 = short, 2 = long) */
488 16, /* bitsize */
b34976b6 489 FALSE, /* pc_relative */
5bd4f169 490 0, /* bitpos */
f9c6b907 491 complain_overflow_signed,/* complain_on_overflow */
805fc799 492 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 493 "R_PPC64_GOT16_HI", /* name */
b34976b6 494 FALSE, /* partial_inplace */
5bd4f169
AM
495 0, /* src_mask */
496 0xffff, /* dst_mask */
b34976b6 497 FALSE), /* pcrel_offset */
5bd4f169
AM
498
499 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
500 the symbol. */
501 HOWTO (R_PPC64_GOT16_HA, /* type */
502 16, /* rightshift */
503 1, /* size (0 = byte, 1 = short, 2 = long) */
504 16, /* bitsize */
b34976b6 505 FALSE, /* pc_relative */
5bd4f169 506 0, /* bitpos */
f9c6b907 507 complain_overflow_signed,/* complain_on_overflow */
805fc799 508 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 509 "R_PPC64_GOT16_HA", /* name */
b34976b6 510 FALSE, /* partial_inplace */
5bd4f169
AM
511 0, /* src_mask */
512 0xffff, /* dst_mask */
b34976b6 513 FALSE), /* pcrel_offset */
5bd4f169
AM
514
515 /* This is used only by the dynamic linker. The symbol should exist
516 both in the object being run and in some shared library. The
517 dynamic linker copies the data addressed by the symbol from the
518 shared library into the object, because the object being
519 run has to have the data at some particular address. */
520 HOWTO (R_PPC64_COPY, /* type */
521 0, /* rightshift */
f5e87a1d
AM
522 0, /* this one is variable size */
523 0, /* bitsize */
b34976b6 524 FALSE, /* pc_relative */
5bd4f169 525 0, /* bitpos */
f5e87a1d
AM
526 complain_overflow_dont, /* complain_on_overflow */
527 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 528 "R_PPC64_COPY", /* name */
b34976b6 529 FALSE, /* partial_inplace */
5bd4f169
AM
530 0, /* src_mask */
531 0, /* dst_mask */
b34976b6 532 FALSE), /* pcrel_offset */
5bd4f169
AM
533
534 /* Like R_PPC64_ADDR64, but used when setting global offset table
535 entries. */
536 HOWTO (R_PPC64_GLOB_DAT, /* type */
537 0, /* rightshift */
538 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
539 64, /* bitsize */
b34976b6 540 FALSE, /* pc_relative */
5bd4f169
AM
541 0, /* bitpos */
542 complain_overflow_dont, /* complain_on_overflow */
805fc799 543 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 544 "R_PPC64_GLOB_DAT", /* name */
b34976b6 545 FALSE, /* partial_inplace */
5bd4f169 546 0, /* src_mask */
f5e87a1d 547 ONES (64), /* dst_mask */
b34976b6 548 FALSE), /* pcrel_offset */
5bd4f169
AM
549
550 /* Created by the link editor. Marks a procedure linkage table
551 entry for a symbol. */
552 HOWTO (R_PPC64_JMP_SLOT, /* type */
553 0, /* rightshift */
554 0, /* size (0 = byte, 1 = short, 2 = long) */
555 0, /* bitsize */
b34976b6 556 FALSE, /* pc_relative */
5bd4f169
AM
557 0, /* bitpos */
558 complain_overflow_dont, /* complain_on_overflow */
805fc799 559 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 560 "R_PPC64_JMP_SLOT", /* name */
b34976b6 561 FALSE, /* partial_inplace */
5bd4f169
AM
562 0, /* src_mask */
563 0, /* dst_mask */
b34976b6 564 FALSE), /* pcrel_offset */
5bd4f169
AM
565
566 /* Used only by the dynamic linker. When the object is run, this
567 doubleword64 is set to the load address of the object, plus the
568 addend. */
569 HOWTO (R_PPC64_RELATIVE, /* type */
570 0, /* rightshift */
571 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
572 64, /* bitsize */
b34976b6 573 FALSE, /* pc_relative */
5bd4f169
AM
574 0, /* bitpos */
575 complain_overflow_dont, /* complain_on_overflow */
576 bfd_elf_generic_reloc, /* special_function */
577 "R_PPC64_RELATIVE", /* name */
b34976b6 578 FALSE, /* partial_inplace */
5bd4f169 579 0, /* src_mask */
f5e87a1d 580 ONES (64), /* dst_mask */
b34976b6 581 FALSE), /* pcrel_offset */
5bd4f169
AM
582
583 /* Like R_PPC64_ADDR32, but may be unaligned. */
584 HOWTO (R_PPC64_UADDR32, /* type */
585 0, /* rightshift */
586 2, /* size (0 = byte, 1 = short, 2 = long) */
587 32, /* bitsize */
b34976b6 588 FALSE, /* pc_relative */
5bd4f169
AM
589 0, /* bitpos */
590 complain_overflow_bitfield, /* complain_on_overflow */
591 bfd_elf_generic_reloc, /* special_function */
592 "R_PPC64_UADDR32", /* name */
b34976b6 593 FALSE, /* partial_inplace */
5bd4f169
AM
594 0, /* src_mask */
595 0xffffffff, /* dst_mask */
b34976b6 596 FALSE), /* pcrel_offset */
5bd4f169
AM
597
598 /* Like R_PPC64_ADDR16, but may be unaligned. */
599 HOWTO (R_PPC64_UADDR16, /* type */
600 0, /* rightshift */
601 1, /* size (0 = byte, 1 = short, 2 = long) */
602 16, /* bitsize */
b34976b6 603 FALSE, /* pc_relative */
5bd4f169
AM
604 0, /* bitpos */
605 complain_overflow_bitfield, /* complain_on_overflow */
606 bfd_elf_generic_reloc, /* special_function */
607 "R_PPC64_UADDR16", /* name */
b34976b6 608 FALSE, /* partial_inplace */
5bd4f169
AM
609 0, /* src_mask */
610 0xffff, /* dst_mask */
b34976b6 611 FALSE), /* pcrel_offset */
5bd4f169
AM
612
613 /* 32-bit PC relative. */
614 HOWTO (R_PPC64_REL32, /* type */
615 0, /* rightshift */
616 2, /* size (0 = byte, 1 = short, 2 = long) */
617 32, /* bitsize */
b34976b6 618 TRUE, /* pc_relative */
5bd4f169 619 0, /* bitpos */
cedb70c5 620 /* FIXME: Verify. Was complain_overflow_bitfield. */
5bd4f169
AM
621 complain_overflow_signed, /* complain_on_overflow */
622 bfd_elf_generic_reloc, /* special_function */
623 "R_PPC64_REL32", /* name */
b34976b6 624 FALSE, /* partial_inplace */
5bd4f169
AM
625 0, /* src_mask */
626 0xffffffff, /* dst_mask */
b34976b6 627 TRUE), /* pcrel_offset */
5bd4f169 628
10ed1bba 629 /* 32-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
630 HOWTO (R_PPC64_PLT32, /* type */
631 0, /* rightshift */
632 2, /* size (0 = byte, 1 = short, 2 = long) */
633 32, /* bitsize */
b34976b6 634 FALSE, /* pc_relative */
5bd4f169
AM
635 0, /* bitpos */
636 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 637 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 638 "R_PPC64_PLT32", /* name */
b34976b6 639 FALSE, /* partial_inplace */
5bd4f169 640 0, /* src_mask */
f5e87a1d 641 0xffffffff, /* dst_mask */
b34976b6 642 FALSE), /* pcrel_offset */
5bd4f169
AM
643
644 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
645 FIXME: R_PPC64_PLTREL32 not supported. */
646 HOWTO (R_PPC64_PLTREL32, /* type */
647 0, /* rightshift */
648 2, /* size (0 = byte, 1 = short, 2 = long) */
649 32, /* bitsize */
b34976b6 650 TRUE, /* pc_relative */
5bd4f169
AM
651 0, /* bitpos */
652 complain_overflow_signed, /* complain_on_overflow */
653 bfd_elf_generic_reloc, /* special_function */
654 "R_PPC64_PLTREL32", /* name */
b34976b6 655 FALSE, /* partial_inplace */
5bd4f169 656 0, /* src_mask */
f5e87a1d 657 0xffffffff, /* dst_mask */
b34976b6 658 TRUE), /* pcrel_offset */
5bd4f169
AM
659
660 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
661 the symbol. */
662 HOWTO (R_PPC64_PLT16_LO, /* type */
663 0, /* rightshift */
664 1, /* size (0 = byte, 1 = short, 2 = long) */
665 16, /* bitsize */
b34976b6 666 FALSE, /* pc_relative */
5bd4f169
AM
667 0, /* bitpos */
668 complain_overflow_dont, /* complain_on_overflow */
805fc799 669 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 670 "R_PPC64_PLT16_LO", /* name */
b34976b6 671 FALSE, /* partial_inplace */
5bd4f169
AM
672 0, /* src_mask */
673 0xffff, /* dst_mask */
b34976b6 674 FALSE), /* pcrel_offset */
5bd4f169
AM
675
676 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
677 the symbol. */
678 HOWTO (R_PPC64_PLT16_HI, /* type */
679 16, /* rightshift */
680 1, /* size (0 = byte, 1 = short, 2 = long) */
681 16, /* bitsize */
b34976b6 682 FALSE, /* pc_relative */
5bd4f169 683 0, /* bitpos */
f9c6b907 684 complain_overflow_signed, /* complain_on_overflow */
805fc799 685 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 686 "R_PPC64_PLT16_HI", /* name */
b34976b6 687 FALSE, /* partial_inplace */
5bd4f169
AM
688 0, /* src_mask */
689 0xffff, /* dst_mask */
b34976b6 690 FALSE), /* pcrel_offset */
5bd4f169
AM
691
692 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
693 the symbol. */
694 HOWTO (R_PPC64_PLT16_HA, /* type */
695 16, /* rightshift */
696 1, /* size (0 = byte, 1 = short, 2 = long) */
697 16, /* bitsize */
b34976b6 698 FALSE, /* pc_relative */
5bd4f169 699 0, /* bitpos */
f9c6b907 700 complain_overflow_signed, /* complain_on_overflow */
805fc799 701 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 702 "R_PPC64_PLT16_HA", /* name */
b34976b6 703 FALSE, /* partial_inplace */
5bd4f169
AM
704 0, /* src_mask */
705 0xffff, /* dst_mask */
b34976b6 706 FALSE), /* pcrel_offset */
5bd4f169 707
c061c2d8 708 /* 16-bit section relative relocation. */
5bd4f169
AM
709 HOWTO (R_PPC64_SECTOFF, /* type */
710 0, /* rightshift */
c061c2d8
AM
711 1, /* size (0 = byte, 1 = short, 2 = long) */
712 16, /* bitsize */
b34976b6 713 FALSE, /* pc_relative */
5bd4f169
AM
714 0, /* bitpos */
715 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 716 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 717 "R_PPC64_SECTOFF", /* name */
b34976b6 718 FALSE, /* partial_inplace */
5bd4f169 719 0, /* src_mask */
c061c2d8 720 0xffff, /* dst_mask */
b34976b6 721 FALSE), /* pcrel_offset */
5bd4f169 722
c061c2d8 723 /* Like R_PPC64_SECTOFF, but no overflow warning. */
5bd4f169
AM
724 HOWTO (R_PPC64_SECTOFF_LO, /* type */
725 0, /* rightshift */
726 1, /* size (0 = byte, 1 = short, 2 = long) */
727 16, /* bitsize */
b34976b6 728 FALSE, /* pc_relative */
5bd4f169
AM
729 0, /* bitpos */
730 complain_overflow_dont, /* complain_on_overflow */
805fc799 731 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 732 "R_PPC64_SECTOFF_LO", /* name */
b34976b6 733 FALSE, /* partial_inplace */
5bd4f169
AM
734 0, /* src_mask */
735 0xffff, /* dst_mask */
b34976b6 736 FALSE), /* pcrel_offset */
5bd4f169
AM
737
738 /* 16-bit upper half section relative relocation. */
739 HOWTO (R_PPC64_SECTOFF_HI, /* type */
740 16, /* rightshift */
741 1, /* size (0 = byte, 1 = short, 2 = long) */
742 16, /* bitsize */
b34976b6 743 FALSE, /* pc_relative */
5bd4f169 744 0, /* bitpos */
f9c6b907 745 complain_overflow_signed, /* complain_on_overflow */
805fc799 746 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 747 "R_PPC64_SECTOFF_HI", /* name */
b34976b6 748 FALSE, /* partial_inplace */
5bd4f169
AM
749 0, /* src_mask */
750 0xffff, /* dst_mask */
b34976b6 751 FALSE), /* pcrel_offset */
5bd4f169
AM
752
753 /* 16-bit upper half adjusted section relative relocation. */
754 HOWTO (R_PPC64_SECTOFF_HA, /* type */
755 16, /* rightshift */
756 1, /* size (0 = byte, 1 = short, 2 = long) */
757 16, /* bitsize */
b34976b6 758 FALSE, /* pc_relative */
5bd4f169 759 0, /* bitpos */
f9c6b907 760 complain_overflow_signed, /* complain_on_overflow */
805fc799 761 ppc64_elf_sectoff_ha_reloc, /* special_function */
5bd4f169 762 "R_PPC64_SECTOFF_HA", /* name */
b34976b6 763 FALSE, /* partial_inplace */
5bd4f169
AM
764 0, /* src_mask */
765 0xffff, /* dst_mask */
b34976b6 766 FALSE), /* pcrel_offset */
5bd4f169 767
04c9666a
AM
768 /* Like R_PPC64_REL24 without touching the two least significant bits. */
769 HOWTO (R_PPC64_REL30, /* type */
5bd4f169
AM
770 2, /* rightshift */
771 2, /* size (0 = byte, 1 = short, 2 = long) */
772 30, /* bitsize */
b34976b6 773 TRUE, /* pc_relative */
5bd4f169
AM
774 0, /* bitpos */
775 complain_overflow_dont, /* complain_on_overflow */
776 bfd_elf_generic_reloc, /* special_function */
04c9666a 777 "R_PPC64_REL30", /* name */
b34976b6 778 FALSE, /* partial_inplace */
d006db6c 779 0, /* src_mask */
5bd4f169 780 0xfffffffc, /* dst_mask */
b34976b6 781 TRUE), /* pcrel_offset */
5bd4f169
AM
782
783 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
784
785 /* A standard 64-bit relocation. */
786 HOWTO (R_PPC64_ADDR64, /* type */
787 0, /* rightshift */
788 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
789 64, /* bitsize */
b34976b6 790 FALSE, /* pc_relative */
5bd4f169
AM
791 0, /* bitpos */
792 complain_overflow_dont, /* complain_on_overflow */
793 bfd_elf_generic_reloc, /* special_function */
794 "R_PPC64_ADDR64", /* name */
b34976b6 795 FALSE, /* partial_inplace */
5bd4f169 796 0, /* src_mask */
f5e87a1d 797 ONES (64), /* dst_mask */
b34976b6 798 FALSE), /* pcrel_offset */
5bd4f169
AM
799
800 /* The bits 32-47 of an address. */
801 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
802 32, /* rightshift */
803 1, /* size (0 = byte, 1 = short, 2 = long) */
804 16, /* bitsize */
b34976b6 805 FALSE, /* pc_relative */
5bd4f169
AM
806 0, /* bitpos */
807 complain_overflow_dont, /* complain_on_overflow */
808 bfd_elf_generic_reloc, /* special_function */
809 "R_PPC64_ADDR16_HIGHER", /* name */
b34976b6 810 FALSE, /* partial_inplace */
5bd4f169
AM
811 0, /* src_mask */
812 0xffff, /* dst_mask */
b34976b6 813 FALSE), /* pcrel_offset */
5bd4f169
AM
814
815 /* The bits 32-47 of an address, plus 1 if the contents of the low
816 16 bits, treated as a signed number, is negative. */
817 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
818 32, /* rightshift */
819 1, /* size (0 = byte, 1 = short, 2 = long) */
820 16, /* bitsize */
b34976b6 821 FALSE, /* pc_relative */
5bd4f169
AM
822 0, /* bitpos */
823 complain_overflow_dont, /* complain_on_overflow */
805fc799 824 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 825 "R_PPC64_ADDR16_HIGHERA", /* name */
b34976b6 826 FALSE, /* partial_inplace */
5bd4f169
AM
827 0, /* src_mask */
828 0xffff, /* dst_mask */
b34976b6 829 FALSE), /* pcrel_offset */
5bd4f169
AM
830
831 /* The bits 48-63 of an address. */
832 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
833 48, /* rightshift */
834 1, /* size (0 = byte, 1 = short, 2 = long) */
835 16, /* bitsize */
b34976b6 836 FALSE, /* pc_relative */
5bd4f169
AM
837 0, /* bitpos */
838 complain_overflow_dont, /* complain_on_overflow */
839 bfd_elf_generic_reloc, /* special_function */
840 "R_PPC64_ADDR16_HIGHEST", /* name */
b34976b6 841 FALSE, /* partial_inplace */
5bd4f169
AM
842 0, /* src_mask */
843 0xffff, /* dst_mask */
b34976b6 844 FALSE), /* pcrel_offset */
5bd4f169
AM
845
846 /* The bits 48-63 of an address, plus 1 if the contents of the low
847 16 bits, treated as a signed number, is negative. */
848 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
849 48, /* rightshift */
850 1, /* size (0 = byte, 1 = short, 2 = long) */
851 16, /* bitsize */
b34976b6 852 FALSE, /* pc_relative */
5bd4f169
AM
853 0, /* bitpos */
854 complain_overflow_dont, /* complain_on_overflow */
805fc799 855 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 856 "R_PPC64_ADDR16_HIGHESTA", /* name */
b34976b6 857 FALSE, /* partial_inplace */
5bd4f169
AM
858 0, /* src_mask */
859 0xffff, /* dst_mask */
b34976b6 860 FALSE), /* pcrel_offset */
5bd4f169
AM
861
862 /* Like ADDR64, but may be unaligned. */
863 HOWTO (R_PPC64_UADDR64, /* type */
864 0, /* rightshift */
865 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
866 64, /* bitsize */
b34976b6 867 FALSE, /* pc_relative */
5bd4f169
AM
868 0, /* bitpos */
869 complain_overflow_dont, /* complain_on_overflow */
870 bfd_elf_generic_reloc, /* special_function */
871 "R_PPC64_UADDR64", /* name */
b34976b6 872 FALSE, /* partial_inplace */
5bd4f169 873 0, /* src_mask */
f5e87a1d 874 ONES (64), /* dst_mask */
b34976b6 875 FALSE), /* pcrel_offset */
5bd4f169
AM
876
877 /* 64-bit relative relocation. */
878 HOWTO (R_PPC64_REL64, /* type */
879 0, /* rightshift */
880 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
881 64, /* bitsize */
b34976b6 882 TRUE, /* pc_relative */
5bd4f169
AM
883 0, /* bitpos */
884 complain_overflow_dont, /* complain_on_overflow */
885 bfd_elf_generic_reloc, /* special_function */
886 "R_PPC64_REL64", /* name */
b34976b6 887 FALSE, /* partial_inplace */
5bd4f169 888 0, /* src_mask */
f5e87a1d 889 ONES (64), /* dst_mask */
b34976b6 890 TRUE), /* pcrel_offset */
5bd4f169 891
cedb70c5 892 /* 64-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
893 HOWTO (R_PPC64_PLT64, /* type */
894 0, /* rightshift */
895 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
896 64, /* bitsize */
b34976b6 897 FALSE, /* pc_relative */
5bd4f169
AM
898 0, /* bitpos */
899 complain_overflow_dont, /* complain_on_overflow */
805fc799 900 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 901 "R_PPC64_PLT64", /* name */
b34976b6 902 FALSE, /* partial_inplace */
5bd4f169 903 0, /* src_mask */
f5e87a1d 904 ONES (64), /* dst_mask */
b34976b6 905 FALSE), /* pcrel_offset */
5bd4f169
AM
906
907 /* 64-bit PC relative relocation to the symbol's procedure linkage
908 table. */
909 /* FIXME: R_PPC64_PLTREL64 not supported. */
910 HOWTO (R_PPC64_PLTREL64, /* type */
911 0, /* rightshift */
912 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
913 64, /* bitsize */
b34976b6 914 TRUE, /* pc_relative */
5bd4f169
AM
915 0, /* bitpos */
916 complain_overflow_dont, /* complain_on_overflow */
805fc799 917 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 918 "R_PPC64_PLTREL64", /* name */
b34976b6 919 FALSE, /* partial_inplace */
5bd4f169 920 0, /* src_mask */
f5e87a1d 921 ONES (64), /* dst_mask */
b34976b6 922 TRUE), /* pcrel_offset */
5bd4f169
AM
923
924 /* 16 bit TOC-relative relocation. */
925
926 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
927 HOWTO (R_PPC64_TOC16, /* type */
928 0, /* rightshift */
929 1, /* size (0 = byte, 1 = short, 2 = long) */
930 16, /* bitsize */
b34976b6 931 FALSE, /* pc_relative */
5bd4f169
AM
932 0, /* bitpos */
933 complain_overflow_signed, /* complain_on_overflow */
805fc799 934 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 935 "R_PPC64_TOC16", /* name */
b34976b6 936 FALSE, /* partial_inplace */
5bd4f169
AM
937 0, /* src_mask */
938 0xffff, /* dst_mask */
b34976b6 939 FALSE), /* pcrel_offset */
5bd4f169
AM
940
941 /* 16 bit TOC-relative relocation without overflow. */
942
943 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
944 HOWTO (R_PPC64_TOC16_LO, /* type */
945 0, /* rightshift */
946 1, /* size (0 = byte, 1 = short, 2 = long) */
947 16, /* bitsize */
b34976b6 948 FALSE, /* pc_relative */
5bd4f169
AM
949 0, /* bitpos */
950 complain_overflow_dont, /* complain_on_overflow */
805fc799 951 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 952 "R_PPC64_TOC16_LO", /* name */
b34976b6 953 FALSE, /* partial_inplace */
5bd4f169
AM
954 0, /* src_mask */
955 0xffff, /* dst_mask */
b34976b6 956 FALSE), /* pcrel_offset */
5bd4f169
AM
957
958 /* 16 bit TOC-relative relocation, high 16 bits. */
959
960 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
961 HOWTO (R_PPC64_TOC16_HI, /* type */
962 16, /* rightshift */
963 1, /* size (0 = byte, 1 = short, 2 = long) */
964 16, /* bitsize */
b34976b6 965 FALSE, /* pc_relative */
5bd4f169 966 0, /* bitpos */
f9c6b907 967 complain_overflow_signed, /* complain_on_overflow */
805fc799 968 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 969 "R_PPC64_TOC16_HI", /* name */
b34976b6 970 FALSE, /* partial_inplace */
5bd4f169
AM
971 0, /* src_mask */
972 0xffff, /* dst_mask */
b34976b6 973 FALSE), /* pcrel_offset */
5bd4f169
AM
974
975 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
976 contents of the low 16 bits, treated as a signed number, is
977 negative. */
978
979 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
980 HOWTO (R_PPC64_TOC16_HA, /* type */
981 16, /* rightshift */
982 1, /* size (0 = byte, 1 = short, 2 = long) */
983 16, /* bitsize */
b34976b6 984 FALSE, /* pc_relative */
5bd4f169 985 0, /* bitpos */
f9c6b907 986 complain_overflow_signed, /* complain_on_overflow */
805fc799 987 ppc64_elf_toc_ha_reloc, /* special_function */
5bd4f169 988 "R_PPC64_TOC16_HA", /* name */
b34976b6 989 FALSE, /* partial_inplace */
5bd4f169
AM
990 0, /* src_mask */
991 0xffff, /* dst_mask */
b34976b6 992 FALSE), /* pcrel_offset */
5bd4f169
AM
993
994 /* 64-bit relocation; insert value of TOC base (.TOC.). */
995
996 /* R_PPC64_TOC 51 doubleword64 .TOC. */
997 HOWTO (R_PPC64_TOC, /* type */
998 0, /* rightshift */
999 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1000 64, /* bitsize */
b34976b6 1001 FALSE, /* pc_relative */
5bd4f169
AM
1002 0, /* bitpos */
1003 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 1004 ppc64_elf_toc64_reloc, /* special_function */
5bd4f169 1005 "R_PPC64_TOC", /* name */
b34976b6 1006 FALSE, /* partial_inplace */
5bd4f169 1007 0, /* src_mask */
f5e87a1d 1008 ONES (64), /* dst_mask */
b34976b6 1009 FALSE), /* pcrel_offset */
5bd4f169
AM
1010
1011 /* Like R_PPC64_GOT16, but also informs the link editor that the
1012 value to relocate may (!) refer to a PLT entry which the link
1013 editor (a) may replace with the symbol value. If the link editor
1014 is unable to fully resolve the symbol, it may (b) create a PLT
1015 entry and store the address to the new PLT entry in the GOT.
1016 This permits lazy resolution of function symbols at run time.
1017 The link editor may also skip all of this and just (c) emit a
1018 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1019 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1020 HOWTO (R_PPC64_PLTGOT16, /* type */
1021 0, /* rightshift */
1022 1, /* size (0 = byte, 1 = short, 2 = long) */
1023 16, /* bitsize */
b34976b6 1024 FALSE, /* pc_relative */
5bd4f169
AM
1025 0, /* bitpos */
1026 complain_overflow_signed, /* complain_on_overflow */
805fc799 1027 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb
AM
1028 "R_PPC64_PLTGOT16", /* name */
1029 FALSE, /* partial_inplace */
1030 0, /* src_mask */
1031 0xffff, /* dst_mask */
1032 FALSE), /* pcrel_offset */
1033
1034 /* Like R_PPC64_PLTGOT16, but without overflow. */
1035 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1036 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1037 0, /* rightshift */
1038 1, /* size (0 = byte, 1 = short, 2 = long) */
1039 16, /* bitsize */
1040 FALSE, /* pc_relative */
1041 0, /* bitpos */
1042 complain_overflow_dont, /* complain_on_overflow */
1043 ppc64_elf_unhandled_reloc, /* special_function */
1044 "R_PPC64_PLTGOT16_LO", /* name */
1045 FALSE, /* partial_inplace */
1046 0, /* src_mask */
1047 0xffff, /* dst_mask */
1048 FALSE), /* pcrel_offset */
1049
1050 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1051 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1052 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1053 16, /* rightshift */
1054 1, /* size (0 = byte, 1 = short, 2 = long) */
1055 16, /* bitsize */
1056 FALSE, /* pc_relative */
1057 0, /* bitpos */
f9c6b907 1058 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1059 ppc64_elf_unhandled_reloc, /* special_function */
1060 "R_PPC64_PLTGOT16_HI", /* name */
1061 FALSE, /* partial_inplace */
1062 0, /* src_mask */
1063 0xffff, /* dst_mask */
1064 FALSE), /* pcrel_offset */
1065
1066 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1067 1 if the contents of the low 16 bits, treated as a signed number,
1068 is negative. */
1069 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1070 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1071 16, /* rightshift */
1072 1, /* size (0 = byte, 1 = short, 2 = long) */
1073 16, /* bitsize */
1074 FALSE, /* pc_relative */
1075 0, /* bitpos */
f9c6b907 1076 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1077 ppc64_elf_unhandled_reloc, /* special_function */
1078 "R_PPC64_PLTGOT16_HA", /* name */
1079 FALSE, /* partial_inplace */
1080 0, /* src_mask */
1081 0xffff, /* dst_mask */
1082 FALSE), /* pcrel_offset */
1083
1084 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1085 HOWTO (R_PPC64_ADDR16_DS, /* type */
1086 0, /* rightshift */
1087 1, /* size (0 = byte, 1 = short, 2 = long) */
1088 16, /* bitsize */
1089 FALSE, /* pc_relative */
1090 0, /* bitpos */
1091 complain_overflow_bitfield, /* complain_on_overflow */
1092 bfd_elf_generic_reloc, /* special_function */
1093 "R_PPC64_ADDR16_DS", /* name */
1094 FALSE, /* partial_inplace */
1095 0, /* src_mask */
1096 0xfffc, /* dst_mask */
1097 FALSE), /* pcrel_offset */
1098
1099 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1100 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1101 0, /* rightshift */
1102 1, /* size (0 = byte, 1 = short, 2 = long) */
1103 16, /* bitsize */
1104 FALSE, /* pc_relative */
1105 0, /* bitpos */
1106 complain_overflow_dont,/* complain_on_overflow */
1107 bfd_elf_generic_reloc, /* special_function */
1108 "R_PPC64_ADDR16_LO_DS",/* name */
1109 FALSE, /* partial_inplace */
1110 0, /* src_mask */
1111 0xfffc, /* dst_mask */
1112 FALSE), /* pcrel_offset */
1113
1114 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1115 HOWTO (R_PPC64_GOT16_DS, /* type */
1116 0, /* rightshift */
1117 1, /* size (0 = byte, 1 = short, 2 = long) */
1118 16, /* bitsize */
1119 FALSE, /* pc_relative */
1120 0, /* bitpos */
1121 complain_overflow_signed, /* complain_on_overflow */
1122 ppc64_elf_unhandled_reloc, /* special_function */
1123 "R_PPC64_GOT16_DS", /* name */
1124 FALSE, /* partial_inplace */
1125 0, /* src_mask */
1126 0xfffc, /* dst_mask */
1127 FALSE), /* pcrel_offset */
1128
1129 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1130 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1131 0, /* rightshift */
1132 1, /* size (0 = byte, 1 = short, 2 = long) */
1133 16, /* bitsize */
1134 FALSE, /* pc_relative */
1135 0, /* bitpos */
1136 complain_overflow_dont, /* complain_on_overflow */
1137 ppc64_elf_unhandled_reloc, /* special_function */
1138 "R_PPC64_GOT16_LO_DS", /* name */
1139 FALSE, /* partial_inplace */
1140 0, /* src_mask */
1141 0xfffc, /* dst_mask */
1142 FALSE), /* pcrel_offset */
1143
1144 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1145 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1146 0, /* rightshift */
1147 1, /* size (0 = byte, 1 = short, 2 = long) */
1148 16, /* bitsize */
1149 FALSE, /* pc_relative */
1150 0, /* bitpos */
1151 complain_overflow_dont, /* complain_on_overflow */
1152 ppc64_elf_unhandled_reloc, /* special_function */
1153 "R_PPC64_PLT16_LO_DS", /* name */
1154 FALSE, /* partial_inplace */
1155 0, /* src_mask */
1156 0xfffc, /* dst_mask */
1157 FALSE), /* pcrel_offset */
1158
1159 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1160 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1161 0, /* rightshift */
1162 1, /* size (0 = byte, 1 = short, 2 = long) */
1163 16, /* bitsize */
1164 FALSE, /* pc_relative */
1165 0, /* bitpos */
1166 complain_overflow_bitfield, /* complain_on_overflow */
1167 ppc64_elf_sectoff_reloc, /* special_function */
1168 "R_PPC64_SECTOFF_DS", /* name */
1169 FALSE, /* partial_inplace */
1170 0, /* src_mask */
1171 0xfffc, /* dst_mask */
1172 FALSE), /* pcrel_offset */
1173
1174 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1175 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1176 0, /* rightshift */
1177 1, /* size (0 = byte, 1 = short, 2 = long) */
1178 16, /* bitsize */
1179 FALSE, /* pc_relative */
1180 0, /* bitpos */
1181 complain_overflow_dont, /* complain_on_overflow */
1182 ppc64_elf_sectoff_reloc, /* special_function */
1183 "R_PPC64_SECTOFF_LO_DS",/* name */
1184 FALSE, /* partial_inplace */
1185 0, /* src_mask */
1186 0xfffc, /* dst_mask */
1187 FALSE), /* pcrel_offset */
1188
1189 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1190 HOWTO (R_PPC64_TOC16_DS, /* type */
1191 0, /* rightshift */
1192 1, /* size (0 = byte, 1 = short, 2 = long) */
1193 16, /* bitsize */
1194 FALSE, /* pc_relative */
1195 0, /* bitpos */
1196 complain_overflow_signed, /* complain_on_overflow */
1197 ppc64_elf_toc_reloc, /* special_function */
1198 "R_PPC64_TOC16_DS", /* name */
1199 FALSE, /* partial_inplace */
1200 0, /* src_mask */
1201 0xfffc, /* dst_mask */
1202 FALSE), /* pcrel_offset */
1203
1204 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1205 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1206 0, /* rightshift */
1207 1, /* size (0 = byte, 1 = short, 2 = long) */
1208 16, /* bitsize */
1209 FALSE, /* pc_relative */
1210 0, /* bitpos */
1211 complain_overflow_dont, /* complain_on_overflow */
1212 ppc64_elf_toc_reloc, /* special_function */
1213 "R_PPC64_TOC16_LO_DS", /* name */
1214 FALSE, /* partial_inplace */
1215 0, /* src_mask */
1216 0xfffc, /* dst_mask */
1217 FALSE), /* pcrel_offset */
1218
1219 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1220 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
6bfdb61b 1221 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
411e1bfb
AM
1222 0, /* rightshift */
1223 1, /* size (0 = byte, 1 = short, 2 = long) */
1224 16, /* bitsize */
1225 FALSE, /* pc_relative */
1226 0, /* bitpos */
1227 complain_overflow_signed, /* complain_on_overflow */
1228 ppc64_elf_unhandled_reloc, /* special_function */
1229 "R_PPC64_PLTGOT16_DS", /* name */
1230 FALSE, /* partial_inplace */
1231 0, /* src_mask */
1232 0xfffc, /* dst_mask */
1233 FALSE), /* pcrel_offset */
1234
1235 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1236 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1237 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1238 0, /* rightshift */
1239 1, /* size (0 = byte, 1 = short, 2 = long) */
1240 16, /* bitsize */
1241 FALSE, /* pc_relative */
1242 0, /* bitpos */
1243 complain_overflow_dont, /* complain_on_overflow */
1244 ppc64_elf_unhandled_reloc, /* special_function */
1245 "R_PPC64_PLTGOT16_LO_DS",/* name */
1246 FALSE, /* partial_inplace */
1247 0, /* src_mask */
1248 0xfffc, /* dst_mask */
1249 FALSE), /* pcrel_offset */
1250
727fc41e 1251 /* Marker relocs for TLS. */
411e1bfb
AM
1252 HOWTO (R_PPC64_TLS,
1253 0, /* rightshift */
1254 2, /* size (0 = byte, 1 = short, 2 = long) */
1255 32, /* bitsize */
1256 FALSE, /* pc_relative */
1257 0, /* bitpos */
1258 complain_overflow_dont, /* complain_on_overflow */
1259 bfd_elf_generic_reloc, /* special_function */
1260 "R_PPC64_TLS", /* name */
1261 FALSE, /* partial_inplace */
1262 0, /* src_mask */
1263 0, /* dst_mask */
1264 FALSE), /* pcrel_offset */
1265
727fc41e
AM
1266 HOWTO (R_PPC64_TLSGD,
1267 0, /* rightshift */
1268 2, /* size (0 = byte, 1 = short, 2 = long) */
1269 32, /* bitsize */
1270 FALSE, /* pc_relative */
1271 0, /* bitpos */
1272 complain_overflow_dont, /* complain_on_overflow */
1273 bfd_elf_generic_reloc, /* special_function */
1274 "R_PPC64_TLSGD", /* name */
1275 FALSE, /* partial_inplace */
1276 0, /* src_mask */
1277 0, /* dst_mask */
1278 FALSE), /* pcrel_offset */
1279
1280 HOWTO (R_PPC64_TLSLD,
1281 0, /* rightshift */
1282 2, /* size (0 = byte, 1 = short, 2 = long) */
1283 32, /* bitsize */
1284 FALSE, /* pc_relative */
1285 0, /* bitpos */
1286 complain_overflow_dont, /* complain_on_overflow */
1287 bfd_elf_generic_reloc, /* special_function */
1288 "R_PPC64_TLSLD", /* name */
1289 FALSE, /* partial_inplace */
1290 0, /* src_mask */
1291 0, /* dst_mask */
1292 FALSE), /* pcrel_offset */
1293
3b421ab3
AM
1294 HOWTO (R_PPC64_TOCSAVE,
1295 0, /* rightshift */
1296 2, /* size (0 = byte, 1 = short, 2 = long) */
1297 32, /* bitsize */
1298 FALSE, /* pc_relative */
1299 0, /* bitpos */
1300 complain_overflow_dont, /* complain_on_overflow */
1301 bfd_elf_generic_reloc, /* special_function */
1302 "R_PPC64_TOCSAVE", /* name */
1303 FALSE, /* partial_inplace */
1304 0, /* src_mask */
1305 0, /* dst_mask */
1306 FALSE), /* pcrel_offset */
1307
411e1bfb
AM
1308 /* Computes the load module index of the load module that contains the
1309 definition of its TLS sym. */
1310 HOWTO (R_PPC64_DTPMOD64,
1311 0, /* rightshift */
1312 4, /* size (0 = byte, 1 = short, 2 = long) */
1313 64, /* bitsize */
1314 FALSE, /* pc_relative */
1315 0, /* bitpos */
1316 complain_overflow_dont, /* complain_on_overflow */
1317 ppc64_elf_unhandled_reloc, /* special_function */
1318 "R_PPC64_DTPMOD64", /* name */
1319 FALSE, /* partial_inplace */
1320 0, /* src_mask */
1321 ONES (64), /* dst_mask */
1322 FALSE), /* pcrel_offset */
1323
1324 /* Computes a dtv-relative displacement, the difference between the value
1325 of sym+add and the base address of the thread-local storage block that
1326 contains the definition of sym, minus 0x8000. */
1327 HOWTO (R_PPC64_DTPREL64,
1328 0, /* rightshift */
1329 4, /* size (0 = byte, 1 = short, 2 = long) */
1330 64, /* bitsize */
1331 FALSE, /* pc_relative */
1332 0, /* bitpos */
1333 complain_overflow_dont, /* complain_on_overflow */
1334 ppc64_elf_unhandled_reloc, /* special_function */
1335 "R_PPC64_DTPREL64", /* name */
1336 FALSE, /* partial_inplace */
1337 0, /* src_mask */
1338 ONES (64), /* dst_mask */
1339 FALSE), /* pcrel_offset */
1340
1341 /* A 16 bit dtprel reloc. */
1342 HOWTO (R_PPC64_DTPREL16,
1343 0, /* rightshift */
1344 1, /* size (0 = byte, 1 = short, 2 = long) */
1345 16, /* bitsize */
1346 FALSE, /* pc_relative */
1347 0, /* bitpos */
1348 complain_overflow_signed, /* complain_on_overflow */
1349 ppc64_elf_unhandled_reloc, /* special_function */
1350 "R_PPC64_DTPREL16", /* name */
1351 FALSE, /* partial_inplace */
1352 0, /* src_mask */
1353 0xffff, /* dst_mask */
1354 FALSE), /* pcrel_offset */
1355
1356 /* Like DTPREL16, but no overflow. */
1357 HOWTO (R_PPC64_DTPREL16_LO,
1358 0, /* rightshift */
1359 1, /* size (0 = byte, 1 = short, 2 = long) */
1360 16, /* bitsize */
1361 FALSE, /* pc_relative */
1362 0, /* bitpos */
1363 complain_overflow_dont, /* complain_on_overflow */
1364 ppc64_elf_unhandled_reloc, /* special_function */
1365 "R_PPC64_DTPREL16_LO", /* name */
1366 FALSE, /* partial_inplace */
1367 0, /* src_mask */
1368 0xffff, /* dst_mask */
1369 FALSE), /* pcrel_offset */
1370
1371 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1372 HOWTO (R_PPC64_DTPREL16_HI,
1373 16, /* rightshift */
1374 1, /* size (0 = byte, 1 = short, 2 = long) */
1375 16, /* bitsize */
1376 FALSE, /* pc_relative */
1377 0, /* bitpos */
f9c6b907 1378 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1379 ppc64_elf_unhandled_reloc, /* special_function */
1380 "R_PPC64_DTPREL16_HI", /* name */
1381 FALSE, /* partial_inplace */
1382 0, /* src_mask */
1383 0xffff, /* dst_mask */
1384 FALSE), /* pcrel_offset */
1385
1386 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1387 HOWTO (R_PPC64_DTPREL16_HA,
1388 16, /* rightshift */
1389 1, /* size (0 = byte, 1 = short, 2 = long) */
1390 16, /* bitsize */
1391 FALSE, /* pc_relative */
1392 0, /* bitpos */
f9c6b907 1393 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1394 ppc64_elf_unhandled_reloc, /* special_function */
1395 "R_PPC64_DTPREL16_HA", /* name */
1396 FALSE, /* partial_inplace */
1397 0, /* src_mask */
1398 0xffff, /* dst_mask */
1399 FALSE), /* pcrel_offset */
1400
1401 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1402 HOWTO (R_PPC64_DTPREL16_HIGHER,
1403 32, /* rightshift */
1404 1, /* size (0 = byte, 1 = short, 2 = long) */
1405 16, /* bitsize */
1406 FALSE, /* pc_relative */
1407 0, /* bitpos */
1408 complain_overflow_dont, /* complain_on_overflow */
1409 ppc64_elf_unhandled_reloc, /* special_function */
1410 "R_PPC64_DTPREL16_HIGHER", /* name */
1411 FALSE, /* partial_inplace */
1412 0, /* src_mask */
1413 0xffff, /* dst_mask */
1414 FALSE), /* pcrel_offset */
1415
1416 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1417 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1418 32, /* rightshift */
1419 1, /* size (0 = byte, 1 = short, 2 = long) */
1420 16, /* bitsize */
1421 FALSE, /* pc_relative */
1422 0, /* bitpos */
1423 complain_overflow_dont, /* complain_on_overflow */
1424 ppc64_elf_unhandled_reloc, /* special_function */
1425 "R_PPC64_DTPREL16_HIGHERA", /* name */
1426 FALSE, /* partial_inplace */
1427 0, /* src_mask */
1428 0xffff, /* dst_mask */
1429 FALSE), /* pcrel_offset */
1430
1431 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1432 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1433 48, /* rightshift */
1434 1, /* size (0 = byte, 1 = short, 2 = long) */
1435 16, /* bitsize */
1436 FALSE, /* pc_relative */
1437 0, /* bitpos */
1438 complain_overflow_dont, /* complain_on_overflow */
1439 ppc64_elf_unhandled_reloc, /* special_function */
1440 "R_PPC64_DTPREL16_HIGHEST", /* name */
1441 FALSE, /* partial_inplace */
1442 0, /* src_mask */
1443 0xffff, /* dst_mask */
1444 FALSE), /* pcrel_offset */
1445
1446 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1447 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1448 48, /* rightshift */
1449 1, /* size (0 = byte, 1 = short, 2 = long) */
1450 16, /* bitsize */
1451 FALSE, /* pc_relative */
1452 0, /* bitpos */
1453 complain_overflow_dont, /* complain_on_overflow */
1454 ppc64_elf_unhandled_reloc, /* special_function */
1455 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1456 FALSE, /* partial_inplace */
1457 0, /* src_mask */
1458 0xffff, /* dst_mask */
1459 FALSE), /* pcrel_offset */
1460
1461 /* Like DTPREL16, but for insns with a DS field. */
1462 HOWTO (R_PPC64_DTPREL16_DS,
1463 0, /* rightshift */
1464 1, /* size (0 = byte, 1 = short, 2 = long) */
1465 16, /* bitsize */
1466 FALSE, /* pc_relative */
1467 0, /* bitpos */
1468 complain_overflow_signed, /* complain_on_overflow */
1469 ppc64_elf_unhandled_reloc, /* special_function */
1470 "R_PPC64_DTPREL16_DS", /* name */
1471 FALSE, /* partial_inplace */
1472 0, /* src_mask */
1473 0xfffc, /* dst_mask */
1474 FALSE), /* pcrel_offset */
1475
1476 /* Like DTPREL16_DS, but no overflow. */
1477 HOWTO (R_PPC64_DTPREL16_LO_DS,
1478 0, /* rightshift */
1479 1, /* size (0 = byte, 1 = short, 2 = long) */
1480 16, /* bitsize */
1481 FALSE, /* pc_relative */
1482 0, /* bitpos */
1483 complain_overflow_dont, /* complain_on_overflow */
1484 ppc64_elf_unhandled_reloc, /* special_function */
1485 "R_PPC64_DTPREL16_LO_DS", /* name */
1486 FALSE, /* partial_inplace */
1487 0, /* src_mask */
1488 0xfffc, /* dst_mask */
1489 FALSE), /* pcrel_offset */
1490
1491 /* Computes a tp-relative displacement, the difference between the value of
1492 sym+add and the value of the thread pointer (r13). */
1493 HOWTO (R_PPC64_TPREL64,
1494 0, /* rightshift */
1495 4, /* size (0 = byte, 1 = short, 2 = long) */
1496 64, /* bitsize */
1497 FALSE, /* pc_relative */
1498 0, /* bitpos */
1499 complain_overflow_dont, /* complain_on_overflow */
1500 ppc64_elf_unhandled_reloc, /* special_function */
1501 "R_PPC64_TPREL64", /* name */
1502 FALSE, /* partial_inplace */
1503 0, /* src_mask */
1504 ONES (64), /* dst_mask */
1505 FALSE), /* pcrel_offset */
1506
1507 /* A 16 bit tprel reloc. */
1508 HOWTO (R_PPC64_TPREL16,
1509 0, /* rightshift */
1510 1, /* size (0 = byte, 1 = short, 2 = long) */
1511 16, /* bitsize */
1512 FALSE, /* pc_relative */
1513 0, /* bitpos */
1514 complain_overflow_signed, /* complain_on_overflow */
1515 ppc64_elf_unhandled_reloc, /* special_function */
1516 "R_PPC64_TPREL16", /* name */
1517 FALSE, /* partial_inplace */
1518 0, /* src_mask */
1519 0xffff, /* dst_mask */
1520 FALSE), /* pcrel_offset */
1521
1522 /* Like TPREL16, but no overflow. */
1523 HOWTO (R_PPC64_TPREL16_LO,
1524 0, /* rightshift */
1525 1, /* size (0 = byte, 1 = short, 2 = long) */
1526 16, /* bitsize */
1527 FALSE, /* pc_relative */
1528 0, /* bitpos */
1529 complain_overflow_dont, /* complain_on_overflow */
1530 ppc64_elf_unhandled_reloc, /* special_function */
1531 "R_PPC64_TPREL16_LO", /* name */
1532 FALSE, /* partial_inplace */
1533 0, /* src_mask */
1534 0xffff, /* dst_mask */
1535 FALSE), /* pcrel_offset */
1536
1537 /* Like TPREL16_LO, but next higher group of 16 bits. */
1538 HOWTO (R_PPC64_TPREL16_HI,
1539 16, /* rightshift */
1540 1, /* size (0 = byte, 1 = short, 2 = long) */
1541 16, /* bitsize */
1542 FALSE, /* pc_relative */
1543 0, /* bitpos */
f9c6b907 1544 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1545 ppc64_elf_unhandled_reloc, /* special_function */
1546 "R_PPC64_TPREL16_HI", /* name */
1547 FALSE, /* partial_inplace */
1548 0, /* src_mask */
1549 0xffff, /* dst_mask */
1550 FALSE), /* pcrel_offset */
1551
1552 /* Like TPREL16_HI, but adjust for low 16 bits. */
1553 HOWTO (R_PPC64_TPREL16_HA,
1554 16, /* rightshift */
1555 1, /* size (0 = byte, 1 = short, 2 = long) */
1556 16, /* bitsize */
1557 FALSE, /* pc_relative */
1558 0, /* bitpos */
f9c6b907 1559 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1560 ppc64_elf_unhandled_reloc, /* special_function */
1561 "R_PPC64_TPREL16_HA", /* name */
1562 FALSE, /* partial_inplace */
1563 0, /* src_mask */
1564 0xffff, /* dst_mask */
1565 FALSE), /* pcrel_offset */
1566
1567 /* Like TPREL16_HI, but next higher group of 16 bits. */
1568 HOWTO (R_PPC64_TPREL16_HIGHER,
1569 32, /* rightshift */
1570 1, /* size (0 = byte, 1 = short, 2 = long) */
1571 16, /* bitsize */
1572 FALSE, /* pc_relative */
1573 0, /* bitpos */
1574 complain_overflow_dont, /* complain_on_overflow */
1575 ppc64_elf_unhandled_reloc, /* special_function */
1576 "R_PPC64_TPREL16_HIGHER", /* name */
1577 FALSE, /* partial_inplace */
1578 0, /* src_mask */
1579 0xffff, /* dst_mask */
1580 FALSE), /* pcrel_offset */
1581
1582 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1583 HOWTO (R_PPC64_TPREL16_HIGHERA,
1584 32, /* rightshift */
1585 1, /* size (0 = byte, 1 = short, 2 = long) */
1586 16, /* bitsize */
1587 FALSE, /* pc_relative */
1588 0, /* bitpos */
1589 complain_overflow_dont, /* complain_on_overflow */
1590 ppc64_elf_unhandled_reloc, /* special_function */
1591 "R_PPC64_TPREL16_HIGHERA", /* name */
1592 FALSE, /* partial_inplace */
1593 0, /* src_mask */
1594 0xffff, /* dst_mask */
1595 FALSE), /* pcrel_offset */
1596
1597 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1598 HOWTO (R_PPC64_TPREL16_HIGHEST,
1599 48, /* rightshift */
1600 1, /* size (0 = byte, 1 = short, 2 = long) */
1601 16, /* bitsize */
1602 FALSE, /* pc_relative */
1603 0, /* bitpos */
1604 complain_overflow_dont, /* complain_on_overflow */
1605 ppc64_elf_unhandled_reloc, /* special_function */
1606 "R_PPC64_TPREL16_HIGHEST", /* name */
1607 FALSE, /* partial_inplace */
1608 0, /* src_mask */
1609 0xffff, /* dst_mask */
1610 FALSE), /* pcrel_offset */
1611
1612 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1613 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1614 48, /* rightshift */
1615 1, /* size (0 = byte, 1 = short, 2 = long) */
1616 16, /* bitsize */
1617 FALSE, /* pc_relative */
1618 0, /* bitpos */
1619 complain_overflow_dont, /* complain_on_overflow */
1620 ppc64_elf_unhandled_reloc, /* special_function */
1621 "R_PPC64_TPREL16_HIGHESTA", /* name */
1622 FALSE, /* partial_inplace */
1623 0, /* src_mask */
1624 0xffff, /* dst_mask */
1625 FALSE), /* pcrel_offset */
1626
1627 /* Like TPREL16, but for insns with a DS field. */
1628 HOWTO (R_PPC64_TPREL16_DS,
1629 0, /* rightshift */
1630 1, /* size (0 = byte, 1 = short, 2 = long) */
1631 16, /* bitsize */
1632 FALSE, /* pc_relative */
1633 0, /* bitpos */
1634 complain_overflow_signed, /* complain_on_overflow */
1635 ppc64_elf_unhandled_reloc, /* special_function */
1636 "R_PPC64_TPREL16_DS", /* name */
1637 FALSE, /* partial_inplace */
1638 0, /* src_mask */
1639 0xfffc, /* dst_mask */
1640 FALSE), /* pcrel_offset */
1641
1642 /* Like TPREL16_DS, but no overflow. */
1643 HOWTO (R_PPC64_TPREL16_LO_DS,
1644 0, /* rightshift */
1645 1, /* size (0 = byte, 1 = short, 2 = long) */
1646 16, /* bitsize */
1647 FALSE, /* pc_relative */
1648 0, /* bitpos */
1649 complain_overflow_dont, /* complain_on_overflow */
1650 ppc64_elf_unhandled_reloc, /* special_function */
1651 "R_PPC64_TPREL16_LO_DS", /* name */
1652 FALSE, /* partial_inplace */
1653 0, /* src_mask */
1654 0xfffc, /* dst_mask */
1655 FALSE), /* pcrel_offset */
1656
1657 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1658 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1659 to the first entry relative to the TOC base (r2). */
1660 HOWTO (R_PPC64_GOT_TLSGD16,
1661 0, /* rightshift */
1662 1, /* size (0 = byte, 1 = short, 2 = long) */
1663 16, /* bitsize */
1664 FALSE, /* pc_relative */
1665 0, /* bitpos */
1666 complain_overflow_signed, /* complain_on_overflow */
1667 ppc64_elf_unhandled_reloc, /* special_function */
1668 "R_PPC64_GOT_TLSGD16", /* name */
b34976b6 1669 FALSE, /* partial_inplace */
5bd4f169
AM
1670 0, /* src_mask */
1671 0xffff, /* dst_mask */
b34976b6 1672 FALSE), /* pcrel_offset */
5bd4f169 1673
411e1bfb
AM
1674 /* Like GOT_TLSGD16, but no overflow. */
1675 HOWTO (R_PPC64_GOT_TLSGD16_LO,
5bd4f169
AM
1676 0, /* rightshift */
1677 1, /* size (0 = byte, 1 = short, 2 = long) */
1678 16, /* bitsize */
b34976b6 1679 FALSE, /* pc_relative */
5bd4f169
AM
1680 0, /* bitpos */
1681 complain_overflow_dont, /* complain_on_overflow */
805fc799 1682 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1683 "R_PPC64_GOT_TLSGD16_LO", /* name */
b34976b6 1684 FALSE, /* partial_inplace */
5bd4f169
AM
1685 0, /* src_mask */
1686 0xffff, /* dst_mask */
b34976b6 1687 FALSE), /* pcrel_offset */
5bd4f169 1688
411e1bfb
AM
1689 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1690 HOWTO (R_PPC64_GOT_TLSGD16_HI,
5bd4f169
AM
1691 16, /* rightshift */
1692 1, /* size (0 = byte, 1 = short, 2 = long) */
1693 16, /* bitsize */
b34976b6 1694 FALSE, /* pc_relative */
5bd4f169 1695 0, /* bitpos */
f9c6b907 1696 complain_overflow_signed, /* complain_on_overflow */
805fc799 1697 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1698 "R_PPC64_GOT_TLSGD16_HI", /* name */
b34976b6 1699 FALSE, /* partial_inplace */
5bd4f169
AM
1700 0, /* src_mask */
1701 0xffff, /* dst_mask */
b34976b6 1702 FALSE), /* pcrel_offset */
5bd4f169 1703
411e1bfb
AM
1704 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1705 HOWTO (R_PPC64_GOT_TLSGD16_HA,
5bd4f169
AM
1706 16, /* rightshift */
1707 1, /* size (0 = byte, 1 = short, 2 = long) */
1708 16, /* bitsize */
b34976b6 1709 FALSE, /* pc_relative */
5bd4f169 1710 0, /* bitpos */
f9c6b907 1711 complain_overflow_signed, /* complain_on_overflow */
805fc799 1712 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1713 "R_PPC64_GOT_TLSGD16_HA", /* name */
b34976b6 1714 FALSE, /* partial_inplace */
5bd4f169
AM
1715 0, /* src_mask */
1716 0xffff, /* dst_mask */
b34976b6 1717 FALSE), /* pcrel_offset */
5bd4f169 1718
411e1bfb
AM
1719 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1720 with values (sym+add)@dtpmod and zero, and computes the offset to the
1721 first entry relative to the TOC base (r2). */
1722 HOWTO (R_PPC64_GOT_TLSLD16,
5bd4f169
AM
1723 0, /* rightshift */
1724 1, /* size (0 = byte, 1 = short, 2 = long) */
1725 16, /* bitsize */
b34976b6 1726 FALSE, /* pc_relative */
5bd4f169 1727 0, /* bitpos */
411e1bfb
AM
1728 complain_overflow_signed, /* complain_on_overflow */
1729 ppc64_elf_unhandled_reloc, /* special_function */
1730 "R_PPC64_GOT_TLSLD16", /* name */
b34976b6 1731 FALSE, /* partial_inplace */
d006db6c 1732 0, /* src_mask */
411e1bfb 1733 0xffff, /* dst_mask */
b34976b6 1734 FALSE), /* pcrel_offset */
5bd4f169 1735
411e1bfb
AM
1736 /* Like GOT_TLSLD16, but no overflow. */
1737 HOWTO (R_PPC64_GOT_TLSLD16_LO,
5bd4f169
AM
1738 0, /* rightshift */
1739 1, /* size (0 = byte, 1 = short, 2 = long) */
1740 16, /* bitsize */
b34976b6 1741 FALSE, /* pc_relative */
5bd4f169 1742 0, /* bitpos */
411e1bfb
AM
1743 complain_overflow_dont, /* complain_on_overflow */
1744 ppc64_elf_unhandled_reloc, /* special_function */
1745 "R_PPC64_GOT_TLSLD16_LO", /* name */
b34976b6 1746 FALSE, /* partial_inplace */
d006db6c 1747 0, /* src_mask */
411e1bfb 1748 0xffff, /* dst_mask */
b34976b6 1749 FALSE), /* pcrel_offset */
5bd4f169 1750
411e1bfb
AM
1751 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1752 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1753 16, /* rightshift */
5bd4f169
AM
1754 1, /* size (0 = byte, 1 = short, 2 = long) */
1755 16, /* bitsize */
b34976b6 1756 FALSE, /* pc_relative */
5bd4f169 1757 0, /* bitpos */
f9c6b907 1758 complain_overflow_signed, /* complain_on_overflow */
805fc799 1759 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1760 "R_PPC64_GOT_TLSLD16_HI", /* name */
b34976b6 1761 FALSE, /* partial_inplace */
d006db6c 1762 0, /* src_mask */
411e1bfb 1763 0xffff, /* dst_mask */
b34976b6 1764 FALSE), /* pcrel_offset */
5bd4f169 1765
411e1bfb
AM
1766 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1767 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1768 16, /* rightshift */
5bd4f169
AM
1769 1, /* size (0 = byte, 1 = short, 2 = long) */
1770 16, /* bitsize */
b34976b6 1771 FALSE, /* pc_relative */
5bd4f169 1772 0, /* bitpos */
f9c6b907 1773 complain_overflow_signed, /* complain_on_overflow */
805fc799 1774 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1775 "R_PPC64_GOT_TLSLD16_HA", /* name */
b34976b6 1776 FALSE, /* partial_inplace */
d006db6c 1777 0, /* src_mask */
411e1bfb 1778 0xffff, /* dst_mask */
b34976b6 1779 FALSE), /* pcrel_offset */
5bd4f169 1780
411e1bfb
AM
1781 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1782 the offset to the entry relative to the TOC base (r2). */
1783 HOWTO (R_PPC64_GOT_DTPREL16_DS,
5bd4f169
AM
1784 0, /* rightshift */
1785 1, /* size (0 = byte, 1 = short, 2 = long) */
1786 16, /* bitsize */
b34976b6 1787 FALSE, /* pc_relative */
5bd4f169 1788 0, /* bitpos */
411e1bfb 1789 complain_overflow_signed, /* complain_on_overflow */
805fc799 1790 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1791 "R_PPC64_GOT_DTPREL16_DS", /* name */
b34976b6 1792 FALSE, /* partial_inplace */
d006db6c 1793 0, /* src_mask */
5bd4f169 1794 0xfffc, /* dst_mask */
b34976b6 1795 FALSE), /* pcrel_offset */
5bd4f169 1796
411e1bfb
AM
1797 /* Like GOT_DTPREL16_DS, but no overflow. */
1798 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
5bd4f169 1799 0, /* rightshift */
c061c2d8
AM
1800 1, /* size (0 = byte, 1 = short, 2 = long) */
1801 16, /* bitsize */
b34976b6 1802 FALSE, /* pc_relative */
5bd4f169 1803 0, /* bitpos */
411e1bfb
AM
1804 complain_overflow_dont, /* complain_on_overflow */
1805 ppc64_elf_unhandled_reloc, /* special_function */
1806 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
b34976b6 1807 FALSE, /* partial_inplace */
d006db6c 1808 0, /* src_mask */
c061c2d8 1809 0xfffc, /* dst_mask */
b34976b6 1810 FALSE), /* pcrel_offset */
5bd4f169 1811
411e1bfb
AM
1812 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1813 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1814 16, /* rightshift */
5bd4f169
AM
1815 1, /* size (0 = byte, 1 = short, 2 = long) */
1816 16, /* bitsize */
b34976b6 1817 FALSE, /* pc_relative */
5bd4f169 1818 0, /* bitpos */
f9c6b907 1819 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1820 ppc64_elf_unhandled_reloc, /* special_function */
1821 "R_PPC64_GOT_DTPREL16_HI", /* name */
b34976b6 1822 FALSE, /* partial_inplace */
d006db6c 1823 0, /* src_mask */
411e1bfb 1824 0xffff, /* dst_mask */
b34976b6 1825 FALSE), /* pcrel_offset */
5bd4f169 1826
411e1bfb
AM
1827 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1828 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1829 16, /* rightshift */
1830 1, /* size (0 = byte, 1 = short, 2 = long) */
1831 16, /* bitsize */
1832 FALSE, /* pc_relative */
1833 0, /* bitpos */
f9c6b907 1834 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1835 ppc64_elf_unhandled_reloc, /* special_function */
1836 "R_PPC64_GOT_DTPREL16_HA", /* name */
1837 FALSE, /* partial_inplace */
1838 0, /* src_mask */
1839 0xffff, /* dst_mask */
1840 FALSE), /* pcrel_offset */
1841
1842 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1843 offset to the entry relative to the TOC base (r2). */
1844 HOWTO (R_PPC64_GOT_TPREL16_DS,
5bd4f169
AM
1845 0, /* rightshift */
1846 1, /* size (0 = byte, 1 = short, 2 = long) */
1847 16, /* bitsize */
b34976b6 1848 FALSE, /* pc_relative */
5bd4f169
AM
1849 0, /* bitpos */
1850 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1851 ppc64_elf_unhandled_reloc, /* special_function */
1852 "R_PPC64_GOT_TPREL16_DS", /* name */
b34976b6 1853 FALSE, /* partial_inplace */
d006db6c 1854 0, /* src_mask */
ad8e1ba5 1855 0xfffc, /* dst_mask */
b34976b6 1856 FALSE), /* pcrel_offset */
5bd4f169 1857
411e1bfb
AM
1858 /* Like GOT_TPREL16_DS, but no overflow. */
1859 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
5bd4f169
AM
1860 0, /* rightshift */
1861 1, /* size (0 = byte, 1 = short, 2 = long) */
1862 16, /* bitsize */
b34976b6 1863 FALSE, /* pc_relative */
5bd4f169
AM
1864 0, /* bitpos */
1865 complain_overflow_dont, /* complain_on_overflow */
411e1bfb
AM
1866 ppc64_elf_unhandled_reloc, /* special_function */
1867 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
b34976b6 1868 FALSE, /* partial_inplace */
d006db6c 1869 0, /* src_mask */
ad8e1ba5 1870 0xfffc, /* dst_mask */
b34976b6 1871 FALSE), /* pcrel_offset */
5bd4f169 1872
411e1bfb
AM
1873 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1874 HOWTO (R_PPC64_GOT_TPREL16_HI,
1875 16, /* rightshift */
5bd4f169
AM
1876 1, /* size (0 = byte, 1 = short, 2 = long) */
1877 16, /* bitsize */
b34976b6 1878 FALSE, /* pc_relative */
5bd4f169 1879 0, /* bitpos */
f9c6b907 1880 complain_overflow_signed, /* complain_on_overflow */
805fc799 1881 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1882 "R_PPC64_GOT_TPREL16_HI", /* name */
b34976b6 1883 FALSE, /* partial_inplace */
d006db6c 1884 0, /* src_mask */
411e1bfb 1885 0xffff, /* dst_mask */
b34976b6 1886 FALSE), /* pcrel_offset */
5bd4f169 1887
411e1bfb
AM
1888 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1889 HOWTO (R_PPC64_GOT_TPREL16_HA,
1890 16, /* rightshift */
5bd4f169
AM
1891 1, /* size (0 = byte, 1 = short, 2 = long) */
1892 16, /* bitsize */
b34976b6 1893 FALSE, /* pc_relative */
5bd4f169 1894 0, /* bitpos */
f9c6b907 1895 complain_overflow_signed, /* complain_on_overflow */
805fc799 1896 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1897 "R_PPC64_GOT_TPREL16_HA", /* name */
b34976b6 1898 FALSE, /* partial_inplace */
d006db6c 1899 0, /* src_mask */
411e1bfb 1900 0xffff, /* dst_mask */
b34976b6 1901 FALSE), /* pcrel_offset */
5bd4f169 1902
25f23106
AM
1903 HOWTO (R_PPC64_JMP_IREL, /* type */
1904 0, /* rightshift */
1905 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1906 0, /* bitsize */
1907 FALSE, /* pc_relative */
1908 0, /* bitpos */
1909 complain_overflow_dont, /* complain_on_overflow */
1910 ppc64_elf_unhandled_reloc, /* special_function */
1911 "R_PPC64_JMP_IREL", /* name */
1912 FALSE, /* partial_inplace */
1913 0, /* src_mask */
1914 0, /* dst_mask */
1915 FALSE), /* pcrel_offset */
1916
e054468f
AM
1917 HOWTO (R_PPC64_IRELATIVE, /* type */
1918 0, /* rightshift */
1919 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1920 64, /* bitsize */
1921 FALSE, /* pc_relative */
1922 0, /* bitpos */
1923 complain_overflow_dont, /* complain_on_overflow */
1924 bfd_elf_generic_reloc, /* special_function */
1925 "R_PPC64_IRELATIVE", /* name */
1926 FALSE, /* partial_inplace */
1927 0, /* src_mask */
1928 ONES (64), /* dst_mask */
1929 FALSE), /* pcrel_offset */
1930
25f23106
AM
1931 /* A 16 bit relative relocation. */
1932 HOWTO (R_PPC64_REL16, /* type */
1933 0, /* rightshift */
1934 1, /* size (0 = byte, 1 = short, 2 = long) */
1935 16, /* bitsize */
1936 TRUE, /* pc_relative */
1937 0, /* bitpos */
1938 complain_overflow_bitfield, /* complain_on_overflow */
1939 bfd_elf_generic_reloc, /* special_function */
1940 "R_PPC64_REL16", /* name */
1941 FALSE, /* partial_inplace */
1942 0, /* src_mask */
1943 0xffff, /* dst_mask */
1944 TRUE), /* pcrel_offset */
1945
1946 /* A 16 bit relative relocation without overflow. */
1947 HOWTO (R_PPC64_REL16_LO, /* type */
1948 0, /* rightshift */
1949 1, /* size (0 = byte, 1 = short, 2 = long) */
1950 16, /* bitsize */
1951 TRUE, /* pc_relative */
1952 0, /* bitpos */
1953 complain_overflow_dont,/* complain_on_overflow */
1954 bfd_elf_generic_reloc, /* special_function */
1955 "R_PPC64_REL16_LO", /* name */
1956 FALSE, /* partial_inplace */
1957 0, /* src_mask */
1958 0xffff, /* dst_mask */
1959 TRUE), /* pcrel_offset */
1960
1961 /* The high order 16 bits of a relative address. */
1962 HOWTO (R_PPC64_REL16_HI, /* type */
1963 16, /* rightshift */
1964 1, /* size (0 = byte, 1 = short, 2 = long) */
1965 16, /* bitsize */
1966 TRUE, /* pc_relative */
1967 0, /* bitpos */
f9c6b907 1968 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
1969 bfd_elf_generic_reloc, /* special_function */
1970 "R_PPC64_REL16_HI", /* name */
1971 FALSE, /* partial_inplace */
1972 0, /* src_mask */
1973 0xffff, /* dst_mask */
1974 TRUE), /* pcrel_offset */
1975
1976 /* The high order 16 bits of a relative address, plus 1 if the contents of
1977 the low 16 bits, treated as a signed number, is negative. */
1978 HOWTO (R_PPC64_REL16_HA, /* type */
1979 16, /* rightshift */
1980 1, /* size (0 = byte, 1 = short, 2 = long) */
1981 16, /* bitsize */
1982 TRUE, /* pc_relative */
1983 0, /* bitpos */
f9c6b907 1984 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
1985 ppc64_elf_ha_reloc, /* special_function */
1986 "R_PPC64_REL16_HA", /* name */
1987 FALSE, /* partial_inplace */
1988 0, /* src_mask */
1989 0xffff, /* dst_mask */
1990 TRUE), /* pcrel_offset */
1991
f9c6b907
AM
1992 /* Like R_PPC64_ADDR16_HI, but no overflow. */
1993 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
1994 16, /* rightshift */
1995 1, /* size (0 = byte, 1 = short, 2 = long) */
1996 16, /* bitsize */
1997 FALSE, /* pc_relative */
1998 0, /* bitpos */
1999 complain_overflow_dont, /* complain_on_overflow */
2000 bfd_elf_generic_reloc, /* special_function */
2001 "R_PPC64_ADDR16_HIGH", /* name */
2002 FALSE, /* partial_inplace */
2003 0, /* src_mask */
2004 0xffff, /* dst_mask */
2005 FALSE), /* pcrel_offset */
2006
2007 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2008 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2009 16, /* rightshift */
2010 1, /* size (0 = byte, 1 = short, 2 = long) */
2011 16, /* bitsize */
2012 FALSE, /* pc_relative */
2013 0, /* bitpos */
2014 complain_overflow_dont, /* complain_on_overflow */
2015 ppc64_elf_ha_reloc, /* special_function */
2016 "R_PPC64_ADDR16_HIGHA", /* name */
2017 FALSE, /* partial_inplace */
2018 0, /* src_mask */
2019 0xffff, /* dst_mask */
2020 FALSE), /* pcrel_offset */
2021
2022 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2023 HOWTO (R_PPC64_DTPREL16_HIGH,
2024 16, /* rightshift */
2025 1, /* size (0 = byte, 1 = short, 2 = long) */
2026 16, /* bitsize */
2027 FALSE, /* pc_relative */
2028 0, /* bitpos */
2029 complain_overflow_dont, /* complain_on_overflow */
2030 ppc64_elf_unhandled_reloc, /* special_function */
2031 "R_PPC64_DTPREL16_HIGH", /* name */
2032 FALSE, /* partial_inplace */
2033 0, /* src_mask */
2034 0xffff, /* dst_mask */
2035 FALSE), /* pcrel_offset */
2036
2037 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2038 HOWTO (R_PPC64_DTPREL16_HIGHA,
2039 16, /* rightshift */
2040 1, /* size (0 = byte, 1 = short, 2 = long) */
2041 16, /* bitsize */
2042 FALSE, /* pc_relative */
2043 0, /* bitpos */
2044 complain_overflow_dont, /* complain_on_overflow */
2045 ppc64_elf_unhandled_reloc, /* special_function */
2046 "R_PPC64_DTPREL16_HIGHA", /* name */
2047 FALSE, /* partial_inplace */
2048 0, /* src_mask */
2049 0xffff, /* dst_mask */
2050 FALSE), /* pcrel_offset */
2051
2052 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2053 HOWTO (R_PPC64_TPREL16_HIGH,
2054 16, /* rightshift */
2055 1, /* size (0 = byte, 1 = short, 2 = long) */
2056 16, /* bitsize */
2057 FALSE, /* pc_relative */
2058 0, /* bitpos */
2059 complain_overflow_dont, /* complain_on_overflow */
2060 ppc64_elf_unhandled_reloc, /* special_function */
2061 "R_PPC64_TPREL16_HIGH", /* name */
2062 FALSE, /* partial_inplace */
2063 0, /* src_mask */
2064 0xffff, /* dst_mask */
2065 FALSE), /* pcrel_offset */
2066
2067 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2068 HOWTO (R_PPC64_TPREL16_HIGHA,
2069 16, /* rightshift */
2070 1, /* size (0 = byte, 1 = short, 2 = long) */
2071 16, /* bitsize */
2072 FALSE, /* pc_relative */
2073 0, /* bitpos */
2074 complain_overflow_dont, /* complain_on_overflow */
2075 ppc64_elf_unhandled_reloc, /* special_function */
2076 "R_PPC64_TPREL16_HIGHA", /* name */
2077 FALSE, /* partial_inplace */
2078 0, /* src_mask */
2079 0xffff, /* dst_mask */
2080 FALSE), /* pcrel_offset */
2081
5bd4f169
AM
2082 /* GNU extension to record C++ vtable hierarchy. */
2083 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2084 0, /* rightshift */
2085 0, /* size (0 = byte, 1 = short, 2 = long) */
2086 0, /* bitsize */
b34976b6 2087 FALSE, /* pc_relative */
5bd4f169
AM
2088 0, /* bitpos */
2089 complain_overflow_dont, /* complain_on_overflow */
2090 NULL, /* special_function */
2091 "R_PPC64_GNU_VTINHERIT", /* name */
b34976b6 2092 FALSE, /* partial_inplace */
5bd4f169
AM
2093 0, /* src_mask */
2094 0, /* dst_mask */
b34976b6 2095 FALSE), /* pcrel_offset */
5bd4f169
AM
2096
2097 /* GNU extension to record C++ vtable member usage. */
2098 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2099 0, /* rightshift */
2100 0, /* size (0 = byte, 1 = short, 2 = long) */
2101 0, /* bitsize */
b34976b6 2102 FALSE, /* pc_relative */
5bd4f169
AM
2103 0, /* bitpos */
2104 complain_overflow_dont, /* complain_on_overflow */
2105 NULL, /* special_function */
2106 "R_PPC64_GNU_VTENTRY", /* name */
b34976b6 2107 FALSE, /* partial_inplace */
5bd4f169
AM
2108 0, /* src_mask */
2109 0, /* dst_mask */
b34976b6 2110 FALSE), /* pcrel_offset */
5bd4f169
AM
2111};
2112
2113\f
2114/* Initialize the ppc64_elf_howto_table, so that linear accesses can
2115 be done. */
2116
2117static void
4ce794b7 2118ppc_howto_init (void)
5bd4f169
AM
2119{
2120 unsigned int i, type;
2121
2122 for (i = 0;
2123 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2124 i++)
2125 {
2126 type = ppc64_elf_howto_raw[i].type;
2127 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2128 / sizeof (ppc64_elf_howto_table[0])));
2129 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2130 }
2131}
2132
2133static reloc_howto_type *
4ce794b7
AM
2134ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2135 bfd_reloc_code_real_type code)
5bd4f169 2136{
411e1bfb 2137 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
5bd4f169
AM
2138
2139 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2140 /* Initialize howto table if needed. */
2141 ppc_howto_init ();
2142
4ce794b7 2143 switch (code)
5bd4f169
AM
2144 {
2145 default:
4ce794b7 2146 return NULL;
5bd4f169 2147
411e1bfb
AM
2148 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2149 break;
2150 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2151 break;
2152 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2153 break;
2154 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2155 break;
2156 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2157 break;
2158 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2159 break;
f9c6b907
AM
2160 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2161 break;
411e1bfb 2162 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
5bd4f169 2163 break;
f9c6b907
AM
2164 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2165 break;
411e1bfb 2166 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
5bd4f169 2167 break;
411e1bfb 2168 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
5bd4f169 2169 break;
411e1bfb 2170 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
5bd4f169 2171 break;
411e1bfb 2172 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
5bd4f169 2173 break;
411e1bfb 2174 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
5bd4f169 2175 break;
411e1bfb 2176 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
5bd4f169 2177 break;
411e1bfb 2178 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
5bd4f169 2179 break;
411e1bfb 2180 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
5bd4f169 2181 break;
411e1bfb 2182 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
5bd4f169 2183 break;
411e1bfb 2184 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
5bd4f169 2185 break;
411e1bfb 2186 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
5bd4f169 2187 break;
411e1bfb 2188 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
5bd4f169 2189 break;
411e1bfb 2190 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
5bd4f169 2191 break;
411e1bfb 2192 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
5bd4f169 2193 break;
411e1bfb 2194 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
5bd4f169 2195 break;
411e1bfb 2196 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
5bd4f169 2197 break;
411e1bfb 2198 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
5bd4f169 2199 break;
411e1bfb 2200 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
5bd4f169 2201 break;
411e1bfb 2202 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
5bd4f169 2203 break;
411e1bfb 2204 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
5bd4f169 2205 break;
411e1bfb 2206 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
5bd4f169 2207 break;
411e1bfb 2208 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
5bd4f169 2209 break;
411e1bfb 2210 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
5bd4f169 2211 break;
411e1bfb 2212 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
5bd4f169 2213 break;
411e1bfb 2214 case BFD_RELOC_64: r = R_PPC64_ADDR64;
5bd4f169 2215 break;
411e1bfb 2216 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
5bd4f169 2217 break;
411e1bfb 2218 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
5bd4f169 2219 break;
411e1bfb 2220 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
5bd4f169 2221 break;
411e1bfb 2222 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
5bd4f169 2223 break;
411e1bfb 2224 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
5bd4f169 2225 break;
411e1bfb 2226 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
5bd4f169 2227 break;
411e1bfb 2228 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
5bd4f169 2229 break;
411e1bfb 2230 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
5bd4f169 2231 break;
411e1bfb 2232 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
5bd4f169 2233 break;
411e1bfb 2234 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
5bd4f169 2235 break;
411e1bfb 2236 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
5bd4f169 2237 break;
411e1bfb 2238 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
5bd4f169 2239 break;
411e1bfb 2240 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
5bd4f169 2241 break;
411e1bfb 2242 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
5bd4f169 2243 break;
411e1bfb 2244 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
5bd4f169 2245 break;
411e1bfb 2246 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
5bd4f169 2247 break;
411e1bfb 2248 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
5bd4f169 2249 break;
411e1bfb 2250 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
5bd4f169 2251 break;
411e1bfb 2252 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
5bd4f169 2253 break;
411e1bfb 2254 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
5bd4f169 2255 break;
411e1bfb 2256 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
5bd4f169 2257 break;
411e1bfb 2258 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
5bd4f169 2259 break;
411e1bfb 2260 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
5bd4f169 2261 break;
411e1bfb 2262 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
5bd4f169 2263 break;
411e1bfb 2264 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
5bd4f169 2265 break;
411e1bfb 2266 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
5bd4f169 2267 break;
411e1bfb 2268 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
5bd4f169 2269 break;
411e1bfb 2270 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
5bd4f169 2271 break;
727fc41e
AM
2272 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2273 break;
2274 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2275 break;
411e1bfb 2276 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
5bd4f169 2277 break;
411e1bfb 2278 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
5bd4f169 2279 break;
411e1bfb 2280 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
5bd4f169 2281 break;
411e1bfb 2282 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
5bd4f169 2283 break;
f9c6b907
AM
2284 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2285 break;
411e1bfb 2286 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
5bd4f169 2287 break;
f9c6b907
AM
2288 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2289 break;
411e1bfb 2290 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
5bd4f169 2291 break;
411e1bfb
AM
2292 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2293 break;
2294 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2295 break;
2296 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2297 break;
f9c6b907
AM
2298 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2299 break;
411e1bfb
AM
2300 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2301 break;
f9c6b907
AM
2302 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2303 break;
411e1bfb
AM
2304 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2305 break;
2306 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2307 break;
2308 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2309 break;
2310 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2311 break;
2312 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2313 break;
2314 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2315 break;
2316 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2317 break;
2318 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2319 break;
2320 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2321 break;
2322 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2323 break;
2324 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2325 break;
2326 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2327 break;
2328 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2329 break;
2330 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2331 break;
2332 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2333 break;
2334 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2335 break;
2336 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2337 break;
2338 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2339 break;
2340 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2341 break;
2342 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2343 break;
2344 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2345 break;
2346 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2347 break;
2348 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2349 break;
2350 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2351 break;
2352 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2353 break;
2354 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2355 break;
2356 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2357 break;
2358 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2359 break;
2360 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2361 break;
25f23106
AM
2362 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2363 break;
2364 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2365 break;
2366 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2367 break;
2368 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2369 break;
411e1bfb
AM
2370 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2371 break;
2372 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
5bd4f169
AM
2373 break;
2374 }
2375
4ce794b7 2376 return ppc64_elf_howto_table[r];
5bd4f169
AM
2377};
2378
157090f7
AM
2379static reloc_howto_type *
2380ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2381 const char *r_name)
2382{
2383 unsigned int i;
2384
2385 for (i = 0;
2386 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2387 i++)
2388 if (ppc64_elf_howto_raw[i].name != NULL
2389 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2390 return &ppc64_elf_howto_raw[i];
2391
2392 return NULL;
2393}
2394
5bd4f169
AM
2395/* Set the howto pointer for a PowerPC ELF reloc. */
2396
2397static void
4ce794b7
AM
2398ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2399 Elf_Internal_Rela *dst)
5bd4f169 2400{
65f38f15
AM
2401 unsigned int type;
2402
ef60b7ff 2403 /* Initialize howto table if needed. */
5bd4f169 2404 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
2405 ppc_howto_init ();
2406
65f38f15 2407 type = ELF64_R_TYPE (dst->r_info);
d0fb9a8d
JJ
2408 if (type >= (sizeof (ppc64_elf_howto_table)
2409 / sizeof (ppc64_elf_howto_table[0])))
2410 {
2411 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
3ec2b351
NC
2412 abfd, (int) type);
2413 type = R_PPC64_NONE;
d0fb9a8d 2414 }
65f38f15 2415 cache_ptr->howto = ppc64_elf_howto_table[type];
5bd4f169
AM
2416}
2417
04c9666a 2418/* Handle the R_PPC64_ADDR16_HA and similar relocs. */
5bd4f169
AM
2419
2420static bfd_reloc_status_type
4ce794b7
AM
2421ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2422 void *data, asection *input_section,
2423 bfd *output_bfd, char **error_message)
5bd4f169 2424{
805fc799
AM
2425 /* If this is a relocatable link (output_bfd test tells us), just
2426 call the generic function. Any adjustment will be done at final
2427 link time. */
2428 if (output_bfd != NULL)
cedb70c5 2429 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2430 input_section, output_bfd, error_message);
2431
2432 /* Adjust the addend for sign extension of the low 16 bits.
2433 We won't actually be using the low 16 bits, so trashing them
2434 doesn't matter. */
2435 reloc_entry->addend += 0x8000;
2436 return bfd_reloc_continue;
2437}
5bd4f169 2438
2441e016
AM
2439static bfd_reloc_status_type
2440ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2441 void *data, asection *input_section,
2442 bfd *output_bfd, char **error_message)
2443{
2444 if (output_bfd != NULL)
2445 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2446 input_section, output_bfd, error_message);
2447
699733f6
AM
2448 if (strcmp (symbol->section->name, ".opd") == 0
2449 && (symbol->section->owner->flags & DYNAMIC) == 0)
2441e016
AM
2450 {
2451 bfd_vma dest = opd_entry_value (symbol->section,
2452 symbol->value + reloc_entry->addend,
aef36ac1 2453 NULL, NULL, FALSE);
2441e016
AM
2454 if (dest != (bfd_vma) -1)
2455 reloc_entry->addend = dest - (symbol->value
2456 + symbol->section->output_section->vma
2457 + symbol->section->output_offset);
2458 }
2459 return bfd_reloc_continue;
2460}
2461
805fc799 2462static bfd_reloc_status_type
4ce794b7
AM
2463ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2464 void *data, asection *input_section,
2465 bfd *output_bfd, char **error_message)
805fc799
AM
2466{
2467 long insn;
04c9666a 2468 enum elf_ppc64_reloc_type r_type;
805fc799 2469 bfd_size_type octets;
794e51c0
AM
2470 /* Assume 'at' branch hints. */
2471 bfd_boolean is_isa_v2 = TRUE;
805fc799
AM
2472
2473 /* If this is a relocatable link (output_bfd test tells us), just
2474 call the generic function. Any adjustment will be done at final
2475 link time. */
5bd4f169 2476 if (output_bfd != NULL)
cedb70c5 2477 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2478 input_section, output_bfd, error_message);
2479
2480 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2481 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2482 insn &= ~(0x01 << 21);
4ce794b7 2483 r_type = reloc_entry->howto->type;
805fc799
AM
2484 if (r_type == R_PPC64_ADDR14_BRTAKEN
2485 || r_type == R_PPC64_REL14_BRTAKEN)
cedb70c5 2486 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
805fc799 2487
794e51c0 2488 if (is_isa_v2)
5bd4f169 2489 {
805fc799
AM
2490 /* Set 'a' bit. This is 0b00010 in BO field for branch
2491 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2492 for branch on CTR insns (BO == 1a00t or 1a01t). */
2493 if ((insn & (0x14 << 21)) == (0x04 << 21))
2494 insn |= 0x02 << 21;
2495 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2496 insn |= 0x08 << 21;
2497 else
2441e016 2498 goto out;
5bd4f169 2499 }
805fc799
AM
2500 else
2501 {
2502 bfd_vma target = 0;
2503 bfd_vma from;
5bd4f169 2504
805fc799
AM
2505 if (!bfd_is_com_section (symbol->section))
2506 target = symbol->value;
2507 target += symbol->section->output_section->vma;
2508 target += symbol->section->output_offset;
2509 target += reloc_entry->addend;
5bd4f169 2510
805fc799
AM
2511 from = (reloc_entry->address
2512 + input_section->output_offset
2513 + input_section->output_section->vma);
5bd4f169 2514
805fc799
AM
2515 /* Invert 'y' bit if not the default. */
2516 if ((bfd_signed_vma) (target - from) < 0)
2517 insn ^= 0x01 << 21;
2518 }
4ce794b7 2519 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2441e016
AM
2520 out:
2521 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2522 input_section, output_bfd, error_message);
805fc799 2523}
5bd4f169 2524
805fc799 2525static bfd_reloc_status_type
4ce794b7
AM
2526ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2527 void *data, asection *input_section,
2528 bfd *output_bfd, char **error_message)
805fc799
AM
2529{
2530 /* If this is a relocatable link (output_bfd test tells us), just
2531 call the generic function. Any adjustment will be done at final
2532 link time. */
2533 if (output_bfd != NULL)
cedb70c5 2534 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799 2535 input_section, output_bfd, error_message);
5bd4f169 2536
805fc799
AM
2537 /* Subtract the symbol section base address. */
2538 reloc_entry->addend -= symbol->section->output_section->vma;
5bd4f169
AM
2539 return bfd_reloc_continue;
2540}
2541
805fc799 2542static bfd_reloc_status_type
4ce794b7
AM
2543ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2544 void *data, asection *input_section,
2545 bfd *output_bfd, char **error_message)
805fc799
AM
2546{
2547 /* If this is a relocatable link (output_bfd test tells us), just
2548 call the generic function. Any adjustment will be done at final
2549 link time. */
2550 if (output_bfd != NULL)
cedb70c5 2551 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2552 input_section, output_bfd, error_message);
2553
2554 /* Subtract the symbol section base address. */
2555 reloc_entry->addend -= symbol->section->output_section->vma;
2556
2557 /* Adjust the addend for sign extension of the low 16 bits. */
2558 reloc_entry->addend += 0x8000;
2559 return bfd_reloc_continue;
2560}
2561
2562static bfd_reloc_status_type
4ce794b7
AM
2563ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2564 void *data, asection *input_section,
2565 bfd *output_bfd, char **error_message)
805fc799
AM
2566{
2567 bfd_vma TOCstart;
2568
2569 /* If this is a relocatable link (output_bfd test tells us), just
2570 call the generic function. Any adjustment will be done at final
2571 link time. */
2572 if (output_bfd != NULL)
cedb70c5 2573 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2574 input_section, output_bfd, error_message);
2575
2576 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2577 if (TOCstart == 0)
1c865ab2 2578 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2579
2580 /* Subtract the TOC base address. */
2581 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2582 return bfd_reloc_continue;
2583}
2584
2585static bfd_reloc_status_type
4ce794b7
AM
2586ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2587 void *data, asection *input_section,
2588 bfd *output_bfd, char **error_message)
805fc799
AM
2589{
2590 bfd_vma TOCstart;
2591
2592 /* If this is a relocatable link (output_bfd test tells us), just
2593 call the generic function. Any adjustment will be done at final
2594 link time. */
2595 if (output_bfd != NULL)
cedb70c5 2596 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2597 input_section, output_bfd, error_message);
2598
2599 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2600 if (TOCstart == 0)
1c865ab2 2601 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2602
2603 /* Subtract the TOC base address. */
2604 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2605
2606 /* Adjust the addend for sign extension of the low 16 bits. */
2607 reloc_entry->addend += 0x8000;
2608 return bfd_reloc_continue;
2609}
2610
2611static bfd_reloc_status_type
4ce794b7
AM
2612ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2613 void *data, asection *input_section,
2614 bfd *output_bfd, char **error_message)
805fc799
AM
2615{
2616 bfd_vma TOCstart;
2617 bfd_size_type octets;
2618
2619 /* If this is a relocatable link (output_bfd test tells us), just
2620 call the generic function. Any adjustment will be done at final
2621 link time. */
2622 if (output_bfd != NULL)
cedb70c5 2623 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2624 input_section, output_bfd, error_message);
2625
2626 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2627 if (TOCstart == 0)
1c865ab2 2628 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2629
2630 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2631 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2632 return bfd_reloc_ok;
2633}
2634
2635static bfd_reloc_status_type
4ce794b7
AM
2636ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2637 void *data, asection *input_section,
2638 bfd *output_bfd, char **error_message)
805fc799
AM
2639{
2640 /* If this is a relocatable link (output_bfd test tells us), just
2641 call the generic function. Any adjustment will be done at final
2642 link time. */
2643 if (output_bfd != NULL)
cedb70c5 2644 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2645 input_section, output_bfd, error_message);
2646
2647 if (error_message != NULL)
2648 {
2649 static char buf[60];
2650 sprintf (buf, "generic linker can't handle %s",
2651 reloc_entry->howto->name);
2652 *error_message = buf;
2653 }
2654 return bfd_reloc_dangerous;
2655}
2656
927be08e
AM
2657/* Track GOT entries needed for a given symbol. We might need more
2658 than one got entry per symbol. */
2659struct got_entry
2660{
2661 struct got_entry *next;
2662
2663 /* The symbol addend that we'll be placing in the GOT. */
2664 bfd_vma addend;
2665
2666 /* Unlike other ELF targets, we use separate GOT entries for the same
2667 symbol referenced from different input files. This is to support
2668 automatic multiple TOC/GOT sections, where the TOC base can vary
2669 from one input file to another. After partitioning into TOC groups
2670 we merge entries within the group.
2671
2672 Point to the BFD owning this GOT entry. */
2673 bfd *owner;
2674
2675 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2676 TLS_TPREL or TLS_DTPREL for tls entries. */
f961d9dd 2677 unsigned char tls_type;
927be08e
AM
2678
2679 /* Non-zero if got.ent points to real entry. */
f961d9dd 2680 unsigned char is_indirect;
927be08e
AM
2681
2682 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2683 union
2684 {
2685 bfd_signed_vma refcount;
2686 bfd_vma offset;
2687 struct got_entry *ent;
2688 } got;
2689};
2690
2691/* The same for PLT. */
2692struct plt_entry
2693{
2694 struct plt_entry *next;
2695
2696 bfd_vma addend;
2697
2698 union
2699 {
2700 bfd_signed_vma refcount;
2701 bfd_vma offset;
2702 } plt;
2703};
2704
e717da7e
AM
2705struct ppc64_elf_obj_tdata
2706{
2707 struct elf_obj_tdata elf;
2708
2709 /* Shortcuts to dynamic linker sections. */
2710 asection *got;
2711 asection *relgot;
2712
b3fac117
AM
2713 /* Used during garbage collection. We attach global symbols defined
2714 on removed .opd entries to this section so that the sym is removed. */
2715 asection *deleted_section;
81688140 2716
927be08e 2717 /* TLS local dynamic got entry handling. Support for multiple GOT
e717da7e 2718 sections means we potentially need one of these for each input bfd. */
927be08e 2719 struct got_entry tlsld_got;
8860955f 2720
729eabd5
AM
2721 union {
2722 /* A copy of relocs before they are modified for --emit-relocs. */
2723 Elf_Internal_Rela *relocs;
2724
2725 /* Section contents. */
2726 bfd_byte *contents;
2727 } opd;
d77c8a4b
AM
2728
2729 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2730 the reloc to be in the range -32768 to 32767. */
98528052
AM
2731 unsigned int has_small_toc_reloc : 1;
2732
560c8763
AM
2733 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2734 instruction not one we handle. */
2735 unsigned int unexpected_toc_insn : 1;
e717da7e
AM
2736};
2737
2738#define ppc64_elf_tdata(bfd) \
2739 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2740
2741#define ppc64_tlsld_got(bfd) \
2742 (&ppc64_elf_tdata (bfd)->tlsld_got)
2743
0c8d6e5c
AM
2744#define is_ppc64_elf(bfd) \
2745 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
4dfe6ac6 2746 && elf_object_id (bfd) == PPC64_ELF_DATA)
0c8d6e5c 2747
e717da7e
AM
2748/* Override the generic function because we store some extras. */
2749
2750static bfd_boolean
2751ppc64_elf_mkobject (bfd *abfd)
2752{
0ffa91dd 2753 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
4dfe6ac6 2754 PPC64_ELF_DATA);
e717da7e
AM
2755}
2756
feee612b
AM
2757/* Fix bad default arch selected for a 64 bit input bfd when the
2758 default is 32 bit. */
2759
b34976b6 2760static bfd_boolean
4ce794b7 2761ppc64_elf_object_p (bfd *abfd)
feee612b
AM
2762{
2763 if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2764 {
2765 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2766
2767 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2768 {
2769 /* Relies on arch after 32 bit default being 64 bit default. */
2770 abfd->arch_info = abfd->arch_info->next;
2771 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2772 }
2773 }
b34976b6 2774 return TRUE;
feee612b
AM
2775}
2776
d37c89e5
AM
2777/* Support for core dump NOTE sections. */
2778
2779static bfd_boolean
2780ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2781{
eea6121a 2782 size_t offset, size;
d37c89e5
AM
2783
2784 if (note->descsz != 504)
2785 return FALSE;
2786
2787 /* pr_cursig */
228e534f 2788 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
d37c89e5
AM
2789
2790 /* pr_pid */
228e534f 2791 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
d37c89e5
AM
2792
2793 /* pr_reg */
2794 offset = 112;
eea6121a 2795 size = 384;
d37c89e5
AM
2796
2797 /* Make a ".reg/999" section. */
2798 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 2799 size, note->descpos + offset);
d37c89e5
AM
2800}
2801
2802static bfd_boolean
2803ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2804{
2805 if (note->descsz != 136)
2806 return FALSE;
2807
228e534f 2808 elf_tdata (abfd)->core->pid
bc989cdc 2809 = bfd_get_32 (abfd, note->descdata + 24);
228e534f 2810 elf_tdata (abfd)->core->program
d37c89e5 2811 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
228e534f 2812 elf_tdata (abfd)->core->command
d37c89e5
AM
2813 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2814
2815 return TRUE;
2816}
2817
183e98be
AM
2818static char *
2819ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2820 ...)
2821{
2822 switch (note_type)
2823 {
2824 default:
2825 return NULL;
2826
2827 case NT_PRPSINFO:
2828 {
2829 char data[136];
2830 va_list ap;
2831
2832 va_start (ap, note_type);
75cd47ed 2833 memset (data, 0, sizeof (data));
183e98be
AM
2834 strncpy (data + 40, va_arg (ap, const char *), 16);
2835 strncpy (data + 56, va_arg (ap, const char *), 80);
2836 va_end (ap);
2837 return elfcore_write_note (abfd, buf, bufsiz,
2838 "CORE", note_type, data, sizeof (data));
2839 }
2840
2841 case NT_PRSTATUS:
2842 {
2843 char data[504];
2844 va_list ap;
2845 long pid;
2846 int cursig;
2847 const void *greg;
2848
2849 va_start (ap, note_type);
2850 memset (data, 0, 112);
2851 pid = va_arg (ap, long);
2852 bfd_put_32 (abfd, pid, data + 32);
2853 cursig = va_arg (ap, int);
2854 bfd_put_16 (abfd, cursig, data + 12);
2855 greg = va_arg (ap, const void *);
2856 memcpy (data + 112, greg, 384);
2857 memset (data + 496, 0, 8);
2858 va_end (ap);
2859 return elfcore_write_note (abfd, buf, bufsiz,
2860 "CORE", note_type, data, sizeof (data));
2861 }
2862 }
2863}
2864
5d35169e
AM
2865/* Add extra PPC sections. */
2866
b35d266b 2867static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
7f4d3958 2868{
0112cd26
NC
2869 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
2870 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2871 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2872 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2873 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2874 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2875 { NULL, 0, 0, 0, 0 }
5d35169e
AM
2876};
2877
7c8fe5c4
AM
2878enum _ppc64_sec_type {
2879 sec_normal = 0,
2880 sec_opd = 1,
2881 sec_toc = 2
2882};
2883
f0abc2a1
AM
2884struct _ppc64_elf_section_data
2885{
2886 struct bfd_elf_section_data elf;
411e1bfb 2887
f0abc2a1
AM
2888 union
2889 {
74f0fb50
AM
2890 /* An array with one entry for each opd function descriptor. */
2891 struct _opd_sec_data
2892 {
2893 /* Points to the function code section for local opd entries. */
2894 asection **func_sec;
2895
2896 /* After editing .opd, adjust references to opd local syms. */
2897 long *adjust;
2898 } opd;
7c8fe5c4 2899
3a71aa26
AM
2900 /* An array for toc sections, indexed by offset/8. */
2901 struct _toc_sec_data
2902 {
2903 /* Specifies the relocation symbol index used at a given toc offset. */
2904 unsigned *symndx;
2905
2906 /* And the relocation addend. */
2907 bfd_vma *add;
2908 } toc;
7c8fe5c4
AM
2909 } u;
2910
2911 enum _ppc64_sec_type sec_type:2;
411e1bfb 2912
7c8fe5c4
AM
2913 /* Flag set when small branches are detected. Used to
2914 select suitable defaults for the stub group size. */
2915 unsigned int has_14bit_branch:1;
f0abc2a1
AM
2916};
2917
2918#define ppc64_elf_section_data(sec) \
411e1bfb 2919 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
f0abc2a1
AM
2920
2921static bfd_boolean
4ce794b7 2922ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 2923{
f592407e
AM
2924 if (!sec->used_by_bfd)
2925 {
2926 struct _ppc64_elf_section_data *sdata;
2927 bfd_size_type amt = sizeof (*sdata);
f0abc2a1 2928
f592407e
AM
2929 sdata = bfd_zalloc (abfd, amt);
2930 if (sdata == NULL)
2931 return FALSE;
2932 sec->used_by_bfd = sdata;
2933 }
f0abc2a1
AM
2934
2935 return _bfd_elf_new_section_hook (abfd, sec);
2936}
4025353c 2937
74f0fb50 2938static struct _opd_sec_data *
4025353c
AM
2939get_opd_info (asection * sec)
2940{
2941 if (sec != NULL
2942 && ppc64_elf_section_data (sec) != NULL
7c8fe5c4 2943 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
74f0fb50 2944 return &ppc64_elf_section_data (sec)->u.opd;
4025353c
AM
2945 return NULL;
2946}
ee67d69a
AM
2947
2948static inline int
2949abiversion (bfd *abfd)
2950{
2951 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
2952}
2953
2954static inline void
2955set_abiversion (bfd *abfd, int ver)
2956{
2957 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
2958 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
2959}
90e3cdf2
JJ
2960\f
2961/* Parameters for the qsort hook. */
90e3cdf2
JJ
2962static bfd_boolean synthetic_relocatable;
2963
699733f6 2964/* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
90e3cdf2
JJ
2965
2966static int
2967compare_symbols (const void *ap, const void *bp)
2968{
2969 const asymbol *a = * (const asymbol **) ap;
2970 const asymbol *b = * (const asymbol **) bp;
2971
699733f6
AM
2972 /* Section symbols first. */
2973 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
90e3cdf2 2974 return -1;
699733f6 2975 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
90e3cdf2
JJ
2976 return 1;
2977
699733f6 2978 /* then .opd symbols. */
ffcfec52
AM
2979 if (strcmp (a->section->name, ".opd") == 0
2980 && strcmp (b->section->name, ".opd") != 0)
90e3cdf2 2981 return -1;
ffcfec52
AM
2982 if (strcmp (a->section->name, ".opd") != 0
2983 && strcmp (b->section->name, ".opd") == 0)
90e3cdf2
JJ
2984 return 1;
2985
699733f6 2986 /* then other code symbols. */
90e3cdf2
JJ
2987 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2988 == (SEC_CODE | SEC_ALLOC)
2989 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2990 != (SEC_CODE | SEC_ALLOC))
2991 return -1;
2992
2993 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2994 != (SEC_CODE | SEC_ALLOC)
2995 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2996 == (SEC_CODE | SEC_ALLOC))
2997 return 1;
2998
2999 if (synthetic_relocatable)
3000 {
3001 if (a->section->id < b->section->id)
3002 return -1;
3003
3004 if (a->section->id > b->section->id)
3005 return 1;
3006 }
3007
3008 if (a->value + a->section->vma < b->value + b->section->vma)
3009 return -1;
3010
3011 if (a->value + a->section->vma > b->value + b->section->vma)
3012 return 1;
3013
4d35a0aa
AM
3014 /* For syms with the same value, prefer strong dynamic global function
3015 syms over other syms. */
3016 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3017 return -1;
3018
3019 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3020 return 1;
3021
3022 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3023 return -1;
3024
3025 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3026 return 1;
3027
3028 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3029 return -1;
3030
3031 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3032 return 1;
3033
3034 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3035 return -1;
3036
3037 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3038 return 1;
3039
90e3cdf2
JJ
3040 return 0;
3041}
3042
699733f6 3043/* Search SYMS for a symbol of the given VALUE. */
90e3cdf2 3044
699733f6
AM
3045static asymbol *
3046sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
90e3cdf2 3047{
699733f6 3048 long mid;
90e3cdf2 3049
699733f6
AM
3050 if (id == -1)
3051 {
3052 while (lo < hi)
3053 {
3054 mid = (lo + hi) >> 1;
3055 if (syms[mid]->value + syms[mid]->section->vma < value)
3056 lo = mid + 1;
3057 else if (syms[mid]->value + syms[mid]->section->vma > value)
3058 hi = mid;
3059 else
3060 return syms[mid];
3061 }
3062 }
3063 else
3064 {
3065 while (lo < hi)
3066 {
3067 mid = (lo + hi) >> 1;
3068 if (syms[mid]->section->id < id)
3069 lo = mid + 1;
3070 else if (syms[mid]->section->id > id)
3071 hi = mid;
3072 else if (syms[mid]->value < value)
3073 lo = mid + 1;
3074 else if (syms[mid]->value > value)
3075 hi = mid;
3076 else
3077 return syms[mid];
3078 }
3079 }
3080 return NULL;
90e3cdf2
JJ
3081}
3082
468392fb
AM
3083static bfd_boolean
3084section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3085{
3086 bfd_vma vma = *(bfd_vma *) ptr;
3087 return ((section->flags & SEC_ALLOC) != 0
3088 && section->vma <= vma
3089 && vma < section->vma + section->size);
3090}
3091
699733f6 3092/* Create synthetic symbols, effectively restoring "dot-symbol" function
468392fb 3093 entry syms. Also generate @plt symbols for the glink branch table. */
90e3cdf2
JJ
3094
3095static long
a7535cf3
AM
3096ppc64_elf_get_synthetic_symtab (bfd *abfd,
3097 long static_count, asymbol **static_syms,
3098 long dyn_count, asymbol **dyn_syms,
c9727e01 3099 asymbol **ret)
90e3cdf2
JJ
3100{
3101 asymbol *s;
699733f6
AM
3102 long i;
3103 long count;
90e3cdf2 3104 char *names;
a7535cf3 3105 long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
ee67d69a 3106 asection *opd = NULL;
90e3cdf2 3107 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 3108 asymbol **syms;
ee67d69a 3109 int abi = abiversion (abfd);
90e3cdf2
JJ
3110
3111 *ret = NULL;
3112
ee67d69a
AM
3113 if (abi < 2)
3114 {
3115 opd = bfd_get_section_by_name (abfd, ".opd");
3116 if (opd == NULL && abi == 1)
3117 return 0;
3118 }
90e3cdf2 3119
a7535cf3 3120 symcount = static_count;
c9727e01 3121 if (!relocatable)
a7535cf3 3122 symcount += dyn_count;
90e3cdf2 3123 if (symcount == 0)
c9727e01 3124 return 0;
90e3cdf2 3125
a7535cf3
AM
3126 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3127 if (syms == NULL)
7356fed5 3128 return -1;
a7535cf3
AM
3129
3130 if (!relocatable && static_count != 0 && dyn_count != 0)
3131 {
3132 /* Use both symbol tables. */
3133 memcpy (syms, static_syms, static_count * sizeof (*syms));
3134 memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
3135 }
3136 else if (!relocatable && static_count == 0)
3137 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3138 else
3139 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3140
90e3cdf2 3141 synthetic_relocatable = relocatable;
595da8c5 3142 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 3143
c9727e01
AM
3144 if (!relocatable && symcount > 1)
3145 {
3146 long j;
3147 /* Trim duplicate syms, since we may have merged the normal and
3148 dynamic symbols. Actually, we only care about syms that have
3b36f7e6 3149 different values, so trim any with the same value. */
c9727e01
AM
3150 for (i = 1, j = 1; i < symcount; ++i)
3151 if (syms[i - 1]->value + syms[i - 1]->section->vma
3152 != syms[i]->value + syms[i]->section->vma)
3153 syms[j++] = syms[i];
3154 symcount = j;
3155 }
3156
699733f6 3157 i = 0;
ffcfec52 3158 if (strcmp (syms[i]->section->name, ".opd") == 0)
699733f6
AM
3159 ++i;
3160 codesecsym = i;
90e3cdf2 3161
699733f6
AM
3162 for (; i < symcount; ++i)
3163 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3164 != (SEC_CODE | SEC_ALLOC))
3165 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3166 break;
3167 codesecsymend = i;
90e3cdf2 3168
699733f6
AM
3169 for (; i < symcount; ++i)
3170 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3171 break;
3172 secsymend = i;
90e3cdf2 3173
699733f6 3174 for (; i < symcount; ++i)
ffcfec52 3175 if (strcmp (syms[i]->section->name, ".opd") != 0)
699733f6
AM
3176 break;
3177 opdsymend = i;
90e3cdf2 3178
699733f6
AM
3179 for (; i < symcount; ++i)
3180 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3181 != (SEC_CODE | SEC_ALLOC))
3182 break;
3183 symcount = i;
3184
c9727e01 3185 count = 0;
90e3cdf2 3186
699733f6 3187 if (relocatable)
90e3cdf2 3188 {
699733f6
AM
3189 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3190 arelent *r;
3191 size_t size;
3192 long relcount;
90e3cdf2 3193
468392fb
AM
3194 if (opdsymend == secsymend)
3195 goto done;
3196
699733f6 3197 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2 3198 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
7356fed5 3199 if (relcount == 0)
c9727e01 3200 goto done;
90e3cdf2 3201
7356fed5
AM
3202 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3203 {
3204 count = -1;
3205 goto done;
3206 }
3207
699733f6 3208 size = 0;
595da8c5 3209 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
3210 {
3211 asymbol *sym;
90e3cdf2 3212
595da8c5 3213 while (r < opd->relocation + relcount
699733f6
AM
3214 && r->address < syms[i]->value + opd->vma)
3215 ++r;
90e3cdf2 3216
595da8c5 3217 if (r == opd->relocation + relcount)
699733f6 3218 break;
90e3cdf2 3219
699733f6
AM
3220 if (r->address != syms[i]->value + opd->vma)
3221 continue;
90e3cdf2 3222
699733f6
AM
3223 if (r->howto->type != R_PPC64_ADDR64)
3224 continue;
90e3cdf2 3225
699733f6
AM
3226 sym = *r->sym_ptr_ptr;
3227 if (!sym_exists_at (syms, opdsymend, symcount,
3228 sym->section->id, sym->value + r->addend))
3229 {
3230 ++count;
3231 size += sizeof (asymbol);
3232 size += strlen (syms[i]->name) + 2;
3233 }
3234 }
90e3cdf2 3235
699733f6
AM
3236 s = *ret = bfd_malloc (size);
3237 if (s == NULL)
3238 {
7356fed5 3239 count = -1;
c9727e01 3240 goto done;
699733f6 3241 }
90e3cdf2 3242
699733f6 3243 names = (char *) (s + count);
90e3cdf2 3244
595da8c5 3245 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 3246 {
699733f6 3247 asymbol *sym;
90e3cdf2 3248
595da8c5 3249 while (r < opd->relocation + relcount
699733f6
AM
3250 && r->address < syms[i]->value + opd->vma)
3251 ++r;
90e3cdf2 3252
595da8c5 3253 if (r == opd->relocation + relcount)
699733f6
AM
3254 break;
3255
3256 if (r->address != syms[i]->value + opd->vma)
3257 continue;
3258
3259 if (r->howto->type != R_PPC64_ADDR64)
3260 continue;
90e3cdf2 3261
699733f6
AM
3262 sym = *r->sym_ptr_ptr;
3263 if (!sym_exists_at (syms, opdsymend, symcount,
3264 sym->section->id, sym->value + r->addend))
3265 {
3266 size_t len;
3267
3268 *s = *syms[i];
6ba2a415 3269 s->flags |= BSF_SYNTHETIC;
699733f6
AM
3270 s->section = sym->section;
3271 s->value = sym->value + r->addend;
3272 s->name = names;
3273 *names++ = '.';
3274 len = strlen (syms[i]->name);
3275 memcpy (names, syms[i]->name, len + 1);
3276 names += len + 1;
6f610d07
UW
3277 /* Have udata.p point back to the original symbol this
3278 synthetic symbol was derived from. */
3279 s->udata.p = syms[i];
699733f6
AM
3280 s++;
3281 }
3282 }
3283 }
3284 else
90e3cdf2 3285 {
468392fb 3286 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
ee67d69a 3287 bfd_byte *contents = NULL;
699733f6 3288 size_t size;
468392fb
AM
3289 long plt_count = 0;
3290 bfd_vma glink_vma = 0, resolv_vma = 0;
3291 asection *dynamic, *glink = NULL, *relplt = NULL;
3292 arelent *p;
90e3cdf2 3293
ee67d69a 3294 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
699733f6 3295 {
ee67d69a 3296 free_contents_and_exit:
699733f6 3297 if (contents)
ee67d69a 3298 free (contents);
7356fed5 3299 count = -1;
c9727e01 3300 goto done;
699733f6 3301 }
90e3cdf2 3302
699733f6
AM
3303 size = 0;
3304 for (i = secsymend; i < opdsymend; ++i)
3305 {
3306 bfd_vma ent;
90e3cdf2 3307
5ef11c02
AM
3308 /* Ignore bogus symbols. */
3309 if (syms[i]->value > opd->size - 8)
3310 continue;
3311
699733f6
AM
3312 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3313 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3314 {
3315 ++count;
3316 size += sizeof (asymbol);
3317 size += strlen (syms[i]->name) + 2;
3318 }
3319 }
90e3cdf2 3320
468392fb 3321 /* Get start of .glink stubs from DT_PPC64_GLINK. */
066ee829
AM
3322 if (dyn_count != 0
3323 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
468392fb
AM
3324 {
3325 bfd_byte *dynbuf, *extdyn, *extdynend;
3326 size_t extdynsize;
3327 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3328
3329 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3330 goto free_contents_and_exit;
3331
3332 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3333 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3334
3335 extdyn = dynbuf;
3336 extdynend = extdyn + dynamic->size;
3337 for (; extdyn < extdynend; extdyn += extdynsize)
3338 {
3339 Elf_Internal_Dyn dyn;
3340 (*swap_dyn_in) (abfd, extdyn, &dyn);
3341
3342 if (dyn.d_tag == DT_NULL)
3343 break;
3344
3345 if (dyn.d_tag == DT_PPC64_GLINK)
3346 {
3347 /* The first glink stub starts at offset 32; see comment in
3348 ppc64_elf_finish_dynamic_sections. */
3349 glink_vma = dyn.d_un.d_val + 32;
3350 /* The .glink section usually does not survive the final
3351 link; search for the section (usually .text) where the
3352 glink stubs now reside. */
3353 glink = bfd_sections_find_if (abfd, section_covers_vma,
3354 &glink_vma);
3355 break;
3356 }
3357 }
3358
3359 free (dynbuf);
3360 }
3361
3362 if (glink != NULL)
3363 {
3364 /* Determine __glink trampoline by reading the relative branch
3365 from the first glink stub. */
3366 bfd_byte buf[4];
3367 if (bfd_get_section_contents (abfd, glink, buf,
3368 glink_vma + 4 - glink->vma, 4))
3369 {
3370 unsigned int insn = bfd_get_32 (abfd, buf);
3371 insn ^= B_DOT;
3372 if ((insn & ~0x3fffffc) == 0)
3373 resolv_vma = glink_vma + 4 + (insn ^ 0x2000000) - 0x2000000;
3374 }
3375
3376 if (resolv_vma)
3377 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
468392fb 3378
066ee829
AM
3379 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3380 if (relplt != NULL)
3381 {
3382 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3383 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3384 goto free_contents_and_exit;
68ffbac6 3385
066ee829
AM
3386 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3387 size += plt_count * sizeof (asymbol);
468392fb 3388
066ee829
AM
3389 p = relplt->relocation;
3390 for (i = 0; i < plt_count; i++, p++)
e054468f
AM
3391 {
3392 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3393 if (p->addend != 0)
3394 size += sizeof ("+0x") - 1 + 16;
3395 }
066ee829 3396 }
468392fb
AM
3397 }
3398
699733f6
AM
3399 s = *ret = bfd_malloc (size);
3400 if (s == NULL)
7356fed5 3401 goto free_contents_and_exit;
90e3cdf2 3402
468392fb 3403 names = (char *) (s + count + plt_count + (resolv_vma != 0));
90e3cdf2 3404
699733f6 3405 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 3406 {
699733f6 3407 bfd_vma ent;
90e3cdf2 3408
5ef11c02
AM
3409 if (syms[i]->value > opd->size - 8)
3410 continue;
3411
699733f6
AM
3412 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3413 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 3414 {
c9727e01 3415 long lo, hi;
699733f6 3416 size_t len;
c9727e01 3417 asection *sec = abfd->sections;
90e3cdf2 3418
699733f6
AM
3419 *s = *syms[i];
3420 lo = codesecsym;
3421 hi = codesecsymend;
3422 while (lo < hi)
3423 {
c9727e01 3424 long mid = (lo + hi) >> 1;
699733f6
AM
3425 if (syms[mid]->section->vma < ent)
3426 lo = mid + 1;
3427 else if (syms[mid]->section->vma > ent)
3428 hi = mid;
3429 else
c9727e01
AM
3430 {
3431 sec = syms[mid]->section;
3432 break;
3433 }
699733f6
AM
3434 }
3435
c9727e01 3436 if (lo >= hi && lo > codesecsym)
699733f6 3437 sec = syms[lo - 1]->section;
699733f6
AM
3438
3439 for (; sec != NULL; sec = sec->next)
3440 {
3441 if (sec->vma > ent)
3442 break;
63524580
JK
3443 /* SEC_LOAD may not be set if SEC is from a separate debug
3444 info file. */
3445 if ((sec->flags & SEC_ALLOC) == 0)
699733f6
AM
3446 break;
3447 if ((sec->flags & SEC_CODE) != 0)
3448 s->section = sec;
3449 }
6ba2a415 3450 s->flags |= BSF_SYNTHETIC;
699733f6
AM
3451 s->value = ent - s->section->vma;
3452 s->name = names;
3453 *names++ = '.';
3454 len = strlen (syms[i]->name);
3455 memcpy (names, syms[i]->name, len + 1);
3456 names += len + 1;
6f610d07
UW
3457 /* Have udata.p point back to the original symbol this
3458 synthetic symbol was derived from. */
3459 s->udata.p = syms[i];
699733f6 3460 s++;
90e3cdf2 3461 }
90e3cdf2 3462 }
699733f6 3463 free (contents);
468392fb
AM
3464
3465 if (glink != NULL && relplt != NULL)
3466 {
3467 if (resolv_vma)
3468 {
3469 /* Add a symbol for the main glink trampoline. */
86a4952b 3470 memset (s, 0, sizeof *s);
468392fb 3471 s->the_bfd = abfd;
6ba2a415 3472 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
468392fb
AM
3473 s->section = glink;
3474 s->value = resolv_vma - glink->vma;
3475 s->name = names;
3476 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3477 names += sizeof ("__glink_PLTresolve");
3478 s++;
3479 count++;
3480 }
3481
3482 /* FIXME: It would be very much nicer to put sym@plt on the
3483 stub rather than on the glink branch table entry. The
3484 objdump disassembler would then use a sensible symbol
3485 name on plt calls. The difficulty in doing so is
3486 a) finding the stubs, and,
3487 b) matching stubs against plt entries, and,
3488 c) there can be multiple stubs for a given plt entry.
3489
3490 Solving (a) could be done by code scanning, but older
3491 ppc64 binaries used different stubs to current code.
3492 (b) is the tricky one since you need to known the toc
3493 pointer for at least one function that uses a pic stub to
3494 be able to calculate the plt address referenced.
3495 (c) means gdb would need to set multiple breakpoints (or
3496 find the glink branch itself) when setting breakpoints
3497 for pending shared library loads. */
3498 p = relplt->relocation;
3499 for (i = 0; i < plt_count; i++, p++)
3500 {
3501 size_t len;
3502
3503 *s = **p->sym_ptr_ptr;
3504 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3505 we are defining a symbol, ensure one of them is set. */
3506 if ((s->flags & BSF_LOCAL) == 0)
3507 s->flags |= BSF_GLOBAL;
6ba2a415 3508 s->flags |= BSF_SYNTHETIC;
468392fb
AM
3509 s->section = glink;
3510 s->value = glink_vma - glink->vma;
3511 s->name = names;
3512 s->udata.p = NULL;
3513 len = strlen ((*p->sym_ptr_ptr)->name);
3514 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3515 names += len;
e054468f
AM
3516 if (p->addend != 0)
3517 {
3518 memcpy (names, "+0x", sizeof ("+0x") - 1);
3519 names += sizeof ("+0x") - 1;
3520 bfd_sprintf_vma (abfd, names, p->addend);
3521 names += strlen (names);
3522 }
468392fb
AM
3523 memcpy (names, "@plt", sizeof ("@plt"));
3524 names += sizeof ("@plt");
3525 s++;
3526 glink_vma += 8;
3527 if (i >= 0x8000)
3528 glink_vma += 4;
3529 }
3530 count += plt_count;
3531 }
90e3cdf2
JJ
3532 }
3533
c9727e01 3534 done:
a7535cf3 3535 free (syms);
90e3cdf2
JJ
3536 return count;
3537}
5bd4f169 3538\f
65f38f15
AM
3539/* The following functions are specific to the ELF linker, while
3540 functions above are used generally. Those named ppc64_elf_* are
3541 called by the main ELF linker code. They appear in this file more
3542 or less in the order in which they are called. eg.
3543 ppc64_elf_check_relocs is called early in the link process,
3544 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
3545 called.
3546
3547 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3548 functions have both a function code symbol and a function descriptor
3549 symbol. A call to foo in a relocatable object file looks like:
3550
3551 . .text
3552 . x:
3553 . bl .foo
3554 . nop
3555
3556 The function definition in another object file might be:
3557
3558 . .section .opd
3559 . foo: .quad .foo
3560 . .quad .TOC.@tocbase
3561 . .quad 0
3562 .
3563 . .text
3564 . .foo: blr
3565
3566 When the linker resolves the call during a static link, the branch
3567 unsurprisingly just goes to .foo and the .opd information is unused.
3568 If the function definition is in a shared library, things are a little
3569 different: The call goes via a plt call stub, the opd information gets
3570 copied to the plt, and the linker patches the nop.
3571
3572 . x:
3573 . bl .foo_stub
3574 . ld 2,40(1)
3575 .
3576 .
3577 . .foo_stub:
71a39c98
AM
3578 . std 2,40(1) # in practice, the call stub
3579 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3580 . addi 11,11,Lfoo@toc@l # this is the general idea
3581 . ld 12,0(11)
3582 . ld 2,8(11)
3583 . mtctr 12
3584 . ld 11,16(11)
e86ce104
AM
3585 . bctr
3586 .
3587 . .section .plt
3588 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3589
3590 The "reloc ()" notation is supposed to indicate that the linker emits
3591 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3592 copying.
3593
3594 What are the difficulties here? Well, firstly, the relocations
3595 examined by the linker in check_relocs are against the function code
3596 sym .foo, while the dynamic relocation in the plt is emitted against
3597 the function descriptor symbol, foo. Somewhere along the line, we need
3598 to carefully copy dynamic link information from one symbol to the other.
3599 Secondly, the generic part of the elf linker will make .foo a dynamic
3600 symbol as is normal for most other backends. We need foo dynamic
3601 instead, at least for an application final link. However, when
3602 creating a shared library containing foo, we need to have both symbols
3603 dynamic so that references to .foo are satisfied during the early
3604 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
3605 definition from some other object, eg. a static library.
3606
3607 Update: As of August 2004, we support a new convention. Function
3608 calls may use the function descriptor symbol, ie. "bl foo". This
3609 behaves exactly as "bl .foo". */
65f38f15 3610
1d483afe 3611/* Of those relocs that might be copied as dynamic relocs, this function
58ac9f71
AM
3612 selects those that must be copied when linking a shared library,
3613 even when the symbol is local. */
65f38f15 3614
1d483afe
AM
3615static int
3616must_be_dyn_reloc (struct bfd_link_info *info,
3617 enum elf_ppc64_reloc_type r_type)
3618{
3619 switch (r_type)
3620 {
3621 default:
3622 return 1;
3623
3624 case R_PPC64_REL32:
3625 case R_PPC64_REL64:
3626 case R_PPC64_REL30:
3627 return 0;
3628
3629 case R_PPC64_TPREL16:
3630 case R_PPC64_TPREL16_LO:
3631 case R_PPC64_TPREL16_HI:
3632 case R_PPC64_TPREL16_HA:
3633 case R_PPC64_TPREL16_DS:
3634 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
3635 case R_PPC64_TPREL16_HIGH:
3636 case R_PPC64_TPREL16_HIGHA:
1d483afe
AM
3637 case R_PPC64_TPREL16_HIGHER:
3638 case R_PPC64_TPREL16_HIGHERA:
3639 case R_PPC64_TPREL16_HIGHEST:
3640 case R_PPC64_TPREL16_HIGHESTA:
3641 case R_PPC64_TPREL64:
3642 return !info->executable;
3643 }
3644}
65f38f15 3645
f4656909
AM
3646/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3647 copying dynamic variables from a shared lib into an app's dynbss
3648 section, and instead use a dynamic relocation to point into the
5d35169e
AM
3649 shared lib. With code that gcc generates, it's vital that this be
3650 enabled; In the PowerPC64 ABI, the address of a function is actually
3651 the address of a function descriptor, which resides in the .opd
3652 section. gcc uses the descriptor directly rather than going via the
3653 GOT as some other ABI's do, which means that initialized function
3654 pointers must reference the descriptor. Thus, a function pointer
3655 initialized to the address of a function in a shared library will
3656 either require a copy reloc, or a dynamic reloc. Using a copy reloc
4cc11e76 3657 redefines the function descriptor symbol to point to the copy. This
5d35169e
AM
3658 presents a problem as a plt entry for that function is also
3659 initialized from the function descriptor symbol and the copy reloc
3660 may not be initialized first. */
a23b6845 3661#define ELIMINATE_COPY_RELOCS 1
f4656909 3662
721956f4 3663/* Section name for stubs is the associated section name plus this
29942be8
NC
3664 string. */
3665#define STUB_SUFFIX ".stub"
721956f4
AM
3666
3667/* Linker stubs.
3668 ppc_stub_long_branch:
3669 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3670 destination, but a 24 bit branch in a stub section will reach.
3671 . b dest
3672
3673 ppc_stub_plt_branch:
3674 Similar to the above, but a 24 bit branch in the stub section won't
3675 reach its destination.
71a39c98
AM
3676 . addis %r11,%r2,xxx@toc@ha
3677 . ld %r12,xxx@toc@l(%r11)
3678 . mtctr %r12
721956f4
AM
3679 . bctr
3680
3681 ppc_stub_plt_call:
2c66dc6c
AM
3682 Used to call a function in a shared library. If it so happens that
3683 the plt entry referenced crosses a 64k boundary, then an extra
71a39c98 3684 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
721956f4 3685 . std %r2,40(%r1)
71a39c98
AM
3686 . addis %r11,%r2,xxx@toc@ha
3687 . ld %r12,xxx+0@toc@l(%r11)
3688 . mtctr %r12
3689 . ld %r2,xxx+8@toc@l(%r11)
3690 . ld %r11,xxx+16@toc@l(%r11)
721956f4 3691 . bctr
ad8e1ba5
AM
3692
3693 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3694 code to adjust the value and save r2 to support multiple toc sections.
3695 A ppc_stub_long_branch with an r2 offset looks like:
3696 . std %r2,40(%r1)
3697 . addis %r2,%r2,off@ha
3698 . addi %r2,%r2,off@l
3699 . b dest
3700
3701 A ppc_stub_plt_branch with an r2 offset looks like:
3702 . std %r2,40(%r1)
71a39c98
AM
3703 . addis %r11,%r2,xxx@toc@ha
3704 . ld %r12,xxx@toc@l(%r11)
ad8e1ba5
AM
3705 . addis %r2,%r2,off@ha
3706 . addi %r2,%r2,off@l
71a39c98 3707 . mtctr %r12
ad8e1ba5 3708 . bctr
ac2df442
AM
3709
3710 In cases where the "addis" instruction would add zero, the "addis" is
3711 omitted and following instructions modified slightly in some cases.
721956f4
AM
3712*/
3713
3714enum ppc_stub_type {
3715 ppc_stub_none,
3716 ppc_stub_long_branch,
ad8e1ba5 3717 ppc_stub_long_branch_r2off,
721956f4 3718 ppc_stub_plt_branch,
ad8e1ba5 3719 ppc_stub_plt_branch_r2off,
794e51c0
AM
3720 ppc_stub_plt_call,
3721 ppc_stub_plt_call_r2save
721956f4
AM
3722};
3723
3724struct ppc_stub_hash_entry {
3725
3726 /* Base hash table entry structure. */
3727 struct bfd_hash_entry root;
3728
ad8e1ba5
AM
3729 enum ppc_stub_type stub_type;
3730
721956f4
AM
3731 /* The stub section. */
3732 asection *stub_sec;
3733
3734 /* Offset within stub_sec of the beginning of this stub. */
3735 bfd_vma stub_offset;
3736
3737 /* Given the symbol's value and its section we can determine its final
3738 value when building the stubs (so the stub knows where to jump. */
3739 bfd_vma target_value;
3740 asection *target_section;
3741
721956f4
AM
3742 /* The symbol table entry, if any, that this was derived from. */
3743 struct ppc_link_hash_entry *h;
e054468f 3744 struct plt_entry *plt_ent;
721956f4
AM
3745
3746 /* Where this stub is being called from, or, in the case of combined
3747 stub sections, the first input section in the group. */
3748 asection *id_sec;
3749};
3750
3751struct ppc_branch_hash_entry {
3752
3753 /* Base hash table entry structure. */
3754 struct bfd_hash_entry root;
3755
c456f082 3756 /* Offset within branch lookup table. */
721956f4
AM
3757 unsigned int offset;
3758
3759 /* Generation marker. */
3760 unsigned int iter;
3761};
65f38f15 3762
19e08130
AM
3763/* Used to track dynamic relocations for local symbols. */
3764struct ppc_dyn_relocs
3765{
3766 struct ppc_dyn_relocs *next;
3767
3768 /* The input section of the reloc. */
3769 asection *sec;
3770
3771 /* Total number of relocs copied for the input section. */
3772 unsigned int count : 31;
3773
3774 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3775 unsigned int ifunc : 1;
3776};
3777
65f38f15
AM
3778struct ppc_link_hash_entry
3779{
3780 struct elf_link_hash_entry elf;
3781
b3fac117
AM
3782 union {
3783 /* A pointer to the most recently used stub hash entry against this
3784 symbol. */
3785 struct ppc_stub_hash_entry *stub_cache;
3786
3787 /* A pointer to the next symbol starting with a '.' */
3788 struct ppc_link_hash_entry *next_dot_sym;
3789 } u;
721956f4 3790
65f38f15 3791 /* Track dynamic relocs copied for this symbol. */
6061a67d 3792 struct elf_dyn_relocs *dyn_relocs;
e86ce104 3793
721956f4 3794 /* Link between function code and descriptor symbols. */
34814b9f 3795 struct ppc_link_hash_entry *oh;
721956f4 3796
e86ce104
AM
3797 /* Flag function code and descriptor symbols. */
3798 unsigned int is_func:1;
3799 unsigned int is_func_descriptor:1;
908b32fc 3800 unsigned int fake:1;
411e1bfb 3801
c5614fa4
AM
3802 /* Whether global opd/toc sym has been adjusted or not.
3803 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3804 should be set for all globals defined in any opd/toc section. */
754021d0
AM
3805 unsigned int adjust_done:1;
3806
99877b66
AM
3807 /* Set if we twiddled this symbol to weak at some stage. */
3808 unsigned int was_undefined:1;
3809
411e1bfb 3810 /* Contexts in which symbol is used in the GOT (or TOC).
e7b938ca
AM
3811 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3812 corresponding relocs are encountered during check_relocs.
3813 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3814 indicate the corresponding GOT entry type is not needed.
3815 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3816 a TPREL one. We use a separate flag rather than setting TPREL
3817 just for convenience in distinguishing the two cases. */
3818#define TLS_GD 1 /* GD reloc. */
3819#define TLS_LD 2 /* LD reloc. */
3820#define TLS_TPREL 4 /* TPREL reloc, => IE. */
3821#define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
3822#define TLS_TLS 16 /* Any TLS reloc. */
3823#define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
3824#define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
e054468f 3825#define PLT_IFUNC 128 /* STT_GNU_IFUNC. */
f961d9dd 3826 unsigned char tls_mask;
65f38f15
AM
3827};
3828
3829/* ppc64 ELF linker hash table. */
3830
3831struct ppc_link_hash_table
3832{
3833 struct elf_link_hash_table elf;
3834
721956f4
AM
3835 /* The stub hash table. */
3836 struct bfd_hash_table stub_hash_table;
3837
3838 /* Another hash table for plt_branch stubs. */
3839 struct bfd_hash_table branch_hash_table;
3840
3b421ab3
AM
3841 /* Hash table for function prologue tocsave. */
3842 htab_t tocsave_htab;
3843
721956f4
AM
3844 /* Linker stub bfd. */
3845 bfd *stub_bfd;
3846
3847 /* Linker call-backs. */
4ce794b7
AM
3848 asection * (*add_stub_section) (const char *, asection *);
3849 void (*layout_sections_again) (void);
721956f4
AM
3850
3851 /* Array to keep track of which stub sections have been created, and
3852 information on stub grouping. */
3853 struct map_stub {
3854 /* This is the section to which stubs in the group will be attached. */
3855 asection *link_sec;
3856 /* The stub section. */
3857 asection *stub_sec;
ad8e1ba5
AM
3858 /* Along with elf_gp, specifies the TOC pointer used in this group. */
3859 bfd_vma toc_off;
721956f4
AM
3860 } *stub_group;
3861
ad8e1ba5
AM
3862 /* Temp used when calculating TOC pointers. */
3863 bfd_vma toc_curr;
bf102f86
AM
3864 bfd *toc_bfd;
3865 asection *toc_first_sec;
ad8e1ba5 3866
8f3bab57
AM
3867 /* Highest input section id. */
3868 int top_id;
3869
734b6cf9
AM
3870 /* Highest output section index. */
3871 int top_index;
3872
b3fac117
AM
3873 /* Used when adding symbols. */
3874 struct ppc_link_hash_entry *dot_syms;
3875
734b6cf9
AM
3876 /* List of input sections for each output section. */
3877 asection **input_list;
721956f4 3878
65f38f15 3879 /* Short-cuts to get to dynamic linker sections. */
4ce794b7 3880 asection *got;
4ce794b7
AM
3881 asection *plt;
3882 asection *relplt;
e054468f
AM
3883 asection *iplt;
3884 asection *reliplt;
4ce794b7
AM
3885 asection *dynbss;
3886 asection *relbss;
3887 asection *glink;
82bd7b59 3888 asection *sfpr;
4ce794b7
AM
3889 asection *brlt;
3890 asection *relbrlt;
58d180e8 3891 asection *glink_eh_frame;
ec338859 3892
8387904d
AM
3893 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3894 struct ppc_link_hash_entry *tls_get_addr;
3895 struct ppc_link_hash_entry *tls_get_addr_fd;
411e1bfb 3896
927be08e
AM
3897 /* The size of reliplt used by got entry relocs. */
3898 bfd_size_type got_reli_size;
3899
9b5ecbd0 3900 /* Statistics. */
794e51c0 3901 unsigned long stub_count[ppc_stub_plt_call_r2save];
9b5ecbd0 3902
ee75fd95
AM
3903 /* Number of stubs against global syms. */
3904 unsigned long stub_globals;
3905
794e51c0
AM
3906 /* Alignment of PLT call stubs. */
3907 unsigned int plt_stub_align:4;
3908
ee67d69a
AM
3909 /* Set if we're linking code with function descriptors. */
3910 unsigned int opd_abi:1;
3911
9df0ef5f
AM
3912 /* Set if PLT call stubs should load r11. */
3913 unsigned int plt_static_chain:1;
3914
794e51c0
AM
3915 /* Set if PLT call stubs need a read-read barrier. */
3916 unsigned int plt_thread_safe:1;
3917
ad8e1ba5 3918 /* Set if we should emit symbols for stubs. */
99877b66 3919 unsigned int emit_stub_syms:1;
ad8e1ba5 3920
a7f2871e
AM
3921 /* Set if __tls_get_addr optimization should not be done. */
3922 unsigned int no_tls_get_addr_opt:1;
3923
4c52953f 3924 /* Support for multiple toc sections. */
33c0ec9d 3925 unsigned int do_multi_toc:1;
4c52953f 3926 unsigned int multi_toc_needed:1;
927be08e 3927 unsigned int second_toc_pass:1;
67f0cbdb 3928 unsigned int do_toc_opt:1;
4c52953f 3929
5d1634d7 3930 /* Set on error. */
99877b66 3931 unsigned int stub_error:1;
721956f4 3932
7d9616d7 3933 /* Temp used by ppc64_elf_process_dot_syms. */
99877b66 3934 unsigned int twiddled_syms:1;
721956f4
AM
3935
3936 /* Incremented every time we size stubs. */
3937 unsigned int stub_iteration;
5d1634d7 3938
87d72d41
AM
3939 /* Small local sym cache. */
3940 struct sym_cache sym_cache;
65f38f15
AM
3941};
3942
4c52953f
AM
3943/* Rename some of the generic section flags to better document how they
3944 are used here. */
b0dddeec
AM
3945
3946/* Nonzero if this section has TLS related relocations. */
3947#define has_tls_reloc sec_flg0
3948
3949/* Nonzero if this section has a call to __tls_get_addr. */
3950#define has_tls_get_addr_call sec_flg1
3951
3952/* Nonzero if this section has any toc or got relocs. */
3953#define has_toc_reloc sec_flg2
3954
3955/* Nonzero if this section has a call to another section that uses
3956 the toc or got. */
d77c8a4b 3957#define makes_toc_func_call sec_flg3
b0dddeec
AM
3958
3959/* Recursion protection when determining above flag. */
d77c8a4b 3960#define call_check_in_progress sec_flg4
70cc837d 3961#define call_check_done sec_flg5
4c52953f 3962
65f38f15
AM
3963/* Get the ppc64 ELF linker hash table from a link_info structure. */
3964
3965#define ppc_hash_table(p) \
4dfe6ac6
NC
3966 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3967 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
65f38f15 3968
721956f4
AM
3969#define ppc_stub_hash_lookup(table, string, create, copy) \
3970 ((struct ppc_stub_hash_entry *) \
3971 bfd_hash_lookup ((table), (string), (create), (copy)))
3972
3973#define ppc_branch_hash_lookup(table, string, create, copy) \
3974 ((struct ppc_branch_hash_entry *) \
3975 bfd_hash_lookup ((table), (string), (create), (copy)))
3976
3977/* Create an entry in the stub hash table. */
3978
3979static struct bfd_hash_entry *
4ce794b7
AM
3980stub_hash_newfunc (struct bfd_hash_entry *entry,
3981 struct bfd_hash_table *table,
3982 const char *string)
721956f4
AM
3983{
3984 /* Allocate the structure if it has not already been allocated by a
3985 subclass. */
3986 if (entry == NULL)
3987 {
3988 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3989 if (entry == NULL)
3990 return entry;
3991 }
3992
3993 /* Call the allocation method of the superclass. */
3994 entry = bfd_hash_newfunc (entry, table, string);
3995 if (entry != NULL)
3996 {
3997 struct ppc_stub_hash_entry *eh;
3998
3999 /* Initialize the local fields. */
4000 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 4001 eh->stub_type = ppc_stub_none;
721956f4
AM
4002 eh->stub_sec = NULL;
4003 eh->stub_offset = 0;
4004 eh->target_value = 0;
4005 eh->target_section = NULL;
721956f4
AM
4006 eh->h = NULL;
4007 eh->id_sec = NULL;
4008 }
4009
4010 return entry;
4011}
4012
4013/* Create an entry in the branch hash table. */
4014
4015static struct bfd_hash_entry *
4ce794b7
AM
4016branch_hash_newfunc (struct bfd_hash_entry *entry,
4017 struct bfd_hash_table *table,
4018 const char *string)
721956f4
AM
4019{
4020 /* Allocate the structure if it has not already been allocated by a
4021 subclass. */
4022 if (entry == NULL)
4023 {
4024 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4025 if (entry == NULL)
4026 return entry;
4027 }
4028
4029 /* Call the allocation method of the superclass. */
4030 entry = bfd_hash_newfunc (entry, table, string);
4031 if (entry != NULL)
4032 {
4033 struct ppc_branch_hash_entry *eh;
4034
4035 /* Initialize the local fields. */
4036 eh = (struct ppc_branch_hash_entry *) entry;
4037 eh->offset = 0;
4038 eh->iter = 0;
4039 }
4040
4041 return entry;
4042}
4043
65f38f15
AM
4044/* Create an entry in a ppc64 ELF linker hash table. */
4045
4046static struct bfd_hash_entry *
4ce794b7
AM
4047link_hash_newfunc (struct bfd_hash_entry *entry,
4048 struct bfd_hash_table *table,
4049 const char *string)
65f38f15
AM
4050{
4051 /* Allocate the structure if it has not already been allocated by a
4052 subclass. */
4053 if (entry == NULL)
4054 {
4055 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4056 if (entry == NULL)
4057 return entry;
4058 }
4059
4060 /* Call the allocation method of the superclass. */
4061 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4062 if (entry != NULL)
4063 {
4064 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4065
b3fac117 4066 memset (&eh->u.stub_cache, 0,
908b32fc 4067 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
4068 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4069
4070 /* When making function calls, old ABI code references function entry
4071 points (dot symbols), while new ABI code references the function
4072 descriptor symbol. We need to make any combination of reference and
4073 definition work together, without breaking archive linking.
4074
4075 For a defined function "foo" and an undefined call to "bar":
4076 An old object defines "foo" and ".foo", references ".bar" (possibly
4077 "bar" too).
4078 A new object defines "foo" and references "bar".
4079
4080 A new object thus has no problem with its undefined symbols being
4081 satisfied by definitions in an old object. On the other hand, the
4082 old object won't have ".bar" satisfied by a new object.
4083
4084 Keep a list of newly added dot-symbols. */
4085
4086 if (string[0] == '.')
4087 {
4088 struct ppc_link_hash_table *htab;
4089
4090 htab = (struct ppc_link_hash_table *) table;
4091 eh->u.next_dot_sym = htab->dot_syms;
4092 htab->dot_syms = eh;
4093 }
65f38f15
AM
4094 }
4095
4096 return entry;
4097}
4098
3b421ab3
AM
4099struct tocsave_entry {
4100 asection *sec;
4101 bfd_vma offset;
4102};
4103
4104static hashval_t
4105tocsave_htab_hash (const void *p)
4106{
4107 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4108 return ((bfd_vma)(intptr_t) e->sec ^ e->offset) >> 3;
4109}
4110
4111static int
4112tocsave_htab_eq (const void *p1, const void *p2)
4113{
4114 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4115 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4116 return e1->sec == e2->sec && e1->offset == e2->offset;
4117}
4118
65f38f15
AM
4119/* Create a ppc64 ELF linker hash table. */
4120
4121static struct bfd_link_hash_table *
4ce794b7 4122ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
4123{
4124 struct ppc_link_hash_table *htab;
4125 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4126
4ce794b7 4127 htab = bfd_zmalloc (amt);
65f38f15
AM
4128 if (htab == NULL)
4129 return NULL;
4130
66eb6687 4131 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
4132 sizeof (struct ppc_link_hash_entry),
4133 PPC64_ELF_DATA))
65f38f15 4134 {
e2d34d7d 4135 free (htab);
65f38f15
AM
4136 return NULL;
4137 }
4138
721956f4 4139 /* Init the stub hash table too. */
66eb6687
AM
4140 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4141 sizeof (struct ppc_stub_hash_entry)))
721956f4
AM
4142 return NULL;
4143
4144 /* And the branch hash table. */
66eb6687
AM
4145 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4146 sizeof (struct ppc_branch_hash_entry)))
721956f4
AM
4147 return NULL;
4148
3b421ab3
AM
4149 htab->tocsave_htab = htab_try_create (1024,
4150 tocsave_htab_hash,
4151 tocsave_htab_eq,
4152 NULL);
4153 if (htab->tocsave_htab == NULL)
4154 return NULL;
4155
3254fd24
AM
4156 /* Initializing two fields of the union is just cosmetic. We really
4157 only care about glist, but when compiled on a 32-bit host the
4158 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4159 debugger inspection of these fields look nicer. */
a6aa5195
AM
4160 htab->elf.init_got_refcount.refcount = 0;
4161 htab->elf.init_got_refcount.glist = NULL;
4162 htab->elf.init_plt_refcount.refcount = 0;
4163 htab->elf.init_plt_refcount.glist = NULL;
4164 htab->elf.init_got_offset.offset = 0;
4165 htab->elf.init_got_offset.glist = NULL;
4166 htab->elf.init_plt_offset.offset = 0;
4167 htab->elf.init_plt_offset.glist = NULL;
3254fd24 4168
65f38f15
AM
4169 return &htab->elf.root;
4170}
4171
721956f4
AM
4172/* Free the derived linker hash table. */
4173
4174static void
4ce794b7 4175ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
721956f4 4176{
3b421ab3 4177 struct ppc_link_hash_table *htab = (struct ppc_link_hash_table *) hash;
721956f4 4178
3b421ab3
AM
4179 bfd_hash_table_free (&htab->stub_hash_table);
4180 bfd_hash_table_free (&htab->branch_hash_table);
4181 if (htab->tocsave_htab)
4182 htab_delete (htab->tocsave_htab);
9f7c3e5e 4183 _bfd_elf_link_hash_table_free (hash);
721956f4
AM
4184}
4185
bfeb4a28
AM
4186/* Create sections for linker generated code. */
4187
4188static bfd_boolean
4189create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4190{
4191 struct ppc_link_hash_table *htab;
4192 flagword flags;
4193
4194 htab = ppc_hash_table (info);
4195
4196 /* Create .sfpr for code to save and restore fp regs. */
4197 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4198 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4199 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4200 flags);
4201 if (htab->sfpr == NULL
4202 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4203 return FALSE;
4204
4205 /* Create .glink for lazy dynamic linking support. */
4206 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4207 flags);
4208 if (htab->glink == NULL
4209 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4210 return FALSE;
4211
4212 if (!info->no_ld_generated_unwind_info)
4213 {
4214 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4215 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4216 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4217 ".eh_frame",
4218 flags);
4219 if (htab->glink_eh_frame == NULL
4220 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4221 return FALSE;
4222 }
4223
4224 flags = SEC_ALLOC | SEC_LINKER_CREATED;
4225 htab->iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4226 if (htab->iplt == NULL
4227 || ! bfd_set_section_alignment (dynobj, htab->iplt, 3))
4228 return FALSE;
4229
4230 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4231 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4232 htab->reliplt = bfd_make_section_anyway_with_flags (dynobj,
4233 ".rela.iplt",
4234 flags);
4235 if (htab->reliplt == NULL
4236 || ! bfd_set_section_alignment (dynobj, htab->reliplt, 3))
4237 return FALSE;
4238
4239 /* Create branch lookup table for plt_branch stubs. */
4240 flags = (SEC_ALLOC | SEC_LOAD
4241 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4242 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4243 flags);
4244 if (htab->brlt == NULL
4245 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4246 return FALSE;
4247
4248 if (!info->shared)
4249 return TRUE;
4250
4251 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4252 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4253 htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4254 ".rela.branch_lt",
4255 flags);
4256 if (htab->relbrlt == NULL
4257 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4258 return FALSE;
4259
4260 return TRUE;
4261}
4262
e717da7e
AM
4263/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4264
bfeb4a28 4265bfd_boolean
e717da7e
AM
4266ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
4267{
4268 struct ppc_link_hash_table *htab;
4269
4270 elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
4271
4272/* Always hook our dynamic sections into the first bfd, which is the
4273 linker created stub bfd. This ensures that the GOT header is at
4274 the start of the output TOC section. */
4275 htab = ppc_hash_table (info);
4dfe6ac6 4276 if (htab == NULL)
bfeb4a28 4277 return FALSE;
e717da7e
AM
4278 htab->stub_bfd = abfd;
4279 htab->elf.dynobj = abfd;
bfeb4a28
AM
4280
4281 if (info->relocatable)
4282 return TRUE;
4283
4284 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
4285}
4286
721956f4
AM
4287/* Build a name for an entry in the stub hash table. */
4288
4289static char *
4ce794b7
AM
4290ppc_stub_name (const asection *input_section,
4291 const asection *sym_sec,
4292 const struct ppc_link_hash_entry *h,
4293 const Elf_Internal_Rela *rel)
721956f4
AM
4294{
4295 char *stub_name;
bcaa2f82 4296 ssize_t len;
721956f4
AM
4297
4298 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4299 offsets from a sym as a branch target? In fact, we could
4300 probably assume the addend is always zero. */
4301 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4302
4303 if (h)
4304 {
4305 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4306 stub_name = bfd_malloc (len);
46de2a7c
AM
4307 if (stub_name == NULL)
4308 return stub_name;
4309
bcaa2f82
AM
4310 len = sprintf (stub_name, "%08x.%s+%x",
4311 input_section->id & 0xffffffff,
4312 h->elf.root.root.string,
4313 (int) rel->r_addend & 0xffffffff);
721956f4
AM
4314 }
4315 else
4316 {
ad8e1ba5 4317 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 4318 stub_name = bfd_malloc (len);
46de2a7c
AM
4319 if (stub_name == NULL)
4320 return stub_name;
4321
bcaa2f82
AM
4322 len = sprintf (stub_name, "%08x.%x:%x+%x",
4323 input_section->id & 0xffffffff,
4324 sym_sec->id & 0xffffffff,
4325 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4326 (int) rel->r_addend & 0xffffffff);
721956f4 4327 }
bcaa2f82 4328 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 4329 stub_name[len - 2] = 0;
721956f4
AM
4330 return stub_name;
4331}
4332
4333/* Look up an entry in the stub hash. Stub entries are cached because
4334 creating the stub name takes a bit of time. */
4335
4336static struct ppc_stub_hash_entry *
4ce794b7
AM
4337ppc_get_stub_entry (const asection *input_section,
4338 const asection *sym_sec,
039b3fef 4339 struct ppc_link_hash_entry *h,
4ce794b7
AM
4340 const Elf_Internal_Rela *rel,
4341 struct ppc_link_hash_table *htab)
721956f4
AM
4342{
4343 struct ppc_stub_hash_entry *stub_entry;
721956f4
AM
4344 const asection *id_sec;
4345
4346 /* If this input section is part of a group of sections sharing one
4347 stub section, then use the id of the first section in the group.
4348 Stub names need to include a section id, as there may well be
4349 more than one stub used to reach say, printf, and we need to
4350 distinguish between them. */
4351 id_sec = htab->stub_group[input_section->id].link_sec;
4352
b3fac117
AM
4353 if (h != NULL && h->u.stub_cache != NULL
4354 && h->u.stub_cache->h == h
4355 && h->u.stub_cache->id_sec == id_sec)
721956f4 4356 {
b3fac117 4357 stub_entry = h->u.stub_cache;
721956f4
AM
4358 }
4359 else
4360 {
4361 char *stub_name;
4362
4363 stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
4364 if (stub_name == NULL)
4365 return NULL;
4366
4367 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 4368 stub_name, FALSE, FALSE);
721956f4 4369 if (h != NULL)
b3fac117 4370 h->u.stub_cache = stub_entry;
721956f4
AM
4371
4372 free (stub_name);
4373 }
4374
4375 return stub_entry;
4376}
4377
4378/* Add a new stub entry to the stub hash. Not all fields of the new
4379 stub entry are initialised. */
4380
4381static struct ppc_stub_hash_entry *
4ce794b7
AM
4382ppc_add_stub (const char *stub_name,
4383 asection *section,
25f53a85 4384 struct bfd_link_info *info)
721956f4 4385{
25f53a85 4386 struct ppc_link_hash_table *htab = ppc_hash_table (info);
721956f4
AM
4387 asection *link_sec;
4388 asection *stub_sec;
4389 struct ppc_stub_hash_entry *stub_entry;
4390
4391 link_sec = htab->stub_group[section->id].link_sec;
4392 stub_sec = htab->stub_group[section->id].stub_sec;
4393 if (stub_sec == NULL)
4394 {
4395 stub_sec = htab->stub_group[link_sec->id].stub_sec;
4396 if (stub_sec == NULL)
4397 {
d4c88bbb 4398 size_t namelen;
721956f4
AM
4399 bfd_size_type len;
4400 char *s_name;
4401
d4c88bbb
AM
4402 namelen = strlen (link_sec->name);
4403 len = namelen + sizeof (STUB_SUFFIX);
721956f4
AM
4404 s_name = bfd_alloc (htab->stub_bfd, len);
4405 if (s_name == NULL)
4406 return NULL;
4407
d4c88bbb
AM
4408 memcpy (s_name, link_sec->name, namelen);
4409 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
721956f4
AM
4410 stub_sec = (*htab->add_stub_section) (s_name, link_sec);
4411 if (stub_sec == NULL)
4412 return NULL;
4413 htab->stub_group[link_sec->id].stub_sec = stub_sec;
4414 }
4415 htab->stub_group[section->id].stub_sec = stub_sec;
4416 }
4417
4418 /* Enter this entry into the linker stub hash table. */
4419 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 4420 TRUE, FALSE);
721956f4
AM
4421 if (stub_entry == NULL)
4422 {
8de848d8 4423 info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
25f53a85 4424 section->owner, stub_name);
721956f4
AM
4425 return NULL;
4426 }
4427
4428 stub_entry->stub_sec = stub_sec;
4429 stub_entry->stub_offset = 0;
4430 stub_entry->id_sec = link_sec;
4431 return stub_entry;
4432}
4433
e717da7e
AM
4434/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4435 not already done. */
65f38f15 4436
b34976b6 4437static bfd_boolean
e717da7e 4438create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 4439{
e717da7e
AM
4440 asection *got, *relgot;
4441 flagword flags;
4442 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 4443
0c8d6e5c 4444 if (!is_ppc64_elf (abfd))
0ffa91dd 4445 return FALSE;
4dfe6ac6
NC
4446 if (htab == NULL)
4447 return FALSE;
0ffa91dd 4448
4ce794b7 4449 if (!htab->got)
e717da7e
AM
4450 {
4451 if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
4452 return FALSE;
4453
3d4d4302 4454 htab->got = bfd_get_linker_section (htab->elf.dynobj, ".got");
e717da7e
AM
4455 if (!htab->got)
4456 abort ();
4457 }
4458
4459 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4460 | SEC_LINKER_CREATED);
4461
c456f082 4462 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 4463 if (!got
e717da7e
AM
4464 || !bfd_set_section_alignment (abfd, got, 3))
4465 return FALSE;
65f38f15 4466
c456f082
AM
4467 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4468 flags | SEC_READONLY);
e717da7e 4469 if (!relgot
e717da7e 4470 || ! bfd_set_section_alignment (abfd, relgot, 3))
b34976b6 4471 return FALSE;
e717da7e
AM
4472
4473 ppc64_elf_tdata (abfd)->got = got;
4474 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 4475 return TRUE;
65f38f15 4476}
5bd4f169 4477
82bd7b59 4478/* Create the dynamic sections, and set up shortcuts. */
5bd4f169 4479
b34976b6 4480static bfd_boolean
4ce794b7 4481ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
5bd4f169 4482{
65f38f15 4483 struct ppc_link_hash_table *htab;
5bd4f169 4484
65f38f15 4485 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
b34976b6 4486 return FALSE;
65f38f15 4487
e717da7e 4488 htab = ppc_hash_table (info);
4dfe6ac6
NC
4489 if (htab == NULL)
4490 return FALSE;
4491
e717da7e 4492 if (!htab->got)
3d4d4302
AM
4493 htab->got = bfd_get_linker_section (dynobj, ".got");
4494 htab->plt = bfd_get_linker_section (dynobj, ".plt");
4495 htab->relplt = bfd_get_linker_section (dynobj, ".rela.plt");
4496 htab->dynbss = bfd_get_linker_section (dynobj, ".dynbss");
65f38f15 4497 if (!info->shared)
3d4d4302 4498 htab->relbss = bfd_get_linker_section (dynobj, ".rela.bss");
65f38f15 4499
e717da7e 4500 if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
4ce794b7 4501 || (!info->shared && !htab->relbss))
65f38f15
AM
4502 abort ();
4503
b34976b6 4504 return TRUE;
5bd4f169
AM
4505}
4506
b31867b6
AM
4507/* Follow indirect and warning symbol links. */
4508
4509static inline struct bfd_link_hash_entry *
4510follow_link (struct bfd_link_hash_entry *h)
4511{
4512 while (h->type == bfd_link_hash_indirect
4513 || h->type == bfd_link_hash_warning)
4514 h = h->u.i.link;
4515 return h;
4516}
4517
4518static inline struct elf_link_hash_entry *
4519elf_follow_link (struct elf_link_hash_entry *h)
4520{
4521 return (struct elf_link_hash_entry *) follow_link (&h->root);
4522}
4523
4524static inline struct ppc_link_hash_entry *
4525ppc_follow_link (struct ppc_link_hash_entry *h)
4526{
4527 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4528}
4529
40d16e0b
AM
4530/* Merge PLT info on FROM with that on TO. */
4531
4532static void
4533move_plt_plist (struct ppc_link_hash_entry *from,
4534 struct ppc_link_hash_entry *to)
4535{
4536 if (from->elf.plt.plist != NULL)
4537 {
4538 if (to->elf.plt.plist != NULL)
4539 {
4540 struct plt_entry **entp;
4541 struct plt_entry *ent;
4542
4543 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4544 {
4545 struct plt_entry *dent;
4546
4547 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4548 if (dent->addend == ent->addend)
4549 {
4550 dent->plt.refcount += ent->plt.refcount;
4551 *entp = ent->next;
4552 break;
4553 }
4554 if (dent == NULL)
4555 entp = &ent->next;
4556 }
4557 *entp = to->elf.plt.plist;
4558 }
4559
4560 to->elf.plt.plist = from->elf.plt.plist;
4561 from->elf.plt.plist = NULL;
4562 }
4563}
4564
65f38f15
AM
4565/* Copy the extra info we tack onto an elf_link_hash_entry. */
4566
4567static void
fcfa13d2
AM
4568ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4569 struct elf_link_hash_entry *dir,
4570 struct elf_link_hash_entry *ind)
65f38f15
AM
4571{
4572 struct ppc_link_hash_entry *edir, *eind;
4573
4574 edir = (struct ppc_link_hash_entry *) dir;
4575 eind = (struct ppc_link_hash_entry *) ind;
4576
c79d6685
AM
4577 edir->is_func |= eind->is_func;
4578 edir->is_func_descriptor |= eind->is_func_descriptor;
4579 edir->tls_mask |= eind->tls_mask;
4580 if (eind->oh != NULL)
4581 edir->oh = ppc_follow_link (eind->oh);
4582
4583 /* If called to transfer flags for a weakdef during processing
4584 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4585 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
4586 if (!(ELIMINATE_COPY_RELOCS
4587 && eind->elf.root.type != bfd_link_hash_indirect
4588 && edir->elf.dynamic_adjusted))
4589 edir->elf.non_got_ref |= eind->elf.non_got_ref;
4590
4591 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4592 edir->elf.ref_regular |= eind->elf.ref_regular;
4593 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4594 edir->elf.needs_plt |= eind->elf.needs_plt;
4595
411e1bfb 4596 /* Copy over any dynamic relocs we may have on the indirect sym. */
bbd7ec4a 4597 if (eind->dyn_relocs != NULL)
65f38f15 4598 {
bbd7ec4a
AM
4599 if (edir->dyn_relocs != NULL)
4600 {
6061a67d
AM
4601 struct elf_dyn_relocs **pp;
4602 struct elf_dyn_relocs *p;
bbd7ec4a 4603
fcfa13d2 4604 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a
AM
4605 list. Merge any entries against the same section. */
4606 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4607 {
6061a67d 4608 struct elf_dyn_relocs *q;
bbd7ec4a
AM
4609
4610 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4611 if (q->sec == p->sec)
4612 {
4613 q->pc_count += p->pc_count;
4614 q->count += p->count;
4615 *pp = p->next;
4616 break;
4617 }
4618 if (q == NULL)
4619 pp = &p->next;
4620 }
4621 *pp = edir->dyn_relocs;
4622 }
4623
65f38f15
AM
4624 edir->dyn_relocs = eind->dyn_relocs;
4625 eind->dyn_relocs = NULL;
4626 }
65f38f15 4627
68ba6d40
AM
4628 /* If we were called to copy over info for a weak sym, that's all.
4629 You might think dyn_relocs need not be copied over; After all,
4630 both syms will be dynamic or both non-dynamic so we're just
68ffbac6 4631 moving reloc accounting around. However, ELIMINATE_COPY_RELOCS
68ba6d40
AM
4632 code in ppc64_elf_adjust_dynamic_symbol needs to check for
4633 dyn_relocs in read-only sections, and it does so on what is the
4634 DIR sym here. */
4635 if (eind->elf.root.type != bfd_link_hash_indirect)
4636 return;
4637
81848ca0
AM
4638 /* Copy over got entries that we may have already seen to the
4639 symbol which just became indirect. */
411e1bfb
AM
4640 if (eind->elf.got.glist != NULL)
4641 {
4642 if (edir->elf.got.glist != NULL)
4643 {
4644 struct got_entry **entp;
4645 struct got_entry *ent;
4646
4647 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4648 {
4649 struct got_entry *dent;
4650
4651 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4652 if (dent->addend == ent->addend
e717da7e 4653 && dent->owner == ent->owner
411e1bfb
AM
4654 && dent->tls_type == ent->tls_type)
4655 {
4656 dent->got.refcount += ent->got.refcount;
4657 *entp = ent->next;
4658 break;
4659 }
4660 if (dent == NULL)
4661 entp = &ent->next;
4662 }
4663 *entp = edir->elf.got.glist;
4664 }
4665
4666 edir->elf.got.glist = eind->elf.got.glist;
4667 eind->elf.got.glist = NULL;
4668 }
4669
4670 /* And plt entries. */
40d16e0b 4671 move_plt_plist (eind, edir);
411e1bfb 4672
fcfa13d2 4673 if (eind->elf.dynindx != -1)
411e1bfb 4674 {
fcfa13d2
AM
4675 if (edir->elf.dynindx != -1)
4676 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4677 edir->elf.dynstr_index);
411e1bfb
AM
4678 edir->elf.dynindx = eind->elf.dynindx;
4679 edir->elf.dynstr_index = eind->elf.dynstr_index;
4680 eind->elf.dynindx = -1;
4681 eind->elf.dynstr_index = 0;
4682 }
411e1bfb
AM
4683}
4684
8387904d
AM
4685/* Find the function descriptor hash entry from the given function code
4686 hash entry FH. Link the entries via their OH fields. */
4687
4688static struct ppc_link_hash_entry *
b31867b6 4689lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
4690{
4691 struct ppc_link_hash_entry *fdh = fh->oh;
4692
4693 if (fdh == NULL)
4694 {
4695 const char *fd_name = fh->elf.root.root.string + 1;
4696
4697 fdh = (struct ppc_link_hash_entry *)
4698 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
b31867b6
AM
4699 if (fdh == NULL)
4700 return fdh;
4701
4702 fdh->is_func_descriptor = 1;
4703 fdh->oh = fh;
4704 fh->is_func = 1;
4705 fh->oh = fdh;
8387904d
AM
4706 }
4707
b31867b6 4708 return ppc_follow_link (fdh);
8387904d
AM
4709}
4710
bb700d78
AM
4711/* Make a fake function descriptor sym for the code sym FH. */
4712
4713static struct ppc_link_hash_entry *
4714make_fdh (struct bfd_link_info *info,
908b32fc 4715 struct ppc_link_hash_entry *fh)
bb700d78
AM
4716{
4717 bfd *abfd;
4718 asymbol *newsym;
4719 struct bfd_link_hash_entry *bh;
4720 struct ppc_link_hash_entry *fdh;
4721
4722 abfd = fh->elf.root.u.undef.abfd;
4723 newsym = bfd_make_empty_symbol (abfd);
4724 newsym->name = fh->elf.root.root.string + 1;
4725 newsym->section = bfd_und_section_ptr;
4726 newsym->value = 0;
908b32fc 4727 newsym->flags = BSF_WEAK;
bb700d78
AM
4728
4729 bh = NULL;
4730 if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
4731 newsym->flags, newsym->section,
4732 newsym->value, NULL, FALSE, FALSE,
4733 &bh))
4734 return NULL;
4735
4736 fdh = (struct ppc_link_hash_entry *) bh;
4737 fdh->elf.non_elf = 0;
908b32fc
AM
4738 fdh->fake = 1;
4739 fdh->is_func_descriptor = 1;
4740 fdh->oh = fh;
4741 fh->is_func = 1;
4742 fh->oh = fdh;
bb700d78
AM
4743 return fdh;
4744}
4745
8387904d
AM
4746/* Fix function descriptor symbols defined in .opd sections to be
4747 function type. */
555cd476
AM
4748
4749static bfd_boolean
c16153ae 4750ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 4751 struct bfd_link_info *info,
555cd476 4752 Elf_Internal_Sym *isym,
b3fac117 4753 const char **name ATTRIBUTE_UNUSED,
555cd476
AM
4754 flagword *flags ATTRIBUTE_UNUSED,
4755 asection **sec,
4756 bfd_vma *value ATTRIBUTE_UNUSED)
4757{
f64b2e8d
NC
4758 if ((ibfd->flags & DYNAMIC) == 0
4759 && ELF_ST_BIND (isym->st_info) == STB_GNU_UNIQUE)
4760 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4761
e054468f 4762 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
c16153ae
L
4763 {
4764 if ((ibfd->flags & DYNAMIC) == 0)
f64b2e8d 4765 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
c16153ae 4766 }
e054468f
AM
4767 else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC)
4768 ;
4769 else if (*sec != NULL
70cc837d 4770 && strcmp ((*sec)->name, ".opd") == 0)
555cd476 4771 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
433817dd 4772
555cd476
AM
4773 return TRUE;
4774}
4775
8387904d 4776/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
4777 inclusion of a new ABI object archive that defines "bar".
4778 NAME is a symbol defined in an archive. Return a symbol in the hash
4779 table that might be satisfied by the archive symbols. */
8387904d
AM
4780
4781static struct elf_link_hash_entry *
4782ppc64_elf_archive_symbol_lookup (bfd *abfd,
4783 struct bfd_link_info *info,
4784 const char *name)
4785{
4786 struct elf_link_hash_entry *h;
4787 char *dot_name;
4788 size_t len;
4789
4790 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
4791 if (h != NULL
4792 /* Don't return this sym if it is a fake function descriptor
4793 created by add_symbol_adjust. */
4794 && !(h->root.type == bfd_link_hash_undefweak
4795 && ((struct ppc_link_hash_entry *) h)->fake))
8387904d
AM
4796 return h;
4797
4798 if (name[0] == '.')
4799 return h;
4800
4801 len = strlen (name);
4802 dot_name = bfd_alloc (abfd, len + 2);
4803 if (dot_name == NULL)
4804 return (struct elf_link_hash_entry *) 0 - 1;
4805 dot_name[0] = '.';
4806 memcpy (dot_name + 1, name, len + 1);
4807 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4808 bfd_release (abfd, dot_name);
4809 return h;
4810}
4811
4812/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
4813 new ABI object defines "bar". Well, at least, undefined dot symbols
4814 are made weak. This stops later archive searches from including an
4815 object if we already have a function descriptor definition. It also
35b0ce59
AM
4816 prevents the linker complaining about undefined symbols.
4817 We also check and correct mismatched symbol visibility here. The
4818 most restrictive visibility of the function descriptor and the
4819 function entry symbol is used. */
8387904d
AM
4820
4821static bfd_boolean
b3fac117 4822add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 4823{
8387904d
AM
4824 struct ppc_link_hash_table *htab;
4825 struct ppc_link_hash_entry *fdh;
4826
b3fac117 4827 if (eh->elf.root.type == bfd_link_hash_indirect)
8387904d
AM
4828 return TRUE;
4829
b3fac117
AM
4830 if (eh->elf.root.type == bfd_link_hash_warning)
4831 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 4832
b3fac117
AM
4833 if (eh->elf.root.root.string[0] != '.')
4834 abort ();
8387904d 4835
b3fac117 4836 htab = ppc_hash_table (info);
4dfe6ac6
NC
4837 if (htab == NULL)
4838 return FALSE;
4839
b31867b6
AM
4840 fdh = lookup_fdh (eh, htab);
4841 if (fdh == NULL)
4842 {
4843 if (!info->relocatable
4844 && (eh->elf.root.type == bfd_link_hash_undefined
4845 || eh->elf.root.type == bfd_link_hash_undefweak)
4846 && eh->elf.ref_regular)
4847 {
4848 /* Make an undefweak function descriptor sym, which is enough to
4849 pull in an --as-needed shared lib, but won't cause link
4850 errors. Archives are handled elsewhere. */
4851 fdh = make_fdh (info, eh);
4852 if (fdh == NULL)
4853 return FALSE;
4854 fdh->elf.ref_regular = 1;
4855 }
bb700d78 4856 }
b31867b6 4857 else
8387904d 4858 {
35b0ce59
AM
4859 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4860 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4861 if (entry_vis < descr_vis)
4862 fdh->elf.other += entry_vis - descr_vis;
4863 else if (entry_vis > descr_vis)
4864 eh->elf.other += descr_vis - entry_vis;
4865
e87d886e
AM
4866 if ((fdh->elf.root.type == bfd_link_hash_defined
4867 || fdh->elf.root.type == bfd_link_hash_defweak)
4868 && eh->elf.root.type == bfd_link_hash_undefined)
35b0ce59
AM
4869 {
4870 eh->elf.root.type = bfd_link_hash_undefweak;
4871 eh->was_undefined = 1;
4872 htab->twiddled_syms = 1;
4873 }
8387904d 4874 }
99877b66 4875
8387904d
AM
4876 return TRUE;
4877}
4878
b3fac117
AM
4879/* Process list of dot-symbols we made in link_hash_newfunc. */
4880
8387904d 4881static bfd_boolean
7d9616d7 4882ppc64_elf_process_dot_syms (bfd *ibfd, struct bfd_link_info *info)
8387904d 4883{
99877b66 4884 struct ppc_link_hash_table *htab;
b3fac117 4885 struct ppc_link_hash_entry **p, *eh;
433817dd 4886
0c8d6e5c 4887 if (!is_ppc64_elf (info->output_bfd))
35b0ce59 4888 return TRUE;
4dfe6ac6
NC
4889 htab = ppc_hash_table (info);
4890 if (htab == NULL)
4891 return FALSE;
35b0ce59 4892
0c8d6e5c 4893 if (is_ppc64_elf (ibfd))
b3fac117
AM
4894 {
4895 p = &htab->dot_syms;
4896 while ((eh = *p) != NULL)
4897 {
4898 *p = NULL;
1c865ab2
AM
4899 if (&eh->elf == htab->elf.hgot)
4900 ;
4901 else if (htab->elf.hgot == NULL
4902 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4903 htab->elf.hgot = &eh->elf;
4904 else if (!add_symbol_adjust (eh, info))
b3fac117
AM
4905 return FALSE;
4906 p = &eh->u.next_dot_sym;
4907 }
4908 }
4909
4910 /* Clear the list for non-ppc64 input files. */
4911 p = &htab->dot_syms;
4912 while ((eh = *p) != NULL)
4913 {
4914 *p = NULL;
4915 p = &eh->u.next_dot_sym;
4916 }
99877b66
AM
4917
4918 /* We need to fix the undefs list for any syms we have twiddled to
4919 undef_weak. */
4920 if (htab->twiddled_syms)
4921 {
77cfaee6 4922 bfd_link_repair_undef_list (&htab->elf.root);
99877b66
AM
4923 htab->twiddled_syms = 0;
4924 }
b3fac117 4925 return TRUE;
8387904d
AM
4926}
4927
97fed1c9
JJ
4928/* Undo hash table changes when an --as-needed input file is determined
4929 not to be needed. */
4930
4931static bfd_boolean
e5034e59
AM
4932ppc64_elf_notice_as_needed (bfd *ibfd,
4933 struct bfd_link_info *info,
4934 enum notice_asneeded_action act)
97fed1c9 4935{
e5034e59
AM
4936 if (act == notice_not_needed)
4937 {
4938 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 4939
e5034e59
AM
4940 if (htab == NULL)
4941 return FALSE;
4dfe6ac6 4942
e5034e59
AM
4943 htab->dot_syms = NULL;
4944 }
4945 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
4946}
4947
aa374f67
AM
4948/* If --just-symbols against a final linked binary, then assume we need
4949 toc adjusting stubs when calling functions defined there. */
4950
4951static void
4952ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4953{
4954 if ((sec->flags & SEC_CODE) != 0
4955 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4956 && is_ppc64_elf (sec->owner))
4957 {
4958 asection *got = bfd_get_section_by_name (sec->owner, ".got");
4959 if (got != NULL
4960 && got->size >= elf_backend_got_header_size
4961 && bfd_get_section_by_name (sec->owner, ".opd") != NULL)
4962 sec->has_toc_reloc = 1;
4963 }
4964 _bfd_elf_link_just_syms (sec, info);
4965}
4966
e054468f 4967static struct plt_entry **
4ce794b7
AM
4968update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4969 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
4970{
4971 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 4972 struct plt_entry **local_plt;
f961d9dd 4973 unsigned char *local_got_tls_masks;
411e1bfb
AM
4974
4975 if (local_got_ents == NULL)
4976 {
4977 bfd_size_type size = symtab_hdr->sh_info;
4978
e054468f
AM
4979 size *= (sizeof (*local_got_ents)
4980 + sizeof (*local_plt)
4981 + sizeof (*local_got_tls_masks));
4ce794b7 4982 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 4983 if (local_got_ents == NULL)
e054468f 4984 return NULL;
411e1bfb
AM
4985 elf_local_got_ents (abfd) = local_got_ents;
4986 }
4987
e054468f 4988 if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
411e1bfb
AM
4989 {
4990 struct got_entry *ent;
4991
4992 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
4993 if (ent->addend == r_addend
4994 && ent->owner == abfd
4995 && ent->tls_type == tls_type)
411e1bfb
AM
4996 break;
4997 if (ent == NULL)
4998 {
4999 bfd_size_type amt = sizeof (*ent);
4ce794b7 5000 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
5001 if (ent == NULL)
5002 return FALSE;
5003 ent->next = local_got_ents[r_symndx];
5004 ent->addend = r_addend;
e717da7e 5005 ent->owner = abfd;
411e1bfb 5006 ent->tls_type = tls_type;
927be08e 5007 ent->is_indirect = FALSE;
411e1bfb
AM
5008 ent->got.refcount = 0;
5009 local_got_ents[r_symndx] = ent;
5010 }
5011 ent->got.refcount += 1;
5012 }
5013
e054468f 5014 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 5015 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
e7b938ca 5016 local_got_tls_masks[r_symndx] |= tls_type;
e054468f
AM
5017
5018 return local_plt + r_symndx;
65f38f15
AM
5019}
5020
411e1bfb 5021static bfd_boolean
e054468f 5022update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 5023{
411e1bfb 5024 struct plt_entry *ent;
1e2f5b6e 5025
e054468f 5026 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
5027 if (ent->addend == addend)
5028 break;
5029 if (ent == NULL)
1e2f5b6e 5030 {
411e1bfb 5031 bfd_size_type amt = sizeof (*ent);
4ce794b7 5032 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
5033 if (ent == NULL)
5034 return FALSE;
e054468f 5035 ent->next = *plist;
411e1bfb
AM
5036 ent->addend = addend;
5037 ent->plt.refcount = 0;
e054468f 5038 *plist = ent;
1e2f5b6e 5039 }
411e1bfb 5040 ent->plt.refcount += 1;
b34976b6 5041 return TRUE;
1e2f5b6e
AM
5042}
5043
e054468f
AM
5044static bfd_boolean
5045is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5046{
5047 return (r_type == R_PPC64_REL24
5048 || r_type == R_PPC64_REL14
5049 || r_type == R_PPC64_REL14_BRTAKEN
5050 || r_type == R_PPC64_REL14_BRNTAKEN
5051 || r_type == R_PPC64_ADDR24
5052 || r_type == R_PPC64_ADDR14
5053 || r_type == R_PPC64_ADDR14_BRTAKEN
5054 || r_type == R_PPC64_ADDR14_BRNTAKEN);
5055}
5056
5bd4f169 5057/* Look through the relocs for a section during the first phase, and
65f38f15 5058 calculate needed space in the global offset table, procedure
5d1634d7 5059 linkage table, and dynamic reloc sections. */
5bd4f169 5060
b34976b6 5061static bfd_boolean
4ce794b7
AM
5062ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5063 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 5064{
65f38f15 5065 struct ppc_link_hash_table *htab;
5bd4f169 5066 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 5067 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
5068 const Elf_Internal_Rela *rel;
5069 const Elf_Internal_Rela *rel_end;
5bd4f169 5070 asection *sreloc;
1e2f5b6e 5071 asection **opd_sym_map;
3a71aa26 5072 struct elf_link_hash_entry *tga, *dottga;
5bd4f169 5073
1049f94e 5074 if (info->relocatable)
b34976b6 5075 return TRUE;
5bd4f169 5076
680a3378
AM
5077 /* Don't do anything special with non-loaded, non-alloced sections.
5078 In particular, any relocs in such sections should not affect GOT
5079 and PLT reference counting (ie. we don't allow them to create GOT
5080 or PLT entries), there's no possibility or desire to optimize TLS
5081 relocs, and there's not much point in propagating relocs to shared
5082 libs that the dynamic linker won't relocate. */
5083 if ((sec->flags & SEC_ALLOC) == 0)
5084 return TRUE;
5085
0c8d6e5c 5086 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 5087
65f38f15 5088 htab = ppc_hash_table (info);
4dfe6ac6
NC
5089 if (htab == NULL)
5090 return FALSE;
5091
3a71aa26
AM
5092 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5093 FALSE, FALSE, TRUE);
5094 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5095 FALSE, FALSE, TRUE);
0ffa91dd 5096 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 5097 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 5098 sreloc = NULL;
1e2f5b6e 5099 opd_sym_map = NULL;
70cc837d 5100 if (strcmp (sec->name, ".opd") == 0)
1e2f5b6e
AM
5101 {
5102 /* Garbage collection needs some extra help with .opd sections.
5103 We don't want to necessarily keep everything referenced by
5104 relocs in .opd, as that would keep all functions. Instead,
5105 if we reference an .opd symbol (a function descriptor), we
5106 want to keep the function code symbol's section. This is
5107 easy for global symbols, but for local syms we need to keep
74f0fb50 5108 information about the associated function section. */
1e2f5b6e
AM
5109 bfd_size_type amt;
5110
ee67d69a
AM
5111 if (abiversion (abfd) == 0)
5112 set_abiversion (abfd, 1);
5113 else if (abiversion (abfd) == 2)
5114 {
5115 info->callbacks->einfo (_("%P: .opd not allowed in ABI version %d\n"),
5116 abiversion (abfd));
5117 bfd_set_error (bfd_error_bad_value);
5118 return FALSE;
5119 }
74f0fb50 5120 amt = sec->size * sizeof (*opd_sym_map) / 8;
4ce794b7 5121 opd_sym_map = bfd_zalloc (abfd, amt);
1e2f5b6e 5122 if (opd_sym_map == NULL)
b34976b6 5123 return FALSE;
74f0fb50 5124 ppc64_elf_section_data (sec)->u.opd.func_sec = opd_sym_map;
7c8fe5c4
AM
5125 BFD_ASSERT (ppc64_elf_section_data (sec)->sec_type == sec_normal);
5126 ppc64_elf_section_data (sec)->sec_type = sec_opd;
1e2f5b6e 5127 }
5bd4f169
AM
5128
5129 rel_end = relocs + sec->reloc_count;
5130 for (rel = relocs; rel < rel_end; rel++)
5131 {
5132 unsigned long r_symndx;
5133 struct elf_link_hash_entry *h;
04c9666a 5134 enum elf_ppc64_reloc_type r_type;
727fc41e 5135 int tls_type;
7c8fe5c4 5136 struct _ppc64_elf_section_data *ppc64_sec;
e054468f 5137 struct plt_entry **ifunc;
5bd4f169
AM
5138
5139 r_symndx = ELF64_R_SYM (rel->r_info);
5140 if (r_symndx < symtab_hdr->sh_info)
5141 h = NULL;
5142 else
973a3492
L
5143 {
5144 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 5145 h = elf_follow_link (h);
81fbe831
AM
5146
5147 /* PR15323, ref flags aren't set for references in the same
5148 object. */
5149 h->root.non_ir_ref = 1;
1c865ab2
AM
5150
5151 if (h == htab->elf.hgot)
5152 sec->has_toc_reloc = 1;
973a3492 5153 }
5bd4f169 5154
727fc41e 5155 tls_type = 0;
e054468f 5156 ifunc = NULL;
25f23106
AM
5157 if (h != NULL)
5158 {
5159 if (h->type == STT_GNU_IFUNC)
5160 {
5161 h->needs_plt = 1;
5162 ifunc = &h->plt.plist;
5163 }
5164 }
5165 else
5166 {
5167 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5168 abfd, r_symndx);
5169 if (isym == NULL)
5170 return FALSE;
5171
5172 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5173 {
5174 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5175 rel->r_addend, PLT_IFUNC);
5176 if (ifunc == NULL)
5177 return FALSE;
5178 }
5179 }
4ce794b7 5180 r_type = ELF64_R_TYPE (rel->r_info);
e054468f
AM
5181 if (is_branch_reloc (r_type))
5182 {
5183 if (h != NULL && (h == tga || h == dottga))
5184 {
5185 if (rel != relocs
5186 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5187 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5188 /* We have a new-style __tls_get_addr call with a marker
5189 reloc. */
5190 ;
5191 else
5192 /* Mark this section as having an old-style call. */
5193 sec->has_tls_get_addr_call = 1;
5194 }
727fc41e 5195
e054468f 5196 /* STT_GNU_IFUNC symbols must have a PLT entry. */
e054468f
AM
5197 if (ifunc != NULL
5198 && !update_plt_info (abfd, ifunc, rel->r_addend))
5199 return FALSE;
5200 }
727fc41e 5201
a33d1f77 5202 switch (r_type)
5bd4f169 5203 {
727fc41e
AM
5204 case R_PPC64_TLSGD:
5205 case R_PPC64_TLSLD:
5206 /* These special tls relocs tie a call to __tls_get_addr with
5207 its parameter symbol. */
5208 break;
5209
411e1bfb
AM
5210 case R_PPC64_GOT_TLSLD16:
5211 case R_PPC64_GOT_TLSLD16_LO:
5212 case R_PPC64_GOT_TLSLD16_HI:
5213 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 5214 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
5215 goto dogottls;
5216
5217 case R_PPC64_GOT_TLSGD16:
5218 case R_PPC64_GOT_TLSGD16_LO:
5219 case R_PPC64_GOT_TLSGD16_HI:
5220 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 5221 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
5222 goto dogottls;
5223
5224 case R_PPC64_GOT_TPREL16_DS:
5225 case R_PPC64_GOT_TPREL16_LO_DS:
5226 case R_PPC64_GOT_TPREL16_HI:
5227 case R_PPC64_GOT_TPREL16_HA:
1d483afe 5228 if (!info->executable)
411e1bfb
AM
5229 info->flags |= DF_STATIC_TLS;
5230 tls_type = TLS_TLS | TLS_TPREL;
5231 goto dogottls;
5232
5233 case R_PPC64_GOT_DTPREL16_DS:
5234 case R_PPC64_GOT_DTPREL16_LO_DS:
5235 case R_PPC64_GOT_DTPREL16_HI:
5236 case R_PPC64_GOT_DTPREL16_HA:
5237 tls_type = TLS_TLS | TLS_DTPREL;
5238 dogottls:
5239 sec->has_tls_reloc = 1;
5240 /* Fall thru */
5241
5bd4f169 5242 case R_PPC64_GOT16:
5bd4f169 5243 case R_PPC64_GOT16_DS:
65f38f15
AM
5244 case R_PPC64_GOT16_HA:
5245 case R_PPC64_GOT16_HI:
5246 case R_PPC64_GOT16_LO:
5bd4f169 5247 case R_PPC64_GOT16_LO_DS:
65f38f15 5248 /* This symbol requires a global offset table entry. */
4c52953f 5249 sec->has_toc_reloc = 1;
33c0ec9d
AM
5250 if (r_type == R_PPC64_GOT_TLSLD16
5251 || r_type == R_PPC64_GOT_TLSGD16
5252 || r_type == R_PPC64_GOT_TPREL16_DS
5253 || r_type == R_PPC64_GOT_DTPREL16_DS
5254 || r_type == R_PPC64_GOT16
5255 || r_type == R_PPC64_GOT16_DS)
5256 {
5257 htab->do_multi_toc = 1;
d77c8a4b 5258 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
5259 }
5260
e717da7e
AM
5261 if (ppc64_elf_tdata (abfd)->got == NULL
5262 && !create_got_section (abfd, info))
b34976b6 5263 return FALSE;
5bd4f169
AM
5264
5265 if (h != NULL)
5266 {
411e1bfb
AM
5267 struct ppc_link_hash_entry *eh;
5268 struct got_entry *ent;
65f38f15 5269
411e1bfb
AM
5270 eh = (struct ppc_link_hash_entry *) h;
5271 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5272 if (ent->addend == rel->r_addend
e717da7e 5273 && ent->owner == abfd
411e1bfb
AM
5274 && ent->tls_type == tls_type)
5275 break;
5276 if (ent == NULL)
5bd4f169 5277 {
411e1bfb 5278 bfd_size_type amt = sizeof (*ent);
4ce794b7 5279 ent = bfd_alloc (abfd, amt);
411e1bfb 5280 if (ent == NULL)
b34976b6 5281 return FALSE;
411e1bfb
AM
5282 ent->next = eh->elf.got.glist;
5283 ent->addend = rel->r_addend;
e717da7e 5284 ent->owner = abfd;
411e1bfb 5285 ent->tls_type = tls_type;
927be08e 5286 ent->is_indirect = FALSE;
411e1bfb
AM
5287 ent->got.refcount = 0;
5288 eh->elf.got.glist = ent;
5bd4f169 5289 }
411e1bfb 5290 ent->got.refcount += 1;
e7b938ca 5291 eh->tls_mask |= tls_type;
5bd4f169 5292 }
411e1bfb
AM
5293 else
5294 /* This is a global offset table entry for a local symbol. */
5295 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5296 rel->r_addend, tls_type))
5297 return FALSE;
5bd4f169
AM
5298 break;
5299
5bd4f169 5300 case R_PPC64_PLT16_HA:
65f38f15
AM
5301 case R_PPC64_PLT16_HI:
5302 case R_PPC64_PLT16_LO:
5303 case R_PPC64_PLT32:
5304 case R_PPC64_PLT64:
5bd4f169 5305 /* This symbol requires a procedure linkage table entry. We
3fad3c7c
AM
5306 actually build the entry in adjust_dynamic_symbol,
5307 because this might be a case of linking PIC code without
5308 linking in any dynamic objects, in which case we don't
5309 need to generate a procedure linkage table after all. */
5bd4f169
AM
5310 if (h == NULL)
5311 {
5312 /* It does not make sense to have a procedure linkage
3fad3c7c 5313 table entry for a local symbol. */
5bd4f169 5314 bfd_set_error (bfd_error_bad_value);
b34976b6 5315 return FALSE;
5bd4f169 5316 }
411e1bfb 5317 else
e054468f
AM
5318 {
5319 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5320 return FALSE;
5321 h->needs_plt = 1;
5322 if (h->root.root.string[0] == '.'
5323 && h->root.root.string[1] != '\0')
5324 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5325 }
5bd4f169
AM
5326 break;
5327
5328 /* The following relocations don't need to propagate the
5329 relocation if linking a shared object since they are
5330 section relative. */
5331 case R_PPC64_SECTOFF:
5332 case R_PPC64_SECTOFF_LO:
5333 case R_PPC64_SECTOFF_HI:
5334 case R_PPC64_SECTOFF_HA:
5335 case R_PPC64_SECTOFF_DS:
5336 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
5337 case R_PPC64_DTPREL16:
5338 case R_PPC64_DTPREL16_LO:
5339 case R_PPC64_DTPREL16_HI:
5340 case R_PPC64_DTPREL16_HA:
5341 case R_PPC64_DTPREL16_DS:
5342 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
5343 case R_PPC64_DTPREL16_HIGH:
5344 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
5345 case R_PPC64_DTPREL16_HIGHER:
5346 case R_PPC64_DTPREL16_HIGHERA:
5347 case R_PPC64_DTPREL16_HIGHEST:
5348 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
5349 break;
5350
ad8e1ba5 5351 /* Nor do these. */
25f23106
AM
5352 case R_PPC64_REL16:
5353 case R_PPC64_REL16_LO:
5354 case R_PPC64_REL16_HI:
5355 case R_PPC64_REL16_HA:
5356 break;
5357
ad8e1ba5 5358 case R_PPC64_TOC16:
33c0ec9d
AM
5359 case R_PPC64_TOC16_DS:
5360 htab->do_multi_toc = 1;
d77c8a4b 5361 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
ad8e1ba5
AM
5362 case R_PPC64_TOC16_LO:
5363 case R_PPC64_TOC16_HI:
5364 case R_PPC64_TOC16_HA:
ad8e1ba5 5365 case R_PPC64_TOC16_LO_DS:
4c52953f 5366 sec->has_toc_reloc = 1;
ad8e1ba5
AM
5367 break;
5368
5bd4f169
AM
5369 /* This relocation describes the C++ object vtable hierarchy.
5370 Reconstruct it for later use during GC. */
5371 case R_PPC64_GNU_VTINHERIT:
c152c796 5372 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 5373 return FALSE;
5bd4f169
AM
5374 break;
5375
5376 /* This relocation describes which C++ vtable entries are actually
5377 used. Record for later use during GC. */
5378 case R_PPC64_GNU_VTENTRY:
d17e0c6e
JB
5379 BFD_ASSERT (h != NULL);
5380 if (h != NULL
5381 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 5382 return FALSE;
5bd4f169
AM
5383 break;
5384
721956f4
AM
5385 case R_PPC64_REL14:
5386 case R_PPC64_REL14_BRTAKEN:
5387 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
5388 {
5389 asection *dest = NULL;
5390
5391 /* Heuristic: If jumping outside our section, chances are
5392 we are going to need a stub. */
5393 if (h != NULL)
5394 {
5395 /* If the sym is weak it may be overridden later, so
5396 don't assume we know where a weak sym lives. */
5397 if (h->root.type == bfd_link_hash_defined)
5398 dest = h->root.u.def.section;
5399 }
5400 else
87d72d41
AM
5401 {
5402 Elf_Internal_Sym *isym;
5403
5404 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5405 abfd, r_symndx);
5406 if (isym == NULL)
5407 return FALSE;
5408
5409 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5410 }
5411
220c76dd 5412 if (dest != sec)
7c8fe5c4 5413 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 5414 }
721956f4
AM
5415 /* Fall through. */
5416
5d1634d7 5417 case R_PPC64_REL24:
e054468f 5418 if (h != NULL && ifunc == NULL)
5d1634d7
AM
5419 {
5420 /* We may need a .plt entry if the function this reloc
5421 refers to is in a shared lib. */
e054468f 5422 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
411e1bfb 5423 return FALSE;
e054468f
AM
5424 h->needs_plt = 1;
5425 if (h->root.root.string[0] == '.'
5426 && h->root.root.string[1] != '\0')
5427 ((struct ppc_link_hash_entry *) h)->is_func = 1;
3a71aa26 5428 if (h == tga || h == dottga)
411e1bfb 5429 sec->has_tls_reloc = 1;
411e1bfb
AM
5430 }
5431 break;
5432
5433 case R_PPC64_TPREL64:
5434 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
1d483afe 5435 if (!info->executable)
411e1bfb
AM
5436 info->flags |= DF_STATIC_TLS;
5437 goto dotlstoc;
5438
5439 case R_PPC64_DTPMOD64:
5440 if (rel + 1 < rel_end
5441 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5442 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 5443 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 5444 else
951fd09b 5445 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
5446 goto dotlstoc;
5447
5448 case R_PPC64_DTPREL64:
5449 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5450 if (rel != relocs
5451 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5452 && rel[-1].r_offset == rel->r_offset - 8)
5453 /* This is the second reloc of a dtpmod, dtprel pair.
5454 Don't mark with TLS_DTPREL. */
5455 goto dodyn;
5456
5457 dotlstoc:
5458 sec->has_tls_reloc = 1;
5459 if (h != NULL)
5460 {
5461 struct ppc_link_hash_entry *eh;
5462 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 5463 eh->tls_mask |= tls_type;
411e1bfb
AM
5464 }
5465 else
5466 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5467 rel->r_addend, tls_type))
5468 return FALSE;
5469
7c8fe5c4
AM
5470 ppc64_sec = ppc64_elf_section_data (sec);
5471 if (ppc64_sec->sec_type != sec_toc)
411e1bfb 5472 {
3a71aa26
AM
5473 bfd_size_type amt;
5474
e7b938ca 5475 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5476 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5477 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5478 if (ppc64_sec->u.toc.symndx == NULL)
5479 return FALSE;
5480 amt = sec->size * sizeof (bfd_vma) / 8;
5481 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5482 if (ppc64_sec->u.toc.add == NULL)
411e1bfb 5483 return FALSE;
7c8fe5c4
AM
5484 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5485 ppc64_sec->sec_type = sec_toc;
411e1bfb
AM
5486 }
5487 BFD_ASSERT (rel->r_offset % 8 == 0);
3a71aa26
AM
5488 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5489 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5490
5491 /* Mark the second slot of a GD or LD entry.
5492 -1 to indicate GD and -2 to indicate LD. */
5493 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5494 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5495 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5496 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5497 goto dodyn;
5498
5499 case R_PPC64_TPREL16:
5500 case R_PPC64_TPREL16_LO:
5501 case R_PPC64_TPREL16_HI:
5502 case R_PPC64_TPREL16_HA:
5503 case R_PPC64_TPREL16_DS:
5504 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
5505 case R_PPC64_TPREL16_HIGH:
5506 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5507 case R_PPC64_TPREL16_HIGHER:
5508 case R_PPC64_TPREL16_HIGHERA:
5509 case R_PPC64_TPREL16_HIGHEST:
5510 case R_PPC64_TPREL16_HIGHESTA:
5511 if (info->shared)
5512 {
1d483afe
AM
5513 if (!info->executable)
5514 info->flags |= DF_STATIC_TLS;
411e1bfb 5515 goto dodyn;
5d1634d7
AM
5516 }
5517 break;
5518
e86ce104 5519 case R_PPC64_ADDR64:
1e2f5b6e 5520 if (opd_sym_map != NULL
1e2f5b6e 5521 && rel + 1 < rel_end
4ce794b7 5522 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 5523 {
8387904d
AM
5524 if (h != NULL)
5525 {
5526 if (h->root.root.string[0] == '.'
5527 && h->root.root.string[1] != 0
b31867b6 5528 && lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
8387904d
AM
5529 ;
5530 else
5531 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5532 }
5533 else
5534 {
5535 asection *s;
87d72d41 5536 Elf_Internal_Sym *isym;
1e2f5b6e 5537
87d72d41
AM
5538 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5539 abfd, r_symndx);
5540 if (isym == NULL)
8387904d 5541 return FALSE;
87d72d41
AM
5542
5543 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5544 if (s != NULL && s != sec)
3f764659 5545 opd_sym_map[rel->r_offset / 8] = s;
8387904d 5546 }
1e2f5b6e 5547 }
e86ce104
AM
5548 /* Fall through. */
5549
04c9666a 5550 case R_PPC64_REL30:
5bd4f169 5551 case R_PPC64_REL32:
04c9666a 5552 case R_PPC64_REL64:
65f38f15
AM
5553 case R_PPC64_ADDR14:
5554 case R_PPC64_ADDR14_BRNTAKEN:
5555 case R_PPC64_ADDR14_BRTAKEN:
5556 case R_PPC64_ADDR16:
5557 case R_PPC64_ADDR16_DS:
5558 case R_PPC64_ADDR16_HA:
5559 case R_PPC64_ADDR16_HI:
f9c6b907
AM
5560 case R_PPC64_ADDR16_HIGH:
5561 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
5562 case R_PPC64_ADDR16_HIGHER:
5563 case R_PPC64_ADDR16_HIGHERA:
5564 case R_PPC64_ADDR16_HIGHEST:
5565 case R_PPC64_ADDR16_HIGHESTA:
5566 case R_PPC64_ADDR16_LO:
5567 case R_PPC64_ADDR16_LO_DS:
5568 case R_PPC64_ADDR24:
65f38f15 5569 case R_PPC64_ADDR32:
65f38f15
AM
5570 case R_PPC64_UADDR16:
5571 case R_PPC64_UADDR32:
5572 case R_PPC64_UADDR64:
5bd4f169 5573 case R_PPC64_TOC:
81848ca0
AM
5574 if (h != NULL && !info->shared)
5575 /* We may need a copy reloc. */
f5385ebf 5576 h->non_got_ref = 1;
81848ca0 5577
41bd81ab 5578 /* Don't propagate .opd relocs. */
1e2f5b6e 5579 if (NO_OPD_RELOCS && opd_sym_map != NULL)
e86ce104 5580 break;
e86ce104 5581
65f38f15
AM
5582 /* If we are creating a shared library, and this is a reloc
5583 against a global symbol, or a non PC relative reloc
5584 against a local symbol, then we need to copy the reloc
5585 into the shared library. However, if we are linking with
5586 -Bsymbolic, we do not need to copy a reloc against a
5587 global symbol which is defined in an object we are
5588 including in the link (i.e., DEF_REGULAR is set). At
5589 this point we have not seen all the input files, so it is
5590 possible that DEF_REGULAR is not set now but will be set
5591 later (it is never cleared). In case of a weak definition,
5592 DEF_REGULAR may be cleared later by a strong definition in
5593 a shared library. We account for that possibility below by
f4656909 5594 storing information in the dyn_relocs field of the hash
65f38f15
AM
5595 table entry. A similar situation occurs when creating
5596 shared libraries and symbol visibility changes render the
5597 symbol local.
5598
5599 If on the other hand, we are creating an executable, we
5600 may need to keep relocations for symbols satisfied by a
5601 dynamic library if we manage to avoid copy relocs for the
5602 symbol. */
411e1bfb 5603 dodyn:
65f38f15 5604 if ((info->shared
1d483afe 5605 && (must_be_dyn_reloc (info, r_type)
65f38f15 5606 || (h != NULL
198f1157 5607 && (!SYMBOLIC_BIND (info, h)
65f38f15 5608 || h->root.type == bfd_link_hash_defweak
f5385ebf 5609 || !h->def_regular))))
f4656909
AM
5610 || (ELIMINATE_COPY_RELOCS
5611 && !info->shared
65f38f15
AM
5612 && h != NULL
5613 && (h->root.type == bfd_link_hash_defweak
25f23106
AM
5614 || !h->def_regular))
5615 || (!info->shared
5616 && ifunc != NULL))
5bd4f169 5617 {
65f38f15
AM
5618 /* We must copy these reloc types into the output file.
5619 Create a reloc section in dynobj and make room for
5620 this reloc. */
5bd4f169
AM
5621 if (sreloc == NULL)
5622 {
83bac4b0
NC
5623 sreloc = _bfd_elf_make_dynamic_reloc_section
5624 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
65f38f15 5625
5bd4f169 5626 if (sreloc == NULL)
83bac4b0 5627 return FALSE;
5bd4f169
AM
5628 }
5629
65f38f15
AM
5630 /* If this is a global symbol, we count the number of
5631 relocations we need for this symbol. */
5632 if (h != NULL)
5633 {
19e08130
AM
5634 struct elf_dyn_relocs *p;
5635 struct elf_dyn_relocs **head;
5636
ec338859 5637 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
19e08130
AM
5638 p = *head;
5639 if (p == NULL || p->sec != sec)
5640 {
5641 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5642 if (p == NULL)
5643 return FALSE;
5644 p->next = *head;
5645 *head = p;
5646 p->sec = sec;
5647 p->count = 0;
5648 p->pc_count = 0;
5649 }
5650 p->count += 1;
5651 if (!must_be_dyn_reloc (info, r_type))
5652 p->pc_count += 1;
65f38f15
AM
5653 }
5654 else
5655 {
ec338859
AM
5656 /* Track dynamic relocs needed for local syms too.
5657 We really need local syms available to do this
5658 easily. Oh well. */
19e08130
AM
5659 struct ppc_dyn_relocs *p;
5660 struct ppc_dyn_relocs **head;
5661 bfd_boolean is_ifunc;
ec338859 5662 asection *s;
6edfbbad 5663 void *vpp;
87d72d41 5664 Elf_Internal_Sym *isym;
6edfbbad 5665
87d72d41
AM
5666 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5667 abfd, r_symndx);
5668 if (isym == NULL)
b34976b6 5669 return FALSE;
ec338859 5670
87d72d41
AM
5671 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5672 if (s == NULL)
5673 s = sec;
5674
6edfbbad 5675 vpp = &elf_section_data (s)->local_dynrel;
19e08130
AM
5676 head = (struct ppc_dyn_relocs **) vpp;
5677 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5678 p = *head;
5679 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5680 p = p->next;
5681 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5682 {
5683 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5684 if (p == NULL)
5685 return FALSE;
5686 p->next = *head;
5687 *head = p;
5688 p->sec = sec;
5689 p->ifunc = is_ifunc;
5690 p->count = 0;
5691 }
5692 p->count += 1;
ec338859 5693 }
65f38f15 5694 }
5bd4f169 5695 break;
65f38f15
AM
5696
5697 default:
96e0dda4 5698 break;
5bd4f169
AM
5699 }
5700 }
5701
b34976b6 5702 return TRUE;
5bd4f169
AM
5703}
5704
ee67d69a
AM
5705/* Merge backend specific data from an object file to the output
5706 object file when linking. */
5707
5708static bfd_boolean
5709ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
5710{
5711 unsigned long iflags, oflags;
5712
5713 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5714 return TRUE;
5715
5716 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5717 return TRUE;
5718
5719 if (!_bfd_generic_verify_endian_match (ibfd, obfd))
5720 return FALSE;
5721
5722 iflags = elf_elfheader (ibfd)->e_flags;
5723 oflags = elf_elfheader (obfd)->e_flags;
5724
5725 if (!elf_flags_init (obfd) || oflags == 0)
5726 {
5727 elf_flags_init (obfd) = TRUE;
5728 elf_elfheader (obfd)->e_flags = iflags;
5729 }
5730 else if (iflags == oflags || iflags == 0)
5731 ;
5732 else if (iflags & ~EF_PPC64_ABI)
5733 {
5734 (*_bfd_error_handler)
5735 (_("%B uses unknown e_flags 0x%lx"), ibfd, iflags);
5736 bfd_set_error (bfd_error_bad_value);
5737 return FALSE;
5738 }
5739 else
5740 {
5741 (*_bfd_error_handler)
5742 (_("%B: ABI version %ld is not compatible with ABI version %ld output"),
5743 ibfd, iflags, oflags);
5744 bfd_set_error (bfd_error_bad_value);
5745 return FALSE;
5746 }
5747
5748 /* Merge Tag_compatibility attributes and any common GNU ones. */
5749 _bfd_elf_merge_object_attributes (ibfd, obfd);
5750
5751 return TRUE;
5752}
5753
5754static bfd_boolean
5755ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5756{
5757 /* Print normal ELF private data. */
5758 _bfd_elf_print_private_bfd_data (abfd, ptr);
5759
5760 if (elf_elfheader (abfd)->e_flags != 0)
5761 {
5762 FILE *file = ptr;
5763
5764 /* xgettext:c-format */
5765 fprintf (file, _("private flags = 0x%lx:"),
5766 elf_elfheader (abfd)->e_flags);
5767
5768 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5769 fprintf (file, _(" [abiv%ld]"),
5770 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5771 fputc ('\n', file);
5772 }
5773
5774 return TRUE;
5775}
5776
8387904d
AM
5777/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
5778 of the code entry point, and its section. */
5779
5780static bfd_vma
5781opd_entry_value (asection *opd_sec,
5782 bfd_vma offset,
5783 asection **code_sec,
aef36ac1
AM
5784 bfd_vma *code_off,
5785 bfd_boolean in_code_sec)
8387904d
AM
5786{
5787 bfd *opd_bfd = opd_sec->owner;
8860955f 5788 Elf_Internal_Rela *relocs;
8387904d 5789 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 5790 bfd_vma val;
8387904d 5791
9f296da3
AM
5792 /* No relocs implies we are linking a --just-symbols object, or looking
5793 at a final linked executable with addr2line or somesuch. */
4b85d634
AM
5794 if (opd_sec->reloc_count == 0)
5795 {
729eabd5 5796 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
3b36f7e6 5797
729eabd5
AM
5798 if (contents == NULL)
5799 {
5800 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5801 return (bfd_vma) -1;
5802 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5803 }
ee1e4ede 5804
729eabd5 5805 val = bfd_get_64 (opd_bfd, contents + offset);
aef36ac1
AM
5806 if (code_sec != NULL)
5807 {
5808 asection *sec, *likely = NULL;
ee1e4ede 5809
aef36ac1 5810 if (in_code_sec)
4b85d634 5811 {
aef36ac1
AM
5812 sec = *code_sec;
5813 if (sec->vma <= val
5814 && val < sec->vma + sec->size)
5815 likely = sec;
5816 else
5817 val = -1;
5818 }
5819 else
5820 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5821 if (sec->vma <= val
5822 && (sec->flags & SEC_LOAD) != 0
5823 && (sec->flags & SEC_ALLOC) != 0)
5824 likely = sec;
5825 if (likely != NULL)
5826 {
5827 *code_sec = likely;
5828 if (code_off != NULL)
5829 *code_off = val - likely->vma;
4b85d634
AM
5830 }
5831 }
aef36ac1 5832 return val;
4b85d634
AM
5833 }
5834
0c8d6e5c 5835 BFD_ASSERT (is_ppc64_elf (opd_bfd));
0ffa91dd 5836
729eabd5 5837 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
8860955f
AM
5838 if (relocs == NULL)
5839 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
645ea6a9 5840
8387904d 5841 /* Go find the opd reloc at the sym address. */
8860955f 5842 lo = relocs;
8387904d
AM
5843 BFD_ASSERT (lo != NULL);
5844 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 5845 val = (bfd_vma) -1;
8387904d
AM
5846 while (lo < hi)
5847 {
5848 look = lo + (hi - lo) / 2;
5849 if (look->r_offset < offset)
5850 lo = look + 1;
5851 else if (look->r_offset > offset)
5852 hi = look;
5853 else
5854 {
0ffa91dd
NC
5855 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5856
8387904d
AM
5857 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5858 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5859 {
5860 unsigned long symndx = ELF64_R_SYM (look->r_info);
8387904d
AM
5861 asection *sec;
5862
62599110
AM
5863 if (symndx < symtab_hdr->sh_info
5864 || elf_sym_hashes (opd_bfd) == NULL)
8387904d
AM
5865 {
5866 Elf_Internal_Sym *sym;
5867
5868 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5869 if (sym == NULL)
5870 {
62599110
AM
5871 size_t symcnt = symtab_hdr->sh_info;
5872 if (elf_sym_hashes (opd_bfd) == NULL)
5873 symcnt = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
5874 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, symcnt,
8387904d
AM
5875 0, NULL, NULL, NULL);
5876 if (sym == NULL)
645ea6a9 5877 break;
8387904d
AM
5878 symtab_hdr->contents = (bfd_byte *) sym;
5879 }
5880
5881 sym += symndx;
5882 val = sym->st_value;
cb33740c 5883 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
8387904d
AM
5884 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5885 }
5886 else
5887 {
5888 struct elf_link_hash_entry **sym_hashes;
5889 struct elf_link_hash_entry *rh;
5890
5891 sym_hashes = elf_sym_hashes (opd_bfd);
5892 rh = sym_hashes[symndx - symtab_hdr->sh_info];
128205bb
AM
5893 if (rh != NULL)
5894 {
5895 rh = elf_follow_link (rh);
5896 BFD_ASSERT (rh->root.type == bfd_link_hash_defined
5897 || rh->root.type == bfd_link_hash_defweak);
5898 val = rh->root.u.def.value;
5899 sec = rh->root.u.def.section;
5900 }
5901 else
5902 {
5903 /* Handle the odd case where we can be called
5904 during bfd_elf_link_add_symbols before the
5905 symbol hashes have been fully populated. */
5906 Elf_Internal_Sym *sym;
5907
5908 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, 1,
5909 symndx, NULL, NULL, NULL);
5910 if (sym == NULL)
5911 break;
5912
5913 val = sym->st_value;
5914 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5915 free (sym);
5916 }
8387904d
AM
5917 }
5918 val += look->r_addend;
5919 if (code_off != NULL)
5920 *code_off = val;
5921 if (code_sec != NULL)
aef36ac1
AM
5922 {
5923 if (in_code_sec && *code_sec != sec)
5924 return -1;
5925 else
5926 *code_sec = sec;
5927 }
8387904d
AM
5928 if (sec != NULL && sec->output_section != NULL)
5929 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
5930 }
5931 break;
5932 }
5933 }
645ea6a9 5934
645ea6a9 5935 return val;
8387904d
AM
5936}
5937
aef36ac1
AM
5938/* If the ELF symbol SYM might be a function in SEC, return the
5939 function size and set *CODE_OFF to the function's entry point,
5940 otherwise return zero. */
9f296da3 5941
aef36ac1
AM
5942static bfd_size_type
5943ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
5944 bfd_vma *code_off)
9f296da3 5945{
aef36ac1
AM
5946 bfd_size_type size;
5947
5948 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
5949 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
5950 return 0;
5951
5952 size = 0;
5953 if (!(sym->flags & BSF_SYNTHETIC))
5954 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
5955
5956 if (strcmp (sym->section->name, ".opd") == 0)
9f296da3 5957 {
aef36ac1
AM
5958 if (opd_entry_value (sym->section, sym->value,
5959 &sec, code_off, TRUE) == (bfd_vma) -1)
5960 return 0;
5961 /* An old ABI binary with dot-syms has a size of 24 on the .opd
5962 symbol. This size has nothing to do with the code size of the
5963 function, which is what we're supposed to return, but the
5964 code size isn't available without looking up the dot-sym.
5965 However, doing that would be a waste of time particularly
5966 since elf_find_function will look at the dot-sym anyway.
5967 Now, elf_find_function will keep the largest size of any
5968 function sym found at the code address of interest, so return
5969 1 here to avoid it incorrectly caching a larger function size
5970 for a small function. This does mean we return the wrong
5971 size for a new-ABI function of size 24, but all that does is
5972 disable caching for such functions. */
5973 if (size == 24)
5974 size = 1;
9f296da3 5975 }
aef36ac1
AM
5976 else
5977 {
5978 if (sym->section != sec)
5979 return 0;
5980 *code_off = sym->value;
5981 }
5982 if (size == 0)
5983 size = 1;
5984 return size;
9f296da3
AM
5985}
5986
854b41e7
AM
5987/* Return true if symbol is defined in a regular object file. */
5988
5989static bfd_boolean
5990is_static_defined (struct elf_link_hash_entry *h)
5991{
5992 return ((h->root.type == bfd_link_hash_defined
5993 || h->root.type == bfd_link_hash_defweak)
5994 && h->root.u.def.section != NULL
5995 && h->root.u.def.section->output_section != NULL);
5996}
5997
b31867b6
AM
5998/* If FDH is a function descriptor symbol, return the associated code
5999 entry symbol if it is defined. Return NULL otherwise. */
6000
6001static struct ppc_link_hash_entry *
6002defined_code_entry (struct ppc_link_hash_entry *fdh)
6003{
6004 if (fdh->is_func_descriptor)
6005 {
6006 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6007 if (fh->elf.root.type == bfd_link_hash_defined
6008 || fh->elf.root.type == bfd_link_hash_defweak)
6009 return fh;
6010 }
6011 return NULL;
6012}
6013
6014/* If FH is a function code entry symbol, return the associated
6015 function descriptor symbol if it is defined. Return NULL otherwise. */
6016
6017static struct ppc_link_hash_entry *
6018defined_func_desc (struct ppc_link_hash_entry *fh)
6019{
6020 if (fh->oh != NULL
6021 && fh->oh->is_func_descriptor)
6022 {
6023 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6024 if (fdh->elf.root.type == bfd_link_hash_defined
6025 || fdh->elf.root.type == bfd_link_hash_defweak)
6026 return fdh;
6027 }
6028 return NULL;
6029}
6030
74f0fb50
AM
6031/* Mark all our entry sym sections, both opd and code section. */
6032
6033static void
6034ppc64_elf_gc_keep (struct bfd_link_info *info)
6035{
6036 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6037 struct bfd_sym_chain *sym;
6038
4dfe6ac6
NC
6039 if (htab == NULL)
6040 return;
6041
74f0fb50
AM
6042 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6043 {
b31867b6 6044 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
6045 asection *sec;
6046
6047 eh = (struct ppc_link_hash_entry *)
b31867b6 6048 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
74f0fb50
AM
6049 if (eh == NULL)
6050 continue;
6051 if (eh->elf.root.type != bfd_link_hash_defined
6052 && eh->elf.root.type != bfd_link_hash_defweak)
6053 continue;
6054
b31867b6
AM
6055 fh = defined_code_entry (eh);
6056 if (fh != NULL)
74f0fb50 6057 {
b31867b6 6058 sec = fh->elf.root.u.def.section;
74f0fb50
AM
6059 sec->flags |= SEC_KEEP;
6060 }
6061 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6062 && opd_entry_value (eh->elf.root.u.def.section,
6063 eh->elf.root.u.def.value,
aef36ac1 6064 &sec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50
AM
6065 sec->flags |= SEC_KEEP;
6066
6067 sec = eh->elf.root.u.def.section;
6068 sec->flags |= SEC_KEEP;
6069 }
6070}
6071
64d03ab5
AM
6072/* Mark sections containing dynamically referenced symbols. When
6073 building shared libraries, we must assume that any visible symbol is
6074 referenced. */
6075
6076static bfd_boolean
6077ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6078{
6079 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6080 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
b31867b6 6081 struct ppc_link_hash_entry *fdh;
64d03ab5 6082
64d03ab5 6083 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
6084 fdh = defined_func_desc (eh);
6085 if (fdh != NULL)
6086 eh = fdh;
64d03ab5
AM
6087
6088 if ((eh->elf.root.type == bfd_link_hash_defined
6089 || eh->elf.root.type == bfd_link_hash_defweak)
6090 && (eh->elf.ref_dynamic
6091 || (!info->executable
6092 && eh->elf.def_regular
6093 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8
AM
6094 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
6095 && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
6096 || !bfd_hide_sym_by_version (info->version_info,
6097 eh->elf.root.root.string)))))
64d03ab5
AM
6098 {
6099 asection *code_sec;
b31867b6 6100 struct ppc_link_hash_entry *fh;
64d03ab5
AM
6101
6102 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6103
6104 /* Function descriptor syms cause the associated
6105 function code sym section to be marked. */
b31867b6
AM
6106 fh = defined_code_entry (eh);
6107 if (fh != NULL)
6108 {
6109 code_sec = fh->elf.root.u.def.section;
6110 code_sec->flags |= SEC_KEEP;
6111 }
64d03ab5
AM
6112 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6113 && opd_entry_value (eh->elf.root.u.def.section,
6114 eh->elf.root.u.def.value,
aef36ac1 6115 &code_sec, NULL, FALSE) != (bfd_vma) -1)
64d03ab5
AM
6116 code_sec->flags |= SEC_KEEP;
6117 }
6118
6119 return TRUE;
6120}
6121
5bd4f169
AM
6122/* Return the section that should be marked against GC for a given
6123 relocation. */
6124
6125static asection *
4ce794b7 6126ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 6127 struct bfd_link_info *info,
4ce794b7
AM
6128 Elf_Internal_Rela *rel,
6129 struct elf_link_hash_entry *h,
6130 Elf_Internal_Sym *sym)
5bd4f169 6131{
ccfa59ea
AM
6132 asection *rsec;
6133
ccfa59ea
AM
6134 /* Syms return NULL if we're marking .opd, so we avoid marking all
6135 function sections, as all functions are referenced in .opd. */
6136 rsec = NULL;
6137 if (get_opd_info (sec) != NULL)
6138 return rsec;
1e2f5b6e 6139
5bd4f169
AM
6140 if (h != NULL)
6141 {
04c9666a 6142 enum elf_ppc64_reloc_type r_type;
b31867b6 6143 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 6144
4ce794b7 6145 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 6146 switch (r_type)
5bd4f169
AM
6147 {
6148 case R_PPC64_GNU_VTINHERIT:
6149 case R_PPC64_GNU_VTENTRY:
6150 break;
6151
6152 default:
6153 switch (h->root.type)
6154 {
6155 case bfd_link_hash_defined:
6156 case bfd_link_hash_defweak:
ccfa59ea 6157 eh = (struct ppc_link_hash_entry *) h;
b31867b6
AM
6158 fdh = defined_func_desc (eh);
6159 if (fdh != NULL)
6160 eh = fdh;
1e2f5b6e
AM
6161
6162 /* Function descriptor syms cause the associated
6163 function code sym section to be marked. */
b31867b6
AM
6164 fh = defined_code_entry (eh);
6165 if (fh != NULL)
ccfa59ea
AM
6166 {
6167 /* They also mark their opd section. */
74f0fb50 6168 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 6169
b31867b6 6170 rsec = fh->elf.root.u.def.section;
ccfa59ea 6171 }
8387904d
AM
6172 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6173 && opd_entry_value (eh->elf.root.u.def.section,
6174 eh->elf.root.u.def.value,
aef36ac1 6175 &rsec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50 6176 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 6177 else
1e2f5b6e
AM
6178 rsec = h->root.u.def.section;
6179 break;
5bd4f169
AM
6180
6181 case bfd_link_hash_common:
1e2f5b6e
AM
6182 rsec = h->root.u.c.p->section;
6183 break;
5bd4f169
AM
6184
6185 default:
fb34365b 6186 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
6187 }
6188 }
6189 }
6190 else
6191 {
74f0fb50 6192 struct _opd_sec_data *opd;
1e2f5b6e
AM
6193
6194 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
6195 opd = get_opd_info (rsec);
6196 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 6197 {
74f0fb50 6198 rsec->gc_mark = 1;
ccfa59ea 6199
74f0fb50 6200 rsec = opd->func_sec[(sym->st_value + rel->r_addend) / 8];
ccfa59ea 6201 }
5bd4f169
AM
6202 }
6203
1e2f5b6e 6204 return rsec;
5bd4f169
AM
6205}
6206
65f38f15
AM
6207/* Update the .got, .plt. and dynamic reloc reference counts for the
6208 section being removed. */
5bd4f169 6209
b34976b6 6210static bfd_boolean
4ce794b7
AM
6211ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
6212 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 6213{
411e1bfb 6214 struct ppc_link_hash_table *htab;
5bd4f169
AM
6215 Elf_Internal_Shdr *symtab_hdr;
6216 struct elf_link_hash_entry **sym_hashes;
411e1bfb 6217 struct got_entry **local_got_ents;
5bd4f169 6218 const Elf_Internal_Rela *rel, *relend;
5bd4f169 6219
7dda2462
TG
6220 if (info->relocatable)
6221 return TRUE;
6222
680a3378
AM
6223 if ((sec->flags & SEC_ALLOC) == 0)
6224 return TRUE;
6225
ec338859
AM
6226 elf_section_data (sec)->local_dynrel = NULL;
6227
411e1bfb 6228 htab = ppc_hash_table (info);
4dfe6ac6
NC
6229 if (htab == NULL)
6230 return FALSE;
6231
0ffa91dd 6232 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 6233 sym_hashes = elf_sym_hashes (abfd);
411e1bfb 6234 local_got_ents = elf_local_got_ents (abfd);
5bd4f169
AM
6235
6236 relend = relocs + sec->reloc_count;
6237 for (rel = relocs; rel < relend; rel++)
a33d1f77
AM
6238 {
6239 unsigned long r_symndx;
04c9666a 6240 enum elf_ppc64_reloc_type r_type;
58ac9f71 6241 struct elf_link_hash_entry *h = NULL;
f961d9dd 6242 unsigned char tls_type = 0;
5bd4f169 6243
a33d1f77 6244 r_symndx = ELF64_R_SYM (rel->r_info);
4ce794b7 6245 r_type = ELF64_R_TYPE (rel->r_info);
58ac9f71
AM
6246 if (r_symndx >= symtab_hdr->sh_info)
6247 {
6248 struct ppc_link_hash_entry *eh;
6061a67d
AM
6249 struct elf_dyn_relocs **pp;
6250 struct elf_dyn_relocs *p;
58ac9f71
AM
6251
6252 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 6253 h = elf_follow_link (h);
58ac9f71
AM
6254 eh = (struct ppc_link_hash_entry *) h;
6255
6256 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6257 if (p->sec == sec)
6258 {
6259 /* Everything must go for SEC. */
6260 *pp = p->next;
6261 break;
6262 }
6263 }
6264
e054468f
AM
6265 if (is_branch_reloc (r_type))
6266 {
6267 struct plt_entry **ifunc = NULL;
6268 if (h != NULL)
6269 {
6270 if (h->type == STT_GNU_IFUNC)
6271 ifunc = &h->plt.plist;
6272 }
6273 else if (local_got_ents != NULL)
6274 {
6275 struct plt_entry **local_plt = (struct plt_entry **)
6276 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 6277 unsigned char *local_got_tls_masks = (unsigned char *)
e054468f
AM
6278 (local_plt + symtab_hdr->sh_info);
6279 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
6280 ifunc = local_plt + r_symndx;
6281 }
6282 if (ifunc != NULL)
6283 {
6284 struct plt_entry *ent;
6285
6286 for (ent = *ifunc; ent != NULL; ent = ent->next)
6287 if (ent->addend == rel->r_addend)
6288 break;
6289 if (ent == NULL)
6290 abort ();
6291 if (ent->plt.refcount > 0)
6292 ent->plt.refcount -= 1;
6293 continue;
6294 }
6295 }
6296
a33d1f77
AM
6297 switch (r_type)
6298 {
411e1bfb
AM
6299 case R_PPC64_GOT_TLSLD16:
6300 case R_PPC64_GOT_TLSLD16_LO:
6301 case R_PPC64_GOT_TLSLD16_HI:
6302 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 6303 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
6304 goto dogot;
6305
6306 case R_PPC64_GOT_TLSGD16:
6307 case R_PPC64_GOT_TLSGD16_LO:
6308 case R_PPC64_GOT_TLSGD16_HI:
6309 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 6310 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
6311 goto dogot;
6312
6313 case R_PPC64_GOT_TPREL16_DS:
6314 case R_PPC64_GOT_TPREL16_LO_DS:
6315 case R_PPC64_GOT_TPREL16_HI:
6316 case R_PPC64_GOT_TPREL16_HA:
6317 tls_type = TLS_TLS | TLS_TPREL;
6318 goto dogot;
6319
6320 case R_PPC64_GOT_DTPREL16_DS:
6321 case R_PPC64_GOT_DTPREL16_LO_DS:
6322 case R_PPC64_GOT_DTPREL16_HI:
6323 case R_PPC64_GOT_DTPREL16_HA:
6324 tls_type = TLS_TLS | TLS_DTPREL;
6325 goto dogot;
6326
a33d1f77
AM
6327 case R_PPC64_GOT16:
6328 case R_PPC64_GOT16_DS:
6329 case R_PPC64_GOT16_HA:
6330 case R_PPC64_GOT16_HI:
6331 case R_PPC64_GOT16_LO:
6332 case R_PPC64_GOT16_LO_DS:
411e1bfb
AM
6333 dogot:
6334 {
6335 struct got_entry *ent;
6336
58ac9f71
AM
6337 if (h != NULL)
6338 ent = h->got.glist;
411e1bfb
AM
6339 else
6340 ent = local_got_ents[r_symndx];
6341
6342 for (; ent != NULL; ent = ent->next)
6343 if (ent->addend == rel->r_addend
e717da7e 6344 && ent->owner == abfd
411e1bfb
AM
6345 && ent->tls_type == tls_type)
6346 break;
6347 if (ent == NULL)
6348 abort ();
6349 if (ent->got.refcount > 0)
6350 ent->got.refcount -= 1;
6351 }
a33d1f77 6352 break;
65f38f15 6353
a33d1f77
AM
6354 case R_PPC64_PLT16_HA:
6355 case R_PPC64_PLT16_HI:
6356 case R_PPC64_PLT16_LO:
6357 case R_PPC64_PLT32:
6358 case R_PPC64_PLT64:
721956f4
AM
6359 case R_PPC64_REL14:
6360 case R_PPC64_REL14_BRNTAKEN:
6361 case R_PPC64_REL14_BRTAKEN:
5d1634d7 6362 case R_PPC64_REL24:
58ac9f71 6363 if (h != NULL)
5d1634d7 6364 {
411e1bfb
AM
6365 struct plt_entry *ent;
6366
411e1bfb
AM
6367 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6368 if (ent->addend == rel->r_addend)
6369 break;
7c6c1722 6370 if (ent != NULL && ent->plt.refcount > 0)
411e1bfb 6371 ent->plt.refcount -= 1;
5d1634d7 6372 }
e86ce104 6373 break;
5d1634d7 6374
a33d1f77
AM
6375 default:
6376 break;
6377 }
6378 }
b34976b6 6379 return TRUE;
5bd4f169
AM
6380}
6381
deb0e272
AM
6382/* The maximum size of .sfpr. */
6383#define SFPR_MAX (218*4)
6384
6385struct sfpr_def_parms
6386{
699733f6
AM
6387 const char name[12];
6388 unsigned char lo, hi;
deb0e272
AM
6389 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6390 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6391};
6392
6393/* Auto-generate _save*, _rest* functions in .sfpr. */
6394
4dfe6ac6 6395static bfd_boolean
deb0e272
AM
6396sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
6397{
6398 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6399 unsigned int i;
6400 size_t len = strlen (parm->name);
6401 bfd_boolean writing = FALSE;
699733f6 6402 char sym[16];
deb0e272 6403
4dfe6ac6
NC
6404 if (htab == NULL)
6405 return FALSE;
6406
deb0e272
AM
6407 memcpy (sym, parm->name, len);
6408 sym[len + 2] = 0;
6409
6410 for (i = parm->lo; i <= parm->hi; i++)
6411 {
6412 struct elf_link_hash_entry *h;
6413
6414 sym[len + 0] = i / 10 + '0';
6415 sym[len + 1] = i % 10 + '0';
6416 h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
6417 if (h != NULL
f5385ebf 6418 && !h->def_regular)
deb0e272
AM
6419 {
6420 h->root.type = bfd_link_hash_defined;
6421 h->root.u.def.section = htab->sfpr;
6422 h->root.u.def.value = htab->sfpr->size;
6423 h->type = STT_FUNC;
f5385ebf 6424 h->def_regular = 1;
deb0e272
AM
6425 _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
6426 writing = TRUE;
6427 if (htab->sfpr->contents == NULL)
6428 {
6429 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6430 if (htab->sfpr->contents == NULL)
6431 return FALSE;
6432 }
6433 }
6434 if (writing)
6435 {
6436 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6437 if (i != parm->hi)
6438 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6439 else
6440 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6441 htab->sfpr->size = p - htab->sfpr->contents;
6442 }
6443 }
6444
6445 return TRUE;
6446}
6447
6448static bfd_byte *
6449savegpr0 (bfd *abfd, bfd_byte *p, int r)
6450{
6451 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6452 return p + 4;
6453}
6454
6455static bfd_byte *
6456savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6457{
6458 p = savegpr0 (abfd, p, r);
6459 bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
6460 p = p + 4;
6461 bfd_put_32 (abfd, BLR, p);
6462 return p + 4;
6463}
6464
6465static bfd_byte *
6466restgpr0 (bfd *abfd, bfd_byte *p, int r)
6467{
6468 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6469 return p + 4;
6470}
6471
6472static bfd_byte *
6473restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6474{
6475 bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
6476 p = p + 4;
6477 p = restgpr0 (abfd, p, r);
6478 bfd_put_32 (abfd, MTLR_R0, p);
6479 p = p + 4;
6480 if (r == 29)
6481 {
6482 p = restgpr0 (abfd, p, 30);
6483 p = restgpr0 (abfd, p, 31);
6484 }
6485 bfd_put_32 (abfd, BLR, p);
6486 return p + 4;
6487}
6488
6489static bfd_byte *
6490savegpr1 (bfd *abfd, bfd_byte *p, int r)
6491{
6492 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6493 return p + 4;
6494}
6495
6496static bfd_byte *
6497savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6498{
6499 p = savegpr1 (abfd, p, r);
6500 bfd_put_32 (abfd, BLR, p);
6501 return p + 4;
6502}
6503
6504static bfd_byte *
6505restgpr1 (bfd *abfd, bfd_byte *p, int r)
6506{
6507 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6508 return p + 4;
6509}
6510
6511static bfd_byte *
6512restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6513{
6514 p = restgpr1 (abfd, p, r);
6515 bfd_put_32 (abfd, BLR, p);
6516 return p + 4;
6517}
6518
6519static bfd_byte *
6520savefpr (bfd *abfd, bfd_byte *p, int r)
6521{
6522 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6523 return p + 4;
6524}
6525
6526static bfd_byte *
6527savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6528{
6529 p = savefpr (abfd, p, r);
6530 bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
6531 p = p + 4;
6532 bfd_put_32 (abfd, BLR, p);
6533 return p + 4;
6534}
6535
6536static bfd_byte *
6537restfpr (bfd *abfd, bfd_byte *p, int r)
6538{
6539 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6540 return p + 4;
6541}
6542
6543static bfd_byte *
6544restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6545{
6546 bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
6547 p = p + 4;
6548 p = restfpr (abfd, p, r);
6549 bfd_put_32 (abfd, MTLR_R0, p);
6550 p = p + 4;
6551 if (r == 29)
6552 {
6553 p = restfpr (abfd, p, 30);
6554 p = restfpr (abfd, p, 31);
6555 }
6556 bfd_put_32 (abfd, BLR, p);
6557 return p + 4;
6558}
6559
6560static bfd_byte *
6561savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6562{
6563 p = savefpr (abfd, p, r);
6564 bfd_put_32 (abfd, BLR, p);
6565 return p + 4;
6566}
6567
6568static bfd_byte *
6569restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6570{
6571 p = restfpr (abfd, p, r);
6572 bfd_put_32 (abfd, BLR, p);
6573 return p + 4;
6574}
6575
6576static bfd_byte *
6577savevr (bfd *abfd, bfd_byte *p, int r)
6578{
6579 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6580 p = p + 4;
6581 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6582 return p + 4;
6583}
6584
6585static bfd_byte *
6586savevr_tail (bfd *abfd, bfd_byte *p, int r)
6587{
6588 p = savevr (abfd, p, r);
6589 bfd_put_32 (abfd, BLR, p);
6590 return p + 4;
6591}
6592
6593static bfd_byte *
6594restvr (bfd *abfd, bfd_byte *p, int r)
6595{
6596 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6597 p = p + 4;
6598 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6599 return p + 4;
6600}
6601
6602static bfd_byte *
6603restvr_tail (bfd *abfd, bfd_byte *p, int r)
6604{
6605 p = restvr (abfd, p, r);
6606 bfd_put_32 (abfd, BLR, p);
6607 return p + 4;
6608}
6609
e86ce104
AM
6610/* Called via elf_link_hash_traverse to transfer dynamic linking
6611 information on function code symbol entries to their corresponding
6612 function descriptor symbol entries. */
deb0e272 6613
b34976b6 6614static bfd_boolean
4ce794b7 6615func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6616{
e86ce104 6617 struct bfd_link_info *info;
65f38f15 6618 struct ppc_link_hash_table *htab;
411e1bfb 6619 struct plt_entry *ent;
50bc7936
AM
6620 struct ppc_link_hash_entry *fh;
6621 struct ppc_link_hash_entry *fdh;
6622 bfd_boolean force_local;
5bd4f169 6623
50bc7936
AM
6624 fh = (struct ppc_link_hash_entry *) h;
6625 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 6626 return TRUE;
e86ce104 6627
4ce794b7 6628 info = inf;
65f38f15 6629 htab = ppc_hash_table (info);
4dfe6ac6
NC
6630 if (htab == NULL)
6631 return FALSE;
5bd4f169 6632
c09bdfe5
AM
6633 /* Resolve undefined references to dot-symbols as the value
6634 in the function descriptor, if we have one in a regular object.
6635 This is to satisfy cases like ".quad .foo". Calls to functions
6636 in dynamic objects are handled elsewhere. */
6637 if (fh->elf.root.type == bfd_link_hash_undefweak
6638 && fh->was_undefined
b31867b6
AM
6639 && (fdh = defined_func_desc (fh)) != NULL
6640 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6641 && opd_entry_value (fdh->elf.root.u.def.section,
6642 fdh->elf.root.u.def.value,
c09bdfe5 6643 &fh->elf.root.u.def.section,
aef36ac1 6644 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
c09bdfe5 6645 {
b31867b6 6646 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 6647 fh->elf.forced_local = 1;
b31867b6
AM
6648 fh->elf.def_regular = fdh->elf.def_regular;
6649 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
6650 }
6651
e86ce104
AM
6652 /* If this is a function code symbol, transfer dynamic linking
6653 information to the function descriptor symbol. */
50bc7936 6654 if (!fh->is_func)
b34976b6 6655 return TRUE;
e86ce104 6656
50bc7936 6657 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
411e1bfb
AM
6658 if (ent->plt.refcount > 0)
6659 break;
50bc7936
AM
6660 if (ent == NULL
6661 || fh->elf.root.root.string[0] != '.'
6662 || fh->elf.root.root.string[1] == '\0')
6663 return TRUE;
5bd4f169 6664
50bc7936
AM
6665 /* Find the corresponding function descriptor symbol. Create it
6666 as undefined if necessary. */
5bd4f169 6667
b31867b6 6668 fdh = lookup_fdh (fh, htab);
50bc7936 6669 if (fdh == NULL
df131623 6670 && !info->executable
50bc7936
AM
6671 && (fh->elf.root.type == bfd_link_hash_undefined
6672 || fh->elf.root.type == bfd_link_hash_undefweak))
6673 {
908b32fc 6674 fdh = make_fdh (info, fh);
bb700d78
AM
6675 if (fdh == NULL)
6676 return FALSE;
50bc7936 6677 }
648cca2c 6678
908b32fc 6679 /* Fake function descriptors are made undefweak. If the function
433817dd
AM
6680 code symbol is strong undefined, make the fake sym the same.
6681 If the function code symbol is defined, then force the fake
6682 descriptor local; We can't support overriding of symbols in a
6683 shared library on a fake descriptor. */
908b32fc
AM
6684
6685 if (fdh != NULL
6686 && fdh->fake
433817dd 6687 && fdh->elf.root.type == bfd_link_hash_undefweak)
908b32fc 6688 {
433817dd
AM
6689 if (fh->elf.root.type == bfd_link_hash_undefined)
6690 {
6691 fdh->elf.root.type = bfd_link_hash_undefined;
6692 bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
6693 }
6694 else if (fh->elf.root.type == bfd_link_hash_defined
6695 || fh->elf.root.type == bfd_link_hash_defweak)
6696 {
6697 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
6698 }
908b32fc
AM
6699 }
6700
50bc7936 6701 if (fdh != NULL
f5385ebf 6702 && !fdh->elf.forced_local
df131623 6703 && (!info->executable
f5385ebf
AM
6704 || fdh->elf.def_dynamic
6705 || fdh->elf.ref_dynamic
50bc7936
AM
6706 || (fdh->elf.root.type == bfd_link_hash_undefweak
6707 && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
6708 {
6709 if (fdh->elf.dynindx == -1)
c152c796 6710 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
50bc7936 6711 return FALSE;
f5385ebf
AM
6712 fdh->elf.ref_regular |= fh->elf.ref_regular;
6713 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6714 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6715 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
50bc7936 6716 if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
e86ce104 6717 {
40d16e0b 6718 move_plt_plist (fh, fdh);
f5385ebf 6719 fdh->elf.needs_plt = 1;
e86ce104 6720 }
50bc7936 6721 fdh->is_func_descriptor = 1;
34814b9f
AM
6722 fdh->oh = fh;
6723 fh->oh = fdh;
e86ce104
AM
6724 }
6725
50bc7936
AM
6726 /* Now that the info is on the function descriptor, clear the
6727 function code sym info. Any function code syms for which we
6728 don't have a definition in a regular file, we force local.
6729 This prevents a shared library from exporting syms that have
6730 been imported from another library. Function code syms that
6731 are really in the library we must leave global to prevent the
6732 linker dragging in a definition from a static library. */
93f3fa99
AM
6733 force_local = (!fh->elf.def_regular
6734 || fdh == NULL
6735 || !fdh->elf.def_regular
6736 || fdh->elf.forced_local);
50bc7936
AM
6737 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6738
b34976b6 6739 return TRUE;
e86ce104 6740}
40b8271b 6741
e86ce104 6742/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
6743 this hook to a) provide some gcc support functions, and b) transfer
6744 dynamic linking information gathered so far on function code symbol
6745 entries, to their corresponding function descriptor symbol entries. */
deb0e272 6746
b34976b6 6747static bfd_boolean
4ce794b7
AM
6748ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6749 struct bfd_link_info *info)
e86ce104
AM
6750{
6751 struct ppc_link_hash_table *htab;
82bd7b59 6752 unsigned int i;
27fc25a1 6753 static const struct sfpr_def_parms funcs[] =
deb0e272
AM
6754 {
6755 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6756 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6757 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6758 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6759 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6760 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6761 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6762 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6763 { "._savef", 14, 31, savefpr, savefpr1_tail },
6764 { "._restf", 14, 31, restfpr, restfpr1_tail },
6765 { "_savevr_", 20, 31, savevr, savevr_tail },
6766 { "_restvr_", 20, 31, restvr, restvr_tail }
6767 };
e86ce104
AM
6768
6769 htab = ppc_hash_table (info);
4dfe6ac6
NC
6770 if (htab == NULL)
6771 return FALSE;
6772
5295321c
AM
6773 if (!info->relocatable
6774 && htab->elf.hgot != NULL)
6775 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
c66bb0ee 6776
82bd7b59
AM
6777 if (htab->sfpr == NULL)
6778 /* We don't have any relocs. */
b34976b6 6779 return TRUE;
82bd7b59 6780
deb0e272
AM
6781 /* Provide any missing _save* and _rest* functions. */
6782 htab->sfpr->size = 0;
27fc25a1
AM
6783 if (!info->relocatable)
6784 for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
6785 if (!sfpr_define (info, &funcs[i]))
6786 return FALSE;
82bd7b59 6787
4ce794b7 6788 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
805fc799 6789
eea6121a 6790 if (htab->sfpr->size == 0)
8423293d 6791 htab->sfpr->flags |= SEC_EXCLUDE;
82bd7b59 6792
b34976b6 6793 return TRUE;
e86ce104
AM
6794}
6795
6796/* Adjust a symbol defined by a dynamic object and referenced by a
6797 regular object. The current definition is in some section of the
6798 dynamic object, but we're not including those sections. We have to
6799 change the definition to something the rest of the link can
6800 understand. */
6801
b34976b6 6802static bfd_boolean
4ce794b7
AM
6803ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6804 struct elf_link_hash_entry *h)
e86ce104
AM
6805{
6806 struct ppc_link_hash_table *htab;
e86ce104 6807 asection *s;
e86ce104
AM
6808
6809 htab = ppc_hash_table (info);
4dfe6ac6
NC
6810 if (htab == NULL)
6811 return FALSE;
e86ce104
AM
6812
6813 /* Deal with function syms. */
6814 if (h->type == STT_FUNC
e054468f 6815 || h->type == STT_GNU_IFUNC
f5385ebf 6816 || h->needs_plt)
e86ce104
AM
6817 {
6818 /* Clear procedure linkage table information for any symbol that
6819 won't need a .plt entry. */
411e1bfb
AM
6820 struct plt_entry *ent;
6821 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6822 if (ent->plt.refcount > 0)
6823 break;
8387904d 6824 if (ent == NULL
e054468f
AM
6825 || (h->type != STT_GNU_IFUNC
6826 && (SYMBOL_CALLS_LOCAL (info, h)
6827 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6828 && h->root.type == bfd_link_hash_undefweak))))
40b8271b 6829 {
411e1bfb 6830 h->plt.plist = NULL;
f5385ebf 6831 h->needs_plt = 0;
40b8271b 6832 }
5bd4f169 6833 }
bbd7ec4a 6834 else
411e1bfb 6835 h->plt.plist = NULL;
5bd4f169
AM
6836
6837 /* If this is a weak symbol, and there is a real definition, the
6838 processor independent code will have arranged for us to see the
6839 real definition first, and we can just use the same value. */
f6e332e6 6840 if (h->u.weakdef != NULL)
5bd4f169 6841 {
f6e332e6
AM
6842 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
6843 || h->u.weakdef->root.type == bfd_link_hash_defweak);
6844 h->root.u.def.section = h->u.weakdef->root.u.def.section;
6845 h->root.u.def.value = h->u.weakdef->root.u.def.value;
a23b6845 6846 if (ELIMINATE_COPY_RELOCS)
f6e332e6 6847 h->non_got_ref = h->u.weakdef->non_got_ref;
b34976b6 6848 return TRUE;
5bd4f169
AM
6849 }
6850
5bd4f169
AM
6851 /* If we are creating a shared library, we must presume that the
6852 only references to the symbol are via the global offset table.
6853 For such cases we need not do anything here; the relocations will
6854 be handled correctly by relocate_section. */
6855 if (info->shared)
b34976b6 6856 return TRUE;
5bd4f169 6857
65f38f15
AM
6858 /* If there are no references to this symbol that do not use the
6859 GOT, we don't need to generate a copy reloc. */
f5385ebf 6860 if (!h->non_got_ref)
b34976b6 6861 return TRUE;
65f38f15 6862
b186458a
JJ
6863 /* Don't generate a copy reloc for symbols defined in the executable. */
6864 if (!h->def_dynamic || !h->ref_regular || h->def_regular)
6865 return TRUE;
6866
f4656909 6867 if (ELIMINATE_COPY_RELOCS)
65f38f15 6868 {
f4656909 6869 struct ppc_link_hash_entry * eh;
6061a67d 6870 struct elf_dyn_relocs *p;
65f38f15 6871
f4656909
AM
6872 eh = (struct ppc_link_hash_entry *) h;
6873 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6874 {
6875 s = p->sec->output_section;
6876 if (s != NULL && (s->flags & SEC_READONLY) != 0)
6877 break;
6878 }
6879
6880 /* If we didn't find any dynamic relocs in read-only sections, then
6881 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
6882 if (p == NULL)
6883 {
f5385ebf 6884 h->non_got_ref = 0;
f4656909
AM
6885 return TRUE;
6886 }
65f38f15
AM
6887 }
6888
5d35169e 6889 if (h->plt.plist != NULL)
97b639ba
AM
6890 {
6891 /* We should never get here, but unfortunately there are versions
6892 of gcc out there that improperly (for this ABI) put initialized
6893 function pointers, vtable refs and suchlike in read-only
6894 sections. Allow them to proceed, but warn that this might
6895 break at runtime. */
25f53a85 6896 info->callbacks->einfo
bc30df16 6897 (_("%P: copy reloc against `%T' requires lazy plt linking; "
25f53a85 6898 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
6899 h->root.root.string);
6900 }
5d35169e
AM
6901
6902 /* This is a reference to a symbol defined by a dynamic object which
6903 is not a function. */
6904
5bd4f169
AM
6905 /* We must allocate the symbol in our .dynbss section, which will
6906 become part of the .bss section of the executable. There will be
6907 an entry for this symbol in the .dynsym section. The dynamic
6908 object will contain position independent code, so all references
6909 from the dynamic object to this symbol will go through the global
6910 offset table. The dynamic linker will use the .dynsym entry to
6911 determine the address it must put in the global offset table, so
6912 both the dynamic object and the regular object will refer to the
6913 same memory location for the variable. */
5bd4f169 6914
04c9666a
AM
6915 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
6916 to copy the initial value out of the dynamic object and into the
5bd4f169
AM
6917 runtime process image. We need to remember the offset into the
6918 .rela.bss section we are going to use. */
1d7e9d18 6919 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 6920 {
eea6121a 6921 htab->relbss->size += sizeof (Elf64_External_Rela);
f5385ebf 6922 h->needs_copy = 1;
5bd4f169
AM
6923 }
6924
4ce794b7 6925 s = htab->dynbss;
5bd4f169 6926
027297b7 6927 return _bfd_elf_adjust_dynamic_copy (h, s);
5bd4f169
AM
6928}
6929
e86ce104
AM
6930/* If given a function descriptor symbol, hide both the function code
6931 sym and the descriptor. */
6932static void
4ce794b7
AM
6933ppc64_elf_hide_symbol (struct bfd_link_info *info,
6934 struct elf_link_hash_entry *h,
6935 bfd_boolean force_local)
e86ce104 6936{
34814b9f 6937 struct ppc_link_hash_entry *eh;
e86ce104
AM
6938 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6939
34814b9f
AM
6940 eh = (struct ppc_link_hash_entry *) h;
6941 if (eh->is_func_descriptor)
e86ce104 6942 {
34814b9f 6943 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 6944
721956f4 6945 if (fh == NULL)
d1329ca3
AM
6946 {
6947 const char *p, *q;
6948 struct ppc_link_hash_table *htab;
6949 char save;
6950
6951 /* We aren't supposed to use alloca in BFD because on
6952 systems which do not have alloca the version in libiberty
6953 calls xmalloc, which might cause the program to crash
6954 when it runs out of memory. This function doesn't have a
6955 return status, so there's no way to gracefully return an
6956 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
6957 accessed; It's either a string in an ELF string table,
6958 or allocated in an objalloc structure. */
d1329ca3 6959
34814b9f 6960 p = eh->elf.root.root.string - 1;
d1329ca3
AM
6961 save = *p;
6962 *(char *) p = '.';
6963 htab = ppc_hash_table (info);
4dfe6ac6
NC
6964 if (htab == NULL)
6965 return;
6966
34814b9f
AM
6967 fh = (struct ppc_link_hash_entry *)
6968 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
d1329ca3
AM
6969 *(char *) p = save;
6970
6971 /* Unfortunately, if it so happens that the string we were
6972 looking for was allocated immediately before this string,
6973 then we overwrote the string terminator. That's the only
6974 reason the lookup should fail. */
6975 if (fh == NULL)
6976 {
34814b9f
AM
6977 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6978 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 6979 --q, --p;
34814b9f
AM
6980 if (q < eh->elf.root.root.string && *p == '.')
6981 fh = (struct ppc_link_hash_entry *)
6982 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
d1329ca3
AM
6983 }
6984 if (fh != NULL)
6985 {
34814b9f
AM
6986 eh->oh = fh;
6987 fh->oh = eh;
d1329ca3
AM
6988 }
6989 }
e86ce104 6990 if (fh != NULL)
34814b9f 6991 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
6992 }
6993}
6994
411e1bfb 6995static bfd_boolean
8843416a
AM
6996get_sym_h (struct elf_link_hash_entry **hp,
6997 Elf_Internal_Sym **symp,
6998 asection **symsecp,
f961d9dd 6999 unsigned char **tls_maskp,
8843416a
AM
7000 Elf_Internal_Sym **locsymsp,
7001 unsigned long r_symndx,
7002 bfd *ibfd)
411e1bfb 7003{
0ffa91dd 7004 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
7005
7006 if (r_symndx >= symtab_hdr->sh_info)
7007 {
7008 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7009 struct elf_link_hash_entry *h;
7010
7011 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7012 h = elf_follow_link (h);
411e1bfb
AM
7013
7014 if (hp != NULL)
7015 *hp = h;
7016
7017 if (symp != NULL)
7018 *symp = NULL;
7019
7020 if (symsecp != NULL)
7021 {
7022 asection *symsec = NULL;
7023 if (h->root.type == bfd_link_hash_defined
7024 || h->root.type == bfd_link_hash_defweak)
7025 symsec = h->root.u.def.section;
7026 *symsecp = symsec;
7027 }
7028
e7b938ca 7029 if (tls_maskp != NULL)
411e1bfb
AM
7030 {
7031 struct ppc_link_hash_entry *eh;
7032
7033 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 7034 *tls_maskp = &eh->tls_mask;
411e1bfb
AM
7035 }
7036 }
7037 else
7038 {
7039 Elf_Internal_Sym *sym;
7040 Elf_Internal_Sym *locsyms = *locsymsp;
7041
7042 if (locsyms == NULL)
7043 {
7044 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7045 if (locsyms == NULL)
7046 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7047 symtab_hdr->sh_info,
7048 0, NULL, NULL, NULL);
7049 if (locsyms == NULL)
7050 return FALSE;
7051 *locsymsp = locsyms;
7052 }
7053 sym = locsyms + r_symndx;
7054
7055 if (hp != NULL)
7056 *hp = NULL;
7057
7058 if (symp != NULL)
7059 *symp = sym;
7060
7061 if (symsecp != NULL)
cb33740c 7062 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 7063
e7b938ca 7064 if (tls_maskp != NULL)
411e1bfb
AM
7065 {
7066 struct got_entry **lgot_ents;
f961d9dd 7067 unsigned char *tls_mask;
411e1bfb 7068
e7b938ca 7069 tls_mask = NULL;
411e1bfb
AM
7070 lgot_ents = elf_local_got_ents (ibfd);
7071 if (lgot_ents != NULL)
7072 {
e054468f
AM
7073 struct plt_entry **local_plt = (struct plt_entry **)
7074 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 7075 unsigned char *lgot_masks = (unsigned char *)
e054468f 7076 (local_plt + symtab_hdr->sh_info);
e7b938ca 7077 tls_mask = &lgot_masks[r_symndx];
411e1bfb 7078 }
e7b938ca 7079 *tls_maskp = tls_mask;
411e1bfb
AM
7080 }
7081 }
7082 return TRUE;
7083}
7084
e7b938ca 7085/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 7086 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 7087 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
7088
7089static int
f961d9dd 7090get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
7091 unsigned long *toc_symndx,
7092 bfd_vma *toc_addend,
0d4792f7 7093 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
7094 const Elf_Internal_Rela *rel,
7095 bfd *ibfd)
411e1bfb
AM
7096{
7097 unsigned long r_symndx;
0d4792f7 7098 int next_r;
411e1bfb
AM
7099 struct elf_link_hash_entry *h;
7100 Elf_Internal_Sym *sym;
7101 asection *sec;
7102 bfd_vma off;
7103
7104 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 7105 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 7106 return 0;
411e1bfb 7107
e7b938ca 7108 if ((*tls_maskp != NULL && **tls_maskp != 0)
411e1bfb 7109 || sec == NULL
6bee8834 7110 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 7111 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 7112 return 1;
411e1bfb
AM
7113
7114 /* Look inside a TOC section too. */
7115 if (h != NULL)
7116 {
7117 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7118 off = h->root.u.def.value;
7119 }
7120 else
7121 off = sym->st_value;
7122 off += rel->r_addend;
7123 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
7124 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7125 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
7126 if (toc_symndx != NULL)
7127 *toc_symndx = r_symndx;
3a71aa26
AM
7128 if (toc_addend != NULL)
7129 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7130 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7131 return 0;
854b41e7 7132 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
7133 && (next_r == -1 || next_r == -2))
7134 return 1 - next_r;
951fd09b 7135 return 1;
411e1bfb
AM
7136}
7137
3b421ab3
AM
7138/* Find (or create) an entry in the tocsave hash table. */
7139
7140static struct tocsave_entry *
7141tocsave_find (struct ppc_link_hash_table *htab,
7142 enum insert_option insert,
7143 Elf_Internal_Sym **local_syms,
7144 const Elf_Internal_Rela *irela,
7145 bfd *ibfd)
7146{
7147 unsigned long r_indx;
7148 struct elf_link_hash_entry *h;
7149 Elf_Internal_Sym *sym;
7150 struct tocsave_entry ent, *p;
7151 hashval_t hash;
7152 struct tocsave_entry **slot;
7153
7154 r_indx = ELF64_R_SYM (irela->r_info);
7155 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7156 return NULL;
7157 if (ent.sec == NULL || ent.sec->output_section == NULL)
7158 {
7159 (*_bfd_error_handler)
7160 (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
7161 return NULL;
7162 }
7163
7164 if (h != NULL)
7165 ent.offset = h->root.u.def.value;
7166 else
7167 ent.offset = sym->st_value;
7168 ent.offset += irela->r_addend;
7169
7170 hash = tocsave_htab_hash (&ent);
7171 slot = ((struct tocsave_entry **)
7172 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7173 if (slot == NULL)
7174 return NULL;
7175
7176 if (*slot == NULL)
7177 {
7178 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7179 if (p == NULL)
7180 return NULL;
7181 *p = ent;
7182 *slot = p;
7183 }
7184 return *slot;
7185}
7186
754021d0 7187/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 7188 code for the old ABI, these will already have been done. */
754021d0
AM
7189
7190static bfd_boolean
7191adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7192{
7193 struct ppc_link_hash_entry *eh;
7194 asection *sym_sec;
74f0fb50 7195 struct _opd_sec_data *opd;
754021d0
AM
7196
7197 if (h->root.type == bfd_link_hash_indirect)
7198 return TRUE;
7199
754021d0
AM
7200 if (h->root.type != bfd_link_hash_defined
7201 && h->root.type != bfd_link_hash_defweak)
7202 return TRUE;
7203
7204 eh = (struct ppc_link_hash_entry *) h;
7205 if (eh->adjust_done)
7206 return TRUE;
7207
7208 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
7209 opd = get_opd_info (sym_sec);
7210 if (opd != NULL && opd->adjust != NULL)
754021d0 7211 {
74f0fb50 7212 long adjust = opd->adjust[eh->elf.root.u.def.value / 8];
4025353c
AM
7213 if (adjust == -1)
7214 {
7215 /* This entry has been deleted. */
b3fac117 7216 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
7217 if (dsec == NULL)
7218 {
7219 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 7220 if (discarded_section (dsec))
81688140 7221 {
b3fac117 7222 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
7223 break;
7224 }
7225 }
4025353c 7226 eh->elf.root.u.def.value = 0;
81688140 7227 eh->elf.root.u.def.section = dsec;
4025353c
AM
7228 }
7229 else
7230 eh->elf.root.u.def.value += adjust;
754021d0
AM
7231 eh->adjust_done = 1;
7232 }
7233 return TRUE;
7234}
7235
8c1d1bb8 7236/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 7237 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
7238 have already been determined. */
7239
7240static bfd_boolean
7241dec_dynrel_count (bfd_vma r_info,
7242 asection *sec,
7243 struct bfd_link_info *info,
7244 Elf_Internal_Sym **local_syms,
7245 struct elf_link_hash_entry *h,
19e08130 7246 Elf_Internal_Sym *sym)
8c1d1bb8
AM
7247{
7248 enum elf_ppc64_reloc_type r_type;
19e08130 7249 asection *sym_sec = NULL;
8c1d1bb8
AM
7250
7251 /* Can this reloc be dynamic? This switch, and later tests here
7252 should be kept in sync with the code in check_relocs. */
7253 r_type = ELF64_R_TYPE (r_info);
7254 switch (r_type)
7255 {
7256 default:
7257 return TRUE;
7258
7259 case R_PPC64_TPREL16:
7260 case R_PPC64_TPREL16_LO:
7261 case R_PPC64_TPREL16_HI:
7262 case R_PPC64_TPREL16_HA:
7263 case R_PPC64_TPREL16_DS:
7264 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
7265 case R_PPC64_TPREL16_HIGH:
7266 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
7267 case R_PPC64_TPREL16_HIGHER:
7268 case R_PPC64_TPREL16_HIGHERA:
7269 case R_PPC64_TPREL16_HIGHEST:
7270 case R_PPC64_TPREL16_HIGHESTA:
7271 if (!info->shared)
7272 return TRUE;
7273
7274 case R_PPC64_TPREL64:
7275 case R_PPC64_DTPMOD64:
7276 case R_PPC64_DTPREL64:
7277 case R_PPC64_ADDR64:
7278 case R_PPC64_REL30:
7279 case R_PPC64_REL32:
7280 case R_PPC64_REL64:
7281 case R_PPC64_ADDR14:
7282 case R_PPC64_ADDR14_BRNTAKEN:
7283 case R_PPC64_ADDR14_BRTAKEN:
7284 case R_PPC64_ADDR16:
7285 case R_PPC64_ADDR16_DS:
7286 case R_PPC64_ADDR16_HA:
7287 case R_PPC64_ADDR16_HI:
f9c6b907
AM
7288 case R_PPC64_ADDR16_HIGH:
7289 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
7290 case R_PPC64_ADDR16_HIGHER:
7291 case R_PPC64_ADDR16_HIGHERA:
7292 case R_PPC64_ADDR16_HIGHEST:
7293 case R_PPC64_ADDR16_HIGHESTA:
7294 case R_PPC64_ADDR16_LO:
7295 case R_PPC64_ADDR16_LO_DS:
7296 case R_PPC64_ADDR24:
7297 case R_PPC64_ADDR32:
7298 case R_PPC64_UADDR16:
7299 case R_PPC64_UADDR32:
7300 case R_PPC64_UADDR64:
7301 case R_PPC64_TOC:
7302 break;
7303 }
7304
7305 if (local_syms != NULL)
7306 {
7307 unsigned long r_symndx;
8c1d1bb8
AM
7308 bfd *ibfd = sec->owner;
7309
7310 r_symndx = ELF64_R_SYM (r_info);
7311 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7312 return FALSE;
7313 }
7314
7315 if ((info->shared
1d483afe 7316 && (must_be_dyn_reloc (info, r_type)
8c1d1bb8 7317 || (h != NULL
198f1157 7318 && (!SYMBOLIC_BIND (info, h)
8c1d1bb8
AM
7319 || h->root.type == bfd_link_hash_defweak
7320 || !h->def_regular))))
7321 || (ELIMINATE_COPY_RELOCS
7322 && !info->shared
7323 && h != NULL
7324 && (h->root.type == bfd_link_hash_defweak
7325 || !h->def_regular)))
7326 ;
7327 else
7328 return TRUE;
7329
7330 if (h != NULL)
6edfbbad 7331 {
19e08130
AM
7332 struct elf_dyn_relocs *p;
7333 struct elf_dyn_relocs **pp;
7334 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7335
7336 /* elf_gc_sweep may have already removed all dyn relocs associated
7337 with local syms for a given section. Also, symbol flags are
7338 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7339 report a dynreloc miscount. */
7340 if (*pp == NULL && info->gc_sections)
7341 return TRUE;
7342
7343 while ((p = *pp) != NULL)
60124e18 7344 {
19e08130
AM
7345 if (p->sec == sec)
7346 {
7347 if (!must_be_dyn_reloc (info, r_type))
7348 p->pc_count -= 1;
7349 p->count -= 1;
7350 if (p->count == 0)
7351 *pp = p->next;
7352 return TRUE;
7353 }
7354 pp = &p->next;
60124e18 7355 }
6edfbbad 7356 }
19e08130
AM
7357 else
7358 {
7359 struct ppc_dyn_relocs *p;
7360 struct ppc_dyn_relocs **pp;
7361 void *vpp;
7362 bfd_boolean is_ifunc;
8c1d1bb8 7363
19e08130
AM
7364 if (local_syms == NULL)
7365 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7366 if (sym_sec == NULL)
7367 sym_sec = sec;
c57da1a7 7368
19e08130
AM
7369 vpp = &elf_section_data (sym_sec)->local_dynrel;
7370 pp = (struct ppc_dyn_relocs **) vpp;
7371
7372 if (*pp == NULL && info->gc_sections)
7373 return TRUE;
7374
7375 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7376 while ((p = *pp) != NULL)
8c1d1bb8 7377 {
19e08130
AM
7378 if (p->sec == sec && p->ifunc == is_ifunc)
7379 {
7380 p->count -= 1;
7381 if (p->count == 0)
7382 *pp = p->next;
7383 return TRUE;
7384 }
7385 pp = &p->next;
8c1d1bb8 7386 }
8c1d1bb8
AM
7387 }
7388
8de848d8 7389 info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
25f53a85 7390 sec->owner, sec);
8c1d1bb8
AM
7391 bfd_set_error (bfd_error_bad_value);
7392 return FALSE;
7393}
7394
754021d0
AM
7395/* Remove unused Official Procedure Descriptor entries. Currently we
7396 only remove those associated with functions in discarded link-once
7397 sections, or weakly defined functions that have been overridden. It
7398 would be possible to remove many more entries for statically linked
7399 applications. */
7400
b34976b6 7401bfd_boolean
33c0ec9d 7402ppc64_elf_edit_opd (struct bfd_link_info *info, bfd_boolean non_overlapping)
1e2f5b6e
AM
7403{
7404 bfd *ibfd;
754021d0 7405 bfd_boolean some_edited = FALSE;
3f764659 7406 asection *need_pad = NULL;
1e2f5b6e 7407
411e1bfb 7408 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1e2f5b6e
AM
7409 {
7410 asection *sec;
7411 Elf_Internal_Rela *relstart, *rel, *relend;
7412 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7413 Elf_Internal_Sym *local_syms;
1e2f5b6e 7414 bfd_vma offset;
74f0fb50 7415 struct _opd_sec_data *opd;
3f764659
JJ
7416 bfd_boolean need_edit, add_aux_fields;
7417 bfd_size_type cnt_16b = 0;
1e2f5b6e 7418
854b41e7
AM
7419 if (!is_ppc64_elf (ibfd))
7420 continue;
7421
1e2f5b6e 7422 sec = bfd_get_section_by_name (ibfd, ".opd");
46de2a7c 7423 if (sec == NULL || sec->size == 0)
1e2f5b6e
AM
7424 continue;
7425
dbaa2011 7426 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7427 continue;
7428
1e2f5b6e
AM
7429 if (sec->output_section == bfd_abs_section_ptr)
7430 continue;
7431
7432 /* Look through the section relocs. */
7433 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7434 continue;
7435
6cdc0ccc 7436 local_syms = NULL;
0ffa91dd 7437 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7438
7439 /* Read the relocations. */
4ce794b7 7440 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7441 info->keep_memory);
1e2f5b6e 7442 if (relstart == NULL)
b34976b6 7443 return FALSE;
1e2f5b6e
AM
7444
7445 /* First run through the relocs to check they are sane, and to
7446 determine whether we need to edit this opd section. */
b34976b6 7447 need_edit = FALSE;
3f764659 7448 need_pad = sec;
1e2f5b6e
AM
7449 offset = 0;
7450 relend = relstart + sec->reloc_count;
50bc7936 7451 for (rel = relstart; rel < relend; )
1e2f5b6e 7452 {
04c9666a 7453 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7454 unsigned long r_symndx;
7455 asection *sym_sec;
7456 struct elf_link_hash_entry *h;
7457 Elf_Internal_Sym *sym;
7458
3f764659 7459 /* .opd contains a regular array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7460 only interested in the reloc pointing to a function entry
7461 point. */
50bc7936
AM
7462 if (rel->r_offset != offset
7463 || rel + 1 >= relend
7464 || (rel + 1)->r_offset != offset + 8)
1e2f5b6e
AM
7465 {
7466 /* If someone messes with .opd alignment then after a
7467 "ld -r" we might have padding in the middle of .opd.
7468 Also, there's nothing to prevent someone putting
7469 something silly in .opd with the assembler. No .opd
b34976b6 7470 optimization for them! */
3f764659 7471 broken_opd:
1e2f5b6e 7472 (*_bfd_error_handler)
d003868e 7473 (_("%B: .opd is not a regular array of opd entries"), ibfd);
b34976b6 7474 need_edit = FALSE;
1e2f5b6e
AM
7475 break;
7476 }
7477
50bc7936
AM
7478 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7479 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7480 {
7481 (*_bfd_error_handler)
d003868e
AM
7482 (_("%B: unexpected reloc type %u in .opd section"),
7483 ibfd, r_type);
50bc7936
AM
7484 need_edit = FALSE;
7485 break;
7486 }
7487
1e2f5b6e 7488 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7489 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7490 r_symndx, ibfd))
50bc7936 7491 goto error_ret;
1e2f5b6e
AM
7492
7493 if (sym_sec == NULL || sym_sec->owner == NULL)
7494 {
411e1bfb
AM
7495 const char *sym_name;
7496 if (h != NULL)
7497 sym_name = h->root.root.string;
7498 else
26c61ae5
L
7499 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7500 sym_sec);
411e1bfb 7501
1e2f5b6e 7502 (*_bfd_error_handler)
d003868e
AM
7503 (_("%B: undefined sym `%s' in .opd section"),
7504 ibfd, sym_name);
b34976b6 7505 need_edit = FALSE;
1e2f5b6e
AM
7506 break;
7507 }
7508
51020317
AM
7509 /* opd entries are always for functions defined in the
7510 current input bfd. If the symbol isn't defined in the
7511 input bfd, then we won't be using the function in this
7512 bfd; It must be defined in a linkonce section in another
7513 bfd, or is weak. It's also possible that we are
7514 discarding the function due to a linker script /DISCARD/,
7515 which we test for via the output_section. */
7516 if (sym_sec->owner != ibfd
7517 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 7518 need_edit = TRUE;
1e2f5b6e 7519
50bc7936 7520 rel += 2;
3f764659
JJ
7521 if (rel == relend
7522 || (rel + 1 == relend && rel->r_offset == offset + 16))
7523 {
7524 if (sec->size == offset + 24)
7525 {
7526 need_pad = NULL;
7527 break;
7528 }
7529 if (rel == relend && sec->size == offset + 16)
7530 {
7531 cnt_16b++;
7532 break;
7533 }
7534 goto broken_opd;
7535 }
7536
7537 if (rel->r_offset == offset + 24)
7538 offset += 24;
7539 else if (rel->r_offset != offset + 16)
7540 goto broken_opd;
7541 else if (rel + 1 < relend
7542 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7543 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7544 {
7545 offset += 16;
7546 cnt_16b++;
7547 }
7548 else if (rel + 2 < relend
7549 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
7550 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
7551 {
7552 offset += 24;
7553 rel += 1;
7554 }
7555 else
7556 goto broken_opd;
1e2f5b6e
AM
7557 }
7558
3f764659
JJ
7559 add_aux_fields = non_overlapping && cnt_16b > 0;
7560
7561 if (need_edit || add_aux_fields)
1e2f5b6e
AM
7562 {
7563 Elf_Internal_Rela *write_rel;
d4730f92 7564 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 7565 bfd_byte *rptr, *wptr;
983bddc8 7566 bfd_byte *new_contents;
b34976b6 7567 bfd_boolean skip;
3f764659 7568 long opd_ent_size;
74f0fb50
AM
7569 bfd_size_type amt;
7570
983bddc8 7571 new_contents = NULL;
74f0fb50
AM
7572 amt = sec->size * sizeof (long) / 8;
7573 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 7574 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50
AM
7575 if (opd->adjust == NULL)
7576 return FALSE;
7577 ppc64_elf_section_data (sec)->sec_type = sec_opd;
1e2f5b6e
AM
7578
7579 /* This seems a waste of time as input .opd sections are all
7580 zeros as generated by gcc, but I suppose there's no reason
7581 this will always be so. We might start putting something in
7582 the third word of .opd entries. */
7583 if ((sec->flags & SEC_IN_MEMORY) == 0)
7584 {
eea6121a
AM
7585 bfd_byte *loc;
7586 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 7587 {
eea6121a
AM
7588 if (loc != NULL)
7589 free (loc);
50bc7936 7590 error_ret:
6cdc0ccc
AM
7591 if (local_syms != NULL
7592 && symtab_hdr->contents != (unsigned char *) local_syms)
7593 free (local_syms);
6cdc0ccc
AM
7594 if (elf_section_data (sec)->relocs != relstart)
7595 free (relstart);
b34976b6 7596 return FALSE;
6cdc0ccc 7597 }
1e2f5b6e
AM
7598 sec->contents = loc;
7599 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7600 }
7601
7602 elf_section_data (sec)->relocs = relstart;
7603
3f764659 7604 new_contents = sec->contents;
3f764659
JJ
7605 if (add_aux_fields)
7606 {
7607 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7608 if (new_contents == NULL)
7609 return FALSE;
7610 need_pad = FALSE;
3f764659 7611 }
b4f4e59f
AM
7612 wptr = new_contents;
7613 rptr = sec->contents;
3f764659 7614
1e2f5b6e 7615 write_rel = relstart;
b34976b6 7616 skip = FALSE;
1e2f5b6e 7617 offset = 0;
3f764659 7618 opd_ent_size = 0;
1e2f5b6e
AM
7619 for (rel = relstart; rel < relend; rel++)
7620 {
50bc7936
AM
7621 unsigned long r_symndx;
7622 asection *sym_sec;
7623 struct elf_link_hash_entry *h;
7624 Elf_Internal_Sym *sym;
7625
7626 r_symndx = ELF64_R_SYM (rel->r_info);
7627 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 7628 r_symndx, ibfd))
50bc7936
AM
7629 goto error_ret;
7630
1e2f5b6e
AM
7631 if (rel->r_offset == offset)
7632 {
50bc7936 7633 struct ppc_link_hash_entry *fdh = NULL;
3f764659
JJ
7634
7635 /* See if the .opd entry is full 24 byte or
7636 16 byte (with fd_aux entry overlapped with next
7637 fd_func). */
7638 opd_ent_size = 24;
7639 if ((rel + 2 == relend && sec->size == offset + 16)
7640 || (rel + 3 < relend
7641 && rel[2].r_offset == offset + 16
7642 && rel[3].r_offset == offset + 24
7643 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
7644 && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
7645 opd_ent_size = 16;
7646
4025353c
AM
7647 if (h != NULL
7648 && h->root.root.string[0] == '.')
c4f68ce3 7649 {
4dfe6ac6
NC
7650 struct ppc_link_hash_table *htab;
7651
7652 htab = ppc_hash_table (info);
7653 if (htab != NULL)
7654 fdh = lookup_fdh ((struct ppc_link_hash_entry *) h,
7655 htab);
c4f68ce3
AM
7656 if (fdh != NULL
7657 && fdh->elf.root.type != bfd_link_hash_defined
7658 && fdh->elf.root.type != bfd_link_hash_defweak)
7659 fdh = NULL;
7660 }
1e2f5b6e 7661
51020317
AM
7662 skip = (sym_sec->owner != ibfd
7663 || sym_sec->output_section == bfd_abs_section_ptr);
a4aa0fb7
AM
7664 if (skip)
7665 {
4025353c 7666 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7
AM
7667 {
7668 /* Arrange for the function descriptor sym
7669 to be dropped. */
d6fe2dc1
AM
7670 fdh->elf.root.u.def.value = 0;
7671 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 7672 }
74f0fb50 7673 opd->adjust[rel->r_offset / 8] = -1;
a4aa0fb7
AM
7674 }
7675 else
1e2f5b6e
AM
7676 {
7677 /* We'll be keeping this opd entry. */
7678
4025353c 7679 if (fdh != NULL)
1e2f5b6e 7680 {
754021d0
AM
7681 /* Redefine the function descriptor symbol to
7682 this location in the opd section. It is
7683 necessary to update the value here rather
7684 than using an array of adjustments as we do
7685 for local symbols, because various places
7686 in the generic ELF code use the value
7687 stored in u.def.value. */
3f764659 7688 fdh->elf.root.u.def.value = wptr - new_contents;
754021d0 7689 fdh->adjust_done = 1;
1e2f5b6e 7690 }
754021d0
AM
7691
7692 /* Local syms are a bit tricky. We could
7693 tweak them as they can be cached, but
7694 we'd need to look through the local syms
7695 for the function descriptor sym which we
7696 don't have at the moment. So keep an
7697 array of adjustments. */
74f0fb50 7698 opd->adjust[rel->r_offset / 8]
3f764659 7699 = (wptr - new_contents) - (rptr - sec->contents);
1e2f5b6e
AM
7700
7701 if (wptr != rptr)
3f764659
JJ
7702 memcpy (wptr, rptr, opd_ent_size);
7703 wptr += opd_ent_size;
7704 if (add_aux_fields && opd_ent_size == 16)
7705 {
7706 memset (wptr, '\0', 8);
7707 wptr += 8;
7708 }
1e2f5b6e 7709 }
3f764659
JJ
7710 rptr += opd_ent_size;
7711 offset += opd_ent_size;
1e2f5b6e
AM
7712 }
7713
50bc7936
AM
7714 if (skip)
7715 {
60124e18
AM
7716 if (!NO_OPD_RELOCS
7717 && !info->relocatable
18d944df 7718 && !dec_dynrel_count (rel->r_info, sec, info,
19e08130 7719 NULL, h, sym))
8c1d1bb8 7720 goto error_ret;
50bc7936
AM
7721 }
7722 else
1e2f5b6e 7723 {
50bc7936
AM
7724 /* We need to adjust any reloc offsets to point to the
7725 new opd entries. While we're at it, we may as well
7726 remove redundant relocs. */
74f0fb50 7727 rel->r_offset += opd->adjust[(offset - opd_ent_size) / 8];
1e2f5b6e
AM
7728 if (write_rel != rel)
7729 memcpy (write_rel, rel, sizeof (*rel));
7730 ++write_rel;
7731 }
7732 }
7733
3f764659 7734 sec->size = wptr - new_contents;
1e2f5b6e 7735 sec->reloc_count = write_rel - relstart;
3f764659
JJ
7736 if (add_aux_fields)
7737 {
7738 free (sec->contents);
7739 sec->contents = new_contents;
7740 }
7741
05bf9422 7742 /* Fudge the header size too, as this is used later in
cdcf6e38 7743 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
7744 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7745 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
754021d0 7746 some_edited = TRUE;
1e2f5b6e 7747 }
6cdc0ccc 7748 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 7749 free (relstart);
6cdc0ccc 7750
411e1bfb
AM
7751 if (local_syms != NULL
7752 && symtab_hdr->contents != (unsigned char *) local_syms)
7753 {
7754 if (!info->keep_memory)
7755 free (local_syms);
7756 else
7757 symtab_hdr->contents = (unsigned char *) local_syms;
7758 }
7759 }
7760
754021d0
AM
7761 if (some_edited)
7762 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7763
3f764659
JJ
7764 /* If we are doing a final link and the last .opd entry is just 16 byte
7765 long, add a 8 byte padding after it. */
7766 if (need_pad != NULL && !info->relocatable)
7767 {
7768 bfd_byte *p;
7769
7770 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7771 {
7772 BFD_ASSERT (need_pad->size > 0);
7773
7774 p = bfd_malloc (need_pad->size + 8);
7775 if (p == NULL)
7776 return FALSE;
699733f6 7777
3f764659
JJ
7778 if (! bfd_get_section_contents (need_pad->owner, need_pad,
7779 p, 0, need_pad->size))
7780 return FALSE;
7781
7782 need_pad->contents = p;
7783 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7784 }
7785 else
7786 {
7787 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7788 if (p == NULL)
7789 return FALSE;
7790
7791 need_pad->contents = p;
7792 }
7793
7794 memset (need_pad->contents + need_pad->size, 0, 8);
7795 need_pad->size += 8;
7796 }
7797
411e1bfb
AM
7798 return TRUE;
7799}
7800
e1918d23 7801/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 7802
e1918d23 7803asection *
33c0ec9d
AM
7804ppc64_elf_tls_setup (struct bfd_link_info *info,
7805 int no_tls_get_addr_opt,
7806 int *no_multi_toc)
411e1bfb 7807{
411e1bfb
AM
7808 struct ppc_link_hash_table *htab;
7809
411e1bfb 7810 htab = ppc_hash_table (info);
4dfe6ac6
NC
7811 if (htab == NULL)
7812 return NULL;
7813
ee67d69a
AM
7814 if (abiversion (info->output_bfd) == 1)
7815 htab->opd_abi = 1;
7816
33c0ec9d
AM
7817 if (*no_multi_toc)
7818 htab->do_multi_toc = 0;
7819 else if (!htab->do_multi_toc)
7820 *no_multi_toc = 1;
7821
3a71aa26
AM
7822 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7823 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7824 FALSE, FALSE, TRUE));
a7f2871e
AM
7825 /* Move dynamic linking info to the function descriptor sym. */
7826 if (htab->tls_get_addr != NULL)
7827 func_desc_adjust (&htab->tls_get_addr->elf, info);
3a71aa26
AM
7828 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7829 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7830 FALSE, FALSE, TRUE));
a7f2871e
AM
7831 if (!no_tls_get_addr_opt)
7832 {
7833 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
7834
7835 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7836 FALSE, FALSE, TRUE);
7837 if (opt != NULL)
7838 func_desc_adjust (opt, info);
7839 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7840 FALSE, FALSE, TRUE);
7841 if (opt_fd != NULL
7842 && (opt_fd->root.type == bfd_link_hash_defined
7843 || opt_fd->root.type == bfd_link_hash_defweak))
7844 {
7845 /* If glibc supports an optimized __tls_get_addr call stub,
7846 signalled by the presence of __tls_get_addr_opt, and we'll
7847 be calling __tls_get_addr via a plt call stub, then
7848 make __tls_get_addr point to __tls_get_addr_opt. */
7849 tga_fd = &htab->tls_get_addr_fd->elf;
7850 if (htab->elf.dynamic_sections_created
7851 && tga_fd != NULL
7852 && (tga_fd->type == STT_FUNC
7853 || tga_fd->needs_plt)
7854 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
7855 || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
7856 && tga_fd->root.type == bfd_link_hash_undefweak)))
7857 {
7858 struct plt_entry *ent;
7859
7860 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7861 if (ent->plt.refcount > 0)
7862 break;
7863 if (ent != NULL)
7864 {
7865 tga_fd->root.type = bfd_link_hash_indirect;
7866 tga_fd->root.u.i.link = &opt_fd->root;
7867 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
7868 if (opt_fd->dynindx != -1)
7869 {
7870 /* Use __tls_get_addr_opt in dynamic relocations. */
7871 opt_fd->dynindx = -1;
7872 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7873 opt_fd->dynstr_index);
7874 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
854b41e7 7875 return NULL;
a7f2871e
AM
7876 }
7877 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
7878 tga = &htab->tls_get_addr->elf;
7879 if (opt != NULL && tga != NULL)
7880 {
7881 tga->root.type = bfd_link_hash_indirect;
7882 tga->root.u.i.link = &opt->root;
7883 ppc64_elf_copy_indirect_symbol (info, opt, tga);
7884 _bfd_elf_link_hash_hide_symbol (info, opt,
7885 tga->forced_local);
7886 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
7887 }
7888 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7889 htab->tls_get_addr_fd->is_func_descriptor = 1;
7890 if (htab->tls_get_addr != NULL)
7891 {
7892 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7893 htab->tls_get_addr->is_func = 1;
7894 }
7895 }
7896 }
7897 }
7898 else
7899 no_tls_get_addr_opt = TRUE;
7900 }
7901 htab->no_tls_get_addr_opt = no_tls_get_addr_opt;
33c0ec9d 7902 return _bfd_elf_tls_setup (info->output_bfd, info);
3a71aa26 7903}
8387904d 7904
3a71aa26
AM
7905/* Return TRUE iff REL is a branch reloc with a global symbol matching
7906 HASH1 or HASH2. */
8387904d 7907
3a71aa26
AM
7908static bfd_boolean
7909branch_reloc_hash_match (const bfd *ibfd,
7910 const Elf_Internal_Rela *rel,
7911 const struct ppc_link_hash_entry *hash1,
7912 const struct ppc_link_hash_entry *hash2)
7913{
7914 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7915 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7916 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7917
e054468f 7918 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 7919 {
3a71aa26
AM
7920 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7921 struct elf_link_hash_entry *h;
8387904d 7922
3a71aa26 7923 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7924 h = elf_follow_link (h);
3a71aa26
AM
7925 if (h == &hash1->elf || h == &hash2->elf)
7926 return TRUE;
a48ebf4d 7927 }
3a71aa26 7928 return FALSE;
951fd09b 7929}
411e1bfb 7930
951fd09b
AM
7931/* Run through all the TLS relocs looking for optimization
7932 opportunities. The linker has been hacked (see ppc64elf.em) to do
7933 a preliminary section layout so that we know the TLS segment
7934 offsets. We can't optimize earlier because some optimizations need
7935 to know the tp offset, and we need to optimize before allocating
7936 dynamic relocations. */
7937
7938bfd_boolean
33c0ec9d 7939ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
7940{
7941 bfd *ibfd;
7942 asection *sec;
7943 struct ppc_link_hash_table *htab;
663a1470 7944 unsigned char *toc_ref;
102890f0 7945 int pass;
951fd09b 7946
1d483afe 7947 if (info->relocatable || !info->executable)
411e1bfb
AM
7948 return TRUE;
7949
951fd09b 7950 htab = ppc_hash_table (info);
4dfe6ac6
NC
7951 if (htab == NULL)
7952 return FALSE;
7953
663a1470
AM
7954 /* Make two passes over the relocs. On the first pass, mark toc
7955 entries involved with tls relocs, and check that tls relocs
7956 involved in setting up a tls_get_addr call are indeed followed by
7957 such a call. If they are not, we can't do any tls optimization.
7958 On the second pass twiddle tls_mask flags to notify
7959 relocate_section that optimization can be done, and adjust got
7960 and plt refcounts. */
7961 toc_ref = NULL;
7962 for (pass = 0; pass < 2; ++pass)
7963 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7964 {
7965 Elf_Internal_Sym *locsyms = NULL;
7966 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7967
102890f0
AM
7968 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7969 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7970 {
7971 Elf_Internal_Rela *relstart, *rel, *relend;
663a1470 7972 bfd_boolean found_tls_get_addr_arg = 0;
411e1bfb 7973
102890f0
AM
7974 /* Read the relocations. */
7975 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7976 info->keep_memory);
7977 if (relstart == NULL)
7978 return FALSE;
411e1bfb 7979
102890f0
AM
7980 relend = relstart + sec->reloc_count;
7981 for (rel = relstart; rel < relend; rel++)
7982 {
7983 enum elf_ppc64_reloc_type r_type;
7984 unsigned long r_symndx;
7985 struct elf_link_hash_entry *h;
7986 Elf_Internal_Sym *sym;
7987 asection *sym_sec;
f961d9dd
AM
7988 unsigned char *tls_mask;
7989 unsigned char tls_set, tls_clear, tls_type = 0;
102890f0
AM
7990 bfd_vma value;
7991 bfd_boolean ok_tprel, is_local;
7992 long toc_ref_index = 0;
7993 int expecting_tls_get_addr = 0;
663a1470 7994 bfd_boolean ret = FALSE;
411e1bfb 7995
102890f0
AM
7996 r_symndx = ELF64_R_SYM (rel->r_info);
7997 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
7998 r_symndx, ibfd))
7999 {
8000 err_free_rel:
8001 if (elf_section_data (sec)->relocs != relstart)
8002 free (relstart);
8003 if (toc_ref != NULL)
8004 free (toc_ref);
8005 if (locsyms != NULL
0ffa91dd 8006 && (elf_symtab_hdr (ibfd).contents
102890f0
AM
8007 != (unsigned char *) locsyms))
8008 free (locsyms);
663a1470 8009 return ret;
102890f0 8010 }
411e1bfb 8011
102890f0
AM
8012 if (h != NULL)
8013 {
766bc656
AM
8014 if (h->root.type == bfd_link_hash_defined
8015 || h->root.type == bfd_link_hash_defweak)
8016 value = h->root.u.def.value;
8017 else if (h->root.type == bfd_link_hash_undefweak)
8018 value = 0;
8019 else
663a1470
AM
8020 {
8021 found_tls_get_addr_arg = 0;
8022 continue;
8023 }
102890f0
AM
8024 }
8025 else
8026 /* Symbols referenced by TLS relocs must be of type
8027 STT_TLS. So no need for .opd local sym adjust. */
8028 value = sym->st_value;
8029
8030 ok_tprel = FALSE;
8031 is_local = FALSE;
8032 if (h == NULL
8033 || !h->def_dynamic)
8034 {
8035 is_local = TRUE;
766bc656
AM
8036 if (h != NULL
8037 && h->root.type == bfd_link_hash_undefweak)
8038 ok_tprel = TRUE;
8039 else
8040 {
8041 value += sym_sec->output_offset;
8042 value += sym_sec->output_section->vma;
8043 value -= htab->elf.tls_sec->vma;
8044 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8045 < (bfd_vma) 1 << 32);
8046 }
102890f0 8047 }
951fd09b 8048
102890f0 8049 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
8050 /* If this section has old-style __tls_get_addr calls
8051 without marker relocs, then check that each
8052 __tls_get_addr call reloc is preceded by a reloc
8053 that conceivably belongs to the __tls_get_addr arg
8054 setup insn. If we don't find matching arg setup
8055 relocs, don't do any tls optimization. */
8056 if (pass == 0
8057 && sec->has_tls_get_addr_call
8058 && h != NULL
8059 && (h == &htab->tls_get_addr->elf
8060 || h == &htab->tls_get_addr_fd->elf)
8061 && !found_tls_get_addr_arg
8062 && is_branch_reloc (r_type))
8063 {
25f53a85 8064 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
8065 "TLS optimization disabled\n"),
8066 ibfd, sec, rel->r_offset);
8067 ret = TRUE;
8068 goto err_free_rel;
8069 }
8070
8071 found_tls_get_addr_arg = 0;
102890f0
AM
8072 switch (r_type)
8073 {
8074 case R_PPC64_GOT_TLSLD16:
8075 case R_PPC64_GOT_TLSLD16_LO:
8076 expecting_tls_get_addr = 1;
663a1470 8077 found_tls_get_addr_arg = 1;
102890f0
AM
8078 /* Fall thru */
8079
8080 case R_PPC64_GOT_TLSLD16_HI:
8081 case R_PPC64_GOT_TLSLD16_HA:
8082 /* These relocs should never be against a symbol
8083 defined in a shared lib. Leave them alone if
8084 that turns out to be the case. */
8085 if (!is_local)
8086 continue;
411e1bfb 8087
102890f0 8088 /* LD -> LE */
411e1bfb 8089 tls_set = 0;
102890f0
AM
8090 tls_clear = TLS_LD;
8091 tls_type = TLS_TLS | TLS_LD;
8092 break;
411e1bfb 8093
102890f0
AM
8094 case R_PPC64_GOT_TLSGD16:
8095 case R_PPC64_GOT_TLSGD16_LO:
8096 expecting_tls_get_addr = 1;
663a1470 8097 found_tls_get_addr_arg = 1;
102890f0
AM
8098 /* Fall thru */
8099
8100 case R_PPC64_GOT_TLSGD16_HI:
8101 case R_PPC64_GOT_TLSGD16_HA:
8102 if (ok_tprel)
8103 /* GD -> LE */
411e1bfb 8104 tls_set = 0;
102890f0
AM
8105 else
8106 /* GD -> IE */
8107 tls_set = TLS_TLS | TLS_TPRELGD;
8108 tls_clear = TLS_GD;
8109 tls_type = TLS_TLS | TLS_GD;
8110 break;
8111
8112 case R_PPC64_GOT_TPREL16_DS:
8113 case R_PPC64_GOT_TPREL16_LO_DS:
8114 case R_PPC64_GOT_TPREL16_HI:
8115 case R_PPC64_GOT_TPREL16_HA:
8116 if (ok_tprel)
8117 {
8118 /* IE -> LE */
8119 tls_set = 0;
8120 tls_clear = TLS_TPREL;
8121 tls_type = TLS_TLS | TLS_TPREL;
8122 break;
8123 }
411e1bfb
AM
8124 continue;
8125
727fc41e
AM
8126 case R_PPC64_TLSGD:
8127 case R_PPC64_TLSLD:
663a1470
AM
8128 found_tls_get_addr_arg = 1;
8129 /* Fall thru */
8130
8131 case R_PPC64_TLS:
8132 case R_PPC64_TOC16:
8133 case R_PPC64_TOC16_LO:
102890f0
AM
8134 if (sym_sec == NULL || sym_sec != toc)
8135 continue;
8136
8137 /* Mark this toc entry as referenced by a TLS
8138 code sequence. We can do that now in the
8139 case of R_PPC64_TLS, and after checking for
8140 tls_get_addr for the TOC16 relocs. */
8141 if (toc_ref == NULL)
663a1470
AM
8142 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8143 if (toc_ref == NULL)
8144 goto err_free_rel;
8145
102890f0
AM
8146 if (h != NULL)
8147 value = h->root.u.def.value;
8148 else
8149 value = sym->st_value;
8150 value += rel->r_addend;
8151 BFD_ASSERT (value < toc->size && value % 8 == 0);
663a1470 8152 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
8153 if (r_type == R_PPC64_TLS
8154 || r_type == R_PPC64_TLSGD
8155 || r_type == R_PPC64_TLSLD)
102890f0
AM
8156 {
8157 toc_ref[toc_ref_index] = 1;
8158 continue;
8159 }
8160
8161 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8162 continue;
8163
8164 tls_set = 0;
8165 tls_clear = 0;
8166 expecting_tls_get_addr = 2;
8167 break;
8168
8169 case R_PPC64_TPREL64:
8170 if (pass == 0
8171 || sec != toc
8172 || toc_ref == NULL
663a1470 8173 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8174 continue;
8175 if (ok_tprel)
8176 {
8177 /* IE -> LE */
8178 tls_set = TLS_EXPLICIT;
8179 tls_clear = TLS_TPREL;
8180 break;
8181 }
8182 continue;
8183
8184 case R_PPC64_DTPMOD64:
8185 if (pass == 0
8186 || sec != toc
8187 || toc_ref == NULL
663a1470 8188 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8189 continue;
8190 if (rel + 1 < relend
8191 && (rel[1].r_info
8192 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8193 && rel[1].r_offset == rel->r_offset + 8)
8194 {
8195 if (ok_tprel)
8196 /* GD -> LE */
8197 tls_set = TLS_EXPLICIT | TLS_GD;
8198 else
8199 /* GD -> IE */
8200 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8201 tls_clear = TLS_GD;
8202 }
8203 else
8204 {
8205 if (!is_local)
8206 continue;
8207
8208 /* LD -> LE */
8209 tls_set = TLS_EXPLICIT;
8210 tls_clear = TLS_LD;
8211 }
8212 break;
8213
8214 default:
8215 continue;
8216 }
8217
8218 if (pass == 0)
8219 {
727fc41e
AM
8220 if (!expecting_tls_get_addr
8221 || !sec->has_tls_get_addr_call)
102890f0
AM
8222 continue;
8223
3a71aa26
AM
8224 if (rel + 1 < relend
8225 && branch_reloc_hash_match (ibfd, rel + 1,
8226 htab->tls_get_addr,
8227 htab->tls_get_addr_fd))
102890f0 8228 {
3a71aa26 8229 if (expecting_tls_get_addr == 2)
102890f0 8230 {
3a71aa26 8231 /* Check for toc tls entries. */
f961d9dd 8232 unsigned char *toc_tls;
3a71aa26
AM
8233 int retval;
8234
8235 retval = get_tls_mask (&toc_tls, NULL, NULL,
8236 &locsyms,
8237 rel, ibfd);
8238 if (retval == 0)
8239 goto err_free_rel;
663a1470
AM
8240 if (toc_tls != NULL)
8241 {
8242 if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
8243 found_tls_get_addr_arg = 1;
8244 if (retval > 1)
8245 toc_ref[toc_ref_index] = 1;
8246 }
102890f0 8247 }
3a71aa26 8248 continue;
102890f0
AM
8249 }
8250
8251 if (expecting_tls_get_addr != 1)
8252 continue;
8253
8254 /* Uh oh, we didn't find the expected call. We
8255 could just mark this symbol to exclude it
8256 from tls optimization but it's safer to skip
663a1470 8257 the entire optimization. */
25f53a85 8258 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8259 "TLS optimization disabled\n"),
8260 ibfd, sec, rel->r_offset);
8261 ret = TRUE;
8262 goto err_free_rel;
102890f0
AM
8263 }
8264
85f7a9cb 8265 if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
102890f0
AM
8266 {
8267 struct plt_entry *ent;
8268 for (ent = htab->tls_get_addr->elf.plt.plist;
8269 ent != NULL;
8270 ent = ent->next)
8271 if (ent->addend == 0)
411e1bfb 8272 {
102890f0 8273 if (ent->plt.refcount > 0)
30038c59 8274 {
102890f0
AM
8275 ent->plt.refcount -= 1;
8276 expecting_tls_get_addr = 0;
30038c59 8277 }
102890f0 8278 break;
411e1bfb 8279 }
102890f0 8280 }
411e1bfb 8281
85f7a9cb 8282 if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
102890f0
AM
8283 {
8284 struct plt_entry *ent;
8285 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8286 ent != NULL;
8287 ent = ent->next)
8288 if (ent->addend == 0)
411e1bfb 8289 {
102890f0
AM
8290 if (ent->plt.refcount > 0)
8291 ent->plt.refcount -= 1;
8292 break;
411e1bfb 8293 }
102890f0 8294 }
411e1bfb 8295
102890f0 8296 if (tls_clear == 0)
30038c59
AM
8297 continue;
8298
102890f0
AM
8299 if ((tls_set & TLS_EXPLICIT) == 0)
8300 {
8301 struct got_entry *ent;
411e1bfb 8302
102890f0
AM
8303 /* Adjust got entry for this reloc. */
8304 if (h != NULL)
8305 ent = h->got.glist;
8306 else
8307 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 8308
102890f0
AM
8309 for (; ent != NULL; ent = ent->next)
8310 if (ent->addend == rel->r_addend
8311 && ent->owner == ibfd
8312 && ent->tls_type == tls_type)
8313 break;
8314 if (ent == NULL)
8315 abort ();
411e1bfb 8316
102890f0
AM
8317 if (tls_set == 0)
8318 {
8319 /* We managed to get rid of a got entry. */
8320 if (ent->got.refcount > 0)
8321 ent->got.refcount -= 1;
8322 }
8323 }
8324 else
8325 {
8326 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8327 we'll lose one or two dyn relocs. */
8328 if (!dec_dynrel_count (rel->r_info, sec, info,
19e08130 8329 NULL, h, sym))
102890f0 8330 return FALSE;
411e1bfb 8331
102890f0
AM
8332 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8333 {
8334 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
19e08130 8335 NULL, h, sym))
102890f0
AM
8336 return FALSE;
8337 }
8338 }
411e1bfb 8339
102890f0
AM
8340 *tls_mask |= tls_set;
8341 *tls_mask &= ~tls_clear;
8342 }
8c1d1bb8 8343
102890f0
AM
8344 if (elf_section_data (sec)->relocs != relstart)
8345 free (relstart);
8346 }
411e1bfb 8347
663a1470
AM
8348 if (locsyms != NULL
8349 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8350 {
8351 if (!info->keep_memory)
8352 free (locsyms);
8353 else
8354 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8355 }
8356 }
411e1bfb 8357
663a1470
AM
8358 if (toc_ref != NULL)
8359 free (toc_ref);
b34976b6 8360 return TRUE;
1e2f5b6e 8361}
b34976b6 8362
c5614fa4
AM
8363/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8364 the values of any global symbols in a toc section that has been
8365 edited. Globals in toc sections should be a rarity, so this function
8366 sets a flag if any are found in toc sections other than the one just
8367 edited, so that futher hash table traversals can be avoided. */
8368
8369struct adjust_toc_info
8370{
8371 asection *toc;
8372 unsigned long *skip;
8373 bfd_boolean global_toc_syms;
8374};
8375
ba761f19
AM
8376enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8377
c5614fa4
AM
8378static bfd_boolean
8379adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8380{
8381 struct ppc_link_hash_entry *eh;
8382 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 8383 unsigned long i;
c5614fa4 8384
c5614fa4
AM
8385 if (h->root.type != bfd_link_hash_defined
8386 && h->root.type != bfd_link_hash_defweak)
8387 return TRUE;
8388
8389 eh = (struct ppc_link_hash_entry *) h;
8390 if (eh->adjust_done)
8391 return TRUE;
8392
8393 if (eh->elf.root.u.def.section == toc_inf->toc)
8394 {
854b41e7
AM
8395 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8396 i = toc_inf->toc->rawsize >> 3;
c5614fa4 8397 else
854b41e7
AM
8398 i = eh->elf.root.u.def.value >> 3;
8399
ba761f19 8400 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4
AM
8401 {
8402 (*_bfd_error_handler)
854b41e7
AM
8403 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8404 do
8405 ++i;
ba761f19 8406 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 8407 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 8408 }
854b41e7
AM
8409
8410 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
8411 eh->adjust_done = 1;
8412 }
8413 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8414 toc_inf->global_toc_syms = TRUE;
8415
8416 return TRUE;
8417}
8418
560c8763
AM
8419/* Return TRUE iff INSN is one we expect on a _LO variety toc/got reloc. */
8420
8421static bfd_boolean
8422ok_lo_toc_insn (unsigned int insn)
8423{
8424 return ((insn & (0x3f << 26)) == 14u << 26 /* addi */
8425 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8426 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8427 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8428 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8429 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8430 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8431 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8432 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8433 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8434 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8435 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8436 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8437 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8438 || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8439 && (insn & 3) != 1)
8440 || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8441 && ((insn & 3) == 0 || (insn & 3) == 3))
8442 || (insn & (0x3f << 26)) == 12u << 26 /* addic */);
8443}
8444
c5614fa4
AM
8445/* Examine all relocs referencing .toc sections in order to remove
8446 unused .toc entries. */
8447
8448bfd_boolean
33c0ec9d 8449ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
8450{
8451 bfd *ibfd;
8452 struct adjust_toc_info toc_inf;
67f0cbdb 8453 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 8454
67f0cbdb 8455 htab->do_toc_opt = 1;
c5614fa4
AM
8456 toc_inf.global_toc_syms = TRUE;
8457 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8458 {
8459 asection *toc, *sec;
8460 Elf_Internal_Shdr *symtab_hdr;
8461 Elf_Internal_Sym *local_syms;
425b145b 8462 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
8463 unsigned long *skip, *drop;
8464 unsigned char *used;
8465 unsigned char *keep, last, some_unused;
8466
854b41e7
AM
8467 if (!is_ppc64_elf (ibfd))
8468 continue;
8469
c5614fa4
AM
8470 toc = bfd_get_section_by_name (ibfd, ".toc");
8471 if (toc == NULL
92b7a70f 8472 || toc->size == 0
dbaa2011
AM
8473 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8474 || discarded_section (toc))
c5614fa4
AM
8475 continue;
8476
425b145b 8477 toc_relocs = NULL;
c5614fa4 8478 local_syms = NULL;
0ffa91dd 8479 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
8480
8481 /* Look at sections dropped from the final link. */
8482 skip = NULL;
8483 relstart = NULL;
8484 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8485 {
8486 if (sec->reloc_count == 0
dbaa2011 8487 || !discarded_section (sec)
c5614fa4
AM
8488 || get_opd_info (sec)
8489 || (sec->flags & SEC_ALLOC) == 0
8490 || (sec->flags & SEC_DEBUGGING) != 0)
8491 continue;
8492
8493 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8494 if (relstart == NULL)
8495 goto error_ret;
8496
8497 /* Run through the relocs to see which toc entries might be
8498 unused. */
8499 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8500 {
8501 enum elf_ppc64_reloc_type r_type;
8502 unsigned long r_symndx;
8503 asection *sym_sec;
8504 struct elf_link_hash_entry *h;
8505 Elf_Internal_Sym *sym;
8506 bfd_vma val;
8507
8508 r_type = ELF64_R_TYPE (rel->r_info);
8509 switch (r_type)
8510 {
8511 default:
8512 continue;
8513
8514 case R_PPC64_TOC16:
8515 case R_PPC64_TOC16_LO:
8516 case R_PPC64_TOC16_HI:
8517 case R_PPC64_TOC16_HA:
8518 case R_PPC64_TOC16_DS:
8519 case R_PPC64_TOC16_LO_DS:
8520 break;
8521 }
8522
8523 r_symndx = ELF64_R_SYM (rel->r_info);
8524 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8525 r_symndx, ibfd))
8526 goto error_ret;
8527
8528 if (sym_sec != toc)
8529 continue;
8530
8531 if (h != NULL)
8532 val = h->root.u.def.value;
8533 else
8534 val = sym->st_value;
8535 val += rel->r_addend;
8536
8537 if (val >= toc->size)
8538 continue;
8539
8540 /* Anything in the toc ought to be aligned to 8 bytes.
8541 If not, don't mark as unused. */
8542 if (val & 7)
8543 continue;
8544
8545 if (skip == NULL)
8546 {
854b41e7 8547 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
8548 if (skip == NULL)
8549 goto error_ret;
8550 }
8551
ba761f19 8552 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
8553 }
8554
8555 if (elf_section_data (sec)->relocs != relstart)
8556 free (relstart);
8557 }
8558
ba761f19
AM
8559 /* For largetoc loads of address constants, we can convert
8560 . addis rx,2,addr@got@ha
8561 . ld ry,addr@got@l(rx)
8562 to
8563 . addis rx,2,addr@toc@ha
8564 . addi ry,rx,addr@toc@l
8565 when addr is within 2G of the toc pointer. This then means
8566 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 8567
ba761f19
AM
8568 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8569 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8570 && toc->reloc_count != 0)
8571 {
8572 /* Read toc relocs. */
425b145b
AM
8573 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8574 info->keep_memory);
8575 if (toc_relocs == NULL)
ba761f19
AM
8576 goto error_ret;
8577
425b145b 8578 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
8579 {
8580 enum elf_ppc64_reloc_type r_type;
8581 unsigned long r_symndx;
8582 asection *sym_sec;
8583 struct elf_link_hash_entry *h;
8584 Elf_Internal_Sym *sym;
8585 bfd_vma val, addr;
8586
8587 r_type = ELF64_R_TYPE (rel->r_info);
8588 if (r_type != R_PPC64_ADDR64)
8589 continue;
8590
8591 r_symndx = ELF64_R_SYM (rel->r_info);
8592 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8593 r_symndx, ibfd))
8594 goto error_ret;
8595
425b145b 8596 if (sym_sec == NULL
dbaa2011 8597 || discarded_section (sym_sec))
425b145b
AM
8598 continue;
8599
726d3ab0 8600 if (!SYMBOL_CALLS_LOCAL (info, h))
ba761f19
AM
8601 continue;
8602
8603 if (h != NULL)
bddc25c9
AM
8604 {
8605 if (h->type == STT_GNU_IFUNC)
8606 continue;
8607 val = h->root.u.def.value;
8608 }
ba761f19 8609 else
bddc25c9
AM
8610 {
8611 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8612 continue;
8613 val = sym->st_value;
8614 }
ba761f19
AM
8615 val += rel->r_addend;
8616 val += sym_sec->output_section->vma + sym_sec->output_offset;
8617
8618 /* We don't yet know the exact toc pointer value, but we
8619 know it will be somewhere in the toc section. Don't
8620 optimize if the difference from any possible toc
8621 pointer is outside [ff..f80008000, 7fff7fff]. */
8622 addr = toc->output_section->vma + TOC_BASE_OFF;
8623 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8624 continue;
8625
8626 addr = toc->output_section->vma + toc->output_section->rawsize;
8627 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8628 continue;
8629
8630 if (skip == NULL)
8631 {
8632 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8633 if (skip == NULL)
8634 goto error_ret;
8635 }
8636
8637 skip[rel->r_offset >> 3]
425b145b 8638 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 8639 }
ba761f19
AM
8640 }
8641
c5614fa4
AM
8642 if (skip == NULL)
8643 continue;
8644
8645 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8646 if (used == NULL)
8647 {
8648 error_ret:
8649 if (local_syms != NULL
8650 && symtab_hdr->contents != (unsigned char *) local_syms)
8651 free (local_syms);
8652 if (sec != NULL
8653 && relstart != NULL
8654 && elf_section_data (sec)->relocs != relstart)
8655 free (relstart);
425b145b
AM
8656 if (toc_relocs != NULL
8657 && elf_section_data (toc)->relocs != toc_relocs)
8658 free (toc_relocs);
c5614fa4
AM
8659 if (skip != NULL)
8660 free (skip);
8661 return FALSE;
8662 }
8663
30038c59
AM
8664 /* Now check all kept sections that might reference the toc.
8665 Check the toc itself last. */
8666 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8667 : ibfd->sections);
c5614fa4 8668 sec != NULL;
c5614fa4 8669 sec = (sec == toc ? NULL
c5614fa4 8670 : sec->next == NULL ? toc
30038c59 8671 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
8672 : sec->next))
8673 {
8674 int repeat;
8675
8676 if (sec->reloc_count == 0
dbaa2011 8677 || discarded_section (sec)
c5614fa4
AM
8678 || get_opd_info (sec)
8679 || (sec->flags & SEC_ALLOC) == 0
8680 || (sec->flags & SEC_DEBUGGING) != 0)
8681 continue;
8682
854b41e7
AM
8683 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8684 info->keep_memory);
c5614fa4
AM
8685 if (relstart == NULL)
8686 goto error_ret;
8687
8688 /* Mark toc entries referenced as used. */
c5614fa4 8689 do
d4f1ee75
AM
8690 {
8691 repeat = 0;
8692 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8693 {
8694 enum elf_ppc64_reloc_type r_type;
8695 unsigned long r_symndx;
8696 asection *sym_sec;
8697 struct elf_link_hash_entry *h;
8698 Elf_Internal_Sym *sym;
8699 bfd_vma val;
8700 enum {no_check, check_lo, check_ha} insn_check;
98528052 8701
d4f1ee75
AM
8702 r_type = ELF64_R_TYPE (rel->r_info);
8703 switch (r_type)
8704 {
8705 default:
8706 insn_check = no_check;
8707 break;
98528052 8708
d4f1ee75
AM
8709 case R_PPC64_GOT_TLSLD16_HA:
8710 case R_PPC64_GOT_TLSGD16_HA:
8711 case R_PPC64_GOT_TPREL16_HA:
8712 case R_PPC64_GOT_DTPREL16_HA:
8713 case R_PPC64_GOT16_HA:
8714 case R_PPC64_TOC16_HA:
8715 insn_check = check_ha;
8716 break;
98528052 8717
d4f1ee75
AM
8718 case R_PPC64_GOT_TLSLD16_LO:
8719 case R_PPC64_GOT_TLSGD16_LO:
8720 case R_PPC64_GOT_TPREL16_LO_DS:
8721 case R_PPC64_GOT_DTPREL16_LO_DS:
8722 case R_PPC64_GOT16_LO:
8723 case R_PPC64_GOT16_LO_DS:
8724 case R_PPC64_TOC16_LO:
8725 case R_PPC64_TOC16_LO_DS:
8726 insn_check = check_lo;
8727 break;
8728 }
560c8763 8729
d4f1ee75
AM
8730 if (insn_check != no_check)
8731 {
8732 bfd_vma off = rel->r_offset & ~3;
8733 unsigned char buf[4];
8734 unsigned int insn;
c5614fa4 8735
d4f1ee75
AM
8736 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
8737 {
8738 free (used);
8739 goto error_ret;
8740 }
8741 insn = bfd_get_32 (ibfd, buf);
8742 if (insn_check == check_lo
8743 ? !ok_lo_toc_insn (insn)
8744 : ((insn & ((0x3f << 26) | 0x1f << 16))
8745 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
8746 {
8747 char str[12];
8748
8749 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
8750 sprintf (str, "%#08x", insn);
8751 info->callbacks->einfo
8752 (_("%P: %H: toc optimization is not supported for"
8753 " %s instruction.\n"),
8754 ibfd, sec, rel->r_offset & ~3, str);
8755 }
8756 }
c5614fa4 8757
d4f1ee75
AM
8758 switch (r_type)
8759 {
8760 case R_PPC64_TOC16:
8761 case R_PPC64_TOC16_LO:
8762 case R_PPC64_TOC16_HI:
8763 case R_PPC64_TOC16_HA:
8764 case R_PPC64_TOC16_DS:
8765 case R_PPC64_TOC16_LO_DS:
8766 /* In case we're taking addresses of toc entries. */
8767 case R_PPC64_ADDR64:
8768 break;
c5614fa4 8769
d4f1ee75
AM
8770 default:
8771 continue;
8772 }
c5614fa4 8773
d4f1ee75
AM
8774 r_symndx = ELF64_R_SYM (rel->r_info);
8775 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8776 r_symndx, ibfd))
8777 {
8778 free (used);
8779 goto error_ret;
8780 }
c5614fa4 8781
d4f1ee75
AM
8782 if (sym_sec != toc)
8783 continue;
c5614fa4 8784
d4f1ee75
AM
8785 if (h != NULL)
8786 val = h->root.u.def.value;
8787 else
8788 val = sym->st_value;
8789 val += rel->r_addend;
ba761f19 8790
d4f1ee75
AM
8791 if (val >= toc->size)
8792 continue;
ba761f19 8793
d4f1ee75
AM
8794 if ((skip[val >> 3] & can_optimize) != 0)
8795 {
8796 bfd_vma off;
8797 unsigned char opc;
8798
8799 switch (r_type)
8800 {
8801 case R_PPC64_TOC16_HA:
ba761f19 8802 break;
ba761f19 8803
d4f1ee75
AM
8804 case R_PPC64_TOC16_LO_DS:
8805 off = rel->r_offset;
8806 off += (bfd_big_endian (ibfd) ? -2 : 3);
8807 if (!bfd_get_section_contents (ibfd, sec, &opc,
8808 off, 1))
8809 {
8810 free (used);
8811 goto error_ret;
8812 }
8813 if ((opc & (0x3f << 2)) == (58u << 2))
8814 break;
8815 /* Fall thru */
ba761f19 8816
d4f1ee75
AM
8817 default:
8818 /* Wrong sort of reloc, or not a ld. We may
8819 as well clear ref_from_discarded too. */
8820 skip[val >> 3] = 0;
8821 }
8822 }
8823
8824 if (sec != toc)
8825 used[val >> 3] = 1;
8826 /* For the toc section, we only mark as used if this
8827 entry itself isn't unused. */
8828 else if ((used[rel->r_offset >> 3]
8829 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
8830 && !used[val >> 3])
8831 {
8832 /* Do all the relocs again, to catch reference
8833 chains. */
8834 repeat = 1;
8835 used[val >> 3] = 1;
8836 }
8837 }
8838 }
c5614fa4 8839 while (repeat);
854b41e7
AM
8840
8841 if (elf_section_data (sec)->relocs != relstart)
8842 free (relstart);
c5614fa4
AM
8843 }
8844
8845 /* Merge the used and skip arrays. Assume that TOC
8846 doublewords not appearing as either used or unused belong
8847 to to an entry more than one doubleword in size. */
8848 for (drop = skip, keep = used, last = 0, some_unused = 0;
8849 drop < skip + (toc->size + 7) / 8;
8850 ++drop, ++keep)
8851 {
8852 if (*keep)
8853 {
ba761f19
AM
8854 *drop &= ~ref_from_discarded;
8855 if ((*drop & can_optimize) != 0)
8856 some_unused = 1;
c5614fa4
AM
8857 last = 0;
8858 }
b140b010 8859 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
8860 {
8861 some_unused = 1;
ba761f19 8862 last = ref_from_discarded;
c5614fa4
AM
8863 }
8864 else
8865 *drop = last;
8866 }
8867
8868 free (used);
8869
8870 if (some_unused)
8871 {
8872 bfd_byte *contents, *src;
8873 unsigned long off;
d62b3684 8874 Elf_Internal_Sym *sym;
ba761f19 8875 bfd_boolean local_toc_syms = FALSE;
c5614fa4
AM
8876
8877 /* Shuffle the toc contents, and at the same time convert the
8878 skip array from booleans into offsets. */
8879 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8880 goto error_ret;
8881
8882 elf_section_data (toc)->this_hdr.contents = contents;
8883
8884 for (src = contents, off = 0, drop = skip;
8885 src < contents + toc->size;
8886 src += 8, ++drop)
8887 {
ba761f19
AM
8888 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
8889 off += 8;
c5614fa4
AM
8890 else if (off != 0)
8891 {
8892 *drop = off;
8893 memcpy (src - off, src, 8);
8894 }
8895 }
854b41e7 8896 *drop = off;
c5614fa4
AM
8897 toc->rawsize = toc->size;
8898 toc->size = src - contents - off;
8899
ba761f19
AM
8900 /* Adjust addends for relocs against the toc section sym,
8901 and optimize any accesses we can. */
c5614fa4
AM
8902 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8903 {
8904 if (sec->reloc_count == 0
dbaa2011 8905 || discarded_section (sec))
c5614fa4
AM
8906 continue;
8907
8908 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 8909 info->keep_memory);
c5614fa4
AM
8910 if (relstart == NULL)
8911 goto error_ret;
8912
8913 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8914 {
8915 enum elf_ppc64_reloc_type r_type;
8916 unsigned long r_symndx;
8917 asection *sym_sec;
8918 struct elf_link_hash_entry *h;
854b41e7 8919 bfd_vma val;
c5614fa4
AM
8920
8921 r_type = ELF64_R_TYPE (rel->r_info);
8922 switch (r_type)
8923 {
8924 default:
8925 continue;
8926
8927 case R_PPC64_TOC16:
8928 case R_PPC64_TOC16_LO:
8929 case R_PPC64_TOC16_HI:
8930 case R_PPC64_TOC16_HA:
8931 case R_PPC64_TOC16_DS:
8932 case R_PPC64_TOC16_LO_DS:
8933 case R_PPC64_ADDR64:
8934 break;
8935 }
8936
8937 r_symndx = ELF64_R_SYM (rel->r_info);
8938 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8939 r_symndx, ibfd))
8940 goto error_ret;
8941
ba761f19 8942 if (sym_sec != toc)
c5614fa4
AM
8943 continue;
8944
ba761f19
AM
8945 if (h != NULL)
8946 val = h->root.u.def.value;
8947 else
8948 {
8949 val = sym->st_value;
8950 if (val != 0)
8951 local_toc_syms = TRUE;
8952 }
8953
8954 val += rel->r_addend;
854b41e7
AM
8955
8956 if (val > toc->rawsize)
8957 val = toc->rawsize;
ba761f19
AM
8958 else if ((skip[val >> 3] & ref_from_discarded) != 0)
8959 continue;
8960 else if ((skip[val >> 3] & can_optimize) != 0)
8961 {
8962 Elf_Internal_Rela *tocrel
425b145b 8963 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
8964 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
8965
8966 switch (r_type)
8967 {
8968 case R_PPC64_TOC16_HA:
8969 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
8970 break;
8971
8972 case R_PPC64_TOC16_LO_DS:
8973 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
8974 break;
8975
8976 default:
28942f62
AM
8977 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
8978 ppc_howto_init ();
b140b010 8979 info->callbacks->einfo
bc30df16 8980 (_("%P: %H: %s references "
b140b010
AM
8981 "optimized away TOC entry\n"),
8982 ibfd, sec, rel->r_offset,
8983 ppc64_elf_howto_table[r_type]->name);
8984 bfd_set_error (bfd_error_bad_value);
8985 goto error_ret;
ba761f19
AM
8986 }
8987 rel->r_addend = tocrel->r_addend;
8988 elf_section_data (sec)->relocs = relstart;
8989 continue;
8990 }
8991
8992 if (h != NULL || sym->st_value != 0)
8993 continue;
854b41e7
AM
8994
8995 rel->r_addend -= skip[val >> 3];
8996 elf_section_data (sec)->relocs = relstart;
c5614fa4 8997 }
854b41e7
AM
8998
8999 if (elf_section_data (sec)->relocs != relstart)
9000 free (relstart);
c5614fa4
AM
9001 }
9002
9003 /* We shouldn't have local or global symbols defined in the TOC,
9004 but handle them anyway. */
df22d223
AM
9005 if (local_syms != NULL)
9006 for (sym = local_syms;
9007 sym < local_syms + symtab_hdr->sh_info;
9008 ++sym)
9009 if (sym->st_value != 0
9010 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9011 {
9012 unsigned long i;
854b41e7 9013
df22d223
AM
9014 if (sym->st_value > toc->rawsize)
9015 i = toc->rawsize >> 3;
9016 else
9017 i = sym->st_value >> 3;
854b41e7 9018
df22d223
AM
9019 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9020 {
9021 if (local_toc_syms)
9022 (*_bfd_error_handler)
9023 (_("%s defined on removed toc entry"),
9024 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9025 do
9026 ++i;
9027 while ((skip[i] & (ref_from_discarded | can_optimize)));
9028 sym->st_value = (bfd_vma) i << 3;
9029 }
d62b3684 9030
df22d223
AM
9031 sym->st_value -= skip[i];
9032 symtab_hdr->contents = (unsigned char *) local_syms;
9033 }
c5614fa4 9034
854b41e7 9035 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
9036 if (toc_inf.global_toc_syms)
9037 {
9038 toc_inf.toc = toc;
9039 toc_inf.skip = skip;
9040 toc_inf.global_toc_syms = FALSE;
9041 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9042 &toc_inf);
9043 }
854b41e7
AM
9044
9045 if (toc->reloc_count != 0)
9046 {
d4730f92 9047 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
9048 Elf_Internal_Rela *wrel;
9049 bfd_size_type sz;
9050
854b41e7 9051 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
9052 if (toc_relocs == NULL)
9053 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9054 info->keep_memory);
9055 if (toc_relocs == NULL)
9056 goto error_ret;
9057
425b145b
AM
9058 wrel = toc_relocs;
9059 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9060 if ((skip[rel->r_offset >> 3]
9061 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
9062 {
9063 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9064 wrel->r_info = rel->r_info;
9065 wrel->r_addend = rel->r_addend;
9066 ++wrel;
9067 }
9068 else if (!dec_dynrel_count (rel->r_info, toc, info,
9069 &local_syms, NULL, NULL))
9070 goto error_ret;
9071
425b145b
AM
9072 elf_section_data (toc)->relocs = toc_relocs;
9073 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
9074 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9075 sz = rel_hdr->sh_entsize;
9076 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9077 }
c5614fa4 9078 }
28be611c
AM
9079 else if (toc_relocs != NULL
9080 && elf_section_data (toc)->relocs != toc_relocs)
425b145b 9081 free (toc_relocs);
c5614fa4
AM
9082
9083 if (local_syms != NULL
9084 && symtab_hdr->contents != (unsigned char *) local_syms)
9085 {
9086 if (!info->keep_memory)
9087 free (local_syms);
9088 else
9089 symtab_hdr->contents = (unsigned char *) local_syms;
9090 }
9091 free (skip);
9092 }
9093
9094 return TRUE;
9095}
9096
1bbe0902
AM
9097/* Return true iff input section I references the TOC using
9098 instructions limited to +/-32k offsets. */
9099
9100bfd_boolean
9101ppc64_elf_has_small_toc_reloc (asection *i)
9102{
9103 return (is_ppc64_elf (i->owner)
9104 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9105}
9106
927be08e
AM
9107/* Allocate space for one GOT entry. */
9108
9109static void
9110allocate_got (struct elf_link_hash_entry *h,
9111 struct bfd_link_info *info,
9112 struct got_entry *gent)
9113{
9114 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9115 bfd_boolean dyn;
9116 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9117 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9118 ? 16 : 8);
9119 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9120 ? 2 : 1) * sizeof (Elf64_External_Rela);
9121 asection *got = ppc64_elf_tdata (gent->owner)->got;
9122
9123 gent->got.offset = got->size;
9124 got->size += entsize;
9125
9126 dyn = htab->elf.dynamic_sections_created;
19e08130 9127 if (h->type == STT_GNU_IFUNC)
927be08e 9128 {
19e08130
AM
9129 htab->reliplt->size += rentsize;
9130 htab->got_reli_size += rentsize;
927be08e 9131 }
19e08130
AM
9132 else if ((info->shared
9133 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
9134 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9135 || h->root.type != bfd_link_hash_undefweak))
927be08e 9136 {
19e08130 9137 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9138 relgot->size += rentsize;
927be08e
AM
9139 }
9140}
9141
7865406b
AM
9142/* This function merges got entries in the same toc group. */
9143
9144static void
9145merge_got_entries (struct got_entry **pent)
9146{
9147 struct got_entry *ent, *ent2;
9148
9149 for (ent = *pent; ent != NULL; ent = ent->next)
9150 if (!ent->is_indirect)
9151 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9152 if (!ent2->is_indirect
9153 && ent2->addend == ent->addend
9154 && ent2->tls_type == ent->tls_type
9155 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9156 {
9157 ent2->is_indirect = TRUE;
9158 ent2->got.ent = ent;
9159 }
9160}
9161
65f38f15
AM
9162/* Allocate space in .plt, .got and associated reloc sections for
9163 dynamic relocs. */
5bd4f169 9164
b34976b6 9165static bfd_boolean
4ce794b7 9166allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9167{
65f38f15
AM
9168 struct bfd_link_info *info;
9169 struct ppc_link_hash_table *htab;
5bd4f169 9170 asection *s;
65f38f15 9171 struct ppc_link_hash_entry *eh;
6061a67d 9172 struct elf_dyn_relocs *p;
0b8bcf0d 9173 struct got_entry **pgent, *gent;
5bd4f169 9174
e92d460e 9175 if (h->root.type == bfd_link_hash_indirect)
b34976b6 9176 return TRUE;
5bd4f169 9177
65f38f15
AM
9178 info = (struct bfd_link_info *) inf;
9179 htab = ppc_hash_table (info);
4dfe6ac6
NC
9180 if (htab == NULL)
9181 return FALSE;
5bd4f169 9182
e054468f
AM
9183 if ((htab->elf.dynamic_sections_created
9184 && h->dynindx != -1
9185 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
9186 || h->type == STT_GNU_IFUNC)
5bd4f169 9187 {
411e1bfb
AM
9188 struct plt_entry *pent;
9189 bfd_boolean doneone = FALSE;
9190 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9191 if (pent->plt.refcount > 0)
9192 {
25f23106
AM
9193 if (!htab->elf.dynamic_sections_created
9194 || h->dynindx == -1)
e054468f
AM
9195 {
9196 s = htab->iplt;
9197 pent->plt.offset = s->size;
9198 s->size += PLT_ENTRY_SIZE;
9199 s = htab->reliplt;
9200 }
9201 else
9202 {
9203 /* If this is the first .plt entry, make room for the special
9204 first entry. */
9205 s = htab->plt;
9206 if (s->size == 0)
9207 s->size += PLT_INITIAL_ENTRY_SIZE;
9208
9209 pent->plt.offset = s->size;
9210
9211 /* Make room for this entry. */
9212 s->size += PLT_ENTRY_SIZE;
9213
9214 /* Make room for the .glink code. */
9215 s = htab->glink;
9216 if (s->size == 0)
9217 s->size += GLINK_CALL_STUB_SIZE;
9218 /* We need bigger stubs past index 32767. */
9219 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
9220 s->size += 4;
9221 s->size += 2*4;
9222
9223 /* We also need to make an entry in the .rela.plt section. */
9224 s = htab->relplt;
9225 }
eea6121a 9226 s->size += sizeof (Elf64_External_Rela);
411e1bfb
AM
9227 doneone = TRUE;
9228 }
9229 else
9230 pent->plt.offset = (bfd_vma) -1;
9231 if (!doneone)
65f38f15 9232 {
411e1bfb 9233 h->plt.plist = NULL;
f5385ebf 9234 h->needs_plt = 0;
65f38f15
AM
9235 }
9236 }
9237 else
9238 {
411e1bfb 9239 h->plt.plist = NULL;
f5385ebf 9240 h->needs_plt = 0;
65f38f15
AM
9241 }
9242
951fd09b
AM
9243 eh = (struct ppc_link_hash_entry *) h;
9244 /* Run through the TLS GD got entries first if we're changing them
9245 to TPREL. */
e7b938ca 9246 if ((eh->tls_mask & TLS_TPRELGD) != 0)
951fd09b
AM
9247 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9248 if (gent->got.refcount > 0
9249 && (gent->tls_type & TLS_GD) != 0)
9250 {
9251 /* This was a GD entry that has been converted to TPREL. If
9252 there happens to be a TPREL entry we can use that one. */
9253 struct got_entry *ent;
9254 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9255 if (ent->got.refcount > 0
9256 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9257 && ent->addend == gent->addend
9258 && ent->owner == gent->owner)
951fd09b
AM
9259 {
9260 gent->got.refcount = 0;
9261 break;
9262 }
9263
9264 /* If not, then we'll be using our own TPREL entry. */
9265 if (gent->got.refcount != 0)
9266 gent->tls_type = TLS_TLS | TLS_TPREL;
9267 }
9268
7865406b
AM
9269 /* Remove any list entry that won't generate a word in the GOT before
9270 we call merge_got_entries. Otherwise we risk merging to empty
9271 entries. */
0b8bcf0d
AM
9272 pgent = &h->got.glist;
9273 while ((gent = *pgent) != NULL)
411e1bfb 9274 if (gent->got.refcount > 0)
7865406b
AM
9275 {
9276 if ((gent->tls_type & TLS_LD) != 0
9277 && !h->def_dynamic)
9278 {
9279 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9280 *pgent = gent->next;
9281 }
9282 else
9283 pgent = &gent->next;
9284 }
9285 else
9286 *pgent = gent->next;
9287
9288 if (!htab->do_multi_toc)
9289 merge_got_entries (&h->got.glist);
9290
9291 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9292 if (!gent->is_indirect)
411e1bfb
AM
9293 {
9294 /* Make sure this symbol is output as a dynamic symbol.
951fd09b
AM
9295 Undefined weak syms won't yet be marked as dynamic,
9296 nor will all TLS symbols. */
411e1bfb 9297 if (h->dynindx == -1
b099ab9f 9298 && !h->forced_local
25f23106 9299 && h->type != STT_GNU_IFUNC
b099ab9f 9300 && htab->elf.dynamic_sections_created)
411e1bfb 9301 {
c152c796 9302 if (! bfd_elf_link_record_dynamic_symbol (info, h))
411e1bfb
AM
9303 return FALSE;
9304 }
65f38f15 9305
0c8d6e5c 9306 if (!is_ppc64_elf (gent->owner))
927be08e 9307 abort ();
0ffa91dd 9308
927be08e 9309 allocate_got (h, info, gent);
411e1bfb 9310 }
65f38f15 9311
b099ab9f 9312 if (eh->dyn_relocs == NULL
25f23106
AM
9313 || (!htab->elf.dynamic_sections_created
9314 && h->type != STT_GNU_IFUNC))
b34976b6 9315 return TRUE;
65f38f15
AM
9316
9317 /* In the shared -Bsymbolic case, discard space allocated for
9318 dynamic pc-relative relocs against symbols which turn out to be
9319 defined in regular objects. For the normal shared case, discard
9320 space for relocs that have become local due to symbol visibility
9321 changes. */
9322
9323 if (info->shared)
9324 {
9c7a29a3 9325 /* Relocs that use pc_count are those that appear on a call insn,
1d483afe 9326 or certain REL relocs (see must_be_dyn_reloc) that can be
9c7a29a3
AM
9327 generated via assembly. We want calls to protected symbols to
9328 resolve directly to the function rather than going via the plt.
9329 If people want function pointer comparisons to work as expected
9330 then they should avoid writing weird assembly. */
09695f56 9331 if (SYMBOL_CALLS_LOCAL (info, h))
65f38f15 9332 {
6061a67d 9333 struct elf_dyn_relocs **pp;
65f38f15
AM
9334
9335 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5bd4f169 9336 {
65f38f15
AM
9337 p->count -= p->pc_count;
9338 p->pc_count = 0;
9339 if (p->count == 0)
9340 *pp = p->next;
9341 else
9342 pp = &p->next;
5bd4f169 9343 }
65f38f15 9344 }
4e795f50
AM
9345
9346 /* Also discard relocs on undefined weak syms with non-default
9347 visibility. */
cab87ef9
AM
9348 if (eh->dyn_relocs != NULL
9349 && h->root.type == bfd_link_hash_undefweak)
dfbb6ac9
AM
9350 {
9351 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9352 eh->dyn_relocs = NULL;
9353
9354 /* Make sure this symbol is output as a dynamic symbol.
9355 Undefined weak syms won't yet be marked as dynamic. */
9356 else if (h->dynindx == -1
9357 && !h->forced_local)
9358 {
9359 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9360 return FALSE;
9361 }
9362 }
65f38f15 9363 }
25f23106
AM
9364 else if (h->type == STT_GNU_IFUNC)
9365 {
9366 if (!h->non_got_ref)
9367 eh->dyn_relocs = NULL;
9368 }
f4656909 9369 else if (ELIMINATE_COPY_RELOCS)
65f38f15
AM
9370 {
9371 /* For the non-shared case, discard space for relocs against
9372 symbols which turn out to need copy relocs or are not
9373 dynamic. */
9374
f5385ebf 9375 if (!h->non_got_ref
f5385ebf 9376 && !h->def_regular)
65f38f15
AM
9377 {
9378 /* Make sure this symbol is output as a dynamic symbol.
9379 Undefined weak syms won't yet be marked as dynamic. */
9380 if (h->dynindx == -1
f5385ebf 9381 && !h->forced_local)
65f38f15 9382 {
c152c796 9383 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 9384 return FALSE;
65f38f15
AM
9385 }
9386
9387 /* If that succeeded, we know we'll be keeping all the
9388 relocs. */
9389 if (h->dynindx != -1)
9390 goto keep;
9391 }
9392
9393 eh->dyn_relocs = NULL;
9394
ec338859 9395 keep: ;
65f38f15
AM
9396 }
9397
9398 /* Finally, allocate space. */
9399 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9400 {
9401 asection *sreloc = elf_section_data (p->sec)->sreloc;
19e08130 9402 if (eh->elf.type == STT_GNU_IFUNC)
25f23106 9403 sreloc = htab->reliplt;
eea6121a 9404 sreloc->size += p->count * sizeof (Elf64_External_Rela);
65f38f15
AM
9405 }
9406
b34976b6 9407 return TRUE;
65f38f15
AM
9408}
9409
9410/* Find any dynamic relocs that apply to read-only sections. */
9411
b34976b6 9412static bfd_boolean
4ce794b7 9413readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
65f38f15
AM
9414{
9415 struct ppc_link_hash_entry *eh;
6061a67d 9416 struct elf_dyn_relocs *p;
65f38f15
AM
9417
9418 eh = (struct ppc_link_hash_entry *) h;
9419 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9420 {
9421 asection *s = p->sec->output_section;
9422
9423 if (s != NULL && (s->flags & SEC_READONLY) != 0)
9424 {
4ce794b7 9425 struct bfd_link_info *info = inf;
65f38f15
AM
9426
9427 info->flags |= DF_TEXTREL;
9428
9429 /* Not an error, just cut short the traversal. */
b34976b6 9430 return FALSE;
65f38f15
AM
9431 }
9432 }
b34976b6 9433 return TRUE;
65f38f15
AM
9434}
9435
9436/* Set the sizes of the dynamic sections. */
9437
b34976b6 9438static bfd_boolean
ee67d69a 9439ppc64_elf_size_dynamic_sections (bfd *output_bfd,
4ce794b7 9440 struct bfd_link_info *info)
65f38f15
AM
9441{
9442 struct ppc_link_hash_table *htab;
9443 bfd *dynobj;
9444 asection *s;
b34976b6 9445 bfd_boolean relocs;
65f38f15 9446 bfd *ibfd;
7865406b 9447 struct got_entry *first_tlsld;
65f38f15
AM
9448
9449 htab = ppc_hash_table (info);
4dfe6ac6
NC
9450 if (htab == NULL)
9451 return FALSE;
9452
65f38f15
AM
9453 dynobj = htab->elf.dynobj;
9454 if (dynobj == NULL)
9455 abort ();
9456
9457 if (htab->elf.dynamic_sections_created)
9458 {
9459 /* Set the contents of the .interp section to the interpreter. */
36af4a4e 9460 if (info->executable)
65f38f15 9461 {
3d4d4302 9462 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
9463 if (s == NULL)
9464 abort ();
eea6121a 9465 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
9466 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9467 }
9468 }
9469
9470 /* Set up .got offsets for local syms, and space for local dynamic
9471 relocs. */
9472 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9473 {
411e1bfb
AM
9474 struct got_entry **lgot_ents;
9475 struct got_entry **end_lgot_ents;
e054468f
AM
9476 struct plt_entry **local_plt;
9477 struct plt_entry **end_local_plt;
f961d9dd 9478 unsigned char *lgot_masks;
65f38f15
AM
9479 bfd_size_type locsymcount;
9480 Elf_Internal_Shdr *symtab_hdr;
65f38f15 9481
0c8d6e5c 9482 if (!is_ppc64_elf (ibfd))
65f38f15
AM
9483 continue;
9484
9485 for (s = ibfd->sections; s != NULL; s = s->next)
9486 {
19e08130 9487 struct ppc_dyn_relocs *p;
65f38f15 9488
6edfbbad 9489 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 9490 {
ec338859
AM
9491 if (!bfd_is_abs_section (p->sec)
9492 && bfd_is_abs_section (p->sec->output_section))
9493 {
9494 /* Input section has been discarded, either because
9495 it is a copy of a linkonce section or due to
9496 linker script /DISCARD/, so we'll be discarding
9497 the relocs too. */
9498 }
248866a8 9499 else if (p->count != 0)
ec338859 9500 {
19e08130
AM
9501 asection *srel = elf_section_data (p->sec)->sreloc;
9502 if (p->ifunc)
25f23106 9503 srel = htab->reliplt;
eea6121a 9504 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
9505 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9506 info->flags |= DF_TEXTREL;
ec338859 9507 }
65f38f15
AM
9508 }
9509 }
9510
411e1bfb
AM
9511 lgot_ents = elf_local_got_ents (ibfd);
9512 if (!lgot_ents)
65f38f15
AM
9513 continue;
9514
0ffa91dd 9515 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 9516 locsymcount = symtab_hdr->sh_info;
411e1bfb 9517 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
9518 local_plt = (struct plt_entry **) end_lgot_ents;
9519 end_local_plt = local_plt + locsymcount;
f961d9dd 9520 lgot_masks = (unsigned char *) end_local_plt;
e717da7e 9521 s = ppc64_elf_tdata (ibfd)->got;
e7b938ca 9522 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 9523 {
0b8bcf0d 9524 struct got_entry **pent, *ent;
411e1bfb 9525
0b8bcf0d
AM
9526 pent = lgot_ents;
9527 while ((ent = *pent) != NULL)
411e1bfb
AM
9528 if (ent->got.refcount > 0)
9529 {
e7b938ca 9530 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 9531 {
927be08e 9532 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 9533 *pent = ent->next;
411e1bfb
AM
9534 }
9535 else
9536 {
19e08130
AM
9537 unsigned int ent_size = 8;
9538 unsigned int rel_size = sizeof (Elf64_External_Rela);
9539
eea6121a 9540 ent->got.offset = s->size;
e7b938ca 9541 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 9542 {
19e08130
AM
9543 ent_size *= 2;
9544 rel_size *= 2;
9545 }
9546 s->size += ent_size;
9547 if ((*lgot_masks & PLT_IFUNC) != 0)
9548 {
9549 htab->reliplt->size += rel_size;
9550 htab->got_reli_size += rel_size;
9551 }
9552 else if (info->shared)
9553 {
9554 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9555 srel->size += rel_size;
927be08e 9556 }
0b8bcf0d 9557 pent = &ent->next;
411e1bfb
AM
9558 }
9559 }
9560 else
0b8bcf0d 9561 *pent = ent->next;
65f38f15 9562 }
e054468f
AM
9563
9564 /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
9565 for (; local_plt < end_local_plt; ++local_plt)
9566 {
9567 struct plt_entry *ent;
9568
9569 for (ent = *local_plt; ent != NULL; ent = ent->next)
9570 if (ent->plt.refcount > 0)
9571 {
91d6fa6a 9572 s = htab->iplt;
e054468f
AM
9573 ent->plt.offset = s->size;
9574 s->size += PLT_ENTRY_SIZE;
9575
25f23106 9576 htab->reliplt->size += sizeof (Elf64_External_Rela);
e054468f
AM
9577 }
9578 else
9579 ent->plt.offset = (bfd_vma) -1;
9580 }
65f38f15
AM
9581 }
9582
9583 /* Allocate global sym .plt and .got entries, and space for global
9584 sym dynamic relocs. */
4ce794b7 9585 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
65f38f15 9586
7865406b 9587 first_tlsld = NULL;
102890f0
AM
9588 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9589 {
7865406b
AM
9590 struct got_entry *ent;
9591
0c8d6e5c 9592 if (!is_ppc64_elf (ibfd))
102890f0
AM
9593 continue;
9594
7865406b
AM
9595 ent = ppc64_tlsld_got (ibfd);
9596 if (ent->got.refcount > 0)
102890f0 9597 {
7865406b 9598 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 9599 {
7865406b
AM
9600 ent->is_indirect = TRUE;
9601 ent->got.ent = first_tlsld;
9602 }
9603 else
9604 {
9605 if (first_tlsld == NULL)
9606 first_tlsld = ent;
9607 s = ppc64_elf_tdata (ibfd)->got;
9608 ent->got.offset = s->size;
9609 ent->owner = ibfd;
9610 s->size += 16;
9611 if (info->shared)
9612 {
9613 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9614 srel->size += sizeof (Elf64_External_Rela);
9615 }
102890f0
AM
9616 }
9617 }
9618 else
7865406b 9619 ent->got.offset = (bfd_vma) -1;
102890f0
AM
9620 }
9621
65f38f15
AM
9622 /* We now have determined the sizes of the various dynamic sections.
9623 Allocate memory for them. */
b34976b6 9624 relocs = FALSE;
65f38f15
AM
9625 for (s = dynobj->sections; s != NULL; s = s->next)
9626 {
9627 if ((s->flags & SEC_LINKER_CREATED) == 0)
9628 continue;
9629
4ce794b7 9630 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
9631 /* These haven't been allocated yet; don't strip. */
9632 continue;
e717da7e
AM
9633 else if (s == htab->got
9634 || s == htab->plt
e054468f 9635 || s == htab->iplt
c456f082
AM
9636 || s == htab->glink
9637 || s == htab->dynbss)
65f38f15
AM
9638 {
9639 /* Strip this section if we don't need it; see the
9640 comment below. */
5bd4f169 9641 }
58d180e8
AM
9642 else if (s == htab->glink_eh_frame)
9643 {
9644 if (!bfd_is_abs_section (s->output_section))
9645 /* Not sized yet. */
9646 continue;
9647 }
70cc837d 9648 else if (CONST_STRNEQ (s->name, ".rela"))
5bd4f169 9649 {
c456f082 9650 if (s->size != 0)
5bd4f169 9651 {
4ce794b7 9652 if (s != htab->relplt)
b34976b6 9653 relocs = TRUE;
5bd4f169
AM
9654
9655 /* We use the reloc_count field as a counter if we need
9656 to copy relocs into the output file. */
9657 s->reloc_count = 0;
9658 }
9659 }
65f38f15 9660 else
5bd4f169
AM
9661 {
9662 /* It's not one of our sections, so don't allocate space. */
9663 continue;
9664 }
9665
eea6121a 9666 if (s->size == 0)
5bd4f169 9667 {
c456f082
AM
9668 /* If we don't need this section, strip it from the
9669 output file. This is mostly to handle .rela.bss and
9670 .rela.plt. We must create both sections in
9671 create_dynamic_sections, because they must be created
9672 before the linker maps input sections to output
9673 sections. The linker does that before
9674 adjust_dynamic_symbol is called, and it is that
9675 function which decides whether anything needs to go
9676 into these sections. */
8423293d 9677 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
9678 continue;
9679 }
9680
c456f082 9681 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
9682 continue;
9683
65f38f15
AM
9684 /* Allocate memory for the section contents. We use bfd_zalloc
9685 here in case unused entries are not reclaimed before the
9686 section's contents are written out. This should not happen,
411e1bfb
AM
9687 but this way if it does we get a R_PPC64_NONE reloc in .rela
9688 sections instead of garbage.
9689 We also rely on the section contents being zero when writing
9690 the GOT. */
eea6121a 9691 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 9692 if (s->contents == NULL)
b34976b6 9693 return FALSE;
5bd4f169
AM
9694 }
9695
e717da7e
AM
9696 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9697 {
0c8d6e5c 9698 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
9699 continue;
9700
e717da7e
AM
9701 s = ppc64_elf_tdata (ibfd)->got;
9702 if (s != NULL && s != htab->got)
9703 {
eea6121a 9704 if (s->size == 0)
8423293d 9705 s->flags |= SEC_EXCLUDE;
e717da7e
AM
9706 else
9707 {
eea6121a 9708 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
9709 if (s->contents == NULL)
9710 return FALSE;
9711 }
9712 }
9713 s = ppc64_elf_tdata (ibfd)->relgot;
9714 if (s != NULL)
9715 {
eea6121a 9716 if (s->size == 0)
8423293d 9717 s->flags |= SEC_EXCLUDE;
e717da7e
AM
9718 else
9719 {
eea6121a 9720 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
9721 if (s->contents == NULL)
9722 return FALSE;
9723 relocs = TRUE;
9724 s->reloc_count = 0;
9725 }
9726 }
9727 }
9728
e86ce104 9729 if (htab->elf.dynamic_sections_created)
5bd4f169
AM
9730 {
9731 /* Add some entries to the .dynamic section. We fill in the
9732 values later, in ppc64_elf_finish_dynamic_sections, but we
9733 must add the entries now so that we get the correct size for
9734 the .dynamic section. The DT_DEBUG entry is filled in by the
9735 dynamic linker and used by the debugger. */
dc810e39 9736#define add_dynamic_entry(TAG, VAL) \
5a580b3a 9737 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 9738
36af4a4e 9739 if (info->executable)
5bd4f169 9740 {
dc810e39 9741 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 9742 return FALSE;
5bd4f169
AM
9743 }
9744
eea6121a 9745 if (htab->plt != NULL && htab->plt->size != 0)
5bd4f169 9746 {
dc810e39
AM
9747 if (!add_dynamic_entry (DT_PLTGOT, 0)
9748 || !add_dynamic_entry (DT_PLTRELSZ, 0)
9749 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
9750 || !add_dynamic_entry (DT_JMPREL, 0)
9751 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 9752 return FALSE;
5bd4f169
AM
9753 }
9754
ee67d69a 9755 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
9756 {
9757 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
9758 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 9759 return FALSE;
19397422
AM
9760 }
9761
a7f2871e
AM
9762 if (!htab->no_tls_get_addr_opt
9763 && htab->tls_get_addr_fd != NULL
9764 && htab->tls_get_addr_fd->elf.plt.plist != NULL
9765 && !add_dynamic_entry (DT_PPC64_TLSOPT, 0))
9766 return FALSE;
9767
5bd4f169
AM
9768 if (relocs)
9769 {
dc810e39
AM
9770 if (!add_dynamic_entry (DT_RELA, 0)
9771 || !add_dynamic_entry (DT_RELASZ, 0)
9772 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 9773 return FALSE;
5bd4f169 9774
65f38f15
AM
9775 /* If any dynamic relocs apply to a read-only section,
9776 then we need a DT_TEXTREL entry. */
248866a8 9777 if ((info->flags & DF_TEXTREL) == 0)
4ce794b7 9778 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
5bd4f169 9779
65f38f15 9780 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 9781 {
65f38f15 9782 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 9783 return FALSE;
5bd4f169 9784 }
5bd4f169 9785 }
5bd4f169 9786 }
65f38f15 9787#undef add_dynamic_entry
5bd4f169 9788
b34976b6 9789 return TRUE;
5bd4f169
AM
9790}
9791
721956f4 9792/* Determine the type of stub needed, if any, for a call. */
5bd4f169 9793
4ce794b7
AM
9794static inline enum ppc_stub_type
9795ppc_type_of_stub (asection *input_sec,
9796 const Elf_Internal_Rela *rel,
9797 struct ppc_link_hash_entry **hash,
e054468f 9798 struct plt_entry **plt_ent,
4ce794b7 9799 bfd_vma destination)
5bd4f169 9800{
721956f4
AM
9801 struct ppc_link_hash_entry *h = *hash;
9802 bfd_vma location;
9803 bfd_vma branch_offset;
9804 bfd_vma max_branch_offset;
4ce794b7 9805 enum elf_ppc64_reloc_type r_type;
5bd4f169 9806
721956f4
AM
9807 if (h != NULL)
9808 {
e054468f 9809 struct plt_entry *ent;
7fe2b9a6 9810 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
9811 if (h->oh != NULL
9812 && h->oh->is_func_descriptor)
7b8f6675
AM
9813 {
9814 fdh = ppc_follow_link (h->oh);
9815 *hash = fdh;
9816 }
8387904d 9817
e054468f
AM
9818 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
9819 if (ent->addend == rel->r_addend
9820 && ent->plt.offset != (bfd_vma) -1)
9821 {
e054468f
AM
9822 *plt_ent = ent;
9823 return ppc_stub_plt_call;
9824 }
5bd4f169 9825
7fe2b9a6
AM
9826 /* Here, we know we don't have a plt entry. If we don't have a
9827 either a defined function descriptor or a defined entry symbol
9828 in a regular object file, then it is pointless trying to make
9829 any other type of stub. */
854b41e7
AM
9830 if (!is_static_defined (&fdh->elf)
9831 && !is_static_defined (&h->elf))
721956f4 9832 return ppc_stub_none;
5d1634d7 9833 }
e054468f
AM
9834 else if (elf_local_got_ents (input_sec->owner) != NULL)
9835 {
9836 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
9837 struct plt_entry **local_plt = (struct plt_entry **)
9838 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
9839 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
9840
9841 if (local_plt[r_symndx] != NULL)
9842 {
9843 struct plt_entry *ent;
9844
9845 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
9846 if (ent->addend == rel->r_addend
9847 && ent->plt.offset != (bfd_vma) -1)
9848 {
9849 *plt_ent = ent;
9850 return ppc_stub_plt_call;
9851 }
9852 }
9853 }
5d1634d7 9854
721956f4
AM
9855 /* Determine where the call point is. */
9856 location = (input_sec->output_offset
9857 + input_sec->output_section->vma
9858 + rel->r_offset);
5d1634d7 9859
721956f4
AM
9860 branch_offset = destination - location;
9861 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 9862
721956f4
AM
9863 /* Determine if a long branch stub is needed. */
9864 max_branch_offset = 1 << 25;
4ce794b7 9865 if (r_type != R_PPC64_REL24)
721956f4 9866 max_branch_offset = 1 << 15;
5d1634d7 9867
721956f4
AM
9868 if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
9869 /* We need a stub. Figure out whether a long_branch or plt_branch
9870 is needed later. */
9871 return ppc_stub_long_branch;
5d1634d7 9872
721956f4 9873 return ppc_stub_none;
5d1634d7
AM
9874}
9875
794e51c0
AM
9876/* With power7 weakly ordered memory model, it is possible for ld.so
9877 to update a plt entry in one thread and have another thread see a
9878 stale zero toc entry. To avoid this we need some sort of acquire
9879 barrier in the call stub. One solution is to make the load of the
9880 toc word seem to appear to depend on the load of the function entry
9881 word. Another solution is to test for r2 being zero, and branch to
9882 the appropriate glink entry if so.
9883
9884 . fake dep barrier compare
71a39c98
AM
9885 . ld 12,xxx(2) ld 12,xxx(2)
9886 . mtctr 12 mtctr 12
9887 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
9888 . add 2,2,11 cmpldi 2,0
9889 . ld 2,xxx+8(2) bnectr+
9890 . bctr b <glink_entry>
9891
9892 The solution involving the compare turns out to be faster, so
9893 that's what we use unless the branch won't reach. */
9894
9895#define ALWAYS_USE_FAKE_DEP 0
9896#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 9897
5d1634d7
AM
9898#define PPC_LO(v) ((v) & 0xffff)
9899#define PPC_HI(v) (((v) >> 16) & 0xffff)
9900#define PPC_HA(v) PPC_HI ((v) + 0x8000)
9901
794e51c0
AM
9902static inline unsigned int
9903plt_stub_size (struct ppc_link_hash_table *htab,
9904 struct ppc_stub_hash_entry *stub_entry,
9905 bfd_vma off)
9906{
9907 unsigned size = PLT_CALL_STUB_SIZE;
9908
9909 if (!(ALWAYS_EMIT_R2SAVE
9910 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
9911 size -= 4;
9912 if (!htab->plt_static_chain)
9913 size -= 4;
9914 if (htab->plt_thread_safe)
9915 size += 8;
9916 if (PPC_HA (off) == 0)
9917 size -= 4;
9918 if (PPC_HA (off + 8 + 8 * htab->plt_static_chain) != PPC_HA (off))
9919 size += 4;
9920 if (stub_entry->h != NULL
9921 && (stub_entry->h == htab->tls_get_addr_fd
9922 || stub_entry->h == htab->tls_get_addr)
9923 && !htab->no_tls_get_addr_opt)
9924 size += 13 * 4;
9925 return size;
9926}
9927
9928/* If this stub would cross fewer 2**plt_stub_align boundaries if we align,
9929 then return the padding needed to do so. */
9930static inline unsigned int
9931plt_stub_pad (struct ppc_link_hash_table *htab,
9932 struct ppc_stub_hash_entry *stub_entry,
9933 bfd_vma plt_off)
9934{
9935 int stub_align = 1 << htab->plt_stub_align;
9936 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
9937 bfd_vma stub_off = stub_entry->stub_sec->size;
9938
9939 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
9940 > (stub_size & -stub_align))
9941 return stub_align - (stub_off & (stub_align - 1));
9942 return 0;
9943}
9944
9945/* Build a .plt call stub. */
9946
9947static inline bfd_byte *
9948build_plt_stub (struct ppc_link_hash_table *htab,
9949 struct ppc_stub_hash_entry *stub_entry,
9950 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
9951{
9952 bfd *obfd = htab->stub_bfd;
9953 bfd_boolean plt_static_chain = htab->plt_static_chain;
9954 bfd_boolean plt_thread_safe = htab->plt_thread_safe;
9955 bfd_boolean use_fake_dep = plt_thread_safe;
9956 bfd_vma cmp_branch_off = 0;
9957
9958 if (!ALWAYS_USE_FAKE_DEP
9959 && plt_thread_safe
9960 && !(stub_entry->h != NULL
9961 && (stub_entry->h == htab->tls_get_addr_fd
9962 || stub_entry->h == htab->tls_get_addr)
9963 && !htab->no_tls_get_addr_opt))
9964 {
9965 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
9966 bfd_vma pltindex = (pltoff - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE;
9967 bfd_vma glinkoff = GLINK_CALL_STUB_SIZE + pltindex * 8;
9968 bfd_vma to, from;
9969
68d62958
AM
9970 if (pltindex > 32768)
9971 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
9972 to = (glinkoff
9973 + htab->glink->output_offset
9974 + htab->glink->output_section->vma);
9975 from = (p - stub_entry->stub_sec->contents
9976 + 4 * (ALWAYS_EMIT_R2SAVE
9977 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
9978 + 4 * (PPC_HA (offset) != 0)
9979 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
9980 != PPC_HA (offset))
9981 + 4 * (plt_static_chain != 0)
9982 + 20
9983 + stub_entry->stub_sec->output_offset
9984 + stub_entry->stub_sec->output_section->vma);
9985 cmp_branch_off = to - from;
9986 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
9987 }
9988
ac2df442
AM
9989 if (PPC_HA (offset) != 0)
9990 {
176a0d42
AM
9991 if (r != NULL)
9992 {
794e51c0
AM
9993 if (ALWAYS_EMIT_R2SAVE
9994 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
9995 r[0].r_offset += 4;
176a0d42 9996 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 9997 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
9998 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9999 r[1].r_addend = r[0].r_addend;
c7131b65 10000 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
176a0d42
AM
10001 {
10002 r[2].r_offset = r[1].r_offset + 4;
10003 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10004 r[2].r_addend = r[0].r_addend;
10005 }
10006 else
10007 {
794e51c0 10008 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
176a0d42
AM
10009 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10010 r[2].r_addend = r[0].r_addend + 8;
c7131b65
AM
10011 if (plt_static_chain)
10012 {
10013 r[3].r_offset = r[2].r_offset + 4;
10014 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10015 r[3].r_addend = r[0].r_addend + 16;
10016 }
176a0d42
AM
10017 }
10018 }
794e51c0
AM
10019 if (ALWAYS_EMIT_R2SAVE
10020 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10021 bfd_put_32 (obfd, STD_R2_40R1, p), p += 4;
71a39c98
AM
10022 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10023 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
9df0ef5f 10024 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 10025 {
71a39c98 10026 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
10027 offset = 0;
10028 }
71a39c98 10029 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
794e51c0
AM
10030 if (use_fake_dep)
10031 {
71a39c98
AM
10032 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10033 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
794e51c0 10034 }
71a39c98 10035 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
9df0ef5f 10036 if (plt_static_chain)
71a39c98 10037 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
ac2df442
AM
10038 }
10039 else
10040 {
176a0d42
AM
10041 if (r != NULL)
10042 {
794e51c0
AM
10043 if (ALWAYS_EMIT_R2SAVE
10044 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10045 r[0].r_offset += 4;
176a0d42 10046 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
c7131b65 10047 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
176a0d42
AM
10048 {
10049 r[1].r_offset = r[0].r_offset + 4;
10050 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10051 r[1].r_addend = r[0].r_addend;
10052 }
10053 else
10054 {
794e51c0 10055 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
176a0d42 10056 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
c7131b65
AM
10057 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10058 if (plt_static_chain)
10059 {
10060 r[2].r_offset = r[1].r_offset + 4;
10061 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10062 r[2].r_addend = r[0].r_addend + 8;
10063 }
176a0d42
AM
10064 }
10065 }
794e51c0
AM
10066 if (ALWAYS_EMIT_R2SAVE
10067 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10068 bfd_put_32 (obfd, STD_R2_40R1, p), p += 4;
71a39c98 10069 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
9df0ef5f 10070 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
10071 {
10072 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10073 offset = 0;
10074 }
71a39c98 10075 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
794e51c0
AM
10076 if (use_fake_dep)
10077 {
71a39c98 10078 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
794e51c0
AM
10079 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10080 }
9df0ef5f
AM
10081 if (plt_static_chain)
10082 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
ac2df442 10083 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
ac2df442 10084 }
794e51c0
AM
10085 if (plt_thread_safe && !use_fake_dep)
10086 {
10087 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10088 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 10089 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
10090 }
10091 else
10092 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
10093 return p;
10094}
10095
a7f2871e
AM
10096/* Build a special .plt call stub for __tls_get_addr. */
10097
10098#define LD_R11_0R3 0xe9630000
10099#define LD_R12_0R3 0xe9830000
10100#define MR_R0_R3 0x7c601b78
10101#define CMPDI_R11_0 0x2c2b0000
10102#define ADD_R3_R12_R13 0x7c6c6a14
10103#define BEQLR 0x4d820020
10104#define MR_R3_R0 0x7c030378
10105#define MFLR_R11 0x7d6802a6
10106#define STD_R11_0R1 0xf9610000
10107#define BCTRL 0x4e800421
10108#define LD_R11_0R1 0xe9610000
10109#define LD_R2_0R1 0xe8410000
10110#define MTLR_R11 0x7d6803a6
10111
10112static inline bfd_byte *
794e51c0
AM
10113build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10114 struct ppc_stub_hash_entry *stub_entry,
10115 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 10116{
794e51c0
AM
10117 bfd *obfd = htab->stub_bfd;
10118
a7f2871e
AM
10119 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10120 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10121 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10122 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10123 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10124 bfd_put_32 (obfd, BEQLR, p), p += 4;
10125 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
10126 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
10127 bfd_put_32 (obfd, STD_R11_0R1 + 32, p), p += 4;
10128
10129 if (r != NULL)
10130 r[0].r_offset += 9 * 4;
794e51c0 10131 p = build_plt_stub (htab, stub_entry, p, offset, r);
a7f2871e
AM
10132 bfd_put_32 (obfd, BCTRL, p - 4);
10133
10134 bfd_put_32 (obfd, LD_R11_0R1 + 32, p), p += 4;
10135 bfd_put_32 (obfd, LD_R2_0R1 + 40, p), p += 4;
10136 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10137 bfd_put_32 (obfd, BLR, p), p += 4;
10138
10139 return p;
10140}
10141
176a0d42
AM
10142static Elf_Internal_Rela *
10143get_relocs (asection *sec, int count)
10144{
10145 Elf_Internal_Rela *relocs;
10146 struct bfd_elf_section_data *elfsec_data;
10147
10148 elfsec_data = elf_section_data (sec);
10149 relocs = elfsec_data->relocs;
10150 if (relocs == NULL)
10151 {
10152 bfd_size_type relsize;
10153 relsize = sec->reloc_count * sizeof (*relocs);
10154 relocs = bfd_alloc (sec->owner, relsize);
10155 if (relocs == NULL)
10156 return NULL;
10157 elfsec_data->relocs = relocs;
d4730f92
BS
10158 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10159 sizeof (Elf_Internal_Shdr));
10160 if (elfsec_data->rela.hdr == NULL)
10161 return NULL;
10162 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10163 * sizeof (Elf64_External_Rela));
10164 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
10165 sec->reloc_count = 0;
10166 }
10167 relocs += sec->reloc_count;
10168 sec->reloc_count += count;
10169 return relocs;
10170}
10171
aa374f67 10172static bfd_vma
25f53a85 10173get_r2off (struct bfd_link_info *info,
aa374f67
AM
10174 struct ppc_stub_hash_entry *stub_entry)
10175{
25f53a85 10176 struct ppc_link_hash_table *htab = ppc_hash_table (info);
aa374f67
AM
10177 bfd_vma r2off = htab->stub_group[stub_entry->target_section->id].toc_off;
10178
10179 if (r2off == 0)
10180 {
10181 /* Support linking -R objects. Get the toc pointer from the
10182 opd entry. */
10183 char buf[8];
10184 asection *opd = stub_entry->h->elf.root.u.def.section;
10185 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
10186
10187 if (strcmp (opd->name, ".opd") != 0
10188 || opd->reloc_count != 0)
10189 {
bc30df16 10190 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%T'\n"),
25f53a85 10191 stub_entry->h->elf.root.root.string);
aa374f67
AM
10192 bfd_set_error (bfd_error_bad_value);
10193 return 0;
10194 }
10195 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
10196 return 0;
10197 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 10198 r2off -= elf_gp (info->output_bfd);
aa374f67
AM
10199 }
10200 r2off -= htab->stub_group[stub_entry->id_sec->id].toc_off;
10201 return r2off;
10202}
10203
b34976b6 10204static bfd_boolean
4ce794b7 10205ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 10206{
721956f4
AM
10207 struct ppc_stub_hash_entry *stub_entry;
10208 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
10209 struct bfd_link_info *info;
10210 struct ppc_link_hash_table *htab;
721956f4
AM
10211 bfd_byte *loc;
10212 bfd_byte *p;
ee75fd95 10213 bfd_vma dest, off;
721956f4 10214 int size;
176a0d42 10215 Elf_Internal_Rela *r;
e054468f 10216 asection *plt;
5d1634d7 10217
721956f4
AM
10218 /* Massage our args to the form they really have. */
10219 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 10220 info = in_arg;
5d1634d7 10221
5d1634d7 10222 htab = ppc_hash_table (info);
4dfe6ac6
NC
10223 if (htab == NULL)
10224 return FALSE;
5d1634d7 10225
721956f4 10226 /* Make a note of the offset within the stubs for this entry. */
eea6121a 10227 stub_entry->stub_offset = stub_entry->stub_sec->size;
97b639ba 10228 loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
721956f4 10229
4ce794b7 10230 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 10231 switch (stub_entry->stub_type)
5d1634d7 10232 {
721956f4 10233 case ppc_stub_long_branch:
ad8e1ba5 10234 case ppc_stub_long_branch_r2off:
721956f4 10235 /* Branches are relative. This is where we are going to. */
ee75fd95
AM
10236 off = dest = (stub_entry->target_value
10237 + stub_entry->target_section->output_offset
10238 + stub_entry->target_section->output_section->vma);
5d1634d7 10239
721956f4
AM
10240 /* And this is where we are coming from. */
10241 off -= (stub_entry->stub_offset
97b639ba
AM
10242 + stub_entry->stub_sec->output_offset
10243 + stub_entry->stub_sec->output_section->vma);
e86ce104 10244
ac2df442
AM
10245 size = 4;
10246 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 10247 {
25f53a85 10248 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 10249
aa374f67
AM
10250 if (r2off == 0)
10251 {
10252 htab->stub_error = TRUE;
10253 return FALSE;
10254 }
97b639ba 10255 bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
ad8e1ba5 10256 loc += 4;
ac2df442
AM
10257 size = 12;
10258 if (PPC_HA (r2off) != 0)
10259 {
10260 size = 16;
10261 bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
10262 loc += 4;
10263 }
97b639ba 10264 bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
ad8e1ba5 10265 loc += 4;
ac2df442 10266 off -= size - 4;
ad8e1ba5 10267 }
97b639ba 10268 bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
ad8e1ba5 10269
5c3dead3
AM
10270 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10271 {
bc30df16
AM
10272 info->callbacks->einfo
10273 (_("%P: long branch stub `%s' offset overflow\n"),
10274 stub_entry->root.string);
5c3dead3
AM
10275 htab->stub_error = TRUE;
10276 return FALSE;
10277 }
ee75fd95
AM
10278
10279 if (info->emitrelocations)
10280 {
176a0d42
AM
10281 r = get_relocs (stub_entry->stub_sec, 1);
10282 if (r == NULL)
10283 return FALSE;
ee75fd95
AM
10284 r->r_offset = loc - stub_entry->stub_sec->contents;
10285 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
10286 r->r_addend = dest;
10287 if (stub_entry->h != NULL)
10288 {
10289 struct elf_link_hash_entry **hashes;
10290 unsigned long symndx;
10291 struct ppc_link_hash_entry *h;
10292
10293 hashes = elf_sym_hashes (htab->stub_bfd);
10294 if (hashes == NULL)
10295 {
10296 bfd_size_type hsize;
10297
10298 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
10299 hashes = bfd_zalloc (htab->stub_bfd, hsize);
10300 if (hashes == NULL)
10301 return FALSE;
10302 elf_sym_hashes (htab->stub_bfd) = hashes;
10303 htab->stub_globals = 1;
10304 }
10305 symndx = htab->stub_globals++;
10306 h = stub_entry->h;
10307 hashes[symndx] = &h->elf;
10308 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
10309 if (h->oh != NULL && h->oh->is_func)
b31867b6 10310 h = ppc_follow_link (h->oh);
ee75fd95
AM
10311 if (h->elf.root.u.def.section != stub_entry->target_section)
10312 /* H is an opd symbol. The addend must be zero. */
10313 r->r_addend = 0;
10314 else
10315 {
10316 off = (h->elf.root.u.def.value
10317 + h->elf.root.u.def.section->output_offset
10318 + h->elf.root.u.def.section->output_section->vma);
10319 r->r_addend -= off;
10320 }
10321 }
10322 }
721956f4 10323 break;
e86ce104 10324
721956f4 10325 case ppc_stub_plt_branch:
ad8e1ba5 10326 case ppc_stub_plt_branch_r2off:
721956f4
AM
10327 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10328 stub_entry->root.string + 9,
b34976b6 10329 FALSE, FALSE);
721956f4
AM
10330 if (br_entry == NULL)
10331 {
8de848d8 10332 info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
25f53a85 10333 stub_entry->root.string);
b34976b6
AM
10334 htab->stub_error = TRUE;
10335 return FALSE;
721956f4
AM
10336 }
10337
176a0d42
AM
10338 dest = (stub_entry->target_value
10339 + stub_entry->target_section->output_offset
10340 + stub_entry->target_section->output_section->vma);
721956f4 10341
176a0d42 10342 bfd_put_64 (htab->brlt->owner, dest,
4ce794b7 10343 htab->brlt->contents + br_entry->offset);
721956f4 10344
f94498ff 10345 if (br_entry->iter == htab->stub_iteration)
721956f4 10346 {
f94498ff 10347 br_entry->iter = 0;
84f5d08e 10348
f94498ff 10349 if (htab->relbrlt != NULL)
84f5d08e 10350 {
f94498ff
AM
10351 /* Create a reloc for the branch lookup table entry. */
10352 Elf_Internal_Rela rela;
10353 bfd_byte *rl;
10354
10355 rela.r_offset = (br_entry->offset
10356 + htab->brlt->output_offset
10357 + htab->brlt->output_section->vma);
10358 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
176a0d42 10359 rela.r_addend = dest;
f94498ff
AM
10360
10361 rl = htab->relbrlt->contents;
10362 rl += (htab->relbrlt->reloc_count++
10363 * sizeof (Elf64_External_Rela));
10364 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
10365 }
10366 else if (info->emitrelocations)
10367 {
176a0d42
AM
10368 r = get_relocs (htab->brlt, 1);
10369 if (r == NULL)
10370 return FALSE;
10371 /* brlt, being SEC_LINKER_CREATED does not go through the
10372 normal reloc processing. Symbols and offsets are not
10373 translated from input file to output file form, so
10374 set up the offset per the output file. */
f94498ff
AM
10375 r->r_offset = (br_entry->offset
10376 + htab->brlt->output_offset
10377 + htab->brlt->output_section->vma);
10378 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
176a0d42 10379 r->r_addend = dest;
84f5d08e 10380 }
84f5d08e 10381 }
721956f4 10382
176a0d42
AM
10383 dest = (br_entry->offset
10384 + htab->brlt->output_offset
10385 + htab->brlt->output_section->vma);
10386
10387 off = (dest
4ce794b7 10388 - elf_gp (htab->brlt->output_section->owner)
ad8e1ba5 10389 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 10390
ad8e1ba5 10391 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 10392 {
25f53a85 10393 info->callbacks->einfo
bc30df16 10394 (_("%P: linkage table error against `%T'\n"),
721956f4 10395 stub_entry->root.string);
5d1634d7 10396 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
10397 htab->stub_error = TRUE;
10398 return FALSE;
5d1634d7 10399 }
41bd81ab 10400
176a0d42
AM
10401 if (info->emitrelocations)
10402 {
10403 r = get_relocs (stub_entry->stub_sec, 1 + (PPC_HA (off) != 0));
10404 if (r == NULL)
10405 return FALSE;
10406 r[0].r_offset = loc - stub_entry->stub_sec->contents;
7cfbafbc
AM
10407 if (bfd_big_endian (info->output_bfd))
10408 r[0].r_offset += 2;
176a0d42
AM
10409 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
10410 r[0].r_offset += 4;
10411 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10412 r[0].r_addend = dest;
10413 if (PPC_HA (off) != 0)
10414 {
10415 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10416 r[1].r_offset = r[0].r_offset + 4;
10417 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10418 r[1].r_addend = r[0].r_addend;
10419 }
10420 }
10421
ad8e1ba5
AM
10422 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10423 {
176a0d42 10424 if (PPC_HA (off) != 0)
ac2df442
AM
10425 {
10426 size = 16;
71a39c98 10427 bfd_put_32 (htab->stub_bfd, ADDIS_R11_R2 | PPC_HA (off), loc);
ac2df442 10428 loc += 4;
71a39c98 10429 bfd_put_32 (htab->stub_bfd, LD_R12_0R11 | PPC_LO (off), loc);
ac2df442
AM
10430 }
10431 else
10432 {
10433 size = 12;
71a39c98 10434 bfd_put_32 (htab->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
ac2df442 10435 }
ad8e1ba5
AM
10436 }
10437 else
10438 {
25f53a85 10439 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67
AM
10440
10441 if (r2off == 0)
10442 {
10443 htab->stub_error = TRUE;
10444 return FALSE;
10445 }
ad8e1ba5 10446
97b639ba 10447 bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
ad8e1ba5 10448 loc += 4;
ac2df442 10449 size = 20;
176a0d42 10450 if (PPC_HA (off) != 0)
ac2df442
AM
10451 {
10452 size += 4;
71a39c98 10453 bfd_put_32 (htab->stub_bfd, ADDIS_R11_R2 | PPC_HA (off), loc);
ac2df442 10454 loc += 4;
71a39c98 10455 bfd_put_32 (htab->stub_bfd, LD_R12_0R11 | PPC_LO (off), loc);
ac2df442
AM
10456 loc += 4;
10457 }
10458 else
10459 {
71a39c98 10460 bfd_put_32 (htab->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
ac2df442
AM
10461 loc += 4;
10462 }
10463
10464 if (PPC_HA (r2off) != 0)
10465 {
10466 size += 4;
10467 bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
10468 loc += 4;
10469 }
97b639ba 10470 bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
ad8e1ba5
AM
10471 }
10472 loc += 4;
71a39c98 10473 bfd_put_32 (htab->stub_bfd, MTCTR_R12, loc);
ad8e1ba5 10474 loc += 4;
97b639ba 10475 bfd_put_32 (htab->stub_bfd, BCTR, loc);
721956f4 10476 break;
5d1634d7 10477
721956f4 10478 case ppc_stub_plt_call:
794e51c0 10479 case ppc_stub_plt_call_r2save:
e054468f 10480 if (stub_entry->h != NULL
b31867b6
AM
10481 && stub_entry->h->is_func_descriptor
10482 && stub_entry->h->oh != NULL)
c862ae31 10483 {
b31867b6
AM
10484 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
10485
10486 /* If the old-ABI "dot-symbol" is undefined make it weak so
10487 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL.
10488 FIXME: We used to define the symbol on one of the call
10489 stubs instead, which is why we test symbol section id
10490 against htab->top_id in various places. Likely all
10491 these checks could now disappear. */
10492 if (fh->elf.root.type == bfd_link_hash_undefined)
10493 fh->elf.root.type = bfd_link_hash_undefweak;
9507a174
AM
10494 /* Stop undo_symbol_twiddle changing it back to undefined. */
10495 fh->was_undefined = 0;
c862ae31
AM
10496 }
10497
721956f4 10498 /* Now build the stub. */
e054468f 10499 dest = stub_entry->plt_ent->plt.offset & ~1;
176a0d42 10500 if (dest >= (bfd_vma) -2)
721956f4
AM
10501 abort ();
10502
e054468f 10503 plt = htab->plt;
25f23106
AM
10504 if (!htab->elf.dynamic_sections_created
10505 || stub_entry->h == NULL
10506 || stub_entry->h->elf.dynindx == -1)
e054468f
AM
10507 plt = htab->iplt;
10508
10509 dest += plt->output_offset + plt->output_section->vma;
10510
10511 if (stub_entry->h == NULL
10512 && (stub_entry->plt_ent->plt.offset & 1) == 0)
10513 {
10514 Elf_Internal_Rela rela;
10515 bfd_byte *rl;
10516
10517 rela.r_offset = dest;
ee67d69a
AM
10518 if (htab->opd_abi)
10519 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
10520 else
10521 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
e054468f
AM
10522 rela.r_addend = (stub_entry->target_value
10523 + stub_entry->target_section->output_offset
10524 + stub_entry->target_section->output_section->vma);
10525
25f23106
AM
10526 rl = (htab->reliplt->contents
10527 + (htab->reliplt->reloc_count++
10528 * sizeof (Elf64_External_Rela)));
10529 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
e054468f
AM
10530 stub_entry->plt_ent->plt.offset |= 1;
10531 }
176a0d42
AM
10532
10533 off = (dest
e054468f 10534 - elf_gp (plt->output_section->owner)
176a0d42 10535 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 10536
ad8e1ba5 10537 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 10538 {
25f53a85 10539 info->callbacks->einfo
bc30df16 10540 (_("%P: linkage table error against `%T'\n"),
e054468f
AM
10541 stub_entry->h != NULL
10542 ? stub_entry->h->elf.root.root.string
10543 : "<local sym>");
721956f4 10544 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
10545 htab->stub_error = TRUE;
10546 return FALSE;
721956f4
AM
10547 }
10548
794e51c0
AM
10549 if (htab->plt_stub_align != 0)
10550 {
10551 unsigned pad = plt_stub_pad (htab, stub_entry, off);
10552
10553 stub_entry->stub_sec->size += pad;
10554 stub_entry->stub_offset = stub_entry->stub_sec->size;
10555 loc += pad;
10556 }
10557
176a0d42
AM
10558 r = NULL;
10559 if (info->emitrelocations)
10560 {
10561 r = get_relocs (stub_entry->stub_sec,
c7131b65
AM
10562 (2
10563 + (PPC_HA (off) != 0)
10564 + (htab->plt_static_chain
10565 && PPC_HA (off + 16) == PPC_HA (off))));
176a0d42
AM
10566 if (r == NULL)
10567 return FALSE;
10568 r[0].r_offset = loc - stub_entry->stub_sec->contents;
7cfbafbc
AM
10569 if (bfd_big_endian (info->output_bfd))
10570 r[0].r_offset += 2;
176a0d42
AM
10571 r[0].r_addend = dest;
10572 }
a7f2871e
AM
10573 if (stub_entry->h != NULL
10574 && (stub_entry->h == htab->tls_get_addr_fd
10575 || stub_entry->h == htab->tls_get_addr)
10576 && !htab->no_tls_get_addr_opt)
794e51c0 10577 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 10578 else
794e51c0 10579 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
10580 size = p - loc;
10581 break;
10582
10583 default:
10584 BFD_FAIL ();
b34976b6 10585 return FALSE;
721956f4
AM
10586 }
10587
eea6121a 10588 stub_entry->stub_sec->size += size;
97b639ba 10589
ee75fd95 10590 if (htab->emit_stub_syms)
97b639ba
AM
10591 {
10592 struct elf_link_hash_entry *h;
ee75fd95
AM
10593 size_t len1, len2;
10594 char *name;
10595 const char *const stub_str[] = { "long_branch",
10596 "long_branch_r2off",
10597 "plt_branch",
10598 "plt_branch_r2off",
794e51c0 10599 "plt_call",
ee75fd95
AM
10600 "plt_call" };
10601
10602 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
10603 len2 = strlen (stub_entry->root.string);
10604 name = bfd_malloc (len1 + len2 + 2);
10605 if (name == NULL)
10606 return FALSE;
10607 memcpy (name, stub_entry->root.string, 9);
10608 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
10609 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
10610 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
10611 if (h == NULL)
10612 return FALSE;
10613 if (h->root.type == bfd_link_hash_new)
10614 {
10615 h->root.type = bfd_link_hash_defined;
10616 h->root.u.def.section = stub_entry->stub_sec;
10617 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
10618 h->ref_regular = 1;
10619 h->def_regular = 1;
10620 h->ref_regular_nonweak = 1;
10621 h->forced_local = 1;
10622 h->non_elf = 0;
97b639ba
AM
10623 }
10624 }
10625
b34976b6 10626 return TRUE;
721956f4
AM
10627}
10628
10629/* As above, but don't actually build the stub. Just bump offset so
10630 we know stub section sizes, and select plt_branch stubs where
10631 long_branch stubs won't do. */
10632
b34976b6 10633static bfd_boolean
4ce794b7 10634ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
10635{
10636 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 10637 struct bfd_link_info *info;
721956f4
AM
10638 struct ppc_link_hash_table *htab;
10639 bfd_vma off;
10640 int size;
10641
10642 /* Massage our args to the form they really have. */
10643 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
10644 info = in_arg;
10645
10646 htab = ppc_hash_table (info);
4dfe6ac6
NC
10647 if (htab == NULL)
10648 return FALSE;
721956f4 10649
794e51c0
AM
10650 if (stub_entry->stub_type == ppc_stub_plt_call
10651 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
721956f4 10652 {
e054468f
AM
10653 asection *plt;
10654 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
58ac9f71 10655 if (off >= (bfd_vma) -2)
411e1bfb 10656 abort ();
e054468f 10657 plt = htab->plt;
25f23106
AM
10658 if (!htab->elf.dynamic_sections_created
10659 || stub_entry->h == NULL
10660 || stub_entry->h->elf.dynindx == -1)
e054468f
AM
10661 plt = htab->iplt;
10662 off += (plt->output_offset
10663 + plt->output_section->vma
10664 - elf_gp (plt->output_section->owner)
ad8e1ba5 10665 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 10666
794e51c0
AM
10667 size = plt_stub_size (htab, stub_entry, off);
10668 if (htab->plt_stub_align)
10669 size += plt_stub_pad (htab, stub_entry, off);
176a0d42
AM
10670 if (info->emitrelocations)
10671 {
10672 stub_entry->stub_sec->reloc_count
c7131b65
AM
10673 += (2
10674 + (PPC_HA (off) != 0)
10675 + (htab->plt_static_chain
10676 && PPC_HA (off + 16) == PPC_HA (off)));
176a0d42
AM
10677 stub_entry->stub_sec->flags |= SEC_RELOC;
10678 }
721956f4
AM
10679 }
10680 else
10681 {
ad8e1ba5
AM
10682 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
10683 variants. */
ac2df442
AM
10684 bfd_vma r2off = 0;
10685
721956f4
AM
10686 off = (stub_entry->target_value
10687 + stub_entry->target_section->output_offset
10688 + stub_entry->target_section->output_section->vma);
eea6121a 10689 off -= (stub_entry->stub_sec->size
721956f4
AM
10690 + stub_entry->stub_sec->output_offset
10691 + stub_entry->stub_sec->output_section->vma);
10692
ad8e1ba5
AM
10693 /* Reset the stub type from the plt variant in case we now
10694 can reach with a shorter stub. */
10695 if (stub_entry->stub_type >= ppc_stub_plt_branch)
10696 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
10697
10698 size = 4;
10699 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10700 {
25f53a85 10701 r2off = get_r2off (info, stub_entry);
aa374f67
AM
10702 if (r2off == 0)
10703 {
10704 htab->stub_error = TRUE;
10705 return FALSE;
10706 }
ac2df442
AM
10707 size = 12;
10708 if (PPC_HA (r2off) != 0)
10709 size = 16;
10710 off -= size - 4;
ad8e1ba5
AM
10711 }
10712
10713 /* If the branch offset if too big, use a ppc_stub_plt_branch. */
721956f4
AM
10714 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10715 {
10716 struct ppc_branch_hash_entry *br_entry;
10717
10718 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10719 stub_entry->root.string + 9,
b34976b6 10720 TRUE, FALSE);
721956f4
AM
10721 if (br_entry == NULL)
10722 {
8de848d8 10723 info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
25f53a85 10724 stub_entry->root.string);
b34976b6
AM
10725 htab->stub_error = TRUE;
10726 return FALSE;
721956f4
AM
10727 }
10728
10729 if (br_entry->iter != htab->stub_iteration)
10730 {
10731 br_entry->iter = htab->stub_iteration;
eea6121a
AM
10732 br_entry->offset = htab->brlt->size;
10733 htab->brlt->size += 8;
63bc6f6c 10734
ee75fd95 10735 if (htab->relbrlt != NULL)
eea6121a 10736 htab->relbrlt->size += sizeof (Elf64_External_Rela);
84f5d08e
AM
10737 else if (info->emitrelocations)
10738 {
10739 htab->brlt->reloc_count += 1;
10740 htab->brlt->flags |= SEC_RELOC;
10741 }
721956f4 10742 }
ad8e1ba5
AM
10743
10744 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
ac2df442
AM
10745 off = (br_entry->offset
10746 + htab->brlt->output_offset
10747 + htab->brlt->output_section->vma
10748 - elf_gp (htab->brlt->output_section->owner)
10749 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10750
176a0d42
AM
10751 if (info->emitrelocations)
10752 {
10753 stub_entry->stub_sec->reloc_count += 1 + (PPC_HA (off) != 0);
10754 stub_entry->stub_sec->flags |= SEC_RELOC;
10755 }
10756
ac2df442
AM
10757 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10758 {
10759 size = 12;
176a0d42 10760 if (PPC_HA (off) != 0)
ac2df442
AM
10761 size = 16;
10762 }
10763 else
10764 {
10765 size = 20;
176a0d42 10766 if (PPC_HA (off) != 0)
ac2df442
AM
10767 size += 4;
10768
10769 if (PPC_HA (r2off) != 0)
10770 size += 4;
10771 }
721956f4 10772 }
84f5d08e
AM
10773 else if (info->emitrelocations)
10774 {
10775 stub_entry->stub_sec->reloc_count += 1;
10776 stub_entry->stub_sec->flags |= SEC_RELOC;
10777 }
721956f4
AM
10778 }
10779
eea6121a 10780 stub_entry->stub_sec->size += size;
b34976b6 10781 return TRUE;
721956f4
AM
10782}
10783
10784/* Set up various things so that we can make a list of input sections
10785 for each output section included in the link. Returns -1 on error,
cedb70c5 10786 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
10787
10788int
927be08e
AM
10789ppc64_elf_setup_section_lists
10790 (struct bfd_link_info *info,
10791 asection *(*add_stub_section) (const char *, asection *),
10792 void (*layout_sections_again) (void))
721956f4
AM
10793{
10794 bfd *input_bfd;
734b6cf9 10795 int top_id, top_index, id;
721956f4 10796 asection *section;
734b6cf9 10797 asection **input_list;
721956f4
AM
10798 bfd_size_type amt;
10799 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10800
4dfe6ac6
NC
10801 if (htab == NULL)
10802 return -1;
927be08e
AM
10803 /* Stash our params away. */
10804 htab->add_stub_section = add_stub_section;
10805 htab->layout_sections_again = layout_sections_again;
4c52953f 10806
1e2f5b6e 10807 /* Find the top input section id. */
3d6f9012 10808 for (input_bfd = info->input_bfds, top_id = 3;
721956f4
AM
10809 input_bfd != NULL;
10810 input_bfd = input_bfd->link_next)
10811 {
721956f4
AM
10812 for (section = input_bfd->sections;
10813 section != NULL;
10814 section = section->next)
10815 {
10816 if (top_id < section->id)
10817 top_id = section->id;
10818 }
10819 }
721956f4 10820
8f3bab57 10821 htab->top_id = top_id;
721956f4 10822 amt = sizeof (struct map_stub) * (top_id + 1);
4ce794b7 10823 htab->stub_group = bfd_zmalloc (amt);
721956f4
AM
10824 if (htab->stub_group == NULL)
10825 return -1;
10826
3d6f9012
AM
10827 /* Set toc_off for com, und, abs and ind sections. */
10828 for (id = 0; id < 3; id++)
10829 htab->stub_group[id].toc_off = TOC_BASE_OFF;
721956f4 10830
734b6cf9
AM
10831 /* We can't use output_bfd->section_count here to find the top output
10832 section index as some sections may have been removed, and
8423293d 10833 strip_excluded_output_sections doesn't renumber the indices. */
927be08e 10834 for (section = info->output_bfd->sections, top_index = 0;
734b6cf9
AM
10835 section != NULL;
10836 section = section->next)
10837 {
10838 if (top_index < section->index)
10839 top_index = section->index;
10840 }
10841
10842 htab->top_index = top_index;
10843 amt = sizeof (asection *) * (top_index + 1);
4ce794b7 10844 input_list = bfd_zmalloc (amt);
734b6cf9
AM
10845 htab->input_list = input_list;
10846 if (input_list == NULL)
10847 return -1;
10848
721956f4
AM
10849 return 1;
10850}
10851
927be08e
AM
10852/* Set up for first pass at multitoc partitioning. */
10853
10854void
10855ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
10856{
10857 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10858
1c865ab2 10859 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
10860 htab->toc_bfd = NULL;
10861 htab->toc_first_sec = NULL;
10862}
10863
e717da7e
AM
10864/* The linker repeatedly calls this function for each TOC input section
10865 and linker generated GOT section. Group input bfds such that the toc
927be08e 10866 within a group is less than 64k in size. */
ad8e1ba5 10867
927be08e 10868bfd_boolean
4ce794b7 10869ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
10870{
10871 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 10872 bfd_vma addr, off, limit;
ad8e1ba5 10873
4dfe6ac6
NC
10874 if (htab == NULL)
10875 return FALSE;
10876
927be08e 10877 if (!htab->second_toc_pass)
4c52953f 10878 {
927be08e 10879 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
10880 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
10881
10882 if (new_bfd)
bf102f86
AM
10883 {
10884 htab->toc_bfd = isec->owner;
10885 htab->toc_first_sec = isec;
10886 }
927be08e 10887
bf102f86
AM
10888 addr = isec->output_offset + isec->output_section->vma;
10889 off = addr - htab->toc_curr;
d77c8a4b
AM
10890 limit = 0x80008000;
10891 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
10892 limit = 0x10000;
10893 if (off + isec->size > limit)
bf102f86
AM
10894 {
10895 addr = (htab->toc_first_sec->output_offset
10896 + htab->toc_first_sec->output_section->vma);
10897 htab->toc_curr = addr;
10898 }
99877b66 10899
927be08e
AM
10900 /* toc_curr is the base address of this toc group. Set elf_gp
10901 for the input section to be the offset relative to the
10902 output toc base plus 0x8000. Making the input elf_gp an
10903 offset allows us to move the toc as a whole without
10904 recalculating input elf_gp. */
10905 off = htab->toc_curr - elf_gp (isec->output_section->owner);
10906 off += TOC_BASE_OFF;
10907
10908 /* Die if someone uses a linker script that doesn't keep input
10909 file .toc and .got together. */
a4fd3de5
AM
10910 if (new_bfd
10911 && elf_gp (isec->owner) != 0
927be08e
AM
10912 && elf_gp (isec->owner) != off)
10913 return FALSE;
10914
10915 elf_gp (isec->owner) = off;
10916 return TRUE;
4c52953f 10917 }
927be08e
AM
10918
10919 /* During the second pass toc_first_sec points to the start of
10920 a toc group, and toc_curr is used to track the old elf_gp.
10921 We use toc_bfd to ensure we only look at each bfd once. */
10922 if (htab->toc_bfd == isec->owner)
10923 return TRUE;
10924 htab->toc_bfd = isec->owner;
10925
10926 if (htab->toc_first_sec == NULL
10927 || htab->toc_curr != elf_gp (isec->owner))
10928 {
10929 htab->toc_curr = elf_gp (isec->owner);
10930 htab->toc_first_sec = isec;
10931 }
10932 addr = (htab->toc_first_sec->output_offset
10933 + htab->toc_first_sec->output_section->vma);
10934 off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
10935 elf_gp (isec->owner) = off;
10936
10937 return TRUE;
ad8e1ba5
AM
10938}
10939
927be08e
AM
10940/* Called via elf_link_hash_traverse to merge GOT entries for global
10941 symbol H. */
10942
10943static bfd_boolean
10944merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
10945{
10946 if (h->root.type == bfd_link_hash_indirect)
10947 return TRUE;
10948
927be08e
AM
10949 merge_got_entries (&h->got.glist);
10950
10951 return TRUE;
10952}
10953
10954/* Called via elf_link_hash_traverse to allocate GOT entries for global
10955 symbol H. */
10956
10957static bfd_boolean
10958reallocate_got (struct elf_link_hash_entry *h, void *inf)
10959{
10960 struct got_entry *gent;
10961
10962 if (h->root.type == bfd_link_hash_indirect)
10963 return TRUE;
10964
927be08e
AM
10965 for (gent = h->got.glist; gent != NULL; gent = gent->next)
10966 if (!gent->is_indirect)
10967 allocate_got (h, (struct bfd_link_info *) inf, gent);
10968 return TRUE;
10969}
10970
10971/* Called on the first multitoc pass after the last call to
10972 ppc64_elf_next_toc_section. This function removes duplicate GOT
10973 entries. */
10974
10975bfd_boolean
10976ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
10977{
10978 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
10979 struct bfd *ibfd, *ibfd2;
10980 bfd_boolean done_something;
10981
10982 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 10983
7865406b
AM
10984 if (!htab->do_multi_toc)
10985 return FALSE;
10986
d0fae19d 10987 /* Merge global sym got entries within a toc group. */
927be08e
AM
10988 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
10989
10990 /* And tlsld_got. */
10991 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10992 {
10993 struct got_entry *ent, *ent2;
10994
10995 if (!is_ppc64_elf (ibfd))
10996 continue;
10997
10998 ent = ppc64_tlsld_got (ibfd);
10999 if (!ent->is_indirect
11000 && ent->got.offset != (bfd_vma) -1)
11001 {
11002 for (ibfd2 = ibfd->link_next; ibfd2 != NULL; ibfd2 = ibfd2->link_next)
11003 {
11004 if (!is_ppc64_elf (ibfd2))
11005 continue;
11006
11007 ent2 = ppc64_tlsld_got (ibfd2);
11008 if (!ent2->is_indirect
11009 && ent2->got.offset != (bfd_vma) -1
11010 && elf_gp (ibfd2) == elf_gp (ibfd))
11011 {
11012 ent2->is_indirect = TRUE;
11013 ent2->got.ent = ent;
11014 }
11015 }
11016 }
11017 }
11018
11019 /* Zap sizes of got sections. */
11020 htab->reliplt->rawsize = htab->reliplt->size;
11021 htab->reliplt->size -= htab->got_reli_size;
11022 htab->got_reli_size = 0;
11023
11024 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11025 {
11026 asection *got, *relgot;
11027
11028 if (!is_ppc64_elf (ibfd))
11029 continue;
11030
11031 got = ppc64_elf_tdata (ibfd)->got;
11032 if (got != NULL)
11033 {
11034 got->rawsize = got->size;
11035 got->size = 0;
11036 relgot = ppc64_elf_tdata (ibfd)->relgot;
11037 relgot->rawsize = relgot->size;
11038 relgot->size = 0;
11039 }
11040 }
11041
11042 /* Now reallocate the got, local syms first. We don't need to
11043 allocate section contents again since we never increase size. */
11044 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11045 {
11046 struct got_entry **lgot_ents;
11047 struct got_entry **end_lgot_ents;
11048 struct plt_entry **local_plt;
11049 struct plt_entry **end_local_plt;
f961d9dd 11050 unsigned char *lgot_masks;
927be08e
AM
11051 bfd_size_type locsymcount;
11052 Elf_Internal_Shdr *symtab_hdr;
19e08130 11053 asection *s;
927be08e
AM
11054
11055 if (!is_ppc64_elf (ibfd))
11056 continue;
11057
11058 lgot_ents = elf_local_got_ents (ibfd);
11059 if (!lgot_ents)
11060 continue;
11061
11062 symtab_hdr = &elf_symtab_hdr (ibfd);
11063 locsymcount = symtab_hdr->sh_info;
11064 end_lgot_ents = lgot_ents + locsymcount;
11065 local_plt = (struct plt_entry **) end_lgot_ents;
11066 end_local_plt = local_plt + locsymcount;
f961d9dd 11067 lgot_masks = (unsigned char *) end_local_plt;
927be08e 11068 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
11069 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11070 {
11071 struct got_entry *ent;
11072
11073 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 11074 {
19e08130
AM
11075 unsigned int ent_size = 8;
11076 unsigned int rel_size = sizeof (Elf64_External_Rela);
11077
d0fae19d
AM
11078 ent->got.offset = s->size;
11079 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 11080 {
19e08130
AM
11081 ent_size *= 2;
11082 rel_size *= 2;
11083 }
11084 s->size += ent_size;
11085 if ((*lgot_masks & PLT_IFUNC) != 0)
11086 {
11087 htab->reliplt->size += rel_size;
11088 htab->got_reli_size += rel_size;
11089 }
11090 else if (info->shared)
11091 {
11092 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11093 srel->size += rel_size;
d0fae19d
AM
11094 }
11095 }
927be08e
AM
11096 }
11097 }
11098
11099 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
11100
11101 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11102 {
11103 struct got_entry *ent;
11104
11105 if (!is_ppc64_elf (ibfd))
11106 continue;
11107
11108 ent = ppc64_tlsld_got (ibfd);
11109 if (!ent->is_indirect
11110 && ent->got.offset != (bfd_vma) -1)
11111 {
11112 asection *s = ppc64_elf_tdata (ibfd)->got;
11113 ent->got.offset = s->size;
11114 s->size += 16;
11115 if (info->shared)
11116 {
11117 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11118 srel->size += sizeof (Elf64_External_Rela);
11119 }
11120 }
11121 }
11122
11123 done_something = htab->reliplt->rawsize != htab->reliplt->size;
11124 if (!done_something)
11125 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11126 {
11127 asection *got;
11128
11129 if (!is_ppc64_elf (ibfd))
11130 continue;
11131
11132 got = ppc64_elf_tdata (ibfd)->got;
11133 if (got != NULL)
11134 {
11135 done_something = got->rawsize != got->size;
11136 if (done_something)
11137 break;
11138 }
11139 }
11140
11141 if (done_something)
11142 (*htab->layout_sections_again) ();
11143
11144 /* Set up for second pass over toc sections to recalculate elf_gp
11145 on input sections. */
11146 htab->toc_bfd = NULL;
11147 htab->toc_first_sec = NULL;
11148 htab->second_toc_pass = TRUE;
11149 return done_something;
11150}
11151
11152/* Called after second pass of multitoc partitioning. */
11153
11154void
11155ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
11156{
11157 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11158
11159 /* After the second pass, toc_curr tracks the TOC offset used
11160 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 11161 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
11162}
11163
9b5ecbd0
AM
11164/* No toc references were found in ISEC. If the code in ISEC makes no
11165 calls, then there's no need to use toc adjusting stubs when branching
11166 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
11167 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11168 needed, and 2 if a cyclical call-graph was found but no other reason
11169 for a stub was detected. If called from the top level, a return of
11170 2 means the same as a return of 0. */
9b5ecbd0
AM
11171
11172static int
4ce794b7 11173toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 11174{
9b5ecbd0 11175 int ret;
70cc837d
AM
11176
11177 /* Mark this section as checked. */
11178 isec->call_check_done = 1;
9b5ecbd0 11179
772119ce
AM
11180 /* We know none of our code bearing sections will need toc stubs. */
11181 if ((isec->flags & SEC_LINKER_CREATED) != 0)
11182 return 0;
11183
eea6121a 11184 if (isec->size == 0)
082c50f8
AM
11185 return 0;
11186
4c52953f
AM
11187 if (isec->output_section == NULL)
11188 return 0;
11189
4c52953f 11190 ret = 0;
70cc837d 11191 if (isec->reloc_count != 0)
9b5ecbd0 11192 {
70cc837d
AM
11193 Elf_Internal_Rela *relstart, *rel;
11194 Elf_Internal_Sym *local_syms;
11195 struct ppc_link_hash_table *htab;
2917689a 11196
70cc837d
AM
11197 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
11198 info->keep_memory);
11199 if (relstart == NULL)
11200 return -1;
90aecf7a 11201
70cc837d
AM
11202 /* Look for branches to outside of this section. */
11203 local_syms = NULL;
11204 htab = ppc_hash_table (info);
11205 if (htab == NULL)
11206 return -1;
4c52953f 11207
70cc837d 11208 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 11209 {
70cc837d
AM
11210 enum elf_ppc64_reloc_type r_type;
11211 unsigned long r_symndx;
11212 struct elf_link_hash_entry *h;
11213 struct ppc_link_hash_entry *eh;
11214 Elf_Internal_Sym *sym;
11215 asection *sym_sec;
11216 struct _opd_sec_data *opd;
11217 bfd_vma sym_value;
11218 bfd_vma dest;
11219
11220 r_type = ELF64_R_TYPE (rel->r_info);
11221 if (r_type != R_PPC64_REL24
11222 && r_type != R_PPC64_REL14
11223 && r_type != R_PPC64_REL14_BRTAKEN
11224 && r_type != R_PPC64_REL14_BRNTAKEN)
11225 continue;
4c52953f 11226
70cc837d
AM
11227 r_symndx = ELF64_R_SYM (rel->r_info);
11228 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
11229 isec->owner))
4c52953f 11230 {
70cc837d
AM
11231 ret = -1;
11232 break;
11233 }
4c52953f 11234
70cc837d
AM
11235 /* Calls to dynamic lib functions go through a plt call stub
11236 that uses r2. */
11237 eh = (struct ppc_link_hash_entry *) h;
11238 if (eh != NULL
11239 && (eh->elf.plt.plist != NULL
11240 || (eh->oh != NULL
11241 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
11242 {
11243 ret = 1;
11244 break;
4c52953f
AM
11245 }
11246
70cc837d
AM
11247 if (sym_sec == NULL)
11248 /* Ignore other undefined symbols. */
4c52953f 11249 continue;
4c52953f 11250
70cc837d
AM
11251 /* Assume branches to other sections not included in the
11252 link need stubs too, to cover -R and absolute syms. */
11253 if (sym_sec->output_section == NULL)
11254 {
11255 ret = 1;
11256 break;
11257 }
4c52953f 11258
70cc837d
AM
11259 if (h == NULL)
11260 sym_value = sym->st_value;
11261 else
11262 {
11263 if (h->root.type != bfd_link_hash_defined
11264 && h->root.type != bfd_link_hash_defweak)
11265 abort ();
11266 sym_value = h->root.u.def.value;
11267 }
11268 sym_value += rel->r_addend;
4c52953f 11269
70cc837d
AM
11270 /* If this branch reloc uses an opd sym, find the code section. */
11271 opd = get_opd_info (sym_sec);
11272 if (opd != NULL)
11273 {
11274 if (h == NULL && opd->adjust != NULL)
11275 {
11276 long adjust;
4c52953f 11277
70cc837d
AM
11278 adjust = opd->adjust[sym->st_value / 8];
11279 if (adjust == -1)
11280 /* Assume deleted functions won't ever be called. */
11281 continue;
11282 sym_value += adjust;
11283 }
4c52953f 11284
aef36ac1
AM
11285 dest = opd_entry_value (sym_sec, sym_value,
11286 &sym_sec, NULL, FALSE);
70cc837d
AM
11287 if (dest == (bfd_vma) -1)
11288 continue;
11289 }
11290 else
11291 dest = (sym_value
11292 + sym_sec->output_offset
11293 + sym_sec->output_section->vma);
4c52953f 11294
70cc837d
AM
11295 /* Ignore branch to self. */
11296 if (sym_sec == isec)
11297 continue;
4c52953f 11298
70cc837d
AM
11299 /* If the called function uses the toc, we need a stub. */
11300 if (sym_sec->has_toc_reloc
11301 || sym_sec->makes_toc_func_call)
4c52953f 11302 {
70cc837d 11303 ret = 1;
4c52953f
AM
11304 break;
11305 }
70cc837d
AM
11306
11307 /* Assume any branch that needs a long branch stub might in fact
11308 need a plt_branch stub. A plt_branch stub uses r2. */
11309 else if (dest - (isec->output_offset
11310 + isec->output_section->vma
11311 + rel->r_offset) + (1 << 25) >= (2 << 25))
4c52953f 11312 {
70cc837d
AM
11313 ret = 1;
11314 break;
11315 }
11316
11317 /* If calling back to a section in the process of being
11318 tested, we can't say for sure that no toc adjusting stubs
11319 are needed, so don't return zero. */
11320 else if (sym_sec->call_check_in_progress)
11321 ret = 2;
11322
11323 /* Branches to another section that itself doesn't have any TOC
11324 references are OK. Recursively call ourselves to check. */
11325 else if (!sym_sec->call_check_done)
11326 {
11327 int recur;
11328
11329 /* Mark current section as indeterminate, so that other
11330 sections that call back to current won't be marked as
11331 known. */
11332 isec->call_check_in_progress = 1;
11333 recur = toc_adjusting_stub_needed (info, sym_sec);
11334 isec->call_check_in_progress = 0;
11335
4c52953f
AM
11336 if (recur != 0)
11337 {
70cc837d
AM
11338 ret = recur;
11339 if (recur != 2)
11340 break;
4c52953f
AM
11341 }
11342 }
4c52953f 11343 }
70cc837d
AM
11344
11345 if (local_syms != NULL
11346 && (elf_symtab_hdr (isec->owner).contents
11347 != (unsigned char *) local_syms))
11348 free (local_syms);
11349 if (elf_section_data (isec)->relocs != relstart)
11350 free (relstart);
9b5ecbd0
AM
11351 }
11352
70cc837d
AM
11353 if ((ret & 1) == 0
11354 && isec->map_head.s != NULL
11355 && (strcmp (isec->output_section->name, ".init") == 0
11356 || strcmp (isec->output_section->name, ".fini") == 0))
11357 {
11358 if (isec->map_head.s->has_toc_reloc
11359 || isec->map_head.s->makes_toc_func_call)
11360 ret = 1;
11361 else if (!isec->map_head.s->call_check_done)
11362 {
11363 int recur;
11364 isec->call_check_in_progress = 1;
11365 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
11366 isec->call_check_in_progress = 0;
11367 if (recur != 0)
11368 ret = recur;
11369 }
11370 }
11371
11372 if (ret == 1)
11373 isec->makes_toc_func_call = 1;
4c52953f 11374
9b5ecbd0
AM
11375 return ret;
11376}
11377
721956f4
AM
11378/* The linker repeatedly calls this function for each input section,
11379 in the order that input sections are linked into output sections.
11380 Build lists of input sections to determine groupings between which
11381 we may insert linker stubs. */
11382
9b5ecbd0 11383bfd_boolean
4ce794b7 11384ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
11385{
11386 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11387
4dfe6ac6
NC
11388 if (htab == NULL)
11389 return FALSE;
11390
734b6cf9
AM
11391 if ((isec->output_section->flags & SEC_CODE) != 0
11392 && isec->output_section->index <= htab->top_index)
721956f4 11393 {
734b6cf9 11394 asection **list = htab->input_list + isec->output_section->index;
3d6f9012 11395 /* Steal the link_sec pointer for our list. */
721956f4 11396#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3d6f9012
AM
11397 /* This happens to make the list in reverse order,
11398 which is what we want. */
734b6cf9
AM
11399 PREV_SEC (isec) = *list;
11400 *list = isec;
721956f4 11401 }
ad8e1ba5 11402
4c52953f 11403 if (htab->multi_toc_needed)
9b5ecbd0 11404 {
4c52953f
AM
11405 /* If a code section has a function that uses the TOC then we need
11406 to use the right TOC (obviously). Also, make sure that .opd gets
11407 the correct TOC value for R_PPC64_TOC relocs that don't have or
f94498ff
AM
11408 can't find their function symbol (shouldn't ever happen now).
11409 Also specially treat .fixup for the linux kernel. .fixup
11410 contains branches, but only back to the function that hit an
11411 exception. */
11412 if (isec->has_toc_reloc
11413 || (isec->flags & SEC_CODE) == 0
11414 || strcmp (isec->name, ".fixup") == 0)
4c52953f
AM
11415 {
11416 if (elf_gp (isec->owner) != 0)
11417 htab->toc_curr = elf_gp (isec->owner);
11418 }
6683a28d
AM
11419 else
11420 {
11421 if (!isec->call_check_done
11422 && toc_adjusting_stub_needed (info, isec) < 0)
11423 return FALSE;
11424 /* If we make a local call from this section, ie. a branch
11425 without a following nop, then we have no place to put a
11426 toc restoring insn. We must use the same toc group as
11427 the callee.
11428 Testing makes_toc_func_call actually tests for *any*
11429 calls to functions that need a good toc pointer. A more
11430 precise test would be better, as this one will set
11431 incorrect values for pasted .init/.fini fragments.
11432 (Fixed later in check_pasted_section.) */
11433 if (isec->makes_toc_func_call
11434 && elf_gp (isec->owner) != 0)
11435 htab->toc_curr = elf_gp (isec->owner);
11436 }
9b5ecbd0 11437 }
ad8e1ba5
AM
11438
11439 /* Functions that don't use the TOC can belong in any TOC group.
6683a28d 11440 Use the last TOC base. */
ad8e1ba5 11441 htab->stub_group[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 11442 return TRUE;
721956f4
AM
11443}
11444
70cc837d
AM
11445/* Check that all .init and .fini sections use the same toc, if they
11446 have toc relocs. */
11447
11448static bfd_boolean
11449check_pasted_section (struct bfd_link_info *info, const char *name)
11450{
11451 asection *o = bfd_get_section_by_name (info->output_bfd, name);
11452
11453 if (o != NULL)
11454 {
11455 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11456 bfd_vma toc_off = 0;
11457 asection *i;
11458
11459 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11460 if (i->has_toc_reloc)
11461 {
11462 if (toc_off == 0)
11463 toc_off = htab->stub_group[i->id].toc_off;
11464 else if (toc_off != htab->stub_group[i->id].toc_off)
11465 return FALSE;
11466 }
6683a28d
AM
11467
11468 if (toc_off == 0)
11469 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11470 if (i->makes_toc_func_call)
11471 {
11472 toc_off = htab->stub_group[i->id].toc_off;
11473 break;
11474 }
11475
70cc837d
AM
11476 /* Make sure the whole pasted function uses the same toc offset. */
11477 if (toc_off != 0)
11478 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11479 htab->stub_group[i->id].toc_off = toc_off;
11480 }
11481 return TRUE;
11482}
11483
11484bfd_boolean
11485ppc64_elf_check_init_fini (struct bfd_link_info *info)
11486{
11487 return (check_pasted_section (info, ".init")
11488 & check_pasted_section (info, ".fini"));
11489}
11490
721956f4
AM
11491/* See whether we can group stub sections together. Grouping stub
11492 sections may result in fewer stubs. More importantly, we need to
11493 put all .init* and .fini* stubs at the beginning of the .init or
11494 .fini output sections respectively, because glibc splits the
11495 _init and _fini functions into multiple parts. Putting a stub in
11496 the middle of a function is not a good idea. */
11497
11498static void
4ce794b7
AM
11499group_sections (struct ppc_link_hash_table *htab,
11500 bfd_size_type stub_group_size,
11501 bfd_boolean stubs_always_before_branch)
721956f4 11502{
7c8fe5c4
AM
11503 asection **list;
11504 bfd_size_type stub14_group_size;
11505 bfd_boolean suppress_size_errors;
11506
11507 suppress_size_errors = FALSE;
11508 stub14_group_size = stub_group_size;
11509 if (stub_group_size == 1)
11510 {
11511 /* Default values. */
11512 if (stubs_always_before_branch)
11513 {
11514 stub_group_size = 0x1e00000;
11515 stub14_group_size = 0x7800;
11516 }
11517 else
11518 {
11519 stub_group_size = 0x1c00000;
11520 stub14_group_size = 0x7000;
11521 }
11522 suppress_size_errors = TRUE;
11523 }
11524
11525 list = htab->input_list + htab->top_index;
734b6cf9 11526 do
721956f4 11527 {
734b6cf9
AM
11528 asection *tail = *list;
11529 while (tail != NULL)
721956f4 11530 {
734b6cf9
AM
11531 asection *curr;
11532 asection *prev;
11533 bfd_size_type total;
11534 bfd_boolean big_sec;
11535 bfd_vma curr_toc;
11536
11537 curr = tail;
eea6121a 11538 total = tail->size;
6bee8834
AM
11539 big_sec = total > (ppc64_elf_section_data (tail) != NULL
11540 && ppc64_elf_section_data (tail)->has_14bit_branch
7c8fe5c4
AM
11541 ? stub14_group_size : stub_group_size);
11542 if (big_sec && !suppress_size_errors)
5c3dead3
AM
11543 (*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
11544 tail->owner, tail);
734b6cf9
AM
11545 curr_toc = htab->stub_group[tail->id].toc_off;
11546
11547 while ((prev = PREV_SEC (curr)) != NULL
11548 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
11549 < (ppc64_elf_section_data (prev) != NULL
11550 && ppc64_elf_section_data (prev)->has_14bit_branch
7c8fe5c4 11551 ? stub14_group_size : stub_group_size))
ad8e1ba5 11552 && htab->stub_group[prev->id].toc_off == curr_toc)
734b6cf9
AM
11553 curr = prev;
11554
11555 /* OK, the size from the start of CURR to the end is less
11556 than stub_group_size and thus can be handled by one stub
11557 section. (or the tail section is itself larger than
11558 stub_group_size, in which case we may be toast.) We
11559 should really be keeping track of the total size of stubs
11560 added here, as stubs contribute to the final output
11561 section size. That's a little tricky, and this way will
11562 only break if stubs added make the total size more than
11563 2^25, ie. for the default stub_group_size, if stubs total
11564 more than 2097152 bytes, or nearly 75000 plt call stubs. */
11565 do
721956f4
AM
11566 {
11567 prev = PREV_SEC (tail);
734b6cf9 11568 /* Set up this stub group. */
721956f4
AM
11569 htab->stub_group[tail->id].link_sec = curr;
11570 }
734b6cf9
AM
11571 while (tail != curr && (tail = prev) != NULL);
11572
11573 /* But wait, there's more! Input sections up to stub_group_size
11574 bytes before the stub section can be handled by it too.
11575 Don't do this if we have a really large section after the
11576 stubs, as adding more stubs increases the chance that
11577 branches may not reach into the stub section. */
11578 if (!stubs_always_before_branch && !big_sec)
11579 {
11580 total = 0;
11581 while (prev != NULL
11582 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
11583 < (ppc64_elf_section_data (prev) != NULL
11584 && ppc64_elf_section_data (prev)->has_14bit_branch
7c8fe5c4 11585 ? stub14_group_size : stub_group_size))
734b6cf9
AM
11586 && htab->stub_group[prev->id].toc_off == curr_toc)
11587 {
11588 tail = prev;
11589 prev = PREV_SEC (tail);
11590 htab->stub_group[tail->id].link_sec = curr;
11591 }
11592 }
11593 tail = prev;
721956f4
AM
11594 }
11595 }
734b6cf9
AM
11596 while (list-- != htab->input_list);
11597 free (htab->input_list);
721956f4
AM
11598#undef PREV_SEC
11599}
11600
58d180e8
AM
11601static const unsigned char glink_eh_frame_cie[] =
11602{
11603 0, 0, 0, 16, /* length. */
11604 0, 0, 0, 0, /* id. */
11605 1, /* CIE version. */
11606 'z', 'R', 0, /* Augmentation string. */
11607 4, /* Code alignment. */
11608 0x78, /* Data alignment. */
11609 65, /* RA reg. */
11610 1, /* Augmentation size. */
11611 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
11612 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
11613};
11614
d969d15f
AM
11615/* Stripping output sections is normally done before dynamic section
11616 symbols have been allocated. This function is called later, and
11617 handles cases like htab->brlt which is mapped to its own output
11618 section. */
11619
11620static void
11621maybe_strip_output (struct bfd_link_info *info, asection *isec)
11622{
11623 if (isec->size == 0
11624 && isec->output_section->size == 0
53d8967a 11625 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
11626 && !bfd_section_removed_from_list (info->output_bfd,
11627 isec->output_section)
11628 && elf_section_data (isec->output_section)->dynindx == 0)
11629 {
11630 isec->output_section->flags |= SEC_EXCLUDE;
11631 bfd_section_list_remove (info->output_bfd, isec->output_section);
11632 info->output_bfd->section_count--;
11633 }
11634}
11635
721956f4
AM
11636/* Determine and set the size of the stub section for a final link.
11637
11638 The basic idea here is to examine all the relocations looking for
11639 PC-relative calls to a target that is unreachable with a "bl"
11640 instruction. */
11641
b34976b6 11642bfd_boolean
9df0ef5f 11643ppc64_elf_size_stubs (struct bfd_link_info *info, bfd_signed_vma group_size,
794e51c0
AM
11644 bfd_boolean plt_static_chain, int plt_thread_safe,
11645 int plt_stub_align)
721956f4
AM
11646{
11647 bfd_size_type stub_group_size;
b34976b6 11648 bfd_boolean stubs_always_before_branch;
721956f4
AM
11649 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11650
4dfe6ac6
NC
11651 if (htab == NULL)
11652 return FALSE;
11653
9df0ef5f 11654 htab->plt_static_chain = plt_static_chain;
794e51c0 11655 htab->plt_stub_align = plt_stub_align;
e2458743
AM
11656 if (plt_thread_safe == -1 && !info->executable)
11657 plt_thread_safe = 1;
794e51c0
AM
11658 if (plt_thread_safe == -1)
11659 {
e2458743 11660 static const char *const thread_starter[] =
794e51c0
AM
11661 {
11662 "pthread_create",
11663 /* libstdc++ */
11664 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
11665 /* librt */
11666 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
11667 "mq_notify", "create_timer",
11668 /* libanl */
11669 "getaddrinfo_a",
11670 /* libgomp */
11671 "GOMP_parallel_start",
11672 "GOMP_parallel_loop_static_start",
11673 "GOMP_parallel_loop_dynamic_start",
11674 "GOMP_parallel_loop_guided_start",
11675 "GOMP_parallel_loop_runtime_start",
68ffbac6 11676 "GOMP_parallel_sections_start",
794e51c0
AM
11677 };
11678 unsigned i;
11679
11680 for (i = 0; i < sizeof (thread_starter)/ sizeof (thread_starter[0]); i++)
11681 {
11682 struct elf_link_hash_entry *h;
11683 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
11684 FALSE, FALSE, TRUE);
11685 plt_thread_safe = h != NULL && h->ref_regular;
11686 if (plt_thread_safe)
11687 break;
11688 }
11689 }
11690 htab->plt_thread_safe = plt_thread_safe;
721956f4
AM
11691 stubs_always_before_branch = group_size < 0;
11692 if (group_size < 0)
11693 stub_group_size = -group_size;
11694 else
11695 stub_group_size = group_size;
721956f4
AM
11696
11697 group_sections (htab, stub_group_size, stubs_always_before_branch);
11698
721956f4
AM
11699 while (1)
11700 {
11701 bfd *input_bfd;
11702 unsigned int bfd_indx;
11703 asection *stub_sec;
721956f4
AM
11704
11705 htab->stub_iteration += 1;
721956f4
AM
11706
11707 for (input_bfd = info->input_bfds, bfd_indx = 0;
11708 input_bfd != NULL;
11709 input_bfd = input_bfd->link_next, bfd_indx++)
11710 {
11711 Elf_Internal_Shdr *symtab_hdr;
11712 asection *section;
6cdc0ccc 11713 Elf_Internal_Sym *local_syms = NULL;
721956f4 11714
0c8d6e5c 11715 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
11716 continue;
11717
721956f4 11718 /* We'll need the symbol table in a second. */
0ffa91dd 11719 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
11720 if (symtab_hdr->sh_info == 0)
11721 continue;
11722
721956f4
AM
11723 /* Walk over each section attached to the input bfd. */
11724 for (section = input_bfd->sections;
11725 section != NULL;
11726 section = section->next)
11727 {
721956f4 11728 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
11729
11730 /* If there aren't any relocs, then there's nothing more
11731 to do. */
11732 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
11733 || (section->flags & SEC_ALLOC) == 0
11734 || (section->flags & SEC_LOAD) == 0
11735 || (section->flags & SEC_CODE) == 0
721956f4
AM
11736 || section->reloc_count == 0)
11737 continue;
11738
11739 /* If this section is a link-once section that will be
11740 discarded, then don't create any stubs. */
11741 if (section->output_section == NULL
927be08e 11742 || section->output_section->owner != info->output_bfd)
721956f4
AM
11743 continue;
11744
1e2f5b6e
AM
11745 /* Get the relocs. */
11746 internal_relocs
4ce794b7 11747 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 11748 info->keep_memory);
721956f4 11749 if (internal_relocs == NULL)
1e2f5b6e 11750 goto error_ret_free_local;
721956f4
AM
11751
11752 /* Now examine each relocation. */
11753 irela = internal_relocs;
11754 irelaend = irela + section->reloc_count;
11755 for (; irela < irelaend; irela++)
11756 {
4ce794b7
AM
11757 enum elf_ppc64_reloc_type r_type;
11758 unsigned int r_indx;
721956f4
AM
11759 enum ppc_stub_type stub_type;
11760 struct ppc_stub_hash_entry *stub_entry;
8387904d 11761 asection *sym_sec, *code_sec;
e054468f 11762 bfd_vma sym_value, code_value;
721956f4 11763 bfd_vma destination;
8843416a 11764 bfd_boolean ok_dest;
721956f4 11765 struct ppc_link_hash_entry *hash;
8387904d 11766 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
11767 struct elf_link_hash_entry *h;
11768 Elf_Internal_Sym *sym;
721956f4
AM
11769 char *stub_name;
11770 const asection *id_sec;
74f0fb50 11771 struct _opd_sec_data *opd;
e054468f 11772 struct plt_entry *plt_ent;
721956f4
AM
11773
11774 r_type = ELF64_R_TYPE (irela->r_info);
11775 r_indx = ELF64_R_SYM (irela->r_info);
11776
4ce794b7 11777 if (r_type >= R_PPC64_max)
721956f4
AM
11778 {
11779 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 11780 goto error_ret_free_internal;
721956f4
AM
11781 }
11782
11783 /* Only look for stubs on branch instructions. */
4ce794b7
AM
11784 if (r_type != R_PPC64_REL24
11785 && r_type != R_PPC64_REL14
11786 && r_type != R_PPC64_REL14_BRTAKEN
11787 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
11788 continue;
11789
11790 /* Now determine the call target, its name, value,
11791 section. */
411e1bfb
AM
11792 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
11793 r_indx, input_bfd))
11794 goto error_ret_free_internal;
11795 hash = (struct ppc_link_hash_entry *) h;
11796
8843416a 11797 ok_dest = FALSE;
8387904d 11798 fdh = NULL;
7fe2b9a6 11799 sym_value = 0;
411e1bfb 11800 if (hash == NULL)
721956f4 11801 {
411e1bfb 11802 sym_value = sym->st_value;
8843416a 11803 ok_dest = TRUE;
721956f4 11804 }
7fe2b9a6
AM
11805 else if (hash->elf.root.type == bfd_link_hash_defined
11806 || hash->elf.root.type == bfd_link_hash_defweak)
11807 {
11808 sym_value = hash->elf.root.u.def.value;
11809 if (sym_sec->output_section != NULL)
11810 ok_dest = TRUE;
11811 }
11812 else if (hash->elf.root.type == bfd_link_hash_undefweak
11813 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 11814 {
99877b66 11815 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
11816 use the func descriptor sym instead if it is
11817 defined. */
ceb1f1ef 11818 if (hash->elf.root.root.string[0] == '.'
b31867b6 11819 && (fdh = lookup_fdh (hash, htab)) != NULL)
8387904d 11820 {
8387904d
AM
11821 if (fdh->elf.root.type == bfd_link_hash_defined
11822 || fdh->elf.root.type == bfd_link_hash_defweak)
11823 {
11824 sym_sec = fdh->elf.root.u.def.section;
11825 sym_value = fdh->elf.root.u.def.value;
11826 if (sym_sec->output_section != NULL)
11827 ok_dest = TRUE;
11828 }
99877b66
AM
11829 else
11830 fdh = NULL;
8387904d 11831 }
7fe2b9a6
AM
11832 }
11833 else
11834 {
11835 bfd_set_error (bfd_error_bad_value);
11836 goto error_ret_free_internal;
721956f4
AM
11837 }
11838
8843416a
AM
11839 destination = 0;
11840 if (ok_dest)
11841 {
11842 sym_value += irela->r_addend;
11843 destination = (sym_value
11844 + sym_sec->output_offset
11845 + sym_sec->output_section->vma);
11846 }
11847
8387904d 11848 code_sec = sym_sec;
e054468f 11849 code_value = sym_value;
74f0fb50
AM
11850 opd = get_opd_info (sym_sec);
11851 if (opd != NULL)
8387904d
AM
11852 {
11853 bfd_vma dest;
11854
74f0fb50 11855 if (hash == NULL && opd->adjust != NULL)
8387904d 11856 {
74f0fb50 11857 long adjust = opd->adjust[sym_value / 8];
8387904d
AM
11858 if (adjust == -1)
11859 continue;
e054468f 11860 code_value += adjust;
8387904d
AM
11861 sym_value += adjust;
11862 }
11863 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 11864 &code_sec, &code_value, FALSE);
8387904d
AM
11865 if (dest != (bfd_vma) -1)
11866 {
11867 destination = dest;
11868 if (fdh != NULL)
11869 {
11870 /* Fixup old ABI sym to point at code
11871 entry. */
99877b66 11872 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 11873 hash->elf.root.u.def.section = code_sec;
e054468f 11874 hash->elf.root.u.def.value = code_value;
8387904d
AM
11875 }
11876 }
11877 }
11878
721956f4 11879 /* Determine what (if any) linker stub is needed. */
e054468f 11880 plt_ent = NULL;
721956f4 11881 stub_type = ppc_type_of_stub (section, irela, &hash,
e054468f 11882 &plt_ent, destination);
ad8e1ba5
AM
11883
11884 if (stub_type != ppc_stub_plt_call)
11885 {
11886 /* Check whether we need a TOC adjusting stub.
11887 Since the linker pastes together pieces from
11888 different object files when creating the
11889 _init and _fini functions, it may be that a
11890 call to what looks like a local sym is in
11891 fact a call needing a TOC adjustment. */
8387904d
AM
11892 if (code_sec != NULL
11893 && code_sec->output_section != NULL
11894 && (htab->stub_group[code_sec->id].toc_off
9b5ecbd0 11895 != htab->stub_group[section->id].toc_off)
4c52953f
AM
11896 && (code_sec->has_toc_reloc
11897 || code_sec->makes_toc_func_call))
ad8e1ba5
AM
11898 stub_type = ppc_stub_long_branch_r2off;
11899 }
11900
721956f4
AM
11901 if (stub_type == ppc_stub_none)
11902 continue;
11903
411e1bfb
AM
11904 /* __tls_get_addr calls might be eliminated. */
11905 if (stub_type != ppc_stub_plt_call
11906 && hash != NULL
8387904d
AM
11907 && (hash == htab->tls_get_addr
11908 || hash == htab->tls_get_addr_fd)
411e1bfb
AM
11909 && section->has_tls_reloc
11910 && irela != internal_relocs)
11911 {
11912 /* Get tls info. */
f961d9dd 11913 unsigned char *tls_mask;
411e1bfb 11914
3a71aa26 11915 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
11916 irela - 1, input_bfd))
11917 goto error_ret_free_internal;
e7b938ca 11918 if (*tls_mask != 0)
411e1bfb
AM
11919 continue;
11920 }
11921
3b421ab3
AM
11922 if (stub_type == ppc_stub_plt_call
11923 && irela + 1 < irelaend
11924 && irela[1].r_offset == irela->r_offset + 4
794e51c0
AM
11925 && ELF64_R_TYPE (irela[1].r_info) == R_PPC64_TOCSAVE)
11926 {
11927 if (!tocsave_find (htab, INSERT,
11928 &local_syms, irela + 1, input_bfd))
11929 goto error_ret_free_internal;
11930 }
11931 else if (stub_type == ppc_stub_plt_call)
11932 stub_type = ppc_stub_plt_call_r2save;
3b421ab3 11933
721956f4
AM
11934 /* Support for grouping stub sections. */
11935 id_sec = htab->stub_group[section->id].link_sec;
11936
11937 /* Get the name of this stub. */
11938 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
11939 if (!stub_name)
11940 goto error_ret_free_internal;
11941
11942 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 11943 stub_name, FALSE, FALSE);
721956f4
AM
11944 if (stub_entry != NULL)
11945 {
11946 /* The proper stub has already been created. */
11947 free (stub_name);
794e51c0
AM
11948 if (stub_type == ppc_stub_plt_call_r2save)
11949 stub_entry->stub_type = stub_type;
721956f4
AM
11950 continue;
11951 }
11952
25f53a85 11953 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
11954 if (stub_entry == NULL)
11955 {
11956 free (stub_name);
6cdc0ccc
AM
11957 error_ret_free_internal:
11958 if (elf_section_data (section)->relocs == NULL)
11959 free (internal_relocs);
11960 error_ret_free_local:
11961 if (local_syms != NULL
11962 && (symtab_hdr->contents
11963 != (unsigned char *) local_syms))
11964 free (local_syms);
b34976b6 11965 return FALSE;
721956f4
AM
11966 }
11967
ad8e1ba5 11968 stub_entry->stub_type = stub_type;
794e51c0
AM
11969 if (stub_type != ppc_stub_plt_call
11970 && stub_type != ppc_stub_plt_call_r2save)
e054468f
AM
11971 {
11972 stub_entry->target_value = code_value;
11973 stub_entry->target_section = code_sec;
11974 }
11975 else
11976 {
11977 stub_entry->target_value = sym_value;
11978 stub_entry->target_section = sym_sec;
11979 }
721956f4 11980 stub_entry->h = hash;
e054468f 11981 stub_entry->plt_ent = plt_ent;
ee75fd95
AM
11982
11983 if (stub_entry->h != NULL)
11984 htab->stub_globals += 1;
721956f4
AM
11985 }
11986
11987 /* We're done with the internal relocs, free them. */
6cdc0ccc 11988 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 11989 free (internal_relocs);
721956f4 11990 }
6cdc0ccc
AM
11991
11992 if (local_syms != NULL
11993 && symtab_hdr->contents != (unsigned char *) local_syms)
11994 {
11995 if (!info->keep_memory)
11996 free (local_syms);
11997 else
11998 symtab_hdr->contents = (unsigned char *) local_syms;
11999 }
721956f4
AM
12000 }
12001
5c3dead3 12002 /* We may have added some stubs. Find out the new size of the
721956f4
AM
12003 stub sections. */
12004 for (stub_sec = htab->stub_bfd->sections;
12005 stub_sec != NULL;
12006 stub_sec = stub_sec->next)
e717da7e 12007 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
ee75fd95 12008 {
5c3dead3 12009 stub_sec->rawsize = stub_sec->size;
ee75fd95
AM
12010 stub_sec->size = 0;
12011 stub_sec->reloc_count = 0;
84f5d08e 12012 stub_sec->flags &= ~SEC_RELOC;
ee75fd95 12013 }
eea6121a
AM
12014
12015 htab->brlt->size = 0;
84f5d08e
AM
12016 htab->brlt->reloc_count = 0;
12017 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 12018 if (htab->relbrlt != NULL)
eea6121a 12019 htab->relbrlt->size = 0;
721956f4 12020
63bc6f6c 12021 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 12022
176a0d42
AM
12023 if (info->emitrelocations
12024 && htab->glink != NULL && htab->glink->size != 0)
12025 {
12026 htab->glink->reloc_count = 1;
12027 htab->glink->flags |= SEC_RELOC;
12028 }
12029
58d180e8
AM
12030 if (htab->glink_eh_frame != NULL
12031 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
9a2a56cc 12032 && htab->glink_eh_frame->output_section->size != 0)
58d180e8 12033 {
4bbe044a 12034 size_t size = 0, align;
58d180e8
AM
12035
12036 for (stub_sec = htab->stub_bfd->sections;
12037 stub_sec != NULL;
12038 stub_sec = stub_sec->next)
12039 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12040 size += 20;
12041 if (htab->glink != NULL && htab->glink->size != 0)
12042 size += 24;
12043 if (size != 0)
12044 size += sizeof (glink_eh_frame_cie);
4bbe044a
AM
12045 align = 1;
12046 align <<= htab->glink_eh_frame->output_section->alignment_power;
12047 align -= 1;
12048 size = (size + align) & ~align;
58d180e8
AM
12049 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12050 htab->glink_eh_frame->size = size;
12051 }
12052
794e51c0
AM
12053 if (htab->plt_stub_align != 0)
12054 for (stub_sec = htab->stub_bfd->sections;
12055 stub_sec != NULL;
12056 stub_sec = stub_sec->next)
12057 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12058 stub_sec->size = ((stub_sec->size + (1 << htab->plt_stub_align) - 1)
12059 & (-1 << htab->plt_stub_align));
12060
5c3dead3
AM
12061 for (stub_sec = htab->stub_bfd->sections;
12062 stub_sec != NULL;
12063 stub_sec = stub_sec->next)
12064 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12065 && stub_sec->rawsize != stub_sec->size)
12066 break;
12067
12068 /* Exit from this loop when no stubs have been added, and no stubs
12069 have changed size. */
58d180e8
AM
12070 if (stub_sec == NULL
12071 && (htab->glink_eh_frame == NULL
12072 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
5c3dead3
AM
12073 break;
12074
721956f4
AM
12075 /* Ask the linker to do its stuff. */
12076 (*htab->layout_sections_again) ();
12077 }
12078
d969d15f
AM
12079 maybe_strip_output (info, htab->brlt);
12080 if (htab->glink_eh_frame != NULL)
12081 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 12082
b34976b6 12083 return TRUE;
721956f4
AM
12084}
12085
12086/* Called after we have determined section placement. If sections
805fc799 12087 move, we'll be called again. Provide a value for TOCstart. */
721956f4 12088
805fc799 12089bfd_vma
1c865ab2 12090ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 12091{
805fc799
AM
12092 asection *s;
12093 bfd_vma TOCstart;
721956f4 12094
805fc799
AM
12095 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
12096 order. The TOC starts where the first of these sections starts. */
12097 s = bfd_get_section_by_name (obfd, ".got");
e054468f 12098 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 12099 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 12100 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 12101 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 12102 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 12103 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 12104 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
12105 {
12106 /* This may happen for
12107 o references to TOC base (SYM@toc / TOC[tc0]) without a
12108 .toc directive
12109 o bad linker script
12110 o --gc-sections and empty TOC sections
12111
12112 FIXME: Warn user? */
12113
12114 /* Look for a likely section. We probably won't even be
12115 using TOCstart. */
12116 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
12117 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
12118 | SEC_EXCLUDE))
805fc799
AM
12119 == (SEC_ALLOC | SEC_SMALL_DATA))
12120 break;
721956f4 12121 if (s == NULL)
805fc799 12122 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 12123 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
12124 == (SEC_ALLOC | SEC_SMALL_DATA))
12125 break;
721956f4 12126 if (s == NULL)
805fc799 12127 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
12128 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
12129 == SEC_ALLOC)
805fc799 12130 break;
721956f4 12131 if (s == NULL)
805fc799 12132 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 12133 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
12134 break;
12135 }
721956f4 12136
805fc799
AM
12137 TOCstart = 0;
12138 if (s != NULL)
12139 TOCstart = s->output_section->vma + s->output_offset;
721956f4 12140
1c865ab2
AM
12141 _bfd_set_gp_value (obfd, TOCstart);
12142
12143 if (info != NULL && s != NULL && is_ppc64_elf (obfd))
12144 {
12145 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12146
12147 if (htab != NULL
12148 && htab->elf.hgot != NULL)
12149 {
5295321c 12150 htab->elf.hgot->type = STT_OBJECT;
1c865ab2
AM
12151 htab->elf.hgot->root.type = bfd_link_hash_defined;
12152 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF;
12153 htab->elf.hgot->root.u.def.section = s;
12154 }
12155 }
805fc799 12156 return TOCstart;
721956f4
AM
12157}
12158
12159/* Build all the stubs associated with the current output file.
12160 The stubs are kept in a hash table attached to the main linker
12161 hash table. This function is called via gldelf64ppc_finish. */
12162
b34976b6 12163bfd_boolean
4ce794b7
AM
12164ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
12165 struct bfd_link_info *info,
12166 char **stats)
5d1634d7
AM
12167{
12168 struct ppc_link_hash_table *htab = ppc_hash_table (info);
721956f4 12169 asection *stub_sec;
5d1634d7 12170 bfd_byte *p;
e717da7e 12171 int stub_sec_count = 0;
5d1634d7 12172
4dfe6ac6
NC
12173 if (htab == NULL)
12174 return FALSE;
12175
ad8e1ba5 12176 htab->emit_stub_syms = emit_stub_syms;
eea6121a
AM
12177
12178 /* Allocate memory to hold the linker stubs. */
721956f4
AM
12179 for (stub_sec = htab->stub_bfd->sections;
12180 stub_sec != NULL;
12181 stub_sec = stub_sec->next)
eea6121a
AM
12182 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12183 && stub_sec->size != 0)
e717da7e 12184 {
eea6121a
AM
12185 stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
12186 if (stub_sec->contents == NULL)
12187 return FALSE;
12188 /* We want to check that built size is the same as calculated
12189 size. rawsize is a convenient location to use. */
12190 stub_sec->rawsize = stub_sec->size;
12191 stub_sec->size = 0;
e717da7e 12192 }
5d1634d7 12193
23eb7e01 12194 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 12195 {
9f951329 12196 unsigned int indx;
ad8e1ba5 12197 bfd_vma plt0;
9f951329 12198
721956f4 12199 /* Build the .glink plt call stub. */
97b639ba
AM
12200 if (htab->emit_stub_syms)
12201 {
12202 struct elf_link_hash_entry *h;
468392fb
AM
12203 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
12204 TRUE, FALSE, FALSE);
97b639ba
AM
12205 if (h == NULL)
12206 return FALSE;
12207 if (h->root.type == bfd_link_hash_new)
12208 {
12209 h->root.type = bfd_link_hash_defined;
12210 h->root.u.def.section = htab->glink;
ee4bf8d2 12211 h->root.u.def.value = 8;
f5385ebf
AM
12212 h->ref_regular = 1;
12213 h->def_regular = 1;
12214 h->ref_regular_nonweak = 1;
12215 h->forced_local = 1;
12216 h->non_elf = 0;
97b639ba
AM
12217 }
12218 }
176a0d42
AM
12219 plt0 = htab->plt->output_section->vma + htab->plt->output_offset - 16;
12220 if (info->emitrelocations)
12221 {
12222 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
12223 if (r == NULL)
12224 return FALSE;
12225 r->r_offset = (htab->glink->output_offset
12226 + htab->glink->output_section->vma);
12227 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
12228 r->r_addend = plt0;
12229 }
4ce794b7 12230 p = htab->glink->contents;
176a0d42 12231 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
12232 bfd_put_64 (htab->glink->owner, plt0, p);
12233 p += 8;
12234 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
ad8e1ba5 12235 p += 4;
ee4bf8d2 12236 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
ad8e1ba5 12237 p += 4;
ee4bf8d2 12238 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
ad8e1ba5 12239 p += 4;
71a39c98 12240 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
ad8e1ba5 12241 p += 4;
ee4bf8d2 12242 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
ad8e1ba5 12243 p += 4;
71a39c98 12244 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
ad8e1ba5 12245 p += 4;
71a39c98 12246 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
ad8e1ba5 12247 p += 4;
71a39c98 12248 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
ad8e1ba5 12249 p += 4;
71a39c98 12250 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
ad8e1ba5 12251 p += 4;
71a39c98 12252 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
ad8e1ba5 12253 p += 4;
4ce794b7 12254 bfd_put_32 (htab->glink->owner, BCTR, p);
ad8e1ba5 12255 p += 4;
ee4bf8d2
AM
12256 while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
12257 {
12258 bfd_put_32 (htab->glink->owner, NOP, p);
12259 p += 4;
12260 }
ad8e1ba5 12261
9f951329
AM
12262 /* Build the .glink lazy link call stubs. */
12263 indx = 0;
eea6121a 12264 while (p < htab->glink->contents + htab->glink->size)
9f951329
AM
12265 {
12266 if (indx < 0x8000)
12267 {
4ce794b7 12268 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
9f951329
AM
12269 p += 4;
12270 }
12271 else
12272 {
4ce794b7 12273 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
9f951329 12274 p += 4;
4ce794b7 12275 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
9f951329
AM
12276 p += 4;
12277 }
4ce794b7 12278 bfd_put_32 (htab->glink->owner,
ee4bf8d2 12279 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 12280 indx++;
9f951329
AM
12281 p += 4;
12282 }
eea6121a 12283 htab->glink->rawsize = p - htab->glink->contents;
5d1634d7 12284 }
5d1634d7 12285
eea6121a 12286 if (htab->brlt->size != 0)
721956f4 12287 {
4ce794b7 12288 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 12289 htab->brlt->size);
4ce794b7 12290 if (htab->brlt->contents == NULL)
b34976b6 12291 return FALSE;
721956f4 12292 }
ee75fd95 12293 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
12294 {
12295 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 12296 htab->relbrlt->size);
63bc6f6c
AM
12297 if (htab->relbrlt->contents == NULL)
12298 return FALSE;
12299 }
5d1634d7 12300
58d180e8
AM
12301 if (htab->glink_eh_frame != NULL
12302 && htab->glink_eh_frame->size != 0)
12303 {
12304 bfd_vma val;
4bbe044a
AM
12305 bfd_byte *last_fde;
12306 size_t last_fde_len, size, align, pad;
58d180e8
AM
12307
12308 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
12309 if (p == NULL)
12310 return FALSE;
12311 htab->glink_eh_frame->contents = p;
4bbe044a 12312 last_fde = p;
58d180e8
AM
12313
12314 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12315
12316 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
12317 /* CIE length (rewrite in case little-endian). */
4bbe044a
AM
12318 last_fde_len = sizeof (glink_eh_frame_cie) - 4;
12319 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
58d180e8
AM
12320 p += sizeof (glink_eh_frame_cie);
12321
12322 for (stub_sec = htab->stub_bfd->sections;
12323 stub_sec != NULL;
12324 stub_sec = stub_sec->next)
12325 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12326 {
4bbe044a
AM
12327 last_fde = p;
12328 last_fde_len = 16;
58d180e8
AM
12329 /* FDE length. */
12330 bfd_put_32 (htab->elf.dynobj, 16, p);
12331 p += 4;
12332 /* CIE pointer. */
12333 val = p - htab->glink_eh_frame->contents;
12334 bfd_put_32 (htab->elf.dynobj, val, p);
12335 p += 4;
12336 /* Offset to stub section. */
12337 val = (stub_sec->output_section->vma
12338 + stub_sec->output_offset);
12339 val -= (htab->glink_eh_frame->output_section->vma
12340 + htab->glink_eh_frame->output_offset);
12341 val -= p - htab->glink_eh_frame->contents;
12342 if (val + 0x80000000 > 0xffffffff)
12343 {
12344 info->callbacks->einfo
8de848d8 12345 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
58d180e8
AM
12346 stub_sec->name);
12347 return FALSE;
12348 }
12349 bfd_put_32 (htab->elf.dynobj, val, p);
12350 p += 4;
12351 /* stub section size. */
12352 bfd_put_32 (htab->elf.dynobj, stub_sec->rawsize, p);
12353 p += 4;
12354 /* Augmentation. */
12355 p += 1;
12356 /* Pad. */
12357 p += 3;
12358 }
12359 if (htab->glink != NULL && htab->glink->size != 0)
12360 {
4bbe044a
AM
12361 last_fde = p;
12362 last_fde_len = 20;
58d180e8
AM
12363 /* FDE length. */
12364 bfd_put_32 (htab->elf.dynobj, 20, p);
12365 p += 4;
12366 /* CIE pointer. */
12367 val = p - htab->glink_eh_frame->contents;
12368 bfd_put_32 (htab->elf.dynobj, val, p);
12369 p += 4;
12370 /* Offset to .glink. */
12371 val = (htab->glink->output_section->vma
12372 + htab->glink->output_offset
12373 + 8);
12374 val -= (htab->glink_eh_frame->output_section->vma
12375 + htab->glink_eh_frame->output_offset);
12376 val -= p - htab->glink_eh_frame->contents;
12377 if (val + 0x80000000 > 0xffffffff)
12378 {
12379 info->callbacks->einfo
8de848d8 12380 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
58d180e8
AM
12381 htab->glink->name);
12382 return FALSE;
12383 }
12384 bfd_put_32 (htab->elf.dynobj, val, p);
12385 p += 4;
12386 /* .glink size. */
12387 bfd_put_32 (htab->elf.dynobj, htab->glink->rawsize - 8, p);
12388 p += 4;
12389 /* Augmentation. */
12390 p += 1;
12391
12392 *p++ = DW_CFA_advance_loc + 1;
12393 *p++ = DW_CFA_register;
12394 *p++ = 65;
12395 *p++ = 12;
12396 *p++ = DW_CFA_advance_loc + 4;
12397 *p++ = DW_CFA_restore_extended;
12398 *p++ = 65;
12399 }
4bbe044a
AM
12400 /* Subsume any padding into the last FDE if user .eh_frame
12401 sections are aligned more than glink_eh_frame. Otherwise any
12402 zero padding will be seen as a terminator. */
12403 size = p - htab->glink_eh_frame->contents;
12404 align = 1;
12405 align <<= htab->glink_eh_frame->output_section->alignment_power;
12406 align -= 1;
12407 pad = ((size + align) & ~align) - size;
12408 htab->glink_eh_frame->size = size + pad;
12409 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
58d180e8
AM
12410 }
12411
721956f4
AM
12412 /* Build the stubs as directed by the stub hash table. */
12413 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 12414
aa8a7074
AM
12415 if (htab->relbrlt != NULL)
12416 htab->relbrlt->reloc_count = 0;
12417
794e51c0
AM
12418 if (htab->plt_stub_align != 0)
12419 for (stub_sec = htab->stub_bfd->sections;
12420 stub_sec != NULL;
12421 stub_sec = stub_sec->next)
12422 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12423 stub_sec->size = ((stub_sec->size + (1 << htab->plt_stub_align) - 1)
12424 & (-1 << htab->plt_stub_align));
12425
721956f4
AM
12426 for (stub_sec = htab->stub_bfd->sections;
12427 stub_sec != NULL;
12428 stub_sec = stub_sec->next)
e717da7e
AM
12429 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12430 {
12431 stub_sec_count += 1;
eea6121a 12432 if (stub_sec->rawsize != stub_sec->size)
e717da7e
AM
12433 break;
12434 }
5d1634d7 12435
721956f4 12436 if (stub_sec != NULL
58d180e8
AM
12437 || htab->glink->rawsize != htab->glink->size
12438 || (htab->glink_eh_frame != NULL
12439 && htab->glink_eh_frame->rawsize != htab->glink_eh_frame->size))
5d1634d7 12440 {
b34976b6 12441 htab->stub_error = TRUE;
8de848d8 12442 info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
5d1634d7 12443 }
721956f4 12444
d2a300cf
AM
12445 if (htab->stub_error)
12446 return FALSE;
12447
12448 if (stats != NULL)
12449 {
12450 *stats = bfd_malloc (500);
12451 if (*stats == NULL)
12452 return FALSE;
12453
ee75fd95 12454 sprintf (*stats, _("linker stubs in %u group%s\n"
d2a300cf
AM
12455 " branch %lu\n"
12456 " toc adjust %lu\n"
12457 " long branch %lu\n"
12458 " long toc adj %lu\n"
794e51c0
AM
12459 " plt call %lu\n"
12460 " plt call toc %lu"),
e717da7e 12461 stub_sec_count,
ee75fd95 12462 stub_sec_count == 1 ? "" : "s",
4ce794b7
AM
12463 htab->stub_count[ppc_stub_long_branch - 1],
12464 htab->stub_count[ppc_stub_long_branch_r2off - 1],
12465 htab->stub_count[ppc_stub_plt_branch - 1],
12466 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
794e51c0
AM
12467 htab->stub_count[ppc_stub_plt_call - 1],
12468 htab->stub_count[ppc_stub_plt_call_r2save - 1]);
d2a300cf
AM
12469 }
12470 return TRUE;
5bd4f169
AM
12471}
12472
99877b66
AM
12473/* This function undoes the changes made by add_symbol_adjust. */
12474
12475static bfd_boolean
12476undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12477{
12478 struct ppc_link_hash_entry *eh;
12479
12480 if (h->root.type == bfd_link_hash_indirect)
12481 return TRUE;
12482
99877b66
AM
12483 eh = (struct ppc_link_hash_entry *) h;
12484 if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
12485 return TRUE;
12486
12487 eh->elf.root.type = bfd_link_hash_undefined;
12488 return TRUE;
12489}
12490
12491void
12492ppc64_elf_restore_symbols (struct bfd_link_info *info)
12493{
12494 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6
NC
12495
12496 if (htab != NULL)
12497 elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
99877b66
AM
12498}
12499
60124e18
AM
12500/* What to do when ld finds relocations against symbols defined in
12501 discarded sections. */
12502
12503static unsigned int
12504ppc64_elf_action_discarded (asection *sec)
12505{
12506 if (strcmp (".opd", sec->name) == 0)
12507 return 0;
12508
12509 if (strcmp (".toc", sec->name) == 0)
12510 return 0;
12511
bce50a28
JJ
12512 if (strcmp (".toc1", sec->name) == 0)
12513 return 0;
12514
60124e18
AM
12515 return _bfd_elf_default_action_discarded (sec);
12516}
12517
5bd4f169
AM
12518/* The RELOCATE_SECTION function is called by the ELF backend linker
12519 to handle the relocations for a section.
12520
12521 The relocs are always passed as Rela structures; if the section
12522 actually uses Rel structures, the r_addend field will always be
12523 zero.
12524
12525 This function is responsible for adjust the section contents as
12526 necessary, and (if using Rela relocs and generating a
1049f94e 12527 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
12528 necessary.
12529
12530 This function does not have to worry about setting the reloc
12531 address or the reloc symbol index.
12532
12533 LOCAL_SYMS is a pointer to the swapped in local symbols.
12534
12535 LOCAL_SECTIONS is an array giving the section in the input file
12536 corresponding to the st_shndx field of each local symbol.
12537
12538 The global hash table entry for the global symbols can be found
12539 via elf_sym_hashes (input_bfd).
12540
1049f94e 12541 When generating relocatable output, this function must handle
5bd4f169
AM
12542 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
12543 going to be the section symbol corresponding to the output
12544 section, which means that the addend must be adjusted
12545 accordingly. */
12546
b34976b6 12547static bfd_boolean
4ce794b7
AM
12548ppc64_elf_relocate_section (bfd *output_bfd,
12549 struct bfd_link_info *info,
12550 bfd *input_bfd,
12551 asection *input_section,
12552 bfd_byte *contents,
12553 Elf_Internal_Rela *relocs,
12554 Elf_Internal_Sym *local_syms,
12555 asection **local_sections)
5bd4f169 12556{
65f38f15 12557 struct ppc_link_hash_table *htab;
5bd4f169
AM
12558 Elf_Internal_Shdr *symtab_hdr;
12559 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
12560 Elf_Internal_Rela *rel;
12561 Elf_Internal_Rela *relend;
411e1bfb
AM
12562 Elf_Internal_Rela outrel;
12563 bfd_byte *loc;
411e1bfb 12564 struct got_entry **local_got_ents;
5bd4f169 12565 bfd_vma TOCstart;
b34976b6
AM
12566 bfd_boolean ret = TRUE;
12567 bfd_boolean is_opd;
794e51c0
AM
12568 /* Assume 'at' branch hints. */
12569 bfd_boolean is_isa_v2 = TRUE;
4fe5ca5b 12570 bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
5bd4f169 12571
65f38f15 12572 /* Initialize howto table if needed. */
5bd4f169 12573 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
12574 ppc_howto_init ();
12575
65f38f15 12576 htab = ppc_hash_table (info);
4dfe6ac6
NC
12577 if (htab == NULL)
12578 return FALSE;
ee75fd95
AM
12579
12580 /* Don't relocate stub sections. */
12581 if (input_section->owner == htab->stub_bfd)
12582 return TRUE;
12583
0c8d6e5c 12584 BFD_ASSERT (is_ppc64_elf (input_bfd));
0ffa91dd 12585
411e1bfb 12586 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 12587 TOCstart = elf_gp (output_bfd);
0ffa91dd 12588 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 12589 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 12590 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 12591
5bd4f169
AM
12592 rel = relocs;
12593 relend = relocs + input_section->reloc_count;
12594 for (; rel < relend; rel++)
12595 {
04c9666a 12596 enum elf_ppc64_reloc_type r_type;
31c76678 12597 bfd_vma addend;
5bd4f169
AM
12598 bfd_reloc_status_type r;
12599 Elf_Internal_Sym *sym;
12600 asection *sec;
039b3fef
AM
12601 struct elf_link_hash_entry *h_elf;
12602 struct ppc_link_hash_entry *h;
12603 struct ppc_link_hash_entry *fdh;
5bd4f169 12604 const char *sym_name;
0d4792f7 12605 unsigned long r_symndx, toc_symndx;
3a71aa26 12606 bfd_vma toc_addend;
f961d9dd
AM
12607 unsigned char tls_mask, tls_gd, tls_type;
12608 unsigned char sym_type;
5bd4f169 12609 bfd_vma relocation;
b34976b6
AM
12610 bfd_boolean unresolved_reloc;
12611 bfd_boolean warned;
bc30df16 12612 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 12613 unsigned int insn;
e11840f9 12614 unsigned int mask;
721956f4
AM
12615 struct ppc_stub_hash_entry *stub_entry;
12616 bfd_vma max_br_offset;
12617 bfd_vma from;
31c76678 12618 const Elf_Internal_Rela orig_rel = *rel;
5bd4f169 12619
4ce794b7 12620 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 12621 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
12622
12623 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
12624 symbol of the previous ADDR64 reloc. The symbol gives us the
12625 proper TOC base to use. */
12626 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
12627 && rel != relocs
12628 && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
12629 && is_opd)
12630 r_symndx = ELF64_R_SYM (rel[-1].r_info);
12631
4ce794b7
AM
12632 sym = NULL;
12633 sec = NULL;
039b3fef 12634 h_elf = NULL;
4ce794b7 12635 sym_name = NULL;
b34976b6
AM
12636 unresolved_reloc = FALSE;
12637 warned = FALSE;
65f38f15 12638
0b13192e 12639 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
12640 {
12641 /* It's a local symbol. */
74f0fb50 12642 struct _opd_sec_data *opd;
4025353c 12643
5bd4f169
AM
12644 sym = local_syms + r_symndx;
12645 sec = local_sections[r_symndx];
26c61ae5 12646 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 12647 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 12648 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
12649 opd = get_opd_info (sec);
12650 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 12651 {
74f0fb50 12652 long adjust = opd->adjust[(sym->st_value + rel->r_addend) / 8];
4025353c
AM
12653 if (adjust == -1)
12654 relocation = 0;
12655 else
4cc603a5
AM
12656 {
12657 /* If this is a relocation against the opd section sym
12658 and we have edited .opd, adjust the reloc addend so
12659 that ld -r and ld --emit-relocs output is correct.
12660 If it is a reloc against some other .opd symbol,
12661 then the symbol value will be adjusted later. */
12662 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
12663 rel->r_addend += adjust;
12664 else
12665 relocation += adjust;
12666 }
1e2f5b6e 12667 }
5bd4f169
AM
12668 }
12669 else
12670 {
b2a8e766
AM
12671 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
12672 r_symndx, symtab_hdr, sym_hashes,
039b3fef 12673 h_elf, sec, relocation,
b2a8e766 12674 unresolved_reloc, warned);
039b3fef
AM
12675 sym_name = h_elf->root.root.string;
12676 sym_type = h_elf->type;
b69fdb4e
AM
12677 if (sec != NULL
12678 && sec->owner == output_bfd
12679 && strcmp (sec->name, ".opd") == 0)
12680 {
12681 /* This is a symbol defined in a linker script. All
12682 such are defined in output sections, even those
12683 defined by simple assignment from a symbol defined in
12684 an input section. Transfer the symbol to an
12685 appropriate input .opd section, so that a branch to
12686 this symbol will be mapped to the location specified
12687 by the opd entry. */
12688 struct bfd_link_order *lo;
12689 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
12690 if (lo->type == bfd_indirect_link_order)
12691 {
12692 asection *isec = lo->u.indirect.section;
12693 if (h_elf->root.u.def.value >= isec->output_offset
12694 && h_elf->root.u.def.value < (isec->output_offset
12695 + isec->size))
12696 {
12697 h_elf->root.u.def.value -= isec->output_offset;
12698 h_elf->root.u.def.section = isec;
12699 sec = isec;
12700 break;
12701 }
12702 }
12703 }
5bd4f169 12704 }
039b3fef 12705 h = (struct ppc_link_hash_entry *) h_elf;
5bd4f169 12706
dbaa2011 12707 if (sec != NULL && discarded_section (sec))
e4067dbb 12708 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
545fd46b
MR
12709 rel, 1, relend,
12710 ppc64_elf_howto_table[r_type], 0,
e4067dbb 12711 contents);
ab96bf03
AM
12712
12713 if (info->relocatable)
12714 continue;
12715
f40da81b
AM
12716 if (h != NULL && &h->elf == htab->elf.hgot)
12717 {
12718 relocation = (TOCstart
12719 + htab->stub_group[input_section->id].toc_off);
12720 sec = bfd_abs_section_ptr;
12721 unresolved_reloc = FALSE;
12722 }
12723
951fd09b
AM
12724 /* TLS optimizations. Replace instruction sequences and relocs
12725 based on information we collected in tls_optimize. We edit
12726 RELOCS so that --emit-relocs will output something sensible
12727 for the final instruction stream. */
12728 tls_mask = 0;
12729 tls_gd = 0;
0d4792f7 12730 toc_symndx = 0;
727fc41e
AM
12731 if (h != NULL)
12732 tls_mask = h->tls_mask;
12733 else if (local_got_ents != NULL)
411e1bfb 12734 {
e054468f
AM
12735 struct plt_entry **local_plt = (struct plt_entry **)
12736 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 12737 unsigned char *lgot_masks = (unsigned char *)
e054468f 12738 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
12739 tls_mask = lgot_masks[r_symndx];
12740 }
12741 if (tls_mask == 0
12742 && (r_type == R_PPC64_TLS
12743 || r_type == R_PPC64_TLSGD
12744 || r_type == R_PPC64_TLSLD))
12745 {
12746 /* Check for toc tls entries. */
f961d9dd 12747 unsigned char *toc_tls;
0d4792f7 12748
727fc41e
AM
12749 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
12750 &local_syms, rel, input_bfd))
12751 return FALSE;
0d4792f7 12752
727fc41e
AM
12753 if (toc_tls)
12754 tls_mask = *toc_tls;
0d4792f7
AM
12755 }
12756
12757 /* Check that tls relocs are used with tls syms, and non-tls
12758 relocs are used with non-tls syms. */
cf35638d 12759 if (r_symndx != STN_UNDEF
0d4792f7
AM
12760 && r_type != R_PPC64_NONE
12761 && (h == NULL
039b3fef
AM
12762 || h->elf.root.type == bfd_link_hash_defined
12763 || h->elf.root.type == bfd_link_hash_defweak)
1d483afe
AM
12764 && (IS_PPC64_TLS_RELOC (r_type)
12765 != (sym_type == STT_TLS
12766 || (sym_type == STT_SECTION
12767 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
0d4792f7 12768 {
727fc41e
AM
12769 if (tls_mask != 0
12770 && (r_type == R_PPC64_TLS
12771 || r_type == R_PPC64_TLSGD
12772 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
12773 /* R_PPC64_TLS is OK against a symbol in the TOC. */
12774 ;
12775 else
25f53a85 12776 info->callbacks->einfo
1d483afe 12777 (!IS_PPC64_TLS_RELOC (r_type)
bc30df16
AM
12778 ? _("%P: %H: %s used with TLS symbol `%T'\n")
12779 : _("%P: %H: %s used with non-TLS symbol `%T'\n"),
25f53a85 12780 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
12781 ppc64_elf_howto_table[r_type]->name,
12782 sym_name);
411e1bfb
AM
12783 }
12784
12785 /* Ensure reloc mapping code below stays sane. */
12786 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
12787 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
12788 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
12789 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
12790 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
12791 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
12792 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
12793 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
12794 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
12795 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
12796 abort ();
0d4792f7 12797
411e1bfb
AM
12798 switch (r_type)
12799 {
12800 default:
411e1bfb
AM
12801 break;
12802
ba761f19
AM
12803 case R_PPC64_LO_DS_OPT:
12804 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
12805 if ((insn & (0x3f << 26)) != 58u << 26)
12806 abort ();
12807 insn += (14u << 26) - (58u << 26);
12808 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
12809 r_type = R_PPC64_TOC16_LO;
12810 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12811 break;
12812
411e1bfb
AM
12813 case R_PPC64_TOC16:
12814 case R_PPC64_TOC16_LO:
12815 case R_PPC64_TOC16_DS:
12816 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
12817 {
12818 /* Check for toc tls entries. */
f961d9dd 12819 unsigned char *toc_tls;
951fd09b 12820 int retval;
411e1bfb 12821
3a71aa26
AM
12822 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
12823 &local_syms, rel, input_bfd);
951fd09b 12824 if (retval == 0)
411e1bfb
AM
12825 return FALSE;
12826
12827 if (toc_tls)
12828 {
951fd09b 12829 tls_mask = *toc_tls;
411e1bfb
AM
12830 if (r_type == R_PPC64_TOC16_DS
12831 || r_type == R_PPC64_TOC16_LO_DS)
81407a69
AM
12832 {
12833 if (tls_mask != 0
12834 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
12835 goto toctprel;
12836 }
411e1bfb 12837 else
951fd09b
AM
12838 {
12839 /* If we found a GD reloc pair, then we might be
12840 doing a GD->IE transition. */
12841 if (retval == 2)
12842 {
12843 tls_gd = TLS_TPRELGD;
12844 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
102890f0 12845 goto tls_ldgd_opt;
951fd09b
AM
12846 }
12847 else if (retval == 3)
12848 {
12849 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
102890f0 12850 goto tls_ldgd_opt;
951fd09b
AM
12851 }
12852 }
411e1bfb
AM
12853 }
12854 }
12855 break;
12856
9d6ded02
AM
12857 case R_PPC64_GOT_TPREL16_HI:
12858 case R_PPC64_GOT_TPREL16_HA:
12859 if (tls_mask != 0
12860 && (tls_mask & TLS_TPREL) == 0)
12861 {
12862 rel->r_offset -= d_offset;
12863 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
12864 r_type = R_PPC64_NONE;
12865 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12866 }
12867 break;
12868
411e1bfb
AM
12869 case R_PPC64_GOT_TPREL16_DS:
12870 case R_PPC64_GOT_TPREL16_LO_DS:
951fd09b
AM
12871 if (tls_mask != 0
12872 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 12873 {
81407a69 12874 toctprel:
4fe5ca5b 12875 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
411e1bfb
AM
12876 insn &= 31 << 21;
12877 insn |= 0x3c0d0000; /* addis 0,13,0 */
4fe5ca5b 12878 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
411e1bfb 12879 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
12880 if (toc_symndx != 0)
12881 {
12882 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 12883 rel->r_addend = toc_addend;
0d4792f7
AM
12884 /* We changed the symbol. Start over in order to
12885 get h, sym, sec etc. right. */
12886 rel--;
12887 continue;
12888 }
12889 else
12890 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
12891 }
12892 break;
12893
12894 case R_PPC64_TLS:
951fd09b
AM
12895 if (tls_mask != 0
12896 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 12897 {
411e1bfb 12898 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
2d0f3896
AM
12899 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
12900 if (insn == 0)
411e1bfb 12901 abort ();
411e1bfb 12902 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
411e1bfb 12903 /* Was PPC64_TLS which sits on insn boundary, now
4fe5ca5b
GM
12904 PPC64_TPREL16_LO which is at low-order half-word. */
12905 rel->r_offset += d_offset;
0d4792f7
AM
12906 r_type = R_PPC64_TPREL16_LO;
12907 if (toc_symndx != 0)
12908 {
12909 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 12910 rel->r_addend = toc_addend;
0d4792f7
AM
12911 /* We changed the symbol. Start over in order to
12912 get h, sym, sec etc. right. */
12913 rel--;
12914 continue;
12915 }
12916 else
12917 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
12918 }
12919 break;
12920
411e1bfb
AM
12921 case R_PPC64_GOT_TLSGD16_HI:
12922 case R_PPC64_GOT_TLSGD16_HA:
951fd09b
AM
12923 tls_gd = TLS_TPRELGD;
12924 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12925 goto tls_gdld_hi;
12926 break;
12927
411e1bfb
AM
12928 case R_PPC64_GOT_TLSLD16_HI:
12929 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 12930 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 12931 {
951fd09b
AM
12932 tls_gdld_hi:
12933 if ((tls_mask & tls_gd) != 0)
12934 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
12935 + R_PPC64_GOT_TPREL16_DS);
12936 else
411e1bfb 12937 {
4fe5ca5b 12938 rel->r_offset -= d_offset;
727ac201 12939 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
951fd09b 12940 r_type = R_PPC64_NONE;
411e1bfb 12941 }
951fd09b 12942 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
12943 }
12944 break;
12945
951fd09b
AM
12946 case R_PPC64_GOT_TLSGD16:
12947 case R_PPC64_GOT_TLSGD16_LO:
12948 tls_gd = TLS_TPRELGD;
12949 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
102890f0 12950 goto tls_ldgd_opt;
951fd09b 12951 break;
411e1bfb 12952
951fd09b
AM
12953 case R_PPC64_GOT_TLSLD16:
12954 case R_PPC64_GOT_TLSLD16_LO:
12955 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12956 {
3a71aa26 12957 unsigned int insn1, insn2, insn3;
102890f0
AM
12958 bfd_vma offset;
12959
12960 tls_ldgd_opt:
727fc41e
AM
12961 offset = (bfd_vma) -1;
12962 /* If not using the newer R_PPC64_TLSGD/LD to mark
12963 __tls_get_addr calls, we must trust that the call
12964 stays with its arg setup insns, ie. that the next
12965 reloc is the __tls_get_addr call associated with
12966 the current reloc. Edit both insns. */
12967 if (input_section->has_tls_get_addr_call
12968 && rel + 1 < relend
12969 && branch_reloc_hash_match (input_bfd, rel + 1,
12970 htab->tls_get_addr,
12971 htab->tls_get_addr_fd))
12972 offset = rel[1].r_offset;
102890f0 12973 if ((tls_mask & tls_gd) != 0)
411e1bfb 12974 {
102890f0 12975 /* IE */
3a71aa26
AM
12976 insn1 = bfd_get_32 (output_bfd,
12977 contents + rel->r_offset - d_offset);
102890f0
AM
12978 insn1 &= (1 << 26) - (1 << 2);
12979 insn1 |= 58 << 26; /* ld */
12980 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 12981 if (offset != (bfd_vma) -1)
f58d5a2d 12982 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
102890f0
AM
12983 if ((tls_mask & TLS_EXPLICIT) == 0)
12984 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
12985 + R_PPC64_GOT_TPREL16_DS);
411e1bfb 12986 else
102890f0
AM
12987 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
12988 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12989 }
12990 else
12991 {
12992 /* LE */
12993 insn1 = 0x3c6d0000; /* addis 3,13,0 */
12994 insn2 = 0x38630000; /* addi 3,3,0 */
12995 if (tls_gd == 0)
951fd09b 12996 {
102890f0 12997 /* Was an LD reloc. */
1d483afe
AM
12998 if (toc_symndx)
12999 sec = local_sections[toc_symndx];
13000 for (r_symndx = 0;
13001 r_symndx < symtab_hdr->sh_info;
13002 r_symndx++)
13003 if (local_sections[r_symndx] == sec)
13004 break;
13005 if (r_symndx >= symtab_hdr->sh_info)
cf35638d 13006 r_symndx = STN_UNDEF;
102890f0 13007 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
cf35638d 13008 if (r_symndx != STN_UNDEF)
1d483afe
AM
13009 rel->r_addend -= (local_syms[r_symndx].st_value
13010 + sec->output_offset
13011 + sec->output_section->vma);
951fd09b 13012 }
102890f0 13013 else if (toc_symndx != 0)
3a71aa26
AM
13014 {
13015 r_symndx = toc_symndx;
13016 rel->r_addend = toc_addend;
13017 }
102890f0
AM
13018 r_type = R_PPC64_TPREL16_HA;
13019 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
13020 if (offset != (bfd_vma) -1)
13021 {
13022 rel[1].r_info = ELF64_R_INFO (r_symndx,
13023 R_PPC64_TPREL16_LO);
13024 rel[1].r_offset = offset + d_offset;
13025 rel[1].r_addend = rel->r_addend;
13026 }
102890f0 13027 }
3a71aa26
AM
13028 bfd_put_32 (output_bfd, insn1,
13029 contents + rel->r_offset - d_offset);
727fc41e
AM
13030 if (offset != (bfd_vma) -1)
13031 {
13032 insn3 = bfd_get_32 (output_bfd,
13033 contents + offset + 4);
13034 if (insn3 == NOP
13035 || insn3 == CROR_151515 || insn3 == CROR_313131)
13036 {
13037 rel[1].r_offset += 4;
13038 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13039 insn2 = NOP;
13040 }
13041 bfd_put_32 (output_bfd, insn2, contents + offset);
13042 }
13043 if ((tls_mask & tls_gd) == 0
13044 && (tls_gd == 0 || toc_symndx != 0))
13045 {
13046 /* We changed the symbol. Start over in order
13047 to get h, sym, sec etc. right. */
13048 rel--;
13049 continue;
13050 }
13051 }
13052 break;
13053
13054 case R_PPC64_TLSGD:
13055 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13056 {
13057 unsigned int insn2, insn3;
13058 bfd_vma offset = rel->r_offset;
13059
13060 if ((tls_mask & TLS_TPRELGD) != 0)
13061 {
13062 /* IE */
13063 r_type = R_PPC64_NONE;
13064 insn2 = 0x7c636a14; /* add 3,3,13 */
13065 }
13066 else
13067 {
13068 /* LE */
13069 if (toc_symndx != 0)
13070 {
13071 r_symndx = toc_symndx;
13072 rel->r_addend = toc_addend;
13073 }
13074 r_type = R_PPC64_TPREL16_LO;
13075 rel->r_offset = offset + d_offset;
13076 insn2 = 0x38630000; /* addi 3,3,0 */
13077 }
13078 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13079 /* Zap the reloc on the _tls_get_addr call too. */
13080 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 13081 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
3a71aa26
AM
13082 insn3 = bfd_get_32 (output_bfd,
13083 contents + offset + 4);
102890f0
AM
13084 if (insn3 == NOP
13085 || insn3 == CROR_151515 || insn3 == CROR_313131)
13086 {
727fc41e 13087 rel->r_offset += 4;
3a71aa26
AM
13088 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13089 insn2 = NOP;
102890f0 13090 }
102890f0 13091 bfd_put_32 (output_bfd, insn2, contents + offset);
727fc41e 13092 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
102890f0 13093 {
102890f0
AM
13094 rel--;
13095 continue;
411e1bfb 13096 }
411e1bfb 13097 }
411e1bfb
AM
13098 break;
13099
727fc41e
AM
13100 case R_PPC64_TLSLD:
13101 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13102 {
13103 unsigned int insn2, insn3;
13104 bfd_vma offset = rel->r_offset;
13105
13106 if (toc_symndx)
13107 sec = local_sections[toc_symndx];
13108 for (r_symndx = 0;
13109 r_symndx < symtab_hdr->sh_info;
13110 r_symndx++)
13111 if (local_sections[r_symndx] == sec)
13112 break;
13113 if (r_symndx >= symtab_hdr->sh_info)
cf35638d 13114 r_symndx = STN_UNDEF;
727fc41e 13115 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
cf35638d 13116 if (r_symndx != STN_UNDEF)
727fc41e
AM
13117 rel->r_addend -= (local_syms[r_symndx].st_value
13118 + sec->output_offset
13119 + sec->output_section->vma);
13120
13121 r_type = R_PPC64_TPREL16_LO;
13122 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13123 rel->r_offset = offset + d_offset;
13124 /* Zap the reloc on the _tls_get_addr call too. */
13125 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 13126 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
727fc41e
AM
13127 insn2 = 0x38630000; /* addi 3,3,0 */
13128 insn3 = bfd_get_32 (output_bfd,
13129 contents + offset + 4);
13130 if (insn3 == NOP
13131 || insn3 == CROR_151515 || insn3 == CROR_313131)
13132 {
13133 rel->r_offset += 4;
13134 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13135 insn2 = NOP;
13136 }
13137 bfd_put_32 (output_bfd, insn2, contents + offset);
13138 rel--;
13139 continue;
13140 }
13141 break;
13142
411e1bfb 13143 case R_PPC64_DTPMOD64:
951fd09b
AM
13144 if (rel + 1 < relend
13145 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
13146 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 13147 {
951fd09b
AM
13148 if ((tls_mask & TLS_GD) == 0)
13149 {
13150 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
13151 if ((tls_mask & TLS_TPRELGD) != 0)
13152 r_type = R_PPC64_TPREL64;
13153 else
13154 {
4ce794b7 13155 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
13156 r_type = R_PPC64_NONE;
13157 }
13158 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13159 }
13160 }
13161 else
13162 {
13163 if ((tls_mask & TLS_LD) == 0)
411e1bfb 13164 {
4ce794b7 13165 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 13166 r_type = R_PPC64_NONE;
951fd09b 13167 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 13168 }
411e1bfb
AM
13169 }
13170 break;
13171
13172 case R_PPC64_TPREL64:
951fd09b 13173 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
13174 {
13175 r_type = R_PPC64_NONE;
13176 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13177 }
13178 break;
13179 }
13180
13181 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 13182 insn = 0;
b25116a9
AM
13183 max_br_offset = 1 << 25;
13184 addend = rel->r_addend;
bc30df16 13185 reloc_dest = DEST_NORMAL;
65f38f15 13186 switch (r_type)
5bd4f169
AM
13187 {
13188 default:
65f38f15 13189 break;
5bd4f169 13190
3b421ab3
AM
13191 case R_PPC64_TOCSAVE:
13192 if (relocation + addend == (rel->r_offset
13193 + input_section->output_offset
13194 + input_section->output_section->vma)
13195 && tocsave_find (htab, NO_INSERT,
13196 &local_syms, rel, input_bfd))
13197 {
13198 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
13199 if (insn == NOP
13200 || insn == CROR_151515 || insn == CROR_313131)
13201 bfd_put_32 (input_bfd, STD_R2_40R1,
13202 contents + rel->r_offset);
13203 }
13204 break;
13205
65f38f15
AM
13206 /* Branch taken prediction relocations. */
13207 case R_PPC64_ADDR14_BRTAKEN:
13208 case R_PPC64_REL14_BRTAKEN:
cedb70c5
KH
13209 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
13210 /* Fall thru. */
65f38f15 13211
86c76c7b 13212 /* Branch not taken prediction relocations. */
65f38f15
AM
13213 case R_PPC64_ADDR14_BRNTAKEN:
13214 case R_PPC64_REL14_BRNTAKEN:
411e1bfb
AM
13215 insn |= bfd_get_32 (output_bfd,
13216 contents + rel->r_offset) & ~(0x01 << 21);
b25116a9 13217 /* Fall thru. */
86c76c7b 13218
b25116a9
AM
13219 case R_PPC64_REL14:
13220 max_br_offset = 1 << 15;
13221 /* Fall thru. */
5bd4f169 13222
65f38f15 13223 case R_PPC64_REL24:
ad8e1ba5
AM
13224 /* Calls to functions with a different TOC, such as calls to
13225 shared objects, need to alter the TOC pointer. This is
13226 done using a linkage stub. A REL24 branching to these
13227 linkage stubs needs to be followed by a nop, as the nop
13228 will be replaced with an instruction to restore the TOC
13229 base pointer. */
8387904d 13230 fdh = h;
b31867b6
AM
13231 if (h != NULL
13232 && h->oh != NULL
13233 && h->oh->is_func_descriptor)
13234 fdh = ppc_follow_link (h->oh);
31c76678
DK
13235 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
13236 htab);
6abec6bc 13237 if (stub_entry != NULL
ad8e1ba5 13238 && (stub_entry->stub_type == ppc_stub_plt_call
794e51c0 13239 || stub_entry->stub_type == ppc_stub_plt_call_r2save
ad8e1ba5
AM
13240 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
13241 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
41bd81ab 13242 {
b25116a9 13243 bfd_boolean can_plt_call = FALSE;
721956f4 13244
ba8ca3e7
AM
13245 /* All of these stubs will modify r2, so there must be a
13246 branch and link followed by a nop. The nop is
13247 replaced by an insn to restore r2. */
eea6121a 13248 if (rel->r_offset + 8 <= input_section->size)
41bd81ab 13249 {
ba8ca3e7
AM
13250 unsigned long br;
13251
13252 br = bfd_get_32 (input_bfd,
13253 contents + rel->r_offset);
13254 if ((br & 1) != 0)
41bd81ab 13255 {
ba8ca3e7
AM
13256 unsigned long nop;
13257
13258 nop = bfd_get_32 (input_bfd,
13259 contents + rel->r_offset + 4);
13260 if (nop == NOP
13261 || nop == CROR_151515 || nop == CROR_313131)
a7f2871e 13262 {
ba8ca3e7
AM
13263 if (h != NULL
13264 && (h == htab->tls_get_addr_fd
13265 || h == htab->tls_get_addr)
13266 && !htab->no_tls_get_addr_opt)
13267 {
13268 /* Special stub used, leave nop alone. */
13269 }
13270 else
13271 bfd_put_32 (input_bfd, LD_R2_40R1,
13272 contents + rel->r_offset + 4);
13273 can_plt_call = TRUE;
a7f2871e 13274 }
41bd81ab 13275 }
5bd4f169 13276 }
721956f4 13277
ba8ca3e7 13278 if (!can_plt_call && h != NULL)
721956f4 13279 {
ba8ca3e7
AM
13280 const char *name = h->elf.root.root.string;
13281
13282 if (*name == '.')
13283 ++name;
13284
13285 if (strncmp (name, "__libc_start_main", 17) == 0
13286 && (name[17] == 0 || name[17] == '@'))
6ab189d5 13287 {
ba8ca3e7
AM
13288 /* Allow crt1 branch to go via a toc adjusting
13289 stub. Other calls that never return could do
13290 the same, if we could detect such. */
b25116a9 13291 can_plt_call = TRUE;
6ab189d5 13292 }
ba8ca3e7
AM
13293 }
13294
13295 if (!can_plt_call)
13296 {
13297 /* g++ as of 20130507 emits self-calls without a
13298 following nop. This is arguably wrong since we
13299 have conflicting information. On the one hand a
13300 global symbol and on the other a local call
13301 sequence, but don't error for this special case.
13302 It isn't possible to cheaply verify we have
13303 exactly such a call. Allow all calls to the same
13304 section. */
13305 asection *code_sec = sec;
13306
13307 if (get_opd_info (sec) != NULL)
ad8e1ba5 13308 {
ba8ca3e7
AM
13309 bfd_vma off = (relocation + addend
13310 - sec->output_section->vma
13311 - sec->output_offset);
bc30df16 13312
ba8ca3e7 13313 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 13314 }
ba8ca3e7
AM
13315 if (code_sec == input_section)
13316 can_plt_call = TRUE;
13317 }
13318
13319 if (!can_plt_call)
13320 {
13321 info->callbacks->einfo
13322 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
13323 "recompile with -fPIC"),
13324 input_bfd, input_section, rel->r_offset, sym_name);
13325
13326 bfd_set_error (bfd_error_bad_value);
13327 ret = FALSE;
721956f4
AM
13328 }
13329
b25116a9 13330 if (can_plt_call
794e51c0
AM
13331 && (stub_entry->stub_type == ppc_stub_plt_call
13332 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
b25116a9
AM
13333 unresolved_reloc = FALSE;
13334 }
13335
6abec6bc
AM
13336 if ((stub_entry == NULL
13337 || stub_entry->stub_type == ppc_stub_long_branch
13338 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
13339 && get_opd_info (sec) != NULL)
13340 {
13341 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
13342 bfd_vma off = (relocation + addend
13343 - sec->output_section->vma
13344 - sec->output_offset);
aef36ac1 13345 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
13346 if (dest != (bfd_vma) -1)
13347 {
13348 relocation = dest;
13349 addend = 0;
bc30df16 13350 reloc_dest = DEST_OPD;
8387904d
AM
13351 }
13352 }
13353
b25116a9
AM
13354 /* If the branch is out of reach we ought to have a long
13355 branch stub. */
13356 from = (rel->r_offset
13357 + input_section->output_offset
13358 + input_section->output_section->vma);
13359
6abec6bc
AM
13360 if (stub_entry != NULL
13361 && (stub_entry->stub_type == ppc_stub_long_branch
13362 || stub_entry->stub_type == ppc_stub_plt_branch)
13363 && (r_type == R_PPC64_ADDR14_BRTAKEN
13364 || r_type == R_PPC64_ADDR14_BRNTAKEN
13365 || (relocation + addend - from + max_br_offset
13366 < 2 * max_br_offset)))
13367 /* Don't use the stub if this branch is in range. */
13368 stub_entry = NULL;
b25116a9
AM
13369
13370 if (stub_entry != NULL)
13371 {
13372 /* Munge up the value and addend so that we call the stub
13373 rather than the procedure directly. */
13374 relocation = (stub_entry->stub_offset
13375 + stub_entry->stub_sec->output_offset
13376 + stub_entry->stub_sec->output_section->vma);
13377 addend = 0;
bc30df16 13378 reloc_dest = DEST_STUB;
3b421ab3 13379
794e51c0
AM
13380 if ((stub_entry->stub_type == ppc_stub_plt_call
13381 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
13382 && (ALWAYS_EMIT_R2SAVE
13383 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
3b421ab3
AM
13384 && rel + 1 < relend
13385 && rel[1].r_offset == rel->r_offset + 4
13386 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
13387 relocation += 4;
b25116a9
AM
13388 }
13389
13390 if (insn != 0)
13391 {
794e51c0 13392 if (is_isa_v2)
721956f4 13393 {
b25116a9
AM
13394 /* Set 'a' bit. This is 0b00010 in BO field for branch
13395 on CR(BI) insns (BO == 001at or 011at), and 0b01000
13396 for branch on CTR insns (BO == 1a00t or 1a01t). */
13397 if ((insn & (0x14 << 21)) == (0x04 << 21))
13398 insn |= 0x02 << 21;
13399 else if ((insn & (0x14 << 21)) == (0x10 << 21))
13400 insn |= 0x08 << 21;
13401 else
13402 break;
13403 }
13404 else
13405 {
13406 /* Invert 'y' bit if not the default. */
4cc603a5 13407 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 13408 insn ^= 0x01 << 21;
721956f4 13409 }
b25116a9
AM
13410
13411 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5bd4f169 13412 }
e86ce104 13413
06da1e8e
AM
13414 /* NOP out calls to undefined weak functions.
13415 We can thus call a weak function without first
13416 checking whether the function is defined. */
b25116a9 13417 else if (h != NULL
039b3fef 13418 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 13419 && h->elf.dynindx == -1
b25116a9
AM
13420 && r_type == R_PPC64_REL24
13421 && relocation == 0
4cc603a5 13422 && addend == 0)
e86ce104 13423 {
06da1e8e
AM
13424 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13425 continue;
e86ce104 13426 }
65f38f15
AM
13427 break;
13428 }
5bd4f169 13429
65f38f15 13430 /* Set `addend'. */
411e1bfb 13431 tls_type = 0;
65f38f15
AM
13432 switch (r_type)
13433 {
13434 default:
25f53a85 13435 info->callbacks->einfo
bc30df16 13436 (_("%P: %B: unknown relocation type %d for `%T'\n"),
d003868e 13437 input_bfd, (int) r_type, sym_name);
5bd4f169 13438
65f38f15 13439 bfd_set_error (bfd_error_bad_value);
b34976b6 13440 ret = FALSE;
65f38f15 13441 continue;
5bd4f169 13442
65f38f15 13443 case R_PPC64_NONE:
411e1bfb 13444 case R_PPC64_TLS:
727fc41e
AM
13445 case R_PPC64_TLSGD:
13446 case R_PPC64_TLSLD:
3b421ab3 13447 case R_PPC64_TOCSAVE:
04c9666a
AM
13448 case R_PPC64_GNU_VTINHERIT:
13449 case R_PPC64_GNU_VTENTRY:
65f38f15 13450 continue;
5bd4f169
AM
13451
13452 /* GOT16 relocations. Like an ADDR16 using the symbol's
13453 address in the GOT as relocation value instead of the
411e1bfb 13454 symbol's value itself. Also, create a GOT entry for the
5bd4f169 13455 symbol and put the symbol value there. */
411e1bfb
AM
13456 case R_PPC64_GOT_TLSGD16:
13457 case R_PPC64_GOT_TLSGD16_LO:
13458 case R_PPC64_GOT_TLSGD16_HI:
13459 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 13460 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
13461 goto dogot;
13462
13463 case R_PPC64_GOT_TLSLD16:
13464 case R_PPC64_GOT_TLSLD16_LO:
13465 case R_PPC64_GOT_TLSLD16_HI:
13466 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 13467 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
13468 goto dogot;
13469
13470 case R_PPC64_GOT_TPREL16_DS:
13471 case R_PPC64_GOT_TPREL16_LO_DS:
13472 case R_PPC64_GOT_TPREL16_HI:
13473 case R_PPC64_GOT_TPREL16_HA:
13474 tls_type = TLS_TLS | TLS_TPREL;
13475 goto dogot;
13476
13477 case R_PPC64_GOT_DTPREL16_DS:
13478 case R_PPC64_GOT_DTPREL16_LO_DS:
13479 case R_PPC64_GOT_DTPREL16_HI:
13480 case R_PPC64_GOT_DTPREL16_HA:
13481 tls_type = TLS_TLS | TLS_DTPREL;
13482 goto dogot;
13483
65f38f15
AM
13484 case R_PPC64_GOT16:
13485 case R_PPC64_GOT16_LO:
13486 case R_PPC64_GOT16_HI:
13487 case R_PPC64_GOT16_HA:
13488 case R_PPC64_GOT16_DS:
13489 case R_PPC64_GOT16_LO_DS:
411e1bfb 13490 dogot:
5bd4f169
AM
13491 {
13492 /* Relocation is to the entry for this symbol in the global
13493 offset table. */
e717da7e 13494 asection *got;
d881513a 13495 bfd_vma *offp;
5bd4f169 13496 bfd_vma off;
d881513a 13497 unsigned long indx = 0;
927be08e 13498 struct got_entry *ent;
65f38f15 13499
d881513a
AM
13500 if (tls_type == (TLS_TLS | TLS_LD)
13501 && (h == NULL
f5385ebf 13502 || !h->elf.def_dynamic))
927be08e 13503 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 13504 else
5bd4f169 13505 {
5bd4f169 13506
d881513a
AM
13507 if (h != NULL)
13508 {
13509 bfd_boolean dyn = htab->elf.dynamic_sections_created;
039b3fef
AM
13510 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
13511 &h->elf)
d881513a 13512 || (info->shared
726d3ab0 13513 && SYMBOL_CALLS_LOCAL (info, &h->elf)))
d881513a
AM
13514 /* This is actually a static link, or it is a
13515 -Bsymbolic link and the symbol is defined
13516 locally, or the symbol was forced to be local
13517 because of a version file. */
13518 ;
13519 else
13520 {
14acf4dc 13521 BFD_ASSERT (h->elf.dynindx != -1);
039b3fef 13522 indx = h->elf.dynindx;
d881513a
AM
13523 unresolved_reloc = FALSE;
13524 }
039b3fef 13525 ent = h->elf.got.glist;
d881513a 13526 }
411e1bfb 13527 else
5bd4f169 13528 {
d881513a
AM
13529 if (local_got_ents == NULL)
13530 abort ();
13531 ent = local_got_ents[r_symndx];
5bd4f169 13532 }
d881513a
AM
13533
13534 for (; ent != NULL; ent = ent->next)
31c76678 13535 if (ent->addend == orig_rel.r_addend
e717da7e 13536 && ent->owner == input_bfd
d881513a
AM
13537 && ent->tls_type == tls_type)
13538 break;
5bd4f169 13539 }
411e1bfb 13540
927be08e
AM
13541 if (ent == NULL)
13542 abort ();
13543 if (ent->is_indirect)
13544 ent = ent->got.ent;
13545 offp = &ent->got.offset;
13546 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
13547 if (got == NULL)
13548 abort ();
13549
411e1bfb
AM
13550 /* The offset must always be a multiple of 8. We use the
13551 least significant bit to record whether we have already
13552 processed this entry. */
d881513a 13553 off = *offp;
411e1bfb
AM
13554 if ((off & 1) != 0)
13555 off &= ~1;
5bd4f169
AM
13556 else
13557 {
411e1bfb
AM
13558 /* Generate relocs for the dynamic linker, except in
13559 the case of TLSLD where we'll use one entry per
13560 module. */
25f23106
AM
13561 asection *relgot;
13562 bfd_boolean ifunc;
e717da7e 13563
d881513a 13564 *offp = off | 1;
25f23106
AM
13565 relgot = NULL;
13566 ifunc = (h != NULL
13567 ? h->elf.type == STT_GNU_IFUNC
13568 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 13569 if (ifunc)
25f23106 13570 relgot = htab->reliplt;
19e08130
AM
13571 else if ((info->shared || indx != 0)
13572 && (h == NULL
13573 || (tls_type == (TLS_TLS | TLS_LD)
13574 && !h->elf.def_dynamic)
13575 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
13576 || h->elf.root.type != bfd_link_hash_undefweak))
13577 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 13578 if (relgot != NULL)
5bd4f169 13579 {
e717da7e
AM
13580 outrel.r_offset = (got->output_section->vma
13581 + got->output_offset
411e1bfb 13582 + off);
4cc603a5 13583 outrel.r_addend = addend;
d881513a 13584 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 13585 {
411e1bfb 13586 outrel.r_addend = 0;
e515b051 13587 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
13588 if (tls_type == (TLS_TLS | TLS_GD))
13589 {
e717da7e
AM
13590 loc = relgot->contents;
13591 loc += (relgot->reloc_count++
d881513a
AM
13592 * sizeof (Elf64_External_Rela));
13593 bfd_elf64_swap_reloca_out (output_bfd,
13594 &outrel, loc);
e515b051 13595 outrel.r_offset += 8;
4cc603a5 13596 outrel.r_addend = addend;
d881513a
AM
13597 outrel.r_info
13598 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 13599 }
411e1bfb 13600 }
951fd09b 13601 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 13602 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 13603 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 13604 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
13605 else if (indx != 0)
13606 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
13607 else
81407a69 13608 {
25f23106
AM
13609 if (ifunc)
13610 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13611 else
13612 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
13613
13614 /* Write the .got section contents for the sake
13615 of prelink. */
e717da7e 13616 loc = got->contents + off;
23fbd6fa
JJ
13617 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
13618 loc);
81407a69 13619 }
81407a69
AM
13620
13621 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
13622 {
13623 outrel.r_addend += relocation;
13624 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
e1918d23 13625 outrel.r_addend -= htab->elf.tls_sec->vma;
e515b051 13626 }
e717da7e
AM
13627 loc = relgot->contents;
13628 loc += (relgot->reloc_count++
411e1bfb
AM
13629 * sizeof (Elf64_External_Rela));
13630 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
13631 }
13632
ad8e1ba5 13633 /* Init the .got section contents here if we're not
81407a69 13634 emitting a reloc. */
d881513a 13635 else
411e1bfb 13636 {
4cc603a5 13637 relocation += addend;
7b609f53
AM
13638 if (tls_type == (TLS_TLS | TLS_LD))
13639 relocation = 1;
13640 else if (tls_type != 0)
411e1bfb 13641 {
e1918d23 13642 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
7b609f53 13643 if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 13644 relocation += DTP_OFFSET - TP_OFFSET;
5bd4f169 13645
7b609f53
AM
13646 if (tls_type == (TLS_TLS | TLS_GD))
13647 {
13648 bfd_put_64 (output_bfd, relocation,
e717da7e 13649 got->contents + off + 8);
7b609f53
AM
13650 relocation = 1;
13651 }
411e1bfb 13652 }
7b609f53 13653
411e1bfb 13654 bfd_put_64 (output_bfd, relocation,
e717da7e 13655 got->contents + off);
5bd4f169
AM
13656 }
13657 }
13658
65f38f15
AM
13659 if (off >= (bfd_vma) -2)
13660 abort ();
13661
bf102f86
AM
13662 relocation = got->output_section->vma + got->output_offset + off;
13663 addend = -(TOCstart + htab->stub_group[input_section->id].toc_off);
5bd4f169 13664 }
65f38f15
AM
13665 break;
13666
13667 case R_PPC64_PLT16_HA:
13668 case R_PPC64_PLT16_HI:
13669 case R_PPC64_PLT16_LO:
13670 case R_PPC64_PLT32:
13671 case R_PPC64_PLT64:
13672 /* Relocation is to the entry for this symbol in the
13673 procedure linkage table. */
13674
13675 /* Resolve a PLT reloc against a local symbol directly,
13676 without using the procedure linkage table. */
13677 if (h == NULL)
13678 break;
13679
411e1bfb
AM
13680 /* It's possible that we didn't make a PLT entry for this
13681 symbol. This happens when statically linking PIC code,
13682 or when using -Bsymbolic. Go find a match if there is a
13683 PLT entry. */
4ce794b7 13684 if (htab->plt != NULL)
65f38f15 13685 {
411e1bfb 13686 struct plt_entry *ent;
039b3fef 13687 for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
31c76678 13688 if (ent->addend == orig_rel.r_addend
411e1bfb
AM
13689 && ent->plt.offset != (bfd_vma) -1)
13690 {
4ce794b7
AM
13691 relocation = (htab->plt->output_section->vma
13692 + htab->plt->output_offset
411e1bfb
AM
13693 + ent->plt.offset);
13694 unresolved_reloc = FALSE;
13695 }
65f38f15 13696 }
65f38f15 13697 break;
5bd4f169 13698
0b13192e
AM
13699 case R_PPC64_TOC:
13700 /* Relocation value is TOC base. */
13701 relocation = TOCstart;
cf35638d 13702 if (r_symndx == STN_UNDEF)
0b13192e 13703 relocation += htab->stub_group[input_section->id].toc_off;
8517fae7
AM
13704 else if (unresolved_reloc)
13705 ;
13706 else if (sec != NULL && sec->id <= htab->top_id)
0b13192e
AM
13707 relocation += htab->stub_group[sec->id].toc_off;
13708 else
13709 unresolved_reloc = TRUE;
ab96bf03 13710 goto dodyn;
0b13192e 13711
5bd4f169
AM
13712 /* TOC16 relocs. We want the offset relative to the TOC base,
13713 which is the address of the start of the TOC plus 0x8000.
13714 The TOC consists of sections .got, .toc, .tocbss, and .plt,
13715 in this order. */
65f38f15
AM
13716 case R_PPC64_TOC16:
13717 case R_PPC64_TOC16_LO:
13718 case R_PPC64_TOC16_HI:
13719 case R_PPC64_TOC16_DS:
13720 case R_PPC64_TOC16_LO_DS:
13721 case R_PPC64_TOC16_HA:
ad8e1ba5 13722 addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
5bd4f169
AM
13723 break;
13724
13725 /* Relocate against the beginning of the section. */
65f38f15
AM
13726 case R_PPC64_SECTOFF:
13727 case R_PPC64_SECTOFF_LO:
13728 case R_PPC64_SECTOFF_HI:
13729 case R_PPC64_SECTOFF_DS:
13730 case R_PPC64_SECTOFF_LO_DS:
13731 case R_PPC64_SECTOFF_HA:
4ce794b7 13732 if (sec != NULL)
65f38f15 13733 addend -= sec->output_section->vma;
5bd4f169
AM
13734 break;
13735
25f23106
AM
13736 case R_PPC64_REL16:
13737 case R_PPC64_REL16_LO:
13738 case R_PPC64_REL16_HI:
13739 case R_PPC64_REL16_HA:
13740 break;
13741
721956f4
AM
13742 case R_PPC64_REL14:
13743 case R_PPC64_REL14_BRNTAKEN:
13744 case R_PPC64_REL14_BRTAKEN:
5d1634d7
AM
13745 case R_PPC64_REL24:
13746 break;
13747
411e1bfb
AM
13748 case R_PPC64_TPREL16:
13749 case R_PPC64_TPREL16_LO:
13750 case R_PPC64_TPREL16_HI:
13751 case R_PPC64_TPREL16_HA:
13752 case R_PPC64_TPREL16_DS:
13753 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
13754 case R_PPC64_TPREL16_HIGH:
13755 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
13756 case R_PPC64_TPREL16_HIGHER:
13757 case R_PPC64_TPREL16_HIGHERA:
13758 case R_PPC64_TPREL16_HIGHEST:
13759 case R_PPC64_TPREL16_HIGHESTA:
766bc656
AM
13760 if (h != NULL
13761 && h->elf.root.type == bfd_link_hash_undefweak
13762 && h->elf.dynindx == -1)
13763 {
13764 /* Make this relocation against an undefined weak symbol
13765 resolve to zero. This is really just a tweak, since
13766 code using weak externs ought to check that they are
13767 defined before using them. */
13768 bfd_byte *p = contents + rel->r_offset - d_offset;
13769
13770 insn = bfd_get_32 (output_bfd, p);
13771 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
13772 if (insn != 0)
13773 bfd_put_32 (output_bfd, insn, p);
13774 break;
13775 }
e1918d23 13776 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
13777 if (info->shared)
13778 /* The TPREL16 relocs shouldn't really be used in shared
13779 libs as they will result in DT_TEXTREL being set, but
13780 support them anyway. */
13781 goto dodyn;
13782 break;
13783
13784 case R_PPC64_DTPREL16:
13785 case R_PPC64_DTPREL16_LO:
13786 case R_PPC64_DTPREL16_HI:
13787 case R_PPC64_DTPREL16_HA:
13788 case R_PPC64_DTPREL16_DS:
13789 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
13790 case R_PPC64_DTPREL16_HIGH:
13791 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
13792 case R_PPC64_DTPREL16_HIGHER:
13793 case R_PPC64_DTPREL16_HIGHERA:
13794 case R_PPC64_DTPREL16_HIGHEST:
13795 case R_PPC64_DTPREL16_HIGHESTA:
e1918d23 13796 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
13797 break;
13798
e515b051
AM
13799 case R_PPC64_DTPMOD64:
13800 relocation = 1;
13801 addend = 0;
13802 goto dodyn;
13803
411e1bfb 13804 case R_PPC64_TPREL64:
e1918d23 13805 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
13806 goto dodyn;
13807
13808 case R_PPC64_DTPREL64:
e1918d23 13809 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
13810 /* Fall thru */
13811
65f38f15
AM
13812 /* Relocations that may need to be propagated if this is a
13813 dynamic object. */
04c9666a 13814 case R_PPC64_REL30:
65f38f15
AM
13815 case R_PPC64_REL32:
13816 case R_PPC64_REL64:
13817 case R_PPC64_ADDR14:
13818 case R_PPC64_ADDR14_BRNTAKEN:
13819 case R_PPC64_ADDR14_BRTAKEN:
13820 case R_PPC64_ADDR16:
13821 case R_PPC64_ADDR16_DS:
13822 case R_PPC64_ADDR16_HA:
13823 case R_PPC64_ADDR16_HI:
f9c6b907
AM
13824 case R_PPC64_ADDR16_HIGH:
13825 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
13826 case R_PPC64_ADDR16_HIGHER:
13827 case R_PPC64_ADDR16_HIGHERA:
13828 case R_PPC64_ADDR16_HIGHEST:
13829 case R_PPC64_ADDR16_HIGHESTA:
13830 case R_PPC64_ADDR16_LO:
13831 case R_PPC64_ADDR16_LO_DS:
13832 case R_PPC64_ADDR24:
65f38f15
AM
13833 case R_PPC64_ADDR32:
13834 case R_PPC64_ADDR64:
13835 case R_PPC64_UADDR16:
13836 case R_PPC64_UADDR32:
13837 case R_PPC64_UADDR64:
411e1bfb 13838 dodyn:
5d1634d7 13839 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
13840 break;
13841
41bd81ab
AM
13842 if (NO_OPD_RELOCS && is_opd)
13843 break;
13844
65f38f15 13845 if ((info->shared
4e795f50 13846 && (h == NULL
039b3fef
AM
13847 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
13848 || h->elf.root.type != bfd_link_hash_undefweak)
1d483afe 13849 && (must_be_dyn_reloc (info, r_type)
039b3fef 13850 || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
f4656909
AM
13851 || (ELIMINATE_COPY_RELOCS
13852 && !info->shared
65f38f15 13853 && h != NULL
039b3fef 13854 && h->elf.dynindx != -1
f5385ebf 13855 && !h->elf.non_got_ref
25f23106
AM
13856 && !h->elf.def_regular)
13857 || (!info->shared
13858 && (h != NULL
13859 ? h->elf.type == STT_GNU_IFUNC
13860 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
65f38f15 13861 {
b34976b6 13862 bfd_boolean skip, relocate;
65f38f15 13863 asection *sreloc;
1cf1f670 13864 bfd_vma out_off;
65f38f15
AM
13865
13866 /* When generating a dynamic object, these relocations
13867 are copied into the output file to be resolved at run
13868 time. */
13869
b34976b6
AM
13870 skip = FALSE;
13871 relocate = FALSE;
65f38f15 13872
1cf1f670
AM
13873 out_off = _bfd_elf_section_offset (output_bfd, info,
13874 input_section, rel->r_offset);
13875 if (out_off == (bfd_vma) -1)
b34976b6 13876 skip = TRUE;
1cf1f670 13877 else if (out_off == (bfd_vma) -2)
b34976b6 13878 skip = TRUE, relocate = TRUE;
1cf1f670
AM
13879 out_off += (input_section->output_section->vma
13880 + input_section->output_offset);
13881 outrel.r_offset = out_off;
411e1bfb 13882 outrel.r_addend = rel->r_addend;
65f38f15 13883
1cf1f670
AM
13884 /* Optimize unaligned reloc use. */
13885 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
13886 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
13887 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
13888 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
13889 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
13890 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
13891 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
13892 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
13893 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
13894
65f38f15 13895 if (skip)
0bb2d96a 13896 memset (&outrel, 0, sizeof outrel);
726d3ab0 13897 else if (!SYMBOL_CALLS_LOCAL (info, &h->elf)
0b13192e
AM
13898 && !is_opd
13899 && r_type != R_PPC64_TOC)
14acf4dc
MR
13900 {
13901 BFD_ASSERT (h->elf.dynindx != -1);
13902 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
13903 }
65f38f15
AM
13904 else
13905 {
41bd81ab
AM
13906 /* This symbol is local, or marked to become local,
13907 or this is an opd section reloc which must point
13908 at a local function. */
65f38f15 13909 outrel.r_addend += relocation;
e86ce104 13910 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 13911 {
3fad3c7c 13912 if (is_opd && h != NULL)
afbe61cf
AM
13913 {
13914 /* Lie about opd entries. This case occurs
13915 when building shared libraries and we
13916 reference a function in another shared
3fad3c7c
AM
13917 lib. The same thing happens for a weak
13918 definition in an application that's
13919 overridden by a strong definition in a
13920 shared lib. (I believe this is a generic
13921 bug in binutils handling of weak syms.)
13922 In these cases we won't use the opd
1e2f5b6e 13923 entry in this lib. */
b34976b6 13924 unresolved_reloc = FALSE;
afbe61cf 13925 }
25f23106
AM
13926 if (!is_opd
13927 && r_type == R_PPC64_ADDR64
13928 && (h != NULL
13929 ? h->elf.type == STT_GNU_IFUNC
13930 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
13931 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13932 else
13933 {
13934 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 13935
25f23106
AM
13936 /* We need to relocate .opd contents for ld.so.
13937 Prelink also wants simple and consistent rules
13938 for relocs. This make all RELATIVE relocs have
13939 *r_offset equal to r_addend. */
13940 relocate = TRUE;
13941 }
65f38f15
AM
13942 }
13943 else
13944 {
13945 long indx = 0;
13946
25f23106
AM
13947 if (h != NULL
13948 ? h->elf.type == STT_GNU_IFUNC
13949 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13950 {
25f53a85 13951 info->callbacks->einfo
bc30df16
AM
13952 (_("%P: %H: %s for indirect "
13953 "function `%T' unsupported\n"),
25f53a85 13954 input_bfd, input_section, rel->r_offset,
25f23106
AM
13955 ppc64_elf_howto_table[r_type]->name,
13956 sym_name);
13957 ret = FALSE;
13958 }
cf35638d 13959 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
13960 ;
13961 else if (sec == NULL || sec->owner == NULL)
13962 {
13963 bfd_set_error (bfd_error_bad_value);
b34976b6 13964 return FALSE;
65f38f15
AM
13965 }
13966 else
13967 {
13968 asection *osec;
13969
13970 osec = sec->output_section;
13971 indx = elf_section_data (osec)->dynindx;
13972
74541ad4
AM
13973 if (indx == 0)
13974 {
13975 if ((osec->flags & SEC_READONLY) == 0
13976 && htab->elf.data_index_section != NULL)
13977 osec = htab->elf.data_index_section;
13978 else
13979 osec = htab->elf.text_index_section;
13980 indx = elf_section_data (osec)->dynindx;
13981 }
13982 BFD_ASSERT (indx != 0);
13983
65f38f15
AM
13984 /* We are turning this relocation into one
13985 against a section symbol, so subtract out
13986 the output section's address but not the
13987 offset of the input section in the output
13988 section. */
13989 outrel.r_addend -= osec->vma;
13990 }
13991
13992 outrel.r_info = ELF64_R_INFO (indx, r_type);
13993 }
13994 }
13995
13996 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
13997 if (h != NULL
13998 ? h->elf.type == STT_GNU_IFUNC
13999 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
25f23106 14000 sreloc = htab->reliplt;
65f38f15
AM
14001 if (sreloc == NULL)
14002 abort ();
14003
dfbb6ac9
AM
14004 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
14005 >= sreloc->size)
14006 abort ();
947216bf
AM
14007 loc = sreloc->contents;
14008 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
14009 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14010
14011 /* If this reloc is against an external symbol, it will
14012 be computed at runtime, so there's no need to do
81407a69
AM
14013 anything now. However, for the sake of prelink ensure
14014 that the section contents are a known value. */
65f38f15 14015 if (! relocate)
81407a69
AM
14016 {
14017 unresolved_reloc = FALSE;
14018 /* The value chosen here is quite arbitrary as ld.so
14019 ignores section contents except for the special
14020 case of .opd where the contents might be accessed
14021 before relocation. Choose zero, as that won't
14022 cause reloc overflow. */
14023 relocation = 0;
14024 addend = 0;
14025 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
14026 to improve backward compatibility with older
14027 versions of ld. */
14028 if (r_type == R_PPC64_ADDR64)
14029 addend = outrel.r_addend;
14030 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 14031 else if (ppc64_elf_howto_table[r_type]->pc_relative)
000732f7
AM
14032 addend = (input_section->output_section->vma
14033 + input_section->output_offset
14034 + rel->r_offset);
81407a69 14035 }
65f38f15 14036 }
5bd4f169
AM
14037 break;
14038
65f38f15
AM
14039 case R_PPC64_COPY:
14040 case R_PPC64_GLOB_DAT:
14041 case R_PPC64_JMP_SLOT:
25f23106 14042 case R_PPC64_JMP_IREL:
65f38f15
AM
14043 case R_PPC64_RELATIVE:
14044 /* We shouldn't ever see these dynamic relocs in relocatable
14045 files. */
ae9a127f 14046 /* Fall through. */
65f38f15
AM
14047
14048 case R_PPC64_PLTGOT16:
14049 case R_PPC64_PLTGOT16_DS:
14050 case R_PPC64_PLTGOT16_HA:
14051 case R_PPC64_PLTGOT16_HI:
14052 case R_PPC64_PLTGOT16_LO:
14053 case R_PPC64_PLTGOT16_LO_DS:
14054 case R_PPC64_PLTREL32:
14055 case R_PPC64_PLTREL64:
14056 /* These ones haven't been implemented yet. */
14057
25f53a85 14058 info->callbacks->einfo
bc30df16 14059 (_("%P: %B: %s is not supported for `%T'\n"),
d003868e 14060 input_bfd,
4ce794b7 14061 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
14062
14063 bfd_set_error (bfd_error_invalid_operation);
b34976b6 14064 ret = FALSE;
5bd4f169 14065 continue;
65f38f15 14066 }
5bd4f169 14067
67f0cbdb
AM
14068 /* Multi-instruction sequences that access the TOC can be
14069 optimized, eg. addis ra,r2,0; addi rb,ra,x;
14070 to nop; addi rb,r2,x; */
14071 switch (r_type)
14072 {
14073 default:
14074 break;
14075
14076 case R_PPC64_GOT_TLSLD16_HI:
14077 case R_PPC64_GOT_TLSGD16_HI:
14078 case R_PPC64_GOT_TPREL16_HI:
14079 case R_PPC64_GOT_DTPREL16_HI:
14080 case R_PPC64_GOT16_HI:
14081 case R_PPC64_TOC16_HI:
14082 /* These relocs would only be useful if building up an
14083 offset to later add to r2, perhaps in an indexed
14084 addressing mode instruction. Don't try to optimize.
14085 Unfortunately, the possibility of someone building up an
14086 offset like this or even with the HA relocs, means that
14087 we need to check the high insn when optimizing the low
14088 insn. */
14089 break;
14090
14091 case R_PPC64_GOT_TLSLD16_HA:
14092 case R_PPC64_GOT_TLSGD16_HA:
14093 case R_PPC64_GOT_TPREL16_HA:
14094 case R_PPC64_GOT_DTPREL16_HA:
14095 case R_PPC64_GOT16_HA:
14096 case R_PPC64_TOC16_HA:
98528052 14097 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 14098 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052
AM
14099 {
14100 bfd_byte *p = contents + (rel->r_offset & ~3);
14101 bfd_put_32 (input_bfd, NOP, p);
14102 }
67f0cbdb
AM
14103 break;
14104
14105 case R_PPC64_GOT_TLSLD16_LO:
14106 case R_PPC64_GOT_TLSGD16_LO:
14107 case R_PPC64_GOT_TPREL16_LO_DS:
14108 case R_PPC64_GOT_DTPREL16_LO_DS:
14109 case R_PPC64_GOT16_LO:
14110 case R_PPC64_GOT16_LO_DS:
14111 case R_PPC64_TOC16_LO:
14112 case R_PPC64_TOC16_LO_DS:
98528052 14113 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 14114 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
14115 {
14116 bfd_byte *p = contents + (rel->r_offset & ~3);
14117 insn = bfd_get_32 (input_bfd, p);
560c8763
AM
14118 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
14119 {
14120 /* Transform addic to addi when we change reg. */
14121 insn &= ~((0x3f << 26) | (0x1f << 16));
14122 insn |= (14u << 26) | (2 << 16);
14123 }
14124 else
67f0cbdb 14125 {
98528052
AM
14126 insn &= ~(0x1f << 16);
14127 insn |= 2 << 16;
67f0cbdb 14128 }
560c8763 14129 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
14130 }
14131 break;
14132 }
14133
65f38f15
AM
14134 /* Do any further special processing. */
14135 switch (r_type)
14136 {
14137 default:
14138 break;
14139
25f23106 14140 case R_PPC64_REL16_HA:
f9c6b907
AM
14141 case R_PPC64_ADDR16_HA:
14142 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
14143 case R_PPC64_ADDR16_HIGHERA:
14144 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
14145 case R_PPC64_TOC16_HA:
14146 case R_PPC64_SECTOFF_HA:
411e1bfb 14147 case R_PPC64_TPREL16_HA:
f9c6b907 14148 case R_PPC64_TPREL16_HIGHA:
411e1bfb 14149 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 14150 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
14151 case R_PPC64_DTPREL16_HA:
14152 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 14153 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 14154 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
14155 /* It's just possible that this symbol is a weak symbol
14156 that's not actually defined anywhere. In that case,
14157 'sec' would be NULL, and we should leave the symbol
14158 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
14159 if (sec == NULL)
14160 break;
14161 /* Fall thru */
14162
14163 case R_PPC64_GOT16_HA:
14164 case R_PPC64_PLTGOT16_HA:
14165 case R_PPC64_PLT16_HA:
14166 case R_PPC64_GOT_TLSGD16_HA:
14167 case R_PPC64_GOT_TLSLD16_HA:
14168 case R_PPC64_GOT_TPREL16_HA:
14169 case R_PPC64_GOT_DTPREL16_HA:
14170 /* Add 0x10000 if sign bit in 0:15 is set.
14171 Bits 0:15 are not used. */
14172 addend += 0x8000;
65f38f15
AM
14173 break;
14174
14175 case R_PPC64_ADDR16_DS:
14176 case R_PPC64_ADDR16_LO_DS:
14177 case R_PPC64_GOT16_DS:
14178 case R_PPC64_GOT16_LO_DS:
14179 case R_PPC64_PLT16_LO_DS:
14180 case R_PPC64_SECTOFF_DS:
14181 case R_PPC64_SECTOFF_LO_DS:
14182 case R_PPC64_TOC16_DS:
14183 case R_PPC64_TOC16_LO_DS:
14184 case R_PPC64_PLTGOT16_DS:
14185 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
14186 case R_PPC64_GOT_TPREL16_DS:
14187 case R_PPC64_GOT_TPREL16_LO_DS:
14188 case R_PPC64_GOT_DTPREL16_DS:
14189 case R_PPC64_GOT_DTPREL16_LO_DS:
14190 case R_PPC64_TPREL16_DS:
14191 case R_PPC64_TPREL16_LO_DS:
14192 case R_PPC64_DTPREL16_DS:
14193 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
14194 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
14195 mask = 3;
14196 /* If this reloc is against an lq insn, then the value must be
14197 a multiple of 16. This is somewhat of a hack, but the
14198 "correct" way to do this by defining _DQ forms of all the
14199 _DS relocs bloats all reloc switches in this file. It
14200 doesn't seem to make much sense to use any of these relocs
14201 in data, so testing the insn should be safe. */
494dac0c 14202 if ((insn & (0x3f << 26)) == (56u << 26))
adadcc0c
AM
14203 mask = 15;
14204 if (((relocation + addend) & mask) != 0)
65f38f15 14205 {
25f53a85 14206 info->callbacks->einfo
8de848d8 14207 (_("%P: %H: error: %s not a multiple of %u\n"),
25f53a85 14208 input_bfd, input_section, rel->r_offset,
4ce794b7 14209 ppc64_elf_howto_table[r_type]->name,
adadcc0c 14210 mask + 1);
65f38f15 14211 bfd_set_error (bfd_error_bad_value);
b34976b6 14212 ret = FALSE;
65f38f15
AM
14213 continue;
14214 }
14215 break;
5bd4f169
AM
14216 }
14217
239e1f3a
AM
14218 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
14219 because such sections are not SEC_ALLOC and thus ld.so will
14220 not process them. */
65f38f15 14221 if (unresolved_reloc
239e1f3a 14222 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
14223 && h->elf.def_dynamic)
14224 && _bfd_elf_section_offset (output_bfd, info, input_section,
14225 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 14226 {
25f53a85 14227 info->callbacks->einfo
bc30df16 14228 (_("%P: %H: unresolvable %s against `%T'\n"),
25f53a85 14229 input_bfd, input_section, rel->r_offset,
7b609f53 14230 ppc64_elf_howto_table[(int) r_type]->name,
039b3fef 14231 h->elf.root.root.string);
b34976b6 14232 ret = FALSE;
9c07fe7c 14233 }
5bd4f169 14234
65f38f15 14235 r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
5bd4f169
AM
14236 input_bfd,
14237 input_section,
14238 contents,
411e1bfb 14239 rel->r_offset,
5bd4f169
AM
14240 relocation,
14241 addend);
14242
ef60b7ff 14243 if (r != bfd_reloc_ok)
5bd4f169 14244 {
bc30df16
AM
14245 char *more_info = NULL;
14246 const char *reloc_name = ppc64_elf_howto_table[r_type]->name;
14247
14248 if (reloc_dest != DEST_NORMAL)
14249 {
14250 more_info = bfd_malloc (strlen (reloc_name) + 8);
14251 if (more_info != NULL)
14252 {
14253 strcpy (more_info, reloc_name);
14254 strcat (more_info, (reloc_dest == DEST_OPD
14255 ? " (OPD)" : " (stub)"));
14256 reloc_name = more_info;
14257 }
14258 }
14259
cd27b276 14260 if (r == bfd_reloc_overflow)
5bd4f169 14261 {
cd27b276
AM
14262 if (warned)
14263 continue;
14264 if (h != NULL
039b3fef 14265 && h->elf.root.type == bfd_link_hash_undefweak
4ce794b7 14266 && ppc64_elf_howto_table[r_type]->pc_relative)
5bd4f169
AM
14267 {
14268 /* Assume this is a call protected by other code that
14269 detects the symbol is undefined. If this is the case,
14270 we can safely ignore the overflow. If not, the
14271 program is hosed anyway, and a little warning isn't
14272 going to help. */
14273
14274 continue;
14275 }
14276
ef60b7ff 14277 if (!((*info->callbacks->reloc_overflow)
bc30df16
AM
14278 (info, &h->elf.root, sym_name,
14279 reloc_name, orig_rel.r_addend,
14280 input_bfd, input_section, rel->r_offset)))
b34976b6 14281 return FALSE;
ef60b7ff
AM
14282 }
14283 else
14284 {
25f53a85 14285 info->callbacks->einfo
bc30df16 14286 (_("%P: %H: %s against `%T': error %d\n"),
25f53a85 14287 input_bfd, input_section, rel->r_offset,
bc30df16 14288 reloc_name, sym_name, (int) r);
b34976b6 14289 ret = FALSE;
ef60b7ff 14290 }
bc30df16
AM
14291 if (more_info != NULL)
14292 free (more_info);
5bd4f169 14293 }
5bd4f169
AM
14294 }
14295
645ea6a9
AM
14296 /* If we're emitting relocations, then shortly after this function
14297 returns, reloc offsets and addends for this section will be
14298 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
14299 file rather than the input. Save a copy of the relocs for
14300 opd_entry_value. */
4cc603a5 14301 if (is_opd && (info->emitrelocations || info->relocatable))
8860955f
AM
14302 {
14303 bfd_size_type amt;
14304 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
14305 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
14306 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
14307 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
14308 if (rel == NULL)
14309 return FALSE;
14310 memcpy (rel, relocs, amt);
14311 }
5bd4f169
AM
14312 return ret;
14313}
14314
754021d0
AM
14315/* Adjust the value of any local symbols in opd sections. */
14316
6e0b88f1 14317static int
754021d0
AM
14318ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
14319 const char *name ATTRIBUTE_UNUSED,
14320 Elf_Internal_Sym *elfsym,
14321 asection *input_sec,
14322 struct elf_link_hash_entry *h)
14323{
74f0fb50
AM
14324 struct _opd_sec_data *opd;
14325 long adjust;
754021d0
AM
14326 bfd_vma value;
14327
4025353c 14328 if (h != NULL)
6e0b88f1 14329 return 1;
4025353c 14330
74f0fb50
AM
14331 opd = get_opd_info (input_sec);
14332 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 14333 return 1;
754021d0
AM
14334
14335 value = elfsym->st_value - input_sec->output_offset;
14336 if (!info->relocatable)
14337 value -= input_sec->output_section->vma;
14338
74f0fb50 14339 adjust = opd->adjust[value / 8];
4025353c 14340 if (adjust == -1)
6e0b88f1
AM
14341 return 2;
14342
14343 elfsym->st_value += adjust;
14344 return 1;
754021d0
AM
14345}
14346
5bd4f169
AM
14347/* Finish up dynamic symbol handling. We set the contents of various
14348 dynamic sections here. */
14349
b34976b6 14350static bfd_boolean
4ce794b7
AM
14351ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
14352 struct bfd_link_info *info,
14353 struct elf_link_hash_entry *h,
ab6dce23 14354 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
5bd4f169 14355{
65f38f15 14356 struct ppc_link_hash_table *htab;
8387904d
AM
14357 struct plt_entry *ent;
14358 Elf_Internal_Rela rela;
14359 bfd_byte *loc;
5bd4f169 14360
65f38f15 14361 htab = ppc_hash_table (info);
4dfe6ac6
NC
14362 if (htab == NULL)
14363 return FALSE;
5bd4f169 14364
8387904d
AM
14365 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
14366 if (ent->plt.offset != (bfd_vma) -1)
14367 {
14368 /* This symbol has an entry in the procedure linkage
14369 table. Set it up. */
e054468f
AM
14370 if (!htab->elf.dynamic_sections_created
14371 || h->dynindx == -1)
14372 {
14373 BFD_ASSERT (h->type == STT_GNU_IFUNC
14374 && h->def_regular
14375 && (h->root.type == bfd_link_hash_defined
14376 || h->root.type == bfd_link_hash_defweak));
25f23106
AM
14377 rela.r_offset = (htab->iplt->output_section->vma
14378 + htab->iplt->output_offset
14379 + ent->plt.offset);
ee67d69a
AM
14380 if (htab->opd_abi)
14381 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
14382 else
14383 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
e054468f
AM
14384 rela.r_addend = (h->root.u.def.value
14385 + h->root.u.def.section->output_offset
14386 + h->root.u.def.section->output_section->vma
14387 + ent->addend);
25f23106
AM
14388 loc = (htab->reliplt->contents
14389 + (htab->reliplt->reloc_count++
14390 * sizeof (Elf64_External_Rela)));
e054468f
AM
14391 }
14392 else
14393 {
25f23106
AM
14394 rela.r_offset = (htab->plt->output_section->vma
14395 + htab->plt->output_offset
14396 + ent->plt.offset);
e054468f
AM
14397 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
14398 rela.r_addend = ent->addend;
25f23106
AM
14399 loc = (htab->relplt->contents
14400 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE)
14401 / (PLT_ENTRY_SIZE / sizeof (Elf64_External_Rela))));
e054468f 14402 }
8387904d
AM
14403 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
14404 }
5bd4f169 14405
f5385ebf 14406 if (h->needs_copy)
5bd4f169 14407 {
65f38f15 14408 /* This symbol needs a copy reloc. Set it up. */
5bd4f169 14409
65f38f15
AM
14410 if (h->dynindx == -1
14411 || (h->root.type != bfd_link_hash_defined
14412 && h->root.type != bfd_link_hash_defweak)
4ce794b7 14413 || htab->relbss == NULL)
65f38f15 14414 abort ();
5bd4f169
AM
14415
14416 rela.r_offset = (h->root.u.def.value
14417 + h->root.u.def.section->output_section->vma
14418 + h->root.u.def.section->output_offset);
14419 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
14420 rela.r_addend = 0;
4ce794b7
AM
14421 loc = htab->relbss->contents;
14422 loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 14423 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
14424 }
14425
b34976b6 14426 return TRUE;
5bd4f169
AM
14427}
14428
65f38f15
AM
14429/* Used to decide how to sort relocs in an optimal manner for the
14430 dynamic linker, before writing them out. */
14431
14432static enum elf_reloc_type_class
7e612e98
AM
14433ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
14434 const asection *rel_sec,
14435 const Elf_Internal_Rela *rela)
65f38f15 14436{
04c9666a 14437 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
14438 struct ppc_link_hash_table *htab = ppc_hash_table (info);
14439
14440 if (rel_sec == htab->reliplt)
14441 return reloc_class_ifunc;
a33d1f77 14442
4ce794b7 14443 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 14444 switch (r_type)
65f38f15
AM
14445 {
14446 case R_PPC64_RELATIVE:
14447 return reloc_class_relative;
14448 case R_PPC64_JMP_SLOT:
14449 return reloc_class_plt;
14450 case R_PPC64_COPY:
14451 return reloc_class_copy;
14452 default:
14453 return reloc_class_normal;
14454 }
14455}
14456
5bd4f169
AM
14457/* Finish up the dynamic sections. */
14458
b34976b6 14459static bfd_boolean
4ce794b7
AM
14460ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
14461 struct bfd_link_info *info)
5bd4f169 14462{
65f38f15
AM
14463 struct ppc_link_hash_table *htab;
14464 bfd *dynobj;
5bd4f169 14465 asection *sdyn;
5bd4f169 14466
65f38f15 14467 htab = ppc_hash_table (info);
4dfe6ac6
NC
14468 if (htab == NULL)
14469 return FALSE;
14470
65f38f15 14471 dynobj = htab->elf.dynobj;
3d4d4302 14472 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 14473
65f38f15 14474 if (htab->elf.dynamic_sections_created)
5bd4f169 14475 {
5bd4f169
AM
14476 Elf64_External_Dyn *dyncon, *dynconend;
14477
4ce794b7 14478 if (sdyn == NULL || htab->got == NULL)
65f38f15 14479 abort ();
5bd4f169
AM
14480
14481 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 14482 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
14483 for (; dyncon < dynconend; dyncon++)
14484 {
14485 Elf_Internal_Dyn dyn;
19397422 14486 asection *s;
5bd4f169
AM
14487
14488 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
14489
14490 switch (dyn.d_tag)
14491 {
65f38f15
AM
14492 default:
14493 continue;
5bd4f169 14494
5d1634d7 14495 case DT_PPC64_GLINK:
4ce794b7 14496 s = htab->glink;
6348e046 14497 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
14498 /* We stupidly defined DT_PPC64_GLINK to be the start
14499 of glink rather than the first entry point, which is
14500 what ld.so needs, and now have a bigger stub to
14501 support automatic multiple TOCs. */
14502 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
5d1634d7
AM
14503 break;
14504
19397422
AM
14505 case DT_PPC64_OPD:
14506 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
14507 if (s == NULL)
14508 continue;
14509 dyn.d_un.d_ptr = s->vma;
19397422
AM
14510 break;
14511
14512 case DT_PPC64_OPDSZ:
14513 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
14514 if (s == NULL)
14515 continue;
eea6121a 14516 dyn.d_un.d_val = s->size;
19397422
AM
14517 break;
14518
65f38f15 14519 case DT_PLTGOT:
4ce794b7 14520 s = htab->plt;
6348e046 14521 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
14522 break;
14523
14524 case DT_JMPREL:
4ce794b7 14525 s = htab->relplt;
6348e046 14526 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 14527 break;
5bd4f169 14528
65f38f15 14529 case DT_PLTRELSZ:
eea6121a 14530 dyn.d_un.d_val = htab->relplt->size;
5d1634d7
AM
14531 break;
14532
14533 case DT_RELASZ:
14534 /* Don't count procedure linkage table relocs in the
14535 overall reloc count. */
4ce794b7 14536 s = htab->relplt;
6348e046
AM
14537 if (s == NULL)
14538 continue;
eea6121a 14539 dyn.d_un.d_val -= s->size;
6348e046
AM
14540 break;
14541
14542 case DT_RELA:
14543 /* We may not be using the standard ELF linker script.
14544 If .rela.plt is the first .rela section, we adjust
14545 DT_RELA to not include it. */
4ce794b7 14546 s = htab->relplt;
6348e046
AM
14547 if (s == NULL)
14548 continue;
14549 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
14550 continue;
eea6121a 14551 dyn.d_un.d_ptr += s->size;
65f38f15 14552 break;
5bd4f169 14553 }
5bd4f169 14554
65f38f15 14555 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 14556 }
5bd4f169
AM
14557 }
14558
eea6121a 14559 if (htab->got != NULL && htab->got->size != 0)
5d1634d7
AM
14560 {
14561 /* Fill in the first entry in the global offset table.
14562 We use it to hold the link-time TOCbase. */
14563 bfd_put_64 (output_bfd,
60ee0d4a 14564 elf_gp (output_bfd) + TOC_BASE_OFF,
4ce794b7 14565 htab->got->contents);
5d1634d7
AM
14566
14567 /* Set .got entry size. */
4ce794b7 14568 elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
5d1634d7
AM
14569 }
14570
eea6121a 14571 if (htab->plt != NULL && htab->plt->size != 0)
5d1634d7
AM
14572 {
14573 /* Set .plt entry size. */
4ce794b7 14574 elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
5d1634d7
AM
14575 = PLT_ENTRY_SIZE;
14576 }
14577
84f5d08e
AM
14578 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
14579 brlt ourselves if emitrelocations. */
14580 if (htab->brlt != NULL
14581 && htab->brlt->reloc_count != 0
14582 && !_bfd_elf_link_output_relocs (output_bfd,
14583 htab->brlt,
d4730f92 14584 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
14585 elf_section_data (htab->brlt)->relocs,
14586 NULL))
14587 return FALSE;
14588
176a0d42
AM
14589 if (htab->glink != NULL
14590 && htab->glink->reloc_count != 0
14591 && !_bfd_elf_link_output_relocs (output_bfd,
14592 htab->glink,
d4730f92 14593 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
14594 elf_section_data (htab->glink)->relocs,
14595 NULL))
14596 return FALSE;
14597
58d180e8
AM
14598
14599 if (htab->glink_eh_frame != NULL
dbaa2011 14600 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
58d180e8
AM
14601 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
14602 htab->glink_eh_frame,
14603 htab->glink_eh_frame->contents))
14604 return FALSE;
14605
e717da7e 14606 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
14607 since we didn't add them to DYNOBJ. We know dynobj is the first
14608 bfd. */
e717da7e
AM
14609 while ((dynobj = dynobj->link_next) != NULL)
14610 {
14611 asection *s;
7b53ace3 14612
0c8d6e5c 14613 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
14614 continue;
14615
e717da7e
AM
14616 s = ppc64_elf_tdata (dynobj)->got;
14617 if (s != NULL
eea6121a 14618 && s->size != 0
e717da7e
AM
14619 && s->output_section != bfd_abs_section_ptr
14620 && !bfd_set_section_contents (output_bfd, s->output_section,
14621 s->contents, s->output_offset,
eea6121a 14622 s->size))
e717da7e
AM
14623 return FALSE;
14624 s = ppc64_elf_tdata (dynobj)->relgot;
14625 if (s != NULL
eea6121a 14626 && s->size != 0
e717da7e
AM
14627 && s->output_section != bfd_abs_section_ptr
14628 && !bfd_set_section_contents (output_bfd, s->output_section,
14629 s->contents, s->output_offset,
eea6121a 14630 s->size))
e717da7e
AM
14631 return FALSE;
14632 }
f6c52c13 14633
b34976b6 14634 return TRUE;
5bd4f169
AM
14635}
14636
5bd4f169 14637#include "elf64-target.h"
7b8e7dad
AM
14638
14639/* FreeBSD support */
14640
14641#undef TARGET_LITTLE_SYM
14642#undef TARGET_LITTLE_NAME
14643
14644#undef TARGET_BIG_SYM
14645#define TARGET_BIG_SYM bfd_elf64_powerpc_freebsd_vec
14646#undef TARGET_BIG_NAME
14647#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
14648
14649#undef ELF_OSABI
14650#define ELF_OSABI ELFOSABI_FREEBSD
14651
14652#undef elf64_bed
14653#define elf64_bed elf64_powerpc_fbsd_bed
14654
14655#include "elf64-target.h"
14656