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