bfd/
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
b2a8e766
AM
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004
3 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.
d37c89e5 6 Largely rewritten by Alan Modra <amodra@bigpond.net.au>
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
12 the Free Software Foundation; either version 2 of the License, or
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.,
22 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
5bd4f169 23
4ce794b7
AM
24/* The 64-bit PowerPC ELF ABI may be found at
25 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
5bd4f169
AM
27
28#include "bfd.h"
29#include "sysdep.h"
30#include "bfdlink.h"
31#include "libbfd.h"
32#include "elf-bfd.h"
04c9666a 33#include "elf/ppc64.h"
5d1634d7 34#include "elf64-ppc.h"
5bd4f169 35
805fc799 36static bfd_reloc_status_type ppc64_elf_ha_reloc
4ce794b7 37 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
38static bfd_reloc_status_type ppc64_elf_branch_reloc
39 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 40static bfd_reloc_status_type ppc64_elf_brtaken_reloc
4ce794b7 41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 42static bfd_reloc_status_type ppc64_elf_sectoff_reloc
4ce794b7 43 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 44static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
4ce794b7 45 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 46static bfd_reloc_status_type ppc64_elf_toc_reloc
4ce794b7 47 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 48static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
4ce794b7 49 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 50static bfd_reloc_status_type ppc64_elf_toc64_reloc
4ce794b7 51 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 52static bfd_reloc_status_type ppc64_elf_unhandled_reloc
4ce794b7 53 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
54static bfd_vma opd_entry_value
55 (asection *, bfd_vma, asection **, bfd_vma *);
5bd4f169 56
ad8e1ba5
AM
57#define TARGET_LITTLE_SYM bfd_elf64_powerpcle_vec
58#define TARGET_LITTLE_NAME "elf64-powerpcle"
59#define TARGET_BIG_SYM bfd_elf64_powerpc_vec
60#define TARGET_BIG_NAME "elf64-powerpc"
61#define ELF_ARCH bfd_arch_powerpc
62#define ELF_MACHINE_CODE EM_PPC64
63#define ELF_MAXPAGESIZE 0x10000
64#define elf_info_to_howto ppc64_elf_info_to_howto
65
66#define elf_backend_want_got_sym 0
67#define elf_backend_want_plt_sym 0
68#define elf_backend_plt_alignment 3
69#define elf_backend_plt_not_loaded 1
70#define elf_backend_got_symbol_offset 0
71#define elf_backend_got_header_size 8
ad8e1ba5
AM
72#define elf_backend_can_gc_sections 1
73#define elf_backend_can_refcount 1
74#define elf_backend_rela_normal 1
75
e717da7e 76#define bfd_elf64_mkobject ppc64_elf_mkobject
ad8e1ba5
AM
77#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
78#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
79#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
80#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
81#define bfd_elf64_bfd_link_hash_table_free ppc64_elf_link_hash_table_free
90e3cdf2 82#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
ad8e1ba5
AM
83
84#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
85#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
86#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
ad8e1ba5
AM
87#define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
88#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 89#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
8387904d
AM
90#define elf_backend_check_directives ppc64_elf_check_directives
91#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5
AM
92#define elf_backend_check_relocs ppc64_elf_check_relocs
93#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
94#define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
95#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
96#define elf_backend_hide_symbol ppc64_elf_hide_symbol
97#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
98#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
99#define elf_backend_relocate_section ppc64_elf_relocate_section
100#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
101#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
102#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 103#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
2f89ff8d 104#define elf_backend_special_sections ppc64_elf_special_sections
ad8e1ba5 105
5bd4f169
AM
106/* The name of the dynamic interpreter. This is put in the .interp
107 section. */
108#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
109
110/* The size in bytes of an entry in the procedure linkage table. */
111#define PLT_ENTRY_SIZE 24
112
113/* The initial size of the plt reserved for the dynamic linker. */
5d1634d7 114#define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
5bd4f169
AM
115
116/* TOC base pointers offset from start of TOC. */
411e1bfb
AM
117#define TOC_BASE_OFF 0x8000
118
119/* Offset of tp and dtp pointers from start of TLS block. */
120#define TP_OFFSET 0x7000
121#define DTP_OFFSET 0x8000
5bd4f169 122
ad8e1ba5
AM
123/* .plt call stub instructions. The normal stub is like this, but
124 sometimes the .plt entry crosses a 64k boundary and we need to
125 insert an addis to adjust r12. */
126#define PLT_CALL_STUB_SIZE (7*4)
5d1634d7
AM
127#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
128#define STD_R2_40R1 0xf8410028 /* std %r2,40(%r1) */
129#define LD_R11_0R12 0xe96c0000 /* ld %r11,xxx+0@l(%r12) */
130#define LD_R2_0R12 0xe84c0000 /* ld %r2,xxx+8@l(%r12) */
131#define MTCTR_R11 0x7d6903a6 /* mtctr %r11 */
132 /* ld %r11,xxx+16@l(%r12) */
133#define BCTR 0x4e800420 /* bctr */
134
5d1634d7 135
ad8e1ba5
AM
136#define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
137#define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
138
139#define LD_R2_40R1 0xe8410028 /* ld %r2,40(%r1) */
140
141/* glink call stub instructions. We enter with the index in R0, and the
142 address of glink entry in CTR. From that, we can calculate PLT0. */
143#define GLINK_CALL_STUB_SIZE (16*4)
144#define MFCTR_R12 0x7d8902a6 /* mfctr %r12 */
145#define SLDI_R11_R0_3 0x780b1f24 /* sldi %r11,%r0,3 */
146#define ADDIC_R2_R0_32K 0x34408000 /* addic. %r2,%r0,-32768 */
147#define SUB_R12_R12_R11 0x7d8b6050 /* sub %r12,%r12,%r11 */
148#define SRADI_R2_R2_63 0x7c42fe76 /* sradi %r2,%r2,63 */
149#define SLDI_R11_R0_2 0x780b1764 /* sldi %r11,%r0,2 */
150#define AND_R2_R2_R11 0x7c425838 /* and %r2,%r2,%r11 */
151 /* sub %r12,%r12,%r11 */
152#define ADD_R12_R12_R2 0x7d8c1214 /* add %r12,%r12,%r2 */
153#define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
154 /* ld %r11,xxx@l(%r12) */
155#define ADDI_R12_R12 0x398c0000 /* addi %r12,%r12,xxx@l */
156 /* ld %r2,8(%r12) */
157 /* mtctr %r11 */
158 /* ld %r11,16(%r12) */
159 /* bctr */
5d1634d7
AM
160
161/* Pad with this. */
162#define NOP 0x60000000
163
721956f4
AM
164/* Some other nops. */
165#define CROR_151515 0x4def7b82
166#define CROR_313131 0x4ffffb82
167
cedb70c5 168/* .glink entries for the first 32k functions are two instructions. */
5d1634d7
AM
169#define LI_R0_0 0x38000000 /* li %r0,0 */
170#define B_DOT 0x48000000 /* b . */
171
172/* After that, we need two instructions to load the index, followed by
173 a branch. */
174#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 175#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 176
deb0e272
AM
177/* Instructions used by the save and restore reg functions. */
178#define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
179#define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
180#define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
181#define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
82bd7b59
AM
182#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
183#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
deb0e272
AM
184#define LI_R12_0 0x39800000 /* li %r12,0 */
185#define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
186#define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
187#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
82bd7b59
AM
188#define BLR 0x4e800020 /* blr */
189
41bd81ab
AM
190/* Since .opd is an array of descriptors and each entry will end up
191 with identical R_PPC64_RELATIVE relocs, there is really no need to
192 propagate .opd relocs; The dynamic linker should be taught to
1e2f5b6e 193 relocate .opd without reloc entries. */
41bd81ab
AM
194#ifndef NO_OPD_RELOCS
195#define NO_OPD_RELOCS 0
196#endif
5bd4f169 197\f
f5e87a1d 198#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
b34976b6 199
5bd4f169 200/* Relocation HOWTO's. */
04c9666a 201static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
5bd4f169
AM
202
203static reloc_howto_type ppc64_elf_howto_raw[] = {
204 /* This reloc does nothing. */
205 HOWTO (R_PPC64_NONE, /* type */
206 0, /* rightshift */
411e1bfb
AM
207 2, /* size (0 = byte, 1 = short, 2 = long) */
208 32, /* bitsize */
b34976b6 209 FALSE, /* pc_relative */
5bd4f169 210 0, /* bitpos */
f5e87a1d 211 complain_overflow_dont, /* complain_on_overflow */
5bd4f169
AM
212 bfd_elf_generic_reloc, /* special_function */
213 "R_PPC64_NONE", /* name */
b34976b6 214 FALSE, /* partial_inplace */
d006db6c 215 0, /* src_mask */
5bd4f169 216 0, /* dst_mask */
b34976b6 217 FALSE), /* pcrel_offset */
5bd4f169
AM
218
219 /* A standard 32 bit relocation. */
220 HOWTO (R_PPC64_ADDR32, /* type */
221 0, /* rightshift */
222 2, /* size (0 = byte, 1 = short, 2 = long) */
223 32, /* bitsize */
b34976b6 224 FALSE, /* pc_relative */
5bd4f169
AM
225 0, /* bitpos */
226 complain_overflow_bitfield, /* complain_on_overflow */
227 bfd_elf_generic_reloc, /* special_function */
228 "R_PPC64_ADDR32", /* name */
b34976b6 229 FALSE, /* partial_inplace */
5bd4f169
AM
230 0, /* src_mask */
231 0xffffffff, /* dst_mask */
b34976b6 232 FALSE), /* pcrel_offset */
5bd4f169
AM
233
234 /* An absolute 26 bit branch; the lower two bits must be zero.
235 FIXME: we don't check that, we just clear them. */
236 HOWTO (R_PPC64_ADDR24, /* type */
237 0, /* rightshift */
238 2, /* size (0 = byte, 1 = short, 2 = long) */
239 26, /* bitsize */
b34976b6 240 FALSE, /* pc_relative */
5bd4f169
AM
241 0, /* bitpos */
242 complain_overflow_bitfield, /* complain_on_overflow */
243 bfd_elf_generic_reloc, /* special_function */
244 "R_PPC64_ADDR24", /* name */
b34976b6 245 FALSE, /* partial_inplace */
d006db6c 246 0, /* src_mask */
f5e87a1d 247 0x03fffffc, /* dst_mask */
b34976b6 248 FALSE), /* pcrel_offset */
5bd4f169
AM
249
250 /* A standard 16 bit relocation. */
251 HOWTO (R_PPC64_ADDR16, /* type */
252 0, /* rightshift */
253 1, /* size (0 = byte, 1 = short, 2 = long) */
254 16, /* bitsize */
b34976b6 255 FALSE, /* pc_relative */
5bd4f169
AM
256 0, /* bitpos */
257 complain_overflow_bitfield, /* complain_on_overflow */
258 bfd_elf_generic_reloc, /* special_function */
259 "R_PPC64_ADDR16", /* name */
b34976b6 260 FALSE, /* partial_inplace */
5bd4f169
AM
261 0, /* src_mask */
262 0xffff, /* dst_mask */
b34976b6 263 FALSE), /* pcrel_offset */
5bd4f169
AM
264
265 /* A 16 bit relocation without overflow. */
266 HOWTO (R_PPC64_ADDR16_LO, /* type */
267 0, /* rightshift */
268 1, /* size (0 = byte, 1 = short, 2 = long) */
269 16, /* bitsize */
b34976b6 270 FALSE, /* pc_relative */
5bd4f169
AM
271 0, /* bitpos */
272 complain_overflow_dont,/* complain_on_overflow */
273 bfd_elf_generic_reloc, /* special_function */
274 "R_PPC64_ADDR16_LO", /* name */
b34976b6 275 FALSE, /* partial_inplace */
5bd4f169
AM
276 0, /* src_mask */
277 0xffff, /* dst_mask */
b34976b6 278 FALSE), /* pcrel_offset */
5bd4f169
AM
279
280 /* Bits 16-31 of an address. */
281 HOWTO (R_PPC64_ADDR16_HI, /* type */
282 16, /* rightshift */
283 1, /* size (0 = byte, 1 = short, 2 = long) */
284 16, /* bitsize */
b34976b6 285 FALSE, /* pc_relative */
5bd4f169
AM
286 0, /* bitpos */
287 complain_overflow_dont, /* complain_on_overflow */
288 bfd_elf_generic_reloc, /* special_function */
289 "R_PPC64_ADDR16_HI", /* name */
b34976b6 290 FALSE, /* partial_inplace */
5bd4f169
AM
291 0, /* src_mask */
292 0xffff, /* dst_mask */
b34976b6 293 FALSE), /* pcrel_offset */
5bd4f169
AM
294
295 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
296 bits, treated as a signed number, is negative. */
297 HOWTO (R_PPC64_ADDR16_HA, /* type */
298 16, /* rightshift */
299 1, /* size (0 = byte, 1 = short, 2 = long) */
300 16, /* bitsize */
b34976b6 301 FALSE, /* pc_relative */
5bd4f169
AM
302 0, /* bitpos */
303 complain_overflow_dont, /* complain_on_overflow */
805fc799 304 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 305 "R_PPC64_ADDR16_HA", /* name */
b34976b6 306 FALSE, /* partial_inplace */
5bd4f169
AM
307 0, /* src_mask */
308 0xffff, /* dst_mask */
b34976b6 309 FALSE), /* pcrel_offset */
5bd4f169
AM
310
311 /* An absolute 16 bit branch; the lower two bits must be zero.
312 FIXME: we don't check that, we just clear them. */
313 HOWTO (R_PPC64_ADDR14, /* type */
314 0, /* rightshift */
315 2, /* size (0 = byte, 1 = short, 2 = long) */
316 16, /* bitsize */
b34976b6 317 FALSE, /* pc_relative */
5bd4f169
AM
318 0, /* bitpos */
319 complain_overflow_bitfield, /* complain_on_overflow */
2441e016 320 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 321 "R_PPC64_ADDR14", /* name */
b34976b6 322 FALSE, /* partial_inplace */
d006db6c 323 0, /* src_mask */
f5e87a1d 324 0x0000fffc, /* dst_mask */
b34976b6 325 FALSE), /* pcrel_offset */
5bd4f169
AM
326
327 /* An absolute 16 bit branch, for which bit 10 should be set to
328 indicate that the branch is expected to be taken. The lower two
329 bits must be zero. */
330 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
331 0, /* rightshift */
332 2, /* size (0 = byte, 1 = short, 2 = long) */
333 16, /* bitsize */
b34976b6 334 FALSE, /* pc_relative */
5bd4f169
AM
335 0, /* bitpos */
336 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 337 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 338 "R_PPC64_ADDR14_BRTAKEN",/* name */
b34976b6 339 FALSE, /* partial_inplace */
d006db6c 340 0, /* src_mask */
f5e87a1d 341 0x0000fffc, /* dst_mask */
b34976b6 342 FALSE), /* pcrel_offset */
5bd4f169
AM
343
344 /* An absolute 16 bit branch, for which bit 10 should be set to
345 indicate that the branch is not expected to be taken. The lower
346 two bits must be zero. */
347 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
348 0, /* rightshift */
349 2, /* size (0 = byte, 1 = short, 2 = long) */
350 16, /* bitsize */
b34976b6 351 FALSE, /* pc_relative */
5bd4f169
AM
352 0, /* bitpos */
353 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 354 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 355 "R_PPC64_ADDR14_BRNTAKEN",/* name */
b34976b6 356 FALSE, /* partial_inplace */
d006db6c 357 0, /* src_mask */
f5e87a1d 358 0x0000fffc, /* dst_mask */
b34976b6 359 FALSE), /* pcrel_offset */
5bd4f169
AM
360
361 /* A relative 26 bit branch; the lower two bits must be zero. */
362 HOWTO (R_PPC64_REL24, /* type */
363 0, /* rightshift */
364 2, /* size (0 = byte, 1 = short, 2 = long) */
365 26, /* bitsize */
b34976b6 366 TRUE, /* pc_relative */
5bd4f169
AM
367 0, /* bitpos */
368 complain_overflow_signed, /* complain_on_overflow */
2441e016 369 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 370 "R_PPC64_REL24", /* name */
b34976b6 371 FALSE, /* partial_inplace */
d006db6c 372 0, /* src_mask */
f5e87a1d 373 0x03fffffc, /* dst_mask */
b34976b6 374 TRUE), /* pcrel_offset */
5bd4f169
AM
375
376 /* A relative 16 bit branch; the lower two bits must be zero. */
377 HOWTO (R_PPC64_REL14, /* type */
378 0, /* rightshift */
379 2, /* size (0 = byte, 1 = short, 2 = long) */
380 16, /* bitsize */
b34976b6 381 TRUE, /* pc_relative */
5bd4f169
AM
382 0, /* bitpos */
383 complain_overflow_signed, /* complain_on_overflow */
2441e016 384 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 385 "R_PPC64_REL14", /* name */
b34976b6 386 FALSE, /* partial_inplace */
d006db6c 387 0, /* src_mask */
f5e87a1d 388 0x0000fffc, /* dst_mask */
b34976b6 389 TRUE), /* pcrel_offset */
5bd4f169
AM
390
391 /* A relative 16 bit branch. Bit 10 should be set to indicate that
392 the branch is expected to be taken. The lower two bits must be
393 zero. */
394 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
395 0, /* rightshift */
396 2, /* size (0 = byte, 1 = short, 2 = long) */
397 16, /* bitsize */
b34976b6 398 TRUE, /* pc_relative */
5bd4f169
AM
399 0, /* bitpos */
400 complain_overflow_signed, /* complain_on_overflow */
805fc799 401 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 402 "R_PPC64_REL14_BRTAKEN", /* name */
b34976b6 403 FALSE, /* partial_inplace */
d006db6c 404 0, /* src_mask */
f5e87a1d 405 0x0000fffc, /* dst_mask */
b34976b6 406 TRUE), /* pcrel_offset */
5bd4f169
AM
407
408 /* A relative 16 bit branch. Bit 10 should be set to indicate that
409 the branch is not expected to be taken. The lower two bits must
410 be zero. */
411 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
412 0, /* rightshift */
413 2, /* size (0 = byte, 1 = short, 2 = long) */
414 16, /* bitsize */
b34976b6 415 TRUE, /* pc_relative */
5bd4f169
AM
416 0, /* bitpos */
417 complain_overflow_signed, /* complain_on_overflow */
805fc799 418 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 419 "R_PPC64_REL14_BRNTAKEN",/* name */
b34976b6 420 FALSE, /* partial_inplace */
d006db6c 421 0, /* src_mask */
f5e87a1d 422 0x0000fffc, /* dst_mask */
b34976b6 423 TRUE), /* pcrel_offset */
5bd4f169
AM
424
425 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
426 symbol. */
427 HOWTO (R_PPC64_GOT16, /* type */
428 0, /* rightshift */
429 1, /* size (0 = byte, 1 = short, 2 = long) */
430 16, /* bitsize */
b34976b6 431 FALSE, /* pc_relative */
5bd4f169
AM
432 0, /* bitpos */
433 complain_overflow_signed, /* complain_on_overflow */
805fc799 434 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 435 "R_PPC64_GOT16", /* name */
b34976b6 436 FALSE, /* partial_inplace */
5bd4f169
AM
437 0, /* src_mask */
438 0xffff, /* dst_mask */
b34976b6 439 FALSE), /* pcrel_offset */
5bd4f169
AM
440
441 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
442 the symbol. */
443 HOWTO (R_PPC64_GOT16_LO, /* type */
444 0, /* rightshift */
445 1, /* size (0 = byte, 1 = short, 2 = long) */
446 16, /* bitsize */
b34976b6 447 FALSE, /* pc_relative */
5bd4f169
AM
448 0, /* bitpos */
449 complain_overflow_dont, /* complain_on_overflow */
805fc799 450 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 451 "R_PPC64_GOT16_LO", /* name */
b34976b6 452 FALSE, /* partial_inplace */
5bd4f169
AM
453 0, /* src_mask */
454 0xffff, /* dst_mask */
b34976b6 455 FALSE), /* pcrel_offset */
5bd4f169
AM
456
457 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
458 the symbol. */
459 HOWTO (R_PPC64_GOT16_HI, /* type */
460 16, /* rightshift */
461 1, /* size (0 = byte, 1 = short, 2 = long) */
462 16, /* bitsize */
b34976b6 463 FALSE, /* pc_relative */
5bd4f169
AM
464 0, /* bitpos */
465 complain_overflow_dont,/* complain_on_overflow */
805fc799 466 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 467 "R_PPC64_GOT16_HI", /* name */
b34976b6 468 FALSE, /* partial_inplace */
5bd4f169
AM
469 0, /* src_mask */
470 0xffff, /* dst_mask */
b34976b6 471 FALSE), /* pcrel_offset */
5bd4f169
AM
472
473 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
474 the symbol. */
475 HOWTO (R_PPC64_GOT16_HA, /* type */
476 16, /* rightshift */
477 1, /* size (0 = byte, 1 = short, 2 = long) */
478 16, /* bitsize */
b34976b6 479 FALSE, /* pc_relative */
5bd4f169
AM
480 0, /* bitpos */
481 complain_overflow_dont,/* complain_on_overflow */
805fc799 482 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 483 "R_PPC64_GOT16_HA", /* name */
b34976b6 484 FALSE, /* partial_inplace */
5bd4f169
AM
485 0, /* src_mask */
486 0xffff, /* dst_mask */
b34976b6 487 FALSE), /* pcrel_offset */
5bd4f169
AM
488
489 /* This is used only by the dynamic linker. The symbol should exist
490 both in the object being run and in some shared library. The
491 dynamic linker copies the data addressed by the symbol from the
492 shared library into the object, because the object being
493 run has to have the data at some particular address. */
494 HOWTO (R_PPC64_COPY, /* type */
495 0, /* rightshift */
f5e87a1d
AM
496 0, /* this one is variable size */
497 0, /* bitsize */
b34976b6 498 FALSE, /* pc_relative */
5bd4f169 499 0, /* bitpos */
f5e87a1d
AM
500 complain_overflow_dont, /* complain_on_overflow */
501 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 502 "R_PPC64_COPY", /* name */
b34976b6 503 FALSE, /* partial_inplace */
5bd4f169
AM
504 0, /* src_mask */
505 0, /* dst_mask */
b34976b6 506 FALSE), /* pcrel_offset */
5bd4f169
AM
507
508 /* Like R_PPC64_ADDR64, but used when setting global offset table
509 entries. */
510 HOWTO (R_PPC64_GLOB_DAT, /* type */
511 0, /* rightshift */
512 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
513 64, /* bitsize */
b34976b6 514 FALSE, /* pc_relative */
5bd4f169
AM
515 0, /* bitpos */
516 complain_overflow_dont, /* complain_on_overflow */
805fc799 517 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 518 "R_PPC64_GLOB_DAT", /* name */
b34976b6 519 FALSE, /* partial_inplace */
5bd4f169 520 0, /* src_mask */
f5e87a1d 521 ONES (64), /* dst_mask */
b34976b6 522 FALSE), /* pcrel_offset */
5bd4f169
AM
523
524 /* Created by the link editor. Marks a procedure linkage table
525 entry for a symbol. */
526 HOWTO (R_PPC64_JMP_SLOT, /* type */
527 0, /* rightshift */
528 0, /* size (0 = byte, 1 = short, 2 = long) */
529 0, /* bitsize */
b34976b6 530 FALSE, /* pc_relative */
5bd4f169
AM
531 0, /* bitpos */
532 complain_overflow_dont, /* complain_on_overflow */
805fc799 533 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 534 "R_PPC64_JMP_SLOT", /* name */
b34976b6 535 FALSE, /* partial_inplace */
5bd4f169
AM
536 0, /* src_mask */
537 0, /* dst_mask */
b34976b6 538 FALSE), /* pcrel_offset */
5bd4f169
AM
539
540 /* Used only by the dynamic linker. When the object is run, this
541 doubleword64 is set to the load address of the object, plus the
542 addend. */
543 HOWTO (R_PPC64_RELATIVE, /* type */
544 0, /* rightshift */
545 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
546 64, /* bitsize */
b34976b6 547 FALSE, /* pc_relative */
5bd4f169
AM
548 0, /* bitpos */
549 complain_overflow_dont, /* complain_on_overflow */
550 bfd_elf_generic_reloc, /* special_function */
551 "R_PPC64_RELATIVE", /* name */
b34976b6 552 FALSE, /* partial_inplace */
5bd4f169 553 0, /* src_mask */
f5e87a1d 554 ONES (64), /* dst_mask */
b34976b6 555 FALSE), /* pcrel_offset */
5bd4f169
AM
556
557 /* Like R_PPC64_ADDR32, but may be unaligned. */
558 HOWTO (R_PPC64_UADDR32, /* type */
559 0, /* rightshift */
560 2, /* size (0 = byte, 1 = short, 2 = long) */
561 32, /* bitsize */
b34976b6 562 FALSE, /* pc_relative */
5bd4f169
AM
563 0, /* bitpos */
564 complain_overflow_bitfield, /* complain_on_overflow */
565 bfd_elf_generic_reloc, /* special_function */
566 "R_PPC64_UADDR32", /* name */
b34976b6 567 FALSE, /* partial_inplace */
5bd4f169
AM
568 0, /* src_mask */
569 0xffffffff, /* dst_mask */
b34976b6 570 FALSE), /* pcrel_offset */
5bd4f169
AM
571
572 /* Like R_PPC64_ADDR16, but may be unaligned. */
573 HOWTO (R_PPC64_UADDR16, /* type */
574 0, /* rightshift */
575 1, /* size (0 = byte, 1 = short, 2 = long) */
576 16, /* bitsize */
b34976b6 577 FALSE, /* pc_relative */
5bd4f169
AM
578 0, /* bitpos */
579 complain_overflow_bitfield, /* complain_on_overflow */
580 bfd_elf_generic_reloc, /* special_function */
581 "R_PPC64_UADDR16", /* name */
b34976b6 582 FALSE, /* partial_inplace */
5bd4f169
AM
583 0, /* src_mask */
584 0xffff, /* dst_mask */
b34976b6 585 FALSE), /* pcrel_offset */
5bd4f169
AM
586
587 /* 32-bit PC relative. */
588 HOWTO (R_PPC64_REL32, /* type */
589 0, /* rightshift */
590 2, /* size (0 = byte, 1 = short, 2 = long) */
591 32, /* bitsize */
b34976b6 592 TRUE, /* pc_relative */
5bd4f169 593 0, /* bitpos */
cedb70c5 594 /* FIXME: Verify. Was complain_overflow_bitfield. */
5bd4f169
AM
595 complain_overflow_signed, /* complain_on_overflow */
596 bfd_elf_generic_reloc, /* special_function */
597 "R_PPC64_REL32", /* name */
b34976b6 598 FALSE, /* partial_inplace */
5bd4f169
AM
599 0, /* src_mask */
600 0xffffffff, /* dst_mask */
b34976b6 601 TRUE), /* pcrel_offset */
5bd4f169 602
10ed1bba 603 /* 32-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
604 HOWTO (R_PPC64_PLT32, /* type */
605 0, /* rightshift */
606 2, /* size (0 = byte, 1 = short, 2 = long) */
607 32, /* bitsize */
b34976b6 608 FALSE, /* pc_relative */
5bd4f169
AM
609 0, /* bitpos */
610 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 611 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 612 "R_PPC64_PLT32", /* name */
b34976b6 613 FALSE, /* partial_inplace */
5bd4f169 614 0, /* src_mask */
f5e87a1d 615 0xffffffff, /* dst_mask */
b34976b6 616 FALSE), /* pcrel_offset */
5bd4f169
AM
617
618 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
619 FIXME: R_PPC64_PLTREL32 not supported. */
620 HOWTO (R_PPC64_PLTREL32, /* type */
621 0, /* rightshift */
622 2, /* size (0 = byte, 1 = short, 2 = long) */
623 32, /* bitsize */
b34976b6 624 TRUE, /* pc_relative */
5bd4f169
AM
625 0, /* bitpos */
626 complain_overflow_signed, /* complain_on_overflow */
627 bfd_elf_generic_reloc, /* special_function */
628 "R_PPC64_PLTREL32", /* name */
b34976b6 629 FALSE, /* partial_inplace */
5bd4f169 630 0, /* src_mask */
f5e87a1d 631 0xffffffff, /* dst_mask */
b34976b6 632 TRUE), /* pcrel_offset */
5bd4f169
AM
633
634 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
635 the symbol. */
636 HOWTO (R_PPC64_PLT16_LO, /* type */
637 0, /* rightshift */
638 1, /* size (0 = byte, 1 = short, 2 = long) */
639 16, /* bitsize */
b34976b6 640 FALSE, /* pc_relative */
5bd4f169
AM
641 0, /* bitpos */
642 complain_overflow_dont, /* complain_on_overflow */
805fc799 643 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 644 "R_PPC64_PLT16_LO", /* name */
b34976b6 645 FALSE, /* partial_inplace */
5bd4f169
AM
646 0, /* src_mask */
647 0xffff, /* dst_mask */
b34976b6 648 FALSE), /* pcrel_offset */
5bd4f169
AM
649
650 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
651 the symbol. */
652 HOWTO (R_PPC64_PLT16_HI, /* type */
653 16, /* rightshift */
654 1, /* size (0 = byte, 1 = short, 2 = long) */
655 16, /* bitsize */
b34976b6 656 FALSE, /* pc_relative */
5bd4f169
AM
657 0, /* bitpos */
658 complain_overflow_dont, /* complain_on_overflow */
805fc799 659 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 660 "R_PPC64_PLT16_HI", /* name */
b34976b6 661 FALSE, /* partial_inplace */
5bd4f169
AM
662 0, /* src_mask */
663 0xffff, /* dst_mask */
b34976b6 664 FALSE), /* pcrel_offset */
5bd4f169
AM
665
666 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
667 the symbol. */
668 HOWTO (R_PPC64_PLT16_HA, /* type */
669 16, /* rightshift */
670 1, /* size (0 = byte, 1 = short, 2 = long) */
671 16, /* bitsize */
b34976b6 672 FALSE, /* pc_relative */
5bd4f169
AM
673 0, /* bitpos */
674 complain_overflow_dont, /* complain_on_overflow */
805fc799 675 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 676 "R_PPC64_PLT16_HA", /* name */
b34976b6 677 FALSE, /* partial_inplace */
5bd4f169
AM
678 0, /* src_mask */
679 0xffff, /* dst_mask */
b34976b6 680 FALSE), /* pcrel_offset */
5bd4f169 681
c061c2d8 682 /* 16-bit section relative relocation. */
5bd4f169
AM
683 HOWTO (R_PPC64_SECTOFF, /* type */
684 0, /* rightshift */
c061c2d8
AM
685 1, /* size (0 = byte, 1 = short, 2 = long) */
686 16, /* bitsize */
b34976b6 687 FALSE, /* pc_relative */
5bd4f169
AM
688 0, /* bitpos */
689 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 690 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 691 "R_PPC64_SECTOFF", /* name */
b34976b6 692 FALSE, /* partial_inplace */
5bd4f169 693 0, /* src_mask */
c061c2d8 694 0xffff, /* dst_mask */
b34976b6 695 FALSE), /* pcrel_offset */
5bd4f169 696
c061c2d8 697 /* Like R_PPC64_SECTOFF, but no overflow warning. */
5bd4f169
AM
698 HOWTO (R_PPC64_SECTOFF_LO, /* type */
699 0, /* rightshift */
700 1, /* size (0 = byte, 1 = short, 2 = long) */
701 16, /* bitsize */
b34976b6 702 FALSE, /* pc_relative */
5bd4f169
AM
703 0, /* bitpos */
704 complain_overflow_dont, /* complain_on_overflow */
805fc799 705 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 706 "R_PPC64_SECTOFF_LO", /* name */
b34976b6 707 FALSE, /* partial_inplace */
5bd4f169
AM
708 0, /* src_mask */
709 0xffff, /* dst_mask */
b34976b6 710 FALSE), /* pcrel_offset */
5bd4f169
AM
711
712 /* 16-bit upper half section relative relocation. */
713 HOWTO (R_PPC64_SECTOFF_HI, /* type */
714 16, /* rightshift */
715 1, /* size (0 = byte, 1 = short, 2 = long) */
716 16, /* bitsize */
b34976b6 717 FALSE, /* pc_relative */
5bd4f169
AM
718 0, /* bitpos */
719 complain_overflow_dont, /* complain_on_overflow */
805fc799 720 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 721 "R_PPC64_SECTOFF_HI", /* name */
b34976b6 722 FALSE, /* partial_inplace */
5bd4f169
AM
723 0, /* src_mask */
724 0xffff, /* dst_mask */
b34976b6 725 FALSE), /* pcrel_offset */
5bd4f169
AM
726
727 /* 16-bit upper half adjusted section relative relocation. */
728 HOWTO (R_PPC64_SECTOFF_HA, /* type */
729 16, /* rightshift */
730 1, /* size (0 = byte, 1 = short, 2 = long) */
731 16, /* bitsize */
b34976b6 732 FALSE, /* pc_relative */
5bd4f169
AM
733 0, /* bitpos */
734 complain_overflow_dont, /* complain_on_overflow */
805fc799 735 ppc64_elf_sectoff_ha_reloc, /* special_function */
5bd4f169 736 "R_PPC64_SECTOFF_HA", /* name */
b34976b6 737 FALSE, /* partial_inplace */
5bd4f169
AM
738 0, /* src_mask */
739 0xffff, /* dst_mask */
b34976b6 740 FALSE), /* pcrel_offset */
5bd4f169 741
04c9666a
AM
742 /* Like R_PPC64_REL24 without touching the two least significant bits. */
743 HOWTO (R_PPC64_REL30, /* type */
5bd4f169
AM
744 2, /* rightshift */
745 2, /* size (0 = byte, 1 = short, 2 = long) */
746 30, /* bitsize */
b34976b6 747 TRUE, /* pc_relative */
5bd4f169
AM
748 0, /* bitpos */
749 complain_overflow_dont, /* complain_on_overflow */
750 bfd_elf_generic_reloc, /* special_function */
04c9666a 751 "R_PPC64_REL30", /* name */
b34976b6 752 FALSE, /* partial_inplace */
d006db6c 753 0, /* src_mask */
5bd4f169 754 0xfffffffc, /* dst_mask */
b34976b6 755 TRUE), /* pcrel_offset */
5bd4f169
AM
756
757 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
758
759 /* A standard 64-bit relocation. */
760 HOWTO (R_PPC64_ADDR64, /* type */
761 0, /* rightshift */
762 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
763 64, /* bitsize */
b34976b6 764 FALSE, /* pc_relative */
5bd4f169
AM
765 0, /* bitpos */
766 complain_overflow_dont, /* complain_on_overflow */
767 bfd_elf_generic_reloc, /* special_function */
768 "R_PPC64_ADDR64", /* name */
b34976b6 769 FALSE, /* partial_inplace */
5bd4f169 770 0, /* src_mask */
f5e87a1d 771 ONES (64), /* dst_mask */
b34976b6 772 FALSE), /* pcrel_offset */
5bd4f169
AM
773
774 /* The bits 32-47 of an address. */
775 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
776 32, /* rightshift */
777 1, /* size (0 = byte, 1 = short, 2 = long) */
778 16, /* bitsize */
b34976b6 779 FALSE, /* pc_relative */
5bd4f169
AM
780 0, /* bitpos */
781 complain_overflow_dont, /* complain_on_overflow */
782 bfd_elf_generic_reloc, /* special_function */
783 "R_PPC64_ADDR16_HIGHER", /* name */
b34976b6 784 FALSE, /* partial_inplace */
5bd4f169
AM
785 0, /* src_mask */
786 0xffff, /* dst_mask */
b34976b6 787 FALSE), /* pcrel_offset */
5bd4f169
AM
788
789 /* The bits 32-47 of an address, plus 1 if the contents of the low
790 16 bits, treated as a signed number, is negative. */
791 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
792 32, /* rightshift */
793 1, /* size (0 = byte, 1 = short, 2 = long) */
794 16, /* bitsize */
b34976b6 795 FALSE, /* pc_relative */
5bd4f169
AM
796 0, /* bitpos */
797 complain_overflow_dont, /* complain_on_overflow */
805fc799 798 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 799 "R_PPC64_ADDR16_HIGHERA", /* name */
b34976b6 800 FALSE, /* partial_inplace */
5bd4f169
AM
801 0, /* src_mask */
802 0xffff, /* dst_mask */
b34976b6 803 FALSE), /* pcrel_offset */
5bd4f169
AM
804
805 /* The bits 48-63 of an address. */
806 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
807 48, /* rightshift */
808 1, /* size (0 = byte, 1 = short, 2 = long) */
809 16, /* bitsize */
b34976b6 810 FALSE, /* pc_relative */
5bd4f169
AM
811 0, /* bitpos */
812 complain_overflow_dont, /* complain_on_overflow */
813 bfd_elf_generic_reloc, /* special_function */
814 "R_PPC64_ADDR16_HIGHEST", /* name */
b34976b6 815 FALSE, /* partial_inplace */
5bd4f169
AM
816 0, /* src_mask */
817 0xffff, /* dst_mask */
b34976b6 818 FALSE), /* pcrel_offset */
5bd4f169
AM
819
820 /* The bits 48-63 of an address, plus 1 if the contents of the low
821 16 bits, treated as a signed number, is negative. */
822 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
823 48, /* rightshift */
824 1, /* size (0 = byte, 1 = short, 2 = long) */
825 16, /* bitsize */
b34976b6 826 FALSE, /* pc_relative */
5bd4f169
AM
827 0, /* bitpos */
828 complain_overflow_dont, /* complain_on_overflow */
805fc799 829 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 830 "R_PPC64_ADDR16_HIGHESTA", /* name */
b34976b6 831 FALSE, /* partial_inplace */
5bd4f169
AM
832 0, /* src_mask */
833 0xffff, /* dst_mask */
b34976b6 834 FALSE), /* pcrel_offset */
5bd4f169
AM
835
836 /* Like ADDR64, but may be unaligned. */
837 HOWTO (R_PPC64_UADDR64, /* type */
838 0, /* rightshift */
839 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
840 64, /* bitsize */
b34976b6 841 FALSE, /* pc_relative */
5bd4f169
AM
842 0, /* bitpos */
843 complain_overflow_dont, /* complain_on_overflow */
844 bfd_elf_generic_reloc, /* special_function */
845 "R_PPC64_UADDR64", /* name */
b34976b6 846 FALSE, /* partial_inplace */
5bd4f169 847 0, /* src_mask */
f5e87a1d 848 ONES (64), /* dst_mask */
b34976b6 849 FALSE), /* pcrel_offset */
5bd4f169
AM
850
851 /* 64-bit relative relocation. */
852 HOWTO (R_PPC64_REL64, /* type */
853 0, /* rightshift */
854 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
855 64, /* bitsize */
b34976b6 856 TRUE, /* pc_relative */
5bd4f169
AM
857 0, /* bitpos */
858 complain_overflow_dont, /* complain_on_overflow */
859 bfd_elf_generic_reloc, /* special_function */
860 "R_PPC64_REL64", /* name */
b34976b6 861 FALSE, /* partial_inplace */
5bd4f169 862 0, /* src_mask */
f5e87a1d 863 ONES (64), /* dst_mask */
b34976b6 864 TRUE), /* pcrel_offset */
5bd4f169 865
cedb70c5 866 /* 64-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
867 HOWTO (R_PPC64_PLT64, /* type */
868 0, /* rightshift */
869 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
870 64, /* bitsize */
b34976b6 871 FALSE, /* pc_relative */
5bd4f169
AM
872 0, /* bitpos */
873 complain_overflow_dont, /* complain_on_overflow */
805fc799 874 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 875 "R_PPC64_PLT64", /* name */
b34976b6 876 FALSE, /* partial_inplace */
5bd4f169 877 0, /* src_mask */
f5e87a1d 878 ONES (64), /* dst_mask */
b34976b6 879 FALSE), /* pcrel_offset */
5bd4f169
AM
880
881 /* 64-bit PC relative relocation to the symbol's procedure linkage
882 table. */
883 /* FIXME: R_PPC64_PLTREL64 not supported. */
884 HOWTO (R_PPC64_PLTREL64, /* type */
885 0, /* rightshift */
886 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
887 64, /* bitsize */
b34976b6 888 TRUE, /* pc_relative */
5bd4f169
AM
889 0, /* bitpos */
890 complain_overflow_dont, /* complain_on_overflow */
805fc799 891 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 892 "R_PPC64_PLTREL64", /* name */
b34976b6 893 FALSE, /* partial_inplace */
5bd4f169 894 0, /* src_mask */
f5e87a1d 895 ONES (64), /* dst_mask */
b34976b6 896 TRUE), /* pcrel_offset */
5bd4f169
AM
897
898 /* 16 bit TOC-relative relocation. */
899
900 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
901 HOWTO (R_PPC64_TOC16, /* type */
902 0, /* rightshift */
903 1, /* size (0 = byte, 1 = short, 2 = long) */
904 16, /* bitsize */
b34976b6 905 FALSE, /* pc_relative */
5bd4f169
AM
906 0, /* bitpos */
907 complain_overflow_signed, /* complain_on_overflow */
805fc799 908 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 909 "R_PPC64_TOC16", /* name */
b34976b6 910 FALSE, /* partial_inplace */
5bd4f169
AM
911 0, /* src_mask */
912 0xffff, /* dst_mask */
b34976b6 913 FALSE), /* pcrel_offset */
5bd4f169
AM
914
915 /* 16 bit TOC-relative relocation without overflow. */
916
917 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
918 HOWTO (R_PPC64_TOC16_LO, /* type */
919 0, /* rightshift */
920 1, /* size (0 = byte, 1 = short, 2 = long) */
921 16, /* bitsize */
b34976b6 922 FALSE, /* pc_relative */
5bd4f169
AM
923 0, /* bitpos */
924 complain_overflow_dont, /* complain_on_overflow */
805fc799 925 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 926 "R_PPC64_TOC16_LO", /* name */
b34976b6 927 FALSE, /* partial_inplace */
5bd4f169
AM
928 0, /* src_mask */
929 0xffff, /* dst_mask */
b34976b6 930 FALSE), /* pcrel_offset */
5bd4f169
AM
931
932 /* 16 bit TOC-relative relocation, high 16 bits. */
933
934 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
935 HOWTO (R_PPC64_TOC16_HI, /* type */
936 16, /* rightshift */
937 1, /* size (0 = byte, 1 = short, 2 = long) */
938 16, /* bitsize */
b34976b6 939 FALSE, /* pc_relative */
5bd4f169
AM
940 0, /* bitpos */
941 complain_overflow_dont, /* complain_on_overflow */
805fc799 942 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 943 "R_PPC64_TOC16_HI", /* name */
b34976b6 944 FALSE, /* partial_inplace */
5bd4f169
AM
945 0, /* src_mask */
946 0xffff, /* dst_mask */
b34976b6 947 FALSE), /* pcrel_offset */
5bd4f169
AM
948
949 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
950 contents of the low 16 bits, treated as a signed number, is
951 negative. */
952
953 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
954 HOWTO (R_PPC64_TOC16_HA, /* type */
955 16, /* rightshift */
956 1, /* size (0 = byte, 1 = short, 2 = long) */
957 16, /* bitsize */
b34976b6 958 FALSE, /* pc_relative */
5bd4f169
AM
959 0, /* bitpos */
960 complain_overflow_dont, /* complain_on_overflow */
805fc799 961 ppc64_elf_toc_ha_reloc, /* special_function */
5bd4f169 962 "R_PPC64_TOC16_HA", /* name */
b34976b6 963 FALSE, /* partial_inplace */
5bd4f169
AM
964 0, /* src_mask */
965 0xffff, /* dst_mask */
b34976b6 966 FALSE), /* pcrel_offset */
5bd4f169
AM
967
968 /* 64-bit relocation; insert value of TOC base (.TOC.). */
969
970 /* R_PPC64_TOC 51 doubleword64 .TOC. */
971 HOWTO (R_PPC64_TOC, /* type */
972 0, /* rightshift */
973 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
974 64, /* bitsize */
b34976b6 975 FALSE, /* pc_relative */
5bd4f169
AM
976 0, /* bitpos */
977 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 978 ppc64_elf_toc64_reloc, /* special_function */
5bd4f169 979 "R_PPC64_TOC", /* name */
b34976b6 980 FALSE, /* partial_inplace */
5bd4f169 981 0, /* src_mask */
f5e87a1d 982 ONES (64), /* dst_mask */
b34976b6 983 FALSE), /* pcrel_offset */
5bd4f169
AM
984
985 /* Like R_PPC64_GOT16, but also informs the link editor that the
986 value to relocate may (!) refer to a PLT entry which the link
987 editor (a) may replace with the symbol value. If the link editor
988 is unable to fully resolve the symbol, it may (b) create a PLT
989 entry and store the address to the new PLT entry in the GOT.
990 This permits lazy resolution of function symbols at run time.
991 The link editor may also skip all of this and just (c) emit a
992 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
993 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
994 HOWTO (R_PPC64_PLTGOT16, /* type */
995 0, /* rightshift */
996 1, /* size (0 = byte, 1 = short, 2 = long) */
997 16, /* bitsize */
b34976b6 998 FALSE, /* pc_relative */
5bd4f169
AM
999 0, /* bitpos */
1000 complain_overflow_signed, /* complain_on_overflow */
805fc799 1001 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb
AM
1002 "R_PPC64_PLTGOT16", /* name */
1003 FALSE, /* partial_inplace */
1004 0, /* src_mask */
1005 0xffff, /* dst_mask */
1006 FALSE), /* pcrel_offset */
1007
1008 /* Like R_PPC64_PLTGOT16, but without overflow. */
1009 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1010 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1011 0, /* rightshift */
1012 1, /* size (0 = byte, 1 = short, 2 = long) */
1013 16, /* bitsize */
1014 FALSE, /* pc_relative */
1015 0, /* bitpos */
1016 complain_overflow_dont, /* complain_on_overflow */
1017 ppc64_elf_unhandled_reloc, /* special_function */
1018 "R_PPC64_PLTGOT16_LO", /* name */
1019 FALSE, /* partial_inplace */
1020 0, /* src_mask */
1021 0xffff, /* dst_mask */
1022 FALSE), /* pcrel_offset */
1023
1024 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1025 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1026 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1027 16, /* rightshift */
1028 1, /* size (0 = byte, 1 = short, 2 = long) */
1029 16, /* bitsize */
1030 FALSE, /* pc_relative */
1031 0, /* bitpos */
1032 complain_overflow_dont, /* complain_on_overflow */
1033 ppc64_elf_unhandled_reloc, /* special_function */
1034 "R_PPC64_PLTGOT16_HI", /* name */
1035 FALSE, /* partial_inplace */
1036 0, /* src_mask */
1037 0xffff, /* dst_mask */
1038 FALSE), /* pcrel_offset */
1039
1040 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1041 1 if the contents of the low 16 bits, treated as a signed number,
1042 is negative. */
1043 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1044 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1045 16, /* rightshift */
1046 1, /* size (0 = byte, 1 = short, 2 = long) */
1047 16, /* bitsize */
1048 FALSE, /* pc_relative */
1049 0, /* bitpos */
1050 complain_overflow_dont,/* complain_on_overflow */
1051 ppc64_elf_unhandled_reloc, /* special_function */
1052 "R_PPC64_PLTGOT16_HA", /* name */
1053 FALSE, /* partial_inplace */
1054 0, /* src_mask */
1055 0xffff, /* dst_mask */
1056 FALSE), /* pcrel_offset */
1057
1058 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1059 HOWTO (R_PPC64_ADDR16_DS, /* type */
1060 0, /* rightshift */
1061 1, /* size (0 = byte, 1 = short, 2 = long) */
1062 16, /* bitsize */
1063 FALSE, /* pc_relative */
1064 0, /* bitpos */
1065 complain_overflow_bitfield, /* complain_on_overflow */
1066 bfd_elf_generic_reloc, /* special_function */
1067 "R_PPC64_ADDR16_DS", /* name */
1068 FALSE, /* partial_inplace */
1069 0, /* src_mask */
1070 0xfffc, /* dst_mask */
1071 FALSE), /* pcrel_offset */
1072
1073 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1074 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1075 0, /* rightshift */
1076 1, /* size (0 = byte, 1 = short, 2 = long) */
1077 16, /* bitsize */
1078 FALSE, /* pc_relative */
1079 0, /* bitpos */
1080 complain_overflow_dont,/* complain_on_overflow */
1081 bfd_elf_generic_reloc, /* special_function */
1082 "R_PPC64_ADDR16_LO_DS",/* name */
1083 FALSE, /* partial_inplace */
1084 0, /* src_mask */
1085 0xfffc, /* dst_mask */
1086 FALSE), /* pcrel_offset */
1087
1088 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1089 HOWTO (R_PPC64_GOT16_DS, /* type */
1090 0, /* rightshift */
1091 1, /* size (0 = byte, 1 = short, 2 = long) */
1092 16, /* bitsize */
1093 FALSE, /* pc_relative */
1094 0, /* bitpos */
1095 complain_overflow_signed, /* complain_on_overflow */
1096 ppc64_elf_unhandled_reloc, /* special_function */
1097 "R_PPC64_GOT16_DS", /* name */
1098 FALSE, /* partial_inplace */
1099 0, /* src_mask */
1100 0xfffc, /* dst_mask */
1101 FALSE), /* pcrel_offset */
1102
1103 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1104 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1105 0, /* rightshift */
1106 1, /* size (0 = byte, 1 = short, 2 = long) */
1107 16, /* bitsize */
1108 FALSE, /* pc_relative */
1109 0, /* bitpos */
1110 complain_overflow_dont, /* complain_on_overflow */
1111 ppc64_elf_unhandled_reloc, /* special_function */
1112 "R_PPC64_GOT16_LO_DS", /* name */
1113 FALSE, /* partial_inplace */
1114 0, /* src_mask */
1115 0xfffc, /* dst_mask */
1116 FALSE), /* pcrel_offset */
1117
1118 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1119 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1120 0, /* rightshift */
1121 1, /* size (0 = byte, 1 = short, 2 = long) */
1122 16, /* bitsize */
1123 FALSE, /* pc_relative */
1124 0, /* bitpos */
1125 complain_overflow_dont, /* complain_on_overflow */
1126 ppc64_elf_unhandled_reloc, /* special_function */
1127 "R_PPC64_PLT16_LO_DS", /* name */
1128 FALSE, /* partial_inplace */
1129 0, /* src_mask */
1130 0xfffc, /* dst_mask */
1131 FALSE), /* pcrel_offset */
1132
1133 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1134 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1135 0, /* rightshift */
1136 1, /* size (0 = byte, 1 = short, 2 = long) */
1137 16, /* bitsize */
1138 FALSE, /* pc_relative */
1139 0, /* bitpos */
1140 complain_overflow_bitfield, /* complain_on_overflow */
1141 ppc64_elf_sectoff_reloc, /* special_function */
1142 "R_PPC64_SECTOFF_DS", /* name */
1143 FALSE, /* partial_inplace */
1144 0, /* src_mask */
1145 0xfffc, /* dst_mask */
1146 FALSE), /* pcrel_offset */
1147
1148 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1149 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1150 0, /* rightshift */
1151 1, /* size (0 = byte, 1 = short, 2 = long) */
1152 16, /* bitsize */
1153 FALSE, /* pc_relative */
1154 0, /* bitpos */
1155 complain_overflow_dont, /* complain_on_overflow */
1156 ppc64_elf_sectoff_reloc, /* special_function */
1157 "R_PPC64_SECTOFF_LO_DS",/* name */
1158 FALSE, /* partial_inplace */
1159 0, /* src_mask */
1160 0xfffc, /* dst_mask */
1161 FALSE), /* pcrel_offset */
1162
1163 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1164 HOWTO (R_PPC64_TOC16_DS, /* type */
1165 0, /* rightshift */
1166 1, /* size (0 = byte, 1 = short, 2 = long) */
1167 16, /* bitsize */
1168 FALSE, /* pc_relative */
1169 0, /* bitpos */
1170 complain_overflow_signed, /* complain_on_overflow */
1171 ppc64_elf_toc_reloc, /* special_function */
1172 "R_PPC64_TOC16_DS", /* name */
1173 FALSE, /* partial_inplace */
1174 0, /* src_mask */
1175 0xfffc, /* dst_mask */
1176 FALSE), /* pcrel_offset */
1177
1178 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1179 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1180 0, /* rightshift */
1181 1, /* size (0 = byte, 1 = short, 2 = long) */
1182 16, /* bitsize */
1183 FALSE, /* pc_relative */
1184 0, /* bitpos */
1185 complain_overflow_dont, /* complain_on_overflow */
1186 ppc64_elf_toc_reloc, /* special_function */
1187 "R_PPC64_TOC16_LO_DS", /* name */
1188 FALSE, /* partial_inplace */
1189 0, /* src_mask */
1190 0xfffc, /* dst_mask */
1191 FALSE), /* pcrel_offset */
1192
1193 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1194 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1195 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1196 0, /* rightshift */
1197 1, /* size (0 = byte, 1 = short, 2 = long) */
1198 16, /* bitsize */
1199 FALSE, /* pc_relative */
1200 0, /* bitpos */
1201 complain_overflow_signed, /* complain_on_overflow */
1202 ppc64_elf_unhandled_reloc, /* special_function */
1203 "R_PPC64_PLTGOT16_DS", /* name */
1204 FALSE, /* partial_inplace */
1205 0, /* src_mask */
1206 0xfffc, /* dst_mask */
1207 FALSE), /* pcrel_offset */
1208
1209 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1210 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1211 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1212 0, /* rightshift */
1213 1, /* size (0 = byte, 1 = short, 2 = long) */
1214 16, /* bitsize */
1215 FALSE, /* pc_relative */
1216 0, /* bitpos */
1217 complain_overflow_dont, /* complain_on_overflow */
1218 ppc64_elf_unhandled_reloc, /* special_function */
1219 "R_PPC64_PLTGOT16_LO_DS",/* name */
1220 FALSE, /* partial_inplace */
1221 0, /* src_mask */
1222 0xfffc, /* dst_mask */
1223 FALSE), /* pcrel_offset */
1224
1225 /* Marker reloc for TLS. */
1226 HOWTO (R_PPC64_TLS,
1227 0, /* rightshift */
1228 2, /* size (0 = byte, 1 = short, 2 = long) */
1229 32, /* bitsize */
1230 FALSE, /* pc_relative */
1231 0, /* bitpos */
1232 complain_overflow_dont, /* complain_on_overflow */
1233 bfd_elf_generic_reloc, /* special_function */
1234 "R_PPC64_TLS", /* name */
1235 FALSE, /* partial_inplace */
1236 0, /* src_mask */
1237 0, /* dst_mask */
1238 FALSE), /* pcrel_offset */
1239
1240 /* Computes the load module index of the load module that contains the
1241 definition of its TLS sym. */
1242 HOWTO (R_PPC64_DTPMOD64,
1243 0, /* rightshift */
1244 4, /* size (0 = byte, 1 = short, 2 = long) */
1245 64, /* bitsize */
1246 FALSE, /* pc_relative */
1247 0, /* bitpos */
1248 complain_overflow_dont, /* complain_on_overflow */
1249 ppc64_elf_unhandled_reloc, /* special_function */
1250 "R_PPC64_DTPMOD64", /* name */
1251 FALSE, /* partial_inplace */
1252 0, /* src_mask */
1253 ONES (64), /* dst_mask */
1254 FALSE), /* pcrel_offset */
1255
1256 /* Computes a dtv-relative displacement, the difference between the value
1257 of sym+add and the base address of the thread-local storage block that
1258 contains the definition of sym, minus 0x8000. */
1259 HOWTO (R_PPC64_DTPREL64,
1260 0, /* rightshift */
1261 4, /* size (0 = byte, 1 = short, 2 = long) */
1262 64, /* bitsize */
1263 FALSE, /* pc_relative */
1264 0, /* bitpos */
1265 complain_overflow_dont, /* complain_on_overflow */
1266 ppc64_elf_unhandled_reloc, /* special_function */
1267 "R_PPC64_DTPREL64", /* name */
1268 FALSE, /* partial_inplace */
1269 0, /* src_mask */
1270 ONES (64), /* dst_mask */
1271 FALSE), /* pcrel_offset */
1272
1273 /* A 16 bit dtprel reloc. */
1274 HOWTO (R_PPC64_DTPREL16,
1275 0, /* rightshift */
1276 1, /* size (0 = byte, 1 = short, 2 = long) */
1277 16, /* bitsize */
1278 FALSE, /* pc_relative */
1279 0, /* bitpos */
1280 complain_overflow_signed, /* complain_on_overflow */
1281 ppc64_elf_unhandled_reloc, /* special_function */
1282 "R_PPC64_DTPREL16", /* name */
1283 FALSE, /* partial_inplace */
1284 0, /* src_mask */
1285 0xffff, /* dst_mask */
1286 FALSE), /* pcrel_offset */
1287
1288 /* Like DTPREL16, but no overflow. */
1289 HOWTO (R_PPC64_DTPREL16_LO,
1290 0, /* rightshift */
1291 1, /* size (0 = byte, 1 = short, 2 = long) */
1292 16, /* bitsize */
1293 FALSE, /* pc_relative */
1294 0, /* bitpos */
1295 complain_overflow_dont, /* complain_on_overflow */
1296 ppc64_elf_unhandled_reloc, /* special_function */
1297 "R_PPC64_DTPREL16_LO", /* name */
1298 FALSE, /* partial_inplace */
1299 0, /* src_mask */
1300 0xffff, /* dst_mask */
1301 FALSE), /* pcrel_offset */
1302
1303 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1304 HOWTO (R_PPC64_DTPREL16_HI,
1305 16, /* rightshift */
1306 1, /* size (0 = byte, 1 = short, 2 = long) */
1307 16, /* bitsize */
1308 FALSE, /* pc_relative */
1309 0, /* bitpos */
1310 complain_overflow_dont, /* complain_on_overflow */
1311 ppc64_elf_unhandled_reloc, /* special_function */
1312 "R_PPC64_DTPREL16_HI", /* name */
1313 FALSE, /* partial_inplace */
1314 0, /* src_mask */
1315 0xffff, /* dst_mask */
1316 FALSE), /* pcrel_offset */
1317
1318 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1319 HOWTO (R_PPC64_DTPREL16_HA,
1320 16, /* rightshift */
1321 1, /* size (0 = byte, 1 = short, 2 = long) */
1322 16, /* bitsize */
1323 FALSE, /* pc_relative */
1324 0, /* bitpos */
1325 complain_overflow_dont, /* complain_on_overflow */
1326 ppc64_elf_unhandled_reloc, /* special_function */
1327 "R_PPC64_DTPREL16_HA", /* name */
1328 FALSE, /* partial_inplace */
1329 0, /* src_mask */
1330 0xffff, /* dst_mask */
1331 FALSE), /* pcrel_offset */
1332
1333 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1334 HOWTO (R_PPC64_DTPREL16_HIGHER,
1335 32, /* rightshift */
1336 1, /* size (0 = byte, 1 = short, 2 = long) */
1337 16, /* bitsize */
1338 FALSE, /* pc_relative */
1339 0, /* bitpos */
1340 complain_overflow_dont, /* complain_on_overflow */
1341 ppc64_elf_unhandled_reloc, /* special_function */
1342 "R_PPC64_DTPREL16_HIGHER", /* name */
1343 FALSE, /* partial_inplace */
1344 0, /* src_mask */
1345 0xffff, /* dst_mask */
1346 FALSE), /* pcrel_offset */
1347
1348 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1349 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1350 32, /* rightshift */
1351 1, /* size (0 = byte, 1 = short, 2 = long) */
1352 16, /* bitsize */
1353 FALSE, /* pc_relative */
1354 0, /* bitpos */
1355 complain_overflow_dont, /* complain_on_overflow */
1356 ppc64_elf_unhandled_reloc, /* special_function */
1357 "R_PPC64_DTPREL16_HIGHERA", /* name */
1358 FALSE, /* partial_inplace */
1359 0, /* src_mask */
1360 0xffff, /* dst_mask */
1361 FALSE), /* pcrel_offset */
1362
1363 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1364 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1365 48, /* rightshift */
1366 1, /* size (0 = byte, 1 = short, 2 = long) */
1367 16, /* bitsize */
1368 FALSE, /* pc_relative */
1369 0, /* bitpos */
1370 complain_overflow_dont, /* complain_on_overflow */
1371 ppc64_elf_unhandled_reloc, /* special_function */
1372 "R_PPC64_DTPREL16_HIGHEST", /* name */
1373 FALSE, /* partial_inplace */
1374 0, /* src_mask */
1375 0xffff, /* dst_mask */
1376 FALSE), /* pcrel_offset */
1377
1378 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1379 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1380 48, /* rightshift */
1381 1, /* size (0 = byte, 1 = short, 2 = long) */
1382 16, /* bitsize */
1383 FALSE, /* pc_relative */
1384 0, /* bitpos */
1385 complain_overflow_dont, /* complain_on_overflow */
1386 ppc64_elf_unhandled_reloc, /* special_function */
1387 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1388 FALSE, /* partial_inplace */
1389 0, /* src_mask */
1390 0xffff, /* dst_mask */
1391 FALSE), /* pcrel_offset */
1392
1393 /* Like DTPREL16, but for insns with a DS field. */
1394 HOWTO (R_PPC64_DTPREL16_DS,
1395 0, /* rightshift */
1396 1, /* size (0 = byte, 1 = short, 2 = long) */
1397 16, /* bitsize */
1398 FALSE, /* pc_relative */
1399 0, /* bitpos */
1400 complain_overflow_signed, /* complain_on_overflow */
1401 ppc64_elf_unhandled_reloc, /* special_function */
1402 "R_PPC64_DTPREL16_DS", /* name */
1403 FALSE, /* partial_inplace */
1404 0, /* src_mask */
1405 0xfffc, /* dst_mask */
1406 FALSE), /* pcrel_offset */
1407
1408 /* Like DTPREL16_DS, but no overflow. */
1409 HOWTO (R_PPC64_DTPREL16_LO_DS,
1410 0, /* rightshift */
1411 1, /* size (0 = byte, 1 = short, 2 = long) */
1412 16, /* bitsize */
1413 FALSE, /* pc_relative */
1414 0, /* bitpos */
1415 complain_overflow_dont, /* complain_on_overflow */
1416 ppc64_elf_unhandled_reloc, /* special_function */
1417 "R_PPC64_DTPREL16_LO_DS", /* name */
1418 FALSE, /* partial_inplace */
1419 0, /* src_mask */
1420 0xfffc, /* dst_mask */
1421 FALSE), /* pcrel_offset */
1422
1423 /* Computes a tp-relative displacement, the difference between the value of
1424 sym+add and the value of the thread pointer (r13). */
1425 HOWTO (R_PPC64_TPREL64,
1426 0, /* rightshift */
1427 4, /* size (0 = byte, 1 = short, 2 = long) */
1428 64, /* bitsize */
1429 FALSE, /* pc_relative */
1430 0, /* bitpos */
1431 complain_overflow_dont, /* complain_on_overflow */
1432 ppc64_elf_unhandled_reloc, /* special_function */
1433 "R_PPC64_TPREL64", /* name */
1434 FALSE, /* partial_inplace */
1435 0, /* src_mask */
1436 ONES (64), /* dst_mask */
1437 FALSE), /* pcrel_offset */
1438
1439 /* A 16 bit tprel reloc. */
1440 HOWTO (R_PPC64_TPREL16,
1441 0, /* rightshift */
1442 1, /* size (0 = byte, 1 = short, 2 = long) */
1443 16, /* bitsize */
1444 FALSE, /* pc_relative */
1445 0, /* bitpos */
1446 complain_overflow_signed, /* complain_on_overflow */
1447 ppc64_elf_unhandled_reloc, /* special_function */
1448 "R_PPC64_TPREL16", /* name */
1449 FALSE, /* partial_inplace */
1450 0, /* src_mask */
1451 0xffff, /* dst_mask */
1452 FALSE), /* pcrel_offset */
1453
1454 /* Like TPREL16, but no overflow. */
1455 HOWTO (R_PPC64_TPREL16_LO,
1456 0, /* rightshift */
1457 1, /* size (0 = byte, 1 = short, 2 = long) */
1458 16, /* bitsize */
1459 FALSE, /* pc_relative */
1460 0, /* bitpos */
1461 complain_overflow_dont, /* complain_on_overflow */
1462 ppc64_elf_unhandled_reloc, /* special_function */
1463 "R_PPC64_TPREL16_LO", /* name */
1464 FALSE, /* partial_inplace */
1465 0, /* src_mask */
1466 0xffff, /* dst_mask */
1467 FALSE), /* pcrel_offset */
1468
1469 /* Like TPREL16_LO, but next higher group of 16 bits. */
1470 HOWTO (R_PPC64_TPREL16_HI,
1471 16, /* rightshift */
1472 1, /* size (0 = byte, 1 = short, 2 = long) */
1473 16, /* bitsize */
1474 FALSE, /* pc_relative */
1475 0, /* bitpos */
1476 complain_overflow_dont, /* complain_on_overflow */
1477 ppc64_elf_unhandled_reloc, /* special_function */
1478 "R_PPC64_TPREL16_HI", /* name */
1479 FALSE, /* partial_inplace */
1480 0, /* src_mask */
1481 0xffff, /* dst_mask */
1482 FALSE), /* pcrel_offset */
1483
1484 /* Like TPREL16_HI, but adjust for low 16 bits. */
1485 HOWTO (R_PPC64_TPREL16_HA,
1486 16, /* rightshift */
1487 1, /* size (0 = byte, 1 = short, 2 = long) */
1488 16, /* bitsize */
1489 FALSE, /* pc_relative */
1490 0, /* bitpos */
1491 complain_overflow_dont, /* complain_on_overflow */
1492 ppc64_elf_unhandled_reloc, /* special_function */
1493 "R_PPC64_TPREL16_HA", /* name */
1494 FALSE, /* partial_inplace */
1495 0, /* src_mask */
1496 0xffff, /* dst_mask */
1497 FALSE), /* pcrel_offset */
1498
1499 /* Like TPREL16_HI, but next higher group of 16 bits. */
1500 HOWTO (R_PPC64_TPREL16_HIGHER,
1501 32, /* rightshift */
1502 1, /* size (0 = byte, 1 = short, 2 = long) */
1503 16, /* bitsize */
1504 FALSE, /* pc_relative */
1505 0, /* bitpos */
1506 complain_overflow_dont, /* complain_on_overflow */
1507 ppc64_elf_unhandled_reloc, /* special_function */
1508 "R_PPC64_TPREL16_HIGHER", /* name */
1509 FALSE, /* partial_inplace */
1510 0, /* src_mask */
1511 0xffff, /* dst_mask */
1512 FALSE), /* pcrel_offset */
1513
1514 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1515 HOWTO (R_PPC64_TPREL16_HIGHERA,
1516 32, /* rightshift */
1517 1, /* size (0 = byte, 1 = short, 2 = long) */
1518 16, /* bitsize */
1519 FALSE, /* pc_relative */
1520 0, /* bitpos */
1521 complain_overflow_dont, /* complain_on_overflow */
1522 ppc64_elf_unhandled_reloc, /* special_function */
1523 "R_PPC64_TPREL16_HIGHERA", /* name */
1524 FALSE, /* partial_inplace */
1525 0, /* src_mask */
1526 0xffff, /* dst_mask */
1527 FALSE), /* pcrel_offset */
1528
1529 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1530 HOWTO (R_PPC64_TPREL16_HIGHEST,
1531 48, /* rightshift */
1532 1, /* size (0 = byte, 1 = short, 2 = long) */
1533 16, /* bitsize */
1534 FALSE, /* pc_relative */
1535 0, /* bitpos */
1536 complain_overflow_dont, /* complain_on_overflow */
1537 ppc64_elf_unhandled_reloc, /* special_function */
1538 "R_PPC64_TPREL16_HIGHEST", /* name */
1539 FALSE, /* partial_inplace */
1540 0, /* src_mask */
1541 0xffff, /* dst_mask */
1542 FALSE), /* pcrel_offset */
1543
1544 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1545 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1546 48, /* rightshift */
1547 1, /* size (0 = byte, 1 = short, 2 = long) */
1548 16, /* bitsize */
1549 FALSE, /* pc_relative */
1550 0, /* bitpos */
1551 complain_overflow_dont, /* complain_on_overflow */
1552 ppc64_elf_unhandled_reloc, /* special_function */
1553 "R_PPC64_TPREL16_HIGHESTA", /* name */
1554 FALSE, /* partial_inplace */
1555 0, /* src_mask */
1556 0xffff, /* dst_mask */
1557 FALSE), /* pcrel_offset */
1558
1559 /* Like TPREL16, but for insns with a DS field. */
1560 HOWTO (R_PPC64_TPREL16_DS,
1561 0, /* rightshift */
1562 1, /* size (0 = byte, 1 = short, 2 = long) */
1563 16, /* bitsize */
1564 FALSE, /* pc_relative */
1565 0, /* bitpos */
1566 complain_overflow_signed, /* complain_on_overflow */
1567 ppc64_elf_unhandled_reloc, /* special_function */
1568 "R_PPC64_TPREL16_DS", /* name */
1569 FALSE, /* partial_inplace */
1570 0, /* src_mask */
1571 0xfffc, /* dst_mask */
1572 FALSE), /* pcrel_offset */
1573
1574 /* Like TPREL16_DS, but no overflow. */
1575 HOWTO (R_PPC64_TPREL16_LO_DS,
1576 0, /* rightshift */
1577 1, /* size (0 = byte, 1 = short, 2 = long) */
1578 16, /* bitsize */
1579 FALSE, /* pc_relative */
1580 0, /* bitpos */
1581 complain_overflow_dont, /* complain_on_overflow */
1582 ppc64_elf_unhandled_reloc, /* special_function */
1583 "R_PPC64_TPREL16_LO_DS", /* name */
1584 FALSE, /* partial_inplace */
1585 0, /* src_mask */
1586 0xfffc, /* dst_mask */
1587 FALSE), /* pcrel_offset */
1588
1589 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1590 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1591 to the first entry relative to the TOC base (r2). */
1592 HOWTO (R_PPC64_GOT_TLSGD16,
1593 0, /* rightshift */
1594 1, /* size (0 = byte, 1 = short, 2 = long) */
1595 16, /* bitsize */
1596 FALSE, /* pc_relative */
1597 0, /* bitpos */
1598 complain_overflow_signed, /* complain_on_overflow */
1599 ppc64_elf_unhandled_reloc, /* special_function */
1600 "R_PPC64_GOT_TLSGD16", /* name */
b34976b6 1601 FALSE, /* partial_inplace */
5bd4f169
AM
1602 0, /* src_mask */
1603 0xffff, /* dst_mask */
b34976b6 1604 FALSE), /* pcrel_offset */
5bd4f169 1605
411e1bfb
AM
1606 /* Like GOT_TLSGD16, but no overflow. */
1607 HOWTO (R_PPC64_GOT_TLSGD16_LO,
5bd4f169
AM
1608 0, /* rightshift */
1609 1, /* size (0 = byte, 1 = short, 2 = long) */
1610 16, /* bitsize */
b34976b6 1611 FALSE, /* pc_relative */
5bd4f169
AM
1612 0, /* bitpos */
1613 complain_overflow_dont, /* complain_on_overflow */
805fc799 1614 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1615 "R_PPC64_GOT_TLSGD16_LO", /* name */
b34976b6 1616 FALSE, /* partial_inplace */
5bd4f169
AM
1617 0, /* src_mask */
1618 0xffff, /* dst_mask */
b34976b6 1619 FALSE), /* pcrel_offset */
5bd4f169 1620
411e1bfb
AM
1621 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1622 HOWTO (R_PPC64_GOT_TLSGD16_HI,
5bd4f169
AM
1623 16, /* rightshift */
1624 1, /* size (0 = byte, 1 = short, 2 = long) */
1625 16, /* bitsize */
b34976b6 1626 FALSE, /* pc_relative */
5bd4f169
AM
1627 0, /* bitpos */
1628 complain_overflow_dont, /* complain_on_overflow */
805fc799 1629 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1630 "R_PPC64_GOT_TLSGD16_HI", /* name */
b34976b6 1631 FALSE, /* partial_inplace */
5bd4f169
AM
1632 0, /* src_mask */
1633 0xffff, /* dst_mask */
b34976b6 1634 FALSE), /* pcrel_offset */
5bd4f169 1635
411e1bfb
AM
1636 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1637 HOWTO (R_PPC64_GOT_TLSGD16_HA,
5bd4f169
AM
1638 16, /* rightshift */
1639 1, /* size (0 = byte, 1 = short, 2 = long) */
1640 16, /* bitsize */
b34976b6 1641 FALSE, /* pc_relative */
5bd4f169 1642 0, /* bitpos */
411e1bfb 1643 complain_overflow_dont, /* complain_on_overflow */
805fc799 1644 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1645 "R_PPC64_GOT_TLSGD16_HA", /* name */
b34976b6 1646 FALSE, /* partial_inplace */
5bd4f169
AM
1647 0, /* src_mask */
1648 0xffff, /* dst_mask */
b34976b6 1649 FALSE), /* pcrel_offset */
5bd4f169 1650
411e1bfb
AM
1651 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1652 with values (sym+add)@dtpmod and zero, and computes the offset to the
1653 first entry relative to the TOC base (r2). */
1654 HOWTO (R_PPC64_GOT_TLSLD16,
5bd4f169
AM
1655 0, /* rightshift */
1656 1, /* size (0 = byte, 1 = short, 2 = long) */
1657 16, /* bitsize */
b34976b6 1658 FALSE, /* pc_relative */
5bd4f169 1659 0, /* bitpos */
411e1bfb
AM
1660 complain_overflow_signed, /* complain_on_overflow */
1661 ppc64_elf_unhandled_reloc, /* special_function */
1662 "R_PPC64_GOT_TLSLD16", /* name */
b34976b6 1663 FALSE, /* partial_inplace */
d006db6c 1664 0, /* src_mask */
411e1bfb 1665 0xffff, /* dst_mask */
b34976b6 1666 FALSE), /* pcrel_offset */
5bd4f169 1667
411e1bfb
AM
1668 /* Like GOT_TLSLD16, but no overflow. */
1669 HOWTO (R_PPC64_GOT_TLSLD16_LO,
5bd4f169
AM
1670 0, /* rightshift */
1671 1, /* size (0 = byte, 1 = short, 2 = long) */
1672 16, /* bitsize */
b34976b6 1673 FALSE, /* pc_relative */
5bd4f169 1674 0, /* bitpos */
411e1bfb
AM
1675 complain_overflow_dont, /* complain_on_overflow */
1676 ppc64_elf_unhandled_reloc, /* special_function */
1677 "R_PPC64_GOT_TLSLD16_LO", /* name */
b34976b6 1678 FALSE, /* partial_inplace */
d006db6c 1679 0, /* src_mask */
411e1bfb 1680 0xffff, /* dst_mask */
b34976b6 1681 FALSE), /* pcrel_offset */
5bd4f169 1682
411e1bfb
AM
1683 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1684 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1685 16, /* rightshift */
5bd4f169
AM
1686 1, /* size (0 = byte, 1 = short, 2 = long) */
1687 16, /* bitsize */
b34976b6 1688 FALSE, /* pc_relative */
5bd4f169 1689 0, /* bitpos */
411e1bfb 1690 complain_overflow_dont, /* complain_on_overflow */
805fc799 1691 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1692 "R_PPC64_GOT_TLSLD16_HI", /* name */
b34976b6 1693 FALSE, /* partial_inplace */
d006db6c 1694 0, /* src_mask */
411e1bfb 1695 0xffff, /* dst_mask */
b34976b6 1696 FALSE), /* pcrel_offset */
5bd4f169 1697
411e1bfb
AM
1698 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1699 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1700 16, /* rightshift */
5bd4f169
AM
1701 1, /* size (0 = byte, 1 = short, 2 = long) */
1702 16, /* bitsize */
b34976b6 1703 FALSE, /* pc_relative */
5bd4f169
AM
1704 0, /* bitpos */
1705 complain_overflow_dont, /* complain_on_overflow */
805fc799 1706 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1707 "R_PPC64_GOT_TLSLD16_HA", /* name */
b34976b6 1708 FALSE, /* partial_inplace */
d006db6c 1709 0, /* src_mask */
411e1bfb 1710 0xffff, /* dst_mask */
b34976b6 1711 FALSE), /* pcrel_offset */
5bd4f169 1712
411e1bfb
AM
1713 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1714 the offset to the entry relative to the TOC base (r2). */
1715 HOWTO (R_PPC64_GOT_DTPREL16_DS,
5bd4f169
AM
1716 0, /* rightshift */
1717 1, /* size (0 = byte, 1 = short, 2 = long) */
1718 16, /* bitsize */
b34976b6 1719 FALSE, /* pc_relative */
5bd4f169 1720 0, /* bitpos */
411e1bfb 1721 complain_overflow_signed, /* complain_on_overflow */
805fc799 1722 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1723 "R_PPC64_GOT_DTPREL16_DS", /* name */
b34976b6 1724 FALSE, /* partial_inplace */
d006db6c 1725 0, /* src_mask */
5bd4f169 1726 0xfffc, /* dst_mask */
b34976b6 1727 FALSE), /* pcrel_offset */
5bd4f169 1728
411e1bfb
AM
1729 /* Like GOT_DTPREL16_DS, but no overflow. */
1730 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
5bd4f169 1731 0, /* rightshift */
c061c2d8
AM
1732 1, /* size (0 = byte, 1 = short, 2 = long) */
1733 16, /* bitsize */
b34976b6 1734 FALSE, /* pc_relative */
5bd4f169 1735 0, /* bitpos */
411e1bfb
AM
1736 complain_overflow_dont, /* complain_on_overflow */
1737 ppc64_elf_unhandled_reloc, /* special_function */
1738 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
b34976b6 1739 FALSE, /* partial_inplace */
d006db6c 1740 0, /* src_mask */
c061c2d8 1741 0xfffc, /* dst_mask */
b34976b6 1742 FALSE), /* pcrel_offset */
5bd4f169 1743
411e1bfb
AM
1744 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1745 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1746 16, /* rightshift */
5bd4f169
AM
1747 1, /* size (0 = byte, 1 = short, 2 = long) */
1748 16, /* bitsize */
b34976b6 1749 FALSE, /* pc_relative */
5bd4f169
AM
1750 0, /* bitpos */
1751 complain_overflow_dont, /* complain_on_overflow */
411e1bfb
AM
1752 ppc64_elf_unhandled_reloc, /* special_function */
1753 "R_PPC64_GOT_DTPREL16_HI", /* name */
b34976b6 1754 FALSE, /* partial_inplace */
d006db6c 1755 0, /* src_mask */
411e1bfb 1756 0xffff, /* dst_mask */
b34976b6 1757 FALSE), /* pcrel_offset */
5bd4f169 1758
411e1bfb
AM
1759 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1760 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1761 16, /* rightshift */
1762 1, /* size (0 = byte, 1 = short, 2 = long) */
1763 16, /* bitsize */
1764 FALSE, /* pc_relative */
1765 0, /* bitpos */
1766 complain_overflow_dont, /* complain_on_overflow */
1767 ppc64_elf_unhandled_reloc, /* special_function */
1768 "R_PPC64_GOT_DTPREL16_HA", /* name */
1769 FALSE, /* partial_inplace */
1770 0, /* src_mask */
1771 0xffff, /* dst_mask */
1772 FALSE), /* pcrel_offset */
1773
1774 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1775 offset to the entry relative to the TOC base (r2). */
1776 HOWTO (R_PPC64_GOT_TPREL16_DS,
5bd4f169
AM
1777 0, /* rightshift */
1778 1, /* size (0 = byte, 1 = short, 2 = long) */
1779 16, /* bitsize */
b34976b6 1780 FALSE, /* pc_relative */
5bd4f169
AM
1781 0, /* bitpos */
1782 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1783 ppc64_elf_unhandled_reloc, /* special_function */
1784 "R_PPC64_GOT_TPREL16_DS", /* name */
b34976b6 1785 FALSE, /* partial_inplace */
d006db6c 1786 0, /* src_mask */
ad8e1ba5 1787 0xfffc, /* dst_mask */
b34976b6 1788 FALSE), /* pcrel_offset */
5bd4f169 1789
411e1bfb
AM
1790 /* Like GOT_TPREL16_DS, but no overflow. */
1791 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
5bd4f169
AM
1792 0, /* rightshift */
1793 1, /* size (0 = byte, 1 = short, 2 = long) */
1794 16, /* bitsize */
b34976b6 1795 FALSE, /* pc_relative */
5bd4f169
AM
1796 0, /* bitpos */
1797 complain_overflow_dont, /* complain_on_overflow */
411e1bfb
AM
1798 ppc64_elf_unhandled_reloc, /* special_function */
1799 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
b34976b6 1800 FALSE, /* partial_inplace */
d006db6c 1801 0, /* src_mask */
ad8e1ba5 1802 0xfffc, /* dst_mask */
b34976b6 1803 FALSE), /* pcrel_offset */
5bd4f169 1804
411e1bfb
AM
1805 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1806 HOWTO (R_PPC64_GOT_TPREL16_HI,
1807 16, /* rightshift */
5bd4f169
AM
1808 1, /* size (0 = byte, 1 = short, 2 = long) */
1809 16, /* bitsize */
b34976b6 1810 FALSE, /* pc_relative */
5bd4f169 1811 0, /* bitpos */
411e1bfb 1812 complain_overflow_dont, /* complain_on_overflow */
805fc799 1813 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1814 "R_PPC64_GOT_TPREL16_HI", /* name */
b34976b6 1815 FALSE, /* partial_inplace */
d006db6c 1816 0, /* src_mask */
411e1bfb 1817 0xffff, /* dst_mask */
b34976b6 1818 FALSE), /* pcrel_offset */
5bd4f169 1819
411e1bfb
AM
1820 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1821 HOWTO (R_PPC64_GOT_TPREL16_HA,
1822 16, /* rightshift */
5bd4f169
AM
1823 1, /* size (0 = byte, 1 = short, 2 = long) */
1824 16, /* bitsize */
b34976b6 1825 FALSE, /* pc_relative */
5bd4f169
AM
1826 0, /* bitpos */
1827 complain_overflow_dont, /* complain_on_overflow */
805fc799 1828 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1829 "R_PPC64_GOT_TPREL16_HA", /* name */
b34976b6 1830 FALSE, /* partial_inplace */
d006db6c 1831 0, /* src_mask */
411e1bfb 1832 0xffff, /* dst_mask */
b34976b6 1833 FALSE), /* pcrel_offset */
5bd4f169
AM
1834
1835 /* GNU extension to record C++ vtable hierarchy. */
1836 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
1837 0, /* rightshift */
1838 0, /* size (0 = byte, 1 = short, 2 = long) */
1839 0, /* bitsize */
b34976b6 1840 FALSE, /* pc_relative */
5bd4f169
AM
1841 0, /* bitpos */
1842 complain_overflow_dont, /* complain_on_overflow */
1843 NULL, /* special_function */
1844 "R_PPC64_GNU_VTINHERIT", /* name */
b34976b6 1845 FALSE, /* partial_inplace */
5bd4f169
AM
1846 0, /* src_mask */
1847 0, /* dst_mask */
b34976b6 1848 FALSE), /* pcrel_offset */
5bd4f169
AM
1849
1850 /* GNU extension to record C++ vtable member usage. */
1851 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
1852 0, /* rightshift */
1853 0, /* size (0 = byte, 1 = short, 2 = long) */
1854 0, /* bitsize */
b34976b6 1855 FALSE, /* pc_relative */
5bd4f169
AM
1856 0, /* bitpos */
1857 complain_overflow_dont, /* complain_on_overflow */
1858 NULL, /* special_function */
1859 "R_PPC64_GNU_VTENTRY", /* name */
b34976b6 1860 FALSE, /* partial_inplace */
5bd4f169
AM
1861 0, /* src_mask */
1862 0, /* dst_mask */
b34976b6 1863 FALSE), /* pcrel_offset */
5bd4f169
AM
1864};
1865
1866\f
1867/* Initialize the ppc64_elf_howto_table, so that linear accesses can
1868 be done. */
1869
1870static void
4ce794b7 1871ppc_howto_init (void)
5bd4f169
AM
1872{
1873 unsigned int i, type;
1874
1875 for (i = 0;
1876 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
1877 i++)
1878 {
1879 type = ppc64_elf_howto_raw[i].type;
1880 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1881 / sizeof (ppc64_elf_howto_table[0])));
1882 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
1883 }
1884}
1885
1886static reloc_howto_type *
4ce794b7
AM
1887ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1888 bfd_reloc_code_real_type code)
5bd4f169 1889{
411e1bfb 1890 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
5bd4f169
AM
1891
1892 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1893 /* Initialize howto table if needed. */
1894 ppc_howto_init ();
1895
4ce794b7 1896 switch (code)
5bd4f169
AM
1897 {
1898 default:
4ce794b7 1899 return NULL;
5bd4f169 1900
411e1bfb
AM
1901 case BFD_RELOC_NONE: r = R_PPC64_NONE;
1902 break;
1903 case BFD_RELOC_32: r = R_PPC64_ADDR32;
1904 break;
1905 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
1906 break;
1907 case BFD_RELOC_16: r = R_PPC64_ADDR16;
1908 break;
1909 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
1910 break;
1911 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
1912 break;
1913 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
5bd4f169 1914 break;
411e1bfb 1915 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
5bd4f169 1916 break;
411e1bfb 1917 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
5bd4f169 1918 break;
411e1bfb 1919 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
5bd4f169 1920 break;
411e1bfb 1921 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
5bd4f169 1922 break;
411e1bfb 1923 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
5bd4f169 1924 break;
411e1bfb 1925 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
5bd4f169 1926 break;
411e1bfb 1927 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
5bd4f169 1928 break;
411e1bfb 1929 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
5bd4f169 1930 break;
411e1bfb 1931 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
5bd4f169 1932 break;
411e1bfb 1933 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
5bd4f169 1934 break;
411e1bfb 1935 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
5bd4f169 1936 break;
411e1bfb 1937 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
5bd4f169 1938 break;
411e1bfb 1939 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
5bd4f169 1940 break;
411e1bfb 1941 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
5bd4f169 1942 break;
411e1bfb 1943 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
5bd4f169 1944 break;
411e1bfb 1945 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
5bd4f169 1946 break;
411e1bfb 1947 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
5bd4f169 1948 break;
411e1bfb 1949 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
5bd4f169 1950 break;
411e1bfb 1951 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
5bd4f169 1952 break;
411e1bfb 1953 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
5bd4f169 1954 break;
411e1bfb 1955 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
5bd4f169 1956 break;
411e1bfb 1957 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
5bd4f169 1958 break;
411e1bfb 1959 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
5bd4f169 1960 break;
411e1bfb 1961 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
5bd4f169 1962 break;
411e1bfb 1963 case BFD_RELOC_64: r = R_PPC64_ADDR64;
5bd4f169 1964 break;
411e1bfb 1965 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
5bd4f169 1966 break;
411e1bfb 1967 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
5bd4f169 1968 break;
411e1bfb 1969 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
5bd4f169 1970 break;
411e1bfb 1971 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
5bd4f169 1972 break;
411e1bfb 1973 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
5bd4f169 1974 break;
411e1bfb 1975 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
5bd4f169 1976 break;
411e1bfb 1977 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
5bd4f169 1978 break;
411e1bfb 1979 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
5bd4f169 1980 break;
411e1bfb 1981 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
5bd4f169 1982 break;
411e1bfb 1983 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
5bd4f169 1984 break;
411e1bfb 1985 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
5bd4f169 1986 break;
411e1bfb 1987 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
5bd4f169 1988 break;
411e1bfb 1989 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
5bd4f169 1990 break;
411e1bfb 1991 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
5bd4f169 1992 break;
411e1bfb 1993 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
5bd4f169 1994 break;
411e1bfb 1995 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
5bd4f169 1996 break;
411e1bfb 1997 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
5bd4f169 1998 break;
411e1bfb 1999 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
5bd4f169 2000 break;
411e1bfb 2001 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
5bd4f169 2002 break;
411e1bfb 2003 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
5bd4f169 2004 break;
411e1bfb 2005 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
5bd4f169 2006 break;
411e1bfb 2007 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
5bd4f169 2008 break;
411e1bfb 2009 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
5bd4f169 2010 break;
411e1bfb 2011 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
5bd4f169 2012 break;
411e1bfb 2013 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
5bd4f169 2014 break;
411e1bfb 2015 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
5bd4f169 2016 break;
411e1bfb 2017 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
5bd4f169 2018 break;
411e1bfb 2019 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
5bd4f169 2020 break;
411e1bfb 2021 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
5bd4f169 2022 break;
411e1bfb 2023 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
5bd4f169 2024 break;
411e1bfb 2025 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
5bd4f169 2026 break;
411e1bfb 2027 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
5bd4f169 2028 break;
411e1bfb 2029 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
5bd4f169 2030 break;
411e1bfb 2031 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
5bd4f169 2032 break;
411e1bfb
AM
2033 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2034 break;
2035 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2036 break;
2037 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2038 break;
2039 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2040 break;
2041 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2042 break;
2043 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2044 break;
2045 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2046 break;
2047 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2048 break;
2049 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2050 break;
2051 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2052 break;
2053 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2054 break;
2055 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2056 break;
2057 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2058 break;
2059 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2060 break;
2061 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2062 break;
2063 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2064 break;
2065 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2066 break;
2067 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2068 break;
2069 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2070 break;
2071 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2072 break;
2073 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2074 break;
2075 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2076 break;
2077 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2078 break;
2079 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2080 break;
2081 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2082 break;
2083 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2084 break;
2085 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2086 break;
2087 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2088 break;
2089 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2090 break;
2091 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2092 break;
2093 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2094 break;
2095 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2096 break;
2097 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2098 break;
2099 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2100 break;
2101 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
5bd4f169
AM
2102 break;
2103 }
2104
4ce794b7 2105 return ppc64_elf_howto_table[r];
5bd4f169
AM
2106};
2107
2108/* Set the howto pointer for a PowerPC ELF reloc. */
2109
2110static void
4ce794b7
AM
2111ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2112 Elf_Internal_Rela *dst)
5bd4f169 2113{
65f38f15
AM
2114 unsigned int type;
2115
ef60b7ff 2116 /* Initialize howto table if needed. */
5bd4f169 2117 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
2118 ppc_howto_init ();
2119
65f38f15
AM
2120 type = ELF64_R_TYPE (dst->r_info);
2121 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2122 / sizeof (ppc64_elf_howto_table[0])));
2123 cache_ptr->howto = ppc64_elf_howto_table[type];
5bd4f169
AM
2124}
2125
04c9666a 2126/* Handle the R_PPC64_ADDR16_HA and similar relocs. */
5bd4f169
AM
2127
2128static bfd_reloc_status_type
4ce794b7
AM
2129ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2130 void *data, asection *input_section,
2131 bfd *output_bfd, char **error_message)
5bd4f169 2132{
805fc799
AM
2133 /* If this is a relocatable link (output_bfd test tells us), just
2134 call the generic function. Any adjustment will be done at final
2135 link time. */
2136 if (output_bfd != NULL)
cedb70c5 2137 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2138 input_section, output_bfd, error_message);
2139
2140 /* Adjust the addend for sign extension of the low 16 bits.
2141 We won't actually be using the low 16 bits, so trashing them
2142 doesn't matter. */
2143 reloc_entry->addend += 0x8000;
2144 return bfd_reloc_continue;
2145}
5bd4f169 2146
2441e016
AM
2147static bfd_reloc_status_type
2148ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2149 void *data, asection *input_section,
2150 bfd *output_bfd, char **error_message)
2151{
2152 if (output_bfd != NULL)
2153 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2154 input_section, output_bfd, error_message);
2155
699733f6
AM
2156 if (strcmp (symbol->section->name, ".opd") == 0
2157 && (symbol->section->owner->flags & DYNAMIC) == 0)
2441e016
AM
2158 {
2159 bfd_vma dest = opd_entry_value (symbol->section,
2160 symbol->value + reloc_entry->addend,
2161 NULL, NULL);
2162 if (dest != (bfd_vma) -1)
2163 reloc_entry->addend = dest - (symbol->value
2164 + symbol->section->output_section->vma
2165 + symbol->section->output_offset);
2166 }
2167 return bfd_reloc_continue;
2168}
2169
805fc799 2170static bfd_reloc_status_type
4ce794b7
AM
2171ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2172 void *data, asection *input_section,
2173 bfd *output_bfd, char **error_message)
805fc799
AM
2174{
2175 long insn;
04c9666a 2176 enum elf_ppc64_reloc_type r_type;
805fc799
AM
2177 bfd_size_type octets;
2178 /* Disabled until we sort out how ld should choose 'y' vs 'at'. */
b34976b6 2179 bfd_boolean is_power4 = FALSE;
805fc799
AM
2180
2181 /* If this is a relocatable link (output_bfd test tells us), just
2182 call the generic function. Any adjustment will be done at final
2183 link time. */
5bd4f169 2184 if (output_bfd != NULL)
cedb70c5 2185 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2186 input_section, output_bfd, error_message);
2187
2188 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2189 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2190 insn &= ~(0x01 << 21);
4ce794b7 2191 r_type = reloc_entry->howto->type;
805fc799
AM
2192 if (r_type == R_PPC64_ADDR14_BRTAKEN
2193 || r_type == R_PPC64_REL14_BRTAKEN)
cedb70c5 2194 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
805fc799
AM
2195
2196 if (is_power4)
5bd4f169 2197 {
805fc799
AM
2198 /* Set 'a' bit. This is 0b00010 in BO field for branch
2199 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2200 for branch on CTR insns (BO == 1a00t or 1a01t). */
2201 if ((insn & (0x14 << 21)) == (0x04 << 21))
2202 insn |= 0x02 << 21;
2203 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2204 insn |= 0x08 << 21;
2205 else
2441e016 2206 goto out;
5bd4f169 2207 }
805fc799
AM
2208 else
2209 {
2210 bfd_vma target = 0;
2211 bfd_vma from;
5bd4f169 2212
805fc799
AM
2213 if (!bfd_is_com_section (symbol->section))
2214 target = symbol->value;
2215 target += symbol->section->output_section->vma;
2216 target += symbol->section->output_offset;
2217 target += reloc_entry->addend;
5bd4f169 2218
805fc799
AM
2219 from = (reloc_entry->address
2220 + input_section->output_offset
2221 + input_section->output_section->vma);
5bd4f169 2222
805fc799
AM
2223 /* Invert 'y' bit if not the default. */
2224 if ((bfd_signed_vma) (target - from) < 0)
2225 insn ^= 0x01 << 21;
2226 }
4ce794b7 2227 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2441e016
AM
2228 out:
2229 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2230 input_section, output_bfd, error_message);
805fc799 2231}
5bd4f169 2232
805fc799 2233static bfd_reloc_status_type
4ce794b7
AM
2234ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2235 void *data, asection *input_section,
2236 bfd *output_bfd, char **error_message)
805fc799
AM
2237{
2238 /* If this is a relocatable link (output_bfd test tells us), just
2239 call the generic function. Any adjustment will be done at final
2240 link time. */
2241 if (output_bfd != NULL)
cedb70c5 2242 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799 2243 input_section, output_bfd, error_message);
5bd4f169 2244
805fc799
AM
2245 /* Subtract the symbol section base address. */
2246 reloc_entry->addend -= symbol->section->output_section->vma;
5bd4f169
AM
2247 return bfd_reloc_continue;
2248}
2249
805fc799 2250static bfd_reloc_status_type
4ce794b7
AM
2251ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2252 void *data, asection *input_section,
2253 bfd *output_bfd, char **error_message)
805fc799
AM
2254{
2255 /* If this is a relocatable link (output_bfd test tells us), just
2256 call the generic function. Any adjustment will be done at final
2257 link time. */
2258 if (output_bfd != NULL)
cedb70c5 2259 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2260 input_section, output_bfd, error_message);
2261
2262 /* Subtract the symbol section base address. */
2263 reloc_entry->addend -= symbol->section->output_section->vma;
2264
2265 /* Adjust the addend for sign extension of the low 16 bits. */
2266 reloc_entry->addend += 0x8000;
2267 return bfd_reloc_continue;
2268}
2269
2270static bfd_reloc_status_type
4ce794b7
AM
2271ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2272 void *data, asection *input_section,
2273 bfd *output_bfd, char **error_message)
805fc799
AM
2274{
2275 bfd_vma TOCstart;
2276
2277 /* If this is a relocatable link (output_bfd test tells us), just
2278 call the generic function. Any adjustment will be done at final
2279 link time. */
2280 if (output_bfd != NULL)
cedb70c5 2281 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2282 input_section, output_bfd, error_message);
2283
2284 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2285 if (TOCstart == 0)
2286 TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2287
2288 /* Subtract the TOC base address. */
2289 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2290 return bfd_reloc_continue;
2291}
2292
2293static bfd_reloc_status_type
4ce794b7
AM
2294ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2295 void *data, asection *input_section,
2296 bfd *output_bfd, char **error_message)
805fc799
AM
2297{
2298 bfd_vma TOCstart;
2299
2300 /* If this is a relocatable link (output_bfd test tells us), just
2301 call the generic function. Any adjustment will be done at final
2302 link time. */
2303 if (output_bfd != NULL)
cedb70c5 2304 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2305 input_section, output_bfd, error_message);
2306
2307 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2308 if (TOCstart == 0)
2309 TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2310
2311 /* Subtract the TOC base address. */
2312 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2313
2314 /* Adjust the addend for sign extension of the low 16 bits. */
2315 reloc_entry->addend += 0x8000;
2316 return bfd_reloc_continue;
2317}
2318
2319static bfd_reloc_status_type
4ce794b7
AM
2320ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2321 void *data, asection *input_section,
2322 bfd *output_bfd, char **error_message)
805fc799
AM
2323{
2324 bfd_vma TOCstart;
2325 bfd_size_type octets;
2326
2327 /* If this is a relocatable link (output_bfd test tells us), just
2328 call the generic function. Any adjustment will be done at final
2329 link time. */
2330 if (output_bfd != NULL)
cedb70c5 2331 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2332 input_section, output_bfd, error_message);
2333
2334 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2335 if (TOCstart == 0)
2336 TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2337
2338 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2339 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2340 return bfd_reloc_ok;
2341}
2342
2343static bfd_reloc_status_type
4ce794b7
AM
2344ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2345 void *data, asection *input_section,
2346 bfd *output_bfd, char **error_message)
805fc799
AM
2347{
2348 /* If this is a relocatable link (output_bfd test tells us), just
2349 call the generic function. Any adjustment will be done at final
2350 link time. */
2351 if (output_bfd != NULL)
cedb70c5 2352 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2353 input_section, output_bfd, error_message);
2354
2355 if (error_message != NULL)
2356 {
2357 static char buf[60];
2358 sprintf (buf, "generic linker can't handle %s",
2359 reloc_entry->howto->name);
2360 *error_message = buf;
2361 }
2362 return bfd_reloc_dangerous;
2363}
2364
e717da7e
AM
2365struct ppc64_elf_obj_tdata
2366{
2367 struct elf_obj_tdata elf;
2368
2369 /* Shortcuts to dynamic linker sections. */
2370 asection *got;
2371 asection *relgot;
2372
81688140
AM
2373 /* Used during garbage collection. We attach global symbols defined
2374 on removed .opd entries to this section so that the sym is removed. */
2375 asection *deleted_section;
2376
e717da7e
AM
2377 /* TLS local dynamic got entry handling. Suppose for multiple GOT
2378 sections means we potentially need one of these for each input bfd. */
2379 union {
2380 bfd_signed_vma refcount;
2381 bfd_vma offset;
2382 } tlsld_got;
2383};
2384
2385#define ppc64_elf_tdata(bfd) \
2386 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2387
2388#define ppc64_tlsld_got(bfd) \
2389 (&ppc64_elf_tdata (bfd)->tlsld_got)
2390
2391/* Override the generic function because we store some extras. */
2392
2393static bfd_boolean
2394ppc64_elf_mkobject (bfd *abfd)
2395{
2396 bfd_size_type amt = sizeof (struct ppc64_elf_obj_tdata);
2397 abfd->tdata.any = bfd_zalloc (abfd, amt);
2398 if (abfd->tdata.any == NULL)
2399 return FALSE;
2400 return TRUE;
2401}
2402
ee75fd95
AM
2403/* Return 1 if target is one of ours. */
2404
7b53ace3 2405static bfd_boolean
ee75fd95 2406is_ppc64_elf_target (const struct bfd_target *targ)
7b53ace3
AM
2407{
2408 extern const bfd_target bfd_elf64_powerpc_vec;
2409 extern const bfd_target bfd_elf64_powerpcle_vec;
2410
2411 return targ == &bfd_elf64_powerpc_vec || targ == &bfd_elf64_powerpcle_vec;
2412}
2413
feee612b
AM
2414/* Fix bad default arch selected for a 64 bit input bfd when the
2415 default is 32 bit. */
2416
b34976b6 2417static bfd_boolean
4ce794b7 2418ppc64_elf_object_p (bfd *abfd)
feee612b
AM
2419{
2420 if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2421 {
2422 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2423
2424 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2425 {
2426 /* Relies on arch after 32 bit default being 64 bit default. */
2427 abfd->arch_info = abfd->arch_info->next;
2428 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2429 }
2430 }
b34976b6 2431 return TRUE;
feee612b
AM
2432}
2433
d37c89e5
AM
2434/* Support for core dump NOTE sections. */
2435
2436static bfd_boolean
2437ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2438{
eea6121a 2439 size_t offset, size;
d37c89e5
AM
2440
2441 if (note->descsz != 504)
2442 return FALSE;
2443
2444 /* pr_cursig */
2445 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2446
2447 /* pr_pid */
2448 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32);
2449
2450 /* pr_reg */
2451 offset = 112;
eea6121a 2452 size = 384;
d37c89e5
AM
2453
2454 /* Make a ".reg/999" section. */
2455 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 2456 size, note->descpos + offset);
d37c89e5
AM
2457}
2458
2459static bfd_boolean
2460ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2461{
2462 if (note->descsz != 136)
2463 return FALSE;
2464
2465 elf_tdata (abfd)->core_program
2466 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2467 elf_tdata (abfd)->core_command
2468 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2469
2470 return TRUE;
2471}
2472
5bd4f169
AM
2473/* Merge backend specific data from an object file to the output
2474 object file when linking. */
2f6d9989 2475
b34976b6 2476static bfd_boolean
4ce794b7 2477ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
5bd4f169 2478{
5bd4f169
AM
2479 /* Check if we have the same endianess. */
2480 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
87e226ce 2481 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
5bd4f169
AM
2482 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2483 {
2484 const char *msg;
2485
2486 if (bfd_big_endian (ibfd))
d003868e 2487 msg = _("%B: compiled for a big endian system "
4ce794b7 2488 "and target is little endian");
5bd4f169 2489 else
d003868e 2490 msg = _("%B: compiled for a little endian system "
4ce794b7 2491 "and target is big endian");
5bd4f169 2492
d003868e 2493 (*_bfd_error_handler) (msg, ibfd);
5bd4f169
AM
2494
2495 bfd_set_error (bfd_error_wrong_format);
b34976b6 2496 return FALSE;
5bd4f169
AM
2497 }
2498
b34976b6 2499 return TRUE;
5bd4f169 2500}
f0abc2a1 2501
5d35169e
AM
2502/* Add extra PPC sections. */
2503
2504static struct bfd_elf_special_section const ppc64_elf_special_sections[]=
2505{
7dcb9820
AM
2506 { ".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2507 { ".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2508 { ".plt", 4, 0, SHT_NOBITS, 0 },
2509 { ".toc", 4, 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2510 { ".toc1", 5, 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2511 { ".tocbss", 7, 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2512 { NULL, 0, 0, 0, 0 }
5d35169e
AM
2513};
2514
f0abc2a1
AM
2515struct _ppc64_elf_section_data
2516{
2517 struct bfd_elf_section_data elf;
411e1bfb
AM
2518
2519 /* An array with one entry for each opd function descriptor. */
f0abc2a1
AM
2520 union
2521 {
411e1bfb 2522 /* Points to the function code section for local opd entries. */
f0abc2a1 2523 asection **func_sec;
411e1bfb 2524 /* After editing .opd, adjust references to opd local syms. */
f0abc2a1
AM
2525 long *adjust;
2526 } opd;
411e1bfb
AM
2527
2528 /* An array for toc sections, indexed by offset/8.
2529 Specifies the relocation symbol index used at a given toc offset. */
2530 unsigned *t_symndx;
f0abc2a1
AM
2531};
2532
2533#define ppc64_elf_section_data(sec) \
411e1bfb 2534 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
f0abc2a1
AM
2535
2536static bfd_boolean
4ce794b7 2537ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1
AM
2538{
2539 struct _ppc64_elf_section_data *sdata;
2540 bfd_size_type amt = sizeof (*sdata);
2541
4ce794b7 2542 sdata = bfd_zalloc (abfd, amt);
f0abc2a1
AM
2543 if (sdata == NULL)
2544 return FALSE;
4ce794b7 2545 sec->used_by_bfd = sdata;
f0abc2a1
AM
2546
2547 return _bfd_elf_new_section_hook (abfd, sec);
2548}
4025353c
AM
2549
2550static void *
2551get_opd_info (asection * sec)
2552{
2553 if (sec != NULL
2554 && ppc64_elf_section_data (sec) != NULL
2555 && ppc64_elf_section_data (sec)->opd.adjust != NULL)
2556 return ppc64_elf_section_data (sec)->opd.adjust;
2557 return NULL;
2558}
90e3cdf2
JJ
2559\f
2560/* Parameters for the qsort hook. */
2561static asection *synthetic_opd;
2562static bfd_boolean synthetic_relocatable;
2563
699733f6 2564/* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
90e3cdf2
JJ
2565
2566static int
2567compare_symbols (const void *ap, const void *bp)
2568{
2569 const asymbol *a = * (const asymbol **) ap;
2570 const asymbol *b = * (const asymbol **) bp;
2571
699733f6
AM
2572 /* Section symbols first. */
2573 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
90e3cdf2 2574 return -1;
699733f6 2575 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
90e3cdf2
JJ
2576 return 1;
2577
699733f6 2578 /* then .opd symbols. */
90e3cdf2
JJ
2579 if (a->section == synthetic_opd && b->section != synthetic_opd)
2580 return -1;
2581 if (a->section != synthetic_opd && b->section == synthetic_opd)
2582 return 1;
2583
699733f6 2584 /* then other code symbols. */
90e3cdf2
JJ
2585 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2586 == (SEC_CODE | SEC_ALLOC)
2587 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2588 != (SEC_CODE | SEC_ALLOC))
2589 return -1;
2590
2591 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2592 != (SEC_CODE | SEC_ALLOC)
2593 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2594 == (SEC_CODE | SEC_ALLOC))
2595 return 1;
2596
2597 if (synthetic_relocatable)
2598 {
2599 if (a->section->id < b->section->id)
2600 return -1;
2601
2602 if (a->section->id > b->section->id)
2603 return 1;
2604 }
2605
2606 if (a->value + a->section->vma < b->value + b->section->vma)
2607 return -1;
2608
2609 if (a->value + a->section->vma > b->value + b->section->vma)
2610 return 1;
2611
2612 return 0;
2613}
2614
699733f6 2615/* Search SYMS for a symbol of the given VALUE. */
90e3cdf2 2616
699733f6
AM
2617static asymbol *
2618sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
90e3cdf2 2619{
699733f6 2620 long mid;
90e3cdf2 2621
699733f6
AM
2622 if (id == -1)
2623 {
2624 while (lo < hi)
2625 {
2626 mid = (lo + hi) >> 1;
2627 if (syms[mid]->value + syms[mid]->section->vma < value)
2628 lo = mid + 1;
2629 else if (syms[mid]->value + syms[mid]->section->vma > value)
2630 hi = mid;
2631 else
2632 return syms[mid];
2633 }
2634 }
2635 else
2636 {
2637 while (lo < hi)
2638 {
2639 mid = (lo + hi) >> 1;
2640 if (syms[mid]->section->id < id)
2641 lo = mid + 1;
2642 else if (syms[mid]->section->id > id)
2643 hi = mid;
2644 else if (syms[mid]->value < value)
2645 lo = mid + 1;
2646 else if (syms[mid]->value > value)
2647 hi = mid;
2648 else
2649 return syms[mid];
2650 }
2651 }
2652 return NULL;
90e3cdf2
JJ
2653}
2654
699733f6
AM
2655/* Create synthetic symbols, effectively restoring "dot-symbol" function
2656 entry syms. */
90e3cdf2
JJ
2657
2658static long
a7535cf3
AM
2659ppc64_elf_get_synthetic_symtab (bfd *abfd,
2660 long static_count, asymbol **static_syms,
2661 long dyn_count, asymbol **dyn_syms,
c9727e01 2662 asymbol **ret)
90e3cdf2
JJ
2663{
2664 asymbol *s;
699733f6
AM
2665 long i;
2666 long count;
90e3cdf2 2667 char *names;
a7535cf3 2668 long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
699733f6 2669 asection *opd;
90e3cdf2 2670 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 2671 asymbol **syms;
90e3cdf2
JJ
2672
2673 *ret = NULL;
2674
2675 opd = bfd_get_section_by_name (abfd, ".opd");
2676 if (opd == NULL)
2677 return 0;
2678
a7535cf3 2679 symcount = static_count;
c9727e01 2680 if (!relocatable)
a7535cf3 2681 symcount += dyn_count;
90e3cdf2 2682 if (symcount == 0)
c9727e01 2683 return 0;
90e3cdf2 2684
a7535cf3
AM
2685 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2686 if (syms == NULL)
2687 return 0;
2688
2689 if (!relocatable && static_count != 0 && dyn_count != 0)
2690 {
2691 /* Use both symbol tables. */
2692 memcpy (syms, static_syms, static_count * sizeof (*syms));
2693 memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
2694 }
2695 else if (!relocatable && static_count == 0)
2696 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
2697 else
2698 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
2699
90e3cdf2
JJ
2700 synthetic_opd = opd;
2701 synthetic_relocatable = relocatable;
595da8c5 2702 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 2703
c9727e01
AM
2704 if (!relocatable && symcount > 1)
2705 {
2706 long j;
2707 /* Trim duplicate syms, since we may have merged the normal and
2708 dynamic symbols. Actually, we only care about syms that have
2709 different values, so trim any with the same value. */
2710 for (i = 1, j = 1; i < symcount; ++i)
2711 if (syms[i - 1]->value + syms[i - 1]->section->vma
2712 != syms[i]->value + syms[i]->section->vma)
2713 syms[j++] = syms[i];
2714 symcount = j;
2715 }
2716
699733f6
AM
2717 i = 0;
2718 if (syms[i]->section == opd)
2719 ++i;
2720 codesecsym = i;
90e3cdf2 2721
699733f6
AM
2722 for (; i < symcount; ++i)
2723 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2724 != (SEC_CODE | SEC_ALLOC))
2725 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
2726 break;
2727 codesecsymend = i;
90e3cdf2 2728
699733f6
AM
2729 for (; i < symcount; ++i)
2730 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2731 break;
2732 secsymend = i;
90e3cdf2 2733
699733f6
AM
2734 for (; i < symcount; ++i)
2735 if (syms[i]->section != opd)
2736 break;
2737 opdsymend = i;
90e3cdf2 2738
699733f6
AM
2739 for (; i < symcount; ++i)
2740 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2741 != (SEC_CODE | SEC_ALLOC))
2742 break;
2743 symcount = i;
2744
c9727e01 2745 count = 0;
699733f6 2746 if (opdsymend == secsymend)
c9727e01 2747 goto done;
90e3cdf2 2748
699733f6 2749 if (relocatable)
90e3cdf2 2750 {
699733f6
AM
2751 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2752 arelent *r;
2753 size_t size;
2754 long relcount;
90e3cdf2 2755
699733f6 2756 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2
JJ
2757 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
2758
2759 if (! relcount
595da8c5 2760 || ! (*slurp_relocs) (abfd, opd, static_syms, FALSE))
c9727e01 2761 goto done;
90e3cdf2 2762
699733f6 2763 size = 0;
595da8c5 2764 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
2765 {
2766 asymbol *sym;
90e3cdf2 2767
595da8c5 2768 while (r < opd->relocation + relcount
699733f6
AM
2769 && r->address < syms[i]->value + opd->vma)
2770 ++r;
90e3cdf2 2771
595da8c5 2772 if (r == opd->relocation + relcount)
699733f6 2773 break;
90e3cdf2 2774
699733f6
AM
2775 if (r->address != syms[i]->value + opd->vma)
2776 continue;
90e3cdf2 2777
699733f6
AM
2778 if (r->howto->type != R_PPC64_ADDR64)
2779 continue;
90e3cdf2 2780
699733f6
AM
2781 sym = *r->sym_ptr_ptr;
2782 if (!sym_exists_at (syms, opdsymend, symcount,
2783 sym->section->id, sym->value + r->addend))
2784 {
2785 ++count;
2786 size += sizeof (asymbol);
2787 size += strlen (syms[i]->name) + 2;
2788 }
2789 }
90e3cdf2 2790
699733f6
AM
2791 s = *ret = bfd_malloc (size);
2792 if (s == NULL)
2793 {
c9727e01
AM
2794 count = 0;
2795 goto done;
699733f6 2796 }
90e3cdf2 2797
699733f6 2798 names = (char *) (s + count);
90e3cdf2 2799
595da8c5 2800 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 2801 {
699733f6 2802 asymbol *sym;
90e3cdf2 2803
595da8c5 2804 while (r < opd->relocation + relcount
699733f6
AM
2805 && r->address < syms[i]->value + opd->vma)
2806 ++r;
90e3cdf2 2807
595da8c5 2808 if (r == opd->relocation + relcount)
699733f6
AM
2809 break;
2810
2811 if (r->address != syms[i]->value + opd->vma)
2812 continue;
2813
2814 if (r->howto->type != R_PPC64_ADDR64)
2815 continue;
90e3cdf2 2816
699733f6
AM
2817 sym = *r->sym_ptr_ptr;
2818 if (!sym_exists_at (syms, opdsymend, symcount,
2819 sym->section->id, sym->value + r->addend))
2820 {
2821 size_t len;
2822
2823 *s = *syms[i];
2824 s->section = sym->section;
2825 s->value = sym->value + r->addend;
2826 s->name = names;
2827 *names++ = '.';
2828 len = strlen (syms[i]->name);
2829 memcpy (names, syms[i]->name, len + 1);
2830 names += len + 1;
2831 s++;
2832 }
2833 }
2834 }
2835 else
90e3cdf2 2836 {
699733f6
AM
2837 bfd_byte *contents;
2838 size_t size;
90e3cdf2 2839
699733f6
AM
2840 if (!bfd_malloc_and_get_section (abfd, opd, &contents))
2841 {
2842 if (contents)
c9727e01
AM
2843 {
2844 free_contents_and_exit:
2845 free (contents);
2846 }
2847 goto done;
699733f6 2848 }
90e3cdf2 2849
699733f6
AM
2850 size = 0;
2851 for (i = secsymend; i < opdsymend; ++i)
2852 {
2853 bfd_vma ent;
90e3cdf2 2854
699733f6
AM
2855 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2856 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2857 {
2858 ++count;
2859 size += sizeof (asymbol);
2860 size += strlen (syms[i]->name) + 2;
2861 }
2862 }
90e3cdf2 2863
699733f6
AM
2864 s = *ret = bfd_malloc (size);
2865 if (s == NULL)
2866 {
c9727e01
AM
2867 count = 0;
2868 goto free_contents_and_exit;
699733f6 2869 }
90e3cdf2 2870
699733f6 2871 names = (char *) (s + count);
90e3cdf2 2872
699733f6 2873 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 2874 {
699733f6 2875 bfd_vma ent;
90e3cdf2 2876
699733f6
AM
2877 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2878 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 2879 {
c9727e01 2880 long lo, hi;
699733f6 2881 size_t len;
c9727e01 2882 asection *sec = abfd->sections;
90e3cdf2 2883
699733f6
AM
2884 *s = *syms[i];
2885 lo = codesecsym;
2886 hi = codesecsymend;
2887 while (lo < hi)
2888 {
c9727e01 2889 long mid = (lo + hi) >> 1;
699733f6
AM
2890 if (syms[mid]->section->vma < ent)
2891 lo = mid + 1;
2892 else if (syms[mid]->section->vma > ent)
2893 hi = mid;
2894 else
c9727e01
AM
2895 {
2896 sec = syms[mid]->section;
2897 break;
2898 }
699733f6
AM
2899 }
2900
c9727e01 2901 if (lo >= hi && lo > codesecsym)
699733f6 2902 sec = syms[lo - 1]->section;
699733f6
AM
2903
2904 for (; sec != NULL; sec = sec->next)
2905 {
2906 if (sec->vma > ent)
2907 break;
2908 if ((sec->flags & SEC_ALLOC) == 0
2909 || (sec->flags & SEC_LOAD) == 0)
2910 break;
2911 if ((sec->flags & SEC_CODE) != 0)
2912 s->section = sec;
2913 }
2914 s->value = ent - s->section->vma;
2915 s->name = names;
2916 *names++ = '.';
2917 len = strlen (syms[i]->name);
2918 memcpy (names, syms[i]->name, len + 1);
2919 names += len + 1;
2920 s++;
90e3cdf2 2921 }
90e3cdf2 2922 }
699733f6 2923 free (contents);
90e3cdf2
JJ
2924 }
2925
c9727e01 2926 done:
a7535cf3 2927 free (syms);
90e3cdf2
JJ
2928 return count;
2929}
5bd4f169 2930\f
65f38f15
AM
2931/* The following functions are specific to the ELF linker, while
2932 functions above are used generally. Those named ppc64_elf_* are
2933 called by the main ELF linker code. They appear in this file more
2934 or less in the order in which they are called. eg.
2935 ppc64_elf_check_relocs is called early in the link process,
2936 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
2937 called.
2938
2939 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2940 functions have both a function code symbol and a function descriptor
2941 symbol. A call to foo in a relocatable object file looks like:
2942
2943 . .text
2944 . x:
2945 . bl .foo
2946 . nop
2947
2948 The function definition in another object file might be:
2949
2950 . .section .opd
2951 . foo: .quad .foo
2952 . .quad .TOC.@tocbase
2953 . .quad 0
2954 .
2955 . .text
2956 . .foo: blr
2957
2958 When the linker resolves the call during a static link, the branch
2959 unsurprisingly just goes to .foo and the .opd information is unused.
2960 If the function definition is in a shared library, things are a little
2961 different: The call goes via a plt call stub, the opd information gets
2962 copied to the plt, and the linker patches the nop.
2963
2964 . x:
2965 . bl .foo_stub
2966 . ld 2,40(1)
2967 .
2968 .
2969 . .foo_stub:
2970 . addis 12,2,Lfoo@toc@ha # in practice, the call stub
411e1bfb 2971 . addi 12,12,Lfoo@toc@l # is slightly optimized, but
e86ce104
AM
2972 . std 2,40(1) # this is the general idea
2973 . ld 11,0(12)
2974 . ld 2,8(12)
2975 . mtctr 11
2976 . ld 11,16(12)
2977 . bctr
2978 .
2979 . .section .plt
2980 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
2981
2982 The "reloc ()" notation is supposed to indicate that the linker emits
2983 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
2984 copying.
2985
2986 What are the difficulties here? Well, firstly, the relocations
2987 examined by the linker in check_relocs are against the function code
2988 sym .foo, while the dynamic relocation in the plt is emitted against
2989 the function descriptor symbol, foo. Somewhere along the line, we need
2990 to carefully copy dynamic link information from one symbol to the other.
2991 Secondly, the generic part of the elf linker will make .foo a dynamic
2992 symbol as is normal for most other backends. We need foo dynamic
2993 instead, at least for an application final link. However, when
2994 creating a shared library containing foo, we need to have both symbols
2995 dynamic so that references to .foo are satisfied during the early
2996 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
2997 definition from some other object, eg. a static library.
2998
2999 Update: As of August 2004, we support a new convention. Function
3000 calls may use the function descriptor symbol, ie. "bl foo". This
3001 behaves exactly as "bl .foo". */
65f38f15
AM
3002
3003/* The linker needs to keep track of the number of relocs that it
3004 decides to copy as dynamic relocs in check_relocs for each symbol.
3005 This is so that it can later discard them if they are found to be
3006 unnecessary. We store the information in a field extending the
3007 regular ELF linker hash table. */
3008
3009struct ppc_dyn_relocs
3010{
3011 struct ppc_dyn_relocs *next;
3012
3013 /* The input section of the reloc. */
3014 asection *sec;
3015
3016 /* Total number of relocs copied for the input section. */
3017 bfd_size_type count;
3018
3019 /* Number of pc-relative relocs copied for the input section. */
3020 bfd_size_type pc_count;
3021};
3022
411e1bfb
AM
3023/* Track GOT entries needed for a given symbol. We might need more
3024 than one got entry per symbol. */
3025struct got_entry
3026{
3027 struct got_entry *next;
3028
e7b938ca 3029 /* The symbol addend that we'll be placing in the GOT. */
411e1bfb
AM
3030 bfd_vma addend;
3031
e717da7e
AM
3032 /* Unlike other ELF targets, we use separate GOT entries for the same
3033 symbol referenced from different input files. This is to support
3034 automatic multiple TOC/GOT sections, where the TOC base can vary
3035 from one input file to another.
3036
3037 Point to the BFD owning this GOT entry. */
3038 bfd *owner;
3039
3040 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
3041 TLS_TPREL or TLS_DTPREL for tls entries. */
3042 char tls_type;
3043
e7b938ca 3044 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
411e1bfb
AM
3045 union
3046 {
3047 bfd_signed_vma refcount;
3048 bfd_vma offset;
3049 } got;
411e1bfb
AM
3050};
3051
3052/* The same for PLT. */
3053struct plt_entry
3054{
3055 struct plt_entry *next;
3056
3057 bfd_vma addend;
3058
3059 union
3060 {
3061 bfd_signed_vma refcount;
3062 bfd_vma offset;
3063 } plt;
3064};
3065
65f38f15 3066/* Of those relocs that might be copied as dynamic relocs, this macro
58ac9f71
AM
3067 selects those that must be copied when linking a shared library,
3068 even when the symbol is local. */
65f38f15 3069
411e1bfb 3070#define MUST_BE_DYN_RELOC(RTYPE) \
805fc799
AM
3071 ((RTYPE) != R_PPC64_REL32 \
3072 && (RTYPE) != R_PPC64_REL64 \
04c9666a 3073 && (RTYPE) != R_PPC64_REL30)
65f38f15 3074
f4656909
AM
3075/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3076 copying dynamic variables from a shared lib into an app's dynbss
3077 section, and instead use a dynamic relocation to point into the
5d35169e
AM
3078 shared lib. With code that gcc generates, it's vital that this be
3079 enabled; In the PowerPC64 ABI, the address of a function is actually
3080 the address of a function descriptor, which resides in the .opd
3081 section. gcc uses the descriptor directly rather than going via the
3082 GOT as some other ABI's do, which means that initialized function
3083 pointers must reference the descriptor. Thus, a function pointer
3084 initialized to the address of a function in a shared library will
3085 either require a copy reloc, or a dynamic reloc. Using a copy reloc
4cc11e76 3086 redefines the function descriptor symbol to point to the copy. This
5d35169e
AM
3087 presents a problem as a plt entry for that function is also
3088 initialized from the function descriptor symbol and the copy reloc
3089 may not be initialized first. */
a23b6845 3090#define ELIMINATE_COPY_RELOCS 1
f4656909 3091
721956f4
AM
3092/* Section name for stubs is the associated section name plus this
3093 string. */
3094#define STUB_SUFFIX ".stub"
3095
3096/* Linker stubs.
3097 ppc_stub_long_branch:
3098 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3099 destination, but a 24 bit branch in a stub section will reach.
3100 . b dest
3101
3102 ppc_stub_plt_branch:
3103 Similar to the above, but a 24 bit branch in the stub section won't
3104 reach its destination.
87e226ce
AM
3105 . addis %r12,%r2,xxx@toc@ha
3106 . ld %r11,xxx@toc@l(%r12)
721956f4
AM
3107 . mtctr %r11
3108 . bctr
3109
3110 ppc_stub_plt_call:
2c66dc6c
AM
3111 Used to call a function in a shared library. If it so happens that
3112 the plt entry referenced crosses a 64k boundary, then an extra
3113 "addis %r12,%r12,1" will be inserted before the load at xxx+8 or
3114 xxx+16 as appropriate.
87e226ce 3115 . addis %r12,%r2,xxx@toc@ha
721956f4 3116 . std %r2,40(%r1)
87e226ce
AM
3117 . ld %r11,xxx+0@toc@l(%r12)
3118 . ld %r2,xxx+8@toc@l(%r12)
721956f4 3119 . mtctr %r11
87e226ce 3120 . ld %r11,xxx+16@toc@l(%r12)
721956f4 3121 . bctr
ad8e1ba5
AM
3122
3123 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3124 code to adjust the value and save r2 to support multiple toc sections.
3125 A ppc_stub_long_branch with an r2 offset looks like:
3126 . std %r2,40(%r1)
3127 . addis %r2,%r2,off@ha
3128 . addi %r2,%r2,off@l
3129 . b dest
3130
3131 A ppc_stub_plt_branch with an r2 offset looks like:
3132 . std %r2,40(%r1)
3133 . addis %r12,%r2,xxx@toc@ha
3134 . ld %r11,xxx@toc@l(%r12)
3135 . addis %r2,%r2,off@ha
3136 . addi %r2,%r2,off@l
3137 . mtctr %r11
3138 . bctr
721956f4
AM
3139*/
3140
3141enum ppc_stub_type {
3142 ppc_stub_none,
3143 ppc_stub_long_branch,
ad8e1ba5 3144 ppc_stub_long_branch_r2off,
721956f4 3145 ppc_stub_plt_branch,
ad8e1ba5 3146 ppc_stub_plt_branch_r2off,
721956f4
AM
3147 ppc_stub_plt_call
3148};
3149
3150struct ppc_stub_hash_entry {
3151
3152 /* Base hash table entry structure. */
3153 struct bfd_hash_entry root;
3154
ad8e1ba5
AM
3155 enum ppc_stub_type stub_type;
3156
721956f4
AM
3157 /* The stub section. */
3158 asection *stub_sec;
3159
3160 /* Offset within stub_sec of the beginning of this stub. */
3161 bfd_vma stub_offset;
3162
3163 /* Given the symbol's value and its section we can determine its final
3164 value when building the stubs (so the stub knows where to jump. */
3165 bfd_vma target_value;
3166 asection *target_section;
3167
721956f4
AM
3168 /* The symbol table entry, if any, that this was derived from. */
3169 struct ppc_link_hash_entry *h;
3170
411e1bfb
AM
3171 /* And the reloc addend that this was derived from. */
3172 bfd_vma addend;
3173
721956f4
AM
3174 /* Where this stub is being called from, or, in the case of combined
3175 stub sections, the first input section in the group. */
3176 asection *id_sec;
3177};
3178
3179struct ppc_branch_hash_entry {
3180
3181 /* Base hash table entry structure. */
3182 struct bfd_hash_entry root;
3183
3184 /* Offset within .branch_lt. */
3185 unsigned int offset;
3186
3187 /* Generation marker. */
3188 unsigned int iter;
3189};
65f38f15
AM
3190
3191struct ppc_link_hash_entry
3192{
3193 struct elf_link_hash_entry elf;
3194
721956f4
AM
3195 /* A pointer to the most recently used stub hash entry against this
3196 symbol. */
3197 struct ppc_stub_hash_entry *stub_cache;
3198
65f38f15
AM
3199 /* Track dynamic relocs copied for this symbol. */
3200 struct ppc_dyn_relocs *dyn_relocs;
e86ce104 3201
721956f4 3202 /* Link between function code and descriptor symbols. */
34814b9f 3203 struct ppc_link_hash_entry *oh;
721956f4 3204
e86ce104
AM
3205 /* Flag function code and descriptor symbols. */
3206 unsigned int is_func:1;
3207 unsigned int is_func_descriptor:1;
411e1bfb 3208
8843416a
AM
3209 /* Whether global opd sym has been adjusted or not.
3210 After ppc64_elf_edit_opd has run, this flag should be set for all
3211 globals defined in any opd section. */
754021d0
AM
3212 unsigned int adjust_done:1;
3213
99877b66
AM
3214 /* Set if we twiddled this symbol to weak at some stage. */
3215 unsigned int was_undefined:1;
3216
411e1bfb 3217 /* Contexts in which symbol is used in the GOT (or TOC).
e7b938ca
AM
3218 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3219 corresponding relocs are encountered during check_relocs.
3220 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3221 indicate the corresponding GOT entry type is not needed.
3222 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3223 a TPREL one. We use a separate flag rather than setting TPREL
3224 just for convenience in distinguishing the two cases. */
3225#define TLS_GD 1 /* GD reloc. */
3226#define TLS_LD 2 /* LD reloc. */
3227#define TLS_TPREL 4 /* TPREL reloc, => IE. */
3228#define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
3229#define TLS_TLS 16 /* Any TLS reloc. */
3230#define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
3231#define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
3232 char tls_mask;
65f38f15
AM
3233};
3234
3235/* ppc64 ELF linker hash table. */
3236
3237struct ppc_link_hash_table
3238{
3239 struct elf_link_hash_table elf;
3240
721956f4
AM
3241 /* The stub hash table. */
3242 struct bfd_hash_table stub_hash_table;
3243
3244 /* Another hash table for plt_branch stubs. */
3245 struct bfd_hash_table branch_hash_table;
3246
3247 /* Linker stub bfd. */
3248 bfd *stub_bfd;
3249
3250 /* Linker call-backs. */
4ce794b7
AM
3251 asection * (*add_stub_section) (const char *, asection *);
3252 void (*layout_sections_again) (void);
721956f4
AM
3253
3254 /* Array to keep track of which stub sections have been created, and
3255 information on stub grouping. */
3256 struct map_stub {
3257 /* This is the section to which stubs in the group will be attached. */
3258 asection *link_sec;
3259 /* The stub section. */
3260 asection *stub_sec;
ad8e1ba5
AM
3261 /* Along with elf_gp, specifies the TOC pointer used in this group. */
3262 bfd_vma toc_off;
721956f4
AM
3263 } *stub_group;
3264
ad8e1ba5
AM
3265 /* Temp used when calculating TOC pointers. */
3266 bfd_vma toc_curr;
3267
8f3bab57
AM
3268 /* Highest input section id. */
3269 int top_id;
3270
734b6cf9
AM
3271 /* Highest output section index. */
3272 int top_index;
3273
3274 /* List of input sections for each output section. */
3275 asection **input_list;
721956f4 3276
65f38f15 3277 /* Short-cuts to get to dynamic linker sections. */
4ce794b7 3278 asection *got;
4ce794b7
AM
3279 asection *plt;
3280 asection *relplt;
3281 asection *dynbss;
3282 asection *relbss;
3283 asection *glink;
82bd7b59 3284 asection *sfpr;
4ce794b7
AM
3285 asection *brlt;
3286 asection *relbrlt;
ec338859 3287
8387904d
AM
3288 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3289 struct ppc_link_hash_entry *tls_get_addr;
3290 struct ppc_link_hash_entry *tls_get_addr_fd;
411e1bfb 3291
9b5ecbd0
AM
3292 /* Statistics. */
3293 unsigned long stub_count[ppc_stub_plt_call];
3294
ee75fd95
AM
3295 /* Number of stubs against global syms. */
3296 unsigned long stub_globals;
3297
ad8e1ba5 3298 /* Set if we should emit symbols for stubs. */
99877b66 3299 unsigned int emit_stub_syms:1;
ad8e1ba5 3300
5d1634d7 3301 /* Set on error. */
99877b66 3302 unsigned int stub_error:1;
721956f4
AM
3303
3304 /* Flag set when small branches are detected. Used to
3305 select suitable defaults for the stub group size. */
99877b66
AM
3306 unsigned int has_14bit_branch:1;
3307
3308 /* Temp used by ppc64_elf_check_directives. */
3309 unsigned int twiddled_syms:1;
721956f4
AM
3310
3311 /* Incremented every time we size stubs. */
3312 unsigned int stub_iteration;
5d1634d7 3313
ec338859
AM
3314 /* Small local sym to section mapping cache. */
3315 struct sym_sec_cache sym_sec;
65f38f15
AM
3316};
3317
3318/* Get the ppc64 ELF linker hash table from a link_info structure. */
3319
3320#define ppc_hash_table(p) \
3321 ((struct ppc_link_hash_table *) ((p)->hash))
3322
721956f4
AM
3323#define ppc_stub_hash_lookup(table, string, create, copy) \
3324 ((struct ppc_stub_hash_entry *) \
3325 bfd_hash_lookup ((table), (string), (create), (copy)))
3326
3327#define ppc_branch_hash_lookup(table, string, create, copy) \
3328 ((struct ppc_branch_hash_entry *) \
3329 bfd_hash_lookup ((table), (string), (create), (copy)))
3330
3331/* Create an entry in the stub hash table. */
3332
3333static struct bfd_hash_entry *
4ce794b7
AM
3334stub_hash_newfunc (struct bfd_hash_entry *entry,
3335 struct bfd_hash_table *table,
3336 const char *string)
721956f4
AM
3337{
3338 /* Allocate the structure if it has not already been allocated by a
3339 subclass. */
3340 if (entry == NULL)
3341 {
3342 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3343 if (entry == NULL)
3344 return entry;
3345 }
3346
3347 /* Call the allocation method of the superclass. */
3348 entry = bfd_hash_newfunc (entry, table, string);
3349 if (entry != NULL)
3350 {
3351 struct ppc_stub_hash_entry *eh;
3352
3353 /* Initialize the local fields. */
3354 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 3355 eh->stub_type = ppc_stub_none;
721956f4
AM
3356 eh->stub_sec = NULL;
3357 eh->stub_offset = 0;
3358 eh->target_value = 0;
3359 eh->target_section = NULL;
721956f4
AM
3360 eh->h = NULL;
3361 eh->id_sec = NULL;
3362 }
3363
3364 return entry;
3365}
3366
3367/* Create an entry in the branch hash table. */
3368
3369static struct bfd_hash_entry *
4ce794b7
AM
3370branch_hash_newfunc (struct bfd_hash_entry *entry,
3371 struct bfd_hash_table *table,
3372 const char *string)
721956f4
AM
3373{
3374 /* Allocate the structure if it has not already been allocated by a
3375 subclass. */
3376 if (entry == NULL)
3377 {
3378 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3379 if (entry == NULL)
3380 return entry;
3381 }
3382
3383 /* Call the allocation method of the superclass. */
3384 entry = bfd_hash_newfunc (entry, table, string);
3385 if (entry != NULL)
3386 {
3387 struct ppc_branch_hash_entry *eh;
3388
3389 /* Initialize the local fields. */
3390 eh = (struct ppc_branch_hash_entry *) entry;
3391 eh->offset = 0;
3392 eh->iter = 0;
3393 }
3394
3395 return entry;
3396}
3397
65f38f15
AM
3398/* Create an entry in a ppc64 ELF linker hash table. */
3399
3400static struct bfd_hash_entry *
4ce794b7
AM
3401link_hash_newfunc (struct bfd_hash_entry *entry,
3402 struct bfd_hash_table *table,
3403 const char *string)
65f38f15
AM
3404{
3405 /* Allocate the structure if it has not already been allocated by a
3406 subclass. */
3407 if (entry == NULL)
3408 {
3409 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3410 if (entry == NULL)
3411 return entry;
3412 }
3413
3414 /* Call the allocation method of the superclass. */
3415 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3416 if (entry != NULL)
3417 {
3418 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3419
721956f4 3420 eh->stub_cache = NULL;
65f38f15 3421 eh->dyn_relocs = NULL;
721956f4 3422 eh->oh = NULL;
e86ce104
AM
3423 eh->is_func = 0;
3424 eh->is_func_descriptor = 0;
754021d0 3425 eh->adjust_done = 0;
99877b66 3426 eh->was_undefined = 0;
e7b938ca 3427 eh->tls_mask = 0;
65f38f15
AM
3428 }
3429
3430 return entry;
3431}
3432
3433/* Create a ppc64 ELF linker hash table. */
3434
3435static struct bfd_link_hash_table *
4ce794b7 3436ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
3437{
3438 struct ppc_link_hash_table *htab;
3439 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3440
4ce794b7 3441 htab = bfd_zmalloc (amt);
65f38f15
AM
3442 if (htab == NULL)
3443 return NULL;
3444
3445 if (! _bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc))
3446 {
e2d34d7d 3447 free (htab);
65f38f15
AM
3448 return NULL;
3449 }
3450
721956f4
AM
3451 /* Init the stub hash table too. */
3452 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc))
3453 return NULL;
3454
3455 /* And the branch hash table. */
3456 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc))
3457 return NULL;
3458
3254fd24
AM
3459 /* Initializing two fields of the union is just cosmetic. We really
3460 only care about glist, but when compiled on a 32-bit host the
3461 bfd_vma fields are larger. Setting the bfd_vma to zero makes
3462 debugger inspection of these fields look nicer. */
3463 htab->elf.init_refcount.refcount = 0;
3464 htab->elf.init_refcount.glist = NULL;
3465 htab->elf.init_offset.offset = 0;
3466 htab->elf.init_offset.glist = NULL;
3467
65f38f15
AM
3468 return &htab->elf.root;
3469}
3470
721956f4
AM
3471/* Free the derived linker hash table. */
3472
3473static void
4ce794b7 3474ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
721956f4
AM
3475{
3476 struct ppc_link_hash_table *ret = (struct ppc_link_hash_table *) hash;
3477
3478 bfd_hash_table_free (&ret->stub_hash_table);
3479 bfd_hash_table_free (&ret->branch_hash_table);
3480 _bfd_generic_link_hash_table_free (hash);
3481}
3482
e717da7e
AM
3483/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
3484
3485void
3486ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
3487{
3488 struct ppc_link_hash_table *htab;
3489
3490 elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
3491
3492/* Always hook our dynamic sections into the first bfd, which is the
3493 linker created stub bfd. This ensures that the GOT header is at
3494 the start of the output TOC section. */
3495 htab = ppc_hash_table (info);
3496 htab->stub_bfd = abfd;
3497 htab->elf.dynobj = abfd;
3498}
3499
721956f4
AM
3500/* Build a name for an entry in the stub hash table. */
3501
3502static char *
4ce794b7
AM
3503ppc_stub_name (const asection *input_section,
3504 const asection *sym_sec,
3505 const struct ppc_link_hash_entry *h,
3506 const Elf_Internal_Rela *rel)
721956f4
AM
3507{
3508 char *stub_name;
3509 bfd_size_type len;
3510
3511 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3512 offsets from a sym as a branch target? In fact, we could
3513 probably assume the addend is always zero. */
3514 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3515
3516 if (h)
3517 {
3518 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3519 stub_name = bfd_malloc (len);
3520 if (stub_name != NULL)
3521 {
97b639ba 3522 sprintf (stub_name, "%08x.%s+%x",
721956f4
AM
3523 input_section->id & 0xffffffff,
3524 h->elf.root.root.string,
3525 (int) rel->r_addend & 0xffffffff);
3526 }
3527 }
3528 else
3529 {
ad8e1ba5 3530 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4
AM
3531 stub_name = bfd_malloc (len);
3532 if (stub_name != NULL)
3533 {
97b639ba 3534 sprintf (stub_name, "%08x.%x:%x+%x",
721956f4
AM
3535 input_section->id & 0xffffffff,
3536 sym_sec->id & 0xffffffff,
3537 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3538 (int) rel->r_addend & 0xffffffff);
3539 }
3540 }
ee75fd95
AM
3541 if (stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
3542 stub_name[len - 2] = 0;
721956f4
AM
3543 return stub_name;
3544}
3545
3546/* Look up an entry in the stub hash. Stub entries are cached because
3547 creating the stub name takes a bit of time. */
3548
3549static struct ppc_stub_hash_entry *
4ce794b7
AM
3550ppc_get_stub_entry (const asection *input_section,
3551 const asection *sym_sec,
039b3fef 3552 struct ppc_link_hash_entry *h,
4ce794b7
AM
3553 const Elf_Internal_Rela *rel,
3554 struct ppc_link_hash_table *htab)
721956f4
AM
3555{
3556 struct ppc_stub_hash_entry *stub_entry;
721956f4
AM
3557 const asection *id_sec;
3558
3559 /* If this input section is part of a group of sections sharing one
3560 stub section, then use the id of the first section in the group.
3561 Stub names need to include a section id, as there may well be
3562 more than one stub used to reach say, printf, and we need to
3563 distinguish between them. */
3564 id_sec = htab->stub_group[input_section->id].link_sec;
3565
3566 if (h != NULL && h->stub_cache != NULL
3567 && h->stub_cache->h == h
3568 && h->stub_cache->id_sec == id_sec)
3569 {
3570 stub_entry = h->stub_cache;
3571 }
3572 else
3573 {
3574 char *stub_name;
3575
3576 stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
3577 if (stub_name == NULL)
3578 return NULL;
3579
3580 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 3581 stub_name, FALSE, FALSE);
721956f4
AM
3582 if (h != NULL)
3583 h->stub_cache = stub_entry;
3584
3585 free (stub_name);
3586 }
3587
3588 return stub_entry;
3589}
3590
3591/* Add a new stub entry to the stub hash. Not all fields of the new
3592 stub entry are initialised. */
3593
3594static struct ppc_stub_hash_entry *
4ce794b7
AM
3595ppc_add_stub (const char *stub_name,
3596 asection *section,
3597 struct ppc_link_hash_table *htab)
721956f4
AM
3598{
3599 asection *link_sec;
3600 asection *stub_sec;
3601 struct ppc_stub_hash_entry *stub_entry;
3602
3603 link_sec = htab->stub_group[section->id].link_sec;
3604 stub_sec = htab->stub_group[section->id].stub_sec;
3605 if (stub_sec == NULL)
3606 {
3607 stub_sec = htab->stub_group[link_sec->id].stub_sec;
3608 if (stub_sec == NULL)
3609 {
d4c88bbb 3610 size_t namelen;
721956f4
AM
3611 bfd_size_type len;
3612 char *s_name;
3613
d4c88bbb
AM
3614 namelen = strlen (link_sec->name);
3615 len = namelen + sizeof (STUB_SUFFIX);
721956f4
AM
3616 s_name = bfd_alloc (htab->stub_bfd, len);
3617 if (s_name == NULL)
3618 return NULL;
3619
d4c88bbb
AM
3620 memcpy (s_name, link_sec->name, namelen);
3621 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
721956f4
AM
3622 stub_sec = (*htab->add_stub_section) (s_name, link_sec);
3623 if (stub_sec == NULL)
3624 return NULL;
3625 htab->stub_group[link_sec->id].stub_sec = stub_sec;
3626 }
3627 htab->stub_group[section->id].stub_sec = stub_sec;
3628 }
3629
3630 /* Enter this entry into the linker stub hash table. */
3631 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 3632 TRUE, FALSE);
721956f4
AM
3633 if (stub_entry == NULL)
3634 {
d003868e
AM
3635 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
3636 section->owner, stub_name);
721956f4
AM
3637 return NULL;
3638 }
3639
3640 stub_entry->stub_sec = stub_sec;
3641 stub_entry->stub_offset = 0;
3642 stub_entry->id_sec = link_sec;
3643 return stub_entry;
3644}
3645
82bd7b59
AM
3646/* Create sections for linker generated code. */
3647
b34976b6 3648static bfd_boolean
4ce794b7 3649create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
82bd7b59
AM
3650{
3651 struct ppc_link_hash_table *htab;
3652 flagword flags;
3653
3654 htab = ppc_hash_table (info);
3655
3656 /* Create .sfpr for code to save and restore fp regs. */
3657 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3658 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
721956f4 3659 htab->sfpr = bfd_make_section_anyway (dynobj, ".sfpr");
82bd7b59
AM
3660 if (htab->sfpr == NULL
3661 || ! bfd_set_section_flags (dynobj, htab->sfpr, flags)
3662 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
b34976b6 3663 return FALSE;
82bd7b59 3664
721956f4 3665 /* Create .glink for lazy dynamic linking support. */
4ce794b7
AM
3666 htab->glink = bfd_make_section_anyway (dynobj, ".glink");
3667 if (htab->glink == NULL
3668 || ! bfd_set_section_flags (dynobj, htab->glink, flags)
3669 || ! bfd_set_section_alignment (dynobj, htab->glink, 2))
b34976b6 3670 return FALSE;
82bd7b59 3671
721956f4
AM
3672 /* Create .branch_lt for plt_branch stubs. */
3673 flags = (SEC_ALLOC | SEC_LOAD
3674 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4ce794b7
AM
3675 htab->brlt = bfd_make_section_anyway (dynobj, ".branch_lt");
3676 if (htab->brlt == NULL
3677 || ! bfd_set_section_flags (dynobj, htab->brlt, flags)
3678 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
b34976b6 3679 return FALSE;
721956f4 3680
ee75fd95 3681 if (info->shared || info->emitrelocations)
721956f4
AM
3682 {
3683 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3684 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4ce794b7
AM
3685 htab->relbrlt = bfd_make_section_anyway (dynobj, ".rela.branch_lt");
3686 if (!htab->relbrlt
3687 || ! bfd_set_section_flags (dynobj, htab->relbrlt, flags)
3688 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
b34976b6 3689 return FALSE;
721956f4 3690 }
b34976b6 3691 return TRUE;
82bd7b59
AM
3692}
3693
e717da7e
AM
3694/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3695 not already done. */
65f38f15 3696
b34976b6 3697static bfd_boolean
e717da7e 3698create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 3699{
e717da7e
AM
3700 asection *got, *relgot;
3701 flagword flags;
3702 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 3703
4ce794b7 3704 if (!htab->got)
e717da7e
AM
3705 {
3706 if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
3707 return FALSE;
3708
3709 htab->got = bfd_get_section_by_name (htab->elf.dynobj, ".got");
3710 if (!htab->got)
3711 abort ();
3712 }
3713
3714 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3715 | SEC_LINKER_CREATED);
3716
3717 got = bfd_make_section (abfd, ".got");
3718 if (!got
3719 || !bfd_set_section_flags (abfd, got, flags)
3720 || !bfd_set_section_alignment (abfd, got, 3))
3721 return FALSE;
65f38f15 3722
e717da7e
AM
3723 relgot = bfd_make_section (abfd, ".rela.got");
3724 if (!relgot
3725 || ! bfd_set_section_flags (abfd, relgot, flags | SEC_READONLY)
3726 || ! bfd_set_section_alignment (abfd, relgot, 3))
b34976b6 3727 return FALSE;
e717da7e
AM
3728
3729 ppc64_elf_tdata (abfd)->got = got;
3730 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 3731 return TRUE;
65f38f15 3732}
5bd4f169 3733
82bd7b59 3734/* Create the dynamic sections, and set up shortcuts. */
5bd4f169 3735
b34976b6 3736static bfd_boolean
4ce794b7 3737ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
5bd4f169 3738{
65f38f15 3739 struct ppc_link_hash_table *htab;
5bd4f169 3740
65f38f15 3741 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
b34976b6 3742 return FALSE;
65f38f15 3743
e717da7e
AM
3744 htab = ppc_hash_table (info);
3745 if (!htab->got)
3746 htab->got = bfd_get_section_by_name (dynobj, ".got");
4ce794b7
AM
3747 htab->plt = bfd_get_section_by_name (dynobj, ".plt");
3748 htab->relplt = bfd_get_section_by_name (dynobj, ".rela.plt");
3749 htab->dynbss = bfd_get_section_by_name (dynobj, ".dynbss");
65f38f15 3750 if (!info->shared)
4ce794b7 3751 htab->relbss = bfd_get_section_by_name (dynobj, ".rela.bss");
65f38f15 3752
e717da7e 3753 if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
4ce794b7 3754 || (!info->shared && !htab->relbss))
65f38f15
AM
3755 abort ();
3756
b34976b6 3757 return TRUE;
5bd4f169
AM
3758}
3759
65f38f15
AM
3760/* Copy the extra info we tack onto an elf_link_hash_entry. */
3761
3762static void
9c5bfbb7
AM
3763ppc64_elf_copy_indirect_symbol
3764 (const struct elf_backend_data *bed ATTRIBUTE_UNUSED,
3765 struct elf_link_hash_entry *dir,
3766 struct elf_link_hash_entry *ind)
65f38f15
AM
3767{
3768 struct ppc_link_hash_entry *edir, *eind;
81848ca0 3769 flagword mask;
65f38f15
AM
3770
3771 edir = (struct ppc_link_hash_entry *) dir;
3772 eind = (struct ppc_link_hash_entry *) ind;
3773
411e1bfb 3774 /* Copy over any dynamic relocs we may have on the indirect sym. */
bbd7ec4a 3775 if (eind->dyn_relocs != NULL)
65f38f15 3776 {
bbd7ec4a
AM
3777 if (edir->dyn_relocs != NULL)
3778 {
3779 struct ppc_dyn_relocs **pp;
3780 struct ppc_dyn_relocs *p;
3781
411e1bfb 3782 if (eind->elf.root.type == bfd_link_hash_indirect)
bbd7ec4a
AM
3783 abort ();
3784
3785 /* Add reloc counts against the weak sym to the strong sym
3786 list. Merge any entries against the same section. */
3787 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3788 {
3789 struct ppc_dyn_relocs *q;
3790
3791 for (q = edir->dyn_relocs; q != NULL; q = q->next)
3792 if (q->sec == p->sec)
3793 {
3794 q->pc_count += p->pc_count;
3795 q->count += p->count;
3796 *pp = p->next;
3797 break;
3798 }
3799 if (q == NULL)
3800 pp = &p->next;
3801 }
3802 *pp = edir->dyn_relocs;
3803 }
3804
65f38f15
AM
3805 edir->dyn_relocs = eind->dyn_relocs;
3806 eind->dyn_relocs = NULL;
3807 }
65f38f15 3808
6349e628
AM
3809 edir->is_func |= eind->is_func;
3810 edir->is_func_descriptor |= eind->is_func_descriptor;
58ac9f71 3811 edir->tls_mask |= eind->tls_mask;
6349e628 3812
81848ca0 3813 mask = (ELF_LINK_HASH_REF_DYNAMIC | ELF_LINK_HASH_REF_REGULAR
3addb0a9
DJ
3814 | ELF_LINK_HASH_REF_REGULAR_NONWEAK | ELF_LINK_NON_GOT_REF
3815 | ELF_LINK_HASH_NEEDS_PLT);
81848ca0
AM
3816 /* If called to transfer flags for a weakdef during processing
3817 of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
3818 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
3819 if (ELIMINATE_COPY_RELOCS
3820 && eind->elf.root.type != bfd_link_hash_indirect
3821 && (edir->elf.elf_link_hash_flags & ELF_LINK_HASH_DYNAMIC_ADJUSTED) != 0)
3822 mask &= ~ELF_LINK_NON_GOT_REF;
3823
3824 edir->elf.elf_link_hash_flags |= eind->elf.elf_link_hash_flags & mask;
6349e628
AM
3825
3826 /* If we were called to copy over info for a weak sym, that's all. */
3827 if (eind->elf.root.type != bfd_link_hash_indirect)
3828 return;
3829
81848ca0
AM
3830 /* Copy over got entries that we may have already seen to the
3831 symbol which just became indirect. */
411e1bfb
AM
3832 if (eind->elf.got.glist != NULL)
3833 {
3834 if (edir->elf.got.glist != NULL)
3835 {
3836 struct got_entry **entp;
3837 struct got_entry *ent;
3838
3839 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3840 {
3841 struct got_entry *dent;
3842
3843 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3844 if (dent->addend == ent->addend
e717da7e 3845 && dent->owner == ent->owner
411e1bfb
AM
3846 && dent->tls_type == ent->tls_type)
3847 {
3848 dent->got.refcount += ent->got.refcount;
3849 *entp = ent->next;
3850 break;
3851 }
3852 if (dent == NULL)
3853 entp = &ent->next;
3854 }
3855 *entp = edir->elf.got.glist;
3856 }
3857
3858 edir->elf.got.glist = eind->elf.got.glist;
3859 eind->elf.got.glist = NULL;
3860 }
3861
3862 /* And plt entries. */
3863 if (eind->elf.plt.plist != NULL)
3864 {
3865 if (edir->elf.plt.plist != NULL)
3866 {
3867 struct plt_entry **entp;
3868 struct plt_entry *ent;
3869
3870 for (entp = &eind->elf.plt.plist; (ent = *entp) != NULL; )
3871 {
3872 struct plt_entry *dent;
3873
3874 for (dent = edir->elf.plt.plist; dent != NULL; dent = dent->next)
3875 if (dent->addend == ent->addend)
3876 {
3877 dent->plt.refcount += ent->plt.refcount;
3878 *entp = ent->next;
3879 break;
3880 }
3881 if (dent == NULL)
3882 entp = &ent->next;
3883 }
3884 *entp = edir->elf.plt.plist;
3885 }
3886
3887 edir->elf.plt.plist = eind->elf.plt.plist;
3888 eind->elf.plt.plist = NULL;
3889 }
3890
411e1bfb
AM
3891 if (edir->elf.dynindx == -1)
3892 {
3893 edir->elf.dynindx = eind->elf.dynindx;
3894 edir->elf.dynstr_index = eind->elf.dynstr_index;
3895 eind->elf.dynindx = -1;
3896 eind->elf.dynstr_index = 0;
3897 }
3898 else
3899 BFD_ASSERT (eind->elf.dynindx == -1);
3900}
3901
8387904d
AM
3902/* Find the function descriptor hash entry from the given function code
3903 hash entry FH. Link the entries via their OH fields. */
3904
3905static struct ppc_link_hash_entry *
3906get_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
3907{
3908 struct ppc_link_hash_entry *fdh = fh->oh;
3909
3910 if (fdh == NULL)
3911 {
3912 const char *fd_name = fh->elf.root.root.string + 1;
3913
3914 fdh = (struct ppc_link_hash_entry *)
3915 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
3916 if (fdh != NULL)
3917 {
3918 fdh->is_func_descriptor = 1;
3919 fdh->oh = fh;
3920 fh->is_func = 1;
3921 fh->oh = fdh;
3922 }
3923 }
3924
3925 return fdh;
3926}
3927
3928/* Hacks to support old ABI code.
3929 When making function calls, old ABI code references function entry
3930 points (dot symbols), while new ABI code references the function
3931 descriptor symbol. We need to make any combination of reference and
3932 definition work together, without breaking archive linking.
3933
3934 For a defined function "foo" and an undefined call to "bar":
3935 An old object defines "foo" and ".foo", references ".bar" (possibly
3936 "bar" too).
3937 A new object defines "foo" and references "bar".
3938
3939 A new object thus has no problem with its undefined symbols being
3940 satisfied by definitions in an old object. On the other hand, the
3941 old object won't have ".bar" satisfied by a new object. */
3942
3943/* Fix function descriptor symbols defined in .opd sections to be
3944 function type. */
555cd476
AM
3945
3946static bfd_boolean
3947ppc64_elf_add_symbol_hook (bfd *ibfd ATTRIBUTE_UNUSED,
3948 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3949 Elf_Internal_Sym *isym,
3950 const char **name ATTRIBUTE_UNUSED,
3951 flagword *flags ATTRIBUTE_UNUSED,
3952 asection **sec,
3953 bfd_vma *value ATTRIBUTE_UNUSED)
3954{
8843416a
AM
3955 if (*sec != NULL
3956 && strcmp (bfd_get_section_name (ibfd, *sec), ".opd") == 0)
555cd476
AM
3957 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
3958 return TRUE;
3959}
3960
8387904d
AM
3961/* This function makes an old ABI object reference to ".bar" cause the
3962 inclusion of a new ABI object archive that defines "bar". */
3963
3964static struct elf_link_hash_entry *
3965ppc64_elf_archive_symbol_lookup (bfd *abfd,
3966 struct bfd_link_info *info,
3967 const char *name)
3968{
3969 struct elf_link_hash_entry *h;
3970 char *dot_name;
3971 size_t len;
3972
3973 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
3974 if (h != NULL)
3975 return h;
3976
3977 if (name[0] == '.')
3978 return h;
3979
3980 len = strlen (name);
3981 dot_name = bfd_alloc (abfd, len + 2);
3982 if (dot_name == NULL)
3983 return (struct elf_link_hash_entry *) 0 - 1;
3984 dot_name[0] = '.';
3985 memcpy (dot_name + 1, name, len + 1);
3986 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
3987 bfd_release (abfd, dot_name);
3988 return h;
3989}
3990
3991/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
3992 new ABI object defines "bar". Well, at least, undefined dot symbols
3993 are made weak. This stops later archive searches from including an
3994 object if we already have a function descriptor definition. It also
35b0ce59
AM
3995 prevents the linker complaining about undefined symbols.
3996 We also check and correct mismatched symbol visibility here. The
3997 most restrictive visibility of the function descriptor and the
3998 function entry symbol is used. */
8387904d
AM
3999
4000static bfd_boolean
4001add_symbol_adjust (struct elf_link_hash_entry *h, void *inf)
4002{
4003 struct bfd_link_info *info;
4004 struct ppc_link_hash_table *htab;
99877b66 4005 struct ppc_link_hash_entry *eh;
8387904d
AM
4006 struct ppc_link_hash_entry *fdh;
4007
4008 if (h->root.type == bfd_link_hash_indirect)
4009 return TRUE;
4010
4011 if (h->root.type == bfd_link_hash_warning)
4012 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4013
35b0ce59 4014 if (h->root.root.string[0] != '.')
8387904d
AM
4015 return TRUE;
4016
4017 info = inf;
4018 htab = ppc_hash_table (info);
99877b66
AM
4019 eh = (struct ppc_link_hash_entry *) h;
4020 fdh = get_fdh (eh, htab);
8387904d
AM
4021 if (fdh != NULL)
4022 {
35b0ce59
AM
4023 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4024 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4025 if (entry_vis < descr_vis)
4026 fdh->elf.other += entry_vis - descr_vis;
4027 else if (entry_vis > descr_vis)
4028 eh->elf.other += descr_vis - entry_vis;
4029
4030 if (eh->elf.root.type == bfd_link_hash_undefined)
4031 {
4032 eh->elf.root.type = bfd_link_hash_undefweak;
4033 eh->was_undefined = 1;
4034 htab->twiddled_syms = 1;
4035 }
8387904d 4036 }
99877b66 4037
8387904d
AM
4038 return TRUE;
4039}
4040
4041static bfd_boolean
4042ppc64_elf_check_directives (bfd *abfd ATTRIBUTE_UNUSED,
4043 struct bfd_link_info *info)
4044{
99877b66
AM
4045 struct ppc_link_hash_table *htab;
4046
4047 htab = ppc_hash_table (info);
ee75fd95 4048 if (!is_ppc64_elf_target (htab->elf.root.creator))
35b0ce59
AM
4049 return TRUE;
4050
8387904d 4051 elf_link_hash_traverse (&htab->elf, add_symbol_adjust, info);
99877b66
AM
4052
4053 /* We need to fix the undefs list for any syms we have twiddled to
4054 undef_weak. */
4055 if (htab->twiddled_syms)
4056 {
4057 struct bfd_link_hash_entry **pun;
4058
4059 pun = &htab->elf.root.undefs;
4060 while (*pun != NULL)
4061 {
4062 struct bfd_link_hash_entry *h = *pun;
4063
4064 if (h->type != bfd_link_hash_undefined
4065 && h->type != bfd_link_hash_common)
4066 {
4067 *pun = h->und_next;
4068 h->und_next = NULL;
4069 if (h == htab->elf.root.undefs_tail)
4070 {
4071 if (pun == &htab->elf.root.undefs)
4072 htab->elf.root.undefs_tail = NULL;
4073 else
4074 /* pun points at an und_next field. Go back to
4075 the start of the link_hash_entry. */
4076 htab->elf.root.undefs_tail = (struct bfd_link_hash_entry *)
4077 ((char *) pun - ((char *) &h->und_next - (char *) h));
4078 break;
4079 }
4080 }
4081 else
4082 pun = &h->und_next;
4083 }
4084
4085 htab->twiddled_syms = 0;
4086 }
8387904d
AM
4087 return TRUE;
4088}
4089
411e1bfb 4090static bfd_boolean
4ce794b7
AM
4091update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4092 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
4093{
4094 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e7b938ca 4095 char *local_got_tls_masks;
411e1bfb
AM
4096
4097 if (local_got_ents == NULL)
4098 {
4099 bfd_size_type size = symtab_hdr->sh_info;
4100
e7b938ca 4101 size *= sizeof (*local_got_ents) + sizeof (*local_got_tls_masks);
4ce794b7 4102 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb
AM
4103 if (local_got_ents == NULL)
4104 return FALSE;
4105 elf_local_got_ents (abfd) = local_got_ents;
4106 }
4107
4108 if ((tls_type & TLS_EXPLICIT) == 0)
4109 {
4110 struct got_entry *ent;
4111
4112 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
4113 if (ent->addend == r_addend
4114 && ent->owner == abfd
4115 && ent->tls_type == tls_type)
411e1bfb
AM
4116 break;
4117 if (ent == NULL)
4118 {
4119 bfd_size_type amt = sizeof (*ent);
4ce794b7 4120 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4121 if (ent == NULL)
4122 return FALSE;
4123 ent->next = local_got_ents[r_symndx];
4124 ent->addend = r_addend;
e717da7e 4125 ent->owner = abfd;
411e1bfb
AM
4126 ent->tls_type = tls_type;
4127 ent->got.refcount = 0;
4128 local_got_ents[r_symndx] = ent;
4129 }
4130 ent->got.refcount += 1;
4131 }
4132
e7b938ca
AM
4133 local_got_tls_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
4134 local_got_tls_masks[r_symndx] |= tls_type;
411e1bfb 4135 return TRUE;
65f38f15
AM
4136}
4137
411e1bfb 4138static bfd_boolean
4ce794b7 4139update_plt_info (bfd *abfd, struct ppc_link_hash_entry *eh, bfd_vma addend)
1e2f5b6e 4140{
411e1bfb 4141 struct plt_entry *ent;
1e2f5b6e 4142
411e1bfb
AM
4143 for (ent = eh->elf.plt.plist; ent != NULL; ent = ent->next)
4144 if (ent->addend == addend)
4145 break;
4146 if (ent == NULL)
1e2f5b6e 4147 {
411e1bfb 4148 bfd_size_type amt = sizeof (*ent);
4ce794b7 4149 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4150 if (ent == NULL)
4151 return FALSE;
4152 ent->next = eh->elf.plt.plist;
4153 ent->addend = addend;
4154 ent->plt.refcount = 0;
4155 eh->elf.plt.plist = ent;
1e2f5b6e 4156 }
411e1bfb
AM
4157 ent->plt.refcount += 1;
4158 eh->elf.elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
4159 eh->is_func = 1;
b34976b6 4160 return TRUE;
1e2f5b6e
AM
4161}
4162
5bd4f169 4163/* Look through the relocs for a section during the first phase, and
65f38f15 4164 calculate needed space in the global offset table, procedure
5d1634d7 4165 linkage table, and dynamic reloc sections. */
5bd4f169 4166
b34976b6 4167static bfd_boolean
4ce794b7
AM
4168ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4169 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 4170{
65f38f15 4171 struct ppc_link_hash_table *htab;
5bd4f169
AM
4172 Elf_Internal_Shdr *symtab_hdr;
4173 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4174 const Elf_Internal_Rela *rel;
4175 const Elf_Internal_Rela *rel_end;
5bd4f169 4176 asection *sreloc;
1e2f5b6e 4177 asection **opd_sym_map;
5bd4f169 4178
1049f94e 4179 if (info->relocatable)
b34976b6 4180 return TRUE;
5bd4f169 4181
680a3378
AM
4182 /* Don't do anything special with non-loaded, non-alloced sections.
4183 In particular, any relocs in such sections should not affect GOT
4184 and PLT reference counting (ie. we don't allow them to create GOT
4185 or PLT entries), there's no possibility or desire to optimize TLS
4186 relocs, and there's not much point in propagating relocs to shared
4187 libs that the dynamic linker won't relocate. */
4188 if ((sec->flags & SEC_ALLOC) == 0)
4189 return TRUE;
4190
65f38f15 4191 htab = ppc_hash_table (info);
5bd4f169 4192 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5bd4f169
AM
4193
4194 sym_hashes = elf_sym_hashes (abfd);
4195 sym_hashes_end = (sym_hashes
1e2f5b6e
AM
4196 + symtab_hdr->sh_size / sizeof (Elf64_External_Sym)
4197 - symtab_hdr->sh_info);
5bd4f169
AM
4198
4199 sreloc = NULL;
1e2f5b6e
AM
4200 opd_sym_map = NULL;
4201 if (strcmp (bfd_get_section_name (abfd, sec), ".opd") == 0)
4202 {
4203 /* Garbage collection needs some extra help with .opd sections.
4204 We don't want to necessarily keep everything referenced by
4205 relocs in .opd, as that would keep all functions. Instead,
4206 if we reference an .opd symbol (a function descriptor), we
4207 want to keep the function code symbol's section. This is
4208 easy for global symbols, but for local syms we need to keep
4209 information about the associated function section. Later, if
4210 edit_opd deletes entries, we'll use this array to adjust
4211 local syms in .opd. */
4212 union opd_info {
4213 asection *func_section;
4214 long entry_adjust;
4215 };
4216 bfd_size_type amt;
4217
3f764659 4218 amt = sec->size * sizeof (union opd_info) / 8;
4ce794b7 4219 opd_sym_map = bfd_zalloc (abfd, amt);
1e2f5b6e 4220 if (opd_sym_map == NULL)
b34976b6 4221 return FALSE;
f0abc2a1 4222 ppc64_elf_section_data (sec)->opd.func_sec = opd_sym_map;
1e2f5b6e 4223 }
5bd4f169 4224
82bd7b59
AM
4225 if (htab->sfpr == NULL
4226 && !create_linkage_sections (htab->elf.dynobj, info))
b34976b6 4227 return FALSE;
82bd7b59 4228
5bd4f169
AM
4229 rel_end = relocs + sec->reloc_count;
4230 for (rel = relocs; rel < rel_end; rel++)
4231 {
4232 unsigned long r_symndx;
4233 struct elf_link_hash_entry *h;
04c9666a 4234 enum elf_ppc64_reloc_type r_type;
411e1bfb 4235 int tls_type = 0;
5bd4f169
AM
4236
4237 r_symndx = ELF64_R_SYM (rel->r_info);
4238 if (r_symndx < symtab_hdr->sh_info)
4239 h = NULL;
4240 else
4241 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4242
4ce794b7 4243 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 4244 switch (r_type)
5bd4f169 4245 {
411e1bfb
AM
4246 case R_PPC64_GOT_TLSLD16:
4247 case R_PPC64_GOT_TLSLD16_LO:
4248 case R_PPC64_GOT_TLSLD16_HI:
4249 case R_PPC64_GOT_TLSLD16_HA:
e717da7e 4250 ppc64_tlsld_got (abfd)->refcount += 1;
951fd09b 4251 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
4252 goto dogottls;
4253
4254 case R_PPC64_GOT_TLSGD16:
4255 case R_PPC64_GOT_TLSGD16_LO:
4256 case R_PPC64_GOT_TLSGD16_HI:
4257 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 4258 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
4259 goto dogottls;
4260
4261 case R_PPC64_GOT_TPREL16_DS:
4262 case R_PPC64_GOT_TPREL16_LO_DS:
4263 case R_PPC64_GOT_TPREL16_HI:
4264 case R_PPC64_GOT_TPREL16_HA:
4265 if (info->shared)
4266 info->flags |= DF_STATIC_TLS;
4267 tls_type = TLS_TLS | TLS_TPREL;
4268 goto dogottls;
4269
4270 case R_PPC64_GOT_DTPREL16_DS:
4271 case R_PPC64_GOT_DTPREL16_LO_DS:
4272 case R_PPC64_GOT_DTPREL16_HI:
4273 case R_PPC64_GOT_DTPREL16_HA:
4274 tls_type = TLS_TLS | TLS_DTPREL;
4275 dogottls:
4276 sec->has_tls_reloc = 1;
4277 /* Fall thru */
4278
5bd4f169 4279 case R_PPC64_GOT16:
5bd4f169 4280 case R_PPC64_GOT16_DS:
65f38f15
AM
4281 case R_PPC64_GOT16_HA:
4282 case R_PPC64_GOT16_HI:
4283 case R_PPC64_GOT16_LO:
5bd4f169 4284 case R_PPC64_GOT16_LO_DS:
65f38f15 4285 /* This symbol requires a global offset table entry. */
ad8e1ba5 4286 sec->has_gp_reloc = 1;
e717da7e
AM
4287 if (ppc64_elf_tdata (abfd)->got == NULL
4288 && !create_got_section (abfd, info))
b34976b6 4289 return FALSE;
5bd4f169
AM
4290
4291 if (h != NULL)
4292 {
411e1bfb
AM
4293 struct ppc_link_hash_entry *eh;
4294 struct got_entry *ent;
65f38f15 4295
411e1bfb
AM
4296 eh = (struct ppc_link_hash_entry *) h;
4297 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
4298 if (ent->addend == rel->r_addend
e717da7e 4299 && ent->owner == abfd
411e1bfb
AM
4300 && ent->tls_type == tls_type)
4301 break;
4302 if (ent == NULL)
5bd4f169 4303 {
411e1bfb 4304 bfd_size_type amt = sizeof (*ent);
4ce794b7 4305 ent = bfd_alloc (abfd, amt);
411e1bfb 4306 if (ent == NULL)
b34976b6 4307 return FALSE;
411e1bfb
AM
4308 ent->next = eh->elf.got.glist;
4309 ent->addend = rel->r_addend;
e717da7e 4310 ent->owner = abfd;
411e1bfb
AM
4311 ent->tls_type = tls_type;
4312 ent->got.refcount = 0;
4313 eh->elf.got.glist = ent;
5bd4f169 4314 }
411e1bfb 4315 ent->got.refcount += 1;
e7b938ca 4316 eh->tls_mask |= tls_type;
5bd4f169 4317 }
411e1bfb
AM
4318 else
4319 /* This is a global offset table entry for a local symbol. */
4320 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4321 rel->r_addend, tls_type))
4322 return FALSE;
5bd4f169
AM
4323 break;
4324
5bd4f169 4325 case R_PPC64_PLT16_HA:
65f38f15
AM
4326 case R_PPC64_PLT16_HI:
4327 case R_PPC64_PLT16_LO:
4328 case R_PPC64_PLT32:
4329 case R_PPC64_PLT64:
5bd4f169 4330 /* This symbol requires a procedure linkage table entry. We
3fad3c7c
AM
4331 actually build the entry in adjust_dynamic_symbol,
4332 because this might be a case of linking PIC code without
4333 linking in any dynamic objects, in which case we don't
4334 need to generate a procedure linkage table after all. */
5bd4f169
AM
4335 if (h == NULL)
4336 {
4337 /* It does not make sense to have a procedure linkage
3fad3c7c 4338 table entry for a local symbol. */
5bd4f169 4339 bfd_set_error (bfd_error_bad_value);
b34976b6 4340 return FALSE;
5bd4f169 4341 }
411e1bfb
AM
4342 else
4343 if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4344 rel->r_addend))
4345 return FALSE;
5bd4f169
AM
4346 break;
4347
4348 /* The following relocations don't need to propagate the
4349 relocation if linking a shared object since they are
4350 section relative. */
4351 case R_PPC64_SECTOFF:
4352 case R_PPC64_SECTOFF_LO:
4353 case R_PPC64_SECTOFF_HI:
4354 case R_PPC64_SECTOFF_HA:
4355 case R_PPC64_SECTOFF_DS:
4356 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
4357 case R_PPC64_DTPREL16:
4358 case R_PPC64_DTPREL16_LO:
4359 case R_PPC64_DTPREL16_HI:
4360 case R_PPC64_DTPREL16_HA:
4361 case R_PPC64_DTPREL16_DS:
4362 case R_PPC64_DTPREL16_LO_DS:
4363 case R_PPC64_DTPREL16_HIGHER:
4364 case R_PPC64_DTPREL16_HIGHERA:
4365 case R_PPC64_DTPREL16_HIGHEST:
4366 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
4367 break;
4368
ad8e1ba5
AM
4369 /* Nor do these. */
4370 case R_PPC64_TOC16:
4371 case R_PPC64_TOC16_LO:
4372 case R_PPC64_TOC16_HI:
4373 case R_PPC64_TOC16_HA:
4374 case R_PPC64_TOC16_DS:
4375 case R_PPC64_TOC16_LO_DS:
4376 sec->has_gp_reloc = 1;
4377 break;
4378
5bd4f169
AM
4379 /* This relocation describes the C++ object vtable hierarchy.
4380 Reconstruct it for later use during GC. */
4381 case R_PPC64_GNU_VTINHERIT:
c152c796 4382 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 4383 return FALSE;
5bd4f169
AM
4384 break;
4385
4386 /* This relocation describes which C++ vtable entries are actually
4387 used. Record for later use during GC. */
4388 case R_PPC64_GNU_VTENTRY:
c152c796 4389 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 4390 return FALSE;
5bd4f169
AM
4391 break;
4392
721956f4
AM
4393 case R_PPC64_REL14:
4394 case R_PPC64_REL14_BRTAKEN:
4395 case R_PPC64_REL14_BRNTAKEN:
4396 htab->has_14bit_branch = 1;
4397 /* Fall through. */
4398
5d1634d7 4399 case R_PPC64_REL24:
8387904d 4400 if (h != NULL)
5d1634d7
AM
4401 {
4402 /* We may need a .plt entry if the function this reloc
4403 refers to is in a shared lib. */
411e1bfb
AM
4404 if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4405 rel->r_addend))
4406 return FALSE;
8387904d
AM
4407 if (h == &htab->tls_get_addr->elf
4408 || h == &htab->tls_get_addr_fd->elf)
411e1bfb 4409 sec->has_tls_reloc = 1;
8387904d
AM
4410 else if (htab->tls_get_addr == NULL
4411 && !strncmp (h->root.root.string, ".__tls_get_addr", 15)
a48ebf4d
AM
4412 && (h->root.root.string[15] == 0
4413 || h->root.root.string[15] == '@'))
411e1bfb 4414 {
8387904d
AM
4415 htab->tls_get_addr = (struct ppc_link_hash_entry *) h;
4416 sec->has_tls_reloc = 1;
4417 }
4418 else if (htab->tls_get_addr_fd == NULL
4419 && !strncmp (h->root.root.string, "__tls_get_addr", 14)
4420 && (h->root.root.string[14] == 0
4421 || h->root.root.string[14] == '@'))
4422 {
4423 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) h;
411e1bfb
AM
4424 sec->has_tls_reloc = 1;
4425 }
4426 }
4427 break;
4428
4429 case R_PPC64_TPREL64:
4430 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
4431 if (info->shared)
4432 info->flags |= DF_STATIC_TLS;
4433 goto dotlstoc;
4434
4435 case R_PPC64_DTPMOD64:
4436 if (rel + 1 < rel_end
4437 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4438 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 4439 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 4440 else
951fd09b 4441 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
4442 goto dotlstoc;
4443
4444 case R_PPC64_DTPREL64:
4445 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4446 if (rel != relocs
4447 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4448 && rel[-1].r_offset == rel->r_offset - 8)
4449 /* This is the second reloc of a dtpmod, dtprel pair.
4450 Don't mark with TLS_DTPREL. */
4451 goto dodyn;
4452
4453 dotlstoc:
4454 sec->has_tls_reloc = 1;
4455 if (h != NULL)
4456 {
4457 struct ppc_link_hash_entry *eh;
4458 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 4459 eh->tls_mask |= tls_type;
411e1bfb
AM
4460 }
4461 else
4462 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4463 rel->r_addend, tls_type))
4464 return FALSE;
4465
4466 if (ppc64_elf_section_data (sec)->t_symndx == NULL)
4467 {
e7b938ca 4468 /* One extra to simplify get_tls_mask. */
eea6121a 4469 bfd_size_type amt = sec->size * sizeof (unsigned) / 8 + 1;
4ce794b7 4470 ppc64_elf_section_data (sec)->t_symndx = bfd_zalloc (abfd, amt);
411e1bfb
AM
4471 if (ppc64_elf_section_data (sec)->t_symndx == NULL)
4472 return FALSE;
4473 }
4474 BFD_ASSERT (rel->r_offset % 8 == 0);
4475 ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8] = r_symndx;
951fd09b
AM
4476
4477 /* Mark the second slot of a GD or LD entry.
4478 -1 to indicate GD and -2 to indicate LD. */
4479 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
4480 ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8 + 1] = -1;
4481 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
4482 ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
4483 goto dodyn;
4484
4485 case R_PPC64_TPREL16:
4486 case R_PPC64_TPREL16_LO:
4487 case R_PPC64_TPREL16_HI:
4488 case R_PPC64_TPREL16_HA:
4489 case R_PPC64_TPREL16_DS:
4490 case R_PPC64_TPREL16_LO_DS:
4491 case R_PPC64_TPREL16_HIGHER:
4492 case R_PPC64_TPREL16_HIGHERA:
4493 case R_PPC64_TPREL16_HIGHEST:
4494 case R_PPC64_TPREL16_HIGHESTA:
4495 if (info->shared)
4496 {
4497 info->flags |= DF_STATIC_TLS;
4498 goto dodyn;
5d1634d7
AM
4499 }
4500 break;
4501
e86ce104 4502 case R_PPC64_ADDR64:
1e2f5b6e 4503 if (opd_sym_map != NULL
1e2f5b6e 4504 && rel + 1 < rel_end
4ce794b7 4505 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 4506 {
8387904d
AM
4507 if (h != NULL)
4508 {
4509 if (h->root.root.string[0] == '.'
4510 && h->root.root.string[1] != 0
4511 && get_fdh ((struct ppc_link_hash_entry *) h, htab))
4512 ;
4513 else
4514 ((struct ppc_link_hash_entry *) h)->is_func = 1;
4515 }
4516 else
4517 {
4518 asection *s;
1e2f5b6e 4519
8387904d
AM
4520 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, sec,
4521 r_symndx);
4522 if (s == NULL)
4523 return FALSE;
4524 else if (s != sec)
3f764659 4525 opd_sym_map[rel->r_offset / 8] = s;
8387904d 4526 }
1e2f5b6e 4527 }
e86ce104
AM
4528 /* Fall through. */
4529
04c9666a 4530 case R_PPC64_REL30:
5bd4f169 4531 case R_PPC64_REL32:
04c9666a 4532 case R_PPC64_REL64:
65f38f15
AM
4533 case R_PPC64_ADDR14:
4534 case R_PPC64_ADDR14_BRNTAKEN:
4535 case R_PPC64_ADDR14_BRTAKEN:
4536 case R_PPC64_ADDR16:
4537 case R_PPC64_ADDR16_DS:
4538 case R_PPC64_ADDR16_HA:
4539 case R_PPC64_ADDR16_HI:
4540 case R_PPC64_ADDR16_HIGHER:
4541 case R_PPC64_ADDR16_HIGHERA:
4542 case R_PPC64_ADDR16_HIGHEST:
4543 case R_PPC64_ADDR16_HIGHESTA:
4544 case R_PPC64_ADDR16_LO:
4545 case R_PPC64_ADDR16_LO_DS:
4546 case R_PPC64_ADDR24:
65f38f15 4547 case R_PPC64_ADDR32:
65f38f15
AM
4548 case R_PPC64_UADDR16:
4549 case R_PPC64_UADDR32:
4550 case R_PPC64_UADDR64:
5bd4f169 4551 case R_PPC64_TOC:
81848ca0
AM
4552 if (h != NULL && !info->shared)
4553 /* We may need a copy reloc. */
4554 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
4555
41bd81ab 4556 /* Don't propagate .opd relocs. */
1e2f5b6e 4557 if (NO_OPD_RELOCS && opd_sym_map != NULL)
e86ce104 4558 break;
e86ce104 4559
65f38f15
AM
4560 /* If we are creating a shared library, and this is a reloc
4561 against a global symbol, or a non PC relative reloc
4562 against a local symbol, then we need to copy the reloc
4563 into the shared library. However, if we are linking with
4564 -Bsymbolic, we do not need to copy a reloc against a
4565 global symbol which is defined in an object we are
4566 including in the link (i.e., DEF_REGULAR is set). At
4567 this point we have not seen all the input files, so it is
4568 possible that DEF_REGULAR is not set now but will be set
4569 later (it is never cleared). In case of a weak definition,
4570 DEF_REGULAR may be cleared later by a strong definition in
4571 a shared library. We account for that possibility below by
f4656909 4572 storing information in the dyn_relocs field of the hash
65f38f15
AM
4573 table entry. A similar situation occurs when creating
4574 shared libraries and symbol visibility changes render the
4575 symbol local.
4576
4577 If on the other hand, we are creating an executable, we
4578 may need to keep relocations for symbols satisfied by a
4579 dynamic library if we manage to avoid copy relocs for the
4580 symbol. */
411e1bfb 4581 dodyn:
65f38f15 4582 if ((info->shared
411e1bfb 4583 && (MUST_BE_DYN_RELOC (r_type)
65f38f15
AM
4584 || (h != NULL
4585 && (! info->symbolic
4586 || h->root.type == bfd_link_hash_defweak
4587 || (h->elf_link_hash_flags
4588 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
f4656909
AM
4589 || (ELIMINATE_COPY_RELOCS
4590 && !info->shared
65f38f15
AM
4591 && h != NULL
4592 && (h->root.type == bfd_link_hash_defweak
4593 || (h->elf_link_hash_flags
4594 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
5bd4f169 4595 {
ec338859
AM
4596 struct ppc_dyn_relocs *p;
4597 struct ppc_dyn_relocs **head;
4598
65f38f15
AM
4599 /* We must copy these reloc types into the output file.
4600 Create a reloc section in dynobj and make room for
4601 this reloc. */
5bd4f169
AM
4602 if (sreloc == NULL)
4603 {
4604 const char *name;
65f38f15 4605 bfd *dynobj;
5bd4f169
AM
4606
4607 name = (bfd_elf_string_from_elf_section
4608 (abfd,
4609 elf_elfheader (abfd)->e_shstrndx,
4610 elf_section_data (sec)->rel_hdr.sh_name));
4611 if (name == NULL)
b34976b6 4612 return FALSE;
5bd4f169 4613
65f38f15
AM
4614 if (strncmp (name, ".rela", 5) != 0
4615 || strcmp (bfd_get_section_name (abfd, sec),
4616 name + 5) != 0)
4617 {
4618 (*_bfd_error_handler)
d003868e
AM
4619 (_("%B: bad relocation section name `%s\'"),
4620 abfd, name);
5d1634d7 4621 bfd_set_error (bfd_error_bad_value);
65f38f15
AM
4622 }
4623
65f38f15 4624 dynobj = htab->elf.dynobj;
5bd4f169
AM
4625 sreloc = bfd_get_section_by_name (dynobj, name);
4626 if (sreloc == NULL)
4627 {
4628 flagword flags;
4629
4630 sreloc = bfd_make_section (dynobj, name);
4631 flags = (SEC_HAS_CONTENTS | SEC_READONLY
4632 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4633 if ((sec->flags & SEC_ALLOC) != 0)
4634 flags |= SEC_ALLOC | SEC_LOAD;
4635 if (sreloc == NULL
4636 || ! bfd_set_section_flags (dynobj, sreloc, flags)
65f38f15 4637 || ! bfd_set_section_alignment (dynobj, sreloc, 3))
b34976b6 4638 return FALSE;
5bd4f169 4639 }
65f38f15 4640 elf_section_data (sec)->sreloc = sreloc;
5bd4f169
AM
4641 }
4642
65f38f15
AM
4643 /* If this is a global symbol, we count the number of
4644 relocations we need for this symbol. */
4645 if (h != NULL)
4646 {
ec338859 4647 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
65f38f15
AM
4648 }
4649 else
4650 {
ec338859
AM
4651 /* Track dynamic relocs needed for local syms too.
4652 We really need local syms available to do this
4653 easily. Oh well. */
4654
4655 asection *s;
4656 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
4657 sec, r_symndx);
4658 if (s == NULL)
b34976b6 4659 return FALSE;
ec338859
AM
4660
4661 head = ((struct ppc_dyn_relocs **)
4662 &elf_section_data (s)->local_dynrel);
65f38f15 4663 }
ec338859
AM
4664
4665 p = *head;
4666 if (p == NULL || p->sec != sec)
4667 {
4ce794b7 4668 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
ec338859 4669 if (p == NULL)
b34976b6 4670 return FALSE;
ec338859
AM
4671 p->next = *head;
4672 *head = p;
4673 p->sec = sec;
4674 p->count = 0;
4675 p->pc_count = 0;
4676 }
4677
4678 p->count += 1;
411e1bfb 4679 if (!MUST_BE_DYN_RELOC (r_type))
ec338859 4680 p->pc_count += 1;
65f38f15 4681 }
5bd4f169 4682 break;
65f38f15
AM
4683
4684 default:
96e0dda4 4685 break;
5bd4f169
AM
4686 }
4687 }
4688
b34976b6 4689 return TRUE;
5bd4f169
AM
4690}
4691
8387904d
AM
4692/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
4693 of the code entry point, and its section. */
4694
4695static bfd_vma
4696opd_entry_value (asection *opd_sec,
4697 bfd_vma offset,
4698 asection **code_sec,
4699 bfd_vma *code_off)
4700{
4701 bfd *opd_bfd = opd_sec->owner;
4702 Elf_Internal_Rela *lo, *hi, *look;
4703
4704 /* Go find the opd reloc at the sym address. */
4705 lo = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
4706 BFD_ASSERT (lo != NULL);
4707 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
4708
4709 while (lo < hi)
4710 {
4711 look = lo + (hi - lo) / 2;
4712 if (look->r_offset < offset)
4713 lo = look + 1;
4714 else if (look->r_offset > offset)
4715 hi = look;
4716 else
4717 {
4718 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (opd_bfd)->symtab_hdr;
4719 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
4720 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
4721 {
4722 unsigned long symndx = ELF64_R_SYM (look->r_info);
4723 bfd_vma val;
4724 asection *sec;
4725
4726 if (symndx < symtab_hdr->sh_info)
4727 {
4728 Elf_Internal_Sym *sym;
4729
4730 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
4731 if (sym == NULL)
4732 {
4733 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
4734 symtab_hdr->sh_info,
4735 0, NULL, NULL, NULL);
4736 if (sym == NULL)
4737 return (bfd_vma) -1;
4738 symtab_hdr->contents = (bfd_byte *) sym;
4739 }
4740
4741 sym += symndx;
4742 val = sym->st_value;
4743 sec = NULL;
4744 if ((sym->st_shndx != SHN_UNDEF
4745 && sym->st_shndx < SHN_LORESERVE)
4746 || sym->st_shndx > SHN_HIRESERVE)
4747 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
4748 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
4749 }
4750 else
4751 {
4752 struct elf_link_hash_entry **sym_hashes;
4753 struct elf_link_hash_entry *rh;
4754
4755 sym_hashes = elf_sym_hashes (opd_bfd);
4756 rh = sym_hashes[symndx - symtab_hdr->sh_info];
4757 while (rh->root.type == bfd_link_hash_indirect
4758 || rh->root.type == bfd_link_hash_warning)
4759 rh = ((struct elf_link_hash_entry *) rh->root.u.i.link);
4760 BFD_ASSERT (rh->root.type == bfd_link_hash_defined
4761 || rh->root.type == bfd_link_hash_defweak);
4762 val = rh->root.u.def.value;
4763 sec = rh->root.u.def.section;
4764 }
4765 val += look->r_addend;
4766 if (code_off != NULL)
4767 *code_off = val;
4768 if (code_sec != NULL)
4769 *code_sec = sec;
4770 if (sec != NULL && sec->output_section != NULL)
4771 val += sec->output_section->vma + sec->output_offset;
4772 return val;
4773 }
4774 break;
4775 }
4776 }
4777 return (bfd_vma) -1;
4778}
4779
5bd4f169
AM
4780/* Return the section that should be marked against GC for a given
4781 relocation. */
4782
4783static asection *
4ce794b7 4784ppc64_elf_gc_mark_hook (asection *sec,
ccfa59ea 4785 struct bfd_link_info *info,
4ce794b7
AM
4786 Elf_Internal_Rela *rel,
4787 struct elf_link_hash_entry *h,
4788 Elf_Internal_Sym *sym)
5bd4f169 4789{
ccfa59ea
AM
4790 asection *rsec;
4791
4792 /* First mark all our entry sym sections. */
4793 if (info->gc_sym_list != NULL)
4794 {
4795 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4796 struct bfd_sym_chain *sym = info->gc_sym_list;
4797
4798 info->gc_sym_list = NULL;
4799 do
4800 {
4801 struct ppc_link_hash_entry *eh;
4802
4803 eh = (struct ppc_link_hash_entry *)
4804 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, FALSE);
4805 if (eh == NULL)
4806 continue;
4807 if (eh->elf.root.type != bfd_link_hash_defined
4808 && eh->elf.root.type != bfd_link_hash_defweak)
4809 continue;
4810
4811 if (eh->is_func_descriptor)
4812 rsec = eh->oh->elf.root.u.def.section;
8387904d
AM
4813 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
4814 && opd_entry_value (eh->elf.root.u.def.section,
4815 eh->elf.root.u.def.value,
4816 &rsec, NULL) != (bfd_vma) -1)
4817 ;
ccfa59ea
AM
4818 else
4819 continue;
4820
4821 if (!rsec->gc_mark)
4822 _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4823
4824 rsec = eh->elf.root.u.def.section;
4825 if (!rsec->gc_mark)
4826 _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4827
4828 sym = sym->next;
4829 }
4830 while (sym != NULL);
4831 }
4832
4833 /* Syms return NULL if we're marking .opd, so we avoid marking all
4834 function sections, as all functions are referenced in .opd. */
4835 rsec = NULL;
4836 if (get_opd_info (sec) != NULL)
4837 return rsec;
1e2f5b6e 4838
5bd4f169
AM
4839 if (h != NULL)
4840 {
04c9666a 4841 enum elf_ppc64_reloc_type r_type;
ccfa59ea 4842 struct ppc_link_hash_entry *eh;
a33d1f77 4843
4ce794b7 4844 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 4845 switch (r_type)
5bd4f169
AM
4846 {
4847 case R_PPC64_GNU_VTINHERIT:
4848 case R_PPC64_GNU_VTENTRY:
4849 break;
4850
4851 default:
4852 switch (h->root.type)
4853 {
4854 case bfd_link_hash_defined:
4855 case bfd_link_hash_defweak:
ccfa59ea
AM
4856 eh = (struct ppc_link_hash_entry *) h;
4857 if (eh->oh != NULL && eh->oh->is_func_descriptor)
4858 eh = eh->oh;
1e2f5b6e
AM
4859
4860 /* Function descriptor syms cause the associated
4861 function code sym section to be marked. */
ccfa59ea
AM
4862 if (eh->is_func_descriptor)
4863 {
4864 /* They also mark their opd section. */
4865 if (!eh->elf.root.u.def.section->gc_mark)
4866 _bfd_elf_gc_mark (info, eh->elf.root.u.def.section,
4867 ppc64_elf_gc_mark_hook);
4868
4869 rsec = eh->oh->elf.root.u.def.section;
4870 }
8387904d
AM
4871 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
4872 && opd_entry_value (eh->elf.root.u.def.section,
4873 eh->elf.root.u.def.value,
4874 &rsec, NULL) != (bfd_vma) -1)
4875 {
4876 if (!eh->elf.root.u.def.section->gc_mark)
4877 _bfd_elf_gc_mark (info, eh->elf.root.u.def.section,
4878 ppc64_elf_gc_mark_hook);
4879 }
ccfa59ea 4880 else
1e2f5b6e
AM
4881 rsec = h->root.u.def.section;
4882 break;
5bd4f169
AM
4883
4884 case bfd_link_hash_common:
1e2f5b6e
AM
4885 rsec = h->root.u.c.p->section;
4886 break;
5bd4f169
AM
4887
4888 default:
4889 break;
4890 }
4891 }
4892 }
4893 else
4894 {
1e2f5b6e
AM
4895 asection **opd_sym_section;
4896
4897 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
ccfa59ea 4898 opd_sym_section = get_opd_info (rsec);
1e2f5b6e 4899 if (opd_sym_section != NULL)
ccfa59ea
AM
4900 {
4901 if (!rsec->gc_mark)
4902 _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4903
3f764659 4904 rsec = opd_sym_section[sym->st_value / 8];
ccfa59ea 4905 }
5bd4f169
AM
4906 }
4907
1e2f5b6e 4908 return rsec;
5bd4f169
AM
4909}
4910
65f38f15
AM
4911/* Update the .got, .plt. and dynamic reloc reference counts for the
4912 section being removed. */
5bd4f169 4913
b34976b6 4914static bfd_boolean
4ce794b7
AM
4915ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
4916 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 4917{
411e1bfb 4918 struct ppc_link_hash_table *htab;
5bd4f169
AM
4919 Elf_Internal_Shdr *symtab_hdr;
4920 struct elf_link_hash_entry **sym_hashes;
411e1bfb 4921 struct got_entry **local_got_ents;
5bd4f169 4922 const Elf_Internal_Rela *rel, *relend;
5bd4f169 4923
680a3378
AM
4924 if ((sec->flags & SEC_ALLOC) == 0)
4925 return TRUE;
4926
ec338859
AM
4927 elf_section_data (sec)->local_dynrel = NULL;
4928
411e1bfb 4929 htab = ppc_hash_table (info);
5bd4f169
AM
4930 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4931 sym_hashes = elf_sym_hashes (abfd);
411e1bfb 4932 local_got_ents = elf_local_got_ents (abfd);
5bd4f169
AM
4933
4934 relend = relocs + sec->reloc_count;
4935 for (rel = relocs; rel < relend; rel++)
a33d1f77
AM
4936 {
4937 unsigned long r_symndx;
04c9666a 4938 enum elf_ppc64_reloc_type r_type;
58ac9f71 4939 struct elf_link_hash_entry *h = NULL;
411e1bfb 4940 char tls_type = 0;
5bd4f169 4941
a33d1f77 4942 r_symndx = ELF64_R_SYM (rel->r_info);
4ce794b7 4943 r_type = ELF64_R_TYPE (rel->r_info);
58ac9f71
AM
4944 if (r_symndx >= symtab_hdr->sh_info)
4945 {
4946 struct ppc_link_hash_entry *eh;
4947 struct ppc_dyn_relocs **pp;
4948 struct ppc_dyn_relocs *p;
4949
4950 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4951 eh = (struct ppc_link_hash_entry *) h;
4952
4953 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
4954 if (p->sec == sec)
4955 {
4956 /* Everything must go for SEC. */
4957 *pp = p->next;
4958 break;
4959 }
4960 }
4961
a33d1f77
AM
4962 switch (r_type)
4963 {
411e1bfb
AM
4964 case R_PPC64_GOT_TLSLD16:
4965 case R_PPC64_GOT_TLSLD16_LO:
4966 case R_PPC64_GOT_TLSLD16_HI:
4967 case R_PPC64_GOT_TLSLD16_HA:
e717da7e 4968 ppc64_tlsld_got (abfd)->refcount -= 1;
951fd09b 4969 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
4970 goto dogot;
4971
4972 case R_PPC64_GOT_TLSGD16:
4973 case R_PPC64_GOT_TLSGD16_LO:
4974 case R_PPC64_GOT_TLSGD16_HI:
4975 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 4976 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
4977 goto dogot;
4978
4979 case R_PPC64_GOT_TPREL16_DS:
4980 case R_PPC64_GOT_TPREL16_LO_DS:
4981 case R_PPC64_GOT_TPREL16_HI:
4982 case R_PPC64_GOT_TPREL16_HA:
4983 tls_type = TLS_TLS | TLS_TPREL;
4984 goto dogot;
4985
4986 case R_PPC64_GOT_DTPREL16_DS:
4987 case R_PPC64_GOT_DTPREL16_LO_DS:
4988 case R_PPC64_GOT_DTPREL16_HI:
4989 case R_PPC64_GOT_DTPREL16_HA:
4990 tls_type = TLS_TLS | TLS_DTPREL;
4991 goto dogot;
4992
a33d1f77
AM
4993 case R_PPC64_GOT16:
4994 case R_PPC64_GOT16_DS:
4995 case R_PPC64_GOT16_HA:
4996 case R_PPC64_GOT16_HI:
4997 case R_PPC64_GOT16_LO:
4998 case R_PPC64_GOT16_LO_DS:
411e1bfb
AM
4999 dogot:
5000 {
5001 struct got_entry *ent;
5002
58ac9f71
AM
5003 if (h != NULL)
5004 ent = h->got.glist;
411e1bfb
AM
5005 else
5006 ent = local_got_ents[r_symndx];
5007
5008 for (; ent != NULL; ent = ent->next)
5009 if (ent->addend == rel->r_addend
e717da7e 5010 && ent->owner == abfd
411e1bfb
AM
5011 && ent->tls_type == tls_type)
5012 break;
5013 if (ent == NULL)
5014 abort ();
5015 if (ent->got.refcount > 0)
5016 ent->got.refcount -= 1;
5017 }
a33d1f77 5018 break;
65f38f15 5019
a33d1f77
AM
5020 case R_PPC64_PLT16_HA:
5021 case R_PPC64_PLT16_HI:
5022 case R_PPC64_PLT16_LO:
5023 case R_PPC64_PLT32:
5024 case R_PPC64_PLT64:
721956f4
AM
5025 case R_PPC64_REL14:
5026 case R_PPC64_REL14_BRNTAKEN:
5027 case R_PPC64_REL14_BRTAKEN:
5d1634d7 5028 case R_PPC64_REL24:
58ac9f71 5029 if (h != NULL)
5d1634d7 5030 {
411e1bfb
AM
5031 struct plt_entry *ent;
5032
411e1bfb
AM
5033 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5034 if (ent->addend == rel->r_addend)
5035 break;
5036 if (ent == NULL)
5037 abort ();
5038 if (ent->plt.refcount > 0)
5039 ent->plt.refcount -= 1;
5d1634d7 5040 }
e86ce104 5041 break;
5d1634d7 5042
a33d1f77
AM
5043 default:
5044 break;
5045 }
5046 }
b34976b6 5047 return TRUE;
5bd4f169
AM
5048}
5049
deb0e272
AM
5050/* The maximum size of .sfpr. */
5051#define SFPR_MAX (218*4)
5052
5053struct sfpr_def_parms
5054{
699733f6
AM
5055 const char name[12];
5056 unsigned char lo, hi;
deb0e272
AM
5057 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
5058 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
5059};
5060
5061/* Auto-generate _save*, _rest* functions in .sfpr. */
5062
5063static unsigned int
5064sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
5065{
5066 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5067 unsigned int i;
5068 size_t len = strlen (parm->name);
5069 bfd_boolean writing = FALSE;
699733f6 5070 char sym[16];
deb0e272
AM
5071
5072 memcpy (sym, parm->name, len);
5073 sym[len + 2] = 0;
5074
5075 for (i = parm->lo; i <= parm->hi; i++)
5076 {
5077 struct elf_link_hash_entry *h;
5078
5079 sym[len + 0] = i / 10 + '0';
5080 sym[len + 1] = i % 10 + '0';
5081 h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
5082 if (h != NULL
5083 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
5084 {
5085 h->root.type = bfd_link_hash_defined;
5086 h->root.u.def.section = htab->sfpr;
5087 h->root.u.def.value = htab->sfpr->size;
5088 h->type = STT_FUNC;
5089 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
5090 _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
5091 writing = TRUE;
5092 if (htab->sfpr->contents == NULL)
5093 {
5094 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
5095 if (htab->sfpr->contents == NULL)
5096 return FALSE;
5097 }
5098 }
5099 if (writing)
5100 {
5101 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5102 if (i != parm->hi)
5103 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5104 else
5105 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5106 htab->sfpr->size = p - htab->sfpr->contents;
5107 }
5108 }
5109
5110 return TRUE;
5111}
5112
5113static bfd_byte *
5114savegpr0 (bfd *abfd, bfd_byte *p, int r)
5115{
5116 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5117 return p + 4;
5118}
5119
5120static bfd_byte *
5121savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5122{
5123 p = savegpr0 (abfd, p, r);
5124 bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5125 p = p + 4;
5126 bfd_put_32 (abfd, BLR, p);
5127 return p + 4;
5128}
5129
5130static bfd_byte *
5131restgpr0 (bfd *abfd, bfd_byte *p, int r)
5132{
5133 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5134 return p + 4;
5135}
5136
5137static bfd_byte *
5138restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5139{
5140 bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5141 p = p + 4;
5142 p = restgpr0 (abfd, p, r);
5143 bfd_put_32 (abfd, MTLR_R0, p);
5144 p = p + 4;
5145 if (r == 29)
5146 {
5147 p = restgpr0 (abfd, p, 30);
5148 p = restgpr0 (abfd, p, 31);
5149 }
5150 bfd_put_32 (abfd, BLR, p);
5151 return p + 4;
5152}
5153
5154static bfd_byte *
5155savegpr1 (bfd *abfd, bfd_byte *p, int r)
5156{
5157 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5158 return p + 4;
5159}
5160
5161static bfd_byte *
5162savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5163{
5164 p = savegpr1 (abfd, p, r);
5165 bfd_put_32 (abfd, BLR, p);
5166 return p + 4;
5167}
5168
5169static bfd_byte *
5170restgpr1 (bfd *abfd, bfd_byte *p, int r)
5171{
5172 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5173 return p + 4;
5174}
5175
5176static bfd_byte *
5177restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5178{
5179 p = restgpr1 (abfd, p, r);
5180 bfd_put_32 (abfd, BLR, p);
5181 return p + 4;
5182}
5183
5184static bfd_byte *
5185savefpr (bfd *abfd, bfd_byte *p, int r)
5186{
5187 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5188 return p + 4;
5189}
5190
5191static bfd_byte *
5192savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
5193{
5194 p = savefpr (abfd, p, r);
5195 bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5196 p = p + 4;
5197 bfd_put_32 (abfd, BLR, p);
5198 return p + 4;
5199}
5200
5201static bfd_byte *
5202restfpr (bfd *abfd, bfd_byte *p, int r)
5203{
5204 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5205 return p + 4;
5206}
5207
5208static bfd_byte *
5209restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
5210{
5211 bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5212 p = p + 4;
5213 p = restfpr (abfd, p, r);
5214 bfd_put_32 (abfd, MTLR_R0, p);
5215 p = p + 4;
5216 if (r == 29)
5217 {
5218 p = restfpr (abfd, p, 30);
5219 p = restfpr (abfd, p, 31);
5220 }
5221 bfd_put_32 (abfd, BLR, p);
5222 return p + 4;
5223}
5224
5225static bfd_byte *
5226savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
5227{
5228 p = savefpr (abfd, p, r);
5229 bfd_put_32 (abfd, BLR, p);
5230 return p + 4;
5231}
5232
5233static bfd_byte *
5234restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
5235{
5236 p = restfpr (abfd, p, r);
5237 bfd_put_32 (abfd, BLR, p);
5238 return p + 4;
5239}
5240
5241static bfd_byte *
5242savevr (bfd *abfd, bfd_byte *p, int r)
5243{
5244 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5245 p = p + 4;
5246 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
5247 return p + 4;
5248}
5249
5250static bfd_byte *
5251savevr_tail (bfd *abfd, bfd_byte *p, int r)
5252{
5253 p = savevr (abfd, p, r);
5254 bfd_put_32 (abfd, BLR, p);
5255 return p + 4;
5256}
5257
5258static bfd_byte *
5259restvr (bfd *abfd, bfd_byte *p, int r)
5260{
5261 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5262 p = p + 4;
5263 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
5264 return p + 4;
5265}
5266
5267static bfd_byte *
5268restvr_tail (bfd *abfd, bfd_byte *p, int r)
5269{
5270 p = restvr (abfd, p, r);
5271 bfd_put_32 (abfd, BLR, p);
5272 return p + 4;
5273}
5274
e86ce104
AM
5275/* Called via elf_link_hash_traverse to transfer dynamic linking
5276 information on function code symbol entries to their corresponding
5277 function descriptor symbol entries. */
deb0e272 5278
b34976b6 5279static bfd_boolean
4ce794b7 5280func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 5281{
e86ce104 5282 struct bfd_link_info *info;
65f38f15 5283 struct ppc_link_hash_table *htab;
411e1bfb 5284 struct plt_entry *ent;
50bc7936
AM
5285 struct ppc_link_hash_entry *fh;
5286 struct ppc_link_hash_entry *fdh;
5287 bfd_boolean force_local;
5bd4f169 5288
50bc7936
AM
5289 fh = (struct ppc_link_hash_entry *) h;
5290 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 5291 return TRUE;
e86ce104 5292
50bc7936
AM
5293 if (fh->elf.root.type == bfd_link_hash_warning)
5294 fh = (struct ppc_link_hash_entry *) fh->elf.root.u.i.link;
e92d460e 5295
4ce794b7 5296 info = inf;
65f38f15 5297 htab = ppc_hash_table (info);
5bd4f169 5298
c09bdfe5
AM
5299 /* Resolve undefined references to dot-symbols as the value
5300 in the function descriptor, if we have one in a regular object.
5301 This is to satisfy cases like ".quad .foo". Calls to functions
5302 in dynamic objects are handled elsewhere. */
5303 if (fh->elf.root.type == bfd_link_hash_undefweak
5304 && fh->was_undefined
5305 && (fh->oh->elf.root.type == bfd_link_hash_defined
5306 || fh->oh->elf.root.type == bfd_link_hash_defweak)
5307 && get_opd_info (fh->oh->elf.root.u.def.section) != NULL
5308 && opd_entry_value (fh->oh->elf.root.u.def.section,
5309 fh->oh->elf.root.u.def.value,
5310 &fh->elf.root.u.def.section,
5311 &fh->elf.root.u.def.value) != (bfd_vma) -1)
5312 {
5313 fh->elf.root.type = fh->oh->elf.root.type;
5314 fh->elf.elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
5315 }
5316
e86ce104
AM
5317 /* If this is a function code symbol, transfer dynamic linking
5318 information to the function descriptor symbol. */
50bc7936 5319 if (!fh->is_func)
b34976b6 5320 return TRUE;
e86ce104 5321
50bc7936 5322 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
411e1bfb
AM
5323 if (ent->plt.refcount > 0)
5324 break;
50bc7936
AM
5325 if (ent == NULL
5326 || fh->elf.root.root.string[0] != '.'
5327 || fh->elf.root.root.string[1] == '\0')
5328 return TRUE;
5bd4f169 5329
50bc7936
AM
5330 /* Find the corresponding function descriptor symbol. Create it
5331 as undefined if necessary. */
5bd4f169 5332
50bc7936
AM
5333 fdh = get_fdh (fh, htab);
5334 if (fdh != NULL)
5335 while (fdh->elf.root.type == bfd_link_hash_indirect
5336 || fdh->elf.root.type == bfd_link_hash_warning)
5337 fdh = (struct ppc_link_hash_entry *) fdh->elf.root.u.i.link;
5bd4f169 5338
50bc7936
AM
5339 if (fdh == NULL
5340 && info->shared
5341 && (fh->elf.root.type == bfd_link_hash_undefined
5342 || fh->elf.root.type == bfd_link_hash_undefweak))
5343 {
5344 bfd *abfd;
5345 asymbol *newsym;
5346 struct bfd_link_hash_entry *bh;
5347
5348 abfd = fh->elf.root.u.undef.abfd;
5349 newsym = bfd_make_empty_symbol (abfd);
5350 newsym->name = fh->elf.root.root.string + 1;
5351 newsym->section = bfd_und_section_ptr;
5352 newsym->value = 0;
5353 newsym->flags = BSF_OBJECT;
5354 if (fh->elf.root.type == bfd_link_hash_undefweak)
5355 newsym->flags |= BSF_WEAK;
5356
5357 bh = &fdh->elf.root;
5358 if ( !(_bfd_generic_link_add_one_symbol
5359 (info, abfd, newsym->name, newsym->flags,
5360 newsym->section, newsym->value, NULL, FALSE, FALSE, &bh)))
648cca2c 5361 {
50bc7936 5362 return FALSE;
648cca2c 5363 }
50bc7936
AM
5364 fdh = (struct ppc_link_hash_entry *) bh;
5365 fdh->elf.elf_link_hash_flags &= ~ELF_LINK_NON_ELF;
5366 fdh->elf.size = 24;
5367 fdh->elf.type = STT_OBJECT;
5368 }
648cca2c 5369
50bc7936
AM
5370 if (fdh != NULL
5371 && (fdh->elf.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0
5372 && (info->shared
5373 || (fdh->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
5374 || (fdh->elf.elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
5375 || (fdh->elf.root.type == bfd_link_hash_undefweak
5376 && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
5377 {
5378 if (fdh->elf.dynindx == -1)
c152c796 5379 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
50bc7936
AM
5380 return FALSE;
5381 fdh->elf.elf_link_hash_flags
5382 |= (fh->elf.elf_link_hash_flags & (ELF_LINK_HASH_REF_REGULAR
5383 | ELF_LINK_HASH_REF_DYNAMIC
5384 | ELF_LINK_HASH_REF_REGULAR_NONWEAK
5385 | ELF_LINK_NON_GOT_REF));
5386 if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
e86ce104 5387 {
8387904d
AM
5388 struct plt_entry **ep = &fdh->elf.plt.plist;
5389 while (*ep != NULL)
5390 ep = &(*ep)->next;
5391 *ep = fh->elf.plt.plist;
5392 fh->elf.plt.plist = NULL;
50bc7936 5393 fdh->elf.elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
e86ce104 5394 }
50bc7936 5395 fdh->is_func_descriptor = 1;
34814b9f
AM
5396 fdh->oh = fh;
5397 fh->oh = fdh;
e86ce104
AM
5398 }
5399
50bc7936
AM
5400 /* Now that the info is on the function descriptor, clear the
5401 function code sym info. Any function code syms for which we
5402 don't have a definition in a regular file, we force local.
5403 This prevents a shared library from exporting syms that have
5404 been imported from another library. Function code syms that
5405 are really in the library we must leave global to prevent the
5406 linker dragging in a definition from a static library. */
5407 force_local
5408 = (info->shared
5409 && ((fh->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
5410 || fdh == NULL
5411 || (fdh->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
5412 || (fdh->elf.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0));
5413 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
5414
b34976b6 5415 return TRUE;
e86ce104 5416}
40b8271b 5417
e86ce104 5418/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
5419 this hook to a) provide some gcc support functions, and b) transfer
5420 dynamic linking information gathered so far on function code symbol
5421 entries, to their corresponding function descriptor symbol entries. */
deb0e272 5422
b34976b6 5423static bfd_boolean
4ce794b7
AM
5424ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
5425 struct bfd_link_info *info)
e86ce104
AM
5426{
5427 struct ppc_link_hash_table *htab;
82bd7b59 5428 unsigned int i;
deb0e272
AM
5429 const struct sfpr_def_parms funcs[] =
5430 {
5431 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
5432 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
5433 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
5434 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
5435 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
5436 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
5437 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
5438 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
5439 { "._savef", 14, 31, savefpr, savefpr1_tail },
5440 { "._restf", 14, 31, restfpr, restfpr1_tail },
5441 { "_savevr_", 20, 31, savevr, savevr_tail },
5442 { "_restvr_", 20, 31, restvr, restvr_tail }
5443 };
e86ce104
AM
5444
5445 htab = ppc_hash_table (info);
82bd7b59
AM
5446 if (htab->sfpr == NULL)
5447 /* We don't have any relocs. */
b34976b6 5448 return TRUE;
82bd7b59 5449
deb0e272
AM
5450 /* Provide any missing _save* and _rest* functions. */
5451 htab->sfpr->size = 0;
5452 for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
5453 if (!sfpr_define (info, &funcs[i]))
5454 return FALSE;
82bd7b59 5455
4ce794b7 5456 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
805fc799 5457
eea6121a 5458 if (htab->sfpr->size == 0)
deb0e272 5459 _bfd_strip_section_from_output (info, htab->sfpr);
82bd7b59 5460
b34976b6 5461 return TRUE;
e86ce104
AM
5462}
5463
5464/* Adjust a symbol defined by a dynamic object and referenced by a
5465 regular object. The current definition is in some section of the
5466 dynamic object, but we're not including those sections. We have to
5467 change the definition to something the rest of the link can
5468 understand. */
5469
b34976b6 5470static bfd_boolean
4ce794b7
AM
5471ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
5472 struct elf_link_hash_entry *h)
e86ce104
AM
5473{
5474 struct ppc_link_hash_table *htab;
e86ce104
AM
5475 asection *s;
5476 unsigned int power_of_two;
5477
5478 htab = ppc_hash_table (info);
5479
5480 /* Deal with function syms. */
5481 if (h->type == STT_FUNC
5482 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
5483 {
5484 /* Clear procedure linkage table information for any symbol that
5485 won't need a .plt entry. */
411e1bfb
AM
5486 struct plt_entry *ent;
5487 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5488 if (ent->plt.refcount > 0)
5489 break;
8387904d 5490 if (ent == NULL
9c7a29a3
AM
5491 || SYMBOL_CALLS_LOCAL (info, h)
5492 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5493 && h->root.type == bfd_link_hash_undefweak))
40b8271b 5494 {
411e1bfb 5495 h->plt.plist = NULL;
40b8271b 5496 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
40b8271b 5497 }
5bd4f169 5498 }
bbd7ec4a 5499 else
411e1bfb 5500 h->plt.plist = NULL;
5bd4f169
AM
5501
5502 /* If this is a weak symbol, and there is a real definition, the
5503 processor independent code will have arranged for us to see the
5504 real definition first, and we can just use the same value. */
5505 if (h->weakdef != NULL)
5506 {
5507 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
5508 || h->weakdef->root.type == bfd_link_hash_defweak);
5509 h->root.u.def.section = h->weakdef->root.u.def.section;
5510 h->root.u.def.value = h->weakdef->root.u.def.value;
a23b6845
AM
5511 if (ELIMINATE_COPY_RELOCS)
5512 h->elf_link_hash_flags
5513 = ((h->elf_link_hash_flags & ~ELF_LINK_NON_GOT_REF)
5514 | (h->weakdef->elf_link_hash_flags & ELF_LINK_NON_GOT_REF));
b34976b6 5515 return TRUE;
5bd4f169
AM
5516 }
5517
5bd4f169
AM
5518 /* If we are creating a shared library, we must presume that the
5519 only references to the symbol are via the global offset table.
5520 For such cases we need not do anything here; the relocations will
5521 be handled correctly by relocate_section. */
5522 if (info->shared)
b34976b6 5523 return TRUE;
5bd4f169 5524
65f38f15
AM
5525 /* If there are no references to this symbol that do not use the
5526 GOT, we don't need to generate a copy reloc. */
5527 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
b34976b6 5528 return TRUE;
65f38f15 5529
f4656909 5530 if (ELIMINATE_COPY_RELOCS)
65f38f15 5531 {
f4656909
AM
5532 struct ppc_link_hash_entry * eh;
5533 struct ppc_dyn_relocs *p;
65f38f15 5534
f4656909
AM
5535 eh = (struct ppc_link_hash_entry *) h;
5536 for (p = eh->dyn_relocs; p != NULL; p = p->next)
5537 {
5538 s = p->sec->output_section;
5539 if (s != NULL && (s->flags & SEC_READONLY) != 0)
5540 break;
5541 }
5542
5543 /* If we didn't find any dynamic relocs in read-only sections, then
5544 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
5545 if (p == NULL)
5546 {
5547 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
5548 return TRUE;
5549 }
65f38f15
AM
5550 }
5551
5d35169e 5552 if (h->plt.plist != NULL)
97b639ba
AM
5553 {
5554 /* We should never get here, but unfortunately there are versions
5555 of gcc out there that improperly (for this ABI) put initialized
5556 function pointers, vtable refs and suchlike in read-only
5557 sections. Allow them to proceed, but warn that this might
5558 break at runtime. */
5559 (*_bfd_error_handler)
5560 (_("copy reloc against `%s' requires lazy plt linking; "
5561 "avoid setting LD_BIND_NOW=1 or upgrade gcc"),
5562 h->root.root.string);
5563 }
5d35169e
AM
5564
5565 /* This is a reference to a symbol defined by a dynamic object which
5566 is not a function. */
5567
5bd4f169
AM
5568 /* We must allocate the symbol in our .dynbss section, which will
5569 become part of the .bss section of the executable. There will be
5570 an entry for this symbol in the .dynsym section. The dynamic
5571 object will contain position independent code, so all references
5572 from the dynamic object to this symbol will go through the global
5573 offset table. The dynamic linker will use the .dynsym entry to
5574 determine the address it must put in the global offset table, so
5575 both the dynamic object and the regular object will refer to the
5576 same memory location for the variable. */
5bd4f169 5577
04c9666a
AM
5578 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
5579 to copy the initial value out of the dynamic object and into the
5bd4f169
AM
5580 runtime process image. We need to remember the offset into the
5581 .rela.bss section we are going to use. */
5582 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5583 {
eea6121a 5584 htab->relbss->size += sizeof (Elf64_External_Rela);
5bd4f169
AM
5585 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
5586 }
5587
5588 /* We need to figure out the alignment required for this symbol. I
5589 have no idea how ELF linkers handle this. */
5590 power_of_two = bfd_log2 (h->size);
5591 if (power_of_two > 4)
5592 power_of_two = 4;
5593
5594 /* Apply the required alignment. */
4ce794b7 5595 s = htab->dynbss;
eea6121a 5596 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
65f38f15 5597 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
5bd4f169 5598 {
65f38f15 5599 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
b34976b6 5600 return FALSE;
5bd4f169
AM
5601 }
5602
5603 /* Define the symbol as being at this point in the section. */
5604 h->root.u.def.section = s;
eea6121a 5605 h->root.u.def.value = s->size;
5bd4f169
AM
5606
5607 /* Increment the section size to make room for the symbol. */
eea6121a 5608 s->size += h->size;
5bd4f169 5609
b34976b6 5610 return TRUE;
5bd4f169
AM
5611}
5612
e86ce104
AM
5613/* If given a function descriptor symbol, hide both the function code
5614 sym and the descriptor. */
5615static void
4ce794b7
AM
5616ppc64_elf_hide_symbol (struct bfd_link_info *info,
5617 struct elf_link_hash_entry *h,
5618 bfd_boolean force_local)
e86ce104 5619{
34814b9f 5620 struct ppc_link_hash_entry *eh;
e86ce104
AM
5621 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
5622
34814b9f
AM
5623 eh = (struct ppc_link_hash_entry *) h;
5624 if (eh->is_func_descriptor)
e86ce104 5625 {
34814b9f 5626 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 5627
721956f4 5628 if (fh == NULL)
d1329ca3
AM
5629 {
5630 const char *p, *q;
5631 struct ppc_link_hash_table *htab;
5632 char save;
5633
5634 /* We aren't supposed to use alloca in BFD because on
5635 systems which do not have alloca the version in libiberty
5636 calls xmalloc, which might cause the program to crash
5637 when it runs out of memory. This function doesn't have a
5638 return status, so there's no way to gracefully return an
5639 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
5640 accessed; It's either a string in an ELF string table,
5641 or allocated in an objalloc structure. */
d1329ca3 5642
34814b9f 5643 p = eh->elf.root.root.string - 1;
d1329ca3
AM
5644 save = *p;
5645 *(char *) p = '.';
5646 htab = ppc_hash_table (info);
34814b9f
AM
5647 fh = (struct ppc_link_hash_entry *)
5648 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
d1329ca3
AM
5649 *(char *) p = save;
5650
5651 /* Unfortunately, if it so happens that the string we were
5652 looking for was allocated immediately before this string,
5653 then we overwrote the string terminator. That's the only
5654 reason the lookup should fail. */
5655 if (fh == NULL)
5656 {
34814b9f
AM
5657 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
5658 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 5659 --q, --p;
34814b9f
AM
5660 if (q < eh->elf.root.root.string && *p == '.')
5661 fh = (struct ppc_link_hash_entry *)
5662 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
d1329ca3
AM
5663 }
5664 if (fh != NULL)
5665 {
34814b9f
AM
5666 eh->oh = fh;
5667 fh->oh = eh;
d1329ca3
AM
5668 }
5669 }
e86ce104 5670 if (fh != NULL)
34814b9f 5671 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
5672 }
5673}
5674
411e1bfb 5675static bfd_boolean
8843416a
AM
5676get_sym_h (struct elf_link_hash_entry **hp,
5677 Elf_Internal_Sym **symp,
5678 asection **symsecp,
5679 char **tls_maskp,
5680 Elf_Internal_Sym **locsymsp,
5681 unsigned long r_symndx,
5682 bfd *ibfd)
411e1bfb
AM
5683{
5684 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5685
5686 if (r_symndx >= symtab_hdr->sh_info)
5687 {
5688 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
5689 struct elf_link_hash_entry *h;
5690
5691 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5692 while (h->root.type == bfd_link_hash_indirect
5693 || h->root.type == bfd_link_hash_warning)
5694 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5695
5696 if (hp != NULL)
5697 *hp = h;
5698
5699 if (symp != NULL)
5700 *symp = NULL;
5701
5702 if (symsecp != NULL)
5703 {
5704 asection *symsec = NULL;
5705 if (h->root.type == bfd_link_hash_defined
5706 || h->root.type == bfd_link_hash_defweak)
5707 symsec = h->root.u.def.section;
5708 *symsecp = symsec;
5709 }
5710
e7b938ca 5711 if (tls_maskp != NULL)
411e1bfb
AM
5712 {
5713 struct ppc_link_hash_entry *eh;
5714
5715 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 5716 *tls_maskp = &eh->tls_mask;
411e1bfb
AM
5717 }
5718 }
5719 else
5720 {
5721 Elf_Internal_Sym *sym;
5722 Elf_Internal_Sym *locsyms = *locsymsp;
5723
5724 if (locsyms == NULL)
5725 {
5726 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
5727 if (locsyms == NULL)
5728 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
5729 symtab_hdr->sh_info,
5730 0, NULL, NULL, NULL);
5731 if (locsyms == NULL)
5732 return FALSE;
5733 *locsymsp = locsyms;
5734 }
5735 sym = locsyms + r_symndx;
5736
5737 if (hp != NULL)
5738 *hp = NULL;
5739
5740 if (symp != NULL)
5741 *symp = sym;
5742
5743 if (symsecp != NULL)
5744 {
5745 asection *symsec = NULL;
5746 if ((sym->st_shndx != SHN_UNDEF
5747 && sym->st_shndx < SHN_LORESERVE)
5748 || sym->st_shndx > SHN_HIRESERVE)
5749 symsec = bfd_section_from_elf_index (ibfd, sym->st_shndx);
5750 *symsecp = symsec;
5751 }
5752
e7b938ca 5753 if (tls_maskp != NULL)
411e1bfb
AM
5754 {
5755 struct got_entry **lgot_ents;
e7b938ca 5756 char *tls_mask;
411e1bfb 5757
e7b938ca 5758 tls_mask = NULL;
411e1bfb
AM
5759 lgot_ents = elf_local_got_ents (ibfd);
5760 if (lgot_ents != NULL)
5761 {
e7b938ca
AM
5762 char *lgot_masks = (char *) (lgot_ents + symtab_hdr->sh_info);
5763 tls_mask = &lgot_masks[r_symndx];
411e1bfb 5764 }
e7b938ca 5765 *tls_maskp = tls_mask;
411e1bfb
AM
5766 }
5767 }
5768 return TRUE;
5769}
5770
e7b938ca 5771/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 5772 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 5773 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
5774
5775static int
0d4792f7
AM
5776get_tls_mask (char **tls_maskp, unsigned long *toc_symndx,
5777 Elf_Internal_Sym **locsymsp,
4ce794b7 5778 const Elf_Internal_Rela *rel, bfd *ibfd)
411e1bfb
AM
5779{
5780 unsigned long r_symndx;
0d4792f7 5781 int next_r;
411e1bfb
AM
5782 struct elf_link_hash_entry *h;
5783 Elf_Internal_Sym *sym;
5784 asection *sec;
5785 bfd_vma off;
5786
5787 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 5788 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 5789 return 0;
411e1bfb 5790
e7b938ca 5791 if ((*tls_maskp != NULL && **tls_maskp != 0)
411e1bfb
AM
5792 || sec == NULL
5793 || ppc64_elf_section_data (sec)->t_symndx == NULL)
951fd09b 5794 return 1;
411e1bfb
AM
5795
5796 /* Look inside a TOC section too. */
5797 if (h != NULL)
5798 {
5799 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
5800 off = h->root.u.def.value;
5801 }
5802 else
5803 off = sym->st_value;
5804 off += rel->r_addend;
5805 BFD_ASSERT (off % 8 == 0);
5806 r_symndx = ppc64_elf_section_data (sec)->t_symndx[off / 8];
951fd09b 5807 next_r = ppc64_elf_section_data (sec)->t_symndx[off / 8 + 1];
e7b938ca 5808 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 5809 return 0;
0d4792f7
AM
5810 if (toc_symndx != NULL)
5811 *toc_symndx = r_symndx;
5812 if ((h == NULL
5813 || ((h->root.type == bfd_link_hash_defined
5814 || h->root.type == bfd_link_hash_defweak)
5815 && !(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC)))
5816 && (next_r == -1 || next_r == -2))
5817 return 1 - next_r;
951fd09b 5818 return 1;
411e1bfb
AM
5819}
5820
754021d0 5821/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 5822 code for the old ABI, these will already have been done. */
754021d0
AM
5823
5824static bfd_boolean
5825adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
5826{
5827 struct ppc_link_hash_entry *eh;
5828 asection *sym_sec;
5829 long *opd_adjust;
5830
5831 if (h->root.type == bfd_link_hash_indirect)
5832 return TRUE;
5833
5834 if (h->root.type == bfd_link_hash_warning)
5835 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5836
5837 if (h->root.type != bfd_link_hash_defined
5838 && h->root.type != bfd_link_hash_defweak)
5839 return TRUE;
5840
5841 eh = (struct ppc_link_hash_entry *) h;
5842 if (eh->adjust_done)
5843 return TRUE;
5844
5845 sym_sec = eh->elf.root.u.def.section;
4025353c
AM
5846 opd_adjust = get_opd_info (sym_sec);
5847 if (opd_adjust != NULL)
754021d0 5848 {
3f764659 5849 long adjust = opd_adjust[eh->elf.root.u.def.value / 8];
4025353c
AM
5850 if (adjust == -1)
5851 {
5852 /* This entry has been deleted. */
81688140
AM
5853 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
5854 if (dsec == NULL)
5855 {
5856 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
5857 if (elf_discarded_section (dsec))
5858 {
5859 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
5860 break;
5861 }
5862 }
4025353c 5863 eh->elf.root.u.def.value = 0;
81688140 5864 eh->elf.root.u.def.section = dsec;
4025353c
AM
5865 }
5866 else
5867 eh->elf.root.u.def.value += adjust;
754021d0
AM
5868 eh->adjust_done = 1;
5869 }
5870 return TRUE;
5871}
5872
5873/* Remove unused Official Procedure Descriptor entries. Currently we
5874 only remove those associated with functions in discarded link-once
5875 sections, or weakly defined functions that have been overridden. It
5876 would be possible to remove many more entries for statically linked
5877 applications. */
5878
b34976b6 5879bfd_boolean
3f764659
JJ
5880ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info,
5881 bfd_boolean non_overlapping)
1e2f5b6e
AM
5882{
5883 bfd *ibfd;
754021d0 5884 bfd_boolean some_edited = FALSE;
3f764659 5885 asection *need_pad = NULL;
1e2f5b6e 5886
411e1bfb 5887 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1e2f5b6e
AM
5888 {
5889 asection *sec;
5890 Elf_Internal_Rela *relstart, *rel, *relend;
5891 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 5892 Elf_Internal_Sym *local_syms;
1e2f5b6e
AM
5893 struct elf_link_hash_entry **sym_hashes;
5894 bfd_vma offset;
d6fe2dc1 5895 bfd_size_type amt;
4025353c 5896 long *opd_adjust;
3f764659
JJ
5897 bfd_boolean need_edit, add_aux_fields;
5898 bfd_size_type cnt_16b = 0;
1e2f5b6e
AM
5899
5900 sec = bfd_get_section_by_name (ibfd, ".opd");
5901 if (sec == NULL)
5902 continue;
5903
3f764659 5904 amt = sec->size * sizeof (long) / 8;
4025353c
AM
5905 opd_adjust = get_opd_info (sec);
5906 if (opd_adjust == NULL)
d6fe2dc1
AM
5907 {
5908 /* Must be a ld -r link. ie. check_relocs hasn't been
5909 called. */
4025353c
AM
5910 opd_adjust = bfd_zalloc (obfd, amt);
5911 ppc64_elf_section_data (sec)->opd.adjust = opd_adjust;
d6fe2dc1 5912 }
4025353c 5913 memset (opd_adjust, 0, amt);
1e2f5b6e
AM
5914
5915 if (sec->output_section == bfd_abs_section_ptr)
5916 continue;
5917
5918 /* Look through the section relocs. */
5919 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
5920 continue;
5921
6cdc0ccc 5922 local_syms = NULL;
1e2f5b6e
AM
5923 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5924 sym_hashes = elf_sym_hashes (ibfd);
5925
5926 /* Read the relocations. */
4ce794b7 5927 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 5928 info->keep_memory);
1e2f5b6e 5929 if (relstart == NULL)
b34976b6 5930 return FALSE;
1e2f5b6e
AM
5931
5932 /* First run through the relocs to check they are sane, and to
5933 determine whether we need to edit this opd section. */
b34976b6 5934 need_edit = FALSE;
3f764659 5935 need_pad = sec;
1e2f5b6e
AM
5936 offset = 0;
5937 relend = relstart + sec->reloc_count;
50bc7936 5938 for (rel = relstart; rel < relend; )
1e2f5b6e 5939 {
04c9666a 5940 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
5941 unsigned long r_symndx;
5942 asection *sym_sec;
5943 struct elf_link_hash_entry *h;
5944 Elf_Internal_Sym *sym;
5945
3f764659 5946 /* .opd contains a regular array of 16 or 24 byte entries. We're
1e2f5b6e
AM
5947 only interested in the reloc pointing to a function entry
5948 point. */
50bc7936
AM
5949 if (rel->r_offset != offset
5950 || rel + 1 >= relend
5951 || (rel + 1)->r_offset != offset + 8)
1e2f5b6e
AM
5952 {
5953 /* If someone messes with .opd alignment then after a
5954 "ld -r" we might have padding in the middle of .opd.
5955 Also, there's nothing to prevent someone putting
5956 something silly in .opd with the assembler. No .opd
b34976b6 5957 optimization for them! */
3f764659 5958 broken_opd:
1e2f5b6e 5959 (*_bfd_error_handler)
d003868e 5960 (_("%B: .opd is not a regular array of opd entries"), ibfd);
b34976b6 5961 need_edit = FALSE;
1e2f5b6e
AM
5962 break;
5963 }
5964
50bc7936
AM
5965 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
5966 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
5967 {
5968 (*_bfd_error_handler)
d003868e
AM
5969 (_("%B: unexpected reloc type %u in .opd section"),
5970 ibfd, r_type);
50bc7936
AM
5971 need_edit = FALSE;
5972 break;
5973 }
5974
1e2f5b6e 5975 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
5976 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
5977 r_symndx, ibfd))
50bc7936 5978 goto error_ret;
1e2f5b6e
AM
5979
5980 if (sym_sec == NULL || sym_sec->owner == NULL)
5981 {
411e1bfb
AM
5982 const char *sym_name;
5983 if (h != NULL)
5984 sym_name = h->root.root.string;
5985 else
5986 sym_name = bfd_elf_local_sym_name (ibfd, sym);
5987
1e2f5b6e 5988 (*_bfd_error_handler)
d003868e
AM
5989 (_("%B: undefined sym `%s' in .opd section"),
5990 ibfd, sym_name);
b34976b6 5991 need_edit = FALSE;
1e2f5b6e
AM
5992 break;
5993 }
5994
51020317
AM
5995 /* opd entries are always for functions defined in the
5996 current input bfd. If the symbol isn't defined in the
5997 input bfd, then we won't be using the function in this
5998 bfd; It must be defined in a linkonce section in another
5999 bfd, or is weak. It's also possible that we are
6000 discarding the function due to a linker script /DISCARD/,
6001 which we test for via the output_section. */
6002 if (sym_sec->owner != ibfd
6003 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 6004 need_edit = TRUE;
1e2f5b6e 6005
50bc7936 6006 rel += 2;
3f764659
JJ
6007 if (rel == relend
6008 || (rel + 1 == relend && rel->r_offset == offset + 16))
6009 {
6010 if (sec->size == offset + 24)
6011 {
6012 need_pad = NULL;
6013 break;
6014 }
6015 if (rel == relend && sec->size == offset + 16)
6016 {
6017 cnt_16b++;
6018 break;
6019 }
6020 goto broken_opd;
6021 }
6022
6023 if (rel->r_offset == offset + 24)
6024 offset += 24;
6025 else if (rel->r_offset != offset + 16)
6026 goto broken_opd;
6027 else if (rel + 1 < relend
6028 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
6029 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
6030 {
6031 offset += 16;
6032 cnt_16b++;
6033 }
6034 else if (rel + 2 < relend
6035 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
6036 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
6037 {
6038 offset += 24;
6039 rel += 1;
6040 }
6041 else
6042 goto broken_opd;
1e2f5b6e
AM
6043 }
6044
3f764659
JJ
6045 add_aux_fields = non_overlapping && cnt_16b > 0;
6046
6047 if (need_edit || add_aux_fields)
1e2f5b6e
AM
6048 {
6049 Elf_Internal_Rela *write_rel;
6050 bfd_byte *rptr, *wptr;
3f764659 6051 bfd_byte *new_contents = NULL;
b34976b6 6052 bfd_boolean skip;
3f764659 6053 long opd_ent_size;
1e2f5b6e
AM
6054
6055 /* This seems a waste of time as input .opd sections are all
6056 zeros as generated by gcc, but I suppose there's no reason
6057 this will always be so. We might start putting something in
6058 the third word of .opd entries. */
6059 if ((sec->flags & SEC_IN_MEMORY) == 0)
6060 {
eea6121a
AM
6061 bfd_byte *loc;
6062 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 6063 {
eea6121a
AM
6064 if (loc != NULL)
6065 free (loc);
50bc7936 6066 error_ret:
6cdc0ccc
AM
6067 if (local_syms != NULL
6068 && symtab_hdr->contents != (unsigned char *) local_syms)
6069 free (local_syms);
6cdc0ccc
AM
6070 if (elf_section_data (sec)->relocs != relstart)
6071 free (relstart);
b34976b6 6072 return FALSE;
6cdc0ccc 6073 }
1e2f5b6e
AM
6074 sec->contents = loc;
6075 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6076 }
6077
6078 elf_section_data (sec)->relocs = relstart;
6079
6080 wptr = sec->contents;
6081 rptr = sec->contents;
3f764659
JJ
6082 new_contents = sec->contents;
6083
6084 if (add_aux_fields)
6085 {
6086 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
6087 if (new_contents == NULL)
6088 return FALSE;
6089 need_pad = FALSE;
6090 wptr = new_contents;
6091 }
6092
1e2f5b6e 6093 write_rel = relstart;
b34976b6 6094 skip = FALSE;
1e2f5b6e 6095 offset = 0;
3f764659 6096 opd_ent_size = 0;
1e2f5b6e
AM
6097 for (rel = relstart; rel < relend; rel++)
6098 {
50bc7936
AM
6099 unsigned long r_symndx;
6100 asection *sym_sec;
6101 struct elf_link_hash_entry *h;
6102 Elf_Internal_Sym *sym;
6103
6104 r_symndx = ELF64_R_SYM (rel->r_info);
6105 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 6106 r_symndx, ibfd))
50bc7936
AM
6107 goto error_ret;
6108
1e2f5b6e
AM
6109 if (rel->r_offset == offset)
6110 {
50bc7936 6111 struct ppc_link_hash_entry *fdh = NULL;
3f764659
JJ
6112
6113 /* See if the .opd entry is full 24 byte or
6114 16 byte (with fd_aux entry overlapped with next
6115 fd_func). */
6116 opd_ent_size = 24;
6117 if ((rel + 2 == relend && sec->size == offset + 16)
6118 || (rel + 3 < relend
6119 && rel[2].r_offset == offset + 16
6120 && rel[3].r_offset == offset + 24
6121 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
6122 && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
6123 opd_ent_size = 16;
6124
4025353c
AM
6125 if (h != NULL
6126 && h->root.root.string[0] == '.')
50bc7936
AM
6127 fdh = get_fdh ((struct ppc_link_hash_entry *) h,
6128 ppc_hash_table (info));
1e2f5b6e 6129
51020317
AM
6130 skip = (sym_sec->owner != ibfd
6131 || sym_sec->output_section == bfd_abs_section_ptr);
a4aa0fb7
AM
6132 if (skip)
6133 {
4025353c 6134 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7
AM
6135 {
6136 /* Arrange for the function descriptor sym
6137 to be dropped. */
d6fe2dc1
AM
6138 fdh->elf.root.u.def.value = 0;
6139 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 6140 }
3f764659 6141 opd_adjust[rel->r_offset / 8] = -1;
a4aa0fb7
AM
6142 }
6143 else
1e2f5b6e
AM
6144 {
6145 /* We'll be keeping this opd entry. */
6146
4025353c 6147 if (fdh != NULL)
1e2f5b6e 6148 {
754021d0
AM
6149 /* Redefine the function descriptor symbol to
6150 this location in the opd section. It is
6151 necessary to update the value here rather
6152 than using an array of adjustments as we do
6153 for local symbols, because various places
6154 in the generic ELF code use the value
6155 stored in u.def.value. */
3f764659 6156 fdh->elf.root.u.def.value = wptr - new_contents;
754021d0 6157 fdh->adjust_done = 1;
1e2f5b6e 6158 }
754021d0
AM
6159
6160 /* Local syms are a bit tricky. We could
6161 tweak them as they can be cached, but
6162 we'd need to look through the local syms
6163 for the function descriptor sym which we
6164 don't have at the moment. So keep an
6165 array of adjustments. */
3f764659
JJ
6166 opd_adjust[rel->r_offset / 8]
6167 = (wptr - new_contents) - (rptr - sec->contents);
1e2f5b6e
AM
6168
6169 if (wptr != rptr)
3f764659
JJ
6170 memcpy (wptr, rptr, opd_ent_size);
6171 wptr += opd_ent_size;
6172 if (add_aux_fields && opd_ent_size == 16)
6173 {
6174 memset (wptr, '\0', 8);
6175 wptr += 8;
6176 }
1e2f5b6e 6177 }
3f764659
JJ
6178 rptr += opd_ent_size;
6179 offset += opd_ent_size;
1e2f5b6e
AM
6180 }
6181
50bc7936
AM
6182 if (skip)
6183 {
6184 BFD_ASSERT (MUST_BE_DYN_RELOC (ELF64_R_TYPE (rel->r_info)));
6185 if (info->shared)
6186 {
6187 /* We won't be needing dynamic relocs here. */
6188 struct ppc_dyn_relocs **pp;
6189 struct ppc_dyn_relocs *p;
6190
6191 if (h != NULL)
6192 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6193 else if (sym_sec != NULL)
6194 pp = ((struct ppc_dyn_relocs **)
6195 &elf_section_data (sym_sec)->local_dynrel);
6196 else
6197 pp = ((struct ppc_dyn_relocs **)
6198 &elf_section_data (sec)->local_dynrel);
6199 while ((p = *pp) != NULL)
6200 {
6201 if (p->sec == sec)
6202 {
6203 p->count -= 1;
6204 if (p->count == 0)
d37c89e5 6205 *pp = p->next;
50bc7936
AM
6206 break;
6207 }
6208 pp = &p->next;
6209 }
6210 }
6211 }
6212 else
1e2f5b6e 6213 {
50bc7936
AM
6214 /* We need to adjust any reloc offsets to point to the
6215 new opd entries. While we're at it, we may as well
6216 remove redundant relocs. */
3f764659 6217 rel->r_offset += opd_adjust[(offset - opd_ent_size) / 8];
1e2f5b6e
AM
6218 if (write_rel != rel)
6219 memcpy (write_rel, rel, sizeof (*rel));
6220 ++write_rel;
6221 }
6222 }
6223
3f764659 6224 sec->size = wptr - new_contents;
1e2f5b6e 6225 sec->reloc_count = write_rel - relstart;
3f764659
JJ
6226 if (add_aux_fields)
6227 {
6228 free (sec->contents);
6229 sec->contents = new_contents;
6230 }
6231
cdcf6e38
AM
6232 /* Fudge the size too, as this is used later in
6233 elf_bfd_final_link if we are emitting relocs. */
6234 elf_section_data (sec)->rel_hdr.sh_size
6235 = sec->reloc_count * elf_section_data (sec)->rel_hdr.sh_entsize;
6236 BFD_ASSERT (elf_section_data (sec)->rel_hdr2 == NULL);
754021d0 6237 some_edited = TRUE;
1e2f5b6e 6238 }
6cdc0ccc 6239 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 6240 free (relstart);
6cdc0ccc 6241
411e1bfb
AM
6242 if (local_syms != NULL
6243 && symtab_hdr->contents != (unsigned char *) local_syms)
6244 {
6245 if (!info->keep_memory)
6246 free (local_syms);
6247 else
6248 symtab_hdr->contents = (unsigned char *) local_syms;
6249 }
6250 }
6251
754021d0
AM
6252 if (some_edited)
6253 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
6254
3f764659
JJ
6255 /* If we are doing a final link and the last .opd entry is just 16 byte
6256 long, add a 8 byte padding after it. */
6257 if (need_pad != NULL && !info->relocatable)
6258 {
6259 bfd_byte *p;
6260
6261 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
6262 {
6263 BFD_ASSERT (need_pad->size > 0);
6264
6265 p = bfd_malloc (need_pad->size + 8);
6266 if (p == NULL)
6267 return FALSE;
699733f6 6268
3f764659
JJ
6269 if (! bfd_get_section_contents (need_pad->owner, need_pad,
6270 p, 0, need_pad->size))
6271 return FALSE;
6272
6273 need_pad->contents = p;
6274 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6275 }
6276 else
6277 {
6278 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
6279 if (p == NULL)
6280 return FALSE;
6281
6282 need_pad->contents = p;
6283 }
6284
6285 memset (need_pad->contents + need_pad->size, 0, 8);
6286 need_pad->size += 8;
6287 }
6288
411e1bfb
AM
6289 return TRUE;
6290}
6291
e1918d23 6292/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 6293
e1918d23 6294asection *
4ce794b7 6295ppc64_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
411e1bfb 6296{
411e1bfb
AM
6297 struct ppc_link_hash_table *htab;
6298
411e1bfb 6299 htab = ppc_hash_table (info);
a48ebf4d
AM
6300 if (htab->tls_get_addr != NULL)
6301 {
8387904d 6302 struct ppc_link_hash_entry *h = htab->tls_get_addr;
a48ebf4d 6303
8387904d
AM
6304 while (h->elf.root.type == bfd_link_hash_indirect
6305 || h->elf.root.type == bfd_link_hash_warning)
6306 h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
a48ebf4d
AM
6307
6308 htab->tls_get_addr = h;
8387904d
AM
6309
6310 if (htab->tls_get_addr_fd == NULL
6311 && h->oh != NULL
6312 && h->oh->is_func_descriptor)
6313 htab->tls_get_addr_fd = h->oh;
6314 }
6315
6316 if (htab->tls_get_addr_fd != NULL)
6317 {
6318 struct ppc_link_hash_entry *h = htab->tls_get_addr_fd;
6319
6320 while (h->elf.root.type == bfd_link_hash_indirect
6321 || h->elf.root.type == bfd_link_hash_warning)
6322 h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
6323
6324 htab->tls_get_addr_fd = h;
a48ebf4d
AM
6325 }
6326
e1918d23 6327 return _bfd_elf_tls_setup (obfd, info);
951fd09b 6328}
411e1bfb 6329
951fd09b
AM
6330/* Run through all the TLS relocs looking for optimization
6331 opportunities. The linker has been hacked (see ppc64elf.em) to do
6332 a preliminary section layout so that we know the TLS segment
6333 offsets. We can't optimize earlier because some optimizations need
6334 to know the tp offset, and we need to optimize before allocating
6335 dynamic relocations. */
6336
6337bfd_boolean
4ce794b7 6338ppc64_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
951fd09b
AM
6339{
6340 bfd *ibfd;
6341 asection *sec;
6342 struct ppc_link_hash_table *htab;
6343
1049f94e 6344 if (info->relocatable || info->shared)
411e1bfb
AM
6345 return TRUE;
6346
951fd09b 6347 htab = ppc_hash_table (info);
411e1bfb
AM
6348 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6349 {
6350 Elf_Internal_Sym *locsyms = NULL;
6351
6352 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6353 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
6354 {
6355 Elf_Internal_Rela *relstart, *rel, *relend;
6356 int expecting_tls_get_addr;
6357
6358 /* Read the relocations. */
4ce794b7 6359 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 6360 info->keep_memory);
411e1bfb
AM
6361 if (relstart == NULL)
6362 return FALSE;
6363
6364 expecting_tls_get_addr = 0;
6365 relend = relstart + sec->reloc_count;
6366 for (rel = relstart; rel < relend; rel++)
6367 {
6368 enum elf_ppc64_reloc_type r_type;
6369 unsigned long r_symndx;
6370 struct elf_link_hash_entry *h;
6371 Elf_Internal_Sym *sym;
6372 asection *sym_sec;
e7b938ca
AM
6373 char *tls_mask;
6374 char tls_set, tls_clear, tls_type = 0;
411e1bfb 6375 bfd_vma value;
951fd09b 6376 bfd_boolean ok_tprel, is_local;
411e1bfb
AM
6377
6378 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 6379 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
411e1bfb
AM
6380 r_symndx, ibfd))
6381 {
6382 err_free_rel:
6383 if (elf_section_data (sec)->relocs != relstart)
6384 free (relstart);
6385 if (locsyms != NULL
6386 && (elf_tdata (ibfd)->symtab_hdr.contents
6387 != (unsigned char *) locsyms))
6388 free (locsyms);
6389 return FALSE;
6390 }
6391
6392 if (h != NULL)
6393 {
6394 if (h->root.type != bfd_link_hash_defined
6395 && h->root.type != bfd_link_hash_defweak)
6396 continue;
6397 value = h->root.u.def.value;
6398 }
6399 else
4025353c
AM
6400 /* Symbols referenced by TLS relocs must be of type
6401 STT_TLS. So no need for .opd local sym adjust. */
6402 value = sym->st_value;
951fd09b 6403
411e1bfb 6404 ok_tprel = FALSE;
951fd09b
AM
6405 is_local = FALSE;
6406 if (h == NULL
6407 || !(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC))
411e1bfb 6408 {
951fd09b 6409 is_local = TRUE;
411e1bfb
AM
6410 value += sym_sec->output_offset;
6411 value += sym_sec->output_section->vma;
e1918d23 6412 value -= htab->elf.tls_sec->vma;
411e1bfb
AM
6413 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
6414 < (bfd_vma) 1 << 32);
6415 }
6416
4ce794b7 6417 r_type = ELF64_R_TYPE (rel->r_info);
411e1bfb
AM
6418 switch (r_type)
6419 {
6420 case R_PPC64_GOT_TLSLD16:
6421 case R_PPC64_GOT_TLSLD16_LO:
6422 case R_PPC64_GOT_TLSLD16_HI:
6423 case R_PPC64_GOT_TLSLD16_HA:
951fd09b
AM
6424 /* These relocs should never be against a symbol
6425 defined in a shared lib. Leave them alone if
6426 that turns out to be the case. */
e717da7e 6427 ppc64_tlsld_got (ibfd)->refcount -= 1;
951fd09b
AM
6428 if (!is_local)
6429 continue;
6430
951fd09b
AM
6431 /* LD -> LE */
6432 tls_set = 0;
6433 tls_clear = TLS_LD;
e7b938ca 6434 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
6435 expecting_tls_get_addr = 1;
6436 break;
6437
6438 case R_PPC64_GOT_TLSGD16:
6439 case R_PPC64_GOT_TLSGD16_LO:
6440 case R_PPC64_GOT_TLSGD16_HI:
6441 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 6442 if (ok_tprel)
411e1bfb
AM
6443 /* GD -> LE */
6444 tls_set = 0;
6445 else
6446 /* GD -> IE */
951fd09b
AM
6447 tls_set = TLS_TLS | TLS_TPRELGD;
6448 tls_clear = TLS_GD;
e7b938ca 6449 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
6450 expecting_tls_get_addr = 1;
6451 break;
6452
6453 case R_PPC64_GOT_TPREL16_DS:
6454 case R_PPC64_GOT_TPREL16_LO_DS:
6455 case R_PPC64_GOT_TPREL16_HI:
6456 case R_PPC64_GOT_TPREL16_HA:
6457 expecting_tls_get_addr = 0;
6458 if (ok_tprel)
6459 {
6460 /* IE -> LE */
6461 tls_set = 0;
6462 tls_clear = TLS_TPREL;
e7b938ca 6463 tls_type = TLS_TLS | TLS_TPREL;
411e1bfb
AM
6464 break;
6465 }
6466 else
6467 continue;
6468
6469 case R_PPC64_REL14:
6470 case R_PPC64_REL14_BRTAKEN:
6471 case R_PPC64_REL14_BRNTAKEN:
6472 case R_PPC64_REL24:
6473 if (h != NULL
8387904d
AM
6474 && (h == &htab->tls_get_addr->elf
6475 || h == &htab->tls_get_addr_fd->elf))
411e1bfb
AM
6476 {
6477 if (!expecting_tls_get_addr
6478 && rel != relstart
6479 && ((ELF64_R_TYPE (rel[-1].r_info)
6480 == R_PPC64_TOC16)
6481 || (ELF64_R_TYPE (rel[-1].r_info)
6482 == R_PPC64_TOC16_LO)))
6483 {
6484 /* Check for toc tls entries. */
6485 char *toc_tls;
951fd09b 6486 int retval;
411e1bfb 6487
0d4792f7 6488 retval = get_tls_mask (&toc_tls, NULL, &locsyms,
951fd09b
AM
6489 rel - 1, ibfd);
6490 if (retval == 0)
411e1bfb
AM
6491 goto err_free_rel;
6492 if (toc_tls != NULL)
951fd09b 6493 expecting_tls_get_addr = retval > 1;
411e1bfb
AM
6494 }
6495
6496 if (expecting_tls_get_addr)
6497 {
6498 struct plt_entry *ent;
6499 for (ent = h->plt.plist; ent; ent = ent->next)
6500 if (ent->addend == 0)
6501 {
6502 if (ent->plt.refcount > 0)
6503 ent->plt.refcount -= 1;
6504 break;
6505 }
6506 }
6507 }
6508 expecting_tls_get_addr = 0;
6509 continue;
6510
6511 case R_PPC64_TPREL64:
6512 expecting_tls_get_addr = 0;
6513 if (ok_tprel)
6514 {
6515 /* IE -> LE */
6516 tls_set = TLS_EXPLICIT;
6517 tls_clear = TLS_TPREL;
6518 break;
6519 }
6520 else
6521 continue;
6522
6523 case R_PPC64_DTPMOD64:
6524 expecting_tls_get_addr = 0;
951fd09b
AM
6525 if (rel + 1 < relend
6526 && (rel[1].r_info
6527 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
6528 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 6529 {
951fd09b 6530 if (ok_tprel)
411e1bfb 6531 /* GD -> LE */
951fd09b 6532 tls_set = TLS_EXPLICIT | TLS_GD;
411e1bfb
AM
6533 else
6534 /* GD -> IE */
951fd09b
AM
6535 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
6536 tls_clear = TLS_GD;
411e1bfb
AM
6537 }
6538 else
6539 {
951fd09b
AM
6540 if (!is_local)
6541 continue;
6542
6543 /* LD -> LE */
6544 tls_set = TLS_EXPLICIT;
6545 tls_clear = TLS_LD;
411e1bfb
AM
6546 }
6547 break;
6548
6549 default:
6550 expecting_tls_get_addr = 0;
6551 continue;
6552 }
6553
6554 if ((tls_set & TLS_EXPLICIT) == 0)
6555 {
6556 struct got_entry *ent;
6557
6558 /* Adjust got entry for this reloc. */
6559 if (h != NULL)
6560 ent = h->got.glist;
6561 else
6562 ent = elf_local_got_ents (ibfd)[r_symndx];
6563
6564 for (; ent != NULL; ent = ent->next)
6565 if (ent->addend == rel->r_addend
e717da7e 6566 && ent->owner == ibfd
e7b938ca 6567 && ent->tls_type == tls_type)
411e1bfb
AM
6568 break;
6569 if (ent == NULL)
6570 abort ();
6571
6572 if (tls_set == 0)
6573 {
6574 /* We managed to get rid of a got entry. */
6575 if (ent->got.refcount > 0)
6576 ent->got.refcount -= 1;
6577 }
411e1bfb
AM
6578 }
6579 else if (h != NULL)
6580 {
6581 struct ppc_link_hash_entry * eh;
6582 struct ppc_dyn_relocs **pp;
6583 struct ppc_dyn_relocs *p;
6584
6585 /* Adjust dynamic relocs. */
6586 eh = (struct ppc_link_hash_entry *) h;
6587 for (pp = &eh->dyn_relocs;
6588 (p = *pp) != NULL;
6589 pp = &p->next)
6590 if (p->sec == sec)
6591 {
6592 /* If we got rid of a DTPMOD/DTPREL reloc
6593 pair then we'll lose one or two dyn
6594 relocs. */
951fd09b 6595 if (tls_set == (TLS_EXPLICIT | TLS_GD))
411e1bfb 6596 p->count -= 1;
951fd09b 6597 p->count -= 1;
411e1bfb
AM
6598 if (p->count == 0)
6599 *pp = p->next;
6600 break;
6601 }
6602 }
6603
e7b938ca
AM
6604 *tls_mask |= tls_set;
6605 *tls_mask &= ~tls_clear;
411e1bfb
AM
6606 }
6607
6608 if (elf_section_data (sec)->relocs != relstart)
6609 free (relstart);
6610 }
6611
6612 if (locsyms != NULL
6613 && (elf_tdata (ibfd)->symtab_hdr.contents
6614 != (unsigned char *) locsyms))
6cdc0ccc
AM
6615 {
6616 if (!info->keep_memory)
411e1bfb 6617 free (locsyms);
6cdc0ccc 6618 else
411e1bfb 6619 elf_tdata (ibfd)->symtab_hdr.contents = (unsigned char *) locsyms;
6cdc0ccc 6620 }
1e2f5b6e 6621 }
b34976b6 6622 return TRUE;
1e2f5b6e 6623}
b34976b6 6624
65f38f15
AM
6625/* Allocate space in .plt, .got and associated reloc sections for
6626 dynamic relocs. */
5bd4f169 6627
b34976b6 6628static bfd_boolean
4ce794b7 6629allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6630{
65f38f15
AM
6631 struct bfd_link_info *info;
6632 struct ppc_link_hash_table *htab;
5bd4f169 6633 asection *s;
65f38f15
AM
6634 struct ppc_link_hash_entry *eh;
6635 struct ppc_dyn_relocs *p;
411e1bfb 6636 struct got_entry *gent;
5bd4f169 6637
e92d460e 6638 if (h->root.type == bfd_link_hash_indirect)
b34976b6 6639 return TRUE;
5bd4f169 6640
e92d460e
AM
6641 if (h->root.type == bfd_link_hash_warning)
6642 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6643
65f38f15
AM
6644 info = (struct bfd_link_info *) inf;
6645 htab = ppc_hash_table (info);
5bd4f169 6646
65f38f15 6647 if (htab->elf.dynamic_sections_created
411e1bfb 6648 && h->dynindx != -1
9c7a29a3 6649 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
5bd4f169 6650 {
411e1bfb
AM
6651 struct plt_entry *pent;
6652 bfd_boolean doneone = FALSE;
6653 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
6654 if (pent->plt.refcount > 0)
6655 {
411e1bfb
AM
6656 /* If this is the first .plt entry, make room for the special
6657 first entry. */
4ce794b7 6658 s = htab->plt;
eea6121a
AM
6659 if (s->size == 0)
6660 s->size += PLT_INITIAL_ENTRY_SIZE;
411e1bfb 6661
eea6121a 6662 pent->plt.offset = s->size;
411e1bfb
AM
6663
6664 /* Make room for this entry. */
eea6121a 6665 s->size += PLT_ENTRY_SIZE;
411e1bfb
AM
6666
6667 /* Make room for the .glink code. */
4ce794b7 6668 s = htab->glink;
eea6121a
AM
6669 if (s->size == 0)
6670 s->size += GLINK_CALL_STUB_SIZE;
411e1bfb 6671 /* We need bigger stubs past index 32767. */
eea6121a
AM
6672 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
6673 s->size += 4;
6674 s->size += 2*4;
411e1bfb
AM
6675
6676 /* We also need to make an entry in the .rela.plt section. */
4ce794b7 6677 s = htab->relplt;
eea6121a 6678 s->size += sizeof (Elf64_External_Rela);
411e1bfb
AM
6679 doneone = TRUE;
6680 }
6681 else
6682 pent->plt.offset = (bfd_vma) -1;
6683 if (!doneone)
65f38f15 6684 {
411e1bfb 6685 h->plt.plist = NULL;
65f38f15
AM
6686 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
6687 }
6688 }
6689 else
6690 {
411e1bfb 6691 h->plt.plist = NULL;
65f38f15
AM
6692 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
6693 }
6694
951fd09b
AM
6695 eh = (struct ppc_link_hash_entry *) h;
6696 /* Run through the TLS GD got entries first if we're changing them
6697 to TPREL. */
e7b938ca 6698 if ((eh->tls_mask & TLS_TPRELGD) != 0)
951fd09b
AM
6699 for (gent = h->got.glist; gent != NULL; gent = gent->next)
6700 if (gent->got.refcount > 0
6701 && (gent->tls_type & TLS_GD) != 0)
6702 {
6703 /* This was a GD entry that has been converted to TPREL. If
6704 there happens to be a TPREL entry we can use that one. */
6705 struct got_entry *ent;
6706 for (ent = h->got.glist; ent != NULL; ent = ent->next)
6707 if (ent->got.refcount > 0
6708 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
6709 && ent->addend == gent->addend
6710 && ent->owner == gent->owner)
951fd09b
AM
6711 {
6712 gent->got.refcount = 0;
6713 break;
6714 }
6715
6716 /* If not, then we'll be using our own TPREL entry. */
6717 if (gent->got.refcount != 0)
6718 gent->tls_type = TLS_TLS | TLS_TPREL;
6719 }
6720
411e1bfb
AM
6721 for (gent = h->got.glist; gent != NULL; gent = gent->next)
6722 if (gent->got.refcount > 0)
6723 {
951fd09b
AM
6724 bfd_boolean dyn;
6725
411e1bfb 6726 /* Make sure this symbol is output as a dynamic symbol.
951fd09b
AM
6727 Undefined weak syms won't yet be marked as dynamic,
6728 nor will all TLS symbols. */
411e1bfb
AM
6729 if (h->dynindx == -1
6730 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
6731 {
c152c796 6732 if (! bfd_elf_link_record_dynamic_symbol (info, h))
411e1bfb
AM
6733 return FALSE;
6734 }
65f38f15 6735
d881513a
AM
6736 if ((gent->tls_type & TLS_LD) != 0
6737 && !(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC))
411e1bfb 6738 {
e717da7e 6739 gent->got.offset = ppc64_tlsld_got (gent->owner)->offset;
951fd09b 6740 continue;
411e1bfb 6741 }
951fd09b 6742
e717da7e 6743 s = ppc64_elf_tdata (gent->owner)->got;
eea6121a
AM
6744 gent->got.offset = s->size;
6745 s->size
d881513a 6746 += (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)) ? 16 : 8;
951fd09b 6747 dyn = htab->elf.dynamic_sections_created;
4e795f50
AM
6748 if ((info->shared
6749 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
6750 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6751 || h->root.type != bfd_link_hash_undefweak))
eea6121a 6752 ppc64_elf_tdata (gent->owner)->relgot->size
e7b938ca 6753 += (gent->tls_type & eh->tls_mask & TLS_GD
951fd09b
AM
6754 ? 2 * sizeof (Elf64_External_Rela)
6755 : sizeof (Elf64_External_Rela));
411e1bfb
AM
6756 }
6757 else
6758 gent->got.offset = (bfd_vma) -1;
65f38f15 6759
65f38f15 6760 if (eh->dyn_relocs == NULL)
b34976b6 6761 return TRUE;
65f38f15
AM
6762
6763 /* In the shared -Bsymbolic case, discard space allocated for
6764 dynamic pc-relative relocs against symbols which turn out to be
6765 defined in regular objects. For the normal shared case, discard
6766 space for relocs that have become local due to symbol visibility
6767 changes. */
6768
6769 if (info->shared)
6770 {
9c7a29a3
AM
6771 /* Relocs that use pc_count are those that appear on a call insn,
6772 or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
6773 generated via assembly. We want calls to protected symbols to
6774 resolve directly to the function rather than going via the plt.
6775 If people want function pointer comparisons to work as expected
6776 then they should avoid writing weird assembly. */
09695f56 6777 if (SYMBOL_CALLS_LOCAL (info, h))
65f38f15
AM
6778 {
6779 struct ppc_dyn_relocs **pp;
6780
6781 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5bd4f169 6782 {
65f38f15
AM
6783 p->count -= p->pc_count;
6784 p->pc_count = 0;
6785 if (p->count == 0)
6786 *pp = p->next;
6787 else
6788 pp = &p->next;
5bd4f169 6789 }
65f38f15 6790 }
4e795f50
AM
6791
6792 /* Also discard relocs on undefined weak syms with non-default
6793 visibility. */
6794 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6795 && h->root.type == bfd_link_hash_undefweak)
6796 eh->dyn_relocs = NULL;
65f38f15 6797 }
f4656909 6798 else if (ELIMINATE_COPY_RELOCS)
65f38f15
AM
6799 {
6800 /* For the non-shared case, discard space for relocs against
6801 symbols which turn out to need copy relocs or are not
6802 dynamic. */
6803
6804 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
58ac9f71
AM
6805 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
6806 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
65f38f15
AM
6807 {
6808 /* Make sure this symbol is output as a dynamic symbol.
6809 Undefined weak syms won't yet be marked as dynamic. */
6810 if (h->dynindx == -1
6811 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
6812 {
c152c796 6813 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 6814 return FALSE;
65f38f15
AM
6815 }
6816
6817 /* If that succeeded, we know we'll be keeping all the
6818 relocs. */
6819 if (h->dynindx != -1)
6820 goto keep;
6821 }
6822
6823 eh->dyn_relocs = NULL;
6824
ec338859 6825 keep: ;
65f38f15
AM
6826 }
6827
6828 /* Finally, allocate space. */
6829 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6830 {
6831 asection *sreloc = elf_section_data (p->sec)->sreloc;
eea6121a 6832 sreloc->size += p->count * sizeof (Elf64_External_Rela);
65f38f15
AM
6833 }
6834
b34976b6 6835 return TRUE;
65f38f15
AM
6836}
6837
6838/* Find any dynamic relocs that apply to read-only sections. */
6839
b34976b6 6840static bfd_boolean
4ce794b7 6841readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
65f38f15
AM
6842{
6843 struct ppc_link_hash_entry *eh;
6844 struct ppc_dyn_relocs *p;
6845
e92d460e
AM
6846 if (h->root.type == bfd_link_hash_warning)
6847 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6848
65f38f15
AM
6849 eh = (struct ppc_link_hash_entry *) h;
6850 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6851 {
6852 asection *s = p->sec->output_section;
6853
6854 if (s != NULL && (s->flags & SEC_READONLY) != 0)
6855 {
4ce794b7 6856 struct bfd_link_info *info = inf;
65f38f15
AM
6857
6858 info->flags |= DF_TEXTREL;
6859
6860 /* Not an error, just cut short the traversal. */
b34976b6 6861 return FALSE;
65f38f15
AM
6862 }
6863 }
b34976b6 6864 return TRUE;
65f38f15
AM
6865}
6866
6867/* Set the sizes of the dynamic sections. */
6868
b34976b6 6869static bfd_boolean
4ce794b7
AM
6870ppc64_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
6871 struct bfd_link_info *info)
65f38f15
AM
6872{
6873 struct ppc_link_hash_table *htab;
6874 bfd *dynobj;
6875 asection *s;
b34976b6 6876 bfd_boolean relocs;
65f38f15
AM
6877 bfd *ibfd;
6878
6879 htab = ppc_hash_table (info);
6880 dynobj = htab->elf.dynobj;
6881 if (dynobj == NULL)
6882 abort ();
6883
6884 if (htab->elf.dynamic_sections_created)
6885 {
6886 /* Set the contents of the .interp section to the interpreter. */
36af4a4e 6887 if (info->executable)
65f38f15
AM
6888 {
6889 s = bfd_get_section_by_name (dynobj, ".interp");
6890 if (s == NULL)
6891 abort ();
eea6121a 6892 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
6893 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
6894 }
6895 }
6896
6897 /* Set up .got offsets for local syms, and space for local dynamic
6898 relocs. */
6899 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6900 {
411e1bfb
AM
6901 struct got_entry **lgot_ents;
6902 struct got_entry **end_lgot_ents;
e7b938ca 6903 char *lgot_masks;
65f38f15
AM
6904 bfd_size_type locsymcount;
6905 Elf_Internal_Shdr *symtab_hdr;
6906 asection *srel;
6907
ee75fd95 6908 if (!is_ppc64_elf_target (ibfd->xvec))
65f38f15
AM
6909 continue;
6910
e717da7e
AM
6911 if (ppc64_tlsld_got (ibfd)->refcount > 0)
6912 {
6913 s = ppc64_elf_tdata (ibfd)->got;
eea6121a
AM
6914 ppc64_tlsld_got (ibfd)->offset = s->size;
6915 s->size += 16;
e717da7e
AM
6916 if (info->shared)
6917 {
6918 srel = ppc64_elf_tdata (ibfd)->relgot;
eea6121a 6919 srel->size += sizeof (Elf64_External_Rela);
e717da7e
AM
6920 }
6921 }
6922 else
6923 ppc64_tlsld_got (ibfd)->offset = (bfd_vma) -1;
6924
65f38f15
AM
6925 for (s = ibfd->sections; s != NULL; s = s->next)
6926 {
ec338859 6927 struct ppc_dyn_relocs *p;
65f38f15 6928
ec338859
AM
6929 for (p = *((struct ppc_dyn_relocs **)
6930 &elf_section_data (s)->local_dynrel);
6931 p != NULL;
6932 p = p->next)
65f38f15 6933 {
ec338859
AM
6934 if (!bfd_is_abs_section (p->sec)
6935 && bfd_is_abs_section (p->sec->output_section))
6936 {
6937 /* Input section has been discarded, either because
6938 it is a copy of a linkonce section or due to
6939 linker script /DISCARD/, so we'll be discarding
6940 the relocs too. */
6941 }
248866a8 6942 else if (p->count != 0)
ec338859
AM
6943 {
6944 srel = elf_section_data (p->sec)->sreloc;
eea6121a 6945 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
6946 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
6947 info->flags |= DF_TEXTREL;
ec338859 6948 }
65f38f15
AM
6949 }
6950 }
6951
411e1bfb
AM
6952 lgot_ents = elf_local_got_ents (ibfd);
6953 if (!lgot_ents)
65f38f15
AM
6954 continue;
6955
6956 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
6957 locsymcount = symtab_hdr->sh_info;
411e1bfb 6958 end_lgot_ents = lgot_ents + locsymcount;
e7b938ca 6959 lgot_masks = (char *) end_lgot_ents;
e717da7e
AM
6960 s = ppc64_elf_tdata (ibfd)->got;
6961 srel = ppc64_elf_tdata (ibfd)->relgot;
e7b938ca 6962 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 6963 {
411e1bfb
AM
6964 struct got_entry *ent;
6965
6966 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
6967 if (ent->got.refcount > 0)
6968 {
e7b938ca 6969 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 6970 {
e717da7e 6971 if (ppc64_tlsld_got (ibfd)->offset == (bfd_vma) -1)
411e1bfb 6972 {
eea6121a
AM
6973 ppc64_tlsld_got (ibfd)->offset = s->size;
6974 s->size += 16;
411e1bfb 6975 if (info->shared)
eea6121a 6976 srel->size += sizeof (Elf64_External_Rela);
411e1bfb 6977 }
e717da7e 6978 ent->got.offset = ppc64_tlsld_got (ibfd)->offset;
411e1bfb
AM
6979 }
6980 else
6981 {
eea6121a 6982 ent->got.offset = s->size;
e7b938ca 6983 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
411e1bfb 6984 {
eea6121a 6985 s->size += 16;
411e1bfb 6986 if (info->shared)
eea6121a 6987 srel->size += 2 * sizeof (Elf64_External_Rela);
411e1bfb
AM
6988 }
6989 else
6990 {
eea6121a 6991 s->size += 8;
411e1bfb 6992 if (info->shared)
eea6121a 6993 srel->size += sizeof (Elf64_External_Rela);
411e1bfb
AM
6994 }
6995 }
6996 }
6997 else
6998 ent->got.offset = (bfd_vma) -1;
65f38f15
AM
6999 }
7000 }
7001
7002 /* Allocate global sym .plt and .got entries, and space for global
7003 sym dynamic relocs. */
4ce794b7 7004 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
65f38f15
AM
7005
7006 /* We now have determined the sizes of the various dynamic sections.
7007 Allocate memory for them. */
b34976b6 7008 relocs = FALSE;
65f38f15
AM
7009 for (s = dynobj->sections; s != NULL; s = s->next)
7010 {
7011 if ((s->flags & SEC_LINKER_CREATED) == 0)
7012 continue;
7013
4ce794b7 7014 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
7015 /* These haven't been allocated yet; don't strip. */
7016 continue;
e717da7e
AM
7017 else if (s == htab->got
7018 || s == htab->plt
4ce794b7 7019 || s == htab->glink)
65f38f15
AM
7020 {
7021 /* Strip this section if we don't need it; see the
7022 comment below. */
5bd4f169 7023 }
65f38f15 7024 else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
5bd4f169 7025 {
eea6121a 7026 if (s->size == 0)
5bd4f169
AM
7027 {
7028 /* If we don't need this section, strip it from the
7029 output file. This is mostly to handle .rela.bss and
7030 .rela.plt. We must create both sections in
7031 create_dynamic_sections, because they must be created
7032 before the linker maps input sections to output
7033 sections. The linker does that before
7034 adjust_dynamic_symbol is called, and it is that
7035 function which decides whether anything needs to go
7036 into these sections. */
5bd4f169
AM
7037 }
7038 else
7039 {
4ce794b7 7040 if (s != htab->relplt)
b34976b6 7041 relocs = TRUE;
5bd4f169
AM
7042
7043 /* We use the reloc_count field as a counter if we need
7044 to copy relocs into the output file. */
7045 s->reloc_count = 0;
7046 }
7047 }
65f38f15 7048 else
5bd4f169
AM
7049 {
7050 /* It's not one of our sections, so don't allocate space. */
7051 continue;
7052 }
7053
eea6121a 7054 if (s->size == 0)
5bd4f169
AM
7055 {
7056 _bfd_strip_section_from_output (info, s);
7057 continue;
7058 }
7059
5f333394 7060 /* .plt is in the bss section. We don't initialise it. */
680a3378 7061 if (s == htab->plt)
5f333394
AM
7062 continue;
7063
65f38f15
AM
7064 /* Allocate memory for the section contents. We use bfd_zalloc
7065 here in case unused entries are not reclaimed before the
7066 section's contents are written out. This should not happen,
411e1bfb
AM
7067 but this way if it does we get a R_PPC64_NONE reloc in .rela
7068 sections instead of garbage.
7069 We also rely on the section contents being zero when writing
7070 the GOT. */
eea6121a 7071 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 7072 if (s->contents == NULL)
b34976b6 7073 return FALSE;
5bd4f169
AM
7074 }
7075
e717da7e
AM
7076 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7077 {
ee75fd95 7078 if (!is_ppc64_elf_target (ibfd->xvec))
7b53ace3
AM
7079 continue;
7080
e717da7e
AM
7081 s = ppc64_elf_tdata (ibfd)->got;
7082 if (s != NULL && s != htab->got)
7083 {
eea6121a 7084 if (s->size == 0)
e717da7e
AM
7085 _bfd_strip_section_from_output (info, s);
7086 else
7087 {
eea6121a 7088 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
7089 if (s->contents == NULL)
7090 return FALSE;
7091 }
7092 }
7093 s = ppc64_elf_tdata (ibfd)->relgot;
7094 if (s != NULL)
7095 {
eea6121a 7096 if (s->size == 0)
e717da7e
AM
7097 _bfd_strip_section_from_output (info, s);
7098 else
7099 {
eea6121a 7100 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
7101 if (s->contents == NULL)
7102 return FALSE;
7103 relocs = TRUE;
7104 s->reloc_count = 0;
7105 }
7106 }
7107 }
7108
e86ce104 7109 if (htab->elf.dynamic_sections_created)
5bd4f169
AM
7110 {
7111 /* Add some entries to the .dynamic section. We fill in the
7112 values later, in ppc64_elf_finish_dynamic_sections, but we
7113 must add the entries now so that we get the correct size for
7114 the .dynamic section. The DT_DEBUG entry is filled in by the
7115 dynamic linker and used by the debugger. */
dc810e39 7116#define add_dynamic_entry(TAG, VAL) \
5a580b3a 7117 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 7118
36af4a4e 7119 if (info->executable)
5bd4f169 7120 {
dc810e39 7121 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 7122 return FALSE;
5bd4f169
AM
7123 }
7124
eea6121a 7125 if (htab->plt != NULL && htab->plt->size != 0)
5bd4f169 7126 {
dc810e39
AM
7127 if (!add_dynamic_entry (DT_PLTGOT, 0)
7128 || !add_dynamic_entry (DT_PLTRELSZ, 0)
7129 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
7130 || !add_dynamic_entry (DT_JMPREL, 0)
7131 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 7132 return FALSE;
5bd4f169
AM
7133 }
7134
19397422
AM
7135 if (NO_OPD_RELOCS)
7136 {
7137 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
7138 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 7139 return FALSE;
19397422
AM
7140 }
7141
5bd4f169
AM
7142 if (relocs)
7143 {
dc810e39
AM
7144 if (!add_dynamic_entry (DT_RELA, 0)
7145 || !add_dynamic_entry (DT_RELASZ, 0)
7146 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 7147 return FALSE;
5bd4f169 7148
65f38f15
AM
7149 /* If any dynamic relocs apply to a read-only section,
7150 then we need a DT_TEXTREL entry. */
248866a8 7151 if ((info->flags & DF_TEXTREL) == 0)
4ce794b7 7152 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
5bd4f169 7153
65f38f15 7154 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 7155 {
65f38f15 7156 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 7157 return FALSE;
5bd4f169 7158 }
5bd4f169 7159 }
5bd4f169 7160 }
65f38f15 7161#undef add_dynamic_entry
5bd4f169 7162
b34976b6 7163 return TRUE;
5bd4f169
AM
7164}
7165
721956f4 7166/* Determine the type of stub needed, if any, for a call. */
5bd4f169 7167
4ce794b7
AM
7168static inline enum ppc_stub_type
7169ppc_type_of_stub (asection *input_sec,
7170 const Elf_Internal_Rela *rel,
7171 struct ppc_link_hash_entry **hash,
7172 bfd_vma destination)
5bd4f169 7173{
721956f4
AM
7174 struct ppc_link_hash_entry *h = *hash;
7175 bfd_vma location;
7176 bfd_vma branch_offset;
7177 bfd_vma max_branch_offset;
4ce794b7 7178 enum elf_ppc64_reloc_type r_type;
5bd4f169 7179
721956f4
AM
7180 if (h != NULL)
7181 {
7182 if (h->oh != NULL
8387904d
AM
7183 && h->oh->is_func_descriptor)
7184 h = h->oh;
7185
7186 if (h->elf.dynindx != -1)
5bd4f169 7187 {
411e1bfb 7188 struct plt_entry *ent;
8387904d
AM
7189
7190 for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
411e1bfb
AM
7191 if (ent->addend == rel->r_addend
7192 && ent->plt.offset != (bfd_vma) -1)
7193 {
8387904d 7194 *hash = h;
411e1bfb
AM
7195 return ppc_stub_plt_call;
7196 }
5bd4f169
AM
7197 }
7198
ee7de3e6
AM
7199 if (!(h->elf.root.type == bfd_link_hash_defined
7200 || h->elf.root.type == bfd_link_hash_defweak)
7201 || h->elf.root.u.def.section->output_section == NULL)
721956f4 7202 return ppc_stub_none;
5d1634d7 7203 }
5d1634d7 7204
721956f4
AM
7205 /* Determine where the call point is. */
7206 location = (input_sec->output_offset
7207 + input_sec->output_section->vma
7208 + rel->r_offset);
5d1634d7 7209
721956f4
AM
7210 branch_offset = destination - location;
7211 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 7212
721956f4
AM
7213 /* Determine if a long branch stub is needed. */
7214 max_branch_offset = 1 << 25;
4ce794b7 7215 if (r_type != R_PPC64_REL24)
721956f4 7216 max_branch_offset = 1 << 15;
5d1634d7 7217
721956f4
AM
7218 if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
7219 /* We need a stub. Figure out whether a long_branch or plt_branch
7220 is needed later. */
7221 return ppc_stub_long_branch;
5d1634d7 7222
721956f4 7223 return ppc_stub_none;
5d1634d7
AM
7224}
7225
7226/* Build a .plt call stub. */
7227
4ce794b7
AM
7228static inline bfd_byte *
7229build_plt_stub (bfd *obfd, bfd_byte *p, int offset)
5d1634d7
AM
7230{
7231#define PPC_LO(v) ((v) & 0xffff)
7232#define PPC_HI(v) (((v) >> 16) & 0xffff)
7233#define PPC_HA(v) PPC_HI ((v) + 0x8000)
7234
5d1634d7 7235 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
ad8e1ba5 7236 bfd_put_32 (obfd, STD_R2_40R1, p), p += 4;
5d1634d7
AM
7237 bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p), p += 4;
7238 if (PPC_HA (offset + 8) != PPC_HA (offset))
ad8e1ba5 7239 bfd_put_32 (obfd, ADDIS_R12_R12 | 1, p), p += 4;
5d1634d7
AM
7240 offset += 8;
7241 bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset), p), p += 4;
7242 if (PPC_HA (offset + 8) != PPC_HA (offset))
ad8e1ba5 7243 bfd_put_32 (obfd, ADDIS_R12_R12 | 1, p), p += 4;
5d1634d7
AM
7244 offset += 8;
7245 bfd_put_32 (obfd, MTCTR_R11, p), p += 4;
7246 bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p), p += 4;
7247 bfd_put_32 (obfd, BCTR, p), p += 4;
7248 return p;
7249}
7250
b34976b6 7251static bfd_boolean
4ce794b7 7252ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 7253{
721956f4
AM
7254 struct ppc_stub_hash_entry *stub_entry;
7255 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
7256 struct bfd_link_info *info;
7257 struct ppc_link_hash_table *htab;
721956f4
AM
7258 bfd_byte *loc;
7259 bfd_byte *p;
7260 unsigned int indx;
411e1bfb 7261 struct plt_entry *ent;
ee75fd95 7262 bfd_vma dest, off;
721956f4 7263 int size;
5d1634d7 7264
721956f4
AM
7265 /* Massage our args to the form they really have. */
7266 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 7267 info = in_arg;
5d1634d7 7268
5d1634d7
AM
7269 htab = ppc_hash_table (info);
7270
721956f4 7271 /* Make a note of the offset within the stubs for this entry. */
eea6121a 7272 stub_entry->stub_offset = stub_entry->stub_sec->size;
97b639ba 7273 loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
721956f4 7274
4ce794b7 7275 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 7276 switch (stub_entry->stub_type)
5d1634d7 7277 {
721956f4 7278 case ppc_stub_long_branch:
ad8e1ba5 7279 case ppc_stub_long_branch_r2off:
721956f4 7280 /* Branches are relative. This is where we are going to. */
ee75fd95
AM
7281 off = dest = (stub_entry->target_value
7282 + stub_entry->target_section->output_offset
7283 + stub_entry->target_section->output_section->vma);
5d1634d7 7284
721956f4
AM
7285 /* And this is where we are coming from. */
7286 off -= (stub_entry->stub_offset
97b639ba
AM
7287 + stub_entry->stub_sec->output_offset
7288 + stub_entry->stub_sec->output_section->vma);
e86ce104 7289
ad8e1ba5
AM
7290 if (stub_entry->stub_type != ppc_stub_long_branch_r2off)
7291 size = 4;
7292 else
7293 {
7294 bfd_vma r2off;
7295
7296 r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
7297 - htab->stub_group[stub_entry->id_sec->id].toc_off);
97b639ba 7298 bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
ad8e1ba5 7299 loc += 4;
97b639ba 7300 bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
ad8e1ba5 7301 loc += 4;
97b639ba 7302 bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
ad8e1ba5
AM
7303 loc += 4;
7304 off -= 12;
7305 size = 16;
7306 }
97b639ba 7307 bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
ad8e1ba5
AM
7308
7309 BFD_ASSERT (off + (1 << 25) < (bfd_vma) (1 << 26));
ee75fd95
AM
7310
7311 if (info->emitrelocations)
7312 {
7313 Elf_Internal_Rela *relocs, *r;
7314 struct bfd_elf_section_data *elfsec_data;
7315
7316 elfsec_data = elf_section_data (stub_entry->stub_sec);
7317 relocs = elfsec_data->relocs;
7318 if (relocs == NULL)
7319 {
7320 bfd_size_type relsize;
7321 relsize = stub_entry->stub_sec->reloc_count * sizeof (*relocs);
7322 relocs = bfd_alloc (htab->stub_bfd, relsize);
7323 if (relocs == NULL)
7324 return FALSE;
7325 elfsec_data->relocs = relocs;
7326 elfsec_data->rel_hdr.sh_size = relsize;
7327 elfsec_data->rel_hdr.sh_entsize = 24;
7328 stub_entry->stub_sec->reloc_count = 0;
7329 }
7330 r = relocs + stub_entry->stub_sec->reloc_count;
7331 stub_entry->stub_sec->reloc_count += 1;
7332 r->r_offset = loc - stub_entry->stub_sec->contents;
7333 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
7334 r->r_addend = dest;
7335 if (stub_entry->h != NULL)
7336 {
7337 struct elf_link_hash_entry **hashes;
7338 unsigned long symndx;
7339 struct ppc_link_hash_entry *h;
7340
7341 hashes = elf_sym_hashes (htab->stub_bfd);
7342 if (hashes == NULL)
7343 {
7344 bfd_size_type hsize;
7345
7346 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
7347 hashes = bfd_zalloc (htab->stub_bfd, hsize);
7348 if (hashes == NULL)
7349 return FALSE;
7350 elf_sym_hashes (htab->stub_bfd) = hashes;
7351 htab->stub_globals = 1;
7352 }
7353 symndx = htab->stub_globals++;
7354 h = stub_entry->h;
7355 hashes[symndx] = &h->elf;
7356 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
7357 if (h->oh != NULL && h->oh->is_func)
7358 h = h->oh;
7359 if (h->elf.root.u.def.section != stub_entry->target_section)
7360 /* H is an opd symbol. The addend must be zero. */
7361 r->r_addend = 0;
7362 else
7363 {
7364 off = (h->elf.root.u.def.value
7365 + h->elf.root.u.def.section->output_offset
7366 + h->elf.root.u.def.section->output_section->vma);
7367 r->r_addend -= off;
7368 }
7369 }
7370 }
721956f4 7371 break;
e86ce104 7372
721956f4 7373 case ppc_stub_plt_branch:
ad8e1ba5 7374 case ppc_stub_plt_branch_r2off:
721956f4
AM
7375 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
7376 stub_entry->root.string + 9,
b34976b6 7377 FALSE, FALSE);
721956f4
AM
7378 if (br_entry == NULL)
7379 {
7380 (*_bfd_error_handler) (_("can't find branch stub `%s'"),
7381 stub_entry->root.string + 9);
b34976b6
AM
7382 htab->stub_error = TRUE;
7383 return FALSE;
721956f4
AM
7384 }
7385
7386 off = (stub_entry->target_value
7387 + stub_entry->target_section->output_offset
7388 + stub_entry->target_section->output_section->vma);
7389
4ce794b7
AM
7390 bfd_put_64 (htab->brlt->owner, off,
7391 htab->brlt->contents + br_entry->offset);
721956f4 7392
ee75fd95 7393 if (htab->relbrlt != NULL)
721956f4
AM
7394 {
7395 /* Create a reloc for the branch lookup table entry. */
7396 Elf_Internal_Rela rela;
ad8e1ba5 7397 bfd_byte *rl;
5d1634d7 7398
721956f4 7399 rela.r_offset = (br_entry->offset
4ce794b7
AM
7400 + htab->brlt->output_offset
7401 + htab->brlt->output_section->vma);
721956f4
AM
7402 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
7403 rela.r_addend = off;
7404
4ce794b7
AM
7405 rl = htab->relbrlt->contents;
7406 rl += htab->relbrlt->reloc_count++ * sizeof (Elf64_External_Rela);
7407 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
721956f4
AM
7408 }
7409
7410 off = (br_entry->offset
4ce794b7
AM
7411 + htab->brlt->output_offset
7412 + htab->brlt->output_section->vma
7413 - elf_gp (htab->brlt->output_section->owner)
ad8e1ba5 7414 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 7415
ad8e1ba5 7416 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7
AM
7417 {
7418 (*_bfd_error_handler)
e86ce104 7419 (_("linkage table error against `%s'"),
721956f4 7420 stub_entry->root.string);
5d1634d7 7421 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
7422 htab->stub_error = TRUE;
7423 return FALSE;
5d1634d7 7424 }
41bd81ab 7425
721956f4 7426 indx = off;
ad8e1ba5
AM
7427 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
7428 {
97b639ba 7429 bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
ad8e1ba5 7430 loc += 4;
97b639ba 7431 bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
ad8e1ba5
AM
7432 size = 16;
7433 }
7434 else
7435 {
7436 bfd_vma r2off;
7437
7438 r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
7439 - htab->stub_group[stub_entry->id_sec->id].toc_off);
97b639ba 7440 bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
ad8e1ba5 7441 loc += 4;
97b639ba 7442 bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
ad8e1ba5 7443 loc += 4;
97b639ba 7444 bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
ad8e1ba5 7445 loc += 4;
97b639ba 7446 bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
ad8e1ba5 7447 loc += 4;
97b639ba 7448 bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
ad8e1ba5
AM
7449 size = 28;
7450 }
7451 loc += 4;
97b639ba 7452 bfd_put_32 (htab->stub_bfd, MTCTR_R11, loc);
ad8e1ba5 7453 loc += 4;
97b639ba 7454 bfd_put_32 (htab->stub_bfd, BCTR, loc);
721956f4 7455 break;
5d1634d7 7456
721956f4 7457 case ppc_stub_plt_call:
c862ae31
AM
7458 /* Do the best we can for shared libraries built without
7459 exporting ".foo" for each "foo". This can happen when symbol
7460 versioning scripts strip all bar a subset of symbols. */
8387904d
AM
7461 if (stub_entry->h->oh != NULL
7462 && stub_entry->h->oh->elf.root.type != bfd_link_hash_defined
34814b9f 7463 && stub_entry->h->oh->elf.root.type != bfd_link_hash_defweak)
c862ae31
AM
7464 {
7465 /* Point the symbol at the stub. There may be multiple stubs,
7466 we don't really care; The main thing is to make this sym
8f3bab57
AM
7467 defined somewhere. Maybe defining the symbol in the stub
7468 section is a silly idea. If we didn't do this, htab->top_id
7469 could disappear. */
34814b9f
AM
7470 stub_entry->h->oh->elf.root.type = bfd_link_hash_defined;
7471 stub_entry->h->oh->elf.root.u.def.section = stub_entry->stub_sec;
7472 stub_entry->h->oh->elf.root.u.def.value = stub_entry->stub_offset;
c862ae31
AM
7473 }
7474
721956f4 7475 /* Now build the stub. */
411e1bfb
AM
7476 off = (bfd_vma) -1;
7477 for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
7478 if (ent->addend == stub_entry->addend)
7479 {
7480 off = ent->plt.offset;
7481 break;
7482 }
721956f4
AM
7483 if (off >= (bfd_vma) -2)
7484 abort ();
7485
7486 off &= ~ (bfd_vma) 1;
4ce794b7
AM
7487 off += (htab->plt->output_offset
7488 + htab->plt->output_section->vma
7489 - elf_gp (htab->plt->output_section->owner)
ad8e1ba5 7490 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 7491
ad8e1ba5 7492 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4
AM
7493 {
7494 (*_bfd_error_handler)
7495 (_("linkage table error against `%s'"),
7496 stub_entry->h->elf.root.root.string);
7497 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
7498 htab->stub_error = TRUE;
7499 return FALSE;
721956f4
AM
7500 }
7501
97b639ba 7502 p = build_plt_stub (htab->stub_bfd, loc, off);
721956f4
AM
7503 size = p - loc;
7504 break;
7505
7506 default:
7507 BFD_FAIL ();
b34976b6 7508 return FALSE;
721956f4
AM
7509 }
7510
eea6121a 7511 stub_entry->stub_sec->size += size;
97b639ba 7512
ee75fd95 7513 if (htab->emit_stub_syms)
97b639ba
AM
7514 {
7515 struct elf_link_hash_entry *h;
ee75fd95
AM
7516 size_t len1, len2;
7517 char *name;
7518 const char *const stub_str[] = { "long_branch",
7519 "long_branch_r2off",
7520 "plt_branch",
7521 "plt_branch_r2off",
7522 "plt_call" };
7523
7524 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
7525 len2 = strlen (stub_entry->root.string);
7526 name = bfd_malloc (len1 + len2 + 2);
7527 if (name == NULL)
7528 return FALSE;
7529 memcpy (name, stub_entry->root.string, 9);
7530 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
7531 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
7532 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
7533 if (h == NULL)
7534 return FALSE;
7535 if (h->root.type == bfd_link_hash_new)
7536 {
7537 h->root.type = bfd_link_hash_defined;
7538 h->root.u.def.section = stub_entry->stub_sec;
7539 h->root.u.def.value = stub_entry->stub_offset;
7540 h->elf_link_hash_flags = (ELF_LINK_HASH_REF_REGULAR
7541 | ELF_LINK_HASH_DEF_REGULAR
7542 | ELF_LINK_HASH_REF_REGULAR_NONWEAK
7543 | ELF_LINK_FORCED_LOCAL);
7544 }
7545 }
7546
b34976b6 7547 return TRUE;
721956f4
AM
7548}
7549
7550/* As above, but don't actually build the stub. Just bump offset so
7551 we know stub section sizes, and select plt_branch stubs where
7552 long_branch stubs won't do. */
7553
b34976b6 7554static bfd_boolean
4ce794b7 7555ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
7556{
7557 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 7558 struct bfd_link_info *info;
721956f4
AM
7559 struct ppc_link_hash_table *htab;
7560 bfd_vma off;
7561 int size;
7562
7563 /* Massage our args to the form they really have. */
7564 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
7565 info = in_arg;
7566
7567 htab = ppc_hash_table (info);
721956f4
AM
7568
7569 if (stub_entry->stub_type == ppc_stub_plt_call)
7570 {
411e1bfb 7571 struct plt_entry *ent;
58ac9f71 7572 off = (bfd_vma) -1;
411e1bfb
AM
7573 for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
7574 if (ent->addend == stub_entry->addend)
7575 {
7576 off = ent->plt.offset & ~(bfd_vma) 1;
7577 break;
7578 }
58ac9f71 7579 if (off >= (bfd_vma) -2)
411e1bfb 7580 abort ();
4ce794b7
AM
7581 off += (htab->plt->output_offset
7582 + htab->plt->output_section->vma
7583 - elf_gp (htab->plt->output_section->owner)
ad8e1ba5 7584 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 7585
ad8e1ba5 7586 size = PLT_CALL_STUB_SIZE;
4ce794b7 7587 if (PPC_HA (off + 16) != PPC_HA (off))
721956f4
AM
7588 size += 4;
7589 }
7590 else
7591 {
ad8e1ba5
AM
7592 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
7593 variants. */
721956f4
AM
7594 off = (stub_entry->target_value
7595 + stub_entry->target_section->output_offset
7596 + stub_entry->target_section->output_section->vma);
eea6121a 7597 off -= (stub_entry->stub_sec->size
721956f4
AM
7598 + stub_entry->stub_sec->output_offset
7599 + stub_entry->stub_sec->output_section->vma);
7600
ad8e1ba5
AM
7601 /* Reset the stub type from the plt variant in case we now
7602 can reach with a shorter stub. */
7603 if (stub_entry->stub_type >= ppc_stub_plt_branch)
7604 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
7605
7606 size = 4;
7607 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
7608 {
7609 off -= 12;
7610 size = 16;
7611 }
7612
7613 /* If the branch offset if too big, use a ppc_stub_plt_branch. */
721956f4
AM
7614 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
7615 {
7616 struct ppc_branch_hash_entry *br_entry;
7617
7618 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
7619 stub_entry->root.string + 9,
b34976b6 7620 TRUE, FALSE);
721956f4
AM
7621 if (br_entry == NULL)
7622 {
7623 (*_bfd_error_handler) (_("can't build branch stub `%s'"),
7624 stub_entry->root.string + 9);
b34976b6
AM
7625 htab->stub_error = TRUE;
7626 return FALSE;
721956f4
AM
7627 }
7628
7629 if (br_entry->iter != htab->stub_iteration)
7630 {
7631 br_entry->iter = htab->stub_iteration;
eea6121a
AM
7632 br_entry->offset = htab->brlt->size;
7633 htab->brlt->size += 8;
63bc6f6c 7634
ee75fd95 7635 if (htab->relbrlt != NULL)
eea6121a 7636 htab->relbrlt->size += sizeof (Elf64_External_Rela);
721956f4 7637 }
ad8e1ba5
AM
7638
7639 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
721956f4 7640 size = 16;
ad8e1ba5
AM
7641 if (stub_entry->stub_type != ppc_stub_plt_branch)
7642 size = 28;
721956f4 7643 }
ee75fd95
AM
7644
7645 if (info->emitrelocations
7646 && (stub_entry->stub_type == ppc_stub_long_branch
7647 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
7648 stub_entry->stub_sec->reloc_count += 1;
721956f4
AM
7649 }
7650
eea6121a 7651 stub_entry->stub_sec->size += size;
b34976b6 7652 return TRUE;
721956f4
AM
7653}
7654
7655/* Set up various things so that we can make a list of input sections
7656 for each output section included in the link. Returns -1 on error,
cedb70c5 7657 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
7658
7659int
4ce794b7 7660ppc64_elf_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
721956f4
AM
7661{
7662 bfd *input_bfd;
734b6cf9 7663 int top_id, top_index, id;
721956f4 7664 asection *section;
734b6cf9 7665 asection **input_list;
721956f4
AM
7666 bfd_size_type amt;
7667 struct ppc_link_hash_table *htab = ppc_hash_table (info);
7668
4ce794b7 7669 if (htab->brlt == NULL)
721956f4
AM
7670 return 0;
7671
1e2f5b6e 7672 /* Find the top input section id. */
3d6f9012 7673 for (input_bfd = info->input_bfds, top_id = 3;
721956f4
AM
7674 input_bfd != NULL;
7675 input_bfd = input_bfd->link_next)
7676 {
721956f4
AM
7677 for (section = input_bfd->sections;
7678 section != NULL;
7679 section = section->next)
7680 {
7681 if (top_id < section->id)
7682 top_id = section->id;
7683 }
7684 }
721956f4 7685
8f3bab57 7686 htab->top_id = top_id;
721956f4 7687 amt = sizeof (struct map_stub) * (top_id + 1);
4ce794b7 7688 htab->stub_group = bfd_zmalloc (amt);
721956f4
AM
7689 if (htab->stub_group == NULL)
7690 return -1;
7691
3d6f9012
AM
7692 /* Set toc_off for com, und, abs and ind sections. */
7693 for (id = 0; id < 3; id++)
7694 htab->stub_group[id].toc_off = TOC_BASE_OFF;
721956f4 7695
3d6f9012 7696 elf_gp (output_bfd) = htab->toc_curr = ppc64_elf_toc (output_bfd);
734b6cf9
AM
7697
7698 /* We can't use output_bfd->section_count here to find the top output
7699 section index as some sections may have been removed, and
7700 _bfd_strip_section_from_output doesn't renumber the indices. */
7701 for (section = output_bfd->sections, top_index = 0;
7702 section != NULL;
7703 section = section->next)
7704 {
7705 if (top_index < section->index)
7706 top_index = section->index;
7707 }
7708
7709 htab->top_index = top_index;
7710 amt = sizeof (asection *) * (top_index + 1);
4ce794b7 7711 input_list = bfd_zmalloc (amt);
734b6cf9
AM
7712 htab->input_list = input_list;
7713 if (input_list == NULL)
7714 return -1;
7715
721956f4
AM
7716 return 1;
7717}
7718
e717da7e
AM
7719/* The linker repeatedly calls this function for each TOC input section
7720 and linker generated GOT section. Group input bfds such that the toc
7721 within a group is less than 64k in size. Will break with cute linker
7722 scripts that play games with dot in the output toc section. */
ad8e1ba5
AM
7723
7724void
4ce794b7 7725ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
7726{
7727 struct ppc_link_hash_table *htab = ppc_hash_table (info);
99877b66
AM
7728 bfd_vma addr = isec->output_offset + isec->output_section->vma;
7729 bfd_vma off = addr - htab->toc_curr;
ad8e1ba5 7730
99877b66
AM
7731 if (off + isec->size > 0x10000)
7732 htab->toc_curr = addr;
7733
7734 elf_gp (isec->owner) = (htab->toc_curr
7735 - elf_gp (isec->output_section->owner)
7736 + TOC_BASE_OFF);
ad8e1ba5
AM
7737}
7738
7739/* Called after the last call to the above function. */
7740
7741void
4ce794b7
AM
7742ppc64_elf_reinit_toc (bfd *output_bfd ATTRIBUTE_UNUSED,
7743 struct bfd_link_info *info)
ad8e1ba5
AM
7744{
7745 struct ppc_link_hash_table *htab = ppc_hash_table (info);
ad8e1ba5
AM
7746
7747 /* toc_curr tracks the TOC offset used for code sections below in
7748 ppc64_elf_next_input_section. Start off at 0x8000. */
3d6f9012 7749 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
7750}
7751
9b5ecbd0
AM
7752/* No toc references were found in ISEC. If the code in ISEC makes no
7753 calls, then there's no need to use toc adjusting stubs when branching
7754 into ISEC. Actually, indirect calls from ISEC are OK as they will
7755 load r2. */
7756
7757static int
4ce794b7 7758toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0
AM
7759{
7760 bfd_byte *contents;
7761 bfd_size_type i;
7762 int ret;
7763 int branch_ok;
7764
772119ce
AM
7765 /* We know none of our code bearing sections will need toc stubs. */
7766 if ((isec->flags & SEC_LINKER_CREATED) != 0)
7767 return 0;
7768
eea6121a 7769 if (isec->size == 0)
082c50f8
AM
7770 return 0;
7771
9b5ecbd0
AM
7772 /* Hack for linux kernel. .fixup contains branches, but only back to
7773 the function that hit an exception. */
7774 branch_ok = strcmp (isec->name, ".fixup") == 0;
7775
7776 contents = elf_section_data (isec)->this_hdr.contents;
7777 if (contents == NULL)
7778 {
eea6121a 7779 if (!bfd_malloc_and_get_section (isec->owner, isec, &contents))
9b5ecbd0 7780 {
eea6121a
AM
7781 if (contents != NULL)
7782 free (contents);
9b5ecbd0
AM
7783 return -1;
7784 }
7785 if (info->keep_memory)
7786 elf_section_data (isec)->this_hdr.contents = contents;
7787 }
7788
7789 /* Code scan, because we don't necessarily have relocs on calls to
7790 static functions. */
7791 ret = 0;
eea6121a 7792 for (i = 0; i < isec->size; i += 4)
9b5ecbd0
AM
7793 {
7794 unsigned long insn = bfd_get_32 (isec->owner, contents + i);
7795 /* Is this a branch? */
772119ce 7796 if ((insn & (0x3f << 26)) == (18 << 26)
9b5ecbd0
AM
7797 /* If branch and link, it's a function call. */
7798 && ((insn & 1) != 0
7799 /* Sibling calls use a plain branch. I don't know a way
7800 of deciding whether a branch is really a sibling call. */
7801 || !branch_ok))
7802 {
7803 ret = 1;
7804 break;
7805 }
7806 }
7807
7808 if (elf_section_data (isec)->this_hdr.contents != contents)
7809 free (contents);
7810 return ret;
7811}
7812
721956f4
AM
7813/* The linker repeatedly calls this function for each input section,
7814 in the order that input sections are linked into output sections.
7815 Build lists of input sections to determine groupings between which
7816 we may insert linker stubs. */
7817
9b5ecbd0 7818bfd_boolean
4ce794b7 7819ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
7820{
7821 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9b5ecbd0 7822 int ret;
721956f4 7823
734b6cf9
AM
7824 if ((isec->output_section->flags & SEC_CODE) != 0
7825 && isec->output_section->index <= htab->top_index)
721956f4 7826 {
734b6cf9 7827 asection **list = htab->input_list + isec->output_section->index;
3d6f9012 7828 /* Steal the link_sec pointer for our list. */
721956f4 7829#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3d6f9012
AM
7830 /* This happens to make the list in reverse order,
7831 which is what we want. */
734b6cf9
AM
7832 PREV_SEC (isec) = *list;
7833 *list = isec;
721956f4 7834 }
ad8e1ba5
AM
7835
7836 /* If a code section has a function that uses the TOC then we need
7837 to use the right TOC (obviously). Also, make sure that .opd gets
ee87f2da
AM
7838 the correct TOC value for R_PPC64_TOC relocs that don't have or
7839 can't find their function symbol (shouldn't ever happen now). */
ad8e1ba5 7840 if (isec->has_gp_reloc || (isec->flags & SEC_CODE) == 0)
9b5ecbd0
AM
7841 {
7842 if (elf_gp (isec->owner) != 0)
7843 htab->toc_curr = elf_gp (isec->owner);
7844 }
7845 else if ((ret = toc_adjusting_stub_needed (info, isec)) < 0)
7846 return FALSE;
7847 else
7848 isec->has_gp_reloc = ret;
ad8e1ba5
AM
7849
7850 /* Functions that don't use the TOC can belong in any TOC group.
7851 Use the last TOC base. This happens to make _init and _fini
7852 pasting work. */
7853 htab->stub_group[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 7854 return TRUE;
721956f4
AM
7855}
7856
7857/* See whether we can group stub sections together. Grouping stub
7858 sections may result in fewer stubs. More importantly, we need to
7859 put all .init* and .fini* stubs at the beginning of the .init or
7860 .fini output sections respectively, because glibc splits the
7861 _init and _fini functions into multiple parts. Putting a stub in
7862 the middle of a function is not a good idea. */
7863
7864static void
4ce794b7
AM
7865group_sections (struct ppc_link_hash_table *htab,
7866 bfd_size_type stub_group_size,
7867 bfd_boolean stubs_always_before_branch)
721956f4 7868{
734b6cf9
AM
7869 asection **list = htab->input_list + htab->top_index;
7870 do
721956f4 7871 {
734b6cf9
AM
7872 asection *tail = *list;
7873 while (tail != NULL)
721956f4 7874 {
734b6cf9
AM
7875 asection *curr;
7876 asection *prev;
7877 bfd_size_type total;
7878 bfd_boolean big_sec;
7879 bfd_vma curr_toc;
7880
7881 curr = tail;
eea6121a 7882 total = tail->size;
734b6cf9
AM
7883 big_sec = total >= stub_group_size;
7884 curr_toc = htab->stub_group[tail->id].toc_off;
7885
7886 while ((prev = PREV_SEC (curr)) != NULL
7887 && ((total += curr->output_offset - prev->output_offset)
ad8e1ba5
AM
7888 < stub_group_size)
7889 && htab->stub_group[prev->id].toc_off == curr_toc)
734b6cf9
AM
7890 curr = prev;
7891
7892 /* OK, the size from the start of CURR to the end is less
7893 than stub_group_size and thus can be handled by one stub
7894 section. (or the tail section is itself larger than
7895 stub_group_size, in which case we may be toast.) We
7896 should really be keeping track of the total size of stubs
7897 added here, as stubs contribute to the final output
7898 section size. That's a little tricky, and this way will
7899 only break if stubs added make the total size more than
7900 2^25, ie. for the default stub_group_size, if stubs total
7901 more than 2097152 bytes, or nearly 75000 plt call stubs. */
7902 do
721956f4
AM
7903 {
7904 prev = PREV_SEC (tail);
734b6cf9 7905 /* Set up this stub group. */
721956f4
AM
7906 htab->stub_group[tail->id].link_sec = curr;
7907 }
734b6cf9
AM
7908 while (tail != curr && (tail = prev) != NULL);
7909
7910 /* But wait, there's more! Input sections up to stub_group_size
7911 bytes before the stub section can be handled by it too.
7912 Don't do this if we have a really large section after the
7913 stubs, as adding more stubs increases the chance that
7914 branches may not reach into the stub section. */
7915 if (!stubs_always_before_branch && !big_sec)
7916 {
7917 total = 0;
7918 while (prev != NULL
7919 && ((total += tail->output_offset - prev->output_offset)
7920 < stub_group_size)
7921 && htab->stub_group[prev->id].toc_off == curr_toc)
7922 {
7923 tail = prev;
7924 prev = PREV_SEC (tail);
7925 htab->stub_group[tail->id].link_sec = curr;
7926 }
7927 }
7928 tail = prev;
721956f4
AM
7929 }
7930 }
734b6cf9
AM
7931 while (list-- != htab->input_list);
7932 free (htab->input_list);
721956f4
AM
7933#undef PREV_SEC
7934}
7935
721956f4
AM
7936/* Determine and set the size of the stub section for a final link.
7937
7938 The basic idea here is to examine all the relocations looking for
7939 PC-relative calls to a target that is unreachable with a "bl"
7940 instruction. */
7941
b34976b6 7942bfd_boolean
4ce794b7 7943ppc64_elf_size_stubs (bfd *output_bfd,
4ce794b7
AM
7944 struct bfd_link_info *info,
7945 bfd_signed_vma group_size,
7946 asection *(*add_stub_section) (const char *, asection *),
7947 void (*layout_sections_again) (void))
721956f4
AM
7948{
7949 bfd_size_type stub_group_size;
b34976b6 7950 bfd_boolean stubs_always_before_branch;
721956f4
AM
7951 struct ppc_link_hash_table *htab = ppc_hash_table (info);
7952
7953 /* Stash our params away. */
721956f4
AM
7954 htab->add_stub_section = add_stub_section;
7955 htab->layout_sections_again = layout_sections_again;
7956 stubs_always_before_branch = group_size < 0;
7957 if (group_size < 0)
7958 stub_group_size = -group_size;
7959 else
7960 stub_group_size = group_size;
7961 if (stub_group_size == 1)
7962 {
7963 /* Default values. */
58ac9f71
AM
7964 if (stubs_always_before_branch)
7965 {
7966 stub_group_size = 0x1e00000;
7967 if (htab->has_14bit_branch)
7968 stub_group_size = 0x7800;
7969 }
7970 else
7971 {
7972 stub_group_size = 0x1c00000;
7973 if (htab->has_14bit_branch)
7974 stub_group_size = 0x7000;
7975 }
721956f4
AM
7976 }
7977
7978 group_sections (htab, stub_group_size, stubs_always_before_branch);
7979
721956f4
AM
7980 while (1)
7981 {
7982 bfd *input_bfd;
7983 unsigned int bfd_indx;
7984 asection *stub_sec;
b34976b6 7985 bfd_boolean stub_changed;
721956f4
AM
7986
7987 htab->stub_iteration += 1;
b34976b6 7988 stub_changed = FALSE;
721956f4
AM
7989
7990 for (input_bfd = info->input_bfds, bfd_indx = 0;
7991 input_bfd != NULL;
7992 input_bfd = input_bfd->link_next, bfd_indx++)
7993 {
7994 Elf_Internal_Shdr *symtab_hdr;
7995 asection *section;
6cdc0ccc 7996 Elf_Internal_Sym *local_syms = NULL;
721956f4
AM
7997
7998 /* We'll need the symbol table in a second. */
7999 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
8000 if (symtab_hdr->sh_info == 0)
8001 continue;
8002
721956f4
AM
8003 /* Walk over each section attached to the input bfd. */
8004 for (section = input_bfd->sections;
8005 section != NULL;
8006 section = section->next)
8007 {
721956f4 8008 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
8009
8010 /* If there aren't any relocs, then there's nothing more
8011 to do. */
8012 if ((section->flags & SEC_RELOC) == 0
8013 || section->reloc_count == 0)
8014 continue;
8015
8016 /* If this section is a link-once section that will be
8017 discarded, then don't create any stubs. */
8018 if (section->output_section == NULL
8019 || section->output_section->owner != output_bfd)
8020 continue;
8021
1e2f5b6e
AM
8022 /* Get the relocs. */
8023 internal_relocs
4ce794b7 8024 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 8025 info->keep_memory);
721956f4 8026 if (internal_relocs == NULL)
1e2f5b6e 8027 goto error_ret_free_local;
721956f4
AM
8028
8029 /* Now examine each relocation. */
8030 irela = internal_relocs;
8031 irelaend = irela + section->reloc_count;
8032 for (; irela < irelaend; irela++)
8033 {
4ce794b7
AM
8034 enum elf_ppc64_reloc_type r_type;
8035 unsigned int r_indx;
721956f4
AM
8036 enum ppc_stub_type stub_type;
8037 struct ppc_stub_hash_entry *stub_entry;
8387904d 8038 asection *sym_sec, *code_sec;
721956f4
AM
8039 bfd_vma sym_value;
8040 bfd_vma destination;
8843416a 8041 bfd_boolean ok_dest;
721956f4 8042 struct ppc_link_hash_entry *hash;
8387904d 8043 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
8044 struct elf_link_hash_entry *h;
8045 Elf_Internal_Sym *sym;
721956f4
AM
8046 char *stub_name;
8047 const asection *id_sec;
8387904d 8048 long *opd_adjust;
721956f4
AM
8049
8050 r_type = ELF64_R_TYPE (irela->r_info);
8051 r_indx = ELF64_R_SYM (irela->r_info);
8052
4ce794b7 8053 if (r_type >= R_PPC64_max)
721956f4
AM
8054 {
8055 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 8056 goto error_ret_free_internal;
721956f4
AM
8057 }
8058
8059 /* Only look for stubs on branch instructions. */
4ce794b7
AM
8060 if (r_type != R_PPC64_REL24
8061 && r_type != R_PPC64_REL14
8062 && r_type != R_PPC64_REL14_BRTAKEN
8063 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
8064 continue;
8065
8066 /* Now determine the call target, its name, value,
8067 section. */
411e1bfb
AM
8068 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8069 r_indx, input_bfd))
8070 goto error_ret_free_internal;
8071 hash = (struct ppc_link_hash_entry *) h;
8072
8843416a 8073 ok_dest = FALSE;
8387904d 8074 fdh = NULL;
411e1bfb 8075 if (hash == NULL)
721956f4 8076 {
411e1bfb 8077 sym_value = sym->st_value;
8843416a 8078 ok_dest = TRUE;
721956f4
AM
8079 }
8080 else
8081 {
411e1bfb 8082 sym_value = 0;
99877b66
AM
8083 /* Recognise an old ABI func code entry sym, and
8084 use the func descriptor sym instead. */
8085 if (hash->elf.root.type == bfd_link_hash_undefweak
8387904d
AM
8086 && hash->elf.root.root.string[0] == '.'
8087 && (fdh = get_fdh (hash, htab)) != NULL)
8088 {
8387904d
AM
8089 if (fdh->elf.root.type == bfd_link_hash_defined
8090 || fdh->elf.root.type == bfd_link_hash_defweak)
8091 {
8092 sym_sec = fdh->elf.root.u.def.section;
8093 sym_value = fdh->elf.root.u.def.value;
8094 if (sym_sec->output_section != NULL)
8095 ok_dest = TRUE;
8096 }
99877b66
AM
8097 else
8098 fdh = NULL;
8387904d
AM
8099 }
8100 else if (hash->elf.root.type == bfd_link_hash_defined
8101 || hash->elf.root.type == bfd_link_hash_defweak)
721956f4 8102 {
721956f4
AM
8103 sym_value = hash->elf.root.u.def.value;
8104 if (sym_sec->output_section != NULL)
8843416a 8105 ok_dest = TRUE;
721956f4
AM
8106 }
8107 else if (hash->elf.root.type == bfd_link_hash_undefweak)
8108 ;
8109 else if (hash->elf.root.type == bfd_link_hash_undefined)
8110 ;
8111 else
8112 {
8113 bfd_set_error (bfd_error_bad_value);
8114 goto error_ret_free_internal;
8115 }
8116 }
8117
8843416a
AM
8118 destination = 0;
8119 if (ok_dest)
8120 {
8121 sym_value += irela->r_addend;
8122 destination = (sym_value
8123 + sym_sec->output_offset
8124 + sym_sec->output_section->vma);
8125 }
8126
8387904d
AM
8127 code_sec = sym_sec;
8128 opd_adjust = get_opd_info (sym_sec);
8129 if (opd_adjust != NULL)
8130 {
8131 bfd_vma dest;
8132
8133 if (hash == NULL)
8134 {
3f764659 8135 long adjust = opd_adjust[sym_value / 8];
8387904d
AM
8136 if (adjust == -1)
8137 continue;
8138 sym_value += adjust;
8139 }
8140 dest = opd_entry_value (sym_sec, sym_value,
8141 &code_sec, &sym_value);
8142 if (dest != (bfd_vma) -1)
8143 {
8144 destination = dest;
8145 if (fdh != NULL)
8146 {
8147 /* Fixup old ABI sym to point at code
8148 entry. */
99877b66 8149 hash->elf.root.type = bfd_link_hash_defweak;
8387904d
AM
8150 hash->elf.root.u.def.section = code_sec;
8151 hash->elf.root.u.def.value = sym_value;
8152 }
8153 }
8154 }
8155
721956f4
AM
8156 /* Determine what (if any) linker stub is needed. */
8157 stub_type = ppc_type_of_stub (section, irela, &hash,
8158 destination);
ad8e1ba5
AM
8159
8160 if (stub_type != ppc_stub_plt_call)
8161 {
8162 /* Check whether we need a TOC adjusting stub.
8163 Since the linker pastes together pieces from
8164 different object files when creating the
8165 _init and _fini functions, it may be that a
8166 call to what looks like a local sym is in
8167 fact a call needing a TOC adjustment. */
8387904d
AM
8168 if (code_sec != NULL
8169 && code_sec->output_section != NULL
8170 && (htab->stub_group[code_sec->id].toc_off
9b5ecbd0 8171 != htab->stub_group[section->id].toc_off)
8387904d 8172 && code_sec->has_gp_reloc
9b5ecbd0 8173 && section->has_gp_reloc)
ad8e1ba5
AM
8174 stub_type = ppc_stub_long_branch_r2off;
8175 }
8176
721956f4
AM
8177 if (stub_type == ppc_stub_none)
8178 continue;
8179
411e1bfb
AM
8180 /* __tls_get_addr calls might be eliminated. */
8181 if (stub_type != ppc_stub_plt_call
8182 && hash != NULL
8387904d
AM
8183 && (hash == htab->tls_get_addr
8184 || hash == htab->tls_get_addr_fd)
411e1bfb
AM
8185 && section->has_tls_reloc
8186 && irela != internal_relocs)
8187 {
8188 /* Get tls info. */
e7b938ca 8189 char *tls_mask;
411e1bfb 8190
0d4792f7 8191 if (!get_tls_mask (&tls_mask, NULL, &local_syms,
411e1bfb
AM
8192 irela - 1, input_bfd))
8193 goto error_ret_free_internal;
e7b938ca 8194 if (*tls_mask != 0)
411e1bfb
AM
8195 continue;
8196 }
8197
721956f4
AM
8198 /* Support for grouping stub sections. */
8199 id_sec = htab->stub_group[section->id].link_sec;
8200
8201 /* Get the name of this stub. */
8202 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
8203 if (!stub_name)
8204 goto error_ret_free_internal;
8205
8206 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 8207 stub_name, FALSE, FALSE);
721956f4
AM
8208 if (stub_entry != NULL)
8209 {
8210 /* The proper stub has already been created. */
8211 free (stub_name);
8212 continue;
8213 }
8214
8215 stub_entry = ppc_add_stub (stub_name, section, htab);
8216 if (stub_entry == NULL)
8217 {
8218 free (stub_name);
6cdc0ccc
AM
8219 error_ret_free_internal:
8220 if (elf_section_data (section)->relocs == NULL)
8221 free (internal_relocs);
8222 error_ret_free_local:
8223 if (local_syms != NULL
8224 && (symtab_hdr->contents
8225 != (unsigned char *) local_syms))
8226 free (local_syms);
b34976b6 8227 return FALSE;
721956f4
AM
8228 }
8229
ad8e1ba5 8230 stub_entry->stub_type = stub_type;
721956f4 8231 stub_entry->target_value = sym_value;
8387904d 8232 stub_entry->target_section = code_sec;
721956f4 8233 stub_entry->h = hash;
411e1bfb 8234 stub_entry->addend = irela->r_addend;
ee75fd95
AM
8235
8236 if (stub_entry->h != NULL)
8237 htab->stub_globals += 1;
8238
b34976b6 8239 stub_changed = TRUE;
721956f4
AM
8240 }
8241
8242 /* We're done with the internal relocs, free them. */
6cdc0ccc 8243 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 8244 free (internal_relocs);
721956f4 8245 }
6cdc0ccc
AM
8246
8247 if (local_syms != NULL
8248 && symtab_hdr->contents != (unsigned char *) local_syms)
8249 {
8250 if (!info->keep_memory)
8251 free (local_syms);
8252 else
8253 symtab_hdr->contents = (unsigned char *) local_syms;
8254 }
721956f4
AM
8255 }
8256
8257 if (!stub_changed)
8258 break;
8259
8260 /* OK, we've added some stubs. Find out the new size of the
8261 stub sections. */
8262 for (stub_sec = htab->stub_bfd->sections;
8263 stub_sec != NULL;
8264 stub_sec = stub_sec->next)
e717da7e 8265 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
ee75fd95
AM
8266 {
8267 stub_sec->size = 0;
8268 stub_sec->reloc_count = 0;
8269 }
eea6121a
AM
8270
8271 htab->brlt->size = 0;
ee75fd95 8272 if (htab->relbrlt != NULL)
eea6121a 8273 htab->relbrlt->size = 0;
721956f4 8274
63bc6f6c 8275 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4
AM
8276
8277 /* Ask the linker to do its stuff. */
8278 (*htab->layout_sections_again) ();
8279 }
8280
afbe61cf
AM
8281 /* It would be nice to strip .branch_lt from the output if the
8282 section is empty, but it's too late. If we strip sections here,
8283 the dynamic symbol table is corrupted since the section symbol
8284 for the stripped section isn't written. */
721956f4 8285
b34976b6 8286 return TRUE;
721956f4
AM
8287}
8288
8289/* Called after we have determined section placement. If sections
805fc799 8290 move, we'll be called again. Provide a value for TOCstart. */
721956f4 8291
805fc799 8292bfd_vma
4ce794b7 8293ppc64_elf_toc (bfd *obfd)
721956f4 8294{
805fc799
AM
8295 asection *s;
8296 bfd_vma TOCstart;
721956f4 8297
805fc799
AM
8298 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
8299 order. The TOC starts where the first of these sections starts. */
8300 s = bfd_get_section_by_name (obfd, ".got");
8301 if (s == NULL)
8302 s = bfd_get_section_by_name (obfd, ".toc");
8303 if (s == NULL)
8304 s = bfd_get_section_by_name (obfd, ".tocbss");
8305 if (s == NULL)
8306 s = bfd_get_section_by_name (obfd, ".plt");
8307 if (s == NULL)
8308 {
8309 /* This may happen for
8310 o references to TOC base (SYM@toc / TOC[tc0]) without a
8311 .toc directive
8312 o bad linker script
8313 o --gc-sections and empty TOC sections
8314
8315 FIXME: Warn user? */
8316
8317 /* Look for a likely section. We probably won't even be
8318 using TOCstart. */
8319 for (s = obfd->sections; s != NULL; s = s->next)
8320 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY))
8321 == (SEC_ALLOC | SEC_SMALL_DATA))
8322 break;
721956f4 8323 if (s == NULL)
805fc799
AM
8324 for (s = obfd->sections; s != NULL; s = s->next)
8325 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA))
8326 == (SEC_ALLOC | SEC_SMALL_DATA))
8327 break;
721956f4 8328 if (s == NULL)
805fc799
AM
8329 for (s = obfd->sections; s != NULL; s = s->next)
8330 if ((s->flags & (SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
8331 break;
721956f4 8332 if (s == NULL)
805fc799
AM
8333 for (s = obfd->sections; s != NULL; s = s->next)
8334 if ((s->flags & SEC_ALLOC) == SEC_ALLOC)
8335 break;
8336 }
721956f4 8337
805fc799
AM
8338 TOCstart = 0;
8339 if (s != NULL)
8340 TOCstart = s->output_section->vma + s->output_offset;
721956f4 8341
805fc799 8342 return TOCstart;
721956f4
AM
8343}
8344
8345/* Build all the stubs associated with the current output file.
8346 The stubs are kept in a hash table attached to the main linker
8347 hash table. This function is called via gldelf64ppc_finish. */
8348
b34976b6 8349bfd_boolean
4ce794b7
AM
8350ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
8351 struct bfd_link_info *info,
8352 char **stats)
5d1634d7
AM
8353{
8354 struct ppc_link_hash_table *htab = ppc_hash_table (info);
721956f4 8355 asection *stub_sec;
5d1634d7 8356 bfd_byte *p;
e717da7e 8357 int stub_sec_count = 0;
5d1634d7 8358
ad8e1ba5 8359 htab->emit_stub_syms = emit_stub_syms;
eea6121a
AM
8360
8361 /* Allocate memory to hold the linker stubs. */
721956f4
AM
8362 for (stub_sec = htab->stub_bfd->sections;
8363 stub_sec != NULL;
8364 stub_sec = stub_sec->next)
eea6121a
AM
8365 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
8366 && stub_sec->size != 0)
e717da7e 8367 {
eea6121a
AM
8368 stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
8369 if (stub_sec->contents == NULL)
8370 return FALSE;
8371 /* We want to check that built size is the same as calculated
8372 size. rawsize is a convenient location to use. */
8373 stub_sec->rawsize = stub_sec->size;
8374 stub_sec->size = 0;
e717da7e 8375 }
5d1634d7 8376
4ce794b7 8377 if (htab->plt != NULL)
5d1634d7 8378 {
9f951329 8379 unsigned int indx;
ad8e1ba5 8380 bfd_vma plt0;
9f951329 8381
721956f4 8382 /* Build the .glink plt call stub. */
4ce794b7
AM
8383 plt0 = (htab->plt->output_section->vma
8384 + htab->plt->output_offset
8385 - (htab->glink->output_section->vma
8386 + htab->glink->output_offset
ad8e1ba5
AM
8387 + GLINK_CALL_STUB_SIZE));
8388 if (plt0 + 0x80008000 > 0xffffffff)
721956f4 8389 {
ad8e1ba5
AM
8390 (*_bfd_error_handler) (_(".glink and .plt too far apart"));
8391 bfd_set_error (bfd_error_bad_value);
8392 return FALSE;
721956f4 8393 }
721956f4 8394
97b639ba
AM
8395 if (htab->emit_stub_syms)
8396 {
8397 struct elf_link_hash_entry *h;
8398 h = elf_link_hash_lookup (&htab->elf, "__glink", TRUE, FALSE, FALSE);
8399 if (h == NULL)
8400 return FALSE;
8401 if (h->root.type == bfd_link_hash_new)
8402 {
8403 h->root.type = bfd_link_hash_defined;
8404 h->root.u.def.section = htab->glink;
8405 h->root.u.def.value = 0;
8406 h->elf_link_hash_flags = (ELF_LINK_HASH_REF_REGULAR
8407 | ELF_LINK_HASH_DEF_REGULAR
8408 | ELF_LINK_HASH_REF_REGULAR_NONWEAK
8409 | ELF_LINK_FORCED_LOCAL);
8410 }
8411 }
4ce794b7
AM
8412 p = htab->glink->contents;
8413 bfd_put_32 (htab->glink->owner, MFCTR_R12, p);
ad8e1ba5 8414 p += 4;
4ce794b7 8415 bfd_put_32 (htab->glink->owner, SLDI_R11_R0_3, p);
ad8e1ba5 8416 p += 4;
4ce794b7 8417 bfd_put_32 (htab->glink->owner, ADDIC_R2_R0_32K, p);
ad8e1ba5 8418 p += 4;
4ce794b7 8419 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
ad8e1ba5 8420 p += 4;
4ce794b7 8421 bfd_put_32 (htab->glink->owner, SRADI_R2_R2_63, p);
ad8e1ba5 8422 p += 4;
4ce794b7 8423 bfd_put_32 (htab->glink->owner, SLDI_R11_R0_2, p);
ad8e1ba5 8424 p += 4;
4ce794b7 8425 bfd_put_32 (htab->glink->owner, AND_R2_R2_R11, p);
ad8e1ba5 8426 p += 4;
4ce794b7 8427 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
ad8e1ba5 8428 p += 4;
4ce794b7 8429 bfd_put_32 (htab->glink->owner, ADD_R12_R12_R2, p);
ad8e1ba5 8430 p += 4;
4ce794b7 8431 bfd_put_32 (htab->glink->owner, ADDIS_R12_R12 | PPC_HA (plt0), p);
ad8e1ba5 8432 p += 4;
4ce794b7 8433 bfd_put_32 (htab->glink->owner, LD_R11_0R12 | PPC_LO (plt0), p);
ad8e1ba5 8434 p += 4;
4ce794b7 8435 bfd_put_32 (htab->glink->owner, ADDI_R12_R12 | PPC_LO (plt0), p);
ad8e1ba5 8436 p += 4;
4ce794b7 8437 bfd_put_32 (htab->glink->owner, LD_R2_0R12 | 8, p);
ad8e1ba5 8438 p += 4;
4ce794b7 8439 bfd_put_32 (htab->glink->owner, MTCTR_R11, p);
ad8e1ba5 8440 p += 4;
4ce794b7 8441 bfd_put_32 (htab->glink->owner, LD_R11_0R12 | 16, p);
ad8e1ba5 8442 p += 4;
4ce794b7 8443 bfd_put_32 (htab->glink->owner, BCTR, p);
ad8e1ba5
AM
8444 p += 4;
8445
9f951329
AM
8446 /* Build the .glink lazy link call stubs. */
8447 indx = 0;
eea6121a 8448 while (p < htab->glink->contents + htab->glink->size)
9f951329
AM
8449 {
8450 if (indx < 0x8000)
8451 {
4ce794b7 8452 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
9f951329
AM
8453 p += 4;
8454 }
8455 else
8456 {
4ce794b7 8457 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
9f951329 8458 p += 4;
4ce794b7 8459 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
9f951329
AM
8460 p += 4;
8461 }
4ce794b7
AM
8462 bfd_put_32 (htab->glink->owner,
8463 B_DOT | ((htab->glink->contents - p) & 0x3fffffc), p);
a16d5acb 8464 indx++;
9f951329
AM
8465 p += 4;
8466 }
eea6121a 8467 htab->glink->rawsize = p - htab->glink->contents;
5d1634d7 8468 }
5d1634d7 8469
eea6121a 8470 if (htab->brlt->size != 0)
721956f4 8471 {
4ce794b7 8472 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 8473 htab->brlt->size);
4ce794b7 8474 if (htab->brlt->contents == NULL)
b34976b6 8475 return FALSE;
721956f4 8476 }
ee75fd95 8477 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
8478 {
8479 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 8480 htab->relbrlt->size);
63bc6f6c
AM
8481 if (htab->relbrlt->contents == NULL)
8482 return FALSE;
8483 }
5d1634d7 8484
721956f4
AM
8485 /* Build the stubs as directed by the stub hash table. */
8486 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 8487
721956f4
AM
8488 for (stub_sec = htab->stub_bfd->sections;
8489 stub_sec != NULL;
8490 stub_sec = stub_sec->next)
e717da7e
AM
8491 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
8492 {
8493 stub_sec_count += 1;
eea6121a 8494 if (stub_sec->rawsize != stub_sec->size)
e717da7e
AM
8495 break;
8496 }
5d1634d7 8497
721956f4 8498 if (stub_sec != NULL
eea6121a 8499 || htab->glink->rawsize != htab->glink->size)
5d1634d7 8500 {
b34976b6 8501 htab->stub_error = TRUE;
721956f4 8502 (*_bfd_error_handler) (_("stubs don't match calculated size"));
5d1634d7 8503 }
721956f4 8504
d2a300cf
AM
8505 if (htab->stub_error)
8506 return FALSE;
8507
8508 if (stats != NULL)
8509 {
8510 *stats = bfd_malloc (500);
8511 if (*stats == NULL)
8512 return FALSE;
8513
ee75fd95 8514 sprintf (*stats, _("linker stubs in %u group%s\n"
d2a300cf
AM
8515 " branch %lu\n"
8516 " toc adjust %lu\n"
8517 " long branch %lu\n"
8518 " long toc adj %lu\n"
8519 " plt call %lu"),
e717da7e 8520 stub_sec_count,
ee75fd95 8521 stub_sec_count == 1 ? "" : "s",
4ce794b7
AM
8522 htab->stub_count[ppc_stub_long_branch - 1],
8523 htab->stub_count[ppc_stub_long_branch_r2off - 1],
8524 htab->stub_count[ppc_stub_plt_branch - 1],
8525 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
8526 htab->stub_count[ppc_stub_plt_call - 1]);
d2a300cf
AM
8527 }
8528 return TRUE;
5bd4f169
AM
8529}
8530
99877b66
AM
8531/* This function undoes the changes made by add_symbol_adjust. */
8532
8533static bfd_boolean
8534undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
8535{
8536 struct ppc_link_hash_entry *eh;
8537
8538 if (h->root.type == bfd_link_hash_indirect)
8539 return TRUE;
8540
8541 if (h->root.type == bfd_link_hash_warning)
8542 h = (struct elf_link_hash_entry *) h->root.u.i.link;
8543
8544 eh = (struct ppc_link_hash_entry *) h;
8545 if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
8546 return TRUE;
8547
8548 eh->elf.root.type = bfd_link_hash_undefined;
8549 return TRUE;
8550}
8551
8552void
8553ppc64_elf_restore_symbols (struct bfd_link_info *info)
8554{
8555 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8556 elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
8557}
8558
5bd4f169
AM
8559/* The RELOCATE_SECTION function is called by the ELF backend linker
8560 to handle the relocations for a section.
8561
8562 The relocs are always passed as Rela structures; if the section
8563 actually uses Rel structures, the r_addend field will always be
8564 zero.
8565
8566 This function is responsible for adjust the section contents as
8567 necessary, and (if using Rela relocs and generating a
1049f94e 8568 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
8569 necessary.
8570
8571 This function does not have to worry about setting the reloc
8572 address or the reloc symbol index.
8573
8574 LOCAL_SYMS is a pointer to the swapped in local symbols.
8575
8576 LOCAL_SECTIONS is an array giving the section in the input file
8577 corresponding to the st_shndx field of each local symbol.
8578
8579 The global hash table entry for the global symbols can be found
8580 via elf_sym_hashes (input_bfd).
8581
1049f94e 8582 When generating relocatable output, this function must handle
5bd4f169
AM
8583 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
8584 going to be the section symbol corresponding to the output
8585 section, which means that the addend must be adjusted
8586 accordingly. */
8587
b34976b6 8588static bfd_boolean
4ce794b7
AM
8589ppc64_elf_relocate_section (bfd *output_bfd,
8590 struct bfd_link_info *info,
8591 bfd *input_bfd,
8592 asection *input_section,
8593 bfd_byte *contents,
8594 Elf_Internal_Rela *relocs,
8595 Elf_Internal_Sym *local_syms,
8596 asection **local_sections)
5bd4f169 8597{
65f38f15 8598 struct ppc_link_hash_table *htab;
5bd4f169
AM
8599 Elf_Internal_Shdr *symtab_hdr;
8600 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
8601 Elf_Internal_Rela *rel;
8602 Elf_Internal_Rela *relend;
411e1bfb
AM
8603 Elf_Internal_Rela outrel;
8604 bfd_byte *loc;
411e1bfb 8605 struct got_entry **local_got_ents;
5bd4f169 8606 bfd_vma TOCstart;
b34976b6
AM
8607 bfd_boolean ret = TRUE;
8608 bfd_boolean is_opd;
96e0dda4 8609 /* Disabled until we sort out how ld should choose 'y' vs 'at'. */
b34976b6 8610 bfd_boolean is_power4 = FALSE;
5bd4f169 8611
1049f94e 8612 if (info->relocatable)
b34976b6 8613 return TRUE;
b491616a 8614
65f38f15 8615 /* Initialize howto table if needed. */
5bd4f169 8616 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
8617 ppc_howto_init ();
8618
65f38f15 8619 htab = ppc_hash_table (info);
ee75fd95
AM
8620
8621 /* Don't relocate stub sections. */
8622 if (input_section->owner == htab->stub_bfd)
8623 return TRUE;
8624
411e1bfb 8625 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 8626 TOCstart = elf_gp (output_bfd);
5bd4f169
AM
8627 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
8628 sym_hashes = elf_sym_hashes (input_bfd);
f0abc2a1 8629 is_opd = ppc64_elf_section_data (input_section)->opd.adjust != NULL;
65f38f15 8630
5bd4f169
AM
8631 rel = relocs;
8632 relend = relocs + input_section->reloc_count;
8633 for (; rel < relend; rel++)
8634 {
04c9666a 8635 enum elf_ppc64_reloc_type r_type;
5bd4f169
AM
8636 bfd_vma addend;
8637 bfd_reloc_status_type r;
8638 Elf_Internal_Sym *sym;
8639 asection *sec;
039b3fef
AM
8640 struct elf_link_hash_entry *h_elf;
8641 struct ppc_link_hash_entry *h;
8642 struct ppc_link_hash_entry *fdh;
5bd4f169 8643 const char *sym_name;
0d4792f7 8644 unsigned long r_symndx, toc_symndx;
951fd09b 8645 char tls_mask, tls_gd, tls_type;
0d4792f7 8646 char sym_type;
5bd4f169 8647 bfd_vma relocation;
b34976b6
AM
8648 bfd_boolean unresolved_reloc;
8649 bfd_boolean warned;
50bc7936 8650 unsigned long insn, mask;
721956f4
AM
8651 struct ppc_stub_hash_entry *stub_entry;
8652 bfd_vma max_br_offset;
8653 bfd_vma from;
5bd4f169 8654
4ce794b7 8655 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 8656 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
8657
8658 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
8659 symbol of the previous ADDR64 reloc. The symbol gives us the
8660 proper TOC base to use. */
8661 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
8662 && rel != relocs
8663 && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
8664 && is_opd)
8665 r_symndx = ELF64_R_SYM (rel[-1].r_info);
8666
4ce794b7
AM
8667 sym = NULL;
8668 sec = NULL;
039b3fef 8669 h_elf = NULL;
4ce794b7 8670 sym_name = NULL;
b34976b6
AM
8671 unresolved_reloc = FALSE;
8672 warned = FALSE;
65f38f15 8673
0b13192e 8674 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
8675 {
8676 /* It's a local symbol. */
4025353c
AM
8677 long *opd_adjust;
8678
5bd4f169
AM
8679 sym = local_syms + r_symndx;
8680 sec = local_sections[r_symndx];
411e1bfb 8681 sym_name = bfd_elf_local_sym_name (input_bfd, sym);
0d4792f7 8682 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 8683 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4025353c
AM
8684 opd_adjust = get_opd_info (sec);
8685 if (opd_adjust != NULL)
1e2f5b6e 8686 {
3f764659 8687 long adjust = opd_adjust[(sym->st_value + rel->r_addend) / 8];
4025353c
AM
8688 if (adjust == -1)
8689 relocation = 0;
8690 else
8691 relocation += adjust;
1e2f5b6e 8692 }
5bd4f169
AM
8693 }
8694 else
8695 {
b2a8e766
AM
8696 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
8697 r_symndx, symtab_hdr, sym_hashes,
039b3fef 8698 h_elf, sec, relocation,
b2a8e766 8699 unresolved_reloc, warned);
039b3fef
AM
8700 sym_name = h_elf->root.root.string;
8701 sym_type = h_elf->type;
5bd4f169 8702 }
039b3fef 8703 h = (struct ppc_link_hash_entry *) h_elf;
5bd4f169 8704
951fd09b
AM
8705 /* TLS optimizations. Replace instruction sequences and relocs
8706 based on information we collected in tls_optimize. We edit
8707 RELOCS so that --emit-relocs will output something sensible
8708 for the final instruction stream. */
8709 tls_mask = 0;
8710 tls_gd = 0;
0d4792f7 8711 toc_symndx = 0;
d881513a 8712 if (IS_PPC64_TLS_RELOC (r_type))
411e1bfb
AM
8713 {
8714 if (h != NULL)
039b3fef 8715 tls_mask = h->tls_mask;
411e1bfb
AM
8716 else if (local_got_ents != NULL)
8717 {
e7b938ca
AM
8718 char *lgot_masks;
8719 lgot_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
8720 tls_mask = lgot_masks[r_symndx];
411e1bfb 8721 }
0d4792f7
AM
8722 if (tls_mask == 0 && r_type == R_PPC64_TLS)
8723 {
8724 /* Check for toc tls entries. */
8725 char *toc_tls;
8726
8727 if (!get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
8728 rel, input_bfd))
8729 return FALSE;
8730
8731 if (toc_tls)
8732 tls_mask = *toc_tls;
8733 }
8734 }
8735
8736 /* Check that tls relocs are used with tls syms, and non-tls
8737 relocs are used with non-tls syms. */
8738 if (r_symndx != 0
8739 && r_type != R_PPC64_NONE
8740 && (h == NULL
039b3fef
AM
8741 || h->elf.root.type == bfd_link_hash_defined
8742 || h->elf.root.type == bfd_link_hash_defweak)
0d4792f7
AM
8743 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
8744 {
8745 if (r_type == R_PPC64_TLS && tls_mask != 0)
8746 /* R_PPC64_TLS is OK against a symbol in the TOC. */
8747 ;
8748 else
8749 (*_bfd_error_handler)
8750 (sym_type == STT_TLS
d003868e
AM
8751 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
8752 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s"),
8753 input_bfd,
8754 input_section,
0d4792f7
AM
8755 (long) rel->r_offset,
8756 ppc64_elf_howto_table[r_type]->name,
8757 sym_name);
411e1bfb
AM
8758 }
8759
8760 /* Ensure reloc mapping code below stays sane. */
8761 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
8762 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
8763 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
8764 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
8765 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
8766 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
8767 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
8768 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
8769 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
8770 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
8771 abort ();
0d4792f7 8772
411e1bfb
AM
8773 switch (r_type)
8774 {
8775 default:
411e1bfb
AM
8776 break;
8777
8778 case R_PPC64_TOC16:
8779 case R_PPC64_TOC16_LO:
8780 case R_PPC64_TOC16_DS:
8781 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
8782 {
8783 /* Check for toc tls entries. */
8784 char *toc_tls;
951fd09b 8785 int retval;
411e1bfb 8786
0d4792f7
AM
8787 retval = get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
8788 rel, input_bfd);
951fd09b 8789 if (retval == 0)
411e1bfb
AM
8790 return FALSE;
8791
8792 if (toc_tls)
8793 {
951fd09b 8794 tls_mask = *toc_tls;
411e1bfb
AM
8795 if (r_type == R_PPC64_TOC16_DS
8796 || r_type == R_PPC64_TOC16_LO_DS)
81407a69
AM
8797 {
8798 if (tls_mask != 0
8799 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
8800 goto toctprel;
8801 }
411e1bfb 8802 else
951fd09b
AM
8803 {
8804 /* If we found a GD reloc pair, then we might be
8805 doing a GD->IE transition. */
8806 if (retval == 2)
8807 {
8808 tls_gd = TLS_TPRELGD;
8809 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
8810 goto tls_get_addr_check;
8811 }
8812 else if (retval == 3)
8813 {
8814 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
8815 goto tls_get_addr_check;
8816 }
8817 }
411e1bfb
AM
8818 }
8819 }
8820 break;
8821
8822 case R_PPC64_GOT_TPREL16_DS:
8823 case R_PPC64_GOT_TPREL16_LO_DS:
951fd09b
AM
8824 if (tls_mask != 0
8825 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 8826 {
81407a69 8827 toctprel:
411e1bfb
AM
8828 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - 2);
8829 insn &= 31 << 21;
8830 insn |= 0x3c0d0000; /* addis 0,13,0 */
8831 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - 2);
8832 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
8833 if (toc_symndx != 0)
8834 {
8835 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
8836 /* We changed the symbol. Start over in order to
8837 get h, sym, sec etc. right. */
8838 rel--;
8839 continue;
8840 }
8841 else
8842 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
8843 }
8844 break;
8845
8846 case R_PPC64_TLS:
951fd09b
AM
8847 if (tls_mask != 0
8848 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 8849 {
50bc7936 8850 bfd_vma rtra;
411e1bfb 8851 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
772119ce 8852 if ((insn & ((0x3f << 26) | (31 << 11)))
411e1bfb
AM
8853 == ((31 << 26) | (13 << 11)))
8854 rtra = insn & ((1 << 26) - (1 << 16));
772119ce 8855 else if ((insn & ((0x3f << 26) | (31 << 16)))
411e1bfb
AM
8856 == ((31 << 26) | (13 << 16)))
8857 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
8858 else
8859 abort ();
8860 if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
8861 /* add -> addi. */
8862 insn = 14 << 26;
8863 else if ((insn & (31 << 1)) == 23 << 1
8864 && ((insn & (31 << 6)) < 14 << 6
8865 || ((insn & (31 << 6)) >= 16 << 6
8866 && (insn & (31 << 6)) < 24 << 6)))
8867 /* load and store indexed -> dform. */
8868 insn = (32 | ((insn >> 6) & 31)) << 26;
8869 else if ((insn & (31 << 1)) == 21 << 1
8870 && (insn & (0x1a << 6)) == 0)
8871 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu. */
8872 insn = (((58 | ((insn >> 6) & 4)) << 26)
8873 | ((insn >> 6) & 1));
8874 else if ((insn & (31 << 1)) == 21 << 1
8875 && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
8876 /* lwax -> lwa. */
8877 insn = (58 << 26) | 2;
8878 else
8879 abort ();
8880 insn |= rtra;
8881 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
411e1bfb
AM
8882 /* Was PPC64_TLS which sits on insn boundary, now
8883 PPC64_TPREL16_LO which is at insn+2. */
8884 rel->r_offset += 2;
0d4792f7
AM
8885 r_type = R_PPC64_TPREL16_LO;
8886 if (toc_symndx != 0)
8887 {
8888 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
8889 /* We changed the symbol. Start over in order to
8890 get h, sym, sec etc. right. */
8891 rel--;
8892 continue;
8893 }
8894 else
8895 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
8896 }
8897 break;
8898
411e1bfb
AM
8899 case R_PPC64_GOT_TLSGD16_HI:
8900 case R_PPC64_GOT_TLSGD16_HA:
951fd09b
AM
8901 tls_gd = TLS_TPRELGD;
8902 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
8903 goto tls_gdld_hi;
8904 break;
8905
411e1bfb
AM
8906 case R_PPC64_GOT_TLSLD16_HI:
8907 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 8908 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 8909 {
951fd09b
AM
8910 tls_gdld_hi:
8911 if ((tls_mask & tls_gd) != 0)
8912 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
8913 + R_PPC64_GOT_TPREL16_DS);
8914 else
411e1bfb 8915 {
951fd09b
AM
8916 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
8917 rel->r_offset -= 2;
8918 r_type = R_PPC64_NONE;
411e1bfb 8919 }
951fd09b 8920 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
8921 }
8922 break;
8923
951fd09b
AM
8924 case R_PPC64_GOT_TLSGD16:
8925 case R_PPC64_GOT_TLSGD16_LO:
8926 tls_gd = TLS_TPRELGD;
8927 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
8928 goto tls_get_addr_check;
8929 break;
411e1bfb 8930
951fd09b
AM
8931 case R_PPC64_GOT_TLSLD16:
8932 case R_PPC64_GOT_TLSLD16_LO:
8933 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
8934 {
8935 tls_get_addr_check:
8936 if (rel + 1 < relend)
411e1bfb 8937 {
951fd09b
AM
8938 enum elf_ppc64_reloc_type r_type2;
8939 unsigned long r_symndx2;
8940 struct elf_link_hash_entry *h2;
8941 bfd_vma insn1, insn2, insn3;
8942 bfd_vma offset;
8943
8944 /* The next instruction should be a call to
8945 __tls_get_addr. Peek at the reloc to be sure. */
4ce794b7 8946 r_type2 = ELF64_R_TYPE (rel[1].r_info);
951fd09b
AM
8947 r_symndx2 = ELF64_R_SYM (rel[1].r_info);
8948 if (r_symndx2 < symtab_hdr->sh_info
8949 || (r_type2 != R_PPC64_REL14
8950 && r_type2 != R_PPC64_REL14_BRTAKEN
8951 && r_type2 != R_PPC64_REL14_BRNTAKEN
8952 && r_type2 != R_PPC64_REL24))
8953 break;
8954
8955 h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
8956 while (h2->root.type == bfd_link_hash_indirect
8957 || h2->root.type == bfd_link_hash_warning)
8958 h2 = (struct elf_link_hash_entry *) h2->root.u.i.link;
8387904d
AM
8959 if (h2 == NULL || (h2 != &htab->tls_get_addr->elf
8960 && h2 != &htab->tls_get_addr_fd->elf))
951fd09b
AM
8961 break;
8962
8963 /* OK, it checks out. Replace the call. */
8964 offset = rel[1].r_offset;
8965 insn1 = bfd_get_32 (output_bfd,
8966 contents + rel->r_offset - 2);
8967 insn3 = bfd_get_32 (output_bfd,
8968 contents + offset + 4);
8969 if ((tls_mask & tls_gd) != 0)
411e1bfb 8970 {
951fd09b
AM
8971 /* IE */
8972 insn1 &= (1 << 26) - (1 << 2);
8973 insn1 |= 58 << 26; /* ld */
8974 insn2 = 0x7c636a14; /* add 3,3,13 */
8975 rel[1].r_info = ELF64_R_INFO (r_symndx2, R_PPC64_NONE);
8976 if ((tls_mask & TLS_EXPLICIT) == 0)
8977 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
8978 + R_PPC64_GOT_TPREL16_DS);
8979 else
8980 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
8981 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
8982 }
8983 else
951fd09b
AM
8984 {
8985 /* LE */
8986 insn1 = 0x3c6d0000; /* addis 3,13,0 */
8987 insn2 = 0x38630000; /* addi 3,3,0 */
8988 if (tls_gd == 0)
8989 {
8990 /* Was an LD reloc. */
8991 r_symndx = 0;
e1918d23
AM
8992 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
8993 rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
951fd09b 8994 }
0d4792f7
AM
8995 else if (toc_symndx != 0)
8996 r_symndx = toc_symndx;
951fd09b
AM
8997 r_type = R_PPC64_TPREL16_HA;
8998 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8999 rel[1].r_info = ELF64_R_INFO (r_symndx,
9000 R_PPC64_TPREL16_LO);
9001 rel[1].r_offset += 2;
9002 }
9003 if (insn3 == NOP
9004 || insn3 == CROR_151515 || insn3 == CROR_313131)
9005 {
9006 insn3 = insn2;
9007 insn2 = NOP;
9008 rel[1].r_offset += 4;
9009 }
9010 bfd_put_32 (output_bfd, insn1, contents + rel->r_offset - 2);
9011 bfd_put_32 (output_bfd, insn2, contents + offset);
9012 bfd_put_32 (output_bfd, insn3, contents + offset + 4);
0d4792f7 9013 if (tls_gd == 0 || toc_symndx != 0)
951fd09b 9014 {
0d4792f7
AM
9015 /* We changed the symbol. Start over in order
9016 to get h, sym, sec etc. right. */
951fd09b
AM
9017 rel--;
9018 continue;
9019 }
411e1bfb 9020 }
411e1bfb 9021 }
411e1bfb
AM
9022 break;
9023
9024 case R_PPC64_DTPMOD64:
951fd09b
AM
9025 if (rel + 1 < relend
9026 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
9027 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 9028 {
951fd09b
AM
9029 if ((tls_mask & TLS_GD) == 0)
9030 {
9031 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
9032 if ((tls_mask & TLS_TPRELGD) != 0)
9033 r_type = R_PPC64_TPREL64;
9034 else
9035 {
4ce794b7 9036 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
9037 r_type = R_PPC64_NONE;
9038 }
9039 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9040 }
9041 }
9042 else
9043 {
9044 if ((tls_mask & TLS_LD) == 0)
411e1bfb 9045 {
4ce794b7 9046 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 9047 r_type = R_PPC64_NONE;
951fd09b 9048 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 9049 }
411e1bfb
AM
9050 }
9051 break;
9052
9053 case R_PPC64_TPREL64:
951fd09b 9054 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
9055 {
9056 r_type = R_PPC64_NONE;
9057 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9058 }
9059 break;
9060 }
9061
9062 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 9063 insn = 0;
b25116a9
AM
9064 max_br_offset = 1 << 25;
9065 addend = rel->r_addend;
65f38f15 9066 switch (r_type)
5bd4f169
AM
9067 {
9068 default:
65f38f15 9069 break;
5bd4f169 9070
65f38f15
AM
9071 /* Branch taken prediction relocations. */
9072 case R_PPC64_ADDR14_BRTAKEN:
9073 case R_PPC64_REL14_BRTAKEN:
cedb70c5
KH
9074 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
9075 /* Fall thru. */
65f38f15 9076
86c76c7b 9077 /* Branch not taken prediction relocations. */
65f38f15
AM
9078 case R_PPC64_ADDR14_BRNTAKEN:
9079 case R_PPC64_REL14_BRNTAKEN:
411e1bfb
AM
9080 insn |= bfd_get_32 (output_bfd,
9081 contents + rel->r_offset) & ~(0x01 << 21);
b25116a9 9082 /* Fall thru. */
86c76c7b 9083
b25116a9
AM
9084 case R_PPC64_REL14:
9085 max_br_offset = 1 << 15;
9086 /* Fall thru. */
5bd4f169 9087
65f38f15 9088 case R_PPC64_REL24:
ad8e1ba5
AM
9089 /* Calls to functions with a different TOC, such as calls to
9090 shared objects, need to alter the TOC pointer. This is
9091 done using a linkage stub. A REL24 branching to these
9092 linkage stubs needs to be followed by a nop, as the nop
9093 will be replaced with an instruction to restore the TOC
9094 base pointer. */
b25116a9 9095 stub_entry = NULL;
8387904d 9096 fdh = h;
ad8e1ba5 9097 if (((h != NULL
039b3fef
AM
9098 && (((fdh = h->oh) != NULL
9099 && fdh->elf.plt.plist != NULL)
9100 || (fdh = h)->elf.plt.plist != NULL))
8387904d 9101 || (sec != NULL
ad8e1ba5 9102 && sec->output_section != NULL
b25116a9 9103 && sec->id <= htab->top_id
ad8e1ba5
AM
9104 && (htab->stub_group[sec->id].toc_off
9105 != htab->stub_group[input_section->id].toc_off)))
721956f4 9106 && (stub_entry = ppc_get_stub_entry (input_section, sec, fdh,
ad8e1ba5
AM
9107 rel, htab)) != NULL
9108 && (stub_entry->stub_type == ppc_stub_plt_call
9109 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
9110 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
41bd81ab 9111 {
b25116a9 9112 bfd_boolean can_plt_call = FALSE;
721956f4 9113
eea6121a 9114 if (rel->r_offset + 8 <= input_section->size)
41bd81ab 9115 {
b25116a9
AM
9116 unsigned long nop;
9117 nop = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
9118 if (nop == NOP
9119 || nop == CROR_151515 || nop == CROR_313131)
41bd81ab 9120 {
4ce794b7 9121 bfd_put_32 (input_bfd, LD_R2_40R1,
411e1bfb 9122 contents + rel->r_offset + 4);
b25116a9 9123 can_plt_call = TRUE;
41bd81ab 9124 }
5bd4f169 9125 }
721956f4
AM
9126
9127 if (!can_plt_call)
9128 {
ad8e1ba5
AM
9129 if (stub_entry->stub_type == ppc_stub_plt_call)
9130 {
9131 /* If this is a plain branch rather than a branch
9132 and link, don't require a nop. */
b25116a9
AM
9133 unsigned long br;
9134 br = bfd_get_32 (input_bfd, contents + rel->r_offset);
9135 if ((br & 1) == 0)
9136 can_plt_call = TRUE;
ad8e1ba5 9137 }
6ab189d5 9138 else if (h != NULL
039b3fef 9139 && strcmp (h->elf.root.root.string,
6ab189d5
AM
9140 ".__libc_start_main") == 0)
9141 {
9142 /* Allow crt1 branch to go via a toc adjusting stub. */
b25116a9 9143 can_plt_call = TRUE;
6ab189d5 9144 }
ad8e1ba5
AM
9145 else
9146 {
9147 if (strcmp (input_section->output_section->name,
9148 ".init") == 0
9149 || strcmp (input_section->output_section->name,
9150 ".fini") == 0)
9151 (*_bfd_error_handler)
d003868e 9152 (_("%B(%A+0x%lx): automatic multiple TOCs "
ad8e1ba5
AM
9153 "not supported using your crt files; "
9154 "recompile with -mminimal-toc or upgrade gcc"),
d003868e
AM
9155 input_bfd,
9156 input_section,
ad8e1ba5
AM
9157 (long) rel->r_offset);
9158 else
9159 (*_bfd_error_handler)
d003868e 9160 (_("%B(%A+0x%lx): sibling call optimization to `%s' "
ad8e1ba5
AM
9161 "does not allow automatic multiple TOCs; "
9162 "recompile with -mminimal-toc or "
9163 "-fno-optimize-sibling-calls, "
9164 "or make `%s' extern"),
d003868e
AM
9165 input_bfd,
9166 input_section,
ad8e1ba5
AM
9167 (long) rel->r_offset,
9168 sym_name,
9169 sym_name);
9170 bfd_set_error (bfd_error_bad_value);
9171 ret = FALSE;
9172 }
721956f4
AM
9173 }
9174
b25116a9
AM
9175 if (can_plt_call
9176 && stub_entry->stub_type == ppc_stub_plt_call)
9177 unresolved_reloc = FALSE;
9178 }
9179
8387904d
AM
9180 if (stub_entry == NULL
9181 && get_opd_info (sec) != NULL)
9182 {
9183 /* The branch destination is the value of the opd entry. */
9184 bfd_vma off = (relocation - sec->output_section->vma
9185 - sec->output_offset + rel->r_addend);
9186 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL);
9187 if (dest != (bfd_vma) -1)
9188 {
9189 relocation = dest;
9190 addend = 0;
9191 }
9192 }
9193
b25116a9
AM
9194 /* If the branch is out of reach we ought to have a long
9195 branch stub. */
9196 from = (rel->r_offset
9197 + input_section->output_offset
9198 + input_section->output_section->vma);
9199
9200 if (stub_entry == NULL
9201 && (relocation + rel->r_addend - from + max_br_offset
9202 >= 2 * max_br_offset)
9203 && r_type != R_PPC64_ADDR14_BRTAKEN
9204 && r_type != R_PPC64_ADDR14_BRNTAKEN)
039b3fef
AM
9205 stub_entry = ppc_get_stub_entry (input_section, sec, h, rel,
9206 htab);
b25116a9
AM
9207
9208 if (stub_entry != NULL)
9209 {
9210 /* Munge up the value and addend so that we call the stub
9211 rather than the procedure directly. */
9212 relocation = (stub_entry->stub_offset
9213 + stub_entry->stub_sec->output_offset
9214 + stub_entry->stub_sec->output_section->vma);
9215 addend = 0;
9216 }
9217
9218 if (insn != 0)
9219 {
9220 if (is_power4)
721956f4 9221 {
b25116a9
AM
9222 /* Set 'a' bit. This is 0b00010 in BO field for branch
9223 on CR(BI) insns (BO == 001at or 011at), and 0b01000
9224 for branch on CTR insns (BO == 1a00t or 1a01t). */
9225 if ((insn & (0x14 << 21)) == (0x04 << 21))
9226 insn |= 0x02 << 21;
9227 else if ((insn & (0x14 << 21)) == (0x10 << 21))
9228 insn |= 0x08 << 21;
9229 else
9230 break;
9231 }
9232 else
9233 {
9234 /* Invert 'y' bit if not the default. */
9235 if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
9236 insn ^= 0x01 << 21;
721956f4 9237 }
b25116a9
AM
9238
9239 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5bd4f169 9240 }
e86ce104 9241
06da1e8e
AM
9242 /* NOP out calls to undefined weak functions.
9243 We can thus call a weak function without first
9244 checking whether the function is defined. */
b25116a9 9245 else if (h != NULL
039b3fef 9246 && h->elf.root.type == bfd_link_hash_undefweak
b25116a9
AM
9247 && r_type == R_PPC64_REL24
9248 && relocation == 0
9249 && rel->r_addend == 0)
e86ce104 9250 {
06da1e8e
AM
9251 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
9252 continue;
e86ce104 9253 }
65f38f15
AM
9254 break;
9255 }
5bd4f169 9256
65f38f15 9257 /* Set `addend'. */
411e1bfb 9258 tls_type = 0;
65f38f15
AM
9259 switch (r_type)
9260 {
9261 default:
9262 (*_bfd_error_handler)
d003868e
AM
9263 (_("%B: unknown relocation type %d for symbol %s"),
9264 input_bfd, (int) r_type, sym_name);
5bd4f169 9265
65f38f15 9266 bfd_set_error (bfd_error_bad_value);
b34976b6 9267 ret = FALSE;
65f38f15 9268 continue;
5bd4f169 9269
65f38f15 9270 case R_PPC64_NONE:
411e1bfb 9271 case R_PPC64_TLS:
04c9666a
AM
9272 case R_PPC64_GNU_VTINHERIT:
9273 case R_PPC64_GNU_VTENTRY:
65f38f15 9274 continue;
5bd4f169
AM
9275
9276 /* GOT16 relocations. Like an ADDR16 using the symbol's
9277 address in the GOT as relocation value instead of the
411e1bfb 9278 symbol's value itself. Also, create a GOT entry for the
5bd4f169 9279 symbol and put the symbol value there. */
411e1bfb
AM
9280 case R_PPC64_GOT_TLSGD16:
9281 case R_PPC64_GOT_TLSGD16_LO:
9282 case R_PPC64_GOT_TLSGD16_HI:
9283 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 9284 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
9285 goto dogot;
9286
9287 case R_PPC64_GOT_TLSLD16:
9288 case R_PPC64_GOT_TLSLD16_LO:
9289 case R_PPC64_GOT_TLSLD16_HI:
9290 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 9291 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
9292 goto dogot;
9293
9294 case R_PPC64_GOT_TPREL16_DS:
9295 case R_PPC64_GOT_TPREL16_LO_DS:
9296 case R_PPC64_GOT_TPREL16_HI:
9297 case R_PPC64_GOT_TPREL16_HA:
9298 tls_type = TLS_TLS | TLS_TPREL;
9299 goto dogot;
9300
9301 case R_PPC64_GOT_DTPREL16_DS:
9302 case R_PPC64_GOT_DTPREL16_LO_DS:
9303 case R_PPC64_GOT_DTPREL16_HI:
9304 case R_PPC64_GOT_DTPREL16_HA:
9305 tls_type = TLS_TLS | TLS_DTPREL;
9306 goto dogot;
9307
65f38f15
AM
9308 case R_PPC64_GOT16:
9309 case R_PPC64_GOT16_LO:
9310 case R_PPC64_GOT16_HI:
9311 case R_PPC64_GOT16_HA:
9312 case R_PPC64_GOT16_DS:
9313 case R_PPC64_GOT16_LO_DS:
411e1bfb 9314 dogot:
5bd4f169
AM
9315 {
9316 /* Relocation is to the entry for this symbol in the global
9317 offset table. */
e717da7e 9318 asection *got;
d881513a 9319 bfd_vma *offp;
5bd4f169 9320 bfd_vma off;
d881513a 9321 unsigned long indx = 0;
65f38f15 9322
d881513a
AM
9323 if (tls_type == (TLS_TLS | TLS_LD)
9324 && (h == NULL
039b3fef
AM
9325 || (h->elf.elf_link_hash_flags
9326 & ELF_LINK_HASH_DEF_DYNAMIC) == 0))
e717da7e 9327 offp = &ppc64_tlsld_got (input_bfd)->offset;
411e1bfb 9328 else
5bd4f169 9329 {
d881513a 9330 struct got_entry *ent;
5bd4f169 9331
d881513a
AM
9332 if (h != NULL)
9333 {
9334 bfd_boolean dyn = htab->elf.dynamic_sections_created;
039b3fef
AM
9335 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
9336 &h->elf)
d881513a 9337 || (info->shared
039b3fef 9338 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
d881513a
AM
9339 /* This is actually a static link, or it is a
9340 -Bsymbolic link and the symbol is defined
9341 locally, or the symbol was forced to be local
9342 because of a version file. */
9343 ;
9344 else
9345 {
039b3fef 9346 indx = h->elf.dynindx;
d881513a
AM
9347 unresolved_reloc = FALSE;
9348 }
039b3fef 9349 ent = h->elf.got.glist;
d881513a 9350 }
411e1bfb 9351 else
5bd4f169 9352 {
d881513a
AM
9353 if (local_got_ents == NULL)
9354 abort ();
9355 ent = local_got_ents[r_symndx];
5bd4f169 9356 }
d881513a
AM
9357
9358 for (; ent != NULL; ent = ent->next)
9359 if (ent->addend == rel->r_addend
e717da7e 9360 && ent->owner == input_bfd
d881513a
AM
9361 && ent->tls_type == tls_type)
9362 break;
9363 if (ent == NULL)
9364 abort ();
9365 offp = &ent->got.offset;
5bd4f169 9366 }
411e1bfb 9367
e717da7e
AM
9368 got = ppc64_elf_tdata (input_bfd)->got;
9369 if (got == NULL)
9370 abort ();
9371
411e1bfb
AM
9372 /* The offset must always be a multiple of 8. We use the
9373 least significant bit to record whether we have already
9374 processed this entry. */
d881513a 9375 off = *offp;
411e1bfb
AM
9376 if ((off & 1) != 0)
9377 off &= ~1;
5bd4f169
AM
9378 else
9379 {
411e1bfb
AM
9380 /* Generate relocs for the dynamic linker, except in
9381 the case of TLSLD where we'll use one entry per
9382 module. */
e717da7e
AM
9383 asection *relgot = ppc64_elf_tdata (input_bfd)->relgot;
9384
d881513a 9385 *offp = off | 1;
4e795f50
AM
9386 if ((info->shared || indx != 0)
9387 && (h == NULL
039b3fef
AM
9388 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
9389 || h->elf.root.type != bfd_link_hash_undefweak))
5bd4f169 9390 {
e717da7e
AM
9391 outrel.r_offset = (got->output_section->vma
9392 + got->output_offset
411e1bfb 9393 + off);
81407a69 9394 outrel.r_addend = rel->r_addend;
d881513a 9395 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 9396 {
411e1bfb 9397 outrel.r_addend = 0;
e515b051 9398 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
9399 if (tls_type == (TLS_TLS | TLS_GD))
9400 {
e717da7e
AM
9401 loc = relgot->contents;
9402 loc += (relgot->reloc_count++
d881513a
AM
9403 * sizeof (Elf64_External_Rela));
9404 bfd_elf64_swap_reloca_out (output_bfd,
9405 &outrel, loc);
e515b051 9406 outrel.r_offset += 8;
81407a69 9407 outrel.r_addend = rel->r_addend;
d881513a
AM
9408 outrel.r_info
9409 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 9410 }
411e1bfb 9411 }
951fd09b 9412 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 9413 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 9414 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb
AM
9415 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
9416 else if (indx == 0)
81407a69
AM
9417 {
9418 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_RELATIVE);
9419
9420 /* Write the .got section contents for the sake
9421 of prelink. */
e717da7e 9422 loc = got->contents + off;
23fbd6fa
JJ
9423 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
9424 loc);
81407a69 9425 }
411e1bfb
AM
9426 else
9427 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
81407a69
AM
9428
9429 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
9430 {
9431 outrel.r_addend += relocation;
9432 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
e1918d23 9433 outrel.r_addend -= htab->elf.tls_sec->vma;
e515b051 9434 }
e717da7e
AM
9435 loc = relgot->contents;
9436 loc += (relgot->reloc_count++
411e1bfb
AM
9437 * sizeof (Elf64_External_Rela));
9438 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
9439 }
9440
ad8e1ba5 9441 /* Init the .got section contents here if we're not
81407a69 9442 emitting a reloc. */
d881513a 9443 else
411e1bfb 9444 {
d881513a 9445 relocation += rel->r_addend;
7b609f53
AM
9446 if (tls_type == (TLS_TLS | TLS_LD))
9447 relocation = 1;
9448 else if (tls_type != 0)
411e1bfb 9449 {
e1918d23 9450 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
7b609f53 9451 if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 9452 relocation += DTP_OFFSET - TP_OFFSET;
5bd4f169 9453
7b609f53
AM
9454 if (tls_type == (TLS_TLS | TLS_GD))
9455 {
9456 bfd_put_64 (output_bfd, relocation,
e717da7e 9457 got->contents + off + 8);
7b609f53
AM
9458 relocation = 1;
9459 }
411e1bfb 9460 }
7b609f53 9461
411e1bfb 9462 bfd_put_64 (output_bfd, relocation,
e717da7e 9463 got->contents + off);
5bd4f169
AM
9464 }
9465 }
9466
65f38f15
AM
9467 if (off >= (bfd_vma) -2)
9468 abort ();
9469
e717da7e 9470 relocation = got->output_offset + off;
65f38f15 9471
5bd4f169 9472 /* TOC base (r2) is TOC start plus 0x8000. */
e717da7e 9473 addend = -TOC_BASE_OFF;
5bd4f169 9474 }
65f38f15
AM
9475 break;
9476
9477 case R_PPC64_PLT16_HA:
9478 case R_PPC64_PLT16_HI:
9479 case R_PPC64_PLT16_LO:
9480 case R_PPC64_PLT32:
9481 case R_PPC64_PLT64:
9482 /* Relocation is to the entry for this symbol in the
9483 procedure linkage table. */
9484
9485 /* Resolve a PLT reloc against a local symbol directly,
9486 without using the procedure linkage table. */
9487 if (h == NULL)
9488 break;
9489
411e1bfb
AM
9490 /* It's possible that we didn't make a PLT entry for this
9491 symbol. This happens when statically linking PIC code,
9492 or when using -Bsymbolic. Go find a match if there is a
9493 PLT entry. */
4ce794b7 9494 if (htab->plt != NULL)
65f38f15 9495 {
411e1bfb 9496 struct plt_entry *ent;
039b3fef 9497 for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
411e1bfb
AM
9498 if (ent->addend == rel->r_addend
9499 && ent->plt.offset != (bfd_vma) -1)
9500 {
4ce794b7
AM
9501 relocation = (htab->plt->output_section->vma
9502 + htab->plt->output_offset
411e1bfb
AM
9503 + ent->plt.offset);
9504 unresolved_reloc = FALSE;
9505 }
65f38f15 9506 }
65f38f15 9507 break;
5bd4f169 9508
0b13192e
AM
9509 case R_PPC64_TOC:
9510 /* Relocation value is TOC base. */
9511 relocation = TOCstart;
9512 if (r_symndx == 0)
9513 relocation += htab->stub_group[input_section->id].toc_off;
8517fae7
AM
9514 else if (unresolved_reloc)
9515 ;
9516 else if (sec != NULL && sec->id <= htab->top_id)
0b13192e
AM
9517 relocation += htab->stub_group[sec->id].toc_off;
9518 else
9519 unresolved_reloc = TRUE;
9520 goto dodyn2;
9521
5bd4f169
AM
9522 /* TOC16 relocs. We want the offset relative to the TOC base,
9523 which is the address of the start of the TOC plus 0x8000.
9524 The TOC consists of sections .got, .toc, .tocbss, and .plt,
9525 in this order. */
65f38f15
AM
9526 case R_PPC64_TOC16:
9527 case R_PPC64_TOC16_LO:
9528 case R_PPC64_TOC16_HI:
9529 case R_PPC64_TOC16_DS:
9530 case R_PPC64_TOC16_LO_DS:
9531 case R_PPC64_TOC16_HA:
ad8e1ba5 9532 addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
5bd4f169
AM
9533 break;
9534
9535 /* Relocate against the beginning of the section. */
65f38f15
AM
9536 case R_PPC64_SECTOFF:
9537 case R_PPC64_SECTOFF_LO:
9538 case R_PPC64_SECTOFF_HI:
9539 case R_PPC64_SECTOFF_DS:
9540 case R_PPC64_SECTOFF_LO_DS:
9541 case R_PPC64_SECTOFF_HA:
4ce794b7 9542 if (sec != NULL)
65f38f15 9543 addend -= sec->output_section->vma;
5bd4f169
AM
9544 break;
9545
721956f4
AM
9546 case R_PPC64_REL14:
9547 case R_PPC64_REL14_BRNTAKEN:
9548 case R_PPC64_REL14_BRTAKEN:
5d1634d7
AM
9549 case R_PPC64_REL24:
9550 break;
9551
411e1bfb
AM
9552 case R_PPC64_TPREL16:
9553 case R_PPC64_TPREL16_LO:
9554 case R_PPC64_TPREL16_HI:
9555 case R_PPC64_TPREL16_HA:
9556 case R_PPC64_TPREL16_DS:
9557 case R_PPC64_TPREL16_LO_DS:
9558 case R_PPC64_TPREL16_HIGHER:
9559 case R_PPC64_TPREL16_HIGHERA:
9560 case R_PPC64_TPREL16_HIGHEST:
9561 case R_PPC64_TPREL16_HIGHESTA:
e1918d23 9562 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
9563 if (info->shared)
9564 /* The TPREL16 relocs shouldn't really be used in shared
9565 libs as they will result in DT_TEXTREL being set, but
9566 support them anyway. */
9567 goto dodyn;
9568 break;
9569
9570 case R_PPC64_DTPREL16:
9571 case R_PPC64_DTPREL16_LO:
9572 case R_PPC64_DTPREL16_HI:
9573 case R_PPC64_DTPREL16_HA:
9574 case R_PPC64_DTPREL16_DS:
9575 case R_PPC64_DTPREL16_LO_DS:
9576 case R_PPC64_DTPREL16_HIGHER:
9577 case R_PPC64_DTPREL16_HIGHERA:
9578 case R_PPC64_DTPREL16_HIGHEST:
9579 case R_PPC64_DTPREL16_HIGHESTA:
e1918d23 9580 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
9581 break;
9582
e515b051
AM
9583 case R_PPC64_DTPMOD64:
9584 relocation = 1;
9585 addend = 0;
9586 goto dodyn;
9587
411e1bfb 9588 case R_PPC64_TPREL64:
e1918d23 9589 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
9590 goto dodyn;
9591
9592 case R_PPC64_DTPREL64:
e1918d23 9593 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
9594 /* Fall thru */
9595
65f38f15
AM
9596 /* Relocations that may need to be propagated if this is a
9597 dynamic object. */
04c9666a 9598 case R_PPC64_REL30:
65f38f15
AM
9599 case R_PPC64_REL32:
9600 case R_PPC64_REL64:
9601 case R_PPC64_ADDR14:
9602 case R_PPC64_ADDR14_BRNTAKEN:
9603 case R_PPC64_ADDR14_BRTAKEN:
9604 case R_PPC64_ADDR16:
9605 case R_PPC64_ADDR16_DS:
9606 case R_PPC64_ADDR16_HA:
9607 case R_PPC64_ADDR16_HI:
9608 case R_PPC64_ADDR16_HIGHER:
9609 case R_PPC64_ADDR16_HIGHERA:
9610 case R_PPC64_ADDR16_HIGHEST:
9611 case R_PPC64_ADDR16_HIGHESTA:
9612 case R_PPC64_ADDR16_LO:
9613 case R_PPC64_ADDR16_LO_DS:
9614 case R_PPC64_ADDR24:
65f38f15
AM
9615 case R_PPC64_ADDR32:
9616 case R_PPC64_ADDR64:
9617 case R_PPC64_UADDR16:
9618 case R_PPC64_UADDR32:
9619 case R_PPC64_UADDR64:
ec338859
AM
9620 /* r_symndx will be zero only for relocs against symbols
9621 from removed linkonce sections, or sections discarded by
9622 a linker script. */
411e1bfb 9623 dodyn:
5d1634d7
AM
9624 if (r_symndx == 0)
9625 break;
9626 /* Fall thru. */
9627
0b13192e 9628 dodyn2:
5d1634d7 9629 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
9630 break;
9631
41bd81ab
AM
9632 if (NO_OPD_RELOCS && is_opd)
9633 break;
9634
65f38f15 9635 if ((info->shared
4e795f50 9636 && (h == NULL
039b3fef
AM
9637 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
9638 || h->elf.root.type != bfd_link_hash_undefweak)
411e1bfb 9639 && (MUST_BE_DYN_RELOC (r_type)
039b3fef 9640 || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
f4656909
AM
9641 || (ELIMINATE_COPY_RELOCS
9642 && !info->shared
65f38f15 9643 && h != NULL
039b3fef
AM
9644 && h->elf.dynindx != -1
9645 && !(h->elf.elf_link_hash_flags & ELF_LINK_NON_GOT_REF)
9646 && (h->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC)
9647 && !(h->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
65f38f15
AM
9648 {
9649 Elf_Internal_Rela outrel;
b34976b6 9650 bfd_boolean skip, relocate;
65f38f15 9651 asection *sreloc;
947216bf 9652 bfd_byte *loc;
1cf1f670 9653 bfd_vma out_off;
65f38f15
AM
9654
9655 /* When generating a dynamic object, these relocations
9656 are copied into the output file to be resolved at run
9657 time. */
9658
b34976b6
AM
9659 skip = FALSE;
9660 relocate = FALSE;
65f38f15 9661
1cf1f670
AM
9662 out_off = _bfd_elf_section_offset (output_bfd, info,
9663 input_section, rel->r_offset);
9664 if (out_off == (bfd_vma) -1)
b34976b6 9665 skip = TRUE;
1cf1f670 9666 else if (out_off == (bfd_vma) -2)
b34976b6 9667 skip = TRUE, relocate = TRUE;
1cf1f670
AM
9668 out_off += (input_section->output_section->vma
9669 + input_section->output_offset);
9670 outrel.r_offset = out_off;
411e1bfb 9671 outrel.r_addend = rel->r_addend;
65f38f15 9672
1cf1f670
AM
9673 /* Optimize unaligned reloc use. */
9674 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
9675 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
9676 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
9677 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
9678 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
9679 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
9680 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
9681 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
9682 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
9683
65f38f15 9684 if (skip)
0bb2d96a 9685 memset (&outrel, 0, sizeof outrel);
039b3fef 9686 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
9687 && !is_opd
9688 && r_type != R_PPC64_TOC)
039b3fef 9689 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
65f38f15
AM
9690 else
9691 {
41bd81ab
AM
9692 /* This symbol is local, or marked to become local,
9693 or this is an opd section reloc which must point
9694 at a local function. */
65f38f15 9695 outrel.r_addend += relocation;
e86ce104 9696 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 9697 {
3fad3c7c 9698 if (is_opd && h != NULL)
afbe61cf
AM
9699 {
9700 /* Lie about opd entries. This case occurs
9701 when building shared libraries and we
9702 reference a function in another shared
3fad3c7c
AM
9703 lib. The same thing happens for a weak
9704 definition in an application that's
9705 overridden by a strong definition in a
9706 shared lib. (I believe this is a generic
9707 bug in binutils handling of weak syms.)
9708 In these cases we won't use the opd
1e2f5b6e 9709 entry in this lib. */
b34976b6 9710 unresolved_reloc = FALSE;
afbe61cf 9711 }
65f38f15 9712 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
9713
9714 /* We need to relocate .opd contents for ld.so.
9715 Prelink also wants simple and consistent rules
9716 for relocs. This make all RELATIVE relocs have
9717 *r_offset equal to r_addend. */
9718 relocate = TRUE;
65f38f15
AM
9719 }
9720 else
9721 {
9722 long indx = 0;
9723
41bd81ab 9724 if (bfd_is_abs_section (sec))
65f38f15
AM
9725 ;
9726 else if (sec == NULL || sec->owner == NULL)
9727 {
9728 bfd_set_error (bfd_error_bad_value);
b34976b6 9729 return FALSE;
65f38f15
AM
9730 }
9731 else
9732 {
9733 asection *osec;
9734
9735 osec = sec->output_section;
9736 indx = elf_section_data (osec)->dynindx;
9737
9738 /* We are turning this relocation into one
9739 against a section symbol, so subtract out
9740 the output section's address but not the
9741 offset of the input section in the output
9742 section. */
9743 outrel.r_addend -= osec->vma;
9744 }
9745
9746 outrel.r_info = ELF64_R_INFO (indx, r_type);
9747 }
9748 }
9749
9750 sreloc = elf_section_data (input_section)->sreloc;
9751 if (sreloc == NULL)
9752 abort ();
9753
947216bf
AM
9754 loc = sreloc->contents;
9755 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
9756 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
9757
9758 /* If this reloc is against an external symbol, it will
9759 be computed at runtime, so there's no need to do
81407a69
AM
9760 anything now. However, for the sake of prelink ensure
9761 that the section contents are a known value. */
65f38f15 9762 if (! relocate)
81407a69
AM
9763 {
9764 unresolved_reloc = FALSE;
9765 /* The value chosen here is quite arbitrary as ld.so
9766 ignores section contents except for the special
9767 case of .opd where the contents might be accessed
9768 before relocation. Choose zero, as that won't
9769 cause reloc overflow. */
9770 relocation = 0;
9771 addend = 0;
9772 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
9773 to improve backward compatibility with older
9774 versions of ld. */
9775 if (r_type == R_PPC64_ADDR64)
9776 addend = outrel.r_addend;
9777 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 9778 else if (ppc64_elf_howto_table[r_type]->pc_relative)
000732f7
AM
9779 addend = (input_section->output_section->vma
9780 + input_section->output_offset
9781 + rel->r_offset);
81407a69 9782 }
65f38f15 9783 }
5bd4f169
AM
9784 break;
9785
65f38f15
AM
9786 case R_PPC64_COPY:
9787 case R_PPC64_GLOB_DAT:
9788 case R_PPC64_JMP_SLOT:
9789 case R_PPC64_RELATIVE:
9790 /* We shouldn't ever see these dynamic relocs in relocatable
9791 files. */
ae9a127f 9792 /* Fall through. */
65f38f15
AM
9793
9794 case R_PPC64_PLTGOT16:
9795 case R_PPC64_PLTGOT16_DS:
9796 case R_PPC64_PLTGOT16_HA:
9797 case R_PPC64_PLTGOT16_HI:
9798 case R_PPC64_PLTGOT16_LO:
9799 case R_PPC64_PLTGOT16_LO_DS:
9800 case R_PPC64_PLTREL32:
9801 case R_PPC64_PLTREL64:
9802 /* These ones haven't been implemented yet. */
9803
9804 (*_bfd_error_handler)
d003868e
AM
9805 (_("%B: relocation %s is not supported for symbol %s."),
9806 input_bfd,
4ce794b7 9807 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
9808
9809 bfd_set_error (bfd_error_invalid_operation);
b34976b6 9810 ret = FALSE;
5bd4f169 9811 continue;
65f38f15 9812 }
5bd4f169 9813
65f38f15
AM
9814 /* Do any further special processing. */
9815 switch (r_type)
9816 {
9817 default:
9818 break;
9819
9820 case R_PPC64_ADDR16_HA:
9821 case R_PPC64_ADDR16_HIGHERA:
9822 case R_PPC64_ADDR16_HIGHESTA:
86bbe32f
AM
9823 case R_PPC64_GOT16_HA:
9824 case R_PPC64_PLTGOT16_HA:
65f38f15
AM
9825 case R_PPC64_PLT16_HA:
9826 case R_PPC64_TOC16_HA:
9827 case R_PPC64_SECTOFF_HA:
411e1bfb
AM
9828 case R_PPC64_TPREL16_HA:
9829 case R_PPC64_DTPREL16_HA:
9830 case R_PPC64_GOT_TLSGD16_HA:
9831 case R_PPC64_GOT_TLSLD16_HA:
9832 case R_PPC64_GOT_TPREL16_HA:
9833 case R_PPC64_GOT_DTPREL16_HA:
9834 case R_PPC64_TPREL16_HIGHER:
9835 case R_PPC64_TPREL16_HIGHERA:
9836 case R_PPC64_TPREL16_HIGHEST:
9837 case R_PPC64_TPREL16_HIGHESTA:
9838 case R_PPC64_DTPREL16_HIGHER:
9839 case R_PPC64_DTPREL16_HIGHERA:
9840 case R_PPC64_DTPREL16_HIGHEST:
9841 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
9842 /* It's just possible that this symbol is a weak symbol
9843 that's not actually defined anywhere. In that case,
9844 'sec' would be NULL, and we should leave the symbol
9845 alone (it will be set to zero elsewhere in the link). */
9846 if (sec != NULL)
e515b051
AM
9847 /* Add 0x10000 if sign bit in 0:15 is set.
9848 Bits 0:15 are not used. */
9849 addend += 0x8000;
65f38f15
AM
9850 break;
9851
9852 case R_PPC64_ADDR16_DS:
9853 case R_PPC64_ADDR16_LO_DS:
9854 case R_PPC64_GOT16_DS:
9855 case R_PPC64_GOT16_LO_DS:
9856 case R_PPC64_PLT16_LO_DS:
9857 case R_PPC64_SECTOFF_DS:
9858 case R_PPC64_SECTOFF_LO_DS:
9859 case R_PPC64_TOC16_DS:
9860 case R_PPC64_TOC16_LO_DS:
9861 case R_PPC64_PLTGOT16_DS:
9862 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
9863 case R_PPC64_GOT_TPREL16_DS:
9864 case R_PPC64_GOT_TPREL16_LO_DS:
9865 case R_PPC64_GOT_DTPREL16_DS:
9866 case R_PPC64_GOT_DTPREL16_LO_DS:
9867 case R_PPC64_TPREL16_DS:
9868 case R_PPC64_TPREL16_LO_DS:
9869 case R_PPC64_DTPREL16_DS:
9870 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
9871 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
9872 mask = 3;
9873 /* If this reloc is against an lq insn, then the value must be
9874 a multiple of 16. This is somewhat of a hack, but the
9875 "correct" way to do this by defining _DQ forms of all the
9876 _DS relocs bloats all reloc switches in this file. It
9877 doesn't seem to make much sense to use any of these relocs
9878 in data, so testing the insn should be safe. */
494dac0c 9879 if ((insn & (0x3f << 26)) == (56u << 26))
adadcc0c
AM
9880 mask = 15;
9881 if (((relocation + addend) & mask) != 0)
65f38f15
AM
9882 {
9883 (*_bfd_error_handler)
d003868e
AM
9884 (_("%B: error: relocation %s not a multiple of %d"),
9885 input_bfd,
4ce794b7 9886 ppc64_elf_howto_table[r_type]->name,
adadcc0c 9887 mask + 1);
65f38f15 9888 bfd_set_error (bfd_error_bad_value);
b34976b6 9889 ret = FALSE;
65f38f15
AM
9890 continue;
9891 }
9892 break;
5bd4f169
AM
9893 }
9894
239e1f3a
AM
9895 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
9896 because such sections are not SEC_ALLOC and thus ld.so will
9897 not process them. */
65f38f15 9898 if (unresolved_reloc
239e1f3a 9899 && !((input_section->flags & SEC_DEBUGGING) != 0
039b3fef 9900 && (h->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC)))
9c07fe7c
AM
9901 {
9902 (*_bfd_error_handler)
d003868e
AM
9903 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
9904 input_bfd,
9905 input_section,
9c07fe7c 9906 (long) rel->r_offset,
7b609f53 9907 ppc64_elf_howto_table[(int) r_type]->name,
039b3fef 9908 h->elf.root.root.string);
b34976b6 9909 ret = FALSE;
9c07fe7c 9910 }
5bd4f169 9911
65f38f15 9912 r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
5bd4f169
AM
9913 input_bfd,
9914 input_section,
9915 contents,
411e1bfb 9916 rel->r_offset,
5bd4f169
AM
9917 relocation,
9918 addend);
9919
ef60b7ff 9920 if (r != bfd_reloc_ok)
5bd4f169 9921 {
cd27b276
AM
9922 if (sym_name == NULL)
9923 sym_name = "(null)";
9924 if (r == bfd_reloc_overflow)
5bd4f169 9925 {
cd27b276
AM
9926 if (warned)
9927 continue;
9928 if (h != NULL
039b3fef 9929 && h->elf.root.type == bfd_link_hash_undefweak
4ce794b7 9930 && ppc64_elf_howto_table[r_type]->pc_relative)
5bd4f169
AM
9931 {
9932 /* Assume this is a call protected by other code that
9933 detects the symbol is undefined. If this is the case,
9934 we can safely ignore the overflow. If not, the
9935 program is hosed anyway, and a little warning isn't
9936 going to help. */
9937
9938 continue;
9939 }
9940
ef60b7ff 9941 if (!((*info->callbacks->reloc_overflow)
4ce794b7 9942 (info, sym_name, ppc64_elf_howto_table[r_type]->name,
411e1bfb 9943 rel->r_addend, input_bfd, input_section, rel->r_offset)))
b34976b6 9944 return FALSE;
ef60b7ff
AM
9945 }
9946 else
9947 {
9948 (*_bfd_error_handler)
d003868e
AM
9949 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
9950 input_bfd,
9951 input_section,
7b609f53 9952 (long) rel->r_offset,
4ce794b7 9953 ppc64_elf_howto_table[r_type]->name,
7b609f53
AM
9954 sym_name,
9955 (int) r);
b34976b6 9956 ret = FALSE;
ef60b7ff 9957 }
5bd4f169 9958 }
5bd4f169
AM
9959 }
9960
5bd4f169
AM
9961 return ret;
9962}
9963
754021d0
AM
9964/* Adjust the value of any local symbols in opd sections. */
9965
9966static bfd_boolean
9967ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
9968 const char *name ATTRIBUTE_UNUSED,
9969 Elf_Internal_Sym *elfsym,
9970 asection *input_sec,
9971 struct elf_link_hash_entry *h)
9972{
4025353c 9973 long *opd_adjust, adjust;
754021d0
AM
9974 bfd_vma value;
9975
4025353c
AM
9976 if (h != NULL)
9977 return TRUE;
9978
9979 opd_adjust = get_opd_info (input_sec);
9980 if (opd_adjust == NULL)
754021d0
AM
9981 return TRUE;
9982
9983 value = elfsym->st_value - input_sec->output_offset;
9984 if (!info->relocatable)
9985 value -= input_sec->output_section->vma;
9986
3f764659 9987 adjust = opd_adjust[value / 8];
4025353c
AM
9988 if (adjust == -1)
9989 elfsym->st_value = 0;
9990 else
9991 elfsym->st_value += adjust;
754021d0
AM
9992 return TRUE;
9993}
9994
5bd4f169
AM
9995/* Finish up dynamic symbol handling. We set the contents of various
9996 dynamic sections here. */
9997
b34976b6 9998static bfd_boolean
4ce794b7
AM
9999ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
10000 struct bfd_link_info *info,
10001 struct elf_link_hash_entry *h,
10002 Elf_Internal_Sym *sym)
5bd4f169 10003{
65f38f15 10004 struct ppc_link_hash_table *htab;
5bd4f169 10005 bfd *dynobj;
8387904d
AM
10006 struct plt_entry *ent;
10007 Elf_Internal_Rela rela;
10008 bfd_byte *loc;
5bd4f169 10009
65f38f15
AM
10010 htab = ppc_hash_table (info);
10011 dynobj = htab->elf.dynobj;
5bd4f169 10012
8387904d
AM
10013 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
10014 if (ent->plt.offset != (bfd_vma) -1)
10015 {
10016 /* This symbol has an entry in the procedure linkage
10017 table. Set it up. */
10018
10019 if (htab->plt == NULL
10020 || htab->relplt == NULL
10021 || htab->glink == NULL)
10022 abort ();
10023
10024 /* Create a JMP_SLOT reloc to inform the dynamic linker to
10025 fill in the PLT entry. */
10026 rela.r_offset = (htab->plt->output_section->vma
10027 + htab->plt->output_offset
10028 + ent->plt.offset);
10029 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
10030 rela.r_addend = ent->addend;
10031
10032 loc = htab->relplt->contents;
10033 loc += ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
10034 * sizeof (Elf64_External_Rela));
10035 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
10036 }
5bd4f169
AM
10037
10038 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
10039 {
5bd4f169 10040 Elf_Internal_Rela rela;
947216bf 10041 bfd_byte *loc;
5bd4f169 10042
65f38f15 10043 /* This symbol needs a copy reloc. Set it up. */
5bd4f169 10044
65f38f15
AM
10045 if (h->dynindx == -1
10046 || (h->root.type != bfd_link_hash_defined
10047 && h->root.type != bfd_link_hash_defweak)
4ce794b7 10048 || htab->relbss == NULL)
65f38f15 10049 abort ();
5bd4f169
AM
10050
10051 rela.r_offset = (h->root.u.def.value
10052 + h->root.u.def.section->output_section->vma
10053 + h->root.u.def.section->output_offset);
10054 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
10055 rela.r_addend = 0;
4ce794b7
AM
10056 loc = htab->relbss->contents;
10057 loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 10058 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
10059 }
10060
5bd4f169
AM
10061 /* Mark some specially defined symbols as absolute. */
10062 if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
10063 sym->st_shndx = SHN_ABS;
10064
b34976b6 10065 return TRUE;
5bd4f169
AM
10066}
10067
65f38f15
AM
10068/* Used to decide how to sort relocs in an optimal manner for the
10069 dynamic linker, before writing them out. */
10070
10071static enum elf_reloc_type_class
4ce794b7 10072ppc64_elf_reloc_type_class (const Elf_Internal_Rela *rela)
65f38f15 10073{
04c9666a 10074 enum elf_ppc64_reloc_type r_type;
a33d1f77 10075
4ce794b7 10076 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 10077 switch (r_type)
65f38f15
AM
10078 {
10079 case R_PPC64_RELATIVE:
10080 return reloc_class_relative;
10081 case R_PPC64_JMP_SLOT:
10082 return reloc_class_plt;
10083 case R_PPC64_COPY:
10084 return reloc_class_copy;
10085 default:
10086 return reloc_class_normal;
10087 }
10088}
10089
5bd4f169
AM
10090/* Finish up the dynamic sections. */
10091
b34976b6 10092static bfd_boolean
4ce794b7
AM
10093ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
10094 struct bfd_link_info *info)
5bd4f169 10095{
65f38f15
AM
10096 struct ppc_link_hash_table *htab;
10097 bfd *dynobj;
5bd4f169 10098 asection *sdyn;
5bd4f169 10099
65f38f15
AM
10100 htab = ppc_hash_table (info);
10101 dynobj = htab->elf.dynobj;
5bd4f169
AM
10102 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
10103
65f38f15 10104 if (htab->elf.dynamic_sections_created)
5bd4f169 10105 {
5bd4f169
AM
10106 Elf64_External_Dyn *dyncon, *dynconend;
10107
4ce794b7 10108 if (sdyn == NULL || htab->got == NULL)
65f38f15 10109 abort ();
5bd4f169
AM
10110
10111 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 10112 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
10113 for (; dyncon < dynconend; dyncon++)
10114 {
10115 Elf_Internal_Dyn dyn;
19397422 10116 asection *s;
5bd4f169
AM
10117
10118 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
10119
10120 switch (dyn.d_tag)
10121 {
65f38f15
AM
10122 default:
10123 continue;
5bd4f169 10124
5d1634d7 10125 case DT_PPC64_GLINK:
4ce794b7 10126 s = htab->glink;
6348e046 10127 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
10128 /* We stupidly defined DT_PPC64_GLINK to be the start
10129 of glink rather than the first entry point, which is
10130 what ld.so needs, and now have a bigger stub to
10131 support automatic multiple TOCs. */
10132 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
5d1634d7
AM
10133 break;
10134
19397422
AM
10135 case DT_PPC64_OPD:
10136 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
10137 if (s == NULL)
10138 continue;
10139 dyn.d_un.d_ptr = s->vma;
19397422
AM
10140 break;
10141
10142 case DT_PPC64_OPDSZ:
10143 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
10144 if (s == NULL)
10145 continue;
eea6121a 10146 dyn.d_un.d_val = s->size;
19397422
AM
10147 break;
10148
65f38f15 10149 case DT_PLTGOT:
4ce794b7 10150 s = htab->plt;
6348e046 10151 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
10152 break;
10153
10154 case DT_JMPREL:
4ce794b7 10155 s = htab->relplt;
6348e046 10156 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 10157 break;
5bd4f169 10158
65f38f15 10159 case DT_PLTRELSZ:
eea6121a 10160 dyn.d_un.d_val = htab->relplt->size;
5d1634d7
AM
10161 break;
10162
10163 case DT_RELASZ:
10164 /* Don't count procedure linkage table relocs in the
10165 overall reloc count. */
4ce794b7 10166 s = htab->relplt;
6348e046
AM
10167 if (s == NULL)
10168 continue;
eea6121a 10169 dyn.d_un.d_val -= s->size;
6348e046
AM
10170 break;
10171
10172 case DT_RELA:
10173 /* We may not be using the standard ELF linker script.
10174 If .rela.plt is the first .rela section, we adjust
10175 DT_RELA to not include it. */
4ce794b7 10176 s = htab->relplt;
6348e046
AM
10177 if (s == NULL)
10178 continue;
10179 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
10180 continue;
eea6121a 10181 dyn.d_un.d_ptr += s->size;
65f38f15 10182 break;
5bd4f169 10183 }
5bd4f169 10184
65f38f15 10185 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 10186 }
5bd4f169
AM
10187 }
10188
eea6121a 10189 if (htab->got != NULL && htab->got->size != 0)
5d1634d7
AM
10190 {
10191 /* Fill in the first entry in the global offset table.
10192 We use it to hold the link-time TOCbase. */
10193 bfd_put_64 (output_bfd,
60ee0d4a 10194 elf_gp (output_bfd) + TOC_BASE_OFF,
4ce794b7 10195 htab->got->contents);
5d1634d7
AM
10196
10197 /* Set .got entry size. */
4ce794b7 10198 elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
5d1634d7
AM
10199 }
10200
eea6121a 10201 if (htab->plt != NULL && htab->plt->size != 0)
5d1634d7
AM
10202 {
10203 /* Set .plt entry size. */
4ce794b7 10204 elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
5d1634d7
AM
10205 = PLT_ENTRY_SIZE;
10206 }
10207
e717da7e 10208 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
10209 since we didn't add them to DYNOBJ. We know dynobj is the first
10210 bfd. */
e717da7e
AM
10211 while ((dynobj = dynobj->link_next) != NULL)
10212 {
10213 asection *s;
7b53ace3 10214
ee75fd95 10215 if (!is_ppc64_elf_target (dynobj->xvec))
7b53ace3
AM
10216 continue;
10217
e717da7e
AM
10218 s = ppc64_elf_tdata (dynobj)->got;
10219 if (s != NULL
eea6121a 10220 && s->size != 0
e717da7e
AM
10221 && s->output_section != bfd_abs_section_ptr
10222 && !bfd_set_section_contents (output_bfd, s->output_section,
10223 s->contents, s->output_offset,
eea6121a 10224 s->size))
e717da7e
AM
10225 return FALSE;
10226 s = ppc64_elf_tdata (dynobj)->relgot;
10227 if (s != NULL
eea6121a 10228 && s->size != 0
e717da7e
AM
10229 && s->output_section != bfd_abs_section_ptr
10230 && !bfd_set_section_contents (output_bfd, s->output_section,
10231 s->contents, s->output_offset,
eea6121a 10232 s->size))
e717da7e
AM
10233 return FALSE;
10234 }
f6c52c13 10235
b34976b6 10236 return TRUE;
5bd4f169
AM
10237}
10238
5bd4f169 10239#include "elf64-target.h"
This page took 0.979643 seconds and 4 git commands to generate.