1 /* PowerPC64-specific support for 64-bit ELF.
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4 Written by Linus Nordberg, Swox AB <info@swox.com>,
5 based on elf32-ppc.c by Ian Lance Taylor.
6 Largely rewritten by Alan Modra.
8 This file is part of BFD, the Binary File Descriptor library.
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 3 of the License, or
13 (at your option) any later version.
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.
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 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
25 /* The 64-bit PowerPC ELF ABI may be found at
26 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
27 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
35 #include "elf/ppc64.h"
36 #include "elf64-ppc.h"
39 static bfd_reloc_status_type ppc64_elf_ha_reloc
40 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
41 static bfd_reloc_status_type ppc64_elf_branch_reloc
42 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
43 static bfd_reloc_status_type ppc64_elf_brtaken_reloc
44 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
45 static bfd_reloc_status_type ppc64_elf_sectoff_reloc
46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
47 static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
49 static bfd_reloc_status_type ppc64_elf_toc_reloc
50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
51 static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
53 static bfd_reloc_status_type ppc64_elf_toc64_reloc
54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
55 static bfd_reloc_status_type ppc64_elf_unhandled_reloc
56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
57 static bfd_vma opd_entry_value
58 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
60 #define TARGET_LITTLE_SYM bfd_elf64_powerpcle_vec
61 #define TARGET_LITTLE_NAME "elf64-powerpcle"
62 #define TARGET_BIG_SYM bfd_elf64_powerpc_vec
63 #define TARGET_BIG_NAME "elf64-powerpc"
64 #define ELF_ARCH bfd_arch_powerpc
65 #define ELF_TARGET_ID PPC64_ELF_DATA
66 #define ELF_MACHINE_CODE EM_PPC64
67 #define ELF_MAXPAGESIZE 0x10000
68 #define ELF_COMMONPAGESIZE 0x1000
69 #define elf_info_to_howto ppc64_elf_info_to_howto
71 #define elf_backend_want_got_sym 0
72 #define elf_backend_want_plt_sym 0
73 #define elf_backend_plt_alignment 3
74 #define elf_backend_plt_not_loaded 1
75 #define elf_backend_got_header_size 8
76 #define elf_backend_can_gc_sections 1
77 #define elf_backend_can_refcount 1
78 #define elf_backend_rela_normal 1
79 #define elf_backend_default_execstack 0
81 #define bfd_elf64_mkobject ppc64_elf_mkobject
82 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
83 #define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
84 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
85 #define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
86 #define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
87 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
88 #define bfd_elf64_bfd_link_hash_table_free ppc64_elf_link_hash_table_free
89 #define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
90 #define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
92 #define elf_backend_object_p ppc64_elf_object_p
93 #define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
94 #define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
95 #define elf_backend_write_core_note ppc64_elf_write_core_note
96 #define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
97 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
98 #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
99 #define elf_backend_check_directives ppc64_elf_process_dot_syms
100 #define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
101 #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
102 #define elf_backend_check_relocs ppc64_elf_check_relocs
103 #define elf_backend_gc_keep ppc64_elf_gc_keep
104 #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
105 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
106 #define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
107 #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
108 #define elf_backend_hide_symbol ppc64_elf_hide_symbol
109 #define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
110 #define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
111 #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
112 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
113 #define elf_backend_action_discarded ppc64_elf_action_discarded
114 #define elf_backend_relocate_section ppc64_elf_relocate_section
115 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
116 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
117 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
118 #define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
119 #define elf_backend_special_sections ppc64_elf_special_sections
120 #define elf_backend_post_process_headers _bfd_elf_set_osabi
122 /* The name of the dynamic interpreter. This is put in the .interp
124 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
126 /* The size in bytes of an entry in the procedure linkage table. */
127 #define PLT_ENTRY_SIZE 24
129 /* The initial size of the plt reserved for the dynamic linker. */
130 #define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
132 /* TOC base pointers offset from start of TOC. */
133 #define TOC_BASE_OFF 0x8000
135 /* Offset of tp and dtp pointers from start of TLS block. */
136 #define TP_OFFSET 0x7000
137 #define DTP_OFFSET 0x8000
139 /* .plt call stub instructions. The normal stub is like this, but
140 sometimes the .plt entry crosses a 64k boundary and we need to
141 insert an addi to adjust r11. */
142 #define PLT_CALL_STUB_SIZE (7*4)
143 #define STD_R2_40R1 0xf8410028 /* std %r2,40(%r1) */
144 #define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
145 #define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
146 #define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
147 #define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
148 #define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
149 #define BCTR 0x4e800420 /* bctr */
151 #define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
152 #define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
153 #define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
155 #define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
156 #define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
157 #define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
158 #define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
159 #define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
160 #define BNECTR 0x4ca20420 /* bnectr+ */
161 #define BNECTR_P4 0x4ce20420 /* bnectr+ */
163 #define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
164 #define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
165 #define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
167 #define LD_R2_40R1 0xe8410028 /* ld %r2,40(%r1) */
169 /* glink call stub instructions. We enter with the index in R0. */
170 #define GLINK_CALL_STUB_SIZE (16*4)
174 #define MFLR_R12 0x7d8802a6 /* mflr %12 */
175 #define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
177 #define MFLR_R11 0x7d6802a6 /* mflr %11 */
178 /* ld %2,(0b-1b)(%11) */
179 #define MTLR_R12 0x7d8803a6 /* mtlr %12 */
180 #define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
188 #define NOP 0x60000000
190 /* Some other nops. */
191 #define CROR_151515 0x4def7b82
192 #define CROR_313131 0x4ffffb82
194 /* .glink entries for the first 32k functions are two instructions. */
195 #define LI_R0_0 0x38000000 /* li %r0,0 */
196 #define B_DOT 0x48000000 /* b . */
198 /* After that, we need two instructions to load the index, followed by
200 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */
201 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
203 /* Instructions used by the save and restore reg functions. */
204 #define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
205 #define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
206 #define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
207 #define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
208 #define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
209 #define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
210 #define LI_R12_0 0x39800000 /* li %r12,0 */
211 #define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
212 #define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
213 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
214 #define BLR 0x4e800020 /* blr */
216 /* Since .opd is an array of descriptors and each entry will end up
217 with identical R_PPC64_RELATIVE relocs, there is really no need to
218 propagate .opd relocs; The dynamic linker should be taught to
219 relocate .opd without reloc entries. */
220 #ifndef NO_OPD_RELOCS
221 #define NO_OPD_RELOCS 0
224 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
226 /* Relocation HOWTO's. */
227 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
229 static reloc_howto_type ppc64_elf_howto_raw[] = {
230 /* This reloc does nothing. */
231 HOWTO (R_PPC64_NONE, /* type */
233 2, /* size (0 = byte, 1 = short, 2 = long) */
235 FALSE, /* pc_relative */
237 complain_overflow_dont, /* complain_on_overflow */
238 bfd_elf_generic_reloc, /* special_function */
239 "R_PPC64_NONE", /* name */
240 FALSE, /* partial_inplace */
243 FALSE), /* pcrel_offset */
245 /* A standard 32 bit relocation. */
246 HOWTO (R_PPC64_ADDR32, /* type */
248 2, /* size (0 = byte, 1 = short, 2 = long) */
250 FALSE, /* pc_relative */
252 complain_overflow_bitfield, /* complain_on_overflow */
253 bfd_elf_generic_reloc, /* special_function */
254 "R_PPC64_ADDR32", /* name */
255 FALSE, /* partial_inplace */
257 0xffffffff, /* dst_mask */
258 FALSE), /* pcrel_offset */
260 /* An absolute 26 bit branch; the lower two bits must be zero.
261 FIXME: we don't check that, we just clear them. */
262 HOWTO (R_PPC64_ADDR24, /* type */
264 2, /* size (0 = byte, 1 = short, 2 = long) */
266 FALSE, /* pc_relative */
268 complain_overflow_bitfield, /* complain_on_overflow */
269 bfd_elf_generic_reloc, /* special_function */
270 "R_PPC64_ADDR24", /* name */
271 FALSE, /* partial_inplace */
273 0x03fffffc, /* dst_mask */
274 FALSE), /* pcrel_offset */
276 /* A standard 16 bit relocation. */
277 HOWTO (R_PPC64_ADDR16, /* type */
279 1, /* size (0 = byte, 1 = short, 2 = long) */
281 FALSE, /* pc_relative */
283 complain_overflow_bitfield, /* complain_on_overflow */
284 bfd_elf_generic_reloc, /* special_function */
285 "R_PPC64_ADDR16", /* name */
286 FALSE, /* partial_inplace */
288 0xffff, /* dst_mask */
289 FALSE), /* pcrel_offset */
291 /* A 16 bit relocation without overflow. */
292 HOWTO (R_PPC64_ADDR16_LO, /* type */
294 1, /* size (0 = byte, 1 = short, 2 = long) */
296 FALSE, /* pc_relative */
298 complain_overflow_dont,/* complain_on_overflow */
299 bfd_elf_generic_reloc, /* special_function */
300 "R_PPC64_ADDR16_LO", /* name */
301 FALSE, /* partial_inplace */
303 0xffff, /* dst_mask */
304 FALSE), /* pcrel_offset */
306 /* Bits 16-31 of an address. */
307 HOWTO (R_PPC64_ADDR16_HI, /* type */
309 1, /* size (0 = byte, 1 = short, 2 = long) */
311 FALSE, /* pc_relative */
313 complain_overflow_signed, /* complain_on_overflow */
314 bfd_elf_generic_reloc, /* special_function */
315 "R_PPC64_ADDR16_HI", /* name */
316 FALSE, /* partial_inplace */
318 0xffff, /* dst_mask */
319 FALSE), /* pcrel_offset */
321 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
322 bits, treated as a signed number, is negative. */
323 HOWTO (R_PPC64_ADDR16_HA, /* type */
325 1, /* size (0 = byte, 1 = short, 2 = long) */
327 FALSE, /* pc_relative */
329 complain_overflow_signed, /* complain_on_overflow */
330 ppc64_elf_ha_reloc, /* special_function */
331 "R_PPC64_ADDR16_HA", /* name */
332 FALSE, /* partial_inplace */
334 0xffff, /* dst_mask */
335 FALSE), /* pcrel_offset */
337 /* An absolute 16 bit branch; the lower two bits must be zero.
338 FIXME: we don't check that, we just clear them. */
339 HOWTO (R_PPC64_ADDR14, /* type */
341 2, /* size (0 = byte, 1 = short, 2 = long) */
343 FALSE, /* pc_relative */
345 complain_overflow_bitfield, /* complain_on_overflow */
346 ppc64_elf_branch_reloc, /* special_function */
347 "R_PPC64_ADDR14", /* name */
348 FALSE, /* partial_inplace */
350 0x0000fffc, /* dst_mask */
351 FALSE), /* pcrel_offset */
353 /* An absolute 16 bit branch, for which bit 10 should be set to
354 indicate that the branch is expected to be taken. The lower two
355 bits must be zero. */
356 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
358 2, /* size (0 = byte, 1 = short, 2 = long) */
360 FALSE, /* pc_relative */
362 complain_overflow_bitfield, /* complain_on_overflow */
363 ppc64_elf_brtaken_reloc, /* special_function */
364 "R_PPC64_ADDR14_BRTAKEN",/* name */
365 FALSE, /* partial_inplace */
367 0x0000fffc, /* dst_mask */
368 FALSE), /* pcrel_offset */
370 /* An absolute 16 bit branch, for which bit 10 should be set to
371 indicate that the branch is not expected to be taken. The lower
372 two bits must be zero. */
373 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
375 2, /* size (0 = byte, 1 = short, 2 = long) */
377 FALSE, /* pc_relative */
379 complain_overflow_bitfield, /* complain_on_overflow */
380 ppc64_elf_brtaken_reloc, /* special_function */
381 "R_PPC64_ADDR14_BRNTAKEN",/* name */
382 FALSE, /* partial_inplace */
384 0x0000fffc, /* dst_mask */
385 FALSE), /* pcrel_offset */
387 /* A relative 26 bit branch; the lower two bits must be zero. */
388 HOWTO (R_PPC64_REL24, /* type */
390 2, /* size (0 = byte, 1 = short, 2 = long) */
392 TRUE, /* pc_relative */
394 complain_overflow_signed, /* complain_on_overflow */
395 ppc64_elf_branch_reloc, /* special_function */
396 "R_PPC64_REL24", /* name */
397 FALSE, /* partial_inplace */
399 0x03fffffc, /* dst_mask */
400 TRUE), /* pcrel_offset */
402 /* A relative 16 bit branch; the lower two bits must be zero. */
403 HOWTO (R_PPC64_REL14, /* type */
405 2, /* size (0 = byte, 1 = short, 2 = long) */
407 TRUE, /* pc_relative */
409 complain_overflow_signed, /* complain_on_overflow */
410 ppc64_elf_branch_reloc, /* special_function */
411 "R_PPC64_REL14", /* name */
412 FALSE, /* partial_inplace */
414 0x0000fffc, /* dst_mask */
415 TRUE), /* pcrel_offset */
417 /* A relative 16 bit branch. Bit 10 should be set to indicate that
418 the branch is expected to be taken. The lower two bits must be
420 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
422 2, /* size (0 = byte, 1 = short, 2 = long) */
424 TRUE, /* pc_relative */
426 complain_overflow_signed, /* complain_on_overflow */
427 ppc64_elf_brtaken_reloc, /* special_function */
428 "R_PPC64_REL14_BRTAKEN", /* name */
429 FALSE, /* partial_inplace */
431 0x0000fffc, /* dst_mask */
432 TRUE), /* pcrel_offset */
434 /* A relative 16 bit branch. Bit 10 should be set to indicate that
435 the branch is not expected to be taken. The lower two bits must
437 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
439 2, /* size (0 = byte, 1 = short, 2 = long) */
441 TRUE, /* pc_relative */
443 complain_overflow_signed, /* complain_on_overflow */
444 ppc64_elf_brtaken_reloc, /* special_function */
445 "R_PPC64_REL14_BRNTAKEN",/* name */
446 FALSE, /* partial_inplace */
448 0x0000fffc, /* dst_mask */
449 TRUE), /* pcrel_offset */
451 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
453 HOWTO (R_PPC64_GOT16, /* type */
455 1, /* size (0 = byte, 1 = short, 2 = long) */
457 FALSE, /* pc_relative */
459 complain_overflow_signed, /* complain_on_overflow */
460 ppc64_elf_unhandled_reloc, /* special_function */
461 "R_PPC64_GOT16", /* name */
462 FALSE, /* partial_inplace */
464 0xffff, /* dst_mask */
465 FALSE), /* pcrel_offset */
467 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
469 HOWTO (R_PPC64_GOT16_LO, /* type */
471 1, /* size (0 = byte, 1 = short, 2 = long) */
473 FALSE, /* pc_relative */
475 complain_overflow_dont, /* complain_on_overflow */
476 ppc64_elf_unhandled_reloc, /* special_function */
477 "R_PPC64_GOT16_LO", /* name */
478 FALSE, /* partial_inplace */
480 0xffff, /* dst_mask */
481 FALSE), /* pcrel_offset */
483 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
485 HOWTO (R_PPC64_GOT16_HI, /* type */
487 1, /* size (0 = byte, 1 = short, 2 = long) */
489 FALSE, /* pc_relative */
491 complain_overflow_signed,/* complain_on_overflow */
492 ppc64_elf_unhandled_reloc, /* special_function */
493 "R_PPC64_GOT16_HI", /* name */
494 FALSE, /* partial_inplace */
496 0xffff, /* dst_mask */
497 FALSE), /* pcrel_offset */
499 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
501 HOWTO (R_PPC64_GOT16_HA, /* type */
503 1, /* size (0 = byte, 1 = short, 2 = long) */
505 FALSE, /* pc_relative */
507 complain_overflow_signed,/* complain_on_overflow */
508 ppc64_elf_unhandled_reloc, /* special_function */
509 "R_PPC64_GOT16_HA", /* name */
510 FALSE, /* partial_inplace */
512 0xffff, /* dst_mask */
513 FALSE), /* pcrel_offset */
515 /* This is used only by the dynamic linker. The symbol should exist
516 both in the object being run and in some shared library. The
517 dynamic linker copies the data addressed by the symbol from the
518 shared library into the object, because the object being
519 run has to have the data at some particular address. */
520 HOWTO (R_PPC64_COPY, /* type */
522 0, /* this one is variable size */
524 FALSE, /* pc_relative */
526 complain_overflow_dont, /* complain_on_overflow */
527 ppc64_elf_unhandled_reloc, /* special_function */
528 "R_PPC64_COPY", /* name */
529 FALSE, /* partial_inplace */
532 FALSE), /* pcrel_offset */
534 /* Like R_PPC64_ADDR64, but used when setting global offset table
536 HOWTO (R_PPC64_GLOB_DAT, /* type */
538 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
540 FALSE, /* pc_relative */
542 complain_overflow_dont, /* complain_on_overflow */
543 ppc64_elf_unhandled_reloc, /* special_function */
544 "R_PPC64_GLOB_DAT", /* name */
545 FALSE, /* partial_inplace */
547 ONES (64), /* dst_mask */
548 FALSE), /* pcrel_offset */
550 /* Created by the link editor. Marks a procedure linkage table
551 entry for a symbol. */
552 HOWTO (R_PPC64_JMP_SLOT, /* type */
554 0, /* size (0 = byte, 1 = short, 2 = long) */
556 FALSE, /* pc_relative */
558 complain_overflow_dont, /* complain_on_overflow */
559 ppc64_elf_unhandled_reloc, /* special_function */
560 "R_PPC64_JMP_SLOT", /* name */
561 FALSE, /* partial_inplace */
564 FALSE), /* pcrel_offset */
566 /* Used only by the dynamic linker. When the object is run, this
567 doubleword64 is set to the load address of the object, plus the
569 HOWTO (R_PPC64_RELATIVE, /* type */
571 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
573 FALSE, /* pc_relative */
575 complain_overflow_dont, /* complain_on_overflow */
576 bfd_elf_generic_reloc, /* special_function */
577 "R_PPC64_RELATIVE", /* name */
578 FALSE, /* partial_inplace */
580 ONES (64), /* dst_mask */
581 FALSE), /* pcrel_offset */
583 /* Like R_PPC64_ADDR32, but may be unaligned. */
584 HOWTO (R_PPC64_UADDR32, /* type */
586 2, /* size (0 = byte, 1 = short, 2 = long) */
588 FALSE, /* pc_relative */
590 complain_overflow_bitfield, /* complain_on_overflow */
591 bfd_elf_generic_reloc, /* special_function */
592 "R_PPC64_UADDR32", /* name */
593 FALSE, /* partial_inplace */
595 0xffffffff, /* dst_mask */
596 FALSE), /* pcrel_offset */
598 /* Like R_PPC64_ADDR16, but may be unaligned. */
599 HOWTO (R_PPC64_UADDR16, /* type */
601 1, /* size (0 = byte, 1 = short, 2 = long) */
603 FALSE, /* pc_relative */
605 complain_overflow_bitfield, /* complain_on_overflow */
606 bfd_elf_generic_reloc, /* special_function */
607 "R_PPC64_UADDR16", /* name */
608 FALSE, /* partial_inplace */
610 0xffff, /* dst_mask */
611 FALSE), /* pcrel_offset */
613 /* 32-bit PC relative. */
614 HOWTO (R_PPC64_REL32, /* type */
616 2, /* size (0 = byte, 1 = short, 2 = long) */
618 TRUE, /* pc_relative */
620 /* FIXME: Verify. Was complain_overflow_bitfield. */
621 complain_overflow_signed, /* complain_on_overflow */
622 bfd_elf_generic_reloc, /* special_function */
623 "R_PPC64_REL32", /* name */
624 FALSE, /* partial_inplace */
626 0xffffffff, /* dst_mask */
627 TRUE), /* pcrel_offset */
629 /* 32-bit relocation to the symbol's procedure linkage table. */
630 HOWTO (R_PPC64_PLT32, /* type */
632 2, /* size (0 = byte, 1 = short, 2 = long) */
634 FALSE, /* pc_relative */
636 complain_overflow_bitfield, /* complain_on_overflow */
637 ppc64_elf_unhandled_reloc, /* special_function */
638 "R_PPC64_PLT32", /* name */
639 FALSE, /* partial_inplace */
641 0xffffffff, /* dst_mask */
642 FALSE), /* pcrel_offset */
644 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
645 FIXME: R_PPC64_PLTREL32 not supported. */
646 HOWTO (R_PPC64_PLTREL32, /* type */
648 2, /* size (0 = byte, 1 = short, 2 = long) */
650 TRUE, /* pc_relative */
652 complain_overflow_signed, /* complain_on_overflow */
653 bfd_elf_generic_reloc, /* special_function */
654 "R_PPC64_PLTREL32", /* name */
655 FALSE, /* partial_inplace */
657 0xffffffff, /* dst_mask */
658 TRUE), /* pcrel_offset */
660 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
662 HOWTO (R_PPC64_PLT16_LO, /* type */
664 1, /* size (0 = byte, 1 = short, 2 = long) */
666 FALSE, /* pc_relative */
668 complain_overflow_dont, /* complain_on_overflow */
669 ppc64_elf_unhandled_reloc, /* special_function */
670 "R_PPC64_PLT16_LO", /* name */
671 FALSE, /* partial_inplace */
673 0xffff, /* dst_mask */
674 FALSE), /* pcrel_offset */
676 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
678 HOWTO (R_PPC64_PLT16_HI, /* type */
680 1, /* size (0 = byte, 1 = short, 2 = long) */
682 FALSE, /* pc_relative */
684 complain_overflow_signed, /* complain_on_overflow */
685 ppc64_elf_unhandled_reloc, /* special_function */
686 "R_PPC64_PLT16_HI", /* name */
687 FALSE, /* partial_inplace */
689 0xffff, /* dst_mask */
690 FALSE), /* pcrel_offset */
692 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
694 HOWTO (R_PPC64_PLT16_HA, /* type */
696 1, /* size (0 = byte, 1 = short, 2 = long) */
698 FALSE, /* pc_relative */
700 complain_overflow_signed, /* complain_on_overflow */
701 ppc64_elf_unhandled_reloc, /* special_function */
702 "R_PPC64_PLT16_HA", /* name */
703 FALSE, /* partial_inplace */
705 0xffff, /* dst_mask */
706 FALSE), /* pcrel_offset */
708 /* 16-bit section relative relocation. */
709 HOWTO (R_PPC64_SECTOFF, /* type */
711 1, /* size (0 = byte, 1 = short, 2 = long) */
713 FALSE, /* pc_relative */
715 complain_overflow_bitfield, /* complain_on_overflow */
716 ppc64_elf_sectoff_reloc, /* special_function */
717 "R_PPC64_SECTOFF", /* name */
718 FALSE, /* partial_inplace */
720 0xffff, /* dst_mask */
721 FALSE), /* pcrel_offset */
723 /* Like R_PPC64_SECTOFF, but no overflow warning. */
724 HOWTO (R_PPC64_SECTOFF_LO, /* type */
726 1, /* size (0 = byte, 1 = short, 2 = long) */
728 FALSE, /* pc_relative */
730 complain_overflow_dont, /* complain_on_overflow */
731 ppc64_elf_sectoff_reloc, /* special_function */
732 "R_PPC64_SECTOFF_LO", /* name */
733 FALSE, /* partial_inplace */
735 0xffff, /* dst_mask */
736 FALSE), /* pcrel_offset */
738 /* 16-bit upper half section relative relocation. */
739 HOWTO (R_PPC64_SECTOFF_HI, /* type */
741 1, /* size (0 = byte, 1 = short, 2 = long) */
743 FALSE, /* pc_relative */
745 complain_overflow_signed, /* complain_on_overflow */
746 ppc64_elf_sectoff_reloc, /* special_function */
747 "R_PPC64_SECTOFF_HI", /* name */
748 FALSE, /* partial_inplace */
750 0xffff, /* dst_mask */
751 FALSE), /* pcrel_offset */
753 /* 16-bit upper half adjusted section relative relocation. */
754 HOWTO (R_PPC64_SECTOFF_HA, /* type */
756 1, /* size (0 = byte, 1 = short, 2 = long) */
758 FALSE, /* pc_relative */
760 complain_overflow_signed, /* complain_on_overflow */
761 ppc64_elf_sectoff_ha_reloc, /* special_function */
762 "R_PPC64_SECTOFF_HA", /* name */
763 FALSE, /* partial_inplace */
765 0xffff, /* dst_mask */
766 FALSE), /* pcrel_offset */
768 /* Like R_PPC64_REL24 without touching the two least significant bits. */
769 HOWTO (R_PPC64_REL30, /* type */
771 2, /* size (0 = byte, 1 = short, 2 = long) */
773 TRUE, /* pc_relative */
775 complain_overflow_dont, /* complain_on_overflow */
776 bfd_elf_generic_reloc, /* special_function */
777 "R_PPC64_REL30", /* name */
778 FALSE, /* partial_inplace */
780 0xfffffffc, /* dst_mask */
781 TRUE), /* pcrel_offset */
783 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
785 /* A standard 64-bit relocation. */
786 HOWTO (R_PPC64_ADDR64, /* type */
788 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
790 FALSE, /* pc_relative */
792 complain_overflow_dont, /* complain_on_overflow */
793 bfd_elf_generic_reloc, /* special_function */
794 "R_PPC64_ADDR64", /* name */
795 FALSE, /* partial_inplace */
797 ONES (64), /* dst_mask */
798 FALSE), /* pcrel_offset */
800 /* The bits 32-47 of an address. */
801 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
803 1, /* size (0 = byte, 1 = short, 2 = long) */
805 FALSE, /* pc_relative */
807 complain_overflow_dont, /* complain_on_overflow */
808 bfd_elf_generic_reloc, /* special_function */
809 "R_PPC64_ADDR16_HIGHER", /* name */
810 FALSE, /* partial_inplace */
812 0xffff, /* dst_mask */
813 FALSE), /* pcrel_offset */
815 /* The bits 32-47 of an address, plus 1 if the contents of the low
816 16 bits, treated as a signed number, is negative. */
817 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
819 1, /* size (0 = byte, 1 = short, 2 = long) */
821 FALSE, /* pc_relative */
823 complain_overflow_dont, /* complain_on_overflow */
824 ppc64_elf_ha_reloc, /* special_function */
825 "R_PPC64_ADDR16_HIGHERA", /* name */
826 FALSE, /* partial_inplace */
828 0xffff, /* dst_mask */
829 FALSE), /* pcrel_offset */
831 /* The bits 48-63 of an address. */
832 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
834 1, /* size (0 = byte, 1 = short, 2 = long) */
836 FALSE, /* pc_relative */
838 complain_overflow_dont, /* complain_on_overflow */
839 bfd_elf_generic_reloc, /* special_function */
840 "R_PPC64_ADDR16_HIGHEST", /* name */
841 FALSE, /* partial_inplace */
843 0xffff, /* dst_mask */
844 FALSE), /* pcrel_offset */
846 /* The bits 48-63 of an address, plus 1 if the contents of the low
847 16 bits, treated as a signed number, is negative. */
848 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
850 1, /* size (0 = byte, 1 = short, 2 = long) */
852 FALSE, /* pc_relative */
854 complain_overflow_dont, /* complain_on_overflow */
855 ppc64_elf_ha_reloc, /* special_function */
856 "R_PPC64_ADDR16_HIGHESTA", /* name */
857 FALSE, /* partial_inplace */
859 0xffff, /* dst_mask */
860 FALSE), /* pcrel_offset */
862 /* Like ADDR64, but may be unaligned. */
863 HOWTO (R_PPC64_UADDR64, /* type */
865 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
867 FALSE, /* pc_relative */
869 complain_overflow_dont, /* complain_on_overflow */
870 bfd_elf_generic_reloc, /* special_function */
871 "R_PPC64_UADDR64", /* name */
872 FALSE, /* partial_inplace */
874 ONES (64), /* dst_mask */
875 FALSE), /* pcrel_offset */
877 /* 64-bit relative relocation. */
878 HOWTO (R_PPC64_REL64, /* type */
880 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
882 TRUE, /* pc_relative */
884 complain_overflow_dont, /* complain_on_overflow */
885 bfd_elf_generic_reloc, /* special_function */
886 "R_PPC64_REL64", /* name */
887 FALSE, /* partial_inplace */
889 ONES (64), /* dst_mask */
890 TRUE), /* pcrel_offset */
892 /* 64-bit relocation to the symbol's procedure linkage table. */
893 HOWTO (R_PPC64_PLT64, /* type */
895 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
897 FALSE, /* pc_relative */
899 complain_overflow_dont, /* complain_on_overflow */
900 ppc64_elf_unhandled_reloc, /* special_function */
901 "R_PPC64_PLT64", /* name */
902 FALSE, /* partial_inplace */
904 ONES (64), /* dst_mask */
905 FALSE), /* pcrel_offset */
907 /* 64-bit PC relative relocation to the symbol's procedure linkage
909 /* FIXME: R_PPC64_PLTREL64 not supported. */
910 HOWTO (R_PPC64_PLTREL64, /* type */
912 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
914 TRUE, /* pc_relative */
916 complain_overflow_dont, /* complain_on_overflow */
917 ppc64_elf_unhandled_reloc, /* special_function */
918 "R_PPC64_PLTREL64", /* name */
919 FALSE, /* partial_inplace */
921 ONES (64), /* dst_mask */
922 TRUE), /* pcrel_offset */
924 /* 16 bit TOC-relative relocation. */
926 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
927 HOWTO (R_PPC64_TOC16, /* type */
929 1, /* size (0 = byte, 1 = short, 2 = long) */
931 FALSE, /* pc_relative */
933 complain_overflow_signed, /* complain_on_overflow */
934 ppc64_elf_toc_reloc, /* special_function */
935 "R_PPC64_TOC16", /* name */
936 FALSE, /* partial_inplace */
938 0xffff, /* dst_mask */
939 FALSE), /* pcrel_offset */
941 /* 16 bit TOC-relative relocation without overflow. */
943 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
944 HOWTO (R_PPC64_TOC16_LO, /* type */
946 1, /* size (0 = byte, 1 = short, 2 = long) */
948 FALSE, /* pc_relative */
950 complain_overflow_dont, /* complain_on_overflow */
951 ppc64_elf_toc_reloc, /* special_function */
952 "R_PPC64_TOC16_LO", /* name */
953 FALSE, /* partial_inplace */
955 0xffff, /* dst_mask */
956 FALSE), /* pcrel_offset */
958 /* 16 bit TOC-relative relocation, high 16 bits. */
960 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
961 HOWTO (R_PPC64_TOC16_HI, /* type */
963 1, /* size (0 = byte, 1 = short, 2 = long) */
965 FALSE, /* pc_relative */
967 complain_overflow_signed, /* complain_on_overflow */
968 ppc64_elf_toc_reloc, /* special_function */
969 "R_PPC64_TOC16_HI", /* name */
970 FALSE, /* partial_inplace */
972 0xffff, /* dst_mask */
973 FALSE), /* pcrel_offset */
975 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
976 contents of the low 16 bits, treated as a signed number, is
979 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
980 HOWTO (R_PPC64_TOC16_HA, /* type */
982 1, /* size (0 = byte, 1 = short, 2 = long) */
984 FALSE, /* pc_relative */
986 complain_overflow_signed, /* complain_on_overflow */
987 ppc64_elf_toc_ha_reloc, /* special_function */
988 "R_PPC64_TOC16_HA", /* name */
989 FALSE, /* partial_inplace */
991 0xffff, /* dst_mask */
992 FALSE), /* pcrel_offset */
994 /* 64-bit relocation; insert value of TOC base (.TOC.). */
996 /* R_PPC64_TOC 51 doubleword64 .TOC. */
997 HOWTO (R_PPC64_TOC, /* type */
999 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1001 FALSE, /* pc_relative */
1003 complain_overflow_bitfield, /* complain_on_overflow */
1004 ppc64_elf_toc64_reloc, /* special_function */
1005 "R_PPC64_TOC", /* name */
1006 FALSE, /* partial_inplace */
1008 ONES (64), /* dst_mask */
1009 FALSE), /* pcrel_offset */
1011 /* Like R_PPC64_GOT16, but also informs the link editor that the
1012 value to relocate may (!) refer to a PLT entry which the link
1013 editor (a) may replace with the symbol value. If the link editor
1014 is unable to fully resolve the symbol, it may (b) create a PLT
1015 entry and store the address to the new PLT entry in the GOT.
1016 This permits lazy resolution of function symbols at run time.
1017 The link editor may also skip all of this and just (c) emit a
1018 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1019 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1020 HOWTO (R_PPC64_PLTGOT16, /* type */
1022 1, /* size (0 = byte, 1 = short, 2 = long) */
1024 FALSE, /* pc_relative */
1026 complain_overflow_signed, /* complain_on_overflow */
1027 ppc64_elf_unhandled_reloc, /* special_function */
1028 "R_PPC64_PLTGOT16", /* name */
1029 FALSE, /* partial_inplace */
1031 0xffff, /* dst_mask */
1032 FALSE), /* pcrel_offset */
1034 /* Like R_PPC64_PLTGOT16, but without overflow. */
1035 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1036 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1038 1, /* size (0 = byte, 1 = short, 2 = long) */
1040 FALSE, /* pc_relative */
1042 complain_overflow_dont, /* complain_on_overflow */
1043 ppc64_elf_unhandled_reloc, /* special_function */
1044 "R_PPC64_PLTGOT16_LO", /* name */
1045 FALSE, /* partial_inplace */
1047 0xffff, /* dst_mask */
1048 FALSE), /* pcrel_offset */
1050 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1051 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1052 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1053 16, /* rightshift */
1054 1, /* size (0 = byte, 1 = short, 2 = long) */
1056 FALSE, /* pc_relative */
1058 complain_overflow_signed, /* complain_on_overflow */
1059 ppc64_elf_unhandled_reloc, /* special_function */
1060 "R_PPC64_PLTGOT16_HI", /* name */
1061 FALSE, /* partial_inplace */
1063 0xffff, /* dst_mask */
1064 FALSE), /* pcrel_offset */
1066 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1067 1 if the contents of the low 16 bits, treated as a signed number,
1069 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1070 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1071 16, /* rightshift */
1072 1, /* size (0 = byte, 1 = short, 2 = long) */
1074 FALSE, /* pc_relative */
1076 complain_overflow_signed, /* complain_on_overflow */
1077 ppc64_elf_unhandled_reloc, /* special_function */
1078 "R_PPC64_PLTGOT16_HA", /* name */
1079 FALSE, /* partial_inplace */
1081 0xffff, /* dst_mask */
1082 FALSE), /* pcrel_offset */
1084 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1085 HOWTO (R_PPC64_ADDR16_DS, /* type */
1087 1, /* size (0 = byte, 1 = short, 2 = long) */
1089 FALSE, /* pc_relative */
1091 complain_overflow_bitfield, /* complain_on_overflow */
1092 bfd_elf_generic_reloc, /* special_function */
1093 "R_PPC64_ADDR16_DS", /* name */
1094 FALSE, /* partial_inplace */
1096 0xfffc, /* dst_mask */
1097 FALSE), /* pcrel_offset */
1099 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1100 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1102 1, /* size (0 = byte, 1 = short, 2 = long) */
1104 FALSE, /* pc_relative */
1106 complain_overflow_dont,/* complain_on_overflow */
1107 bfd_elf_generic_reloc, /* special_function */
1108 "R_PPC64_ADDR16_LO_DS",/* name */
1109 FALSE, /* partial_inplace */
1111 0xfffc, /* dst_mask */
1112 FALSE), /* pcrel_offset */
1114 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1115 HOWTO (R_PPC64_GOT16_DS, /* type */
1117 1, /* size (0 = byte, 1 = short, 2 = long) */
1119 FALSE, /* pc_relative */
1121 complain_overflow_signed, /* complain_on_overflow */
1122 ppc64_elf_unhandled_reloc, /* special_function */
1123 "R_PPC64_GOT16_DS", /* name */
1124 FALSE, /* partial_inplace */
1126 0xfffc, /* dst_mask */
1127 FALSE), /* pcrel_offset */
1129 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1130 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1132 1, /* size (0 = byte, 1 = short, 2 = long) */
1134 FALSE, /* pc_relative */
1136 complain_overflow_dont, /* complain_on_overflow */
1137 ppc64_elf_unhandled_reloc, /* special_function */
1138 "R_PPC64_GOT16_LO_DS", /* name */
1139 FALSE, /* partial_inplace */
1141 0xfffc, /* dst_mask */
1142 FALSE), /* pcrel_offset */
1144 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1145 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1147 1, /* size (0 = byte, 1 = short, 2 = long) */
1149 FALSE, /* pc_relative */
1151 complain_overflow_dont, /* complain_on_overflow */
1152 ppc64_elf_unhandled_reloc, /* special_function */
1153 "R_PPC64_PLT16_LO_DS", /* name */
1154 FALSE, /* partial_inplace */
1156 0xfffc, /* dst_mask */
1157 FALSE), /* pcrel_offset */
1159 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1160 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1162 1, /* size (0 = byte, 1 = short, 2 = long) */
1164 FALSE, /* pc_relative */
1166 complain_overflow_bitfield, /* complain_on_overflow */
1167 ppc64_elf_sectoff_reloc, /* special_function */
1168 "R_PPC64_SECTOFF_DS", /* name */
1169 FALSE, /* partial_inplace */
1171 0xfffc, /* dst_mask */
1172 FALSE), /* pcrel_offset */
1174 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1175 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1177 1, /* size (0 = byte, 1 = short, 2 = long) */
1179 FALSE, /* pc_relative */
1181 complain_overflow_dont, /* complain_on_overflow */
1182 ppc64_elf_sectoff_reloc, /* special_function */
1183 "R_PPC64_SECTOFF_LO_DS",/* name */
1184 FALSE, /* partial_inplace */
1186 0xfffc, /* dst_mask */
1187 FALSE), /* pcrel_offset */
1189 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1190 HOWTO (R_PPC64_TOC16_DS, /* type */
1192 1, /* size (0 = byte, 1 = short, 2 = long) */
1194 FALSE, /* pc_relative */
1196 complain_overflow_signed, /* complain_on_overflow */
1197 ppc64_elf_toc_reloc, /* special_function */
1198 "R_PPC64_TOC16_DS", /* name */
1199 FALSE, /* partial_inplace */
1201 0xfffc, /* dst_mask */
1202 FALSE), /* pcrel_offset */
1204 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1205 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1207 1, /* size (0 = byte, 1 = short, 2 = long) */
1209 FALSE, /* pc_relative */
1211 complain_overflow_dont, /* complain_on_overflow */
1212 ppc64_elf_toc_reloc, /* special_function */
1213 "R_PPC64_TOC16_LO_DS", /* name */
1214 FALSE, /* partial_inplace */
1216 0xfffc, /* dst_mask */
1217 FALSE), /* pcrel_offset */
1219 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1220 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1221 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1223 1, /* size (0 = byte, 1 = short, 2 = long) */
1225 FALSE, /* pc_relative */
1227 complain_overflow_signed, /* complain_on_overflow */
1228 ppc64_elf_unhandled_reloc, /* special_function */
1229 "R_PPC64_PLTGOT16_DS", /* name */
1230 FALSE, /* partial_inplace */
1232 0xfffc, /* dst_mask */
1233 FALSE), /* pcrel_offset */
1235 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1236 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1237 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1239 1, /* size (0 = byte, 1 = short, 2 = long) */
1241 FALSE, /* pc_relative */
1243 complain_overflow_dont, /* complain_on_overflow */
1244 ppc64_elf_unhandled_reloc, /* special_function */
1245 "R_PPC64_PLTGOT16_LO_DS",/* name */
1246 FALSE, /* partial_inplace */
1248 0xfffc, /* dst_mask */
1249 FALSE), /* pcrel_offset */
1251 /* Marker relocs for TLS. */
1254 2, /* size (0 = byte, 1 = short, 2 = long) */
1256 FALSE, /* pc_relative */
1258 complain_overflow_dont, /* complain_on_overflow */
1259 bfd_elf_generic_reloc, /* special_function */
1260 "R_PPC64_TLS", /* name */
1261 FALSE, /* partial_inplace */
1264 FALSE), /* pcrel_offset */
1266 HOWTO (R_PPC64_TLSGD,
1268 2, /* size (0 = byte, 1 = short, 2 = long) */
1270 FALSE, /* pc_relative */
1272 complain_overflow_dont, /* complain_on_overflow */
1273 bfd_elf_generic_reloc, /* special_function */
1274 "R_PPC64_TLSGD", /* name */
1275 FALSE, /* partial_inplace */
1278 FALSE), /* pcrel_offset */
1280 HOWTO (R_PPC64_TLSLD,
1282 2, /* size (0 = byte, 1 = short, 2 = long) */
1284 FALSE, /* pc_relative */
1286 complain_overflow_dont, /* complain_on_overflow */
1287 bfd_elf_generic_reloc, /* special_function */
1288 "R_PPC64_TLSLD", /* name */
1289 FALSE, /* partial_inplace */
1292 FALSE), /* pcrel_offset */
1294 HOWTO (R_PPC64_TOCSAVE,
1296 2, /* size (0 = byte, 1 = short, 2 = long) */
1298 FALSE, /* pc_relative */
1300 complain_overflow_dont, /* complain_on_overflow */
1301 bfd_elf_generic_reloc, /* special_function */
1302 "R_PPC64_TOCSAVE", /* name */
1303 FALSE, /* partial_inplace */
1306 FALSE), /* pcrel_offset */
1308 /* Computes the load module index of the load module that contains the
1309 definition of its TLS sym. */
1310 HOWTO (R_PPC64_DTPMOD64,
1312 4, /* size (0 = byte, 1 = short, 2 = long) */
1314 FALSE, /* pc_relative */
1316 complain_overflow_dont, /* complain_on_overflow */
1317 ppc64_elf_unhandled_reloc, /* special_function */
1318 "R_PPC64_DTPMOD64", /* name */
1319 FALSE, /* partial_inplace */
1321 ONES (64), /* dst_mask */
1322 FALSE), /* pcrel_offset */
1324 /* Computes a dtv-relative displacement, the difference between the value
1325 of sym+add and the base address of the thread-local storage block that
1326 contains the definition of sym, minus 0x8000. */
1327 HOWTO (R_PPC64_DTPREL64,
1329 4, /* size (0 = byte, 1 = short, 2 = long) */
1331 FALSE, /* pc_relative */
1333 complain_overflow_dont, /* complain_on_overflow */
1334 ppc64_elf_unhandled_reloc, /* special_function */
1335 "R_PPC64_DTPREL64", /* name */
1336 FALSE, /* partial_inplace */
1338 ONES (64), /* dst_mask */
1339 FALSE), /* pcrel_offset */
1341 /* A 16 bit dtprel reloc. */
1342 HOWTO (R_PPC64_DTPREL16,
1344 1, /* size (0 = byte, 1 = short, 2 = long) */
1346 FALSE, /* pc_relative */
1348 complain_overflow_signed, /* complain_on_overflow */
1349 ppc64_elf_unhandled_reloc, /* special_function */
1350 "R_PPC64_DTPREL16", /* name */
1351 FALSE, /* partial_inplace */
1353 0xffff, /* dst_mask */
1354 FALSE), /* pcrel_offset */
1356 /* Like DTPREL16, but no overflow. */
1357 HOWTO (R_PPC64_DTPREL16_LO,
1359 1, /* size (0 = byte, 1 = short, 2 = long) */
1361 FALSE, /* pc_relative */
1363 complain_overflow_dont, /* complain_on_overflow */
1364 ppc64_elf_unhandled_reloc, /* special_function */
1365 "R_PPC64_DTPREL16_LO", /* name */
1366 FALSE, /* partial_inplace */
1368 0xffff, /* dst_mask */
1369 FALSE), /* pcrel_offset */
1371 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1372 HOWTO (R_PPC64_DTPREL16_HI,
1373 16, /* rightshift */
1374 1, /* size (0 = byte, 1 = short, 2 = long) */
1376 FALSE, /* pc_relative */
1378 complain_overflow_signed, /* complain_on_overflow */
1379 ppc64_elf_unhandled_reloc, /* special_function */
1380 "R_PPC64_DTPREL16_HI", /* name */
1381 FALSE, /* partial_inplace */
1383 0xffff, /* dst_mask */
1384 FALSE), /* pcrel_offset */
1386 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1387 HOWTO (R_PPC64_DTPREL16_HA,
1388 16, /* rightshift */
1389 1, /* size (0 = byte, 1 = short, 2 = long) */
1391 FALSE, /* pc_relative */
1393 complain_overflow_signed, /* complain_on_overflow */
1394 ppc64_elf_unhandled_reloc, /* special_function */
1395 "R_PPC64_DTPREL16_HA", /* name */
1396 FALSE, /* partial_inplace */
1398 0xffff, /* dst_mask */
1399 FALSE), /* pcrel_offset */
1401 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1402 HOWTO (R_PPC64_DTPREL16_HIGHER,
1403 32, /* rightshift */
1404 1, /* size (0 = byte, 1 = short, 2 = long) */
1406 FALSE, /* pc_relative */
1408 complain_overflow_dont, /* complain_on_overflow */
1409 ppc64_elf_unhandled_reloc, /* special_function */
1410 "R_PPC64_DTPREL16_HIGHER", /* name */
1411 FALSE, /* partial_inplace */
1413 0xffff, /* dst_mask */
1414 FALSE), /* pcrel_offset */
1416 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1417 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1418 32, /* rightshift */
1419 1, /* size (0 = byte, 1 = short, 2 = long) */
1421 FALSE, /* pc_relative */
1423 complain_overflow_dont, /* complain_on_overflow */
1424 ppc64_elf_unhandled_reloc, /* special_function */
1425 "R_PPC64_DTPREL16_HIGHERA", /* name */
1426 FALSE, /* partial_inplace */
1428 0xffff, /* dst_mask */
1429 FALSE), /* pcrel_offset */
1431 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1432 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1433 48, /* rightshift */
1434 1, /* size (0 = byte, 1 = short, 2 = long) */
1436 FALSE, /* pc_relative */
1438 complain_overflow_dont, /* complain_on_overflow */
1439 ppc64_elf_unhandled_reloc, /* special_function */
1440 "R_PPC64_DTPREL16_HIGHEST", /* name */
1441 FALSE, /* partial_inplace */
1443 0xffff, /* dst_mask */
1444 FALSE), /* pcrel_offset */
1446 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1447 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1448 48, /* rightshift */
1449 1, /* size (0 = byte, 1 = short, 2 = long) */
1451 FALSE, /* pc_relative */
1453 complain_overflow_dont, /* complain_on_overflow */
1454 ppc64_elf_unhandled_reloc, /* special_function */
1455 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1456 FALSE, /* partial_inplace */
1458 0xffff, /* dst_mask */
1459 FALSE), /* pcrel_offset */
1461 /* Like DTPREL16, but for insns with a DS field. */
1462 HOWTO (R_PPC64_DTPREL16_DS,
1464 1, /* size (0 = byte, 1 = short, 2 = long) */
1466 FALSE, /* pc_relative */
1468 complain_overflow_signed, /* complain_on_overflow */
1469 ppc64_elf_unhandled_reloc, /* special_function */
1470 "R_PPC64_DTPREL16_DS", /* name */
1471 FALSE, /* partial_inplace */
1473 0xfffc, /* dst_mask */
1474 FALSE), /* pcrel_offset */
1476 /* Like DTPREL16_DS, but no overflow. */
1477 HOWTO (R_PPC64_DTPREL16_LO_DS,
1479 1, /* size (0 = byte, 1 = short, 2 = long) */
1481 FALSE, /* pc_relative */
1483 complain_overflow_dont, /* complain_on_overflow */
1484 ppc64_elf_unhandled_reloc, /* special_function */
1485 "R_PPC64_DTPREL16_LO_DS", /* name */
1486 FALSE, /* partial_inplace */
1488 0xfffc, /* dst_mask */
1489 FALSE), /* pcrel_offset */
1491 /* Computes a tp-relative displacement, the difference between the value of
1492 sym+add and the value of the thread pointer (r13). */
1493 HOWTO (R_PPC64_TPREL64,
1495 4, /* size (0 = byte, 1 = short, 2 = long) */
1497 FALSE, /* pc_relative */
1499 complain_overflow_dont, /* complain_on_overflow */
1500 ppc64_elf_unhandled_reloc, /* special_function */
1501 "R_PPC64_TPREL64", /* name */
1502 FALSE, /* partial_inplace */
1504 ONES (64), /* dst_mask */
1505 FALSE), /* pcrel_offset */
1507 /* A 16 bit tprel reloc. */
1508 HOWTO (R_PPC64_TPREL16,
1510 1, /* size (0 = byte, 1 = short, 2 = long) */
1512 FALSE, /* pc_relative */
1514 complain_overflow_signed, /* complain_on_overflow */
1515 ppc64_elf_unhandled_reloc, /* special_function */
1516 "R_PPC64_TPREL16", /* name */
1517 FALSE, /* partial_inplace */
1519 0xffff, /* dst_mask */
1520 FALSE), /* pcrel_offset */
1522 /* Like TPREL16, but no overflow. */
1523 HOWTO (R_PPC64_TPREL16_LO,
1525 1, /* size (0 = byte, 1 = short, 2 = long) */
1527 FALSE, /* pc_relative */
1529 complain_overflow_dont, /* complain_on_overflow */
1530 ppc64_elf_unhandled_reloc, /* special_function */
1531 "R_PPC64_TPREL16_LO", /* name */
1532 FALSE, /* partial_inplace */
1534 0xffff, /* dst_mask */
1535 FALSE), /* pcrel_offset */
1537 /* Like TPREL16_LO, but next higher group of 16 bits. */
1538 HOWTO (R_PPC64_TPREL16_HI,
1539 16, /* rightshift */
1540 1, /* size (0 = byte, 1 = short, 2 = long) */
1542 FALSE, /* pc_relative */
1544 complain_overflow_signed, /* complain_on_overflow */
1545 ppc64_elf_unhandled_reloc, /* special_function */
1546 "R_PPC64_TPREL16_HI", /* name */
1547 FALSE, /* partial_inplace */
1549 0xffff, /* dst_mask */
1550 FALSE), /* pcrel_offset */
1552 /* Like TPREL16_HI, but adjust for low 16 bits. */
1553 HOWTO (R_PPC64_TPREL16_HA,
1554 16, /* rightshift */
1555 1, /* size (0 = byte, 1 = short, 2 = long) */
1557 FALSE, /* pc_relative */
1559 complain_overflow_signed, /* complain_on_overflow */
1560 ppc64_elf_unhandled_reloc, /* special_function */
1561 "R_PPC64_TPREL16_HA", /* name */
1562 FALSE, /* partial_inplace */
1564 0xffff, /* dst_mask */
1565 FALSE), /* pcrel_offset */
1567 /* Like TPREL16_HI, but next higher group of 16 bits. */
1568 HOWTO (R_PPC64_TPREL16_HIGHER,
1569 32, /* rightshift */
1570 1, /* size (0 = byte, 1 = short, 2 = long) */
1572 FALSE, /* pc_relative */
1574 complain_overflow_dont, /* complain_on_overflow */
1575 ppc64_elf_unhandled_reloc, /* special_function */
1576 "R_PPC64_TPREL16_HIGHER", /* name */
1577 FALSE, /* partial_inplace */
1579 0xffff, /* dst_mask */
1580 FALSE), /* pcrel_offset */
1582 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1583 HOWTO (R_PPC64_TPREL16_HIGHERA,
1584 32, /* rightshift */
1585 1, /* size (0 = byte, 1 = short, 2 = long) */
1587 FALSE, /* pc_relative */
1589 complain_overflow_dont, /* complain_on_overflow */
1590 ppc64_elf_unhandled_reloc, /* special_function */
1591 "R_PPC64_TPREL16_HIGHERA", /* name */
1592 FALSE, /* partial_inplace */
1594 0xffff, /* dst_mask */
1595 FALSE), /* pcrel_offset */
1597 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1598 HOWTO (R_PPC64_TPREL16_HIGHEST,
1599 48, /* rightshift */
1600 1, /* size (0 = byte, 1 = short, 2 = long) */
1602 FALSE, /* pc_relative */
1604 complain_overflow_dont, /* complain_on_overflow */
1605 ppc64_elf_unhandled_reloc, /* special_function */
1606 "R_PPC64_TPREL16_HIGHEST", /* name */
1607 FALSE, /* partial_inplace */
1609 0xffff, /* dst_mask */
1610 FALSE), /* pcrel_offset */
1612 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1613 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1614 48, /* rightshift */
1615 1, /* size (0 = byte, 1 = short, 2 = long) */
1617 FALSE, /* pc_relative */
1619 complain_overflow_dont, /* complain_on_overflow */
1620 ppc64_elf_unhandled_reloc, /* special_function */
1621 "R_PPC64_TPREL16_HIGHESTA", /* name */
1622 FALSE, /* partial_inplace */
1624 0xffff, /* dst_mask */
1625 FALSE), /* pcrel_offset */
1627 /* Like TPREL16, but for insns with a DS field. */
1628 HOWTO (R_PPC64_TPREL16_DS,
1630 1, /* size (0 = byte, 1 = short, 2 = long) */
1632 FALSE, /* pc_relative */
1634 complain_overflow_signed, /* complain_on_overflow */
1635 ppc64_elf_unhandled_reloc, /* special_function */
1636 "R_PPC64_TPREL16_DS", /* name */
1637 FALSE, /* partial_inplace */
1639 0xfffc, /* dst_mask */
1640 FALSE), /* pcrel_offset */
1642 /* Like TPREL16_DS, but no overflow. */
1643 HOWTO (R_PPC64_TPREL16_LO_DS,
1645 1, /* size (0 = byte, 1 = short, 2 = long) */
1647 FALSE, /* pc_relative */
1649 complain_overflow_dont, /* complain_on_overflow */
1650 ppc64_elf_unhandled_reloc, /* special_function */
1651 "R_PPC64_TPREL16_LO_DS", /* name */
1652 FALSE, /* partial_inplace */
1654 0xfffc, /* dst_mask */
1655 FALSE), /* pcrel_offset */
1657 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1658 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1659 to the first entry relative to the TOC base (r2). */
1660 HOWTO (R_PPC64_GOT_TLSGD16,
1662 1, /* size (0 = byte, 1 = short, 2 = long) */
1664 FALSE, /* pc_relative */
1666 complain_overflow_signed, /* complain_on_overflow */
1667 ppc64_elf_unhandled_reloc, /* special_function */
1668 "R_PPC64_GOT_TLSGD16", /* name */
1669 FALSE, /* partial_inplace */
1671 0xffff, /* dst_mask */
1672 FALSE), /* pcrel_offset */
1674 /* Like GOT_TLSGD16, but no overflow. */
1675 HOWTO (R_PPC64_GOT_TLSGD16_LO,
1677 1, /* size (0 = byte, 1 = short, 2 = long) */
1679 FALSE, /* pc_relative */
1681 complain_overflow_dont, /* complain_on_overflow */
1682 ppc64_elf_unhandled_reloc, /* special_function */
1683 "R_PPC64_GOT_TLSGD16_LO", /* name */
1684 FALSE, /* partial_inplace */
1686 0xffff, /* dst_mask */
1687 FALSE), /* pcrel_offset */
1689 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1690 HOWTO (R_PPC64_GOT_TLSGD16_HI,
1691 16, /* rightshift */
1692 1, /* size (0 = byte, 1 = short, 2 = long) */
1694 FALSE, /* pc_relative */
1696 complain_overflow_signed, /* complain_on_overflow */
1697 ppc64_elf_unhandled_reloc, /* special_function */
1698 "R_PPC64_GOT_TLSGD16_HI", /* name */
1699 FALSE, /* partial_inplace */
1701 0xffff, /* dst_mask */
1702 FALSE), /* pcrel_offset */
1704 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1705 HOWTO (R_PPC64_GOT_TLSGD16_HA,
1706 16, /* rightshift */
1707 1, /* size (0 = byte, 1 = short, 2 = long) */
1709 FALSE, /* pc_relative */
1711 complain_overflow_signed, /* complain_on_overflow */
1712 ppc64_elf_unhandled_reloc, /* special_function */
1713 "R_PPC64_GOT_TLSGD16_HA", /* name */
1714 FALSE, /* partial_inplace */
1716 0xffff, /* dst_mask */
1717 FALSE), /* pcrel_offset */
1719 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1720 with values (sym+add)@dtpmod and zero, and computes the offset to the
1721 first entry relative to the TOC base (r2). */
1722 HOWTO (R_PPC64_GOT_TLSLD16,
1724 1, /* size (0 = byte, 1 = short, 2 = long) */
1726 FALSE, /* pc_relative */
1728 complain_overflow_signed, /* complain_on_overflow */
1729 ppc64_elf_unhandled_reloc, /* special_function */
1730 "R_PPC64_GOT_TLSLD16", /* name */
1731 FALSE, /* partial_inplace */
1733 0xffff, /* dst_mask */
1734 FALSE), /* pcrel_offset */
1736 /* Like GOT_TLSLD16, but no overflow. */
1737 HOWTO (R_PPC64_GOT_TLSLD16_LO,
1739 1, /* size (0 = byte, 1 = short, 2 = long) */
1741 FALSE, /* pc_relative */
1743 complain_overflow_dont, /* complain_on_overflow */
1744 ppc64_elf_unhandled_reloc, /* special_function */
1745 "R_PPC64_GOT_TLSLD16_LO", /* name */
1746 FALSE, /* partial_inplace */
1748 0xffff, /* dst_mask */
1749 FALSE), /* pcrel_offset */
1751 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1752 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1753 16, /* rightshift */
1754 1, /* size (0 = byte, 1 = short, 2 = long) */
1756 FALSE, /* pc_relative */
1758 complain_overflow_signed, /* complain_on_overflow */
1759 ppc64_elf_unhandled_reloc, /* special_function */
1760 "R_PPC64_GOT_TLSLD16_HI", /* name */
1761 FALSE, /* partial_inplace */
1763 0xffff, /* dst_mask */
1764 FALSE), /* pcrel_offset */
1766 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1767 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1768 16, /* rightshift */
1769 1, /* size (0 = byte, 1 = short, 2 = long) */
1771 FALSE, /* pc_relative */
1773 complain_overflow_signed, /* complain_on_overflow */
1774 ppc64_elf_unhandled_reloc, /* special_function */
1775 "R_PPC64_GOT_TLSLD16_HA", /* name */
1776 FALSE, /* partial_inplace */
1778 0xffff, /* dst_mask */
1779 FALSE), /* pcrel_offset */
1781 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1782 the offset to the entry relative to the TOC base (r2). */
1783 HOWTO (R_PPC64_GOT_DTPREL16_DS,
1785 1, /* size (0 = byte, 1 = short, 2 = long) */
1787 FALSE, /* pc_relative */
1789 complain_overflow_signed, /* complain_on_overflow */
1790 ppc64_elf_unhandled_reloc, /* special_function */
1791 "R_PPC64_GOT_DTPREL16_DS", /* name */
1792 FALSE, /* partial_inplace */
1794 0xfffc, /* dst_mask */
1795 FALSE), /* pcrel_offset */
1797 /* Like GOT_DTPREL16_DS, but no overflow. */
1798 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1800 1, /* size (0 = byte, 1 = short, 2 = long) */
1802 FALSE, /* pc_relative */
1804 complain_overflow_dont, /* complain_on_overflow */
1805 ppc64_elf_unhandled_reloc, /* special_function */
1806 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1807 FALSE, /* partial_inplace */
1809 0xfffc, /* dst_mask */
1810 FALSE), /* pcrel_offset */
1812 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1813 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1814 16, /* rightshift */
1815 1, /* size (0 = byte, 1 = short, 2 = long) */
1817 FALSE, /* pc_relative */
1819 complain_overflow_signed, /* complain_on_overflow */
1820 ppc64_elf_unhandled_reloc, /* special_function */
1821 "R_PPC64_GOT_DTPREL16_HI", /* name */
1822 FALSE, /* partial_inplace */
1824 0xffff, /* dst_mask */
1825 FALSE), /* pcrel_offset */
1827 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1828 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1829 16, /* rightshift */
1830 1, /* size (0 = byte, 1 = short, 2 = long) */
1832 FALSE, /* pc_relative */
1834 complain_overflow_signed, /* complain_on_overflow */
1835 ppc64_elf_unhandled_reloc, /* special_function */
1836 "R_PPC64_GOT_DTPREL16_HA", /* name */
1837 FALSE, /* partial_inplace */
1839 0xffff, /* dst_mask */
1840 FALSE), /* pcrel_offset */
1842 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1843 offset to the entry relative to the TOC base (r2). */
1844 HOWTO (R_PPC64_GOT_TPREL16_DS,
1846 1, /* size (0 = byte, 1 = short, 2 = long) */
1848 FALSE, /* pc_relative */
1850 complain_overflow_signed, /* complain_on_overflow */
1851 ppc64_elf_unhandled_reloc, /* special_function */
1852 "R_PPC64_GOT_TPREL16_DS", /* name */
1853 FALSE, /* partial_inplace */
1855 0xfffc, /* dst_mask */
1856 FALSE), /* pcrel_offset */
1858 /* Like GOT_TPREL16_DS, but no overflow. */
1859 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1861 1, /* size (0 = byte, 1 = short, 2 = long) */
1863 FALSE, /* pc_relative */
1865 complain_overflow_dont, /* complain_on_overflow */
1866 ppc64_elf_unhandled_reloc, /* special_function */
1867 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1868 FALSE, /* partial_inplace */
1870 0xfffc, /* dst_mask */
1871 FALSE), /* pcrel_offset */
1873 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1874 HOWTO (R_PPC64_GOT_TPREL16_HI,
1875 16, /* rightshift */
1876 1, /* size (0 = byte, 1 = short, 2 = long) */
1878 FALSE, /* pc_relative */
1880 complain_overflow_signed, /* complain_on_overflow */
1881 ppc64_elf_unhandled_reloc, /* special_function */
1882 "R_PPC64_GOT_TPREL16_HI", /* name */
1883 FALSE, /* partial_inplace */
1885 0xffff, /* dst_mask */
1886 FALSE), /* pcrel_offset */
1888 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1889 HOWTO (R_PPC64_GOT_TPREL16_HA,
1890 16, /* rightshift */
1891 1, /* size (0 = byte, 1 = short, 2 = long) */
1893 FALSE, /* pc_relative */
1895 complain_overflow_signed, /* complain_on_overflow */
1896 ppc64_elf_unhandled_reloc, /* special_function */
1897 "R_PPC64_GOT_TPREL16_HA", /* name */
1898 FALSE, /* partial_inplace */
1900 0xffff, /* dst_mask */
1901 FALSE), /* pcrel_offset */
1903 HOWTO (R_PPC64_JMP_IREL, /* type */
1905 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1907 FALSE, /* pc_relative */
1909 complain_overflow_dont, /* complain_on_overflow */
1910 ppc64_elf_unhandled_reloc, /* special_function */
1911 "R_PPC64_JMP_IREL", /* name */
1912 FALSE, /* partial_inplace */
1915 FALSE), /* pcrel_offset */
1917 HOWTO (R_PPC64_IRELATIVE, /* type */
1919 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1921 FALSE, /* pc_relative */
1923 complain_overflow_dont, /* complain_on_overflow */
1924 bfd_elf_generic_reloc, /* special_function */
1925 "R_PPC64_IRELATIVE", /* name */
1926 FALSE, /* partial_inplace */
1928 ONES (64), /* dst_mask */
1929 FALSE), /* pcrel_offset */
1931 /* A 16 bit relative relocation. */
1932 HOWTO (R_PPC64_REL16, /* type */
1934 1, /* size (0 = byte, 1 = short, 2 = long) */
1936 TRUE, /* pc_relative */
1938 complain_overflow_bitfield, /* complain_on_overflow */
1939 bfd_elf_generic_reloc, /* special_function */
1940 "R_PPC64_REL16", /* name */
1941 FALSE, /* partial_inplace */
1943 0xffff, /* dst_mask */
1944 TRUE), /* pcrel_offset */
1946 /* A 16 bit relative relocation without overflow. */
1947 HOWTO (R_PPC64_REL16_LO, /* type */
1949 1, /* size (0 = byte, 1 = short, 2 = long) */
1951 TRUE, /* pc_relative */
1953 complain_overflow_dont,/* complain_on_overflow */
1954 bfd_elf_generic_reloc, /* special_function */
1955 "R_PPC64_REL16_LO", /* name */
1956 FALSE, /* partial_inplace */
1958 0xffff, /* dst_mask */
1959 TRUE), /* pcrel_offset */
1961 /* The high order 16 bits of a relative address. */
1962 HOWTO (R_PPC64_REL16_HI, /* type */
1963 16, /* rightshift */
1964 1, /* size (0 = byte, 1 = short, 2 = long) */
1966 TRUE, /* pc_relative */
1968 complain_overflow_signed, /* complain_on_overflow */
1969 bfd_elf_generic_reloc, /* special_function */
1970 "R_PPC64_REL16_HI", /* name */
1971 FALSE, /* partial_inplace */
1973 0xffff, /* dst_mask */
1974 TRUE), /* pcrel_offset */
1976 /* The high order 16 bits of a relative address, plus 1 if the contents of
1977 the low 16 bits, treated as a signed number, is negative. */
1978 HOWTO (R_PPC64_REL16_HA, /* type */
1979 16, /* rightshift */
1980 1, /* size (0 = byte, 1 = short, 2 = long) */
1982 TRUE, /* pc_relative */
1984 complain_overflow_signed, /* complain_on_overflow */
1985 ppc64_elf_ha_reloc, /* special_function */
1986 "R_PPC64_REL16_HA", /* name */
1987 FALSE, /* partial_inplace */
1989 0xffff, /* dst_mask */
1990 TRUE), /* pcrel_offset */
1992 /* Like R_PPC64_ADDR16_HI, but no overflow. */
1993 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
1994 16, /* rightshift */
1995 1, /* size (0 = byte, 1 = short, 2 = long) */
1997 FALSE, /* pc_relative */
1999 complain_overflow_dont, /* complain_on_overflow */
2000 bfd_elf_generic_reloc, /* special_function */
2001 "R_PPC64_ADDR16_HIGH", /* name */
2002 FALSE, /* partial_inplace */
2004 0xffff, /* dst_mask */
2005 FALSE), /* pcrel_offset */
2007 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2008 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2009 16, /* rightshift */
2010 1, /* size (0 = byte, 1 = short, 2 = long) */
2012 FALSE, /* pc_relative */
2014 complain_overflow_dont, /* complain_on_overflow */
2015 ppc64_elf_ha_reloc, /* special_function */
2016 "R_PPC64_ADDR16_HIGHA", /* name */
2017 FALSE, /* partial_inplace */
2019 0xffff, /* dst_mask */
2020 FALSE), /* pcrel_offset */
2022 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2023 HOWTO (R_PPC64_DTPREL16_HIGH,
2024 16, /* rightshift */
2025 1, /* size (0 = byte, 1 = short, 2 = long) */
2027 FALSE, /* pc_relative */
2029 complain_overflow_dont, /* complain_on_overflow */
2030 ppc64_elf_unhandled_reloc, /* special_function */
2031 "R_PPC64_DTPREL16_HIGH", /* name */
2032 FALSE, /* partial_inplace */
2034 0xffff, /* dst_mask */
2035 FALSE), /* pcrel_offset */
2037 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2038 HOWTO (R_PPC64_DTPREL16_HIGHA,
2039 16, /* rightshift */
2040 1, /* size (0 = byte, 1 = short, 2 = long) */
2042 FALSE, /* pc_relative */
2044 complain_overflow_dont, /* complain_on_overflow */
2045 ppc64_elf_unhandled_reloc, /* special_function */
2046 "R_PPC64_DTPREL16_HIGHA", /* name */
2047 FALSE, /* partial_inplace */
2049 0xffff, /* dst_mask */
2050 FALSE), /* pcrel_offset */
2052 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2053 HOWTO (R_PPC64_TPREL16_HIGH,
2054 16, /* rightshift */
2055 1, /* size (0 = byte, 1 = short, 2 = long) */
2057 FALSE, /* pc_relative */
2059 complain_overflow_dont, /* complain_on_overflow */
2060 ppc64_elf_unhandled_reloc, /* special_function */
2061 "R_PPC64_TPREL16_HIGH", /* name */
2062 FALSE, /* partial_inplace */
2064 0xffff, /* dst_mask */
2065 FALSE), /* pcrel_offset */
2067 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2068 HOWTO (R_PPC64_TPREL16_HIGHA,
2069 16, /* rightshift */
2070 1, /* size (0 = byte, 1 = short, 2 = long) */
2072 FALSE, /* pc_relative */
2074 complain_overflow_dont, /* complain_on_overflow */
2075 ppc64_elf_unhandled_reloc, /* special_function */
2076 "R_PPC64_TPREL16_HIGHA", /* name */
2077 FALSE, /* partial_inplace */
2079 0xffff, /* dst_mask */
2080 FALSE), /* pcrel_offset */
2082 /* GNU extension to record C++ vtable hierarchy. */
2083 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2085 0, /* size (0 = byte, 1 = short, 2 = long) */
2087 FALSE, /* pc_relative */
2089 complain_overflow_dont, /* complain_on_overflow */
2090 NULL, /* special_function */
2091 "R_PPC64_GNU_VTINHERIT", /* name */
2092 FALSE, /* partial_inplace */
2095 FALSE), /* pcrel_offset */
2097 /* GNU extension to record C++ vtable member usage. */
2098 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2100 0, /* size (0 = byte, 1 = short, 2 = long) */
2102 FALSE, /* pc_relative */
2104 complain_overflow_dont, /* complain_on_overflow */
2105 NULL, /* special_function */
2106 "R_PPC64_GNU_VTENTRY", /* name */
2107 FALSE, /* partial_inplace */
2110 FALSE), /* pcrel_offset */
2114 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
2118 ppc_howto_init (void)
2120 unsigned int i, type;
2123 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2126 type = ppc64_elf_howto_raw[i].type;
2127 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2128 / sizeof (ppc64_elf_howto_table[0])));
2129 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2133 static reloc_howto_type *
2134 ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2135 bfd_reloc_code_real_type code)
2137 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
2139 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2140 /* Initialize howto table if needed. */
2148 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2150 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2152 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2154 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2156 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2158 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2160 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2162 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
2164 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2166 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
2168 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
2170 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
2172 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
2174 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
2176 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
2178 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
2180 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
2182 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
2184 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
2186 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
2188 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
2190 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
2192 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
2194 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
2196 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
2198 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
2200 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
2202 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
2204 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
2206 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
2208 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
2210 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
2212 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
2214 case BFD_RELOC_64: r = R_PPC64_ADDR64;
2216 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
2218 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
2220 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
2222 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
2224 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
2226 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
2228 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
2230 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
2232 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
2234 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
2236 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
2238 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
2240 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
2242 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
2244 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
2246 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
2248 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
2250 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
2252 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
2254 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
2256 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
2258 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
2260 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
2262 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
2264 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
2266 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
2268 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
2270 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
2272 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2274 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2276 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
2278 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
2280 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
2282 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
2284 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2286 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
2288 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2290 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
2292 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2294 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2296 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2298 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2300 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2302 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2304 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2306 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2308 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2310 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2312 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2314 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2316 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2318 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2320 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2322 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2324 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2326 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2328 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2330 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2332 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2334 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2336 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2338 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2340 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2342 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2344 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2346 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2348 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2350 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2352 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2354 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2356 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2358 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2360 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2362 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2364 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2366 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2368 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2370 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2372 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
2376 return ppc64_elf_howto_table[r];
2379 static reloc_howto_type *
2380 ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2386 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2388 if (ppc64_elf_howto_raw[i].name != NULL
2389 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2390 return &ppc64_elf_howto_raw[i];
2395 /* Set the howto pointer for a PowerPC ELF reloc. */
2398 ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2399 Elf_Internal_Rela *dst)
2403 /* Initialize howto table if needed. */
2404 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2407 type = ELF64_R_TYPE (dst->r_info);
2408 if (type >= (sizeof (ppc64_elf_howto_table)
2409 / sizeof (ppc64_elf_howto_table[0])))
2411 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
2413 type = R_PPC64_NONE;
2415 cache_ptr->howto = ppc64_elf_howto_table[type];
2418 /* Handle the R_PPC64_ADDR16_HA and similar relocs. */
2420 static bfd_reloc_status_type
2421 ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2422 void *data, asection *input_section,
2423 bfd *output_bfd, char **error_message)
2425 /* If this is a relocatable link (output_bfd test tells us), just
2426 call the generic function. Any adjustment will be done at final
2428 if (output_bfd != NULL)
2429 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2430 input_section, output_bfd, error_message);
2432 /* Adjust the addend for sign extension of the low 16 bits.
2433 We won't actually be using the low 16 bits, so trashing them
2435 reloc_entry->addend += 0x8000;
2436 return bfd_reloc_continue;
2439 static bfd_reloc_status_type
2440 ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2441 void *data, asection *input_section,
2442 bfd *output_bfd, char **error_message)
2444 if (output_bfd != NULL)
2445 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2446 input_section, output_bfd, error_message);
2448 if (strcmp (symbol->section->name, ".opd") == 0
2449 && (symbol->section->owner->flags & DYNAMIC) == 0)
2451 bfd_vma dest = opd_entry_value (symbol->section,
2452 symbol->value + reloc_entry->addend,
2454 if (dest != (bfd_vma) -1)
2455 reloc_entry->addend = dest - (symbol->value
2456 + symbol->section->output_section->vma
2457 + symbol->section->output_offset);
2459 return bfd_reloc_continue;
2462 static bfd_reloc_status_type
2463 ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2464 void *data, asection *input_section,
2465 bfd *output_bfd, char **error_message)
2468 enum elf_ppc64_reloc_type r_type;
2469 bfd_size_type octets;
2470 /* Assume 'at' branch hints. */
2471 bfd_boolean is_isa_v2 = TRUE;
2473 /* If this is a relocatable link (output_bfd test tells us), just
2474 call the generic function. Any adjustment will be done at final
2476 if (output_bfd != NULL)
2477 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2478 input_section, output_bfd, error_message);
2480 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2481 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2482 insn &= ~(0x01 << 21);
2483 r_type = reloc_entry->howto->type;
2484 if (r_type == R_PPC64_ADDR14_BRTAKEN
2485 || r_type == R_PPC64_REL14_BRTAKEN)
2486 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
2490 /* Set 'a' bit. This is 0b00010 in BO field for branch
2491 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2492 for branch on CTR insns (BO == 1a00t or 1a01t). */
2493 if ((insn & (0x14 << 21)) == (0x04 << 21))
2495 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2505 if (!bfd_is_com_section (symbol->section))
2506 target = symbol->value;
2507 target += symbol->section->output_section->vma;
2508 target += symbol->section->output_offset;
2509 target += reloc_entry->addend;
2511 from = (reloc_entry->address
2512 + input_section->output_offset
2513 + input_section->output_section->vma);
2515 /* Invert 'y' bit if not the default. */
2516 if ((bfd_signed_vma) (target - from) < 0)
2519 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2521 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2522 input_section, output_bfd, error_message);
2525 static bfd_reloc_status_type
2526 ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2527 void *data, asection *input_section,
2528 bfd *output_bfd, char **error_message)
2530 /* If this is a relocatable link (output_bfd test tells us), just
2531 call the generic function. Any adjustment will be done at final
2533 if (output_bfd != NULL)
2534 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2535 input_section, output_bfd, error_message);
2537 /* Subtract the symbol section base address. */
2538 reloc_entry->addend -= symbol->section->output_section->vma;
2539 return bfd_reloc_continue;
2542 static bfd_reloc_status_type
2543 ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2544 void *data, asection *input_section,
2545 bfd *output_bfd, char **error_message)
2547 /* If this is a relocatable link (output_bfd test tells us), just
2548 call the generic function. Any adjustment will be done at final
2550 if (output_bfd != NULL)
2551 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2552 input_section, output_bfd, error_message);
2554 /* Subtract the symbol section base address. */
2555 reloc_entry->addend -= symbol->section->output_section->vma;
2557 /* Adjust the addend for sign extension of the low 16 bits. */
2558 reloc_entry->addend += 0x8000;
2559 return bfd_reloc_continue;
2562 static bfd_reloc_status_type
2563 ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2564 void *data, asection *input_section,
2565 bfd *output_bfd, char **error_message)
2569 /* If this is a relocatable link (output_bfd test tells us), just
2570 call the generic function. Any adjustment will be done at final
2572 if (output_bfd != NULL)
2573 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2574 input_section, output_bfd, error_message);
2576 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2578 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2580 /* Subtract the TOC base address. */
2581 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2582 return bfd_reloc_continue;
2585 static bfd_reloc_status_type
2586 ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2587 void *data, asection *input_section,
2588 bfd *output_bfd, char **error_message)
2592 /* If this is a relocatable link (output_bfd test tells us), just
2593 call the generic function. Any adjustment will be done at final
2595 if (output_bfd != NULL)
2596 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2597 input_section, output_bfd, error_message);
2599 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2601 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2603 /* Subtract the TOC base address. */
2604 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2606 /* Adjust the addend for sign extension of the low 16 bits. */
2607 reloc_entry->addend += 0x8000;
2608 return bfd_reloc_continue;
2611 static bfd_reloc_status_type
2612 ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2613 void *data, asection *input_section,
2614 bfd *output_bfd, char **error_message)
2617 bfd_size_type octets;
2619 /* If this is a relocatable link (output_bfd test tells us), just
2620 call the generic function. Any adjustment will be done at final
2622 if (output_bfd != NULL)
2623 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2624 input_section, output_bfd, error_message);
2626 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2628 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2630 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2631 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2632 return bfd_reloc_ok;
2635 static bfd_reloc_status_type
2636 ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2637 void *data, asection *input_section,
2638 bfd *output_bfd, char **error_message)
2640 /* If this is a relocatable link (output_bfd test tells us), just
2641 call the generic function. Any adjustment will be done at final
2643 if (output_bfd != NULL)
2644 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2645 input_section, output_bfd, error_message);
2647 if (error_message != NULL)
2649 static char buf[60];
2650 sprintf (buf, "generic linker can't handle %s",
2651 reloc_entry->howto->name);
2652 *error_message = buf;
2654 return bfd_reloc_dangerous;
2657 /* Track GOT entries needed for a given symbol. We might need more
2658 than one got entry per symbol. */
2661 struct got_entry *next;
2663 /* The symbol addend that we'll be placing in the GOT. */
2666 /* Unlike other ELF targets, we use separate GOT entries for the same
2667 symbol referenced from different input files. This is to support
2668 automatic multiple TOC/GOT sections, where the TOC base can vary
2669 from one input file to another. After partitioning into TOC groups
2670 we merge entries within the group.
2672 Point to the BFD owning this GOT entry. */
2675 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2676 TLS_TPREL or TLS_DTPREL for tls entries. */
2677 unsigned char tls_type;
2679 /* Non-zero if got.ent points to real entry. */
2680 unsigned char is_indirect;
2682 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2685 bfd_signed_vma refcount;
2687 struct got_entry *ent;
2691 /* The same for PLT. */
2694 struct plt_entry *next;
2700 bfd_signed_vma refcount;
2705 struct ppc64_elf_obj_tdata
2707 struct elf_obj_tdata elf;
2709 /* Shortcuts to dynamic linker sections. */
2713 /* Used during garbage collection. We attach global symbols defined
2714 on removed .opd entries to this section so that the sym is removed. */
2715 asection *deleted_section;
2717 /* TLS local dynamic got entry handling. Support for multiple GOT
2718 sections means we potentially need one of these for each input bfd. */
2719 struct got_entry tlsld_got;
2722 /* A copy of relocs before they are modified for --emit-relocs. */
2723 Elf_Internal_Rela *relocs;
2725 /* Section contents. */
2729 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2730 the reloc to be in the range -32768 to 32767. */
2731 unsigned int has_small_toc_reloc : 1;
2733 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2734 instruction not one we handle. */
2735 unsigned int unexpected_toc_insn : 1;
2738 #define ppc64_elf_tdata(bfd) \
2739 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2741 #define ppc64_tlsld_got(bfd) \
2742 (&ppc64_elf_tdata (bfd)->tlsld_got)
2744 #define is_ppc64_elf(bfd) \
2745 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2746 && elf_object_id (bfd) == PPC64_ELF_DATA)
2748 /* Override the generic function because we store some extras. */
2751 ppc64_elf_mkobject (bfd *abfd)
2753 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2757 /* Fix bad default arch selected for a 64 bit input bfd when the
2758 default is 32 bit. */
2761 ppc64_elf_object_p (bfd *abfd)
2763 if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2765 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2767 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2769 /* Relies on arch after 32 bit default being 64 bit default. */
2770 abfd->arch_info = abfd->arch_info->next;
2771 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2777 /* Support for core dump NOTE sections. */
2780 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2782 size_t offset, size;
2784 if (note->descsz != 504)
2788 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2791 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
2797 /* Make a ".reg/999" section. */
2798 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2799 size, note->descpos + offset);
2803 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2805 if (note->descsz != 136)
2808 elf_tdata (abfd)->core->pid
2809 = bfd_get_32 (abfd, note->descdata + 24);
2810 elf_tdata (abfd)->core->program
2811 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2812 elf_tdata (abfd)->core->command
2813 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2819 ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2832 va_start (ap, note_type);
2833 memset (data, 0, sizeof (data));
2834 strncpy (data + 40, va_arg (ap, const char *), 16);
2835 strncpy (data + 56, va_arg (ap, const char *), 80);
2837 return elfcore_write_note (abfd, buf, bufsiz,
2838 "CORE", note_type, data, sizeof (data));
2849 va_start (ap, note_type);
2850 memset (data, 0, 112);
2851 pid = va_arg (ap, long);
2852 bfd_put_32 (abfd, pid, data + 32);
2853 cursig = va_arg (ap, int);
2854 bfd_put_16 (abfd, cursig, data + 12);
2855 greg = va_arg (ap, const void *);
2856 memcpy (data + 112, greg, 384);
2857 memset (data + 496, 0, 8);
2859 return elfcore_write_note (abfd, buf, bufsiz,
2860 "CORE", note_type, data, sizeof (data));
2865 /* Add extra PPC sections. */
2867 static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
2869 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
2870 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2871 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2872 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2873 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2874 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2875 { NULL, 0, 0, 0, 0 }
2878 enum _ppc64_sec_type {
2884 struct _ppc64_elf_section_data
2886 struct bfd_elf_section_data elf;
2890 /* An array with one entry for each opd function descriptor. */
2891 struct _opd_sec_data
2893 /* Points to the function code section for local opd entries. */
2894 asection **func_sec;
2896 /* After editing .opd, adjust references to opd local syms. */
2900 /* An array for toc sections, indexed by offset/8. */
2901 struct _toc_sec_data
2903 /* Specifies the relocation symbol index used at a given toc offset. */
2906 /* And the relocation addend. */
2911 enum _ppc64_sec_type sec_type:2;
2913 /* Flag set when small branches are detected. Used to
2914 select suitable defaults for the stub group size. */
2915 unsigned int has_14bit_branch:1;
2918 #define ppc64_elf_section_data(sec) \
2919 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2922 ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2924 if (!sec->used_by_bfd)
2926 struct _ppc64_elf_section_data *sdata;
2927 bfd_size_type amt = sizeof (*sdata);
2929 sdata = bfd_zalloc (abfd, amt);
2932 sec->used_by_bfd = sdata;
2935 return _bfd_elf_new_section_hook (abfd, sec);
2938 static struct _opd_sec_data *
2939 get_opd_info (asection * sec)
2942 && ppc64_elf_section_data (sec) != NULL
2943 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
2944 return &ppc64_elf_section_data (sec)->u.opd;
2949 abiversion (bfd *abfd)
2951 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
2955 set_abiversion (bfd *abfd, int ver)
2957 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
2958 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
2961 /* Parameters for the qsort hook. */
2962 static bfd_boolean synthetic_relocatable;
2964 /* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
2967 compare_symbols (const void *ap, const void *bp)
2969 const asymbol *a = * (const asymbol **) ap;
2970 const asymbol *b = * (const asymbol **) bp;
2972 /* Section symbols first. */
2973 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
2975 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
2978 /* then .opd symbols. */
2979 if (strcmp (a->section->name, ".opd") == 0
2980 && strcmp (b->section->name, ".opd") != 0)
2982 if (strcmp (a->section->name, ".opd") != 0
2983 && strcmp (b->section->name, ".opd") == 0)
2986 /* then other code symbols. */
2987 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2988 == (SEC_CODE | SEC_ALLOC)
2989 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2990 != (SEC_CODE | SEC_ALLOC))
2993 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2994 != (SEC_CODE | SEC_ALLOC)
2995 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2996 == (SEC_CODE | SEC_ALLOC))
2999 if (synthetic_relocatable)
3001 if (a->section->id < b->section->id)
3004 if (a->section->id > b->section->id)
3008 if (a->value + a->section->vma < b->value + b->section->vma)
3011 if (a->value + a->section->vma > b->value + b->section->vma)
3014 /* For syms with the same value, prefer strong dynamic global function
3015 syms over other syms. */
3016 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3019 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3022 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3025 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3028 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3031 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3034 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3037 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3043 /* Search SYMS for a symbol of the given VALUE. */
3046 sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
3054 mid = (lo + hi) >> 1;
3055 if (syms[mid]->value + syms[mid]->section->vma < value)
3057 else if (syms[mid]->value + syms[mid]->section->vma > value)
3067 mid = (lo + hi) >> 1;
3068 if (syms[mid]->section->id < id)
3070 else if (syms[mid]->section->id > id)
3072 else if (syms[mid]->value < value)
3074 else if (syms[mid]->value > value)
3084 section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3086 bfd_vma vma = *(bfd_vma *) ptr;
3087 return ((section->flags & SEC_ALLOC) != 0
3088 && section->vma <= vma
3089 && vma < section->vma + section->size);
3092 /* Create synthetic symbols, effectively restoring "dot-symbol" function
3093 entry syms. Also generate @plt symbols for the glink branch table. */
3096 ppc64_elf_get_synthetic_symtab (bfd *abfd,
3097 long static_count, asymbol **static_syms,
3098 long dyn_count, asymbol **dyn_syms,
3105 long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
3106 asection *opd = NULL;
3107 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
3109 int abi = abiversion (abfd);
3115 opd = bfd_get_section_by_name (abfd, ".opd");
3116 if (opd == NULL && abi == 1)
3120 symcount = static_count;
3122 symcount += dyn_count;
3126 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3130 if (!relocatable && static_count != 0 && dyn_count != 0)
3132 /* Use both symbol tables. */
3133 memcpy (syms, static_syms, static_count * sizeof (*syms));
3134 memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
3136 else if (!relocatable && static_count == 0)
3137 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3139 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3141 synthetic_relocatable = relocatable;
3142 qsort (syms, symcount, sizeof (*syms), compare_symbols);
3144 if (!relocatable && symcount > 1)
3147 /* Trim duplicate syms, since we may have merged the normal and
3148 dynamic symbols. Actually, we only care about syms that have
3149 different values, so trim any with the same value. */
3150 for (i = 1, j = 1; i < symcount; ++i)
3151 if (syms[i - 1]->value + syms[i - 1]->section->vma
3152 != syms[i]->value + syms[i]->section->vma)
3153 syms[j++] = syms[i];
3158 if (strcmp (syms[i]->section->name, ".opd") == 0)
3162 for (; i < symcount; ++i)
3163 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3164 != (SEC_CODE | SEC_ALLOC))
3165 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3169 for (; i < symcount; ++i)
3170 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3174 for (; i < symcount; ++i)
3175 if (strcmp (syms[i]->section->name, ".opd") != 0)
3179 for (; i < symcount; ++i)
3180 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3181 != (SEC_CODE | SEC_ALLOC))
3189 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3194 if (opdsymend == secsymend)
3197 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3198 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
3202 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3209 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3213 while (r < opd->relocation + relcount
3214 && r->address < syms[i]->value + opd->vma)
3217 if (r == opd->relocation + relcount)
3220 if (r->address != syms[i]->value + opd->vma)
3223 if (r->howto->type != R_PPC64_ADDR64)
3226 sym = *r->sym_ptr_ptr;
3227 if (!sym_exists_at (syms, opdsymend, symcount,
3228 sym->section->id, sym->value + r->addend))
3231 size += sizeof (asymbol);
3232 size += strlen (syms[i]->name) + 2;
3236 s = *ret = bfd_malloc (size);
3243 names = (char *) (s + count);
3245 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3249 while (r < opd->relocation + relcount
3250 && r->address < syms[i]->value + opd->vma)
3253 if (r == opd->relocation + relcount)
3256 if (r->address != syms[i]->value + opd->vma)
3259 if (r->howto->type != R_PPC64_ADDR64)
3262 sym = *r->sym_ptr_ptr;
3263 if (!sym_exists_at (syms, opdsymend, symcount,
3264 sym->section->id, sym->value + r->addend))
3269 s->flags |= BSF_SYNTHETIC;
3270 s->section = sym->section;
3271 s->value = sym->value + r->addend;
3274 len = strlen (syms[i]->name);
3275 memcpy (names, syms[i]->name, len + 1);
3277 /* Have udata.p point back to the original symbol this
3278 synthetic symbol was derived from. */
3279 s->udata.p = syms[i];
3286 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3287 bfd_byte *contents = NULL;
3290 bfd_vma glink_vma = 0, resolv_vma = 0;
3291 asection *dynamic, *glink = NULL, *relplt = NULL;
3294 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
3296 free_contents_and_exit:
3304 for (i = secsymend; i < opdsymend; ++i)
3308 /* Ignore bogus symbols. */
3309 if (syms[i]->value > opd->size - 8)
3312 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3313 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3316 size += sizeof (asymbol);
3317 size += strlen (syms[i]->name) + 2;
3321 /* Get start of .glink stubs from DT_PPC64_GLINK. */
3323 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
3325 bfd_byte *dynbuf, *extdyn, *extdynend;
3327 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3329 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3330 goto free_contents_and_exit;
3332 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3333 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3336 extdynend = extdyn + dynamic->size;
3337 for (; extdyn < extdynend; extdyn += extdynsize)
3339 Elf_Internal_Dyn dyn;
3340 (*swap_dyn_in) (abfd, extdyn, &dyn);
3342 if (dyn.d_tag == DT_NULL)
3345 if (dyn.d_tag == DT_PPC64_GLINK)
3347 /* The first glink stub starts at offset 32; see comment in
3348 ppc64_elf_finish_dynamic_sections. */
3349 glink_vma = dyn.d_un.d_val + 32;
3350 /* The .glink section usually does not survive the final
3351 link; search for the section (usually .text) where the
3352 glink stubs now reside. */
3353 glink = bfd_sections_find_if (abfd, section_covers_vma,
3364 /* Determine __glink trampoline by reading the relative branch
3365 from the first glink stub. */
3367 if (bfd_get_section_contents (abfd, glink, buf,
3368 glink_vma + 4 - glink->vma, 4))
3370 unsigned int insn = bfd_get_32 (abfd, buf);
3372 if ((insn & ~0x3fffffc) == 0)
3373 resolv_vma = glink_vma + 4 + (insn ^ 0x2000000) - 0x2000000;
3377 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3379 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3382 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3383 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3384 goto free_contents_and_exit;
3386 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3387 size += plt_count * sizeof (asymbol);
3389 p = relplt->relocation;
3390 for (i = 0; i < plt_count; i++, p++)
3392 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3394 size += sizeof ("+0x") - 1 + 16;
3399 s = *ret = bfd_malloc (size);
3401 goto free_contents_and_exit;
3403 names = (char *) (s + count + plt_count + (resolv_vma != 0));
3405 for (i = secsymend; i < opdsymend; ++i)
3409 if (syms[i]->value > opd->size - 8)
3412 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3413 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3417 asection *sec = abfd->sections;
3424 long mid = (lo + hi) >> 1;
3425 if (syms[mid]->section->vma < ent)
3427 else if (syms[mid]->section->vma > ent)
3431 sec = syms[mid]->section;
3436 if (lo >= hi && lo > codesecsym)
3437 sec = syms[lo - 1]->section;
3439 for (; sec != NULL; sec = sec->next)
3443 /* SEC_LOAD may not be set if SEC is from a separate debug
3445 if ((sec->flags & SEC_ALLOC) == 0)
3447 if ((sec->flags & SEC_CODE) != 0)
3450 s->flags |= BSF_SYNTHETIC;
3451 s->value = ent - s->section->vma;
3454 len = strlen (syms[i]->name);
3455 memcpy (names, syms[i]->name, len + 1);
3457 /* Have udata.p point back to the original symbol this
3458 synthetic symbol was derived from. */
3459 s->udata.p = syms[i];
3465 if (glink != NULL && relplt != NULL)
3469 /* Add a symbol for the main glink trampoline. */
3470 memset (s, 0, sizeof *s);
3472 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3474 s->value = resolv_vma - glink->vma;
3476 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3477 names += sizeof ("__glink_PLTresolve");
3482 /* FIXME: It would be very much nicer to put sym@plt on the
3483 stub rather than on the glink branch table entry. The
3484 objdump disassembler would then use a sensible symbol
3485 name on plt calls. The difficulty in doing so is
3486 a) finding the stubs, and,
3487 b) matching stubs against plt entries, and,
3488 c) there can be multiple stubs for a given plt entry.
3490 Solving (a) could be done by code scanning, but older
3491 ppc64 binaries used different stubs to current code.
3492 (b) is the tricky one since you need to known the toc
3493 pointer for at least one function that uses a pic stub to
3494 be able to calculate the plt address referenced.
3495 (c) means gdb would need to set multiple breakpoints (or
3496 find the glink branch itself) when setting breakpoints
3497 for pending shared library loads. */
3498 p = relplt->relocation;
3499 for (i = 0; i < plt_count; i++, p++)
3503 *s = **p->sym_ptr_ptr;
3504 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3505 we are defining a symbol, ensure one of them is set. */
3506 if ((s->flags & BSF_LOCAL) == 0)
3507 s->flags |= BSF_GLOBAL;
3508 s->flags |= BSF_SYNTHETIC;
3510 s->value = glink_vma - glink->vma;
3513 len = strlen ((*p->sym_ptr_ptr)->name);
3514 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3518 memcpy (names, "+0x", sizeof ("+0x") - 1);
3519 names += sizeof ("+0x") - 1;
3520 bfd_sprintf_vma (abfd, names, p->addend);
3521 names += strlen (names);
3523 memcpy (names, "@plt", sizeof ("@plt"));
3524 names += sizeof ("@plt");
3539 /* The following functions are specific to the ELF linker, while
3540 functions above are used generally. Those named ppc64_elf_* are
3541 called by the main ELF linker code. They appear in this file more
3542 or less in the order in which they are called. eg.
3543 ppc64_elf_check_relocs is called early in the link process,
3544 ppc64_elf_finish_dynamic_sections is one of the last functions
3547 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3548 functions have both a function code symbol and a function descriptor
3549 symbol. A call to foo in a relocatable object file looks like:
3556 The function definition in another object file might be:
3560 . .quad .TOC.@tocbase
3566 When the linker resolves the call during a static link, the branch
3567 unsurprisingly just goes to .foo and the .opd information is unused.
3568 If the function definition is in a shared library, things are a little
3569 different: The call goes via a plt call stub, the opd information gets
3570 copied to the plt, and the linker patches the nop.
3578 . std 2,40(1) # in practice, the call stub
3579 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3580 . addi 11,11,Lfoo@toc@l # this is the general idea
3588 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3590 The "reloc ()" notation is supposed to indicate that the linker emits
3591 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3594 What are the difficulties here? Well, firstly, the relocations
3595 examined by the linker in check_relocs are against the function code
3596 sym .foo, while the dynamic relocation in the plt is emitted against
3597 the function descriptor symbol, foo. Somewhere along the line, we need
3598 to carefully copy dynamic link information from one symbol to the other.
3599 Secondly, the generic part of the elf linker will make .foo a dynamic
3600 symbol as is normal for most other backends. We need foo dynamic
3601 instead, at least for an application final link. However, when
3602 creating a shared library containing foo, we need to have both symbols
3603 dynamic so that references to .foo are satisfied during the early
3604 stages of linking. Otherwise the linker might decide to pull in a
3605 definition from some other object, eg. a static library.
3607 Update: As of August 2004, we support a new convention. Function
3608 calls may use the function descriptor symbol, ie. "bl foo". This
3609 behaves exactly as "bl .foo". */
3611 /* Of those relocs that might be copied as dynamic relocs, this function
3612 selects those that must be copied when linking a shared library,
3613 even when the symbol is local. */
3616 must_be_dyn_reloc (struct bfd_link_info *info,
3617 enum elf_ppc64_reloc_type r_type)
3629 case R_PPC64_TPREL16:
3630 case R_PPC64_TPREL16_LO:
3631 case R_PPC64_TPREL16_HI:
3632 case R_PPC64_TPREL16_HA:
3633 case R_PPC64_TPREL16_DS:
3634 case R_PPC64_TPREL16_LO_DS:
3635 case R_PPC64_TPREL16_HIGH:
3636 case R_PPC64_TPREL16_HIGHA:
3637 case R_PPC64_TPREL16_HIGHER:
3638 case R_PPC64_TPREL16_HIGHERA:
3639 case R_PPC64_TPREL16_HIGHEST:
3640 case R_PPC64_TPREL16_HIGHESTA:
3641 case R_PPC64_TPREL64:
3642 return !info->executable;
3646 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3647 copying dynamic variables from a shared lib into an app's dynbss
3648 section, and instead use a dynamic relocation to point into the
3649 shared lib. With code that gcc generates, it's vital that this be
3650 enabled; In the PowerPC64 ABI, the address of a function is actually
3651 the address of a function descriptor, which resides in the .opd
3652 section. gcc uses the descriptor directly rather than going via the
3653 GOT as some other ABI's do, which means that initialized function
3654 pointers must reference the descriptor. Thus, a function pointer
3655 initialized to the address of a function in a shared library will
3656 either require a copy reloc, or a dynamic reloc. Using a copy reloc
3657 redefines the function descriptor symbol to point to the copy. This
3658 presents a problem as a plt entry for that function is also
3659 initialized from the function descriptor symbol and the copy reloc
3660 may not be initialized first. */
3661 #define ELIMINATE_COPY_RELOCS 1
3663 /* Section name for stubs is the associated section name plus this
3665 #define STUB_SUFFIX ".stub"
3668 ppc_stub_long_branch:
3669 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3670 destination, but a 24 bit branch in a stub section will reach.
3673 ppc_stub_plt_branch:
3674 Similar to the above, but a 24 bit branch in the stub section won't
3675 reach its destination.
3676 . addis %r11,%r2,xxx@toc@ha
3677 . ld %r12,xxx@toc@l(%r11)
3682 Used to call a function in a shared library. If it so happens that
3683 the plt entry referenced crosses a 64k boundary, then an extra
3684 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
3686 . addis %r11,%r2,xxx@toc@ha
3687 . ld %r12,xxx+0@toc@l(%r11)
3689 . ld %r2,xxx+8@toc@l(%r11)
3690 . ld %r11,xxx+16@toc@l(%r11)
3693 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3694 code to adjust the value and save r2 to support multiple toc sections.
3695 A ppc_stub_long_branch with an r2 offset looks like:
3697 . addis %r2,%r2,off@ha
3698 . addi %r2,%r2,off@l
3701 A ppc_stub_plt_branch with an r2 offset looks like:
3703 . addis %r11,%r2,xxx@toc@ha
3704 . ld %r12,xxx@toc@l(%r11)
3705 . addis %r2,%r2,off@ha
3706 . addi %r2,%r2,off@l
3710 In cases where the "addis" instruction would add zero, the "addis" is
3711 omitted and following instructions modified slightly in some cases.
3714 enum ppc_stub_type {
3716 ppc_stub_long_branch,
3717 ppc_stub_long_branch_r2off,
3718 ppc_stub_plt_branch,
3719 ppc_stub_plt_branch_r2off,
3721 ppc_stub_plt_call_r2save
3724 struct ppc_stub_hash_entry {
3726 /* Base hash table entry structure. */
3727 struct bfd_hash_entry root;
3729 enum ppc_stub_type stub_type;
3731 /* The stub section. */
3734 /* Offset within stub_sec of the beginning of this stub. */
3735 bfd_vma stub_offset;
3737 /* Given the symbol's value and its section we can determine its final
3738 value when building the stubs (so the stub knows where to jump. */
3739 bfd_vma target_value;
3740 asection *target_section;
3742 /* The symbol table entry, if any, that this was derived from. */
3743 struct ppc_link_hash_entry *h;
3744 struct plt_entry *plt_ent;
3746 /* Where this stub is being called from, or, in the case of combined
3747 stub sections, the first input section in the group. */
3751 struct ppc_branch_hash_entry {
3753 /* Base hash table entry structure. */
3754 struct bfd_hash_entry root;
3756 /* Offset within branch lookup table. */
3757 unsigned int offset;
3759 /* Generation marker. */
3763 /* Used to track dynamic relocations for local symbols. */
3764 struct ppc_dyn_relocs
3766 struct ppc_dyn_relocs *next;
3768 /* The input section of the reloc. */
3771 /* Total number of relocs copied for the input section. */
3772 unsigned int count : 31;
3774 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3775 unsigned int ifunc : 1;
3778 struct ppc_link_hash_entry
3780 struct elf_link_hash_entry elf;
3783 /* A pointer to the most recently used stub hash entry against this
3785 struct ppc_stub_hash_entry *stub_cache;
3787 /* A pointer to the next symbol starting with a '.' */
3788 struct ppc_link_hash_entry *next_dot_sym;
3791 /* Track dynamic relocs copied for this symbol. */
3792 struct elf_dyn_relocs *dyn_relocs;
3794 /* Link between function code and descriptor symbols. */
3795 struct ppc_link_hash_entry *oh;
3797 /* Flag function code and descriptor symbols. */
3798 unsigned int is_func:1;
3799 unsigned int is_func_descriptor:1;
3800 unsigned int fake:1;
3802 /* Whether global opd/toc sym has been adjusted or not.
3803 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3804 should be set for all globals defined in any opd/toc section. */
3805 unsigned int adjust_done:1;
3807 /* Set if we twiddled this symbol to weak at some stage. */
3808 unsigned int was_undefined:1;
3810 /* Contexts in which symbol is used in the GOT (or TOC).
3811 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3812 corresponding relocs are encountered during check_relocs.
3813 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3814 indicate the corresponding GOT entry type is not needed.
3815 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3816 a TPREL one. We use a separate flag rather than setting TPREL
3817 just for convenience in distinguishing the two cases. */
3818 #define TLS_GD 1 /* GD reloc. */
3819 #define TLS_LD 2 /* LD reloc. */
3820 #define TLS_TPREL 4 /* TPREL reloc, => IE. */
3821 #define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
3822 #define TLS_TLS 16 /* Any TLS reloc. */
3823 #define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
3824 #define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
3825 #define PLT_IFUNC 128 /* STT_GNU_IFUNC. */
3826 unsigned char tls_mask;
3829 /* ppc64 ELF linker hash table. */
3831 struct ppc_link_hash_table
3833 struct elf_link_hash_table elf;
3835 /* The stub hash table. */
3836 struct bfd_hash_table stub_hash_table;
3838 /* Another hash table for plt_branch stubs. */
3839 struct bfd_hash_table branch_hash_table;
3841 /* Hash table for function prologue tocsave. */
3842 htab_t tocsave_htab;
3844 /* Linker stub bfd. */
3847 /* Linker call-backs. */
3848 asection * (*add_stub_section) (const char *, asection *);
3849 void (*layout_sections_again) (void);
3851 /* Array to keep track of which stub sections have been created, and
3852 information on stub grouping. */
3854 /* This is the section to which stubs in the group will be attached. */
3856 /* The stub section. */
3858 /* Along with elf_gp, specifies the TOC pointer used in this group. */
3862 /* Temp used when calculating TOC pointers. */
3865 asection *toc_first_sec;
3867 /* Highest input section id. */
3870 /* Highest output section index. */
3873 /* Used when adding symbols. */
3874 struct ppc_link_hash_entry *dot_syms;
3876 /* List of input sections for each output section. */
3877 asection **input_list;
3879 /* Short-cuts to get to dynamic linker sections. */
3891 asection *glink_eh_frame;
3893 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3894 struct ppc_link_hash_entry *tls_get_addr;
3895 struct ppc_link_hash_entry *tls_get_addr_fd;
3897 /* The size of reliplt used by got entry relocs. */
3898 bfd_size_type got_reli_size;
3901 unsigned long stub_count[ppc_stub_plt_call_r2save];
3903 /* Number of stubs against global syms. */
3904 unsigned long stub_globals;
3906 /* Alignment of PLT call stubs. */
3907 unsigned int plt_stub_align:4;
3909 /* Set if we're linking code with function descriptors. */
3910 unsigned int opd_abi:1;
3912 /* Set if PLT call stubs should load r11. */
3913 unsigned int plt_static_chain:1;
3915 /* Set if PLT call stubs need a read-read barrier. */
3916 unsigned int plt_thread_safe:1;
3918 /* Set if we should emit symbols for stubs. */
3919 unsigned int emit_stub_syms:1;
3921 /* Set if __tls_get_addr optimization should not be done. */
3922 unsigned int no_tls_get_addr_opt:1;
3924 /* Support for multiple toc sections. */
3925 unsigned int do_multi_toc:1;
3926 unsigned int multi_toc_needed:1;
3927 unsigned int second_toc_pass:1;
3928 unsigned int do_toc_opt:1;
3931 unsigned int stub_error:1;
3933 /* Temp used by ppc64_elf_process_dot_syms. */
3934 unsigned int twiddled_syms:1;
3936 /* Incremented every time we size stubs. */
3937 unsigned int stub_iteration;
3939 /* Small local sym cache. */
3940 struct sym_cache sym_cache;
3943 /* Rename some of the generic section flags to better document how they
3946 /* Nonzero if this section has TLS related relocations. */
3947 #define has_tls_reloc sec_flg0
3949 /* Nonzero if this section has a call to __tls_get_addr. */
3950 #define has_tls_get_addr_call sec_flg1
3952 /* Nonzero if this section has any toc or got relocs. */
3953 #define has_toc_reloc sec_flg2
3955 /* Nonzero if this section has a call to another section that uses
3957 #define makes_toc_func_call sec_flg3
3959 /* Recursion protection when determining above flag. */
3960 #define call_check_in_progress sec_flg4
3961 #define call_check_done sec_flg5
3963 /* Get the ppc64 ELF linker hash table from a link_info structure. */
3965 #define ppc_hash_table(p) \
3966 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3967 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
3969 #define ppc_stub_hash_lookup(table, string, create, copy) \
3970 ((struct ppc_stub_hash_entry *) \
3971 bfd_hash_lookup ((table), (string), (create), (copy)))
3973 #define ppc_branch_hash_lookup(table, string, create, copy) \
3974 ((struct ppc_branch_hash_entry *) \
3975 bfd_hash_lookup ((table), (string), (create), (copy)))
3977 /* Create an entry in the stub hash table. */
3979 static struct bfd_hash_entry *
3980 stub_hash_newfunc (struct bfd_hash_entry *entry,
3981 struct bfd_hash_table *table,
3984 /* Allocate the structure if it has not already been allocated by a
3988 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3993 /* Call the allocation method of the superclass. */
3994 entry = bfd_hash_newfunc (entry, table, string);
3997 struct ppc_stub_hash_entry *eh;
3999 /* Initialize the local fields. */
4000 eh = (struct ppc_stub_hash_entry *) entry;
4001 eh->stub_type = ppc_stub_none;
4002 eh->stub_sec = NULL;
4003 eh->stub_offset = 0;
4004 eh->target_value = 0;
4005 eh->target_section = NULL;
4013 /* Create an entry in the branch hash table. */
4015 static struct bfd_hash_entry *
4016 branch_hash_newfunc (struct bfd_hash_entry *entry,
4017 struct bfd_hash_table *table,
4020 /* Allocate the structure if it has not already been allocated by a
4024 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4029 /* Call the allocation method of the superclass. */
4030 entry = bfd_hash_newfunc (entry, table, string);
4033 struct ppc_branch_hash_entry *eh;
4035 /* Initialize the local fields. */
4036 eh = (struct ppc_branch_hash_entry *) entry;
4044 /* Create an entry in a ppc64 ELF linker hash table. */
4046 static struct bfd_hash_entry *
4047 link_hash_newfunc (struct bfd_hash_entry *entry,
4048 struct bfd_hash_table *table,
4051 /* Allocate the structure if it has not already been allocated by a
4055 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4060 /* Call the allocation method of the superclass. */
4061 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4064 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4066 memset (&eh->u.stub_cache, 0,
4067 (sizeof (struct ppc_link_hash_entry)
4068 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4070 /* When making function calls, old ABI code references function entry
4071 points (dot symbols), while new ABI code references the function
4072 descriptor symbol. We need to make any combination of reference and
4073 definition work together, without breaking archive linking.
4075 For a defined function "foo" and an undefined call to "bar":
4076 An old object defines "foo" and ".foo", references ".bar" (possibly
4078 A new object defines "foo" and references "bar".
4080 A new object thus has no problem with its undefined symbols being
4081 satisfied by definitions in an old object. On the other hand, the
4082 old object won't have ".bar" satisfied by a new object.
4084 Keep a list of newly added dot-symbols. */
4086 if (string[0] == '.')
4088 struct ppc_link_hash_table *htab;
4090 htab = (struct ppc_link_hash_table *) table;
4091 eh->u.next_dot_sym = htab->dot_syms;
4092 htab->dot_syms = eh;
4099 struct tocsave_entry {
4105 tocsave_htab_hash (const void *p)
4107 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4108 return ((bfd_vma)(intptr_t) e->sec ^ e->offset) >> 3;
4112 tocsave_htab_eq (const void *p1, const void *p2)
4114 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4115 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4116 return e1->sec == e2->sec && e1->offset == e2->offset;
4119 /* Create a ppc64 ELF linker hash table. */
4121 static struct bfd_link_hash_table *
4122 ppc64_elf_link_hash_table_create (bfd *abfd)
4124 struct ppc_link_hash_table *htab;
4125 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4127 htab = bfd_zmalloc (amt);
4131 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4132 sizeof (struct ppc_link_hash_entry),
4139 /* Init the stub hash table too. */
4140 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4141 sizeof (struct ppc_stub_hash_entry)))
4144 /* And the branch hash table. */
4145 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4146 sizeof (struct ppc_branch_hash_entry)))
4149 htab->tocsave_htab = htab_try_create (1024,
4153 if (htab->tocsave_htab == NULL)
4156 /* Initializing two fields of the union is just cosmetic. We really
4157 only care about glist, but when compiled on a 32-bit host the
4158 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4159 debugger inspection of these fields look nicer. */
4160 htab->elf.init_got_refcount.refcount = 0;
4161 htab->elf.init_got_refcount.glist = NULL;
4162 htab->elf.init_plt_refcount.refcount = 0;
4163 htab->elf.init_plt_refcount.glist = NULL;
4164 htab->elf.init_got_offset.offset = 0;
4165 htab->elf.init_got_offset.glist = NULL;
4166 htab->elf.init_plt_offset.offset = 0;
4167 htab->elf.init_plt_offset.glist = NULL;
4169 return &htab->elf.root;
4172 /* Free the derived linker hash table. */
4175 ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
4177 struct ppc_link_hash_table *htab = (struct ppc_link_hash_table *) hash;
4179 bfd_hash_table_free (&htab->stub_hash_table);
4180 bfd_hash_table_free (&htab->branch_hash_table);
4181 if (htab->tocsave_htab)
4182 htab_delete (htab->tocsave_htab);
4183 _bfd_elf_link_hash_table_free (hash);
4186 /* Create sections for linker generated code. */
4189 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4191 struct ppc_link_hash_table *htab;
4194 htab = ppc_hash_table (info);
4196 /* Create .sfpr for code to save and restore fp regs. */
4197 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4198 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4199 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4201 if (htab->sfpr == NULL
4202 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4205 /* Create .glink for lazy dynamic linking support. */
4206 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4208 if (htab->glink == NULL
4209 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4212 if (!info->no_ld_generated_unwind_info)
4214 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4215 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4216 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4219 if (htab->glink_eh_frame == NULL
4220 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4224 flags = SEC_ALLOC | SEC_LINKER_CREATED;
4225 htab->iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4226 if (htab->iplt == NULL
4227 || ! bfd_set_section_alignment (dynobj, htab->iplt, 3))
4230 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4231 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4232 htab->reliplt = bfd_make_section_anyway_with_flags (dynobj,
4235 if (htab->reliplt == NULL
4236 || ! bfd_set_section_alignment (dynobj, htab->reliplt, 3))
4239 /* Create branch lookup table for plt_branch stubs. */
4240 flags = (SEC_ALLOC | SEC_LOAD
4241 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4242 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4244 if (htab->brlt == NULL
4245 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4251 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4252 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4253 htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4256 if (htab->relbrlt == NULL
4257 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4263 /* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4266 ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
4268 struct ppc_link_hash_table *htab;
4270 elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
4272 /* Always hook our dynamic sections into the first bfd, which is the
4273 linker created stub bfd. This ensures that the GOT header is at
4274 the start of the output TOC section. */
4275 htab = ppc_hash_table (info);
4278 htab->stub_bfd = abfd;
4279 htab->elf.dynobj = abfd;
4281 if (info->relocatable)
4284 return create_linkage_sections (htab->elf.dynobj, info);
4287 /* Build a name for an entry in the stub hash table. */
4290 ppc_stub_name (const asection *input_section,
4291 const asection *sym_sec,
4292 const struct ppc_link_hash_entry *h,
4293 const Elf_Internal_Rela *rel)
4298 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4299 offsets from a sym as a branch target? In fact, we could
4300 probably assume the addend is always zero. */
4301 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4305 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4306 stub_name = bfd_malloc (len);
4307 if (stub_name == NULL)
4310 len = sprintf (stub_name, "%08x.%s+%x",
4311 input_section->id & 0xffffffff,
4312 h->elf.root.root.string,
4313 (int) rel->r_addend & 0xffffffff);
4317 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4318 stub_name = bfd_malloc (len);
4319 if (stub_name == NULL)
4322 len = sprintf (stub_name, "%08x.%x:%x+%x",
4323 input_section->id & 0xffffffff,
4324 sym_sec->id & 0xffffffff,
4325 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4326 (int) rel->r_addend & 0xffffffff);
4328 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4329 stub_name[len - 2] = 0;
4333 /* Look up an entry in the stub hash. Stub entries are cached because
4334 creating the stub name takes a bit of time. */
4336 static struct ppc_stub_hash_entry *
4337 ppc_get_stub_entry (const asection *input_section,
4338 const asection *sym_sec,
4339 struct ppc_link_hash_entry *h,
4340 const Elf_Internal_Rela *rel,
4341 struct ppc_link_hash_table *htab)
4343 struct ppc_stub_hash_entry *stub_entry;
4344 const asection *id_sec;
4346 /* If this input section is part of a group of sections sharing one
4347 stub section, then use the id of the first section in the group.
4348 Stub names need to include a section id, as there may well be
4349 more than one stub used to reach say, printf, and we need to
4350 distinguish between them. */
4351 id_sec = htab->stub_group[input_section->id].link_sec;
4353 if (h != NULL && h->u.stub_cache != NULL
4354 && h->u.stub_cache->h == h
4355 && h->u.stub_cache->id_sec == id_sec)
4357 stub_entry = h->u.stub_cache;
4363 stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
4364 if (stub_name == NULL)
4367 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4368 stub_name, FALSE, FALSE);
4370 h->u.stub_cache = stub_entry;
4378 /* Add a new stub entry to the stub hash. Not all fields of the new
4379 stub entry are initialised. */
4381 static struct ppc_stub_hash_entry *
4382 ppc_add_stub (const char *stub_name,
4384 struct bfd_link_info *info)
4386 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4389 struct ppc_stub_hash_entry *stub_entry;
4391 link_sec = htab->stub_group[section->id].link_sec;
4392 stub_sec = htab->stub_group[section->id].stub_sec;
4393 if (stub_sec == NULL)
4395 stub_sec = htab->stub_group[link_sec->id].stub_sec;
4396 if (stub_sec == NULL)
4402 namelen = strlen (link_sec->name);
4403 len = namelen + sizeof (STUB_SUFFIX);
4404 s_name = bfd_alloc (htab->stub_bfd, len);
4408 memcpy (s_name, link_sec->name, namelen);
4409 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4410 stub_sec = (*htab->add_stub_section) (s_name, link_sec);
4411 if (stub_sec == NULL)
4413 htab->stub_group[link_sec->id].stub_sec = stub_sec;
4415 htab->stub_group[section->id].stub_sec = stub_sec;
4418 /* Enter this entry into the linker stub hash table. */
4419 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4421 if (stub_entry == NULL)
4423 info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
4424 section->owner, stub_name);
4428 stub_entry->stub_sec = stub_sec;
4429 stub_entry->stub_offset = 0;
4430 stub_entry->id_sec = link_sec;
4434 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4435 not already done. */
4438 create_got_section (bfd *abfd, struct bfd_link_info *info)
4440 asection *got, *relgot;
4442 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4444 if (!is_ppc64_elf (abfd))
4451 if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
4454 htab->got = bfd_get_linker_section (htab->elf.dynobj, ".got");
4459 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4460 | SEC_LINKER_CREATED);
4462 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4464 || !bfd_set_section_alignment (abfd, got, 3))
4467 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4468 flags | SEC_READONLY);
4470 || ! bfd_set_section_alignment (abfd, relgot, 3))
4473 ppc64_elf_tdata (abfd)->got = got;
4474 ppc64_elf_tdata (abfd)->relgot = relgot;
4478 /* Create the dynamic sections, and set up shortcuts. */
4481 ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4483 struct ppc_link_hash_table *htab;
4485 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
4488 htab = ppc_hash_table (info);
4493 htab->got = bfd_get_linker_section (dynobj, ".got");
4494 htab->plt = bfd_get_linker_section (dynobj, ".plt");
4495 htab->relplt = bfd_get_linker_section (dynobj, ".rela.plt");
4496 htab->dynbss = bfd_get_linker_section (dynobj, ".dynbss");
4498 htab->relbss = bfd_get_linker_section (dynobj, ".rela.bss");
4500 if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
4501 || (!info->shared && !htab->relbss))
4507 /* Follow indirect and warning symbol links. */
4509 static inline struct bfd_link_hash_entry *
4510 follow_link (struct bfd_link_hash_entry *h)
4512 while (h->type == bfd_link_hash_indirect
4513 || h->type == bfd_link_hash_warning)
4518 static inline struct elf_link_hash_entry *
4519 elf_follow_link (struct elf_link_hash_entry *h)
4521 return (struct elf_link_hash_entry *) follow_link (&h->root);
4524 static inline struct ppc_link_hash_entry *
4525 ppc_follow_link (struct ppc_link_hash_entry *h)
4527 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4530 /* Merge PLT info on FROM with that on TO. */
4533 move_plt_plist (struct ppc_link_hash_entry *from,
4534 struct ppc_link_hash_entry *to)
4536 if (from->elf.plt.plist != NULL)
4538 if (to->elf.plt.plist != NULL)
4540 struct plt_entry **entp;
4541 struct plt_entry *ent;
4543 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4545 struct plt_entry *dent;
4547 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4548 if (dent->addend == ent->addend)
4550 dent->plt.refcount += ent->plt.refcount;
4557 *entp = to->elf.plt.plist;
4560 to->elf.plt.plist = from->elf.plt.plist;
4561 from->elf.plt.plist = NULL;
4565 /* Copy the extra info we tack onto an elf_link_hash_entry. */
4568 ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4569 struct elf_link_hash_entry *dir,
4570 struct elf_link_hash_entry *ind)
4572 struct ppc_link_hash_entry *edir, *eind;
4574 edir = (struct ppc_link_hash_entry *) dir;
4575 eind = (struct ppc_link_hash_entry *) ind;
4577 edir->is_func |= eind->is_func;
4578 edir->is_func_descriptor |= eind->is_func_descriptor;
4579 edir->tls_mask |= eind->tls_mask;
4580 if (eind->oh != NULL)
4581 edir->oh = ppc_follow_link (eind->oh);
4583 /* If called to transfer flags for a weakdef during processing
4584 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4585 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
4586 if (!(ELIMINATE_COPY_RELOCS
4587 && eind->elf.root.type != bfd_link_hash_indirect
4588 && edir->elf.dynamic_adjusted))
4589 edir->elf.non_got_ref |= eind->elf.non_got_ref;
4591 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4592 edir->elf.ref_regular |= eind->elf.ref_regular;
4593 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4594 edir->elf.needs_plt |= eind->elf.needs_plt;
4596 /* Copy over any dynamic relocs we may have on the indirect sym. */
4597 if (eind->dyn_relocs != NULL)
4599 if (edir->dyn_relocs != NULL)
4601 struct elf_dyn_relocs **pp;
4602 struct elf_dyn_relocs *p;
4604 /* Add reloc counts against the indirect sym to the direct sym
4605 list. Merge any entries against the same section. */
4606 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4608 struct elf_dyn_relocs *q;
4610 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4611 if (q->sec == p->sec)
4613 q->pc_count += p->pc_count;
4614 q->count += p->count;
4621 *pp = edir->dyn_relocs;
4624 edir->dyn_relocs = eind->dyn_relocs;
4625 eind->dyn_relocs = NULL;
4628 /* If we were called to copy over info for a weak sym, that's all.
4629 You might think dyn_relocs need not be copied over; After all,
4630 both syms will be dynamic or both non-dynamic so we're just
4631 moving reloc accounting around. However, ELIMINATE_COPY_RELOCS
4632 code in ppc64_elf_adjust_dynamic_symbol needs to check for
4633 dyn_relocs in read-only sections, and it does so on what is the
4635 if (eind->elf.root.type != bfd_link_hash_indirect)
4638 /* Copy over got entries that we may have already seen to the
4639 symbol which just became indirect. */
4640 if (eind->elf.got.glist != NULL)
4642 if (edir->elf.got.glist != NULL)
4644 struct got_entry **entp;
4645 struct got_entry *ent;
4647 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4649 struct got_entry *dent;
4651 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4652 if (dent->addend == ent->addend
4653 && dent->owner == ent->owner
4654 && dent->tls_type == ent->tls_type)
4656 dent->got.refcount += ent->got.refcount;
4663 *entp = edir->elf.got.glist;
4666 edir->elf.got.glist = eind->elf.got.glist;
4667 eind->elf.got.glist = NULL;
4670 /* And plt entries. */
4671 move_plt_plist (eind, edir);
4673 if (eind->elf.dynindx != -1)
4675 if (edir->elf.dynindx != -1)
4676 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4677 edir->elf.dynstr_index);
4678 edir->elf.dynindx = eind->elf.dynindx;
4679 edir->elf.dynstr_index = eind->elf.dynstr_index;
4680 eind->elf.dynindx = -1;
4681 eind->elf.dynstr_index = 0;
4685 /* Find the function descriptor hash entry from the given function code
4686 hash entry FH. Link the entries via their OH fields. */
4688 static struct ppc_link_hash_entry *
4689 lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4691 struct ppc_link_hash_entry *fdh = fh->oh;
4695 const char *fd_name = fh->elf.root.root.string + 1;
4697 fdh = (struct ppc_link_hash_entry *)
4698 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4702 fdh->is_func_descriptor = 1;
4708 return ppc_follow_link (fdh);
4711 /* Make a fake function descriptor sym for the code sym FH. */
4713 static struct ppc_link_hash_entry *
4714 make_fdh (struct bfd_link_info *info,
4715 struct ppc_link_hash_entry *fh)
4719 struct bfd_link_hash_entry *bh;
4720 struct ppc_link_hash_entry *fdh;
4722 abfd = fh->elf.root.u.undef.abfd;
4723 newsym = bfd_make_empty_symbol (abfd);
4724 newsym->name = fh->elf.root.root.string + 1;
4725 newsym->section = bfd_und_section_ptr;
4727 newsym->flags = BSF_WEAK;
4730 if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
4731 newsym->flags, newsym->section,
4732 newsym->value, NULL, FALSE, FALSE,
4736 fdh = (struct ppc_link_hash_entry *) bh;
4737 fdh->elf.non_elf = 0;
4739 fdh->is_func_descriptor = 1;
4746 /* Fix function descriptor symbols defined in .opd sections to be
4750 ppc64_elf_add_symbol_hook (bfd *ibfd,
4751 struct bfd_link_info *info,
4752 Elf_Internal_Sym *isym,
4753 const char **name ATTRIBUTE_UNUSED,
4754 flagword *flags ATTRIBUTE_UNUSED,
4756 bfd_vma *value ATTRIBUTE_UNUSED)
4758 if ((ibfd->flags & DYNAMIC) == 0
4759 && ELF_ST_BIND (isym->st_info) == STB_GNU_UNIQUE)
4760 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4762 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4764 if ((ibfd->flags & DYNAMIC) == 0)
4765 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4767 else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC)
4769 else if (*sec != NULL
4770 && strcmp ((*sec)->name, ".opd") == 0)
4771 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4776 /* This function makes an old ABI object reference to ".bar" cause the
4777 inclusion of a new ABI object archive that defines "bar".
4778 NAME is a symbol defined in an archive. Return a symbol in the hash
4779 table that might be satisfied by the archive symbols. */
4781 static struct elf_link_hash_entry *
4782 ppc64_elf_archive_symbol_lookup (bfd *abfd,
4783 struct bfd_link_info *info,
4786 struct elf_link_hash_entry *h;
4790 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
4792 /* Don't return this sym if it is a fake function descriptor
4793 created by add_symbol_adjust. */
4794 && !(h->root.type == bfd_link_hash_undefweak
4795 && ((struct ppc_link_hash_entry *) h)->fake))
4801 len = strlen (name);
4802 dot_name = bfd_alloc (abfd, len + 2);
4803 if (dot_name == NULL)
4804 return (struct elf_link_hash_entry *) 0 - 1;
4806 memcpy (dot_name + 1, name, len + 1);
4807 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4808 bfd_release (abfd, dot_name);
4812 /* This function satisfies all old ABI object references to ".bar" if a
4813 new ABI object defines "bar". Well, at least, undefined dot symbols
4814 are made weak. This stops later archive searches from including an
4815 object if we already have a function descriptor definition. It also
4816 prevents the linker complaining about undefined symbols.
4817 We also check and correct mismatched symbol visibility here. The
4818 most restrictive visibility of the function descriptor and the
4819 function entry symbol is used. */
4822 add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
4824 struct ppc_link_hash_table *htab;
4825 struct ppc_link_hash_entry *fdh;
4827 if (eh->elf.root.type == bfd_link_hash_indirect)
4830 if (eh->elf.root.type == bfd_link_hash_warning)
4831 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
4833 if (eh->elf.root.root.string[0] != '.')
4836 htab = ppc_hash_table (info);
4840 fdh = lookup_fdh (eh, htab);
4843 if (!info->relocatable
4844 && (eh->elf.root.type == bfd_link_hash_undefined
4845 || eh->elf.root.type == bfd_link_hash_undefweak)
4846 && eh->elf.ref_regular)
4848 /* Make an undefweak function descriptor sym, which is enough to
4849 pull in an --as-needed shared lib, but won't cause link
4850 errors. Archives are handled elsewhere. */
4851 fdh = make_fdh (info, eh);
4854 fdh->elf.ref_regular = 1;
4859 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4860 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4861 if (entry_vis < descr_vis)
4862 fdh->elf.other += entry_vis - descr_vis;
4863 else if (entry_vis > descr_vis)
4864 eh->elf.other += descr_vis - entry_vis;
4866 if ((fdh->elf.root.type == bfd_link_hash_defined
4867 || fdh->elf.root.type == bfd_link_hash_defweak)
4868 && eh->elf.root.type == bfd_link_hash_undefined)
4870 eh->elf.root.type = bfd_link_hash_undefweak;
4871 eh->was_undefined = 1;
4872 htab->twiddled_syms = 1;
4879 /* Process list of dot-symbols we made in link_hash_newfunc. */
4882 ppc64_elf_process_dot_syms (bfd *ibfd, struct bfd_link_info *info)
4884 struct ppc_link_hash_table *htab;
4885 struct ppc_link_hash_entry **p, *eh;
4887 if (!is_ppc64_elf (info->output_bfd))
4889 htab = ppc_hash_table (info);
4893 if (is_ppc64_elf (ibfd))
4895 p = &htab->dot_syms;
4896 while ((eh = *p) != NULL)
4899 if (&eh->elf == htab->elf.hgot)
4901 else if (htab->elf.hgot == NULL
4902 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4903 htab->elf.hgot = &eh->elf;
4904 else if (!add_symbol_adjust (eh, info))
4906 p = &eh->u.next_dot_sym;
4910 /* Clear the list for non-ppc64 input files. */
4911 p = &htab->dot_syms;
4912 while ((eh = *p) != NULL)
4915 p = &eh->u.next_dot_sym;
4918 /* We need to fix the undefs list for any syms we have twiddled to
4920 if (htab->twiddled_syms)
4922 bfd_link_repair_undef_list (&htab->elf.root);
4923 htab->twiddled_syms = 0;
4928 /* Undo hash table changes when an --as-needed input file is determined
4929 not to be needed. */
4932 ppc64_elf_notice_as_needed (bfd *ibfd,
4933 struct bfd_link_info *info,
4934 enum notice_asneeded_action act)
4936 if (act == notice_not_needed)
4938 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4943 htab->dot_syms = NULL;
4945 return _bfd_elf_notice_as_needed (ibfd, info, act);
4948 /* If --just-symbols against a final linked binary, then assume we need
4949 toc adjusting stubs when calling functions defined there. */
4952 ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4954 if ((sec->flags & SEC_CODE) != 0
4955 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4956 && is_ppc64_elf (sec->owner))
4958 asection *got = bfd_get_section_by_name (sec->owner, ".got");
4960 && got->size >= elf_backend_got_header_size
4961 && bfd_get_section_by_name (sec->owner, ".opd") != NULL)
4962 sec->has_toc_reloc = 1;
4964 _bfd_elf_link_just_syms (sec, info);
4967 static struct plt_entry **
4968 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4969 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
4971 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
4972 struct plt_entry **local_plt;
4973 unsigned char *local_got_tls_masks;
4975 if (local_got_ents == NULL)
4977 bfd_size_type size = symtab_hdr->sh_info;
4979 size *= (sizeof (*local_got_ents)
4980 + sizeof (*local_plt)
4981 + sizeof (*local_got_tls_masks));
4982 local_got_ents = bfd_zalloc (abfd, size);
4983 if (local_got_ents == NULL)
4985 elf_local_got_ents (abfd) = local_got_ents;
4988 if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
4990 struct got_entry *ent;
4992 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
4993 if (ent->addend == r_addend
4994 && ent->owner == abfd
4995 && ent->tls_type == tls_type)
4999 bfd_size_type amt = sizeof (*ent);
5000 ent = bfd_alloc (abfd, amt);
5003 ent->next = local_got_ents[r_symndx];
5004 ent->addend = r_addend;
5006 ent->tls_type = tls_type;
5007 ent->is_indirect = FALSE;
5008 ent->got.refcount = 0;
5009 local_got_ents[r_symndx] = ent;
5011 ent->got.refcount += 1;
5014 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
5015 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
5016 local_got_tls_masks[r_symndx] |= tls_type;
5018 return local_plt + r_symndx;
5022 update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
5024 struct plt_entry *ent;
5026 for (ent = *plist; ent != NULL; ent = ent->next)
5027 if (ent->addend == addend)
5031 bfd_size_type amt = sizeof (*ent);
5032 ent = bfd_alloc (abfd, amt);
5036 ent->addend = addend;
5037 ent->plt.refcount = 0;
5040 ent->plt.refcount += 1;
5045 is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5047 return (r_type == R_PPC64_REL24
5048 || r_type == R_PPC64_REL14
5049 || r_type == R_PPC64_REL14_BRTAKEN
5050 || r_type == R_PPC64_REL14_BRNTAKEN
5051 || r_type == R_PPC64_ADDR24
5052 || r_type == R_PPC64_ADDR14
5053 || r_type == R_PPC64_ADDR14_BRTAKEN
5054 || r_type == R_PPC64_ADDR14_BRNTAKEN);
5057 /* Look through the relocs for a section during the first phase, and
5058 calculate needed space in the global offset table, procedure
5059 linkage table, and dynamic reloc sections. */
5062 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5063 asection *sec, const Elf_Internal_Rela *relocs)
5065 struct ppc_link_hash_table *htab;
5066 Elf_Internal_Shdr *symtab_hdr;
5067 struct elf_link_hash_entry **sym_hashes;
5068 const Elf_Internal_Rela *rel;
5069 const Elf_Internal_Rela *rel_end;
5071 asection **opd_sym_map;
5072 struct elf_link_hash_entry *tga, *dottga;
5074 if (info->relocatable)
5077 /* Don't do anything special with non-loaded, non-alloced sections.
5078 In particular, any relocs in such sections should not affect GOT
5079 and PLT reference counting (ie. we don't allow them to create GOT
5080 or PLT entries), there's no possibility or desire to optimize TLS
5081 relocs, and there's not much point in propagating relocs to shared
5082 libs that the dynamic linker won't relocate. */
5083 if ((sec->flags & SEC_ALLOC) == 0)
5086 BFD_ASSERT (is_ppc64_elf (abfd));
5088 htab = ppc_hash_table (info);
5092 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5093 FALSE, FALSE, TRUE);
5094 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5095 FALSE, FALSE, TRUE);
5096 symtab_hdr = &elf_symtab_hdr (abfd);
5097 sym_hashes = elf_sym_hashes (abfd);
5100 if (strcmp (sec->name, ".opd") == 0)
5102 /* Garbage collection needs some extra help with .opd sections.
5103 We don't want to necessarily keep everything referenced by
5104 relocs in .opd, as that would keep all functions. Instead,
5105 if we reference an .opd symbol (a function descriptor), we
5106 want to keep the function code symbol's section. This is
5107 easy for global symbols, but for local syms we need to keep
5108 information about the associated function section. */
5111 if (abiversion (abfd) == 0)
5112 set_abiversion (abfd, 1);
5113 else if (abiversion (abfd) == 2)
5115 info->callbacks->einfo (_("%P: .opd not allowed in ABI version %d\n"),
5117 bfd_set_error (bfd_error_bad_value);
5120 amt = sec->size * sizeof (*opd_sym_map) / 8;
5121 opd_sym_map = bfd_zalloc (abfd, amt);
5122 if (opd_sym_map == NULL)
5124 ppc64_elf_section_data (sec)->u.opd.func_sec = opd_sym_map;
5125 BFD_ASSERT (ppc64_elf_section_data (sec)->sec_type == sec_normal);
5126 ppc64_elf_section_data (sec)->sec_type = sec_opd;
5129 rel_end = relocs + sec->reloc_count;
5130 for (rel = relocs; rel < rel_end; rel++)
5132 unsigned long r_symndx;
5133 struct elf_link_hash_entry *h;
5134 enum elf_ppc64_reloc_type r_type;
5136 struct _ppc64_elf_section_data *ppc64_sec;
5137 struct plt_entry **ifunc;
5139 r_symndx = ELF64_R_SYM (rel->r_info);
5140 if (r_symndx < symtab_hdr->sh_info)
5144 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5145 h = elf_follow_link (h);
5147 /* PR15323, ref flags aren't set for references in the same
5149 h->root.non_ir_ref = 1;
5151 if (h == htab->elf.hgot)
5152 sec->has_toc_reloc = 1;
5159 if (h->type == STT_GNU_IFUNC)
5162 ifunc = &h->plt.plist;
5167 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5172 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5174 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5175 rel->r_addend, PLT_IFUNC);
5180 r_type = ELF64_R_TYPE (rel->r_info);
5181 if (is_branch_reloc (r_type))
5183 if (h != NULL && (h == tga || h == dottga))
5186 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5187 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5188 /* We have a new-style __tls_get_addr call with a marker
5192 /* Mark this section as having an old-style call. */
5193 sec->has_tls_get_addr_call = 1;
5196 /* STT_GNU_IFUNC symbols must have a PLT entry. */
5198 && !update_plt_info (abfd, ifunc, rel->r_addend))
5206 /* These special tls relocs tie a call to __tls_get_addr with
5207 its parameter symbol. */
5210 case R_PPC64_GOT_TLSLD16:
5211 case R_PPC64_GOT_TLSLD16_LO:
5212 case R_PPC64_GOT_TLSLD16_HI:
5213 case R_PPC64_GOT_TLSLD16_HA:
5214 tls_type = TLS_TLS | TLS_LD;
5217 case R_PPC64_GOT_TLSGD16:
5218 case R_PPC64_GOT_TLSGD16_LO:
5219 case R_PPC64_GOT_TLSGD16_HI:
5220 case R_PPC64_GOT_TLSGD16_HA:
5221 tls_type = TLS_TLS | TLS_GD;
5224 case R_PPC64_GOT_TPREL16_DS:
5225 case R_PPC64_GOT_TPREL16_LO_DS:
5226 case R_PPC64_GOT_TPREL16_HI:
5227 case R_PPC64_GOT_TPREL16_HA:
5228 if (!info->executable)
5229 info->flags |= DF_STATIC_TLS;
5230 tls_type = TLS_TLS | TLS_TPREL;
5233 case R_PPC64_GOT_DTPREL16_DS:
5234 case R_PPC64_GOT_DTPREL16_LO_DS:
5235 case R_PPC64_GOT_DTPREL16_HI:
5236 case R_PPC64_GOT_DTPREL16_HA:
5237 tls_type = TLS_TLS | TLS_DTPREL;
5239 sec->has_tls_reloc = 1;
5243 case R_PPC64_GOT16_DS:
5244 case R_PPC64_GOT16_HA:
5245 case R_PPC64_GOT16_HI:
5246 case R_PPC64_GOT16_LO:
5247 case R_PPC64_GOT16_LO_DS:
5248 /* This symbol requires a global offset table entry. */
5249 sec->has_toc_reloc = 1;
5250 if (r_type == R_PPC64_GOT_TLSLD16
5251 || r_type == R_PPC64_GOT_TLSGD16
5252 || r_type == R_PPC64_GOT_TPREL16_DS
5253 || r_type == R_PPC64_GOT_DTPREL16_DS
5254 || r_type == R_PPC64_GOT16
5255 || r_type == R_PPC64_GOT16_DS)
5257 htab->do_multi_toc = 1;
5258 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5261 if (ppc64_elf_tdata (abfd)->got == NULL
5262 && !create_got_section (abfd, info))
5267 struct ppc_link_hash_entry *eh;
5268 struct got_entry *ent;
5270 eh = (struct ppc_link_hash_entry *) h;
5271 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5272 if (ent->addend == rel->r_addend
5273 && ent->owner == abfd
5274 && ent->tls_type == tls_type)
5278 bfd_size_type amt = sizeof (*ent);
5279 ent = bfd_alloc (abfd, amt);
5282 ent->next = eh->elf.got.glist;
5283 ent->addend = rel->r_addend;
5285 ent->tls_type = tls_type;
5286 ent->is_indirect = FALSE;
5287 ent->got.refcount = 0;
5288 eh->elf.got.glist = ent;
5290 ent->got.refcount += 1;
5291 eh->tls_mask |= tls_type;
5294 /* This is a global offset table entry for a local symbol. */
5295 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5296 rel->r_addend, tls_type))
5300 case R_PPC64_PLT16_HA:
5301 case R_PPC64_PLT16_HI:
5302 case R_PPC64_PLT16_LO:
5305 /* This symbol requires a procedure linkage table entry. We
5306 actually build the entry in adjust_dynamic_symbol,
5307 because this might be a case of linking PIC code without
5308 linking in any dynamic objects, in which case we don't
5309 need to generate a procedure linkage table after all. */
5312 /* It does not make sense to have a procedure linkage
5313 table entry for a local symbol. */
5314 bfd_set_error (bfd_error_bad_value);
5319 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5322 if (h->root.root.string[0] == '.'
5323 && h->root.root.string[1] != '\0')
5324 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5328 /* The following relocations don't need to propagate the
5329 relocation if linking a shared object since they are
5330 section relative. */
5331 case R_PPC64_SECTOFF:
5332 case R_PPC64_SECTOFF_LO:
5333 case R_PPC64_SECTOFF_HI:
5334 case R_PPC64_SECTOFF_HA:
5335 case R_PPC64_SECTOFF_DS:
5336 case R_PPC64_SECTOFF_LO_DS:
5337 case R_PPC64_DTPREL16:
5338 case R_PPC64_DTPREL16_LO:
5339 case R_PPC64_DTPREL16_HI:
5340 case R_PPC64_DTPREL16_HA:
5341 case R_PPC64_DTPREL16_DS:
5342 case R_PPC64_DTPREL16_LO_DS:
5343 case R_PPC64_DTPREL16_HIGH:
5344 case R_PPC64_DTPREL16_HIGHA:
5345 case R_PPC64_DTPREL16_HIGHER:
5346 case R_PPC64_DTPREL16_HIGHERA:
5347 case R_PPC64_DTPREL16_HIGHEST:
5348 case R_PPC64_DTPREL16_HIGHESTA:
5353 case R_PPC64_REL16_LO:
5354 case R_PPC64_REL16_HI:
5355 case R_PPC64_REL16_HA:
5359 case R_PPC64_TOC16_DS:
5360 htab->do_multi_toc = 1;
5361 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5362 case R_PPC64_TOC16_LO:
5363 case R_PPC64_TOC16_HI:
5364 case R_PPC64_TOC16_HA:
5365 case R_PPC64_TOC16_LO_DS:
5366 sec->has_toc_reloc = 1;
5369 /* This relocation describes the C++ object vtable hierarchy.
5370 Reconstruct it for later use during GC. */
5371 case R_PPC64_GNU_VTINHERIT:
5372 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5376 /* This relocation describes which C++ vtable entries are actually
5377 used. Record for later use during GC. */
5378 case R_PPC64_GNU_VTENTRY:
5379 BFD_ASSERT (h != NULL);
5381 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5386 case R_PPC64_REL14_BRTAKEN:
5387 case R_PPC64_REL14_BRNTAKEN:
5389 asection *dest = NULL;
5391 /* Heuristic: If jumping outside our section, chances are
5392 we are going to need a stub. */
5395 /* If the sym is weak it may be overridden later, so
5396 don't assume we know where a weak sym lives. */
5397 if (h->root.type == bfd_link_hash_defined)
5398 dest = h->root.u.def.section;
5402 Elf_Internal_Sym *isym;
5404 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5409 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5413 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5418 if (h != NULL && ifunc == NULL)
5420 /* We may need a .plt entry if the function this reloc
5421 refers to is in a shared lib. */
5422 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5425 if (h->root.root.string[0] == '.'
5426 && h->root.root.string[1] != '\0')
5427 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5428 if (h == tga || h == dottga)
5429 sec->has_tls_reloc = 1;
5433 case R_PPC64_TPREL64:
5434 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5435 if (!info->executable)
5436 info->flags |= DF_STATIC_TLS;
5439 case R_PPC64_DTPMOD64:
5440 if (rel + 1 < rel_end
5441 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5442 && rel[1].r_offset == rel->r_offset + 8)
5443 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5445 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5448 case R_PPC64_DTPREL64:
5449 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5451 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5452 && rel[-1].r_offset == rel->r_offset - 8)
5453 /* This is the second reloc of a dtpmod, dtprel pair.
5454 Don't mark with TLS_DTPREL. */
5458 sec->has_tls_reloc = 1;
5461 struct ppc_link_hash_entry *eh;
5462 eh = (struct ppc_link_hash_entry *) h;
5463 eh->tls_mask |= tls_type;
5466 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5467 rel->r_addend, tls_type))
5470 ppc64_sec = ppc64_elf_section_data (sec);
5471 if (ppc64_sec->sec_type != sec_toc)
5475 /* One extra to simplify get_tls_mask. */
5476 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5477 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5478 if (ppc64_sec->u.toc.symndx == NULL)
5480 amt = sec->size * sizeof (bfd_vma) / 8;
5481 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5482 if (ppc64_sec->u.toc.add == NULL)
5484 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5485 ppc64_sec->sec_type = sec_toc;
5487 BFD_ASSERT (rel->r_offset % 8 == 0);
5488 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5489 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5491 /* Mark the second slot of a GD or LD entry.
5492 -1 to indicate GD and -2 to indicate LD. */
5493 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5494 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5495 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5496 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5499 case R_PPC64_TPREL16:
5500 case R_PPC64_TPREL16_LO:
5501 case R_PPC64_TPREL16_HI:
5502 case R_PPC64_TPREL16_HA:
5503 case R_PPC64_TPREL16_DS:
5504 case R_PPC64_TPREL16_LO_DS:
5505 case R_PPC64_TPREL16_HIGH:
5506 case R_PPC64_TPREL16_HIGHA:
5507 case R_PPC64_TPREL16_HIGHER:
5508 case R_PPC64_TPREL16_HIGHERA:
5509 case R_PPC64_TPREL16_HIGHEST:
5510 case R_PPC64_TPREL16_HIGHESTA:
5513 if (!info->executable)
5514 info->flags |= DF_STATIC_TLS;
5519 case R_PPC64_ADDR64:
5520 if (opd_sym_map != NULL
5521 && rel + 1 < rel_end
5522 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5526 if (h->root.root.string[0] == '.'
5527 && h->root.root.string[1] != 0
5528 && lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
5531 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5536 Elf_Internal_Sym *isym;
5538 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5543 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5544 if (s != NULL && s != sec)
5545 opd_sym_map[rel->r_offset / 8] = s;
5553 case R_PPC64_ADDR14:
5554 case R_PPC64_ADDR14_BRNTAKEN:
5555 case R_PPC64_ADDR14_BRTAKEN:
5556 case R_PPC64_ADDR16:
5557 case R_PPC64_ADDR16_DS:
5558 case R_PPC64_ADDR16_HA:
5559 case R_PPC64_ADDR16_HI:
5560 case R_PPC64_ADDR16_HIGH:
5561 case R_PPC64_ADDR16_HIGHA:
5562 case R_PPC64_ADDR16_HIGHER:
5563 case R_PPC64_ADDR16_HIGHERA:
5564 case R_PPC64_ADDR16_HIGHEST:
5565 case R_PPC64_ADDR16_HIGHESTA:
5566 case R_PPC64_ADDR16_LO:
5567 case R_PPC64_ADDR16_LO_DS:
5568 case R_PPC64_ADDR24:
5569 case R_PPC64_ADDR32:
5570 case R_PPC64_UADDR16:
5571 case R_PPC64_UADDR32:
5572 case R_PPC64_UADDR64:
5574 if (h != NULL && !info->shared)
5575 /* We may need a copy reloc. */
5578 /* Don't propagate .opd relocs. */
5579 if (NO_OPD_RELOCS && opd_sym_map != NULL)
5582 /* If we are creating a shared library, and this is a reloc
5583 against a global symbol, or a non PC relative reloc
5584 against a local symbol, then we need to copy the reloc
5585 into the shared library. However, if we are linking with
5586 -Bsymbolic, we do not need to copy a reloc against a
5587 global symbol which is defined in an object we are
5588 including in the link (i.e., DEF_REGULAR is set). At
5589 this point we have not seen all the input files, so it is
5590 possible that DEF_REGULAR is not set now but will be set
5591 later (it is never cleared). In case of a weak definition,
5592 DEF_REGULAR may be cleared later by a strong definition in
5593 a shared library. We account for that possibility below by
5594 storing information in the dyn_relocs field of the hash
5595 table entry. A similar situation occurs when creating
5596 shared libraries and symbol visibility changes render the
5599 If on the other hand, we are creating an executable, we
5600 may need to keep relocations for symbols satisfied by a
5601 dynamic library if we manage to avoid copy relocs for the
5605 && (must_be_dyn_reloc (info, r_type)
5607 && (!SYMBOLIC_BIND (info, h)
5608 || h->root.type == bfd_link_hash_defweak
5609 || !h->def_regular))))
5610 || (ELIMINATE_COPY_RELOCS
5613 && (h->root.type == bfd_link_hash_defweak
5614 || !h->def_regular))
5618 /* We must copy these reloc types into the output file.
5619 Create a reloc section in dynobj and make room for
5623 sreloc = _bfd_elf_make_dynamic_reloc_section
5624 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
5630 /* If this is a global symbol, we count the number of
5631 relocations we need for this symbol. */
5634 struct elf_dyn_relocs *p;
5635 struct elf_dyn_relocs **head;
5637 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
5639 if (p == NULL || p->sec != sec)
5641 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5651 if (!must_be_dyn_reloc (info, r_type))
5656 /* Track dynamic relocs needed for local syms too.
5657 We really need local syms available to do this
5659 struct ppc_dyn_relocs *p;
5660 struct ppc_dyn_relocs **head;
5661 bfd_boolean is_ifunc;
5664 Elf_Internal_Sym *isym;
5666 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5671 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5675 vpp = &elf_section_data (s)->local_dynrel;
5676 head = (struct ppc_dyn_relocs **) vpp;
5677 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5679 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5681 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5683 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5689 p->ifunc = is_ifunc;
5705 /* Merge backend specific data from an object file to the output
5706 object file when linking. */
5709 ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
5711 unsigned long iflags, oflags;
5713 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5716 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5719 if (!_bfd_generic_verify_endian_match (ibfd, obfd))
5722 iflags = elf_elfheader (ibfd)->e_flags;
5723 oflags = elf_elfheader (obfd)->e_flags;
5725 if (!elf_flags_init (obfd) || oflags == 0)
5727 elf_flags_init (obfd) = TRUE;
5728 elf_elfheader (obfd)->e_flags = iflags;
5730 else if (iflags == oflags || iflags == 0)
5732 else if (iflags & ~EF_PPC64_ABI)
5734 (*_bfd_error_handler)
5735 (_("%B uses unknown e_flags 0x%lx"), ibfd, iflags);
5736 bfd_set_error (bfd_error_bad_value);
5741 (*_bfd_error_handler)
5742 (_("%B: ABI version %ld is not compatible with ABI version %ld output"),
5743 ibfd, iflags, oflags);
5744 bfd_set_error (bfd_error_bad_value);
5748 /* Merge Tag_compatibility attributes and any common GNU ones. */
5749 _bfd_elf_merge_object_attributes (ibfd, obfd);
5755 ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5757 /* Print normal ELF private data. */
5758 _bfd_elf_print_private_bfd_data (abfd, ptr);
5760 if (elf_elfheader (abfd)->e_flags != 0)
5764 /* xgettext:c-format */
5765 fprintf (file, _("private flags = 0x%lx:"),
5766 elf_elfheader (abfd)->e_flags);
5768 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5769 fprintf (file, _(" [abiv%ld]"),
5770 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5777 /* OFFSET in OPD_SEC specifies a function descriptor. Return the address
5778 of the code entry point, and its section. */
5781 opd_entry_value (asection *opd_sec,
5783 asection **code_sec,
5785 bfd_boolean in_code_sec)
5787 bfd *opd_bfd = opd_sec->owner;
5788 Elf_Internal_Rela *relocs;
5789 Elf_Internal_Rela *lo, *hi, *look;
5792 /* No relocs implies we are linking a --just-symbols object, or looking
5793 at a final linked executable with addr2line or somesuch. */
5794 if (opd_sec->reloc_count == 0)
5796 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
5798 if (contents == NULL)
5800 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5801 return (bfd_vma) -1;
5802 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5805 val = bfd_get_64 (opd_bfd, contents + offset);
5806 if (code_sec != NULL)
5808 asection *sec, *likely = NULL;
5814 && val < sec->vma + sec->size)
5820 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5822 && (sec->flags & SEC_LOAD) != 0
5823 && (sec->flags & SEC_ALLOC) != 0)
5828 if (code_off != NULL)
5829 *code_off = val - likely->vma;
5835 BFD_ASSERT (is_ppc64_elf (opd_bfd));
5837 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
5839 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
5841 /* Go find the opd reloc at the sym address. */
5843 BFD_ASSERT (lo != NULL);
5844 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
5848 look = lo + (hi - lo) / 2;
5849 if (look->r_offset < offset)
5851 else if (look->r_offset > offset)
5855 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5857 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5858 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5860 unsigned long symndx = ELF64_R_SYM (look->r_info);
5863 if (symndx < symtab_hdr->sh_info
5864 || elf_sym_hashes (opd_bfd) == NULL)
5866 Elf_Internal_Sym *sym;
5868 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5871 size_t symcnt = symtab_hdr->sh_info;
5872 if (elf_sym_hashes (opd_bfd) == NULL)
5873 symcnt = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
5874 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, symcnt,
5875 0, NULL, NULL, NULL);
5878 symtab_hdr->contents = (bfd_byte *) sym;
5882 val = sym->st_value;
5883 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5884 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5888 struct elf_link_hash_entry **sym_hashes;
5889 struct elf_link_hash_entry *rh;
5891 sym_hashes = elf_sym_hashes (opd_bfd);
5892 rh = sym_hashes[symndx - symtab_hdr->sh_info];
5895 rh = elf_follow_link (rh);
5896 BFD_ASSERT (rh->root.type == bfd_link_hash_defined
5897 || rh->root.type == bfd_link_hash_defweak);
5898 val = rh->root.u.def.value;
5899 sec = rh->root.u.def.section;
5903 /* Handle the odd case where we can be called
5904 during bfd_elf_link_add_symbols before the
5905 symbol hashes have been fully populated. */
5906 Elf_Internal_Sym *sym;
5908 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, 1,
5909 symndx, NULL, NULL, NULL);
5913 val = sym->st_value;
5914 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5918 val += look->r_addend;
5919 if (code_off != NULL)
5921 if (code_sec != NULL)
5923 if (in_code_sec && *code_sec != sec)
5928 if (sec != NULL && sec->output_section != NULL)
5929 val += sec->output_section->vma + sec->output_offset;
5938 /* If the ELF symbol SYM might be a function in SEC, return the
5939 function size and set *CODE_OFF to the function's entry point,
5940 otherwise return zero. */
5942 static bfd_size_type
5943 ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
5948 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
5949 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
5953 if (!(sym->flags & BSF_SYNTHETIC))
5954 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
5956 if (strcmp (sym->section->name, ".opd") == 0)
5958 if (opd_entry_value (sym->section, sym->value,
5959 &sec, code_off, TRUE) == (bfd_vma) -1)
5961 /* An old ABI binary with dot-syms has a size of 24 on the .opd
5962 symbol. This size has nothing to do with the code size of the
5963 function, which is what we're supposed to return, but the
5964 code size isn't available without looking up the dot-sym.
5965 However, doing that would be a waste of time particularly
5966 since elf_find_function will look at the dot-sym anyway.
5967 Now, elf_find_function will keep the largest size of any
5968 function sym found at the code address of interest, so return
5969 1 here to avoid it incorrectly caching a larger function size
5970 for a small function. This does mean we return the wrong
5971 size for a new-ABI function of size 24, but all that does is
5972 disable caching for such functions. */
5978 if (sym->section != sec)
5980 *code_off = sym->value;
5987 /* Return true if symbol is defined in a regular object file. */
5990 is_static_defined (struct elf_link_hash_entry *h)
5992 return ((h->root.type == bfd_link_hash_defined
5993 || h->root.type == bfd_link_hash_defweak)
5994 && h->root.u.def.section != NULL
5995 && h->root.u.def.section->output_section != NULL);
5998 /* If FDH is a function descriptor symbol, return the associated code
5999 entry symbol if it is defined. Return NULL otherwise. */
6001 static struct ppc_link_hash_entry *
6002 defined_code_entry (struct ppc_link_hash_entry *fdh)
6004 if (fdh->is_func_descriptor)
6006 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6007 if (fh->elf.root.type == bfd_link_hash_defined
6008 || fh->elf.root.type == bfd_link_hash_defweak)
6014 /* If FH is a function code entry symbol, return the associated
6015 function descriptor symbol if it is defined. Return NULL otherwise. */
6017 static struct ppc_link_hash_entry *
6018 defined_func_desc (struct ppc_link_hash_entry *fh)
6021 && fh->oh->is_func_descriptor)
6023 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6024 if (fdh->elf.root.type == bfd_link_hash_defined
6025 || fdh->elf.root.type == bfd_link_hash_defweak)
6031 /* Mark all our entry sym sections, both opd and code section. */
6034 ppc64_elf_gc_keep (struct bfd_link_info *info)
6036 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6037 struct bfd_sym_chain *sym;
6042 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6044 struct ppc_link_hash_entry *eh, *fh;
6047 eh = (struct ppc_link_hash_entry *)
6048 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
6051 if (eh->elf.root.type != bfd_link_hash_defined
6052 && eh->elf.root.type != bfd_link_hash_defweak)
6055 fh = defined_code_entry (eh);
6058 sec = fh->elf.root.u.def.section;
6059 sec->flags |= SEC_KEEP;
6061 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6062 && opd_entry_value (eh->elf.root.u.def.section,
6063 eh->elf.root.u.def.value,
6064 &sec, NULL, FALSE) != (bfd_vma) -1)
6065 sec->flags |= SEC_KEEP;
6067 sec = eh->elf.root.u.def.section;
6068 sec->flags |= SEC_KEEP;
6072 /* Mark sections containing dynamically referenced symbols. When
6073 building shared libraries, we must assume that any visible symbol is
6077 ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6079 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6080 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
6081 struct ppc_link_hash_entry *fdh;
6083 /* Dynamic linking info is on the func descriptor sym. */
6084 fdh = defined_func_desc (eh);
6088 if ((eh->elf.root.type == bfd_link_hash_defined
6089 || eh->elf.root.type == bfd_link_hash_defweak)
6090 && (eh->elf.ref_dynamic
6091 || (!info->executable
6092 && eh->elf.def_regular
6093 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
6094 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
6095 && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
6096 || !bfd_hide_sym_by_version (info->version_info,
6097 eh->elf.root.root.string)))))
6100 struct ppc_link_hash_entry *fh;
6102 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6104 /* Function descriptor syms cause the associated
6105 function code sym section to be marked. */
6106 fh = defined_code_entry (eh);
6109 code_sec = fh->elf.root.u.def.section;
6110 code_sec->flags |= SEC_KEEP;
6112 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6113 && opd_entry_value (eh->elf.root.u.def.section,
6114 eh->elf.root.u.def.value,
6115 &code_sec, NULL, FALSE) != (bfd_vma) -1)
6116 code_sec->flags |= SEC_KEEP;
6122 /* Return the section that should be marked against GC for a given
6126 ppc64_elf_gc_mark_hook (asection *sec,
6127 struct bfd_link_info *info,
6128 Elf_Internal_Rela *rel,
6129 struct elf_link_hash_entry *h,
6130 Elf_Internal_Sym *sym)
6134 /* Syms return NULL if we're marking .opd, so we avoid marking all
6135 function sections, as all functions are referenced in .opd. */
6137 if (get_opd_info (sec) != NULL)
6142 enum elf_ppc64_reloc_type r_type;
6143 struct ppc_link_hash_entry *eh, *fh, *fdh;
6145 r_type = ELF64_R_TYPE (rel->r_info);
6148 case R_PPC64_GNU_VTINHERIT:
6149 case R_PPC64_GNU_VTENTRY:
6153 switch (h->root.type)
6155 case bfd_link_hash_defined:
6156 case bfd_link_hash_defweak:
6157 eh = (struct ppc_link_hash_entry *) h;
6158 fdh = defined_func_desc (eh);
6162 /* Function descriptor syms cause the associated
6163 function code sym section to be marked. */
6164 fh = defined_code_entry (eh);
6167 /* They also mark their opd section. */
6168 eh->elf.root.u.def.section->gc_mark = 1;
6170 rsec = fh->elf.root.u.def.section;
6172 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6173 && opd_entry_value (eh->elf.root.u.def.section,
6174 eh->elf.root.u.def.value,
6175 &rsec, NULL, FALSE) != (bfd_vma) -1)
6176 eh->elf.root.u.def.section->gc_mark = 1;
6178 rsec = h->root.u.def.section;
6181 case bfd_link_hash_common:
6182 rsec = h->root.u.c.p->section;
6186 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6192 struct _opd_sec_data *opd;
6194 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6195 opd = get_opd_info (rsec);
6196 if (opd != NULL && opd->func_sec != NULL)
6200 rsec = opd->func_sec[(sym->st_value + rel->r_addend) / 8];
6207 /* Update the .got, .plt. and dynamic reloc reference counts for the
6208 section being removed. */
6211 ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
6212 asection *sec, const Elf_Internal_Rela *relocs)
6214 struct ppc_link_hash_table *htab;
6215 Elf_Internal_Shdr *symtab_hdr;
6216 struct elf_link_hash_entry **sym_hashes;
6217 struct got_entry **local_got_ents;
6218 const Elf_Internal_Rela *rel, *relend;
6220 if (info->relocatable)
6223 if ((sec->flags & SEC_ALLOC) == 0)
6226 elf_section_data (sec)->local_dynrel = NULL;
6228 htab = ppc_hash_table (info);
6232 symtab_hdr = &elf_symtab_hdr (abfd);
6233 sym_hashes = elf_sym_hashes (abfd);
6234 local_got_ents = elf_local_got_ents (abfd);
6236 relend = relocs + sec->reloc_count;
6237 for (rel = relocs; rel < relend; rel++)
6239 unsigned long r_symndx;
6240 enum elf_ppc64_reloc_type r_type;
6241 struct elf_link_hash_entry *h = NULL;
6242 unsigned char tls_type = 0;
6244 r_symndx = ELF64_R_SYM (rel->r_info);
6245 r_type = ELF64_R_TYPE (rel->r_info);
6246 if (r_symndx >= symtab_hdr->sh_info)
6248 struct ppc_link_hash_entry *eh;
6249 struct elf_dyn_relocs **pp;
6250 struct elf_dyn_relocs *p;
6252 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6253 h = elf_follow_link (h);
6254 eh = (struct ppc_link_hash_entry *) h;
6256 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6259 /* Everything must go for SEC. */
6265 if (is_branch_reloc (r_type))
6267 struct plt_entry **ifunc = NULL;
6270 if (h->type == STT_GNU_IFUNC)
6271 ifunc = &h->plt.plist;
6273 else if (local_got_ents != NULL)
6275 struct plt_entry **local_plt = (struct plt_entry **)
6276 (local_got_ents + symtab_hdr->sh_info);
6277 unsigned char *local_got_tls_masks = (unsigned char *)
6278 (local_plt + symtab_hdr->sh_info);
6279 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
6280 ifunc = local_plt + r_symndx;
6284 struct plt_entry *ent;
6286 for (ent = *ifunc; ent != NULL; ent = ent->next)
6287 if (ent->addend == rel->r_addend)
6291 if (ent->plt.refcount > 0)
6292 ent->plt.refcount -= 1;
6299 case R_PPC64_GOT_TLSLD16:
6300 case R_PPC64_GOT_TLSLD16_LO:
6301 case R_PPC64_GOT_TLSLD16_HI:
6302 case R_PPC64_GOT_TLSLD16_HA:
6303 tls_type = TLS_TLS | TLS_LD;
6306 case R_PPC64_GOT_TLSGD16:
6307 case R_PPC64_GOT_TLSGD16_LO:
6308 case R_PPC64_GOT_TLSGD16_HI:
6309 case R_PPC64_GOT_TLSGD16_HA:
6310 tls_type = TLS_TLS | TLS_GD;
6313 case R_PPC64_GOT_TPREL16_DS:
6314 case R_PPC64_GOT_TPREL16_LO_DS:
6315 case R_PPC64_GOT_TPREL16_HI:
6316 case R_PPC64_GOT_TPREL16_HA:
6317 tls_type = TLS_TLS | TLS_TPREL;
6320 case R_PPC64_GOT_DTPREL16_DS:
6321 case R_PPC64_GOT_DTPREL16_LO_DS:
6322 case R_PPC64_GOT_DTPREL16_HI:
6323 case R_PPC64_GOT_DTPREL16_HA:
6324 tls_type = TLS_TLS | TLS_DTPREL;
6328 case R_PPC64_GOT16_DS:
6329 case R_PPC64_GOT16_HA:
6330 case R_PPC64_GOT16_HI:
6331 case R_PPC64_GOT16_LO:
6332 case R_PPC64_GOT16_LO_DS:
6335 struct got_entry *ent;
6340 ent = local_got_ents[r_symndx];
6342 for (; ent != NULL; ent = ent->next)
6343 if (ent->addend == rel->r_addend
6344 && ent->owner == abfd
6345 && ent->tls_type == tls_type)
6349 if (ent->got.refcount > 0)
6350 ent->got.refcount -= 1;
6354 case R_PPC64_PLT16_HA:
6355 case R_PPC64_PLT16_HI:
6356 case R_PPC64_PLT16_LO:
6360 case R_PPC64_REL14_BRNTAKEN:
6361 case R_PPC64_REL14_BRTAKEN:
6365 struct plt_entry *ent;
6367 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6368 if (ent->addend == rel->r_addend)
6370 if (ent != NULL && ent->plt.refcount > 0)
6371 ent->plt.refcount -= 1;
6382 /* The maximum size of .sfpr. */
6383 #define SFPR_MAX (218*4)
6385 struct sfpr_def_parms
6387 const char name[12];
6388 unsigned char lo, hi;
6389 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6390 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6393 /* Auto-generate _save*, _rest* functions in .sfpr. */
6396 sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
6398 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6400 size_t len = strlen (parm->name);
6401 bfd_boolean writing = FALSE;
6407 memcpy (sym, parm->name, len);
6410 for (i = parm->lo; i <= parm->hi; i++)
6412 struct elf_link_hash_entry *h;
6414 sym[len + 0] = i / 10 + '0';
6415 sym[len + 1] = i % 10 + '0';
6416 h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
6420 h->root.type = bfd_link_hash_defined;
6421 h->root.u.def.section = htab->sfpr;
6422 h->root.u.def.value = htab->sfpr->size;
6425 _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
6427 if (htab->sfpr->contents == NULL)
6429 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6430 if (htab->sfpr->contents == NULL)
6436 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6438 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6440 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6441 htab->sfpr->size = p - htab->sfpr->contents;
6449 savegpr0 (bfd *abfd, bfd_byte *p, int r)
6451 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6456 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6458 p = savegpr0 (abfd, p, r);
6459 bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
6461 bfd_put_32 (abfd, BLR, p);
6466 restgpr0 (bfd *abfd, bfd_byte *p, int r)
6468 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6473 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6475 bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
6477 p = restgpr0 (abfd, p, r);
6478 bfd_put_32 (abfd, MTLR_R0, p);
6482 p = restgpr0 (abfd, p, 30);
6483 p = restgpr0 (abfd, p, 31);
6485 bfd_put_32 (abfd, BLR, p);
6490 savegpr1 (bfd *abfd, bfd_byte *p, int r)
6492 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6497 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6499 p = savegpr1 (abfd, p, r);
6500 bfd_put_32 (abfd, BLR, p);
6505 restgpr1 (bfd *abfd, bfd_byte *p, int r)
6507 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6512 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6514 p = restgpr1 (abfd, p, r);
6515 bfd_put_32 (abfd, BLR, p);
6520 savefpr (bfd *abfd, bfd_byte *p, int r)
6522 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6527 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6529 p = savefpr (abfd, p, r);
6530 bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
6532 bfd_put_32 (abfd, BLR, p);
6537 restfpr (bfd *abfd, bfd_byte *p, int r)
6539 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6544 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6546 bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
6548 p = restfpr (abfd, p, r);
6549 bfd_put_32 (abfd, MTLR_R0, p);
6553 p = restfpr (abfd, p, 30);
6554 p = restfpr (abfd, p, 31);
6556 bfd_put_32 (abfd, BLR, p);
6561 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6563 p = savefpr (abfd, p, r);
6564 bfd_put_32 (abfd, BLR, p);
6569 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6571 p = restfpr (abfd, p, r);
6572 bfd_put_32 (abfd, BLR, p);
6577 savevr (bfd *abfd, bfd_byte *p, int r)
6579 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6581 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6586 savevr_tail (bfd *abfd, bfd_byte *p, int r)
6588 p = savevr (abfd, p, r);
6589 bfd_put_32 (abfd, BLR, p);
6594 restvr (bfd *abfd, bfd_byte *p, int r)
6596 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6598 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6603 restvr_tail (bfd *abfd, bfd_byte *p, int r)
6605 p = restvr (abfd, p, r);
6606 bfd_put_32 (abfd, BLR, p);
6610 /* Called via elf_link_hash_traverse to transfer dynamic linking
6611 information on function code symbol entries to their corresponding
6612 function descriptor symbol entries. */
6615 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6617 struct bfd_link_info *info;
6618 struct ppc_link_hash_table *htab;
6619 struct plt_entry *ent;
6620 struct ppc_link_hash_entry *fh;
6621 struct ppc_link_hash_entry *fdh;
6622 bfd_boolean force_local;
6624 fh = (struct ppc_link_hash_entry *) h;
6625 if (fh->elf.root.type == bfd_link_hash_indirect)
6629 htab = ppc_hash_table (info);
6633 /* Resolve undefined references to dot-symbols as the value
6634 in the function descriptor, if we have one in a regular object.
6635 This is to satisfy cases like ".quad .foo". Calls to functions
6636 in dynamic objects are handled elsewhere. */
6637 if (fh->elf.root.type == bfd_link_hash_undefweak
6638 && fh->was_undefined
6639 && (fdh = defined_func_desc (fh)) != NULL
6640 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6641 && opd_entry_value (fdh->elf.root.u.def.section,
6642 fdh->elf.root.u.def.value,
6643 &fh->elf.root.u.def.section,
6644 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
6646 fh->elf.root.type = fdh->elf.root.type;
6647 fh->elf.forced_local = 1;
6648 fh->elf.def_regular = fdh->elf.def_regular;
6649 fh->elf.def_dynamic = fdh->elf.def_dynamic;
6652 /* If this is a function code symbol, transfer dynamic linking
6653 information to the function descriptor symbol. */
6657 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6658 if (ent->plt.refcount > 0)
6661 || fh->elf.root.root.string[0] != '.'
6662 || fh->elf.root.root.string[1] == '\0')
6665 /* Find the corresponding function descriptor symbol. Create it
6666 as undefined if necessary. */
6668 fdh = lookup_fdh (fh, htab);
6670 && !info->executable
6671 && (fh->elf.root.type == bfd_link_hash_undefined
6672 || fh->elf.root.type == bfd_link_hash_undefweak))
6674 fdh = make_fdh (info, fh);
6679 /* Fake function descriptors are made undefweak. If the function
6680 code symbol is strong undefined, make the fake sym the same.
6681 If the function code symbol is defined, then force the fake
6682 descriptor local; We can't support overriding of symbols in a
6683 shared library on a fake descriptor. */
6687 && fdh->elf.root.type == bfd_link_hash_undefweak)
6689 if (fh->elf.root.type == bfd_link_hash_undefined)
6691 fdh->elf.root.type = bfd_link_hash_undefined;
6692 bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
6694 else if (fh->elf.root.type == bfd_link_hash_defined
6695 || fh->elf.root.type == bfd_link_hash_defweak)
6697 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
6702 && !fdh->elf.forced_local
6703 && (!info->executable
6704 || fdh->elf.def_dynamic
6705 || fdh->elf.ref_dynamic
6706 || (fdh->elf.root.type == bfd_link_hash_undefweak
6707 && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
6709 if (fdh->elf.dynindx == -1)
6710 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6712 fdh->elf.ref_regular |= fh->elf.ref_regular;
6713 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6714 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6715 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
6716 if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
6718 move_plt_plist (fh, fdh);
6719 fdh->elf.needs_plt = 1;
6721 fdh->is_func_descriptor = 1;
6726 /* Now that the info is on the function descriptor, clear the
6727 function code sym info. Any function code syms for which we
6728 don't have a definition in a regular file, we force local.
6729 This prevents a shared library from exporting syms that have
6730 been imported from another library. Function code syms that
6731 are really in the library we must leave global to prevent the
6732 linker dragging in a definition from a static library. */
6733 force_local = (!fh->elf.def_regular
6735 || !fdh->elf.def_regular
6736 || fdh->elf.forced_local);
6737 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6742 /* Called near the start of bfd_elf_size_dynamic_sections. We use
6743 this hook to a) provide some gcc support functions, and b) transfer
6744 dynamic linking information gathered so far on function code symbol
6745 entries, to their corresponding function descriptor symbol entries. */
6748 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6749 struct bfd_link_info *info)
6751 struct ppc_link_hash_table *htab;
6753 static const struct sfpr_def_parms funcs[] =
6755 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6756 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6757 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6758 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6759 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6760 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6761 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6762 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6763 { "._savef", 14, 31, savefpr, savefpr1_tail },
6764 { "._restf", 14, 31, restfpr, restfpr1_tail },
6765 { "_savevr_", 20, 31, savevr, savevr_tail },
6766 { "_restvr_", 20, 31, restvr, restvr_tail }
6769 htab = ppc_hash_table (info);
6773 if (!info->relocatable
6774 && htab->elf.hgot != NULL)
6775 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
6777 if (htab->sfpr == NULL)
6778 /* We don't have any relocs. */
6781 /* Provide any missing _save* and _rest* functions. */
6782 htab->sfpr->size = 0;
6783 if (!info->relocatable)
6784 for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
6785 if (!sfpr_define (info, &funcs[i]))
6788 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6790 if (htab->sfpr->size == 0)
6791 htab->sfpr->flags |= SEC_EXCLUDE;
6796 /* Adjust a symbol defined by a dynamic object and referenced by a
6797 regular object. The current definition is in some section of the
6798 dynamic object, but we're not including those sections. We have to
6799 change the definition to something the rest of the link can
6803 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6804 struct elf_link_hash_entry *h)
6806 struct ppc_link_hash_table *htab;
6809 htab = ppc_hash_table (info);
6813 /* Deal with function syms. */
6814 if (h->type == STT_FUNC
6815 || h->type == STT_GNU_IFUNC
6818 /* Clear procedure linkage table information for any symbol that
6819 won't need a .plt entry. */
6820 struct plt_entry *ent;
6821 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6822 if (ent->plt.refcount > 0)
6825 || (h->type != STT_GNU_IFUNC
6826 && (SYMBOL_CALLS_LOCAL (info, h)
6827 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6828 && h->root.type == bfd_link_hash_undefweak))))
6830 h->plt.plist = NULL;
6835 h->plt.plist = NULL;
6837 /* If this is a weak symbol, and there is a real definition, the
6838 processor independent code will have arranged for us to see the
6839 real definition first, and we can just use the same value. */
6840 if (h->u.weakdef != NULL)
6842 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
6843 || h->u.weakdef->root.type == bfd_link_hash_defweak);
6844 h->root.u.def.section = h->u.weakdef->root.u.def.section;
6845 h->root.u.def.value = h->u.weakdef->root.u.def.value;
6846 if (ELIMINATE_COPY_RELOCS)
6847 h->non_got_ref = h->u.weakdef->non_got_ref;
6851 /* If we are creating a shared library, we must presume that the
6852 only references to the symbol are via the global offset table.
6853 For such cases we need not do anything here; the relocations will
6854 be handled correctly by relocate_section. */
6858 /* If there are no references to this symbol that do not use the
6859 GOT, we don't need to generate a copy reloc. */
6860 if (!h->non_got_ref)
6863 /* Don't generate a copy reloc for symbols defined in the executable. */
6864 if (!h->def_dynamic || !h->ref_regular || h->def_regular)
6867 if (ELIMINATE_COPY_RELOCS)
6869 struct ppc_link_hash_entry * eh;
6870 struct elf_dyn_relocs *p;
6872 eh = (struct ppc_link_hash_entry *) h;
6873 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6875 s = p->sec->output_section;
6876 if (s != NULL && (s->flags & SEC_READONLY) != 0)
6880 /* If we didn't find any dynamic relocs in read-only sections, then
6881 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
6889 if (h->plt.plist != NULL)
6891 /* We should never get here, but unfortunately there are versions
6892 of gcc out there that improperly (for this ABI) put initialized
6893 function pointers, vtable refs and suchlike in read-only
6894 sections. Allow them to proceed, but warn that this might
6895 break at runtime. */
6896 info->callbacks->einfo
6897 (_("%P: copy reloc against `%T' requires lazy plt linking; "
6898 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
6899 h->root.root.string);
6902 /* This is a reference to a symbol defined by a dynamic object which
6903 is not a function. */
6905 /* We must allocate the symbol in our .dynbss section, which will
6906 become part of the .bss section of the executable. There will be
6907 an entry for this symbol in the .dynsym section. The dynamic
6908 object will contain position independent code, so all references
6909 from the dynamic object to this symbol will go through the global
6910 offset table. The dynamic linker will use the .dynsym entry to
6911 determine the address it must put in the global offset table, so
6912 both the dynamic object and the regular object will refer to the
6913 same memory location for the variable. */
6915 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
6916 to copy the initial value out of the dynamic object and into the
6917 runtime process image. We need to remember the offset into the
6918 .rela.bss section we are going to use. */
6919 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
6921 htab->relbss->size += sizeof (Elf64_External_Rela);
6927 return _bfd_elf_adjust_dynamic_copy (h, s);
6930 /* If given a function descriptor symbol, hide both the function code
6931 sym and the descriptor. */
6933 ppc64_elf_hide_symbol (struct bfd_link_info *info,
6934 struct elf_link_hash_entry *h,
6935 bfd_boolean force_local)
6937 struct ppc_link_hash_entry *eh;
6938 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6940 eh = (struct ppc_link_hash_entry *) h;
6941 if (eh->is_func_descriptor)
6943 struct ppc_link_hash_entry *fh = eh->oh;
6948 struct ppc_link_hash_table *htab;
6951 /* We aren't supposed to use alloca in BFD because on
6952 systems which do not have alloca the version in libiberty
6953 calls xmalloc, which might cause the program to crash
6954 when it runs out of memory. This function doesn't have a
6955 return status, so there's no way to gracefully return an
6956 error. So cheat. We know that string[-1] can be safely
6957 accessed; It's either a string in an ELF string table,
6958 or allocated in an objalloc structure. */
6960 p = eh->elf.root.root.string - 1;
6963 htab = ppc_hash_table (info);
6967 fh = (struct ppc_link_hash_entry *)
6968 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
6971 /* Unfortunately, if it so happens that the string we were
6972 looking for was allocated immediately before this string,
6973 then we overwrote the string terminator. That's the only
6974 reason the lookup should fail. */
6977 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6978 while (q >= eh->elf.root.root.string && *q == *p)
6980 if (q < eh->elf.root.root.string && *p == '.')
6981 fh = (struct ppc_link_hash_entry *)
6982 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
6991 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6996 get_sym_h (struct elf_link_hash_entry **hp,
6997 Elf_Internal_Sym **symp,
6999 unsigned char **tls_maskp,
7000 Elf_Internal_Sym **locsymsp,
7001 unsigned long r_symndx,
7004 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7006 if (r_symndx >= symtab_hdr->sh_info)
7008 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7009 struct elf_link_hash_entry *h;
7011 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7012 h = elf_follow_link (h);
7020 if (symsecp != NULL)
7022 asection *symsec = NULL;
7023 if (h->root.type == bfd_link_hash_defined
7024 || h->root.type == bfd_link_hash_defweak)
7025 symsec = h->root.u.def.section;
7029 if (tls_maskp != NULL)
7031 struct ppc_link_hash_entry *eh;
7033 eh = (struct ppc_link_hash_entry *) h;
7034 *tls_maskp = &eh->tls_mask;
7039 Elf_Internal_Sym *sym;
7040 Elf_Internal_Sym *locsyms = *locsymsp;
7042 if (locsyms == NULL)
7044 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7045 if (locsyms == NULL)
7046 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7047 symtab_hdr->sh_info,
7048 0, NULL, NULL, NULL);
7049 if (locsyms == NULL)
7051 *locsymsp = locsyms;
7053 sym = locsyms + r_symndx;
7061 if (symsecp != NULL)
7062 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
7064 if (tls_maskp != NULL)
7066 struct got_entry **lgot_ents;
7067 unsigned char *tls_mask;
7070 lgot_ents = elf_local_got_ents (ibfd);
7071 if (lgot_ents != NULL)
7073 struct plt_entry **local_plt = (struct plt_entry **)
7074 (lgot_ents + symtab_hdr->sh_info);
7075 unsigned char *lgot_masks = (unsigned char *)
7076 (local_plt + symtab_hdr->sh_info);
7077 tls_mask = &lgot_masks[r_symndx];
7079 *tls_maskp = tls_mask;
7085 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
7086 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
7087 type suitable for optimization, and 1 otherwise. */
7090 get_tls_mask (unsigned char **tls_maskp,
7091 unsigned long *toc_symndx,
7092 bfd_vma *toc_addend,
7093 Elf_Internal_Sym **locsymsp,
7094 const Elf_Internal_Rela *rel,
7097 unsigned long r_symndx;
7099 struct elf_link_hash_entry *h;
7100 Elf_Internal_Sym *sym;
7104 r_symndx = ELF64_R_SYM (rel->r_info);
7105 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7108 if ((*tls_maskp != NULL && **tls_maskp != 0)
7110 || ppc64_elf_section_data (sec) == NULL
7111 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
7114 /* Look inside a TOC section too. */
7117 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7118 off = h->root.u.def.value;
7121 off = sym->st_value;
7122 off += rel->r_addend;
7123 BFD_ASSERT (off % 8 == 0);
7124 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7125 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
7126 if (toc_symndx != NULL)
7127 *toc_symndx = r_symndx;
7128 if (toc_addend != NULL)
7129 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7130 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7132 if ((h == NULL || is_static_defined (h))
7133 && (next_r == -1 || next_r == -2))
7138 /* Find (or create) an entry in the tocsave hash table. */
7140 static struct tocsave_entry *
7141 tocsave_find (struct ppc_link_hash_table *htab,
7142 enum insert_option insert,
7143 Elf_Internal_Sym **local_syms,
7144 const Elf_Internal_Rela *irela,
7147 unsigned long r_indx;
7148 struct elf_link_hash_entry *h;
7149 Elf_Internal_Sym *sym;
7150 struct tocsave_entry ent, *p;
7152 struct tocsave_entry **slot;
7154 r_indx = ELF64_R_SYM (irela->r_info);
7155 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7157 if (ent.sec == NULL || ent.sec->output_section == NULL)
7159 (*_bfd_error_handler)
7160 (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
7165 ent.offset = h->root.u.def.value;
7167 ent.offset = sym->st_value;
7168 ent.offset += irela->r_addend;
7170 hash = tocsave_htab_hash (&ent);
7171 slot = ((struct tocsave_entry **)
7172 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7178 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7187 /* Adjust all global syms defined in opd sections. In gcc generated
7188 code for the old ABI, these will already have been done. */
7191 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7193 struct ppc_link_hash_entry *eh;
7195 struct _opd_sec_data *opd;
7197 if (h->root.type == bfd_link_hash_indirect)
7200 if (h->root.type != bfd_link_hash_defined
7201 && h->root.type != bfd_link_hash_defweak)
7204 eh = (struct ppc_link_hash_entry *) h;
7205 if (eh->adjust_done)
7208 sym_sec = eh->elf.root.u.def.section;
7209 opd = get_opd_info (sym_sec);
7210 if (opd != NULL && opd->adjust != NULL)
7212 long adjust = opd->adjust[eh->elf.root.u.def.value / 8];
7215 /* This entry has been deleted. */
7216 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
7219 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
7220 if (discarded_section (dsec))
7222 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
7226 eh->elf.root.u.def.value = 0;
7227 eh->elf.root.u.def.section = dsec;
7230 eh->elf.root.u.def.value += adjust;
7231 eh->adjust_done = 1;
7236 /* Handles decrementing dynamic reloc counts for the reloc specified by
7237 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
7238 have already been determined. */
7241 dec_dynrel_count (bfd_vma r_info,
7243 struct bfd_link_info *info,
7244 Elf_Internal_Sym **local_syms,
7245 struct elf_link_hash_entry *h,
7246 Elf_Internal_Sym *sym)
7248 enum elf_ppc64_reloc_type r_type;
7249 asection *sym_sec = NULL;
7251 /* Can this reloc be dynamic? This switch, and later tests here
7252 should be kept in sync with the code in check_relocs. */
7253 r_type = ELF64_R_TYPE (r_info);
7259 case R_PPC64_TPREL16:
7260 case R_PPC64_TPREL16_LO:
7261 case R_PPC64_TPREL16_HI:
7262 case R_PPC64_TPREL16_HA:
7263 case R_PPC64_TPREL16_DS:
7264 case R_PPC64_TPREL16_LO_DS:
7265 case R_PPC64_TPREL16_HIGH:
7266 case R_PPC64_TPREL16_HIGHA:
7267 case R_PPC64_TPREL16_HIGHER:
7268 case R_PPC64_TPREL16_HIGHERA:
7269 case R_PPC64_TPREL16_HIGHEST:
7270 case R_PPC64_TPREL16_HIGHESTA:
7274 case R_PPC64_TPREL64:
7275 case R_PPC64_DTPMOD64:
7276 case R_PPC64_DTPREL64:
7277 case R_PPC64_ADDR64:
7281 case R_PPC64_ADDR14:
7282 case R_PPC64_ADDR14_BRNTAKEN:
7283 case R_PPC64_ADDR14_BRTAKEN:
7284 case R_PPC64_ADDR16:
7285 case R_PPC64_ADDR16_DS:
7286 case R_PPC64_ADDR16_HA:
7287 case R_PPC64_ADDR16_HI:
7288 case R_PPC64_ADDR16_HIGH:
7289 case R_PPC64_ADDR16_HIGHA:
7290 case R_PPC64_ADDR16_HIGHER:
7291 case R_PPC64_ADDR16_HIGHERA:
7292 case R_PPC64_ADDR16_HIGHEST:
7293 case R_PPC64_ADDR16_HIGHESTA:
7294 case R_PPC64_ADDR16_LO:
7295 case R_PPC64_ADDR16_LO_DS:
7296 case R_PPC64_ADDR24:
7297 case R_PPC64_ADDR32:
7298 case R_PPC64_UADDR16:
7299 case R_PPC64_UADDR32:
7300 case R_PPC64_UADDR64:
7305 if (local_syms != NULL)
7307 unsigned long r_symndx;
7308 bfd *ibfd = sec->owner;
7310 r_symndx = ELF64_R_SYM (r_info);
7311 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7316 && (must_be_dyn_reloc (info, r_type)
7318 && (!SYMBOLIC_BIND (info, h)
7319 || h->root.type == bfd_link_hash_defweak
7320 || !h->def_regular))))
7321 || (ELIMINATE_COPY_RELOCS
7324 && (h->root.type == bfd_link_hash_defweak
7325 || !h->def_regular)))
7332 struct elf_dyn_relocs *p;
7333 struct elf_dyn_relocs **pp;
7334 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7336 /* elf_gc_sweep may have already removed all dyn relocs associated
7337 with local syms for a given section. Also, symbol flags are
7338 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7339 report a dynreloc miscount. */
7340 if (*pp == NULL && info->gc_sections)
7343 while ((p = *pp) != NULL)
7347 if (!must_be_dyn_reloc (info, r_type))
7359 struct ppc_dyn_relocs *p;
7360 struct ppc_dyn_relocs **pp;
7362 bfd_boolean is_ifunc;
7364 if (local_syms == NULL)
7365 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7366 if (sym_sec == NULL)
7369 vpp = &elf_section_data (sym_sec)->local_dynrel;
7370 pp = (struct ppc_dyn_relocs **) vpp;
7372 if (*pp == NULL && info->gc_sections)
7375 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7376 while ((p = *pp) != NULL)
7378 if (p->sec == sec && p->ifunc == is_ifunc)
7389 info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
7391 bfd_set_error (bfd_error_bad_value);
7395 /* Remove unused Official Procedure Descriptor entries. Currently we
7396 only remove those associated with functions in discarded link-once
7397 sections, or weakly defined functions that have been overridden. It
7398 would be possible to remove many more entries for statically linked
7402 ppc64_elf_edit_opd (struct bfd_link_info *info, bfd_boolean non_overlapping)
7405 bfd_boolean some_edited = FALSE;
7406 asection *need_pad = NULL;
7408 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7411 Elf_Internal_Rela *relstart, *rel, *relend;
7412 Elf_Internal_Shdr *symtab_hdr;
7413 Elf_Internal_Sym *local_syms;
7415 struct _opd_sec_data *opd;
7416 bfd_boolean need_edit, add_aux_fields;
7417 bfd_size_type cnt_16b = 0;
7419 if (!is_ppc64_elf (ibfd))
7422 sec = bfd_get_section_by_name (ibfd, ".opd");
7423 if (sec == NULL || sec->size == 0)
7426 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
7429 if (sec->output_section == bfd_abs_section_ptr)
7432 /* Look through the section relocs. */
7433 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7437 symtab_hdr = &elf_symtab_hdr (ibfd);
7439 /* Read the relocations. */
7440 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7442 if (relstart == NULL)
7445 /* First run through the relocs to check they are sane, and to
7446 determine whether we need to edit this opd section. */
7450 relend = relstart + sec->reloc_count;
7451 for (rel = relstart; rel < relend; )
7453 enum elf_ppc64_reloc_type r_type;
7454 unsigned long r_symndx;
7456 struct elf_link_hash_entry *h;
7457 Elf_Internal_Sym *sym;
7459 /* .opd contains a regular array of 16 or 24 byte entries. We're
7460 only interested in the reloc pointing to a function entry
7462 if (rel->r_offset != offset
7463 || rel + 1 >= relend
7464 || (rel + 1)->r_offset != offset + 8)
7466 /* If someone messes with .opd alignment then after a
7467 "ld -r" we might have padding in the middle of .opd.
7468 Also, there's nothing to prevent someone putting
7469 something silly in .opd with the assembler. No .opd
7470 optimization for them! */
7472 (*_bfd_error_handler)
7473 (_("%B: .opd is not a regular array of opd entries"), ibfd);
7478 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7479 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7481 (*_bfd_error_handler)
7482 (_("%B: unexpected reloc type %u in .opd section"),
7488 r_symndx = ELF64_R_SYM (rel->r_info);
7489 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7493 if (sym_sec == NULL || sym_sec->owner == NULL)
7495 const char *sym_name;
7497 sym_name = h->root.root.string;
7499 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7502 (*_bfd_error_handler)
7503 (_("%B: undefined sym `%s' in .opd section"),
7509 /* opd entries are always for functions defined in the
7510 current input bfd. If the symbol isn't defined in the
7511 input bfd, then we won't be using the function in this
7512 bfd; It must be defined in a linkonce section in another
7513 bfd, or is weak. It's also possible that we are
7514 discarding the function due to a linker script /DISCARD/,
7515 which we test for via the output_section. */
7516 if (sym_sec->owner != ibfd
7517 || sym_sec->output_section == bfd_abs_section_ptr)
7522 || (rel + 1 == relend && rel->r_offset == offset + 16))
7524 if (sec->size == offset + 24)
7529 if (rel == relend && sec->size == offset + 16)
7537 if (rel->r_offset == offset + 24)
7539 else if (rel->r_offset != offset + 16)
7541 else if (rel + 1 < relend
7542 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7543 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7548 else if (rel + 2 < relend
7549 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
7550 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
7559 add_aux_fields = non_overlapping && cnt_16b > 0;
7561 if (need_edit || add_aux_fields)
7563 Elf_Internal_Rela *write_rel;
7564 Elf_Internal_Shdr *rel_hdr;
7565 bfd_byte *rptr, *wptr;
7566 bfd_byte *new_contents;
7571 new_contents = NULL;
7572 amt = sec->size * sizeof (long) / 8;
7573 opd = &ppc64_elf_section_data (sec)->u.opd;
7574 opd->adjust = bfd_zalloc (sec->owner, amt);
7575 if (opd->adjust == NULL)
7577 ppc64_elf_section_data (sec)->sec_type = sec_opd;
7579 /* This seems a waste of time as input .opd sections are all
7580 zeros as generated by gcc, but I suppose there's no reason
7581 this will always be so. We might start putting something in
7582 the third word of .opd entries. */
7583 if ((sec->flags & SEC_IN_MEMORY) == 0)
7586 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
7591 if (local_syms != NULL
7592 && symtab_hdr->contents != (unsigned char *) local_syms)
7594 if (elf_section_data (sec)->relocs != relstart)
7598 sec->contents = loc;
7599 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7602 elf_section_data (sec)->relocs = relstart;
7604 new_contents = sec->contents;
7607 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7608 if (new_contents == NULL)
7612 wptr = new_contents;
7613 rptr = sec->contents;
7615 write_rel = relstart;
7619 for (rel = relstart; rel < relend; rel++)
7621 unsigned long r_symndx;
7623 struct elf_link_hash_entry *h;
7624 Elf_Internal_Sym *sym;
7626 r_symndx = ELF64_R_SYM (rel->r_info);
7627 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7631 if (rel->r_offset == offset)
7633 struct ppc_link_hash_entry *fdh = NULL;
7635 /* See if the .opd entry is full 24 byte or
7636 16 byte (with fd_aux entry overlapped with next
7639 if ((rel + 2 == relend && sec->size == offset + 16)
7640 || (rel + 3 < relend
7641 && rel[2].r_offset == offset + 16
7642 && rel[3].r_offset == offset + 24
7643 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
7644 && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
7648 && h->root.root.string[0] == '.')
7650 struct ppc_link_hash_table *htab;
7652 htab = ppc_hash_table (info);
7654 fdh = lookup_fdh ((struct ppc_link_hash_entry *) h,
7657 && fdh->elf.root.type != bfd_link_hash_defined
7658 && fdh->elf.root.type != bfd_link_hash_defweak)
7662 skip = (sym_sec->owner != ibfd
7663 || sym_sec->output_section == bfd_abs_section_ptr);
7666 if (fdh != NULL && sym_sec->owner == ibfd)
7668 /* Arrange for the function descriptor sym
7670 fdh->elf.root.u.def.value = 0;
7671 fdh->elf.root.u.def.section = sym_sec;
7673 opd->adjust[rel->r_offset / 8] = -1;
7677 /* We'll be keeping this opd entry. */
7681 /* Redefine the function descriptor symbol to
7682 this location in the opd section. It is
7683 necessary to update the value here rather
7684 than using an array of adjustments as we do
7685 for local symbols, because various places
7686 in the generic ELF code use the value
7687 stored in u.def.value. */
7688 fdh->elf.root.u.def.value = wptr - new_contents;
7689 fdh->adjust_done = 1;
7692 /* Local syms are a bit tricky. We could
7693 tweak them as they can be cached, but
7694 we'd need to look through the local syms
7695 for the function descriptor sym which we
7696 don't have at the moment. So keep an
7697 array of adjustments. */
7698 opd->adjust[rel->r_offset / 8]
7699 = (wptr - new_contents) - (rptr - sec->contents);
7702 memcpy (wptr, rptr, opd_ent_size);
7703 wptr += opd_ent_size;
7704 if (add_aux_fields && opd_ent_size == 16)
7706 memset (wptr, '\0', 8);
7710 rptr += opd_ent_size;
7711 offset += opd_ent_size;
7717 && !info->relocatable
7718 && !dec_dynrel_count (rel->r_info, sec, info,
7724 /* We need to adjust any reloc offsets to point to the
7725 new opd entries. While we're at it, we may as well
7726 remove redundant relocs. */
7727 rel->r_offset += opd->adjust[(offset - opd_ent_size) / 8];
7728 if (write_rel != rel)
7729 memcpy (write_rel, rel, sizeof (*rel));
7734 sec->size = wptr - new_contents;
7735 sec->reloc_count = write_rel - relstart;
7738 free (sec->contents);
7739 sec->contents = new_contents;
7742 /* Fudge the header size too, as this is used later in
7743 elf_bfd_final_link if we are emitting relocs. */
7744 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7745 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
7748 else if (elf_section_data (sec)->relocs != relstart)
7751 if (local_syms != NULL
7752 && symtab_hdr->contents != (unsigned char *) local_syms)
7754 if (!info->keep_memory)
7757 symtab_hdr->contents = (unsigned char *) local_syms;
7762 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7764 /* If we are doing a final link and the last .opd entry is just 16 byte
7765 long, add a 8 byte padding after it. */
7766 if (need_pad != NULL && !info->relocatable)
7770 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7772 BFD_ASSERT (need_pad->size > 0);
7774 p = bfd_malloc (need_pad->size + 8);
7778 if (! bfd_get_section_contents (need_pad->owner, need_pad,
7779 p, 0, need_pad->size))
7782 need_pad->contents = p;
7783 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7787 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7791 need_pad->contents = p;
7794 memset (need_pad->contents + need_pad->size, 0, 8);
7795 need_pad->size += 8;
7801 /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
7804 ppc64_elf_tls_setup (struct bfd_link_info *info,
7805 int no_tls_get_addr_opt,
7808 struct ppc_link_hash_table *htab;
7810 htab = ppc_hash_table (info);
7814 if (abiversion (info->output_bfd) == 1)
7818 htab->do_multi_toc = 0;
7819 else if (!htab->do_multi_toc)
7822 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7823 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7824 FALSE, FALSE, TRUE));
7825 /* Move dynamic linking info to the function descriptor sym. */
7826 if (htab->tls_get_addr != NULL)
7827 func_desc_adjust (&htab->tls_get_addr->elf, info);
7828 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7829 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7830 FALSE, FALSE, TRUE));
7831 if (!no_tls_get_addr_opt)
7833 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
7835 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7836 FALSE, FALSE, TRUE);
7838 func_desc_adjust (opt, info);
7839 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7840 FALSE, FALSE, TRUE);
7842 && (opt_fd->root.type == bfd_link_hash_defined
7843 || opt_fd->root.type == bfd_link_hash_defweak))
7845 /* If glibc supports an optimized __tls_get_addr call stub,
7846 signalled by the presence of __tls_get_addr_opt, and we'll
7847 be calling __tls_get_addr via a plt call stub, then
7848 make __tls_get_addr point to __tls_get_addr_opt. */
7849 tga_fd = &htab->tls_get_addr_fd->elf;
7850 if (htab->elf.dynamic_sections_created
7852 && (tga_fd->type == STT_FUNC
7853 || tga_fd->needs_plt)
7854 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
7855 || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
7856 && tga_fd->root.type == bfd_link_hash_undefweak)))
7858 struct plt_entry *ent;
7860 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7861 if (ent->plt.refcount > 0)
7865 tga_fd->root.type = bfd_link_hash_indirect;
7866 tga_fd->root.u.i.link = &opt_fd->root;
7867 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
7868 if (opt_fd->dynindx != -1)
7870 /* Use __tls_get_addr_opt in dynamic relocations. */
7871 opt_fd->dynindx = -1;
7872 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7873 opt_fd->dynstr_index);
7874 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
7877 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
7878 tga = &htab->tls_get_addr->elf;
7879 if (opt != NULL && tga != NULL)
7881 tga->root.type = bfd_link_hash_indirect;
7882 tga->root.u.i.link = &opt->root;
7883 ppc64_elf_copy_indirect_symbol (info, opt, tga);
7884 _bfd_elf_link_hash_hide_symbol (info, opt,
7886 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
7888 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7889 htab->tls_get_addr_fd->is_func_descriptor = 1;
7890 if (htab->tls_get_addr != NULL)
7892 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7893 htab->tls_get_addr->is_func = 1;
7899 no_tls_get_addr_opt = TRUE;
7901 htab->no_tls_get_addr_opt = no_tls_get_addr_opt;
7902 return _bfd_elf_tls_setup (info->output_bfd, info);
7905 /* Return TRUE iff REL is a branch reloc with a global symbol matching
7909 branch_reloc_hash_match (const bfd *ibfd,
7910 const Elf_Internal_Rela *rel,
7911 const struct ppc_link_hash_entry *hash1,
7912 const struct ppc_link_hash_entry *hash2)
7914 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7915 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7916 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7918 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
7920 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7921 struct elf_link_hash_entry *h;
7923 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7924 h = elf_follow_link (h);
7925 if (h == &hash1->elf || h == &hash2->elf)
7931 /* Run through all the TLS relocs looking for optimization
7932 opportunities. The linker has been hacked (see ppc64elf.em) to do
7933 a preliminary section layout so that we know the TLS segment
7934 offsets. We can't optimize earlier because some optimizations need
7935 to know the tp offset, and we need to optimize before allocating
7936 dynamic relocations. */
7939 ppc64_elf_tls_optimize (struct bfd_link_info *info)
7943 struct ppc_link_hash_table *htab;
7944 unsigned char *toc_ref;
7947 if (info->relocatable || !info->executable)
7950 htab = ppc_hash_table (info);
7954 /* Make two passes over the relocs. On the first pass, mark toc
7955 entries involved with tls relocs, and check that tls relocs
7956 involved in setting up a tls_get_addr call are indeed followed by
7957 such a call. If they are not, we can't do any tls optimization.
7958 On the second pass twiddle tls_mask flags to notify
7959 relocate_section that optimization can be done, and adjust got
7960 and plt refcounts. */
7962 for (pass = 0; pass < 2; ++pass)
7963 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7965 Elf_Internal_Sym *locsyms = NULL;
7966 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7968 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7969 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7971 Elf_Internal_Rela *relstart, *rel, *relend;
7972 bfd_boolean found_tls_get_addr_arg = 0;
7974 /* Read the relocations. */
7975 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7977 if (relstart == NULL)
7980 relend = relstart + sec->reloc_count;
7981 for (rel = relstart; rel < relend; rel++)
7983 enum elf_ppc64_reloc_type r_type;
7984 unsigned long r_symndx;
7985 struct elf_link_hash_entry *h;
7986 Elf_Internal_Sym *sym;
7988 unsigned char *tls_mask;
7989 unsigned char tls_set, tls_clear, tls_type = 0;
7991 bfd_boolean ok_tprel, is_local;
7992 long toc_ref_index = 0;
7993 int expecting_tls_get_addr = 0;
7994 bfd_boolean ret = FALSE;
7996 r_symndx = ELF64_R_SYM (rel->r_info);
7997 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8001 if (elf_section_data (sec)->relocs != relstart)
8003 if (toc_ref != NULL)
8006 && (elf_symtab_hdr (ibfd).contents
8007 != (unsigned char *) locsyms))
8014 if (h->root.type == bfd_link_hash_defined
8015 || h->root.type == bfd_link_hash_defweak)
8016 value = h->root.u.def.value;
8017 else if (h->root.type == bfd_link_hash_undefweak)
8021 found_tls_get_addr_arg = 0;
8026 /* Symbols referenced by TLS relocs must be of type
8027 STT_TLS. So no need for .opd local sym adjust. */
8028 value = sym->st_value;
8037 && h->root.type == bfd_link_hash_undefweak)
8041 value += sym_sec->output_offset;
8042 value += sym_sec->output_section->vma;
8043 value -= htab->elf.tls_sec->vma;
8044 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8045 < (bfd_vma) 1 << 32);
8049 r_type = ELF64_R_TYPE (rel->r_info);
8050 /* If this section has old-style __tls_get_addr calls
8051 without marker relocs, then check that each
8052 __tls_get_addr call reloc is preceded by a reloc
8053 that conceivably belongs to the __tls_get_addr arg
8054 setup insn. If we don't find matching arg setup
8055 relocs, don't do any tls optimization. */
8057 && sec->has_tls_get_addr_call
8059 && (h == &htab->tls_get_addr->elf
8060 || h == &htab->tls_get_addr_fd->elf)
8061 && !found_tls_get_addr_arg
8062 && is_branch_reloc (r_type))
8064 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
8065 "TLS optimization disabled\n"),
8066 ibfd, sec, rel->r_offset);
8071 found_tls_get_addr_arg = 0;
8074 case R_PPC64_GOT_TLSLD16:
8075 case R_PPC64_GOT_TLSLD16_LO:
8076 expecting_tls_get_addr = 1;
8077 found_tls_get_addr_arg = 1;
8080 case R_PPC64_GOT_TLSLD16_HI:
8081 case R_PPC64_GOT_TLSLD16_HA:
8082 /* These relocs should never be against a symbol
8083 defined in a shared lib. Leave them alone if
8084 that turns out to be the case. */
8091 tls_type = TLS_TLS | TLS_LD;
8094 case R_PPC64_GOT_TLSGD16:
8095 case R_PPC64_GOT_TLSGD16_LO:
8096 expecting_tls_get_addr = 1;
8097 found_tls_get_addr_arg = 1;
8100 case R_PPC64_GOT_TLSGD16_HI:
8101 case R_PPC64_GOT_TLSGD16_HA:
8107 tls_set = TLS_TLS | TLS_TPRELGD;
8109 tls_type = TLS_TLS | TLS_GD;
8112 case R_PPC64_GOT_TPREL16_DS:
8113 case R_PPC64_GOT_TPREL16_LO_DS:
8114 case R_PPC64_GOT_TPREL16_HI:
8115 case R_PPC64_GOT_TPREL16_HA:
8120 tls_clear = TLS_TPREL;
8121 tls_type = TLS_TLS | TLS_TPREL;
8128 found_tls_get_addr_arg = 1;
8133 case R_PPC64_TOC16_LO:
8134 if (sym_sec == NULL || sym_sec != toc)
8137 /* Mark this toc entry as referenced by a TLS
8138 code sequence. We can do that now in the
8139 case of R_PPC64_TLS, and after checking for
8140 tls_get_addr for the TOC16 relocs. */
8141 if (toc_ref == NULL)
8142 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8143 if (toc_ref == NULL)
8147 value = h->root.u.def.value;
8149 value = sym->st_value;
8150 value += rel->r_addend;
8151 BFD_ASSERT (value < toc->size && value % 8 == 0);
8152 toc_ref_index = (value + toc->output_offset) / 8;
8153 if (r_type == R_PPC64_TLS
8154 || r_type == R_PPC64_TLSGD
8155 || r_type == R_PPC64_TLSLD)
8157 toc_ref[toc_ref_index] = 1;
8161 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8166 expecting_tls_get_addr = 2;
8169 case R_PPC64_TPREL64:
8173 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8178 tls_set = TLS_EXPLICIT;
8179 tls_clear = TLS_TPREL;
8184 case R_PPC64_DTPMOD64:
8188 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8190 if (rel + 1 < relend
8192 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8193 && rel[1].r_offset == rel->r_offset + 8)
8197 tls_set = TLS_EXPLICIT | TLS_GD;
8200 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8209 tls_set = TLS_EXPLICIT;
8220 if (!expecting_tls_get_addr
8221 || !sec->has_tls_get_addr_call)
8224 if (rel + 1 < relend
8225 && branch_reloc_hash_match (ibfd, rel + 1,
8227 htab->tls_get_addr_fd))
8229 if (expecting_tls_get_addr == 2)
8231 /* Check for toc tls entries. */
8232 unsigned char *toc_tls;
8235 retval = get_tls_mask (&toc_tls, NULL, NULL,
8240 if (toc_tls != NULL)
8242 if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
8243 found_tls_get_addr_arg = 1;
8245 toc_ref[toc_ref_index] = 1;
8251 if (expecting_tls_get_addr != 1)
8254 /* Uh oh, we didn't find the expected call. We
8255 could just mark this symbol to exclude it
8256 from tls optimization but it's safer to skip
8257 the entire optimization. */
8258 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
8259 "TLS optimization disabled\n"),
8260 ibfd, sec, rel->r_offset);
8265 if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
8267 struct plt_entry *ent;
8268 for (ent = htab->tls_get_addr->elf.plt.plist;
8271 if (ent->addend == 0)
8273 if (ent->plt.refcount > 0)
8275 ent->plt.refcount -= 1;
8276 expecting_tls_get_addr = 0;
8282 if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
8284 struct plt_entry *ent;
8285 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8288 if (ent->addend == 0)
8290 if (ent->plt.refcount > 0)
8291 ent->plt.refcount -= 1;
8299 if ((tls_set & TLS_EXPLICIT) == 0)
8301 struct got_entry *ent;
8303 /* Adjust got entry for this reloc. */
8307 ent = elf_local_got_ents (ibfd)[r_symndx];
8309 for (; ent != NULL; ent = ent->next)
8310 if (ent->addend == rel->r_addend
8311 && ent->owner == ibfd
8312 && ent->tls_type == tls_type)
8319 /* We managed to get rid of a got entry. */
8320 if (ent->got.refcount > 0)
8321 ent->got.refcount -= 1;
8326 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8327 we'll lose one or two dyn relocs. */
8328 if (!dec_dynrel_count (rel->r_info, sec, info,
8332 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8334 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
8340 *tls_mask |= tls_set;
8341 *tls_mask &= ~tls_clear;
8344 if (elf_section_data (sec)->relocs != relstart)
8349 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8351 if (!info->keep_memory)
8354 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8358 if (toc_ref != NULL)
8363 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8364 the values of any global symbols in a toc section that has been
8365 edited. Globals in toc sections should be a rarity, so this function
8366 sets a flag if any are found in toc sections other than the one just
8367 edited, so that futher hash table traversals can be avoided. */
8369 struct adjust_toc_info
8372 unsigned long *skip;
8373 bfd_boolean global_toc_syms;
8376 enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8379 adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8381 struct ppc_link_hash_entry *eh;
8382 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
8385 if (h->root.type != bfd_link_hash_defined
8386 && h->root.type != bfd_link_hash_defweak)
8389 eh = (struct ppc_link_hash_entry *) h;
8390 if (eh->adjust_done)
8393 if (eh->elf.root.u.def.section == toc_inf->toc)
8395 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8396 i = toc_inf->toc->rawsize >> 3;
8398 i = eh->elf.root.u.def.value >> 3;
8400 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
8402 (*_bfd_error_handler)
8403 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8406 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
8407 eh->elf.root.u.def.value = (bfd_vma) i << 3;
8410 eh->elf.root.u.def.value -= toc_inf->skip[i];
8411 eh->adjust_done = 1;
8413 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8414 toc_inf->global_toc_syms = TRUE;
8419 /* Return TRUE iff INSN is one we expect on a _LO variety toc/got reloc. */
8422 ok_lo_toc_insn (unsigned int insn)
8424 return ((insn & (0x3f << 26)) == 14u << 26 /* addi */
8425 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8426 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8427 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8428 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8429 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8430 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8431 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8432 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8433 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8434 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8435 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8436 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8437 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8438 || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8440 || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8441 && ((insn & 3) == 0 || (insn & 3) == 3))
8442 || (insn & (0x3f << 26)) == 12u << 26 /* addic */);
8445 /* Examine all relocs referencing .toc sections in order to remove
8446 unused .toc entries. */
8449 ppc64_elf_edit_toc (struct bfd_link_info *info)
8452 struct adjust_toc_info toc_inf;
8453 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8455 htab->do_toc_opt = 1;
8456 toc_inf.global_toc_syms = TRUE;
8457 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8459 asection *toc, *sec;
8460 Elf_Internal_Shdr *symtab_hdr;
8461 Elf_Internal_Sym *local_syms;
8462 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
8463 unsigned long *skip, *drop;
8464 unsigned char *used;
8465 unsigned char *keep, last, some_unused;
8467 if (!is_ppc64_elf (ibfd))
8470 toc = bfd_get_section_by_name (ibfd, ".toc");
8473 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8474 || discarded_section (toc))
8479 symtab_hdr = &elf_symtab_hdr (ibfd);
8481 /* Look at sections dropped from the final link. */
8484 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8486 if (sec->reloc_count == 0
8487 || !discarded_section (sec)
8488 || get_opd_info (sec)
8489 || (sec->flags & SEC_ALLOC) == 0
8490 || (sec->flags & SEC_DEBUGGING) != 0)
8493 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8494 if (relstart == NULL)
8497 /* Run through the relocs to see which toc entries might be
8499 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8501 enum elf_ppc64_reloc_type r_type;
8502 unsigned long r_symndx;
8504 struct elf_link_hash_entry *h;
8505 Elf_Internal_Sym *sym;
8508 r_type = ELF64_R_TYPE (rel->r_info);
8515 case R_PPC64_TOC16_LO:
8516 case R_PPC64_TOC16_HI:
8517 case R_PPC64_TOC16_HA:
8518 case R_PPC64_TOC16_DS:
8519 case R_PPC64_TOC16_LO_DS:
8523 r_symndx = ELF64_R_SYM (rel->r_info);
8524 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8532 val = h->root.u.def.value;
8534 val = sym->st_value;
8535 val += rel->r_addend;
8537 if (val >= toc->size)
8540 /* Anything in the toc ought to be aligned to 8 bytes.
8541 If not, don't mark as unused. */
8547 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8552 skip[val >> 3] = ref_from_discarded;
8555 if (elf_section_data (sec)->relocs != relstart)
8559 /* For largetoc loads of address constants, we can convert
8560 . addis rx,2,addr@got@ha
8561 . ld ry,addr@got@l(rx)
8563 . addis rx,2,addr@toc@ha
8564 . addi ry,rx,addr@toc@l
8565 when addr is within 2G of the toc pointer. This then means
8566 that the word storing "addr" in the toc is no longer needed. */
8568 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8569 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8570 && toc->reloc_count != 0)
8572 /* Read toc relocs. */
8573 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8575 if (toc_relocs == NULL)
8578 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
8580 enum elf_ppc64_reloc_type r_type;
8581 unsigned long r_symndx;
8583 struct elf_link_hash_entry *h;
8584 Elf_Internal_Sym *sym;
8587 r_type = ELF64_R_TYPE (rel->r_info);
8588 if (r_type != R_PPC64_ADDR64)
8591 r_symndx = ELF64_R_SYM (rel->r_info);
8592 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8597 || discarded_section (sym_sec))
8600 if (!SYMBOL_CALLS_LOCAL (info, h))
8605 if (h->type == STT_GNU_IFUNC)
8607 val = h->root.u.def.value;
8611 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8613 val = sym->st_value;
8615 val += rel->r_addend;
8616 val += sym_sec->output_section->vma + sym_sec->output_offset;
8618 /* We don't yet know the exact toc pointer value, but we
8619 know it will be somewhere in the toc section. Don't
8620 optimize if the difference from any possible toc
8621 pointer is outside [ff..f80008000, 7fff7fff]. */
8622 addr = toc->output_section->vma + TOC_BASE_OFF;
8623 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8626 addr = toc->output_section->vma + toc->output_section->rawsize;
8627 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8632 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8637 skip[rel->r_offset >> 3]
8638 |= can_optimize | ((rel - toc_relocs) << 2);
8645 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8649 if (local_syms != NULL
8650 && symtab_hdr->contents != (unsigned char *) local_syms)
8654 && elf_section_data (sec)->relocs != relstart)
8656 if (toc_relocs != NULL
8657 && elf_section_data (toc)->relocs != toc_relocs)
8664 /* Now check all kept sections that might reference the toc.
8665 Check the toc itself last. */
8666 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8669 sec = (sec == toc ? NULL
8670 : sec->next == NULL ? toc
8671 : sec->next == toc && toc->next ? toc->next
8676 if (sec->reloc_count == 0
8677 || discarded_section (sec)
8678 || get_opd_info (sec)
8679 || (sec->flags & SEC_ALLOC) == 0
8680 || (sec->flags & SEC_DEBUGGING) != 0)
8683 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8685 if (relstart == NULL)
8688 /* Mark toc entries referenced as used. */
8692 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8694 enum elf_ppc64_reloc_type r_type;
8695 unsigned long r_symndx;
8697 struct elf_link_hash_entry *h;
8698 Elf_Internal_Sym *sym;
8700 enum {no_check, check_lo, check_ha} insn_check;
8702 r_type = ELF64_R_TYPE (rel->r_info);
8706 insn_check = no_check;
8709 case R_PPC64_GOT_TLSLD16_HA:
8710 case R_PPC64_GOT_TLSGD16_HA:
8711 case R_PPC64_GOT_TPREL16_HA:
8712 case R_PPC64_GOT_DTPREL16_HA:
8713 case R_PPC64_GOT16_HA:
8714 case R_PPC64_TOC16_HA:
8715 insn_check = check_ha;
8718 case R_PPC64_GOT_TLSLD16_LO:
8719 case R_PPC64_GOT_TLSGD16_LO:
8720 case R_PPC64_GOT_TPREL16_LO_DS:
8721 case R_PPC64_GOT_DTPREL16_LO_DS:
8722 case R_PPC64_GOT16_LO:
8723 case R_PPC64_GOT16_LO_DS:
8724 case R_PPC64_TOC16_LO:
8725 case R_PPC64_TOC16_LO_DS:
8726 insn_check = check_lo;
8730 if (insn_check != no_check)
8732 bfd_vma off = rel->r_offset & ~3;
8733 unsigned char buf[4];
8736 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
8741 insn = bfd_get_32 (ibfd, buf);
8742 if (insn_check == check_lo
8743 ? !ok_lo_toc_insn (insn)
8744 : ((insn & ((0x3f << 26) | 0x1f << 16))
8745 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
8749 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
8750 sprintf (str, "%#08x", insn);
8751 info->callbacks->einfo
8752 (_("%P: %H: toc optimization is not supported for"
8753 " %s instruction.\n"),
8754 ibfd, sec, rel->r_offset & ~3, str);
8761 case R_PPC64_TOC16_LO:
8762 case R_PPC64_TOC16_HI:
8763 case R_PPC64_TOC16_HA:
8764 case R_PPC64_TOC16_DS:
8765 case R_PPC64_TOC16_LO_DS:
8766 /* In case we're taking addresses of toc entries. */
8767 case R_PPC64_ADDR64:
8774 r_symndx = ELF64_R_SYM (rel->r_info);
8775 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8786 val = h->root.u.def.value;
8788 val = sym->st_value;
8789 val += rel->r_addend;
8791 if (val >= toc->size)
8794 if ((skip[val >> 3] & can_optimize) != 0)
8801 case R_PPC64_TOC16_HA:
8804 case R_PPC64_TOC16_LO_DS:
8805 off = rel->r_offset;
8806 off += (bfd_big_endian (ibfd) ? -2 : 3);
8807 if (!bfd_get_section_contents (ibfd, sec, &opc,
8813 if ((opc & (0x3f << 2)) == (58u << 2))
8818 /* Wrong sort of reloc, or not a ld. We may
8819 as well clear ref_from_discarded too. */
8826 /* For the toc section, we only mark as used if this
8827 entry itself isn't unused. */
8828 else if ((used[rel->r_offset >> 3]
8829 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
8832 /* Do all the relocs again, to catch reference
8841 if (elf_section_data (sec)->relocs != relstart)
8845 /* Merge the used and skip arrays. Assume that TOC
8846 doublewords not appearing as either used or unused belong
8847 to to an entry more than one doubleword in size. */
8848 for (drop = skip, keep = used, last = 0, some_unused = 0;
8849 drop < skip + (toc->size + 7) / 8;
8854 *drop &= ~ref_from_discarded;
8855 if ((*drop & can_optimize) != 0)
8859 else if ((*drop & ref_from_discarded) != 0)
8862 last = ref_from_discarded;
8872 bfd_byte *contents, *src;
8874 Elf_Internal_Sym *sym;
8875 bfd_boolean local_toc_syms = FALSE;
8877 /* Shuffle the toc contents, and at the same time convert the
8878 skip array from booleans into offsets. */
8879 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8882 elf_section_data (toc)->this_hdr.contents = contents;
8884 for (src = contents, off = 0, drop = skip;
8885 src < contents + toc->size;
8888 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
8893 memcpy (src - off, src, 8);
8897 toc->rawsize = toc->size;
8898 toc->size = src - contents - off;
8900 /* Adjust addends for relocs against the toc section sym,
8901 and optimize any accesses we can. */
8902 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8904 if (sec->reloc_count == 0
8905 || discarded_section (sec))
8908 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8910 if (relstart == NULL)
8913 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8915 enum elf_ppc64_reloc_type r_type;
8916 unsigned long r_symndx;
8918 struct elf_link_hash_entry *h;
8921 r_type = ELF64_R_TYPE (rel->r_info);
8928 case R_PPC64_TOC16_LO:
8929 case R_PPC64_TOC16_HI:
8930 case R_PPC64_TOC16_HA:
8931 case R_PPC64_TOC16_DS:
8932 case R_PPC64_TOC16_LO_DS:
8933 case R_PPC64_ADDR64:
8937 r_symndx = ELF64_R_SYM (rel->r_info);
8938 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8946 val = h->root.u.def.value;
8949 val = sym->st_value;
8951 local_toc_syms = TRUE;
8954 val += rel->r_addend;
8956 if (val > toc->rawsize)
8958 else if ((skip[val >> 3] & ref_from_discarded) != 0)
8960 else if ((skip[val >> 3] & can_optimize) != 0)
8962 Elf_Internal_Rela *tocrel
8963 = toc_relocs + (skip[val >> 3] >> 2);
8964 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
8968 case R_PPC64_TOC16_HA:
8969 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
8972 case R_PPC64_TOC16_LO_DS:
8973 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
8977 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
8979 info->callbacks->einfo
8980 (_("%P: %H: %s references "
8981 "optimized away TOC entry\n"),
8982 ibfd, sec, rel->r_offset,
8983 ppc64_elf_howto_table[r_type]->name);
8984 bfd_set_error (bfd_error_bad_value);
8987 rel->r_addend = tocrel->r_addend;
8988 elf_section_data (sec)->relocs = relstart;
8992 if (h != NULL || sym->st_value != 0)
8995 rel->r_addend -= skip[val >> 3];
8996 elf_section_data (sec)->relocs = relstart;
8999 if (elf_section_data (sec)->relocs != relstart)
9003 /* We shouldn't have local or global symbols defined in the TOC,
9004 but handle them anyway. */
9005 if (local_syms != NULL)
9006 for (sym = local_syms;
9007 sym < local_syms + symtab_hdr->sh_info;
9009 if (sym->st_value != 0
9010 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9014 if (sym->st_value > toc->rawsize)
9015 i = toc->rawsize >> 3;
9017 i = sym->st_value >> 3;
9019 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9022 (*_bfd_error_handler)
9023 (_("%s defined on removed toc entry"),
9024 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9027 while ((skip[i] & (ref_from_discarded | can_optimize)));
9028 sym->st_value = (bfd_vma) i << 3;
9031 sym->st_value -= skip[i];
9032 symtab_hdr->contents = (unsigned char *) local_syms;
9035 /* Adjust any global syms defined in this toc input section. */
9036 if (toc_inf.global_toc_syms)
9039 toc_inf.skip = skip;
9040 toc_inf.global_toc_syms = FALSE;
9041 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9045 if (toc->reloc_count != 0)
9047 Elf_Internal_Shdr *rel_hdr;
9048 Elf_Internal_Rela *wrel;
9051 /* Remove unused toc relocs, and adjust those we keep. */
9052 if (toc_relocs == NULL)
9053 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9055 if (toc_relocs == NULL)
9059 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9060 if ((skip[rel->r_offset >> 3]
9061 & (ref_from_discarded | can_optimize)) == 0)
9063 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9064 wrel->r_info = rel->r_info;
9065 wrel->r_addend = rel->r_addend;
9068 else if (!dec_dynrel_count (rel->r_info, toc, info,
9069 &local_syms, NULL, NULL))
9072 elf_section_data (toc)->relocs = toc_relocs;
9073 toc->reloc_count = wrel - toc_relocs;
9074 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9075 sz = rel_hdr->sh_entsize;
9076 rel_hdr->sh_size = toc->reloc_count * sz;
9079 else if (toc_relocs != NULL
9080 && elf_section_data (toc)->relocs != toc_relocs)
9083 if (local_syms != NULL
9084 && symtab_hdr->contents != (unsigned char *) local_syms)
9086 if (!info->keep_memory)
9089 symtab_hdr->contents = (unsigned char *) local_syms;
9097 /* Return true iff input section I references the TOC using
9098 instructions limited to +/-32k offsets. */
9101 ppc64_elf_has_small_toc_reloc (asection *i)
9103 return (is_ppc64_elf (i->owner)
9104 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9107 /* Allocate space for one GOT entry. */
9110 allocate_got (struct elf_link_hash_entry *h,
9111 struct bfd_link_info *info,
9112 struct got_entry *gent)
9114 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9116 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9117 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9119 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9120 ? 2 : 1) * sizeof (Elf64_External_Rela);
9121 asection *got = ppc64_elf_tdata (gent->owner)->got;
9123 gent->got.offset = got->size;
9124 got->size += entsize;
9126 dyn = htab->elf.dynamic_sections_created;
9127 if (h->type == STT_GNU_IFUNC)
9129 htab->reliplt->size += rentsize;
9130 htab->got_reli_size += rentsize;
9132 else if ((info->shared
9133 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
9134 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9135 || h->root.type != bfd_link_hash_undefweak))
9137 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
9138 relgot->size += rentsize;
9142 /* This function merges got entries in the same toc group. */
9145 merge_got_entries (struct got_entry **pent)
9147 struct got_entry *ent, *ent2;
9149 for (ent = *pent; ent != NULL; ent = ent->next)
9150 if (!ent->is_indirect)
9151 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9152 if (!ent2->is_indirect
9153 && ent2->addend == ent->addend
9154 && ent2->tls_type == ent->tls_type
9155 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9157 ent2->is_indirect = TRUE;
9158 ent2->got.ent = ent;
9162 /* Allocate space in .plt, .got and associated reloc sections for
9166 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9168 struct bfd_link_info *info;
9169 struct ppc_link_hash_table *htab;
9171 struct ppc_link_hash_entry *eh;
9172 struct elf_dyn_relocs *p;
9173 struct got_entry **pgent, *gent;
9175 if (h->root.type == bfd_link_hash_indirect)
9178 info = (struct bfd_link_info *) inf;
9179 htab = ppc_hash_table (info);
9183 if ((htab->elf.dynamic_sections_created
9185 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
9186 || h->type == STT_GNU_IFUNC)
9188 struct plt_entry *pent;
9189 bfd_boolean doneone = FALSE;
9190 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9191 if (pent->plt.refcount > 0)
9193 if (!htab->elf.dynamic_sections_created
9194 || h->dynindx == -1)
9197 pent->plt.offset = s->size;
9198 s->size += PLT_ENTRY_SIZE;
9203 /* If this is the first .plt entry, make room for the special
9207 s->size += PLT_INITIAL_ENTRY_SIZE;
9209 pent->plt.offset = s->size;
9211 /* Make room for this entry. */
9212 s->size += PLT_ENTRY_SIZE;
9214 /* Make room for the .glink code. */
9217 s->size += GLINK_CALL_STUB_SIZE;
9218 /* We need bigger stubs past index 32767. */
9219 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
9223 /* We also need to make an entry in the .rela.plt section. */
9226 s->size += sizeof (Elf64_External_Rela);
9230 pent->plt.offset = (bfd_vma) -1;
9233 h->plt.plist = NULL;
9239 h->plt.plist = NULL;
9243 eh = (struct ppc_link_hash_entry *) h;
9244 /* Run through the TLS GD got entries first if we're changing them
9246 if ((eh->tls_mask & TLS_TPRELGD) != 0)
9247 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9248 if (gent->got.refcount > 0
9249 && (gent->tls_type & TLS_GD) != 0)
9251 /* This was a GD entry that has been converted to TPREL. If
9252 there happens to be a TPREL entry we can use that one. */
9253 struct got_entry *ent;
9254 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9255 if (ent->got.refcount > 0
9256 && (ent->tls_type & TLS_TPREL) != 0
9257 && ent->addend == gent->addend
9258 && ent->owner == gent->owner)
9260 gent->got.refcount = 0;
9264 /* If not, then we'll be using our own TPREL entry. */
9265 if (gent->got.refcount != 0)
9266 gent->tls_type = TLS_TLS | TLS_TPREL;
9269 /* Remove any list entry that won't generate a word in the GOT before
9270 we call merge_got_entries. Otherwise we risk merging to empty
9272 pgent = &h->got.glist;
9273 while ((gent = *pgent) != NULL)
9274 if (gent->got.refcount > 0)
9276 if ((gent->tls_type & TLS_LD) != 0
9279 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9280 *pgent = gent->next;
9283 pgent = &gent->next;
9286 *pgent = gent->next;
9288 if (!htab->do_multi_toc)
9289 merge_got_entries (&h->got.glist);
9291 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9292 if (!gent->is_indirect)
9294 /* Make sure this symbol is output as a dynamic symbol.
9295 Undefined weak syms won't yet be marked as dynamic,
9296 nor will all TLS symbols. */
9297 if (h->dynindx == -1
9299 && h->type != STT_GNU_IFUNC
9300 && htab->elf.dynamic_sections_created)
9302 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9306 if (!is_ppc64_elf (gent->owner))
9309 allocate_got (h, info, gent);
9312 if (eh->dyn_relocs == NULL
9313 || (!htab->elf.dynamic_sections_created
9314 && h->type != STT_GNU_IFUNC))
9317 /* In the shared -Bsymbolic case, discard space allocated for
9318 dynamic pc-relative relocs against symbols which turn out to be
9319 defined in regular objects. For the normal shared case, discard
9320 space for relocs that have become local due to symbol visibility
9325 /* Relocs that use pc_count are those that appear on a call insn,
9326 or certain REL relocs (see must_be_dyn_reloc) that can be
9327 generated via assembly. We want calls to protected symbols to
9328 resolve directly to the function rather than going via the plt.
9329 If people want function pointer comparisons to work as expected
9330 then they should avoid writing weird assembly. */
9331 if (SYMBOL_CALLS_LOCAL (info, h))
9333 struct elf_dyn_relocs **pp;
9335 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9337 p->count -= p->pc_count;
9346 /* Also discard relocs on undefined weak syms with non-default
9348 if (eh->dyn_relocs != NULL
9349 && h->root.type == bfd_link_hash_undefweak)
9351 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9352 eh->dyn_relocs = NULL;
9354 /* Make sure this symbol is output as a dynamic symbol.
9355 Undefined weak syms won't yet be marked as dynamic. */
9356 else if (h->dynindx == -1
9357 && !h->forced_local)
9359 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9364 else if (h->type == STT_GNU_IFUNC)
9366 if (!h->non_got_ref)
9367 eh->dyn_relocs = NULL;
9369 else if (ELIMINATE_COPY_RELOCS)
9371 /* For the non-shared case, discard space for relocs against
9372 symbols which turn out to need copy relocs or are not
9378 /* Make sure this symbol is output as a dynamic symbol.
9379 Undefined weak syms won't yet be marked as dynamic. */
9380 if (h->dynindx == -1
9381 && !h->forced_local)
9383 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9387 /* If that succeeded, we know we'll be keeping all the
9389 if (h->dynindx != -1)
9393 eh->dyn_relocs = NULL;
9398 /* Finally, allocate space. */
9399 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9401 asection *sreloc = elf_section_data (p->sec)->sreloc;
9402 if (eh->elf.type == STT_GNU_IFUNC)
9403 sreloc = htab->reliplt;
9404 sreloc->size += p->count * sizeof (Elf64_External_Rela);
9410 /* Find any dynamic relocs that apply to read-only sections. */
9413 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9415 struct ppc_link_hash_entry *eh;
9416 struct elf_dyn_relocs *p;
9418 eh = (struct ppc_link_hash_entry *) h;
9419 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9421 asection *s = p->sec->output_section;
9423 if (s != NULL && (s->flags & SEC_READONLY) != 0)
9425 struct bfd_link_info *info = inf;
9427 info->flags |= DF_TEXTREL;
9429 /* Not an error, just cut short the traversal. */
9436 /* Set the sizes of the dynamic sections. */
9439 ppc64_elf_size_dynamic_sections (bfd *output_bfd,
9440 struct bfd_link_info *info)
9442 struct ppc_link_hash_table *htab;
9447 struct got_entry *first_tlsld;
9449 htab = ppc_hash_table (info);
9453 dynobj = htab->elf.dynobj;
9457 if (htab->elf.dynamic_sections_created)
9459 /* Set the contents of the .interp section to the interpreter. */
9460 if (info->executable)
9462 s = bfd_get_linker_section (dynobj, ".interp");
9465 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
9466 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9470 /* Set up .got offsets for local syms, and space for local dynamic
9472 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9474 struct got_entry **lgot_ents;
9475 struct got_entry **end_lgot_ents;
9476 struct plt_entry **local_plt;
9477 struct plt_entry **end_local_plt;
9478 unsigned char *lgot_masks;
9479 bfd_size_type locsymcount;
9480 Elf_Internal_Shdr *symtab_hdr;
9482 if (!is_ppc64_elf (ibfd))
9485 for (s = ibfd->sections; s != NULL; s = s->next)
9487 struct ppc_dyn_relocs *p;
9489 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
9491 if (!bfd_is_abs_section (p->sec)
9492 && bfd_is_abs_section (p->sec->output_section))
9494 /* Input section has been discarded, either because
9495 it is a copy of a linkonce section or due to
9496 linker script /DISCARD/, so we'll be discarding
9499 else if (p->count != 0)
9501 asection *srel = elf_section_data (p->sec)->sreloc;
9503 srel = htab->reliplt;
9504 srel->size += p->count * sizeof (Elf64_External_Rela);
9505 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9506 info->flags |= DF_TEXTREL;
9511 lgot_ents = elf_local_got_ents (ibfd);
9515 symtab_hdr = &elf_symtab_hdr (ibfd);
9516 locsymcount = symtab_hdr->sh_info;
9517 end_lgot_ents = lgot_ents + locsymcount;
9518 local_plt = (struct plt_entry **) end_lgot_ents;
9519 end_local_plt = local_plt + locsymcount;
9520 lgot_masks = (unsigned char *) end_local_plt;
9521 s = ppc64_elf_tdata (ibfd)->got;
9522 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
9524 struct got_entry **pent, *ent;
9527 while ((ent = *pent) != NULL)
9528 if (ent->got.refcount > 0)
9530 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
9532 ppc64_tlsld_got (ibfd)->got.refcount += 1;
9537 unsigned int ent_size = 8;
9538 unsigned int rel_size = sizeof (Elf64_External_Rela);
9540 ent->got.offset = s->size;
9541 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
9546 s->size += ent_size;
9547 if ((*lgot_masks & PLT_IFUNC) != 0)
9549 htab->reliplt->size += rel_size;
9550 htab->got_reli_size += rel_size;
9552 else if (info->shared)
9554 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9555 srel->size += rel_size;
9564 /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
9565 for (; local_plt < end_local_plt; ++local_plt)
9567 struct plt_entry *ent;
9569 for (ent = *local_plt; ent != NULL; ent = ent->next)
9570 if (ent->plt.refcount > 0)
9573 ent->plt.offset = s->size;
9574 s->size += PLT_ENTRY_SIZE;
9576 htab->reliplt->size += sizeof (Elf64_External_Rela);
9579 ent->plt.offset = (bfd_vma) -1;
9583 /* Allocate global sym .plt and .got entries, and space for global
9584 sym dynamic relocs. */
9585 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
9588 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9590 struct got_entry *ent;
9592 if (!is_ppc64_elf (ibfd))
9595 ent = ppc64_tlsld_got (ibfd);
9596 if (ent->got.refcount > 0)
9598 if (!htab->do_multi_toc && first_tlsld != NULL)
9600 ent->is_indirect = TRUE;
9601 ent->got.ent = first_tlsld;
9605 if (first_tlsld == NULL)
9607 s = ppc64_elf_tdata (ibfd)->got;
9608 ent->got.offset = s->size;
9613 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9614 srel->size += sizeof (Elf64_External_Rela);
9619 ent->got.offset = (bfd_vma) -1;
9622 /* We now have determined the sizes of the various dynamic sections.
9623 Allocate memory for them. */
9625 for (s = dynobj->sections; s != NULL; s = s->next)
9627 if ((s->flags & SEC_LINKER_CREATED) == 0)
9630 if (s == htab->brlt || s == htab->relbrlt)
9631 /* These haven't been allocated yet; don't strip. */
9633 else if (s == htab->got
9637 || s == htab->dynbss)
9639 /* Strip this section if we don't need it; see the
9642 else if (s == htab->glink_eh_frame)
9644 if (!bfd_is_abs_section (s->output_section))
9645 /* Not sized yet. */
9648 else if (CONST_STRNEQ (s->name, ".rela"))
9652 if (s != htab->relplt)
9655 /* We use the reloc_count field as a counter if we need
9656 to copy relocs into the output file. */
9662 /* It's not one of our sections, so don't allocate space. */
9668 /* If we don't need this section, strip it from the
9669 output file. This is mostly to handle .rela.bss and
9670 .rela.plt. We must create both sections in
9671 create_dynamic_sections, because they must be created
9672 before the linker maps input sections to output
9673 sections. The linker does that before
9674 adjust_dynamic_symbol is called, and it is that
9675 function which decides whether anything needs to go
9676 into these sections. */
9677 s->flags |= SEC_EXCLUDE;
9681 if ((s->flags & SEC_HAS_CONTENTS) == 0)
9684 /* Allocate memory for the section contents. We use bfd_zalloc
9685 here in case unused entries are not reclaimed before the
9686 section's contents are written out. This should not happen,
9687 but this way if it does we get a R_PPC64_NONE reloc in .rela
9688 sections instead of garbage.
9689 We also rely on the section contents being zero when writing
9691 s->contents = bfd_zalloc (dynobj, s->size);
9692 if (s->contents == NULL)
9696 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9698 if (!is_ppc64_elf (ibfd))
9701 s = ppc64_elf_tdata (ibfd)->got;
9702 if (s != NULL && s != htab->got)
9705 s->flags |= SEC_EXCLUDE;
9708 s->contents = bfd_zalloc (ibfd, s->size);
9709 if (s->contents == NULL)
9713 s = ppc64_elf_tdata (ibfd)->relgot;
9717 s->flags |= SEC_EXCLUDE;
9720 s->contents = bfd_zalloc (ibfd, s->size);
9721 if (s->contents == NULL)
9729 if (htab->elf.dynamic_sections_created)
9731 /* Add some entries to the .dynamic section. We fill in the
9732 values later, in ppc64_elf_finish_dynamic_sections, but we
9733 must add the entries now so that we get the correct size for
9734 the .dynamic section. The DT_DEBUG entry is filled in by the
9735 dynamic linker and used by the debugger. */
9736 #define add_dynamic_entry(TAG, VAL) \
9737 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
9739 if (info->executable)
9741 if (!add_dynamic_entry (DT_DEBUG, 0))
9745 if (htab->plt != NULL && htab->plt->size != 0)
9747 if (!add_dynamic_entry (DT_PLTGOT, 0)
9748 || !add_dynamic_entry (DT_PLTRELSZ, 0)
9749 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
9750 || !add_dynamic_entry (DT_JMPREL, 0)
9751 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
9755 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
9757 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
9758 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
9762 if (!htab->no_tls_get_addr_opt
9763 && htab->tls_get_addr_fd != NULL
9764 && htab->tls_get_addr_fd->elf.plt.plist != NULL
9765 && !add_dynamic_entry (DT_PPC64_TLSOPT, 0))
9770 if (!add_dynamic_entry (DT_RELA, 0)
9771 || !add_dynamic_entry (DT_RELASZ, 0)
9772 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
9775 /* If any dynamic relocs apply to a read-only section,
9776 then we need a DT_TEXTREL entry. */
9777 if ((info->flags & DF_TEXTREL) == 0)
9778 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
9780 if ((info->flags & DF_TEXTREL) != 0)
9782 if (!add_dynamic_entry (DT_TEXTREL, 0))
9787 #undef add_dynamic_entry
9792 /* Determine the type of stub needed, if any, for a call. */
9794 static inline enum ppc_stub_type
9795 ppc_type_of_stub (asection *input_sec,
9796 const Elf_Internal_Rela *rel,
9797 struct ppc_link_hash_entry **hash,
9798 struct plt_entry **plt_ent,
9799 bfd_vma destination)
9801 struct ppc_link_hash_entry *h = *hash;
9803 bfd_vma branch_offset;
9804 bfd_vma max_branch_offset;
9805 enum elf_ppc64_reloc_type r_type;
9809 struct plt_entry *ent;
9810 struct ppc_link_hash_entry *fdh = h;
9812 && h->oh->is_func_descriptor)
9814 fdh = ppc_follow_link (h->oh);
9818 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
9819 if (ent->addend == rel->r_addend
9820 && ent->plt.offset != (bfd_vma) -1)
9823 return ppc_stub_plt_call;
9826 /* Here, we know we don't have a plt entry. If we don't have a
9827 either a defined function descriptor or a defined entry symbol
9828 in a regular object file, then it is pointless trying to make
9829 any other type of stub. */
9830 if (!is_static_defined (&fdh->elf)
9831 && !is_static_defined (&h->elf))
9832 return ppc_stub_none;
9834 else if (elf_local_got_ents (input_sec->owner) != NULL)
9836 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
9837 struct plt_entry **local_plt = (struct plt_entry **)
9838 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
9839 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
9841 if (local_plt[r_symndx] != NULL)
9843 struct plt_entry *ent;
9845 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
9846 if (ent->addend == rel->r_addend
9847 && ent->plt.offset != (bfd_vma) -1)
9850 return ppc_stub_plt_call;
9855 /* Determine where the call point is. */
9856 location = (input_sec->output_offset
9857 + input_sec->output_section->vma
9860 branch_offset = destination - location;
9861 r_type = ELF64_R_TYPE (rel->r_info);
9863 /* Determine if a long branch stub is needed. */
9864 max_branch_offset = 1 << 25;
9865 if (r_type != R_PPC64_REL24)
9866 max_branch_offset = 1 << 15;
9868 if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
9869 /* We need a stub. Figure out whether a long_branch or plt_branch
9871 return ppc_stub_long_branch;
9873 return ppc_stub_none;
9876 /* With power7 weakly ordered memory model, it is possible for ld.so
9877 to update a plt entry in one thread and have another thread see a
9878 stale zero toc entry. To avoid this we need some sort of acquire
9879 barrier in the call stub. One solution is to make the load of the
9880 toc word seem to appear to depend on the load of the function entry
9881 word. Another solution is to test for r2 being zero, and branch to
9882 the appropriate glink entry if so.
9884 . fake dep barrier compare
9885 . ld 12,xxx(2) ld 12,xxx(2)
9887 . xor 11,12,12 ld 2,xxx+8(2)
9888 . add 2,2,11 cmpldi 2,0
9889 . ld 2,xxx+8(2) bnectr+
9890 . bctr b <glink_entry>
9892 The solution involving the compare turns out to be faster, so
9893 that's what we use unless the branch won't reach. */
9895 #define ALWAYS_USE_FAKE_DEP 0
9896 #define ALWAYS_EMIT_R2SAVE 0
9898 #define PPC_LO(v) ((v) & 0xffff)
9899 #define PPC_HI(v) (((v) >> 16) & 0xffff)
9900 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
9902 static inline unsigned int
9903 plt_stub_size (struct ppc_link_hash_table *htab,
9904 struct ppc_stub_hash_entry *stub_entry,
9907 unsigned size = PLT_CALL_STUB_SIZE;
9909 if (!(ALWAYS_EMIT_R2SAVE
9910 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
9912 if (!htab->plt_static_chain)
9914 if (htab->plt_thread_safe)
9916 if (PPC_HA (off) == 0)
9918 if (PPC_HA (off + 8 + 8 * htab->plt_static_chain) != PPC_HA (off))
9920 if (stub_entry->h != NULL
9921 && (stub_entry->h == htab->tls_get_addr_fd
9922 || stub_entry->h == htab->tls_get_addr)
9923 && !htab->no_tls_get_addr_opt)
9928 /* If this stub would cross fewer 2**plt_stub_align boundaries if we align,
9929 then return the padding needed to do so. */
9930 static inline unsigned int
9931 plt_stub_pad (struct ppc_link_hash_table *htab,
9932 struct ppc_stub_hash_entry *stub_entry,
9935 int stub_align = 1 << htab->plt_stub_align;
9936 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
9937 bfd_vma stub_off = stub_entry->stub_sec->size;
9939 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
9940 > (stub_size & -stub_align))
9941 return stub_align - (stub_off & (stub_align - 1));
9945 /* Build a .plt call stub. */
9947 static inline bfd_byte *
9948 build_plt_stub (struct ppc_link_hash_table *htab,
9949 struct ppc_stub_hash_entry *stub_entry,
9950 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
9952 bfd *obfd = htab->stub_bfd;
9953 bfd_boolean plt_static_chain = htab->plt_static_chain;
9954 bfd_boolean plt_thread_safe = htab->plt_thread_safe;
9955 bfd_boolean use_fake_dep = plt_thread_safe;
9956 bfd_vma cmp_branch_off = 0;
9958 if (!ALWAYS_USE_FAKE_DEP
9960 && !(stub_entry->h != NULL
9961 && (stub_entry->h == htab->tls_get_addr_fd
9962 || stub_entry->h == htab->tls_get_addr)
9963 && !htab->no_tls_get_addr_opt))
9965 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
9966 bfd_vma pltindex = (pltoff - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE;
9967 bfd_vma glinkoff = GLINK_CALL_STUB_SIZE + pltindex * 8;
9970 if (pltindex > 32768)
9971 glinkoff += (pltindex - 32768) * 4;
9973 + htab->glink->output_offset
9974 + htab->glink->output_section->vma);
9975 from = (p - stub_entry->stub_sec->contents
9976 + 4 * (ALWAYS_EMIT_R2SAVE
9977 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
9978 + 4 * (PPC_HA (offset) != 0)
9979 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
9981 + 4 * (plt_static_chain != 0)
9983 + stub_entry->stub_sec->output_offset
9984 + stub_entry->stub_sec->output_section->vma);
9985 cmp_branch_off = to - from;
9986 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
9989 if (PPC_HA (offset) != 0)
9993 if (ALWAYS_EMIT_R2SAVE
9994 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
9996 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
9997 r[1].r_offset = r[0].r_offset + 4;
9998 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9999 r[1].r_addend = r[0].r_addend;
10000 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10002 r[2].r_offset = r[1].r_offset + 4;
10003 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10004 r[2].r_addend = r[0].r_addend;
10008 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10009 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10010 r[2].r_addend = r[0].r_addend + 8;
10011 if (plt_static_chain)
10013 r[3].r_offset = r[2].r_offset + 4;
10014 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10015 r[3].r_addend = r[0].r_addend + 16;
10019 if (ALWAYS_EMIT_R2SAVE
10020 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10021 bfd_put_32 (obfd, STD_R2_40R1, p), p += 4;
10022 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10023 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10024 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10026 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
10029 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10032 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10033 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10035 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10036 if (plt_static_chain)
10037 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
10043 if (ALWAYS_EMIT_R2SAVE
10044 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10045 r[0].r_offset += 4;
10046 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10047 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10049 r[1].r_offset = r[0].r_offset + 4;
10050 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10051 r[1].r_addend = r[0].r_addend;
10055 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10056 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10057 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10058 if (plt_static_chain)
10060 r[2].r_offset = r[1].r_offset + 4;
10061 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10062 r[2].r_addend = r[0].r_addend + 8;
10066 if (ALWAYS_EMIT_R2SAVE
10067 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10068 bfd_put_32 (obfd, STD_R2_40R1, p), p += 4;
10069 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
10070 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10072 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10075 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10078 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10079 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10081 if (plt_static_chain)
10082 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10083 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
10085 if (plt_thread_safe && !use_fake_dep)
10087 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10088 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
10089 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
10092 bfd_put_32 (obfd, BCTR, p), p += 4;
10096 /* Build a special .plt call stub for __tls_get_addr. */
10098 #define LD_R11_0R3 0xe9630000
10099 #define LD_R12_0R3 0xe9830000
10100 #define MR_R0_R3 0x7c601b78
10101 #define CMPDI_R11_0 0x2c2b0000
10102 #define ADD_R3_R12_R13 0x7c6c6a14
10103 #define BEQLR 0x4d820020
10104 #define MR_R3_R0 0x7c030378
10105 #define MFLR_R11 0x7d6802a6
10106 #define STD_R11_0R1 0xf9610000
10107 #define BCTRL 0x4e800421
10108 #define LD_R11_0R1 0xe9610000
10109 #define LD_R2_0R1 0xe8410000
10110 #define MTLR_R11 0x7d6803a6
10112 static inline bfd_byte *
10113 build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10114 struct ppc_stub_hash_entry *stub_entry,
10115 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10117 bfd *obfd = htab->stub_bfd;
10119 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10120 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10121 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10122 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10123 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10124 bfd_put_32 (obfd, BEQLR, p), p += 4;
10125 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
10126 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
10127 bfd_put_32 (obfd, STD_R11_0R1 + 32, p), p += 4;
10130 r[0].r_offset += 9 * 4;
10131 p = build_plt_stub (htab, stub_entry, p, offset, r);
10132 bfd_put_32 (obfd, BCTRL, p - 4);
10134 bfd_put_32 (obfd, LD_R11_0R1 + 32, p), p += 4;
10135 bfd_put_32 (obfd, LD_R2_0R1 + 40, p), p += 4;
10136 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10137 bfd_put_32 (obfd, BLR, p), p += 4;
10142 static Elf_Internal_Rela *
10143 get_relocs (asection *sec, int count)
10145 Elf_Internal_Rela *relocs;
10146 struct bfd_elf_section_data *elfsec_data;
10148 elfsec_data = elf_section_data (sec);
10149 relocs = elfsec_data->relocs;
10150 if (relocs == NULL)
10152 bfd_size_type relsize;
10153 relsize = sec->reloc_count * sizeof (*relocs);
10154 relocs = bfd_alloc (sec->owner, relsize);
10155 if (relocs == NULL)
10157 elfsec_data->relocs = relocs;
10158 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10159 sizeof (Elf_Internal_Shdr));
10160 if (elfsec_data->rela.hdr == NULL)
10162 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10163 * sizeof (Elf64_External_Rela));
10164 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
10165 sec->reloc_count = 0;
10167 relocs += sec->reloc_count;
10168 sec->reloc_count += count;
10173 get_r2off (struct bfd_link_info *info,
10174 struct ppc_stub_hash_entry *stub_entry)
10176 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10177 bfd_vma r2off = htab->stub_group[stub_entry->target_section->id].toc_off;
10181 /* Support linking -R objects. Get the toc pointer from the
10184 asection *opd = stub_entry->h->elf.root.u.def.section;
10185 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
10187 if (strcmp (opd->name, ".opd") != 0
10188 || opd->reloc_count != 0)
10190 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%T'\n"),
10191 stub_entry->h->elf.root.root.string);
10192 bfd_set_error (bfd_error_bad_value);
10195 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
10197 r2off = bfd_get_64 (opd->owner, buf);
10198 r2off -= elf_gp (info->output_bfd);
10200 r2off -= htab->stub_group[stub_entry->id_sec->id].toc_off;
10205 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10207 struct ppc_stub_hash_entry *stub_entry;
10208 struct ppc_branch_hash_entry *br_entry;
10209 struct bfd_link_info *info;
10210 struct ppc_link_hash_table *htab;
10215 Elf_Internal_Rela *r;
10218 /* Massage our args to the form they really have. */
10219 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10222 htab = ppc_hash_table (info);
10226 /* Make a note of the offset within the stubs for this entry. */
10227 stub_entry->stub_offset = stub_entry->stub_sec->size;
10228 loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
10230 htab->stub_count[stub_entry->stub_type - 1] += 1;
10231 switch (stub_entry->stub_type)
10233 case ppc_stub_long_branch:
10234 case ppc_stub_long_branch_r2off:
10235 /* Branches are relative. This is where we are going to. */
10236 off = dest = (stub_entry->target_value
10237 + stub_entry->target_section->output_offset
10238 + stub_entry->target_section->output_section->vma);
10240 /* And this is where we are coming from. */
10241 off -= (stub_entry->stub_offset
10242 + stub_entry->stub_sec->output_offset
10243 + stub_entry->stub_sec->output_section->vma);
10246 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10248 bfd_vma r2off = get_r2off (info, stub_entry);
10252 htab->stub_error = TRUE;
10255 bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
10258 if (PPC_HA (r2off) != 0)
10261 bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
10264 bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
10268 bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
10270 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10272 info->callbacks->einfo
10273 (_("%P: long branch stub `%s' offset overflow\n"),
10274 stub_entry->root.string);
10275 htab->stub_error = TRUE;
10279 if (info->emitrelocations)
10281 r = get_relocs (stub_entry->stub_sec, 1);
10284 r->r_offset = loc - stub_entry->stub_sec->contents;
10285 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
10286 r->r_addend = dest;
10287 if (stub_entry->h != NULL)
10289 struct elf_link_hash_entry **hashes;
10290 unsigned long symndx;
10291 struct ppc_link_hash_entry *h;
10293 hashes = elf_sym_hashes (htab->stub_bfd);
10294 if (hashes == NULL)
10296 bfd_size_type hsize;
10298 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
10299 hashes = bfd_zalloc (htab->stub_bfd, hsize);
10300 if (hashes == NULL)
10302 elf_sym_hashes (htab->stub_bfd) = hashes;
10303 htab->stub_globals = 1;
10305 symndx = htab->stub_globals++;
10307 hashes[symndx] = &h->elf;
10308 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
10309 if (h->oh != NULL && h->oh->is_func)
10310 h = ppc_follow_link (h->oh);
10311 if (h->elf.root.u.def.section != stub_entry->target_section)
10312 /* H is an opd symbol. The addend must be zero. */
10316 off = (h->elf.root.u.def.value
10317 + h->elf.root.u.def.section->output_offset
10318 + h->elf.root.u.def.section->output_section->vma);
10319 r->r_addend -= off;
10325 case ppc_stub_plt_branch:
10326 case ppc_stub_plt_branch_r2off:
10327 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10328 stub_entry->root.string + 9,
10330 if (br_entry == NULL)
10332 info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
10333 stub_entry->root.string);
10334 htab->stub_error = TRUE;
10338 dest = (stub_entry->target_value
10339 + stub_entry->target_section->output_offset
10340 + stub_entry->target_section->output_section->vma);
10342 bfd_put_64 (htab->brlt->owner, dest,
10343 htab->brlt->contents + br_entry->offset);
10345 if (br_entry->iter == htab->stub_iteration)
10347 br_entry->iter = 0;
10349 if (htab->relbrlt != NULL)
10351 /* Create a reloc for the branch lookup table entry. */
10352 Elf_Internal_Rela rela;
10355 rela.r_offset = (br_entry->offset
10356 + htab->brlt->output_offset
10357 + htab->brlt->output_section->vma);
10358 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10359 rela.r_addend = dest;
10361 rl = htab->relbrlt->contents;
10362 rl += (htab->relbrlt->reloc_count++
10363 * sizeof (Elf64_External_Rela));
10364 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
10366 else if (info->emitrelocations)
10368 r = get_relocs (htab->brlt, 1);
10371 /* brlt, being SEC_LINKER_CREATED does not go through the
10372 normal reloc processing. Symbols and offsets are not
10373 translated from input file to output file form, so
10374 set up the offset per the output file. */
10375 r->r_offset = (br_entry->offset
10376 + htab->brlt->output_offset
10377 + htab->brlt->output_section->vma);
10378 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10379 r->r_addend = dest;
10383 dest = (br_entry->offset
10384 + htab->brlt->output_offset
10385 + htab->brlt->output_section->vma);
10388 - elf_gp (htab->brlt->output_section->owner)
10389 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10391 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10393 info->callbacks->einfo
10394 (_("%P: linkage table error against `%T'\n"),
10395 stub_entry->root.string);
10396 bfd_set_error (bfd_error_bad_value);
10397 htab->stub_error = TRUE;
10401 if (info->emitrelocations)
10403 r = get_relocs (stub_entry->stub_sec, 1 + (PPC_HA (off) != 0));
10406 r[0].r_offset = loc - stub_entry->stub_sec->contents;
10407 if (bfd_big_endian (info->output_bfd))
10408 r[0].r_offset += 2;
10409 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
10410 r[0].r_offset += 4;
10411 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10412 r[0].r_addend = dest;
10413 if (PPC_HA (off) != 0)
10415 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10416 r[1].r_offset = r[0].r_offset + 4;
10417 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10418 r[1].r_addend = r[0].r_addend;
10422 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10424 if (PPC_HA (off) != 0)
10427 bfd_put_32 (htab->stub_bfd, ADDIS_R11_R2 | PPC_HA (off), loc);
10429 bfd_put_32 (htab->stub_bfd, LD_R12_0R11 | PPC_LO (off), loc);
10434 bfd_put_32 (htab->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
10439 bfd_vma r2off = get_r2off (info, stub_entry);
10443 htab->stub_error = TRUE;
10447 bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
10450 if (PPC_HA (off) != 0)
10453 bfd_put_32 (htab->stub_bfd, ADDIS_R11_R2 | PPC_HA (off), loc);
10455 bfd_put_32 (htab->stub_bfd, LD_R12_0R11 | PPC_LO (off), loc);
10460 bfd_put_32 (htab->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
10464 if (PPC_HA (r2off) != 0)
10467 bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
10470 bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
10473 bfd_put_32 (htab->stub_bfd, MTCTR_R12, loc);
10475 bfd_put_32 (htab->stub_bfd, BCTR, loc);
10478 case ppc_stub_plt_call:
10479 case ppc_stub_plt_call_r2save:
10480 if (stub_entry->h != NULL
10481 && stub_entry->h->is_func_descriptor
10482 && stub_entry->h->oh != NULL)
10484 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
10486 /* If the old-ABI "dot-symbol" is undefined make it weak so
10487 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL.
10488 FIXME: We used to define the symbol on one of the call
10489 stubs instead, which is why we test symbol section id
10490 against htab->top_id in various places. Likely all
10491 these checks could now disappear. */
10492 if (fh->elf.root.type == bfd_link_hash_undefined)
10493 fh->elf.root.type = bfd_link_hash_undefweak;
10494 /* Stop undo_symbol_twiddle changing it back to undefined. */
10495 fh->was_undefined = 0;
10498 /* Now build the stub. */
10499 dest = stub_entry->plt_ent->plt.offset & ~1;
10500 if (dest >= (bfd_vma) -2)
10504 if (!htab->elf.dynamic_sections_created
10505 || stub_entry->h == NULL
10506 || stub_entry->h->elf.dynindx == -1)
10509 dest += plt->output_offset + plt->output_section->vma;
10511 if (stub_entry->h == NULL
10512 && (stub_entry->plt_ent->plt.offset & 1) == 0)
10514 Elf_Internal_Rela rela;
10517 rela.r_offset = dest;
10519 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
10521 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
10522 rela.r_addend = (stub_entry->target_value
10523 + stub_entry->target_section->output_offset
10524 + stub_entry->target_section->output_section->vma);
10526 rl = (htab->reliplt->contents
10527 + (htab->reliplt->reloc_count++
10528 * sizeof (Elf64_External_Rela)));
10529 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
10530 stub_entry->plt_ent->plt.offset |= 1;
10534 - elf_gp (plt->output_section->owner)
10535 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10537 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10539 info->callbacks->einfo
10540 (_("%P: linkage table error against `%T'\n"),
10541 stub_entry->h != NULL
10542 ? stub_entry->h->elf.root.root.string
10544 bfd_set_error (bfd_error_bad_value);
10545 htab->stub_error = TRUE;
10549 if (htab->plt_stub_align != 0)
10551 unsigned pad = plt_stub_pad (htab, stub_entry, off);
10553 stub_entry->stub_sec->size += pad;
10554 stub_entry->stub_offset = stub_entry->stub_sec->size;
10559 if (info->emitrelocations)
10561 r = get_relocs (stub_entry->stub_sec,
10563 + (PPC_HA (off) != 0)
10564 + (htab->plt_static_chain
10565 && PPC_HA (off + 16) == PPC_HA (off))));
10568 r[0].r_offset = loc - stub_entry->stub_sec->contents;
10569 if (bfd_big_endian (info->output_bfd))
10570 r[0].r_offset += 2;
10571 r[0].r_addend = dest;
10573 if (stub_entry->h != NULL
10574 && (stub_entry->h == htab->tls_get_addr_fd
10575 || stub_entry->h == htab->tls_get_addr)
10576 && !htab->no_tls_get_addr_opt)
10577 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
10579 p = build_plt_stub (htab, stub_entry, loc, off, r);
10588 stub_entry->stub_sec->size += size;
10590 if (htab->emit_stub_syms)
10592 struct elf_link_hash_entry *h;
10595 const char *const stub_str[] = { "long_branch",
10596 "long_branch_r2off",
10598 "plt_branch_r2off",
10602 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
10603 len2 = strlen (stub_entry->root.string);
10604 name = bfd_malloc (len1 + len2 + 2);
10607 memcpy (name, stub_entry->root.string, 9);
10608 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
10609 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
10610 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
10613 if (h->root.type == bfd_link_hash_new)
10615 h->root.type = bfd_link_hash_defined;
10616 h->root.u.def.section = stub_entry->stub_sec;
10617 h->root.u.def.value = stub_entry->stub_offset;
10618 h->ref_regular = 1;
10619 h->def_regular = 1;
10620 h->ref_regular_nonweak = 1;
10621 h->forced_local = 1;
10629 /* As above, but don't actually build the stub. Just bump offset so
10630 we know stub section sizes, and select plt_branch stubs where
10631 long_branch stubs won't do. */
10634 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10636 struct ppc_stub_hash_entry *stub_entry;
10637 struct bfd_link_info *info;
10638 struct ppc_link_hash_table *htab;
10642 /* Massage our args to the form they really have. */
10643 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10646 htab = ppc_hash_table (info);
10650 if (stub_entry->stub_type == ppc_stub_plt_call
10651 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10654 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
10655 if (off >= (bfd_vma) -2)
10658 if (!htab->elf.dynamic_sections_created
10659 || stub_entry->h == NULL
10660 || stub_entry->h->elf.dynindx == -1)
10662 off += (plt->output_offset
10663 + plt->output_section->vma
10664 - elf_gp (plt->output_section->owner)
10665 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10667 size = plt_stub_size (htab, stub_entry, off);
10668 if (htab->plt_stub_align)
10669 size += plt_stub_pad (htab, stub_entry, off);
10670 if (info->emitrelocations)
10672 stub_entry->stub_sec->reloc_count
10674 + (PPC_HA (off) != 0)
10675 + (htab->plt_static_chain
10676 && PPC_HA (off + 16) == PPC_HA (off)));
10677 stub_entry->stub_sec->flags |= SEC_RELOC;
10682 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
10686 off = (stub_entry->target_value
10687 + stub_entry->target_section->output_offset
10688 + stub_entry->target_section->output_section->vma);
10689 off -= (stub_entry->stub_sec->size
10690 + stub_entry->stub_sec->output_offset
10691 + stub_entry->stub_sec->output_section->vma);
10693 /* Reset the stub type from the plt variant in case we now
10694 can reach with a shorter stub. */
10695 if (stub_entry->stub_type >= ppc_stub_plt_branch)
10696 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
10699 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10701 r2off = get_r2off (info, stub_entry);
10704 htab->stub_error = TRUE;
10708 if (PPC_HA (r2off) != 0)
10713 /* If the branch offset if too big, use a ppc_stub_plt_branch. */
10714 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10716 struct ppc_branch_hash_entry *br_entry;
10718 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10719 stub_entry->root.string + 9,
10721 if (br_entry == NULL)
10723 info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
10724 stub_entry->root.string);
10725 htab->stub_error = TRUE;
10729 if (br_entry->iter != htab->stub_iteration)
10731 br_entry->iter = htab->stub_iteration;
10732 br_entry->offset = htab->brlt->size;
10733 htab->brlt->size += 8;
10735 if (htab->relbrlt != NULL)
10736 htab->relbrlt->size += sizeof (Elf64_External_Rela);
10737 else if (info->emitrelocations)
10739 htab->brlt->reloc_count += 1;
10740 htab->brlt->flags |= SEC_RELOC;
10744 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
10745 off = (br_entry->offset
10746 + htab->brlt->output_offset
10747 + htab->brlt->output_section->vma
10748 - elf_gp (htab->brlt->output_section->owner)
10749 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10751 if (info->emitrelocations)
10753 stub_entry->stub_sec->reloc_count += 1 + (PPC_HA (off) != 0);
10754 stub_entry->stub_sec->flags |= SEC_RELOC;
10757 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10760 if (PPC_HA (off) != 0)
10766 if (PPC_HA (off) != 0)
10769 if (PPC_HA (r2off) != 0)
10773 else if (info->emitrelocations)
10775 stub_entry->stub_sec->reloc_count += 1;
10776 stub_entry->stub_sec->flags |= SEC_RELOC;
10780 stub_entry->stub_sec->size += size;
10784 /* Set up various things so that we can make a list of input sections
10785 for each output section included in the link. Returns -1 on error,
10786 0 when no stubs will be needed, and 1 on success. */
10789 ppc64_elf_setup_section_lists
10790 (struct bfd_link_info *info,
10791 asection *(*add_stub_section) (const char *, asection *),
10792 void (*layout_sections_again) (void))
10795 int top_id, top_index, id;
10797 asection **input_list;
10799 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10803 /* Stash our params away. */
10804 htab->add_stub_section = add_stub_section;
10805 htab->layout_sections_again = layout_sections_again;
10807 /* Find the top input section id. */
10808 for (input_bfd = info->input_bfds, top_id = 3;
10810 input_bfd = input_bfd->link_next)
10812 for (section = input_bfd->sections;
10814 section = section->next)
10816 if (top_id < section->id)
10817 top_id = section->id;
10821 htab->top_id = top_id;
10822 amt = sizeof (struct map_stub) * (top_id + 1);
10823 htab->stub_group = bfd_zmalloc (amt);
10824 if (htab->stub_group == NULL)
10827 /* Set toc_off for com, und, abs and ind sections. */
10828 for (id = 0; id < 3; id++)
10829 htab->stub_group[id].toc_off = TOC_BASE_OFF;
10831 /* We can't use output_bfd->section_count here to find the top output
10832 section index as some sections may have been removed, and
10833 strip_excluded_output_sections doesn't renumber the indices. */
10834 for (section = info->output_bfd->sections, top_index = 0;
10836 section = section->next)
10838 if (top_index < section->index)
10839 top_index = section->index;
10842 htab->top_index = top_index;
10843 amt = sizeof (asection *) * (top_index + 1);
10844 input_list = bfd_zmalloc (amt);
10845 htab->input_list = input_list;
10846 if (input_list == NULL)
10852 /* Set up for first pass at multitoc partitioning. */
10855 ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
10857 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10859 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
10860 htab->toc_bfd = NULL;
10861 htab->toc_first_sec = NULL;
10864 /* The linker repeatedly calls this function for each TOC input section
10865 and linker generated GOT section. Group input bfds such that the toc
10866 within a group is less than 64k in size. */
10869 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
10871 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10872 bfd_vma addr, off, limit;
10877 if (!htab->second_toc_pass)
10879 /* Keep track of the first .toc or .got section for this input bfd. */
10880 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
10884 htab->toc_bfd = isec->owner;
10885 htab->toc_first_sec = isec;
10888 addr = isec->output_offset + isec->output_section->vma;
10889 off = addr - htab->toc_curr;
10890 limit = 0x80008000;
10891 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
10893 if (off + isec->size > limit)
10895 addr = (htab->toc_first_sec->output_offset
10896 + htab->toc_first_sec->output_section->vma);
10897 htab->toc_curr = addr;
10900 /* toc_curr is the base address of this toc group. Set elf_gp
10901 for the input section to be the offset relative to the
10902 output toc base plus 0x8000. Making the input elf_gp an
10903 offset allows us to move the toc as a whole without
10904 recalculating input elf_gp. */
10905 off = htab->toc_curr - elf_gp (isec->output_section->owner);
10906 off += TOC_BASE_OFF;
10908 /* Die if someone uses a linker script that doesn't keep input
10909 file .toc and .got together. */
10911 && elf_gp (isec->owner) != 0
10912 && elf_gp (isec->owner) != off)
10915 elf_gp (isec->owner) = off;
10919 /* During the second pass toc_first_sec points to the start of
10920 a toc group, and toc_curr is used to track the old elf_gp.
10921 We use toc_bfd to ensure we only look at each bfd once. */
10922 if (htab->toc_bfd == isec->owner)
10924 htab->toc_bfd = isec->owner;
10926 if (htab->toc_first_sec == NULL
10927 || htab->toc_curr != elf_gp (isec->owner))
10929 htab->toc_curr = elf_gp (isec->owner);
10930 htab->toc_first_sec = isec;
10932 addr = (htab->toc_first_sec->output_offset
10933 + htab->toc_first_sec->output_section->vma);
10934 off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
10935 elf_gp (isec->owner) = off;
10940 /* Called via elf_link_hash_traverse to merge GOT entries for global
10944 merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
10946 if (h->root.type == bfd_link_hash_indirect)
10949 merge_got_entries (&h->got.glist);
10954 /* Called via elf_link_hash_traverse to allocate GOT entries for global
10958 reallocate_got (struct elf_link_hash_entry *h, void *inf)
10960 struct got_entry *gent;
10962 if (h->root.type == bfd_link_hash_indirect)
10965 for (gent = h->got.glist; gent != NULL; gent = gent->next)
10966 if (!gent->is_indirect)
10967 allocate_got (h, (struct bfd_link_info *) inf, gent);
10971 /* Called on the first multitoc pass after the last call to
10972 ppc64_elf_next_toc_section. This function removes duplicate GOT
10976 ppc64_elf_layout_multitoc (struct bfd_link_info *info)
10978 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10979 struct bfd *ibfd, *ibfd2;
10980 bfd_boolean done_something;
10982 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
10984 if (!htab->do_multi_toc)
10987 /* Merge global sym got entries within a toc group. */
10988 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
10990 /* And tlsld_got. */
10991 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10993 struct got_entry *ent, *ent2;
10995 if (!is_ppc64_elf (ibfd))
10998 ent = ppc64_tlsld_got (ibfd);
10999 if (!ent->is_indirect
11000 && ent->got.offset != (bfd_vma) -1)
11002 for (ibfd2 = ibfd->link_next; ibfd2 != NULL; ibfd2 = ibfd2->link_next)
11004 if (!is_ppc64_elf (ibfd2))
11007 ent2 = ppc64_tlsld_got (ibfd2);
11008 if (!ent2->is_indirect
11009 && ent2->got.offset != (bfd_vma) -1
11010 && elf_gp (ibfd2) == elf_gp (ibfd))
11012 ent2->is_indirect = TRUE;
11013 ent2->got.ent = ent;
11019 /* Zap sizes of got sections. */
11020 htab->reliplt->rawsize = htab->reliplt->size;
11021 htab->reliplt->size -= htab->got_reli_size;
11022 htab->got_reli_size = 0;
11024 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11026 asection *got, *relgot;
11028 if (!is_ppc64_elf (ibfd))
11031 got = ppc64_elf_tdata (ibfd)->got;
11034 got->rawsize = got->size;
11036 relgot = ppc64_elf_tdata (ibfd)->relgot;
11037 relgot->rawsize = relgot->size;
11042 /* Now reallocate the got, local syms first. We don't need to
11043 allocate section contents again since we never increase size. */
11044 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11046 struct got_entry **lgot_ents;
11047 struct got_entry **end_lgot_ents;
11048 struct plt_entry **local_plt;
11049 struct plt_entry **end_local_plt;
11050 unsigned char *lgot_masks;
11051 bfd_size_type locsymcount;
11052 Elf_Internal_Shdr *symtab_hdr;
11055 if (!is_ppc64_elf (ibfd))
11058 lgot_ents = elf_local_got_ents (ibfd);
11062 symtab_hdr = &elf_symtab_hdr (ibfd);
11063 locsymcount = symtab_hdr->sh_info;
11064 end_lgot_ents = lgot_ents + locsymcount;
11065 local_plt = (struct plt_entry **) end_lgot_ents;
11066 end_local_plt = local_plt + locsymcount;
11067 lgot_masks = (unsigned char *) end_local_plt;
11068 s = ppc64_elf_tdata (ibfd)->got;
11069 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11071 struct got_entry *ent;
11073 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
11075 unsigned int ent_size = 8;
11076 unsigned int rel_size = sizeof (Elf64_External_Rela);
11078 ent->got.offset = s->size;
11079 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
11084 s->size += ent_size;
11085 if ((*lgot_masks & PLT_IFUNC) != 0)
11087 htab->reliplt->size += rel_size;
11088 htab->got_reli_size += rel_size;
11090 else if (info->shared)
11092 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11093 srel->size += rel_size;
11099 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
11101 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11103 struct got_entry *ent;
11105 if (!is_ppc64_elf (ibfd))
11108 ent = ppc64_tlsld_got (ibfd);
11109 if (!ent->is_indirect
11110 && ent->got.offset != (bfd_vma) -1)
11112 asection *s = ppc64_elf_tdata (ibfd)->got;
11113 ent->got.offset = s->size;
11117 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11118 srel->size += sizeof (Elf64_External_Rela);
11123 done_something = htab->reliplt->rawsize != htab->reliplt->size;
11124 if (!done_something)
11125 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11129 if (!is_ppc64_elf (ibfd))
11132 got = ppc64_elf_tdata (ibfd)->got;
11135 done_something = got->rawsize != got->size;
11136 if (done_something)
11141 if (done_something)
11142 (*htab->layout_sections_again) ();
11144 /* Set up for second pass over toc sections to recalculate elf_gp
11145 on input sections. */
11146 htab->toc_bfd = NULL;
11147 htab->toc_first_sec = NULL;
11148 htab->second_toc_pass = TRUE;
11149 return done_something;
11152 /* Called after second pass of multitoc partitioning. */
11155 ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
11157 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11159 /* After the second pass, toc_curr tracks the TOC offset used
11160 for code sections below in ppc64_elf_next_input_section. */
11161 htab->toc_curr = TOC_BASE_OFF;
11164 /* No toc references were found in ISEC. If the code in ISEC makes no
11165 calls, then there's no need to use toc adjusting stubs when branching
11166 into ISEC. Actually, indirect calls from ISEC are OK as they will
11167 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11168 needed, and 2 if a cyclical call-graph was found but no other reason
11169 for a stub was detected. If called from the top level, a return of
11170 2 means the same as a return of 0. */
11173 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
11177 /* Mark this section as checked. */
11178 isec->call_check_done = 1;
11180 /* We know none of our code bearing sections will need toc stubs. */
11181 if ((isec->flags & SEC_LINKER_CREATED) != 0)
11184 if (isec->size == 0)
11187 if (isec->output_section == NULL)
11191 if (isec->reloc_count != 0)
11193 Elf_Internal_Rela *relstart, *rel;
11194 Elf_Internal_Sym *local_syms;
11195 struct ppc_link_hash_table *htab;
11197 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
11198 info->keep_memory);
11199 if (relstart == NULL)
11202 /* Look for branches to outside of this section. */
11204 htab = ppc_hash_table (info);
11208 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
11210 enum elf_ppc64_reloc_type r_type;
11211 unsigned long r_symndx;
11212 struct elf_link_hash_entry *h;
11213 struct ppc_link_hash_entry *eh;
11214 Elf_Internal_Sym *sym;
11216 struct _opd_sec_data *opd;
11220 r_type = ELF64_R_TYPE (rel->r_info);
11221 if (r_type != R_PPC64_REL24
11222 && r_type != R_PPC64_REL14
11223 && r_type != R_PPC64_REL14_BRTAKEN
11224 && r_type != R_PPC64_REL14_BRNTAKEN)
11227 r_symndx = ELF64_R_SYM (rel->r_info);
11228 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
11235 /* Calls to dynamic lib functions go through a plt call stub
11237 eh = (struct ppc_link_hash_entry *) h;
11239 && (eh->elf.plt.plist != NULL
11241 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
11247 if (sym_sec == NULL)
11248 /* Ignore other undefined symbols. */
11251 /* Assume branches to other sections not included in the
11252 link need stubs too, to cover -R and absolute syms. */
11253 if (sym_sec->output_section == NULL)
11260 sym_value = sym->st_value;
11263 if (h->root.type != bfd_link_hash_defined
11264 && h->root.type != bfd_link_hash_defweak)
11266 sym_value = h->root.u.def.value;
11268 sym_value += rel->r_addend;
11270 /* If this branch reloc uses an opd sym, find the code section. */
11271 opd = get_opd_info (sym_sec);
11274 if (h == NULL && opd->adjust != NULL)
11278 adjust = opd->adjust[sym->st_value / 8];
11280 /* Assume deleted functions won't ever be called. */
11282 sym_value += adjust;
11285 dest = opd_entry_value (sym_sec, sym_value,
11286 &sym_sec, NULL, FALSE);
11287 if (dest == (bfd_vma) -1)
11292 + sym_sec->output_offset
11293 + sym_sec->output_section->vma);
11295 /* Ignore branch to self. */
11296 if (sym_sec == isec)
11299 /* If the called function uses the toc, we need a stub. */
11300 if (sym_sec->has_toc_reloc
11301 || sym_sec->makes_toc_func_call)
11307 /* Assume any branch that needs a long branch stub might in fact
11308 need a plt_branch stub. A plt_branch stub uses r2. */
11309 else if (dest - (isec->output_offset
11310 + isec->output_section->vma
11311 + rel->r_offset) + (1 << 25) >= (2 << 25))
11317 /* If calling back to a section in the process of being
11318 tested, we can't say for sure that no toc adjusting stubs
11319 are needed, so don't return zero. */
11320 else if (sym_sec->call_check_in_progress)
11323 /* Branches to another section that itself doesn't have any TOC
11324 references are OK. Recursively call ourselves to check. */
11325 else if (!sym_sec->call_check_done)
11329 /* Mark current section as indeterminate, so that other
11330 sections that call back to current won't be marked as
11332 isec->call_check_in_progress = 1;
11333 recur = toc_adjusting_stub_needed (info, sym_sec);
11334 isec->call_check_in_progress = 0;
11345 if (local_syms != NULL
11346 && (elf_symtab_hdr (isec->owner).contents
11347 != (unsigned char *) local_syms))
11349 if (elf_section_data (isec)->relocs != relstart)
11354 && isec->map_head.s != NULL
11355 && (strcmp (isec->output_section->name, ".init") == 0
11356 || strcmp (isec->output_section->name, ".fini") == 0))
11358 if (isec->map_head.s->has_toc_reloc
11359 || isec->map_head.s->makes_toc_func_call)
11361 else if (!isec->map_head.s->call_check_done)
11364 isec->call_check_in_progress = 1;
11365 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
11366 isec->call_check_in_progress = 0;
11373 isec->makes_toc_func_call = 1;
11378 /* The linker repeatedly calls this function for each input section,
11379 in the order that input sections are linked into output sections.
11380 Build lists of input sections to determine groupings between which
11381 we may insert linker stubs. */
11384 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
11386 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11391 if ((isec->output_section->flags & SEC_CODE) != 0
11392 && isec->output_section->index <= htab->top_index)
11394 asection **list = htab->input_list + isec->output_section->index;
11395 /* Steal the link_sec pointer for our list. */
11396 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
11397 /* This happens to make the list in reverse order,
11398 which is what we want. */
11399 PREV_SEC (isec) = *list;
11403 if (htab->multi_toc_needed)
11405 /* If a code section has a function that uses the TOC then we need
11406 to use the right TOC (obviously). Also, make sure that .opd gets
11407 the correct TOC value for R_PPC64_TOC relocs that don't have or
11408 can't find their function symbol (shouldn't ever happen now).
11409 Also specially treat .fixup for the linux kernel. .fixup
11410 contains branches, but only back to the function that hit an
11412 if (isec->has_toc_reloc
11413 || (isec->flags & SEC_CODE) == 0
11414 || strcmp (isec->name, ".fixup") == 0)
11416 if (elf_gp (isec->owner) != 0)
11417 htab->toc_curr = elf_gp (isec->owner);
11421 if (!isec->call_check_done
11422 && toc_adjusting_stub_needed (info, isec) < 0)
11424 /* If we make a local call from this section, ie. a branch
11425 without a following nop, then we have no place to put a
11426 toc restoring insn. We must use the same toc group as
11428 Testing makes_toc_func_call actually tests for *any*
11429 calls to functions that need a good toc pointer. A more
11430 precise test would be better, as this one will set
11431 incorrect values for pasted .init/.fini fragments.
11432 (Fixed later in check_pasted_section.) */
11433 if (isec->makes_toc_func_call
11434 && elf_gp (isec->owner) != 0)
11435 htab->toc_curr = elf_gp (isec->owner);
11439 /* Functions that don't use the TOC can belong in any TOC group.
11440 Use the last TOC base. */
11441 htab->stub_group[isec->id].toc_off = htab->toc_curr;
11445 /* Check that all .init and .fini sections use the same toc, if they
11446 have toc relocs. */
11449 check_pasted_section (struct bfd_link_info *info, const char *name)
11451 asection *o = bfd_get_section_by_name (info->output_bfd, name);
11455 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11456 bfd_vma toc_off = 0;
11459 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11460 if (i->has_toc_reloc)
11463 toc_off = htab->stub_group[i->id].toc_off;
11464 else if (toc_off != htab->stub_group[i->id].toc_off)
11469 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11470 if (i->makes_toc_func_call)
11472 toc_off = htab->stub_group[i->id].toc_off;
11476 /* Make sure the whole pasted function uses the same toc offset. */
11478 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11479 htab->stub_group[i->id].toc_off = toc_off;
11485 ppc64_elf_check_init_fini (struct bfd_link_info *info)
11487 return (check_pasted_section (info, ".init")
11488 & check_pasted_section (info, ".fini"));
11491 /* See whether we can group stub sections together. Grouping stub
11492 sections may result in fewer stubs. More importantly, we need to
11493 put all .init* and .fini* stubs at the beginning of the .init or
11494 .fini output sections respectively, because glibc splits the
11495 _init and _fini functions into multiple parts. Putting a stub in
11496 the middle of a function is not a good idea. */
11499 group_sections (struct ppc_link_hash_table *htab,
11500 bfd_size_type stub_group_size,
11501 bfd_boolean stubs_always_before_branch)
11504 bfd_size_type stub14_group_size;
11505 bfd_boolean suppress_size_errors;
11507 suppress_size_errors = FALSE;
11508 stub14_group_size = stub_group_size;
11509 if (stub_group_size == 1)
11511 /* Default values. */
11512 if (stubs_always_before_branch)
11514 stub_group_size = 0x1e00000;
11515 stub14_group_size = 0x7800;
11519 stub_group_size = 0x1c00000;
11520 stub14_group_size = 0x7000;
11522 suppress_size_errors = TRUE;
11525 list = htab->input_list + htab->top_index;
11528 asection *tail = *list;
11529 while (tail != NULL)
11533 bfd_size_type total;
11534 bfd_boolean big_sec;
11538 total = tail->size;
11539 big_sec = total > (ppc64_elf_section_data (tail) != NULL
11540 && ppc64_elf_section_data (tail)->has_14bit_branch
11541 ? stub14_group_size : stub_group_size);
11542 if (big_sec && !suppress_size_errors)
11543 (*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
11544 tail->owner, tail);
11545 curr_toc = htab->stub_group[tail->id].toc_off;
11547 while ((prev = PREV_SEC (curr)) != NULL
11548 && ((total += curr->output_offset - prev->output_offset)
11549 < (ppc64_elf_section_data (prev) != NULL
11550 && ppc64_elf_section_data (prev)->has_14bit_branch
11551 ? stub14_group_size : stub_group_size))
11552 && htab->stub_group[prev->id].toc_off == curr_toc)
11555 /* OK, the size from the start of CURR to the end is less
11556 than stub_group_size and thus can be handled by one stub
11557 section. (or the tail section is itself larger than
11558 stub_group_size, in which case we may be toast.) We
11559 should really be keeping track of the total size of stubs
11560 added here, as stubs contribute to the final output
11561 section size. That's a little tricky, and this way will
11562 only break if stubs added make the total size more than
11563 2^25, ie. for the default stub_group_size, if stubs total
11564 more than 2097152 bytes, or nearly 75000 plt call stubs. */
11567 prev = PREV_SEC (tail);
11568 /* Set up this stub group. */
11569 htab->stub_group[tail->id].link_sec = curr;
11571 while (tail != curr && (tail = prev) != NULL);
11573 /* But wait, there's more! Input sections up to stub_group_size
11574 bytes before the stub section can be handled by it too.
11575 Don't do this if we have a really large section after the
11576 stubs, as adding more stubs increases the chance that
11577 branches may not reach into the stub section. */
11578 if (!stubs_always_before_branch && !big_sec)
11581 while (prev != NULL
11582 && ((total += tail->output_offset - prev->output_offset)
11583 < (ppc64_elf_section_data (prev) != NULL
11584 && ppc64_elf_section_data (prev)->has_14bit_branch
11585 ? stub14_group_size : stub_group_size))
11586 && htab->stub_group[prev->id].toc_off == curr_toc)
11589 prev = PREV_SEC (tail);
11590 htab->stub_group[tail->id].link_sec = curr;
11596 while (list-- != htab->input_list);
11597 free (htab->input_list);
11601 static const unsigned char glink_eh_frame_cie[] =
11603 0, 0, 0, 16, /* length. */
11604 0, 0, 0, 0, /* id. */
11605 1, /* CIE version. */
11606 'z', 'R', 0, /* Augmentation string. */
11607 4, /* Code alignment. */
11608 0x78, /* Data alignment. */
11610 1, /* Augmentation size. */
11611 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
11612 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
11615 /* Stripping output sections is normally done before dynamic section
11616 symbols have been allocated. This function is called later, and
11617 handles cases like htab->brlt which is mapped to its own output
11621 maybe_strip_output (struct bfd_link_info *info, asection *isec)
11623 if (isec->size == 0
11624 && isec->output_section->size == 0
11625 && !(isec->output_section->flags & SEC_KEEP)
11626 && !bfd_section_removed_from_list (info->output_bfd,
11627 isec->output_section)
11628 && elf_section_data (isec->output_section)->dynindx == 0)
11630 isec->output_section->flags |= SEC_EXCLUDE;
11631 bfd_section_list_remove (info->output_bfd, isec->output_section);
11632 info->output_bfd->section_count--;
11636 /* Determine and set the size of the stub section for a final link.
11638 The basic idea here is to examine all the relocations looking for
11639 PC-relative calls to a target that is unreachable with a "bl"
11643 ppc64_elf_size_stubs (struct bfd_link_info *info, bfd_signed_vma group_size,
11644 bfd_boolean plt_static_chain, int plt_thread_safe,
11645 int plt_stub_align)
11647 bfd_size_type stub_group_size;
11648 bfd_boolean stubs_always_before_branch;
11649 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11654 htab->plt_static_chain = plt_static_chain;
11655 htab->plt_stub_align = plt_stub_align;
11656 if (plt_thread_safe == -1 && !info->executable)
11657 plt_thread_safe = 1;
11658 if (plt_thread_safe == -1)
11660 static const char *const thread_starter[] =
11664 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
11666 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
11667 "mq_notify", "create_timer",
11671 "GOMP_parallel_start",
11672 "GOMP_parallel_loop_static_start",
11673 "GOMP_parallel_loop_dynamic_start",
11674 "GOMP_parallel_loop_guided_start",
11675 "GOMP_parallel_loop_runtime_start",
11676 "GOMP_parallel_sections_start",
11680 for (i = 0; i < sizeof (thread_starter)/ sizeof (thread_starter[0]); i++)
11682 struct elf_link_hash_entry *h;
11683 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
11684 FALSE, FALSE, TRUE);
11685 plt_thread_safe = h != NULL && h->ref_regular;
11686 if (plt_thread_safe)
11690 htab->plt_thread_safe = plt_thread_safe;
11691 stubs_always_before_branch = group_size < 0;
11692 if (group_size < 0)
11693 stub_group_size = -group_size;
11695 stub_group_size = group_size;
11697 group_sections (htab, stub_group_size, stubs_always_before_branch);
11702 unsigned int bfd_indx;
11703 asection *stub_sec;
11705 htab->stub_iteration += 1;
11707 for (input_bfd = info->input_bfds, bfd_indx = 0;
11709 input_bfd = input_bfd->link_next, bfd_indx++)
11711 Elf_Internal_Shdr *symtab_hdr;
11713 Elf_Internal_Sym *local_syms = NULL;
11715 if (!is_ppc64_elf (input_bfd))
11718 /* We'll need the symbol table in a second. */
11719 symtab_hdr = &elf_symtab_hdr (input_bfd);
11720 if (symtab_hdr->sh_info == 0)
11723 /* Walk over each section attached to the input bfd. */
11724 for (section = input_bfd->sections;
11726 section = section->next)
11728 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
11730 /* If there aren't any relocs, then there's nothing more
11732 if ((section->flags & SEC_RELOC) == 0
11733 || (section->flags & SEC_ALLOC) == 0
11734 || (section->flags & SEC_LOAD) == 0
11735 || (section->flags & SEC_CODE) == 0
11736 || section->reloc_count == 0)
11739 /* If this section is a link-once section that will be
11740 discarded, then don't create any stubs. */
11741 if (section->output_section == NULL
11742 || section->output_section->owner != info->output_bfd)
11745 /* Get the relocs. */
11747 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
11748 info->keep_memory);
11749 if (internal_relocs == NULL)
11750 goto error_ret_free_local;
11752 /* Now examine each relocation. */
11753 irela = internal_relocs;
11754 irelaend = irela + section->reloc_count;
11755 for (; irela < irelaend; irela++)
11757 enum elf_ppc64_reloc_type r_type;
11758 unsigned int r_indx;
11759 enum ppc_stub_type stub_type;
11760 struct ppc_stub_hash_entry *stub_entry;
11761 asection *sym_sec, *code_sec;
11762 bfd_vma sym_value, code_value;
11763 bfd_vma destination;
11764 bfd_boolean ok_dest;
11765 struct ppc_link_hash_entry *hash;
11766 struct ppc_link_hash_entry *fdh;
11767 struct elf_link_hash_entry *h;
11768 Elf_Internal_Sym *sym;
11770 const asection *id_sec;
11771 struct _opd_sec_data *opd;
11772 struct plt_entry *plt_ent;
11774 r_type = ELF64_R_TYPE (irela->r_info);
11775 r_indx = ELF64_R_SYM (irela->r_info);
11777 if (r_type >= R_PPC64_max)
11779 bfd_set_error (bfd_error_bad_value);
11780 goto error_ret_free_internal;
11783 /* Only look for stubs on branch instructions. */
11784 if (r_type != R_PPC64_REL24
11785 && r_type != R_PPC64_REL14
11786 && r_type != R_PPC64_REL14_BRTAKEN
11787 && r_type != R_PPC64_REL14_BRNTAKEN)
11790 /* Now determine the call target, its name, value,
11792 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
11793 r_indx, input_bfd))
11794 goto error_ret_free_internal;
11795 hash = (struct ppc_link_hash_entry *) h;
11802 sym_value = sym->st_value;
11805 else if (hash->elf.root.type == bfd_link_hash_defined
11806 || hash->elf.root.type == bfd_link_hash_defweak)
11808 sym_value = hash->elf.root.u.def.value;
11809 if (sym_sec->output_section != NULL)
11812 else if (hash->elf.root.type == bfd_link_hash_undefweak
11813 || hash->elf.root.type == bfd_link_hash_undefined)
11815 /* Recognise an old ABI func code entry sym, and
11816 use the func descriptor sym instead if it is
11818 if (hash->elf.root.root.string[0] == '.'
11819 && (fdh = lookup_fdh (hash, htab)) != NULL)
11821 if (fdh->elf.root.type == bfd_link_hash_defined
11822 || fdh->elf.root.type == bfd_link_hash_defweak)
11824 sym_sec = fdh->elf.root.u.def.section;
11825 sym_value = fdh->elf.root.u.def.value;
11826 if (sym_sec->output_section != NULL)
11835 bfd_set_error (bfd_error_bad_value);
11836 goto error_ret_free_internal;
11842 sym_value += irela->r_addend;
11843 destination = (sym_value
11844 + sym_sec->output_offset
11845 + sym_sec->output_section->vma);
11848 code_sec = sym_sec;
11849 code_value = sym_value;
11850 opd = get_opd_info (sym_sec);
11855 if (hash == NULL && opd->adjust != NULL)
11857 long adjust = opd->adjust[sym_value / 8];
11860 code_value += adjust;
11861 sym_value += adjust;
11863 dest = opd_entry_value (sym_sec, sym_value,
11864 &code_sec, &code_value, FALSE);
11865 if (dest != (bfd_vma) -1)
11867 destination = dest;
11870 /* Fixup old ABI sym to point at code
11872 hash->elf.root.type = bfd_link_hash_defweak;
11873 hash->elf.root.u.def.section = code_sec;
11874 hash->elf.root.u.def.value = code_value;
11879 /* Determine what (if any) linker stub is needed. */
11881 stub_type = ppc_type_of_stub (section, irela, &hash,
11882 &plt_ent, destination);
11884 if (stub_type != ppc_stub_plt_call)
11886 /* Check whether we need a TOC adjusting stub.
11887 Since the linker pastes together pieces from
11888 different object files when creating the
11889 _init and _fini functions, it may be that a
11890 call to what looks like a local sym is in
11891 fact a call needing a TOC adjustment. */
11892 if (code_sec != NULL
11893 && code_sec->output_section != NULL
11894 && (htab->stub_group[code_sec->id].toc_off
11895 != htab->stub_group[section->id].toc_off)
11896 && (code_sec->has_toc_reloc
11897 || code_sec->makes_toc_func_call))
11898 stub_type = ppc_stub_long_branch_r2off;
11901 if (stub_type == ppc_stub_none)
11904 /* __tls_get_addr calls might be eliminated. */
11905 if (stub_type != ppc_stub_plt_call
11907 && (hash == htab->tls_get_addr
11908 || hash == htab->tls_get_addr_fd)
11909 && section->has_tls_reloc
11910 && irela != internal_relocs)
11912 /* Get tls info. */
11913 unsigned char *tls_mask;
11915 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
11916 irela - 1, input_bfd))
11917 goto error_ret_free_internal;
11918 if (*tls_mask != 0)
11922 if (stub_type == ppc_stub_plt_call
11923 && irela + 1 < irelaend
11924 && irela[1].r_offset == irela->r_offset + 4
11925 && ELF64_R_TYPE (irela[1].r_info) == R_PPC64_TOCSAVE)
11927 if (!tocsave_find (htab, INSERT,
11928 &local_syms, irela + 1, input_bfd))
11929 goto error_ret_free_internal;
11931 else if (stub_type == ppc_stub_plt_call)
11932 stub_type = ppc_stub_plt_call_r2save;
11934 /* Support for grouping stub sections. */
11935 id_sec = htab->stub_group[section->id].link_sec;
11937 /* Get the name of this stub. */
11938 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
11940 goto error_ret_free_internal;
11942 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
11943 stub_name, FALSE, FALSE);
11944 if (stub_entry != NULL)
11946 /* The proper stub has already been created. */
11948 if (stub_type == ppc_stub_plt_call_r2save)
11949 stub_entry->stub_type = stub_type;
11953 stub_entry = ppc_add_stub (stub_name, section, info);
11954 if (stub_entry == NULL)
11957 error_ret_free_internal:
11958 if (elf_section_data (section)->relocs == NULL)
11959 free (internal_relocs);
11960 error_ret_free_local:
11961 if (local_syms != NULL
11962 && (symtab_hdr->contents
11963 != (unsigned char *) local_syms))
11968 stub_entry->stub_type = stub_type;
11969 if (stub_type != ppc_stub_plt_call
11970 && stub_type != ppc_stub_plt_call_r2save)
11972 stub_entry->target_value = code_value;
11973 stub_entry->target_section = code_sec;
11977 stub_entry->target_value = sym_value;
11978 stub_entry->target_section = sym_sec;
11980 stub_entry->h = hash;
11981 stub_entry->plt_ent = plt_ent;
11983 if (stub_entry->h != NULL)
11984 htab->stub_globals += 1;
11987 /* We're done with the internal relocs, free them. */
11988 if (elf_section_data (section)->relocs != internal_relocs)
11989 free (internal_relocs);
11992 if (local_syms != NULL
11993 && symtab_hdr->contents != (unsigned char *) local_syms)
11995 if (!info->keep_memory)
11998 symtab_hdr->contents = (unsigned char *) local_syms;
12002 /* We may have added some stubs. Find out the new size of the
12004 for (stub_sec = htab->stub_bfd->sections;
12006 stub_sec = stub_sec->next)
12007 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12009 stub_sec->rawsize = stub_sec->size;
12010 stub_sec->size = 0;
12011 stub_sec->reloc_count = 0;
12012 stub_sec->flags &= ~SEC_RELOC;
12015 htab->brlt->size = 0;
12016 htab->brlt->reloc_count = 0;
12017 htab->brlt->flags &= ~SEC_RELOC;
12018 if (htab->relbrlt != NULL)
12019 htab->relbrlt->size = 0;
12021 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
12023 if (info->emitrelocations
12024 && htab->glink != NULL && htab->glink->size != 0)
12026 htab->glink->reloc_count = 1;
12027 htab->glink->flags |= SEC_RELOC;
12030 if (htab->glink_eh_frame != NULL
12031 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
12032 && htab->glink_eh_frame->output_section->size != 0)
12034 size_t size = 0, align;
12036 for (stub_sec = htab->stub_bfd->sections;
12038 stub_sec = stub_sec->next)
12039 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12041 if (htab->glink != NULL && htab->glink->size != 0)
12044 size += sizeof (glink_eh_frame_cie);
12046 align <<= htab->glink_eh_frame->output_section->alignment_power;
12048 size = (size + align) & ~align;
12049 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12050 htab->glink_eh_frame->size = size;
12053 if (htab->plt_stub_align != 0)
12054 for (stub_sec = htab->stub_bfd->sections;
12056 stub_sec = stub_sec->next)
12057 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12058 stub_sec->size = ((stub_sec->size + (1 << htab->plt_stub_align) - 1)
12059 & (-1 << htab->plt_stub_align));
12061 for (stub_sec = htab->stub_bfd->sections;
12063 stub_sec = stub_sec->next)
12064 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12065 && stub_sec->rawsize != stub_sec->size)
12068 /* Exit from this loop when no stubs have been added, and no stubs
12069 have changed size. */
12070 if (stub_sec == NULL
12071 && (htab->glink_eh_frame == NULL
12072 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
12075 /* Ask the linker to do its stuff. */
12076 (*htab->layout_sections_again) ();
12079 maybe_strip_output (info, htab->brlt);
12080 if (htab->glink_eh_frame != NULL)
12081 maybe_strip_output (info, htab->glink_eh_frame);
12086 /* Called after we have determined section placement. If sections
12087 move, we'll be called again. Provide a value for TOCstart. */
12090 ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
12095 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
12096 order. The TOC starts where the first of these sections starts. */
12097 s = bfd_get_section_by_name (obfd, ".got");
12098 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12099 s = bfd_get_section_by_name (obfd, ".toc");
12100 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12101 s = bfd_get_section_by_name (obfd, ".tocbss");
12102 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12103 s = bfd_get_section_by_name (obfd, ".plt");
12104 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12106 /* This may happen for
12107 o references to TOC base (SYM@toc / TOC[tc0]) without a
12109 o bad linker script
12110 o --gc-sections and empty TOC sections
12112 FIXME: Warn user? */
12114 /* Look for a likely section. We probably won't even be
12116 for (s = obfd->sections; s != NULL; s = s->next)
12117 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
12119 == (SEC_ALLOC | SEC_SMALL_DATA))
12122 for (s = obfd->sections; s != NULL; s = s->next)
12123 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
12124 == (SEC_ALLOC | SEC_SMALL_DATA))
12127 for (s = obfd->sections; s != NULL; s = s->next)
12128 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
12132 for (s = obfd->sections; s != NULL; s = s->next)
12133 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
12139 TOCstart = s->output_section->vma + s->output_offset;
12141 _bfd_set_gp_value (obfd, TOCstart);
12143 if (info != NULL && s != NULL && is_ppc64_elf (obfd))
12145 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12148 && htab->elf.hgot != NULL)
12150 htab->elf.hgot->type = STT_OBJECT;
12151 htab->elf.hgot->root.type = bfd_link_hash_defined;
12152 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF;
12153 htab->elf.hgot->root.u.def.section = s;
12159 /* Build all the stubs associated with the current output file.
12160 The stubs are kept in a hash table attached to the main linker
12161 hash table. This function is called via gldelf64ppc_finish. */
12164 ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
12165 struct bfd_link_info *info,
12168 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12169 asection *stub_sec;
12171 int stub_sec_count = 0;
12176 htab->emit_stub_syms = emit_stub_syms;
12178 /* Allocate memory to hold the linker stubs. */
12179 for (stub_sec = htab->stub_bfd->sections;
12181 stub_sec = stub_sec->next)
12182 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12183 && stub_sec->size != 0)
12185 stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
12186 if (stub_sec->contents == NULL)
12188 /* We want to check that built size is the same as calculated
12189 size. rawsize is a convenient location to use. */
12190 stub_sec->rawsize = stub_sec->size;
12191 stub_sec->size = 0;
12194 if (htab->glink != NULL && htab->glink->size != 0)
12199 /* Build the .glink plt call stub. */
12200 if (htab->emit_stub_syms)
12202 struct elf_link_hash_entry *h;
12203 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
12204 TRUE, FALSE, FALSE);
12207 if (h->root.type == bfd_link_hash_new)
12209 h->root.type = bfd_link_hash_defined;
12210 h->root.u.def.section = htab->glink;
12211 h->root.u.def.value = 8;
12212 h->ref_regular = 1;
12213 h->def_regular = 1;
12214 h->ref_regular_nonweak = 1;
12215 h->forced_local = 1;
12219 plt0 = htab->plt->output_section->vma + htab->plt->output_offset - 16;
12220 if (info->emitrelocations)
12222 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
12225 r->r_offset = (htab->glink->output_offset
12226 + htab->glink->output_section->vma);
12227 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
12228 r->r_addend = plt0;
12230 p = htab->glink->contents;
12231 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
12232 bfd_put_64 (htab->glink->owner, plt0, p);
12234 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
12236 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
12238 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
12240 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
12242 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
12244 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
12246 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
12248 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
12250 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
12252 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
12254 bfd_put_32 (htab->glink->owner, BCTR, p);
12256 while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
12258 bfd_put_32 (htab->glink->owner, NOP, p);
12262 /* Build the .glink lazy link call stubs. */
12264 while (p < htab->glink->contents + htab->glink->size)
12268 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
12273 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
12275 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
12278 bfd_put_32 (htab->glink->owner,
12279 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
12283 htab->glink->rawsize = p - htab->glink->contents;
12286 if (htab->brlt->size != 0)
12288 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
12290 if (htab->brlt->contents == NULL)
12293 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
12295 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
12296 htab->relbrlt->size);
12297 if (htab->relbrlt->contents == NULL)
12301 if (htab->glink_eh_frame != NULL
12302 && htab->glink_eh_frame->size != 0)
12305 bfd_byte *last_fde;
12306 size_t last_fde_len, size, align, pad;
12308 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
12311 htab->glink_eh_frame->contents = p;
12314 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12316 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
12317 /* CIE length (rewrite in case little-endian). */
12318 last_fde_len = sizeof (glink_eh_frame_cie) - 4;
12319 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12320 p += sizeof (glink_eh_frame_cie);
12322 for (stub_sec = htab->stub_bfd->sections;
12324 stub_sec = stub_sec->next)
12325 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12330 bfd_put_32 (htab->elf.dynobj, 16, p);
12333 val = p - htab->glink_eh_frame->contents;
12334 bfd_put_32 (htab->elf.dynobj, val, p);
12336 /* Offset to stub section. */
12337 val = (stub_sec->output_section->vma
12338 + stub_sec->output_offset);
12339 val -= (htab->glink_eh_frame->output_section->vma
12340 + htab->glink_eh_frame->output_offset);
12341 val -= p - htab->glink_eh_frame->contents;
12342 if (val + 0x80000000 > 0xffffffff)
12344 info->callbacks->einfo
12345 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
12349 bfd_put_32 (htab->elf.dynobj, val, p);
12351 /* stub section size. */
12352 bfd_put_32 (htab->elf.dynobj, stub_sec->rawsize, p);
12354 /* Augmentation. */
12359 if (htab->glink != NULL && htab->glink->size != 0)
12364 bfd_put_32 (htab->elf.dynobj, 20, p);
12367 val = p - htab->glink_eh_frame->contents;
12368 bfd_put_32 (htab->elf.dynobj, val, p);
12370 /* Offset to .glink. */
12371 val = (htab->glink->output_section->vma
12372 + htab->glink->output_offset
12374 val -= (htab->glink_eh_frame->output_section->vma
12375 + htab->glink_eh_frame->output_offset);
12376 val -= p - htab->glink_eh_frame->contents;
12377 if (val + 0x80000000 > 0xffffffff)
12379 info->callbacks->einfo
12380 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
12381 htab->glink->name);
12384 bfd_put_32 (htab->elf.dynobj, val, p);
12387 bfd_put_32 (htab->elf.dynobj, htab->glink->rawsize - 8, p);
12389 /* Augmentation. */
12392 *p++ = DW_CFA_advance_loc + 1;
12393 *p++ = DW_CFA_register;
12396 *p++ = DW_CFA_advance_loc + 4;
12397 *p++ = DW_CFA_restore_extended;
12400 /* Subsume any padding into the last FDE if user .eh_frame
12401 sections are aligned more than glink_eh_frame. Otherwise any
12402 zero padding will be seen as a terminator. */
12403 size = p - htab->glink_eh_frame->contents;
12405 align <<= htab->glink_eh_frame->output_section->alignment_power;
12407 pad = ((size + align) & ~align) - size;
12408 htab->glink_eh_frame->size = size + pad;
12409 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
12412 /* Build the stubs as directed by the stub hash table. */
12413 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
12415 if (htab->relbrlt != NULL)
12416 htab->relbrlt->reloc_count = 0;
12418 if (htab->plt_stub_align != 0)
12419 for (stub_sec = htab->stub_bfd->sections;
12421 stub_sec = stub_sec->next)
12422 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12423 stub_sec->size = ((stub_sec->size + (1 << htab->plt_stub_align) - 1)
12424 & (-1 << htab->plt_stub_align));
12426 for (stub_sec = htab->stub_bfd->sections;
12428 stub_sec = stub_sec->next)
12429 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12431 stub_sec_count += 1;
12432 if (stub_sec->rawsize != stub_sec->size)
12436 if (stub_sec != NULL
12437 || htab->glink->rawsize != htab->glink->size
12438 || (htab->glink_eh_frame != NULL
12439 && htab->glink_eh_frame->rawsize != htab->glink_eh_frame->size))
12441 htab->stub_error = TRUE;
12442 info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
12445 if (htab->stub_error)
12450 *stats = bfd_malloc (500);
12451 if (*stats == NULL)
12454 sprintf (*stats, _("linker stubs in %u group%s\n"
12456 " toc adjust %lu\n"
12457 " long branch %lu\n"
12458 " long toc adj %lu\n"
12460 " plt call toc %lu"),
12462 stub_sec_count == 1 ? "" : "s",
12463 htab->stub_count[ppc_stub_long_branch - 1],
12464 htab->stub_count[ppc_stub_long_branch_r2off - 1],
12465 htab->stub_count[ppc_stub_plt_branch - 1],
12466 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
12467 htab->stub_count[ppc_stub_plt_call - 1],
12468 htab->stub_count[ppc_stub_plt_call_r2save - 1]);
12473 /* This function undoes the changes made by add_symbol_adjust. */
12476 undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12478 struct ppc_link_hash_entry *eh;
12480 if (h->root.type == bfd_link_hash_indirect)
12483 eh = (struct ppc_link_hash_entry *) h;
12484 if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
12487 eh->elf.root.type = bfd_link_hash_undefined;
12492 ppc64_elf_restore_symbols (struct bfd_link_info *info)
12494 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12497 elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
12500 /* What to do when ld finds relocations against symbols defined in
12501 discarded sections. */
12503 static unsigned int
12504 ppc64_elf_action_discarded (asection *sec)
12506 if (strcmp (".opd", sec->name) == 0)
12509 if (strcmp (".toc", sec->name) == 0)
12512 if (strcmp (".toc1", sec->name) == 0)
12515 return _bfd_elf_default_action_discarded (sec);
12518 /* The RELOCATE_SECTION function is called by the ELF backend linker
12519 to handle the relocations for a section.
12521 The relocs are always passed as Rela structures; if the section
12522 actually uses Rel structures, the r_addend field will always be
12525 This function is responsible for adjust the section contents as
12526 necessary, and (if using Rela relocs and generating a
12527 relocatable output file) adjusting the reloc addend as
12530 This function does not have to worry about setting the reloc
12531 address or the reloc symbol index.
12533 LOCAL_SYMS is a pointer to the swapped in local symbols.
12535 LOCAL_SECTIONS is an array giving the section in the input file
12536 corresponding to the st_shndx field of each local symbol.
12538 The global hash table entry for the global symbols can be found
12539 via elf_sym_hashes (input_bfd).
12541 When generating relocatable output, this function must handle
12542 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
12543 going to be the section symbol corresponding to the output
12544 section, which means that the addend must be adjusted
12548 ppc64_elf_relocate_section (bfd *output_bfd,
12549 struct bfd_link_info *info,
12551 asection *input_section,
12552 bfd_byte *contents,
12553 Elf_Internal_Rela *relocs,
12554 Elf_Internal_Sym *local_syms,
12555 asection **local_sections)
12557 struct ppc_link_hash_table *htab;
12558 Elf_Internal_Shdr *symtab_hdr;
12559 struct elf_link_hash_entry **sym_hashes;
12560 Elf_Internal_Rela *rel;
12561 Elf_Internal_Rela *relend;
12562 Elf_Internal_Rela outrel;
12564 struct got_entry **local_got_ents;
12566 bfd_boolean ret = TRUE;
12567 bfd_boolean is_opd;
12568 /* Assume 'at' branch hints. */
12569 bfd_boolean is_isa_v2 = TRUE;
12570 bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
12572 /* Initialize howto table if needed. */
12573 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
12576 htab = ppc_hash_table (info);
12580 /* Don't relocate stub sections. */
12581 if (input_section->owner == htab->stub_bfd)
12584 BFD_ASSERT (is_ppc64_elf (input_bfd));
12586 local_got_ents = elf_local_got_ents (input_bfd);
12587 TOCstart = elf_gp (output_bfd);
12588 symtab_hdr = &elf_symtab_hdr (input_bfd);
12589 sym_hashes = elf_sym_hashes (input_bfd);
12590 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
12593 relend = relocs + input_section->reloc_count;
12594 for (; rel < relend; rel++)
12596 enum elf_ppc64_reloc_type r_type;
12598 bfd_reloc_status_type r;
12599 Elf_Internal_Sym *sym;
12601 struct elf_link_hash_entry *h_elf;
12602 struct ppc_link_hash_entry *h;
12603 struct ppc_link_hash_entry *fdh;
12604 const char *sym_name;
12605 unsigned long r_symndx, toc_symndx;
12606 bfd_vma toc_addend;
12607 unsigned char tls_mask, tls_gd, tls_type;
12608 unsigned char sym_type;
12609 bfd_vma relocation;
12610 bfd_boolean unresolved_reloc;
12611 bfd_boolean warned;
12612 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
12615 struct ppc_stub_hash_entry *stub_entry;
12616 bfd_vma max_br_offset;
12618 const Elf_Internal_Rela orig_rel = *rel;
12620 r_type = ELF64_R_TYPE (rel->r_info);
12621 r_symndx = ELF64_R_SYM (rel->r_info);
12623 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
12624 symbol of the previous ADDR64 reloc. The symbol gives us the
12625 proper TOC base to use. */
12626 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
12628 && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
12630 r_symndx = ELF64_R_SYM (rel[-1].r_info);
12636 unresolved_reloc = FALSE;
12639 if (r_symndx < symtab_hdr->sh_info)
12641 /* It's a local symbol. */
12642 struct _opd_sec_data *opd;
12644 sym = local_syms + r_symndx;
12645 sec = local_sections[r_symndx];
12646 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
12647 sym_type = ELF64_ST_TYPE (sym->st_info);
12648 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
12649 opd = get_opd_info (sec);
12650 if (opd != NULL && opd->adjust != NULL)
12652 long adjust = opd->adjust[(sym->st_value + rel->r_addend) / 8];
12657 /* If this is a relocation against the opd section sym
12658 and we have edited .opd, adjust the reloc addend so
12659 that ld -r and ld --emit-relocs output is correct.
12660 If it is a reloc against some other .opd symbol,
12661 then the symbol value will be adjusted later. */
12662 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
12663 rel->r_addend += adjust;
12665 relocation += adjust;
12671 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
12672 r_symndx, symtab_hdr, sym_hashes,
12673 h_elf, sec, relocation,
12674 unresolved_reloc, warned);
12675 sym_name = h_elf->root.root.string;
12676 sym_type = h_elf->type;
12678 && sec->owner == output_bfd
12679 && strcmp (sec->name, ".opd") == 0)
12681 /* This is a symbol defined in a linker script. All
12682 such are defined in output sections, even those
12683 defined by simple assignment from a symbol defined in
12684 an input section. Transfer the symbol to an
12685 appropriate input .opd section, so that a branch to
12686 this symbol will be mapped to the location specified
12687 by the opd entry. */
12688 struct bfd_link_order *lo;
12689 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
12690 if (lo->type == bfd_indirect_link_order)
12692 asection *isec = lo->u.indirect.section;
12693 if (h_elf->root.u.def.value >= isec->output_offset
12694 && h_elf->root.u.def.value < (isec->output_offset
12697 h_elf->root.u.def.value -= isec->output_offset;
12698 h_elf->root.u.def.section = isec;
12705 h = (struct ppc_link_hash_entry *) h_elf;
12707 if (sec != NULL && discarded_section (sec))
12708 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
12710 ppc64_elf_howto_table[r_type], 0,
12713 if (info->relocatable)
12716 if (h != NULL && &h->elf == htab->elf.hgot)
12718 relocation = (TOCstart
12719 + htab->stub_group[input_section->id].toc_off);
12720 sec = bfd_abs_section_ptr;
12721 unresolved_reloc = FALSE;
12724 /* TLS optimizations. Replace instruction sequences and relocs
12725 based on information we collected in tls_optimize. We edit
12726 RELOCS so that --emit-relocs will output something sensible
12727 for the final instruction stream. */
12732 tls_mask = h->tls_mask;
12733 else if (local_got_ents != NULL)
12735 struct plt_entry **local_plt = (struct plt_entry **)
12736 (local_got_ents + symtab_hdr->sh_info);
12737 unsigned char *lgot_masks = (unsigned char *)
12738 (local_plt + symtab_hdr->sh_info);
12739 tls_mask = lgot_masks[r_symndx];
12742 && (r_type == R_PPC64_TLS
12743 || r_type == R_PPC64_TLSGD
12744 || r_type == R_PPC64_TLSLD))
12746 /* Check for toc tls entries. */
12747 unsigned char *toc_tls;
12749 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
12750 &local_syms, rel, input_bfd))
12754 tls_mask = *toc_tls;
12757 /* Check that tls relocs are used with tls syms, and non-tls
12758 relocs are used with non-tls syms. */
12759 if (r_symndx != STN_UNDEF
12760 && r_type != R_PPC64_NONE
12762 || h->elf.root.type == bfd_link_hash_defined
12763 || h->elf.root.type == bfd_link_hash_defweak)
12764 && (IS_PPC64_TLS_RELOC (r_type)
12765 != (sym_type == STT_TLS
12766 || (sym_type == STT_SECTION
12767 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
12770 && (r_type == R_PPC64_TLS
12771 || r_type == R_PPC64_TLSGD
12772 || r_type == R_PPC64_TLSLD))
12773 /* R_PPC64_TLS is OK against a symbol in the TOC. */
12776 info->callbacks->einfo
12777 (!IS_PPC64_TLS_RELOC (r_type)
12778 ? _("%P: %H: %s used with TLS symbol `%T'\n")
12779 : _("%P: %H: %s used with non-TLS symbol `%T'\n"),
12780 input_bfd, input_section, rel->r_offset,
12781 ppc64_elf_howto_table[r_type]->name,
12785 /* Ensure reloc mapping code below stays sane. */
12786 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
12787 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
12788 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
12789 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
12790 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
12791 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
12792 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
12793 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
12794 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
12795 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
12803 case R_PPC64_LO_DS_OPT:
12804 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
12805 if ((insn & (0x3f << 26)) != 58u << 26)
12807 insn += (14u << 26) - (58u << 26);
12808 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
12809 r_type = R_PPC64_TOC16_LO;
12810 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12813 case R_PPC64_TOC16:
12814 case R_PPC64_TOC16_LO:
12815 case R_PPC64_TOC16_DS:
12816 case R_PPC64_TOC16_LO_DS:
12818 /* Check for toc tls entries. */
12819 unsigned char *toc_tls;
12822 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
12823 &local_syms, rel, input_bfd);
12829 tls_mask = *toc_tls;
12830 if (r_type == R_PPC64_TOC16_DS
12831 || r_type == R_PPC64_TOC16_LO_DS)
12834 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
12839 /* If we found a GD reloc pair, then we might be
12840 doing a GD->IE transition. */
12843 tls_gd = TLS_TPRELGD;
12844 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12847 else if (retval == 3)
12849 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12857 case R_PPC64_GOT_TPREL16_HI:
12858 case R_PPC64_GOT_TPREL16_HA:
12860 && (tls_mask & TLS_TPREL) == 0)
12862 rel->r_offset -= d_offset;
12863 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
12864 r_type = R_PPC64_NONE;
12865 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12869 case R_PPC64_GOT_TPREL16_DS:
12870 case R_PPC64_GOT_TPREL16_LO_DS:
12872 && (tls_mask & TLS_TPREL) == 0)
12875 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
12877 insn |= 0x3c0d0000; /* addis 0,13,0 */
12878 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
12879 r_type = R_PPC64_TPREL16_HA;
12880 if (toc_symndx != 0)
12882 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
12883 rel->r_addend = toc_addend;
12884 /* We changed the symbol. Start over in order to
12885 get h, sym, sec etc. right. */
12890 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12896 && (tls_mask & TLS_TPREL) == 0)
12898 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
12899 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
12902 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
12903 /* Was PPC64_TLS which sits on insn boundary, now
12904 PPC64_TPREL16_LO which is at low-order half-word. */
12905 rel->r_offset += d_offset;
12906 r_type = R_PPC64_TPREL16_LO;
12907 if (toc_symndx != 0)
12909 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
12910 rel->r_addend = toc_addend;
12911 /* We changed the symbol. Start over in order to
12912 get h, sym, sec etc. right. */
12917 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12921 case R_PPC64_GOT_TLSGD16_HI:
12922 case R_PPC64_GOT_TLSGD16_HA:
12923 tls_gd = TLS_TPRELGD;
12924 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12928 case R_PPC64_GOT_TLSLD16_HI:
12929 case R_PPC64_GOT_TLSLD16_HA:
12930 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12933 if ((tls_mask & tls_gd) != 0)
12934 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
12935 + R_PPC64_GOT_TPREL16_DS);
12938 rel->r_offset -= d_offset;
12939 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
12940 r_type = R_PPC64_NONE;
12942 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12946 case R_PPC64_GOT_TLSGD16:
12947 case R_PPC64_GOT_TLSGD16_LO:
12948 tls_gd = TLS_TPRELGD;
12949 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12953 case R_PPC64_GOT_TLSLD16:
12954 case R_PPC64_GOT_TLSLD16_LO:
12955 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12957 unsigned int insn1, insn2, insn3;
12961 offset = (bfd_vma) -1;
12962 /* If not using the newer R_PPC64_TLSGD/LD to mark
12963 __tls_get_addr calls, we must trust that the call
12964 stays with its arg setup insns, ie. that the next
12965 reloc is the __tls_get_addr call associated with
12966 the current reloc. Edit both insns. */
12967 if (input_section->has_tls_get_addr_call
12968 && rel + 1 < relend
12969 && branch_reloc_hash_match (input_bfd, rel + 1,
12970 htab->tls_get_addr,
12971 htab->tls_get_addr_fd))
12972 offset = rel[1].r_offset;
12973 if ((tls_mask & tls_gd) != 0)
12976 insn1 = bfd_get_32 (output_bfd,
12977 contents + rel->r_offset - d_offset);
12978 insn1 &= (1 << 26) - (1 << 2);
12979 insn1 |= 58 << 26; /* ld */
12980 insn2 = 0x7c636a14; /* add 3,3,13 */
12981 if (offset != (bfd_vma) -1)
12982 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
12983 if ((tls_mask & TLS_EXPLICIT) == 0)
12984 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
12985 + R_PPC64_GOT_TPREL16_DS);
12987 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
12988 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12993 insn1 = 0x3c6d0000; /* addis 3,13,0 */
12994 insn2 = 0x38630000; /* addi 3,3,0 */
12997 /* Was an LD reloc. */
12999 sec = local_sections[toc_symndx];
13001 r_symndx < symtab_hdr->sh_info;
13003 if (local_sections[r_symndx] == sec)
13005 if (r_symndx >= symtab_hdr->sh_info)
13006 r_symndx = STN_UNDEF;
13007 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13008 if (r_symndx != STN_UNDEF)
13009 rel->r_addend -= (local_syms[r_symndx].st_value
13010 + sec->output_offset
13011 + sec->output_section->vma);
13013 else if (toc_symndx != 0)
13015 r_symndx = toc_symndx;
13016 rel->r_addend = toc_addend;
13018 r_type = R_PPC64_TPREL16_HA;
13019 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13020 if (offset != (bfd_vma) -1)
13022 rel[1].r_info = ELF64_R_INFO (r_symndx,
13023 R_PPC64_TPREL16_LO);
13024 rel[1].r_offset = offset + d_offset;
13025 rel[1].r_addend = rel->r_addend;
13028 bfd_put_32 (output_bfd, insn1,
13029 contents + rel->r_offset - d_offset);
13030 if (offset != (bfd_vma) -1)
13032 insn3 = bfd_get_32 (output_bfd,
13033 contents + offset + 4);
13035 || insn3 == CROR_151515 || insn3 == CROR_313131)
13037 rel[1].r_offset += 4;
13038 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13041 bfd_put_32 (output_bfd, insn2, contents + offset);
13043 if ((tls_mask & tls_gd) == 0
13044 && (tls_gd == 0 || toc_symndx != 0))
13046 /* We changed the symbol. Start over in order
13047 to get h, sym, sec etc. right. */
13054 case R_PPC64_TLSGD:
13055 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13057 unsigned int insn2, insn3;
13058 bfd_vma offset = rel->r_offset;
13060 if ((tls_mask & TLS_TPRELGD) != 0)
13063 r_type = R_PPC64_NONE;
13064 insn2 = 0x7c636a14; /* add 3,3,13 */
13069 if (toc_symndx != 0)
13071 r_symndx = toc_symndx;
13072 rel->r_addend = toc_addend;
13074 r_type = R_PPC64_TPREL16_LO;
13075 rel->r_offset = offset + d_offset;
13076 insn2 = 0x38630000; /* addi 3,3,0 */
13078 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13079 /* Zap the reloc on the _tls_get_addr call too. */
13080 BFD_ASSERT (offset == rel[1].r_offset);
13081 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13082 insn3 = bfd_get_32 (output_bfd,
13083 contents + offset + 4);
13085 || insn3 == CROR_151515 || insn3 == CROR_313131)
13087 rel->r_offset += 4;
13088 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13091 bfd_put_32 (output_bfd, insn2, contents + offset);
13092 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
13100 case R_PPC64_TLSLD:
13101 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13103 unsigned int insn2, insn3;
13104 bfd_vma offset = rel->r_offset;
13107 sec = local_sections[toc_symndx];
13109 r_symndx < symtab_hdr->sh_info;
13111 if (local_sections[r_symndx] == sec)
13113 if (r_symndx >= symtab_hdr->sh_info)
13114 r_symndx = STN_UNDEF;
13115 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13116 if (r_symndx != STN_UNDEF)
13117 rel->r_addend -= (local_syms[r_symndx].st_value
13118 + sec->output_offset
13119 + sec->output_section->vma);
13121 r_type = R_PPC64_TPREL16_LO;
13122 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13123 rel->r_offset = offset + d_offset;
13124 /* Zap the reloc on the _tls_get_addr call too. */
13125 BFD_ASSERT (offset == rel[1].r_offset);
13126 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13127 insn2 = 0x38630000; /* addi 3,3,0 */
13128 insn3 = bfd_get_32 (output_bfd,
13129 contents + offset + 4);
13131 || insn3 == CROR_151515 || insn3 == CROR_313131)
13133 rel->r_offset += 4;
13134 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13137 bfd_put_32 (output_bfd, insn2, contents + offset);
13143 case R_PPC64_DTPMOD64:
13144 if (rel + 1 < relend
13145 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
13146 && rel[1].r_offset == rel->r_offset + 8)
13148 if ((tls_mask & TLS_GD) == 0)
13150 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
13151 if ((tls_mask & TLS_TPRELGD) != 0)
13152 r_type = R_PPC64_TPREL64;
13155 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13156 r_type = R_PPC64_NONE;
13158 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13163 if ((tls_mask & TLS_LD) == 0)
13165 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13166 r_type = R_PPC64_NONE;
13167 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13172 case R_PPC64_TPREL64:
13173 if ((tls_mask & TLS_TPREL) == 0)
13175 r_type = R_PPC64_NONE;
13176 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13181 /* Handle other relocations that tweak non-addend part of insn. */
13183 max_br_offset = 1 << 25;
13184 addend = rel->r_addend;
13185 reloc_dest = DEST_NORMAL;
13191 case R_PPC64_TOCSAVE:
13192 if (relocation + addend == (rel->r_offset
13193 + input_section->output_offset
13194 + input_section->output_section->vma)
13195 && tocsave_find (htab, NO_INSERT,
13196 &local_syms, rel, input_bfd))
13198 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
13200 || insn == CROR_151515 || insn == CROR_313131)
13201 bfd_put_32 (input_bfd, STD_R2_40R1,
13202 contents + rel->r_offset);
13206 /* Branch taken prediction relocations. */
13207 case R_PPC64_ADDR14_BRTAKEN:
13208 case R_PPC64_REL14_BRTAKEN:
13209 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
13212 /* Branch not taken prediction relocations. */
13213 case R_PPC64_ADDR14_BRNTAKEN:
13214 case R_PPC64_REL14_BRNTAKEN:
13215 insn |= bfd_get_32 (output_bfd,
13216 contents + rel->r_offset) & ~(0x01 << 21);
13219 case R_PPC64_REL14:
13220 max_br_offset = 1 << 15;
13223 case R_PPC64_REL24:
13224 /* Calls to functions with a different TOC, such as calls to
13225 shared objects, need to alter the TOC pointer. This is
13226 done using a linkage stub. A REL24 branching to these
13227 linkage stubs needs to be followed by a nop, as the nop
13228 will be replaced with an instruction to restore the TOC
13233 && h->oh->is_func_descriptor)
13234 fdh = ppc_follow_link (h->oh);
13235 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
13237 if (stub_entry != NULL
13238 && (stub_entry->stub_type == ppc_stub_plt_call
13239 || stub_entry->stub_type == ppc_stub_plt_call_r2save
13240 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
13241 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
13243 bfd_boolean can_plt_call = FALSE;
13245 /* All of these stubs will modify r2, so there must be a
13246 branch and link followed by a nop. The nop is
13247 replaced by an insn to restore r2. */
13248 if (rel->r_offset + 8 <= input_section->size)
13252 br = bfd_get_32 (input_bfd,
13253 contents + rel->r_offset);
13258 nop = bfd_get_32 (input_bfd,
13259 contents + rel->r_offset + 4);
13261 || nop == CROR_151515 || nop == CROR_313131)
13264 && (h == htab->tls_get_addr_fd
13265 || h == htab->tls_get_addr)
13266 && !htab->no_tls_get_addr_opt)
13268 /* Special stub used, leave nop alone. */
13271 bfd_put_32 (input_bfd, LD_R2_40R1,
13272 contents + rel->r_offset + 4);
13273 can_plt_call = TRUE;
13278 if (!can_plt_call && h != NULL)
13280 const char *name = h->elf.root.root.string;
13285 if (strncmp (name, "__libc_start_main", 17) == 0
13286 && (name[17] == 0 || name[17] == '@'))
13288 /* Allow crt1 branch to go via a toc adjusting
13289 stub. Other calls that never return could do
13290 the same, if we could detect such. */
13291 can_plt_call = TRUE;
13297 /* g++ as of 20130507 emits self-calls without a
13298 following nop. This is arguably wrong since we
13299 have conflicting information. On the one hand a
13300 global symbol and on the other a local call
13301 sequence, but don't error for this special case.
13302 It isn't possible to cheaply verify we have
13303 exactly such a call. Allow all calls to the same
13305 asection *code_sec = sec;
13307 if (get_opd_info (sec) != NULL)
13309 bfd_vma off = (relocation + addend
13310 - sec->output_section->vma
13311 - sec->output_offset);
13313 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
13315 if (code_sec == input_section)
13316 can_plt_call = TRUE;
13321 info->callbacks->einfo
13322 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
13323 "recompile with -fPIC"),
13324 input_bfd, input_section, rel->r_offset, sym_name);
13326 bfd_set_error (bfd_error_bad_value);
13331 && (stub_entry->stub_type == ppc_stub_plt_call
13332 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
13333 unresolved_reloc = FALSE;
13336 if ((stub_entry == NULL
13337 || stub_entry->stub_type == ppc_stub_long_branch
13338 || stub_entry->stub_type == ppc_stub_plt_branch)
13339 && get_opd_info (sec) != NULL)
13341 /* The branch destination is the value of the opd entry. */
13342 bfd_vma off = (relocation + addend
13343 - sec->output_section->vma
13344 - sec->output_offset);
13345 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
13346 if (dest != (bfd_vma) -1)
13350 reloc_dest = DEST_OPD;
13354 /* If the branch is out of reach we ought to have a long
13356 from = (rel->r_offset
13357 + input_section->output_offset
13358 + input_section->output_section->vma);
13360 if (stub_entry != NULL
13361 && (stub_entry->stub_type == ppc_stub_long_branch
13362 || stub_entry->stub_type == ppc_stub_plt_branch)
13363 && (r_type == R_PPC64_ADDR14_BRTAKEN
13364 || r_type == R_PPC64_ADDR14_BRNTAKEN
13365 || (relocation + addend - from + max_br_offset
13366 < 2 * max_br_offset)))
13367 /* Don't use the stub if this branch is in range. */
13370 if (stub_entry != NULL)
13372 /* Munge up the value and addend so that we call the stub
13373 rather than the procedure directly. */
13374 relocation = (stub_entry->stub_offset
13375 + stub_entry->stub_sec->output_offset
13376 + stub_entry->stub_sec->output_section->vma);
13378 reloc_dest = DEST_STUB;
13380 if ((stub_entry->stub_type == ppc_stub_plt_call
13381 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
13382 && (ALWAYS_EMIT_R2SAVE
13383 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
13384 && rel + 1 < relend
13385 && rel[1].r_offset == rel->r_offset + 4
13386 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
13394 /* Set 'a' bit. This is 0b00010 in BO field for branch
13395 on CR(BI) insns (BO == 001at or 011at), and 0b01000
13396 for branch on CTR insns (BO == 1a00t or 1a01t). */
13397 if ((insn & (0x14 << 21)) == (0x04 << 21))
13398 insn |= 0x02 << 21;
13399 else if ((insn & (0x14 << 21)) == (0x10 << 21))
13400 insn |= 0x08 << 21;
13406 /* Invert 'y' bit if not the default. */
13407 if ((bfd_signed_vma) (relocation + addend - from) < 0)
13408 insn ^= 0x01 << 21;
13411 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
13414 /* NOP out calls to undefined weak functions.
13415 We can thus call a weak function without first
13416 checking whether the function is defined. */
13418 && h->elf.root.type == bfd_link_hash_undefweak
13419 && h->elf.dynindx == -1
13420 && r_type == R_PPC64_REL24
13424 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13430 /* Set `addend'. */
13435 info->callbacks->einfo
13436 (_("%P: %B: unknown relocation type %d for `%T'\n"),
13437 input_bfd, (int) r_type, sym_name);
13439 bfd_set_error (bfd_error_bad_value);
13445 case R_PPC64_TLSGD:
13446 case R_PPC64_TLSLD:
13447 case R_PPC64_TOCSAVE:
13448 case R_PPC64_GNU_VTINHERIT:
13449 case R_PPC64_GNU_VTENTRY:
13452 /* GOT16 relocations. Like an ADDR16 using the symbol's
13453 address in the GOT as relocation value instead of the
13454 symbol's value itself. Also, create a GOT entry for the
13455 symbol and put the symbol value there. */
13456 case R_PPC64_GOT_TLSGD16:
13457 case R_PPC64_GOT_TLSGD16_LO:
13458 case R_PPC64_GOT_TLSGD16_HI:
13459 case R_PPC64_GOT_TLSGD16_HA:
13460 tls_type = TLS_TLS | TLS_GD;
13463 case R_PPC64_GOT_TLSLD16:
13464 case R_PPC64_GOT_TLSLD16_LO:
13465 case R_PPC64_GOT_TLSLD16_HI:
13466 case R_PPC64_GOT_TLSLD16_HA:
13467 tls_type = TLS_TLS | TLS_LD;
13470 case R_PPC64_GOT_TPREL16_DS:
13471 case R_PPC64_GOT_TPREL16_LO_DS:
13472 case R_PPC64_GOT_TPREL16_HI:
13473 case R_PPC64_GOT_TPREL16_HA:
13474 tls_type = TLS_TLS | TLS_TPREL;
13477 case R_PPC64_GOT_DTPREL16_DS:
13478 case R_PPC64_GOT_DTPREL16_LO_DS:
13479 case R_PPC64_GOT_DTPREL16_HI:
13480 case R_PPC64_GOT_DTPREL16_HA:
13481 tls_type = TLS_TLS | TLS_DTPREL;
13484 case R_PPC64_GOT16:
13485 case R_PPC64_GOT16_LO:
13486 case R_PPC64_GOT16_HI:
13487 case R_PPC64_GOT16_HA:
13488 case R_PPC64_GOT16_DS:
13489 case R_PPC64_GOT16_LO_DS:
13492 /* Relocation is to the entry for this symbol in the global
13497 unsigned long indx = 0;
13498 struct got_entry *ent;
13500 if (tls_type == (TLS_TLS | TLS_LD)
13502 || !h->elf.def_dynamic))
13503 ent = ppc64_tlsld_got (input_bfd);
13509 bfd_boolean dyn = htab->elf.dynamic_sections_created;
13510 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
13513 && SYMBOL_CALLS_LOCAL (info, &h->elf)))
13514 /* This is actually a static link, or it is a
13515 -Bsymbolic link and the symbol is defined
13516 locally, or the symbol was forced to be local
13517 because of a version file. */
13521 BFD_ASSERT (h->elf.dynindx != -1);
13522 indx = h->elf.dynindx;
13523 unresolved_reloc = FALSE;
13525 ent = h->elf.got.glist;
13529 if (local_got_ents == NULL)
13531 ent = local_got_ents[r_symndx];
13534 for (; ent != NULL; ent = ent->next)
13535 if (ent->addend == orig_rel.r_addend
13536 && ent->owner == input_bfd
13537 && ent->tls_type == tls_type)
13543 if (ent->is_indirect)
13544 ent = ent->got.ent;
13545 offp = &ent->got.offset;
13546 got = ppc64_elf_tdata (ent->owner)->got;
13550 /* The offset must always be a multiple of 8. We use the
13551 least significant bit to record whether we have already
13552 processed this entry. */
13554 if ((off & 1) != 0)
13558 /* Generate relocs for the dynamic linker, except in
13559 the case of TLSLD where we'll use one entry per
13567 ? h->elf.type == STT_GNU_IFUNC
13568 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
13570 relgot = htab->reliplt;
13571 else if ((info->shared || indx != 0)
13573 || (tls_type == (TLS_TLS | TLS_LD)
13574 && !h->elf.def_dynamic)
13575 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
13576 || h->elf.root.type != bfd_link_hash_undefweak))
13577 relgot = ppc64_elf_tdata (ent->owner)->relgot;
13578 if (relgot != NULL)
13580 outrel.r_offset = (got->output_section->vma
13581 + got->output_offset
13583 outrel.r_addend = addend;
13584 if (tls_type & (TLS_LD | TLS_GD))
13586 outrel.r_addend = 0;
13587 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
13588 if (tls_type == (TLS_TLS | TLS_GD))
13590 loc = relgot->contents;
13591 loc += (relgot->reloc_count++
13592 * sizeof (Elf64_External_Rela));
13593 bfd_elf64_swap_reloca_out (output_bfd,
13595 outrel.r_offset += 8;
13596 outrel.r_addend = addend;
13598 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
13601 else if (tls_type == (TLS_TLS | TLS_DTPREL))
13602 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
13603 else if (tls_type == (TLS_TLS | TLS_TPREL))
13604 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
13605 else if (indx != 0)
13606 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
13610 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13612 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13614 /* Write the .got section contents for the sake
13616 loc = got->contents + off;
13617 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
13621 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
13623 outrel.r_addend += relocation;
13624 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
13625 outrel.r_addend -= htab->elf.tls_sec->vma;
13627 loc = relgot->contents;
13628 loc += (relgot->reloc_count++
13629 * sizeof (Elf64_External_Rela));
13630 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
13633 /* Init the .got section contents here if we're not
13634 emitting a reloc. */
13637 relocation += addend;
13638 if (tls_type == (TLS_TLS | TLS_LD))
13640 else if (tls_type != 0)
13642 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
13643 if (tls_type == (TLS_TLS | TLS_TPREL))
13644 relocation += DTP_OFFSET - TP_OFFSET;
13646 if (tls_type == (TLS_TLS | TLS_GD))
13648 bfd_put_64 (output_bfd, relocation,
13649 got->contents + off + 8);
13654 bfd_put_64 (output_bfd, relocation,
13655 got->contents + off);
13659 if (off >= (bfd_vma) -2)
13662 relocation = got->output_section->vma + got->output_offset + off;
13663 addend = -(TOCstart + htab->stub_group[input_section->id].toc_off);
13667 case R_PPC64_PLT16_HA:
13668 case R_PPC64_PLT16_HI:
13669 case R_PPC64_PLT16_LO:
13670 case R_PPC64_PLT32:
13671 case R_PPC64_PLT64:
13672 /* Relocation is to the entry for this symbol in the
13673 procedure linkage table. */
13675 /* Resolve a PLT reloc against a local symbol directly,
13676 without using the procedure linkage table. */
13680 /* It's possible that we didn't make a PLT entry for this
13681 symbol. This happens when statically linking PIC code,
13682 or when using -Bsymbolic. Go find a match if there is a
13684 if (htab->plt != NULL)
13686 struct plt_entry *ent;
13687 for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
13688 if (ent->addend == orig_rel.r_addend
13689 && ent->plt.offset != (bfd_vma) -1)
13691 relocation = (htab->plt->output_section->vma
13692 + htab->plt->output_offset
13693 + ent->plt.offset);
13694 unresolved_reloc = FALSE;
13700 /* Relocation value is TOC base. */
13701 relocation = TOCstart;
13702 if (r_symndx == STN_UNDEF)
13703 relocation += htab->stub_group[input_section->id].toc_off;
13704 else if (unresolved_reloc)
13706 else if (sec != NULL && sec->id <= htab->top_id)
13707 relocation += htab->stub_group[sec->id].toc_off;
13709 unresolved_reloc = TRUE;
13712 /* TOC16 relocs. We want the offset relative to the TOC base,
13713 which is the address of the start of the TOC plus 0x8000.
13714 The TOC consists of sections .got, .toc, .tocbss, and .plt,
13716 case R_PPC64_TOC16:
13717 case R_PPC64_TOC16_LO:
13718 case R_PPC64_TOC16_HI:
13719 case R_PPC64_TOC16_DS:
13720 case R_PPC64_TOC16_LO_DS:
13721 case R_PPC64_TOC16_HA:
13722 addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
13725 /* Relocate against the beginning of the section. */
13726 case R_PPC64_SECTOFF:
13727 case R_PPC64_SECTOFF_LO:
13728 case R_PPC64_SECTOFF_HI:
13729 case R_PPC64_SECTOFF_DS:
13730 case R_PPC64_SECTOFF_LO_DS:
13731 case R_PPC64_SECTOFF_HA:
13733 addend -= sec->output_section->vma;
13736 case R_PPC64_REL16:
13737 case R_PPC64_REL16_LO:
13738 case R_PPC64_REL16_HI:
13739 case R_PPC64_REL16_HA:
13742 case R_PPC64_REL14:
13743 case R_PPC64_REL14_BRNTAKEN:
13744 case R_PPC64_REL14_BRTAKEN:
13745 case R_PPC64_REL24:
13748 case R_PPC64_TPREL16:
13749 case R_PPC64_TPREL16_LO:
13750 case R_PPC64_TPREL16_HI:
13751 case R_PPC64_TPREL16_HA:
13752 case R_PPC64_TPREL16_DS:
13753 case R_PPC64_TPREL16_LO_DS:
13754 case R_PPC64_TPREL16_HIGH:
13755 case R_PPC64_TPREL16_HIGHA:
13756 case R_PPC64_TPREL16_HIGHER:
13757 case R_PPC64_TPREL16_HIGHERA:
13758 case R_PPC64_TPREL16_HIGHEST:
13759 case R_PPC64_TPREL16_HIGHESTA:
13761 && h->elf.root.type == bfd_link_hash_undefweak
13762 && h->elf.dynindx == -1)
13764 /* Make this relocation against an undefined weak symbol
13765 resolve to zero. This is really just a tweak, since
13766 code using weak externs ought to check that they are
13767 defined before using them. */
13768 bfd_byte *p = contents + rel->r_offset - d_offset;
13770 insn = bfd_get_32 (output_bfd, p);
13771 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
13773 bfd_put_32 (output_bfd, insn, p);
13776 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
13778 /* The TPREL16 relocs shouldn't really be used in shared
13779 libs as they will result in DT_TEXTREL being set, but
13780 support them anyway. */
13784 case R_PPC64_DTPREL16:
13785 case R_PPC64_DTPREL16_LO:
13786 case R_PPC64_DTPREL16_HI:
13787 case R_PPC64_DTPREL16_HA:
13788 case R_PPC64_DTPREL16_DS:
13789 case R_PPC64_DTPREL16_LO_DS:
13790 case R_PPC64_DTPREL16_HIGH:
13791 case R_PPC64_DTPREL16_HIGHA:
13792 case R_PPC64_DTPREL16_HIGHER:
13793 case R_PPC64_DTPREL16_HIGHERA:
13794 case R_PPC64_DTPREL16_HIGHEST:
13795 case R_PPC64_DTPREL16_HIGHESTA:
13796 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
13799 case R_PPC64_DTPMOD64:
13804 case R_PPC64_TPREL64:
13805 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
13808 case R_PPC64_DTPREL64:
13809 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
13812 /* Relocations that may need to be propagated if this is a
13814 case R_PPC64_REL30:
13815 case R_PPC64_REL32:
13816 case R_PPC64_REL64:
13817 case R_PPC64_ADDR14:
13818 case R_PPC64_ADDR14_BRNTAKEN:
13819 case R_PPC64_ADDR14_BRTAKEN:
13820 case R_PPC64_ADDR16:
13821 case R_PPC64_ADDR16_DS:
13822 case R_PPC64_ADDR16_HA:
13823 case R_PPC64_ADDR16_HI:
13824 case R_PPC64_ADDR16_HIGH:
13825 case R_PPC64_ADDR16_HIGHA:
13826 case R_PPC64_ADDR16_HIGHER:
13827 case R_PPC64_ADDR16_HIGHERA:
13828 case R_PPC64_ADDR16_HIGHEST:
13829 case R_PPC64_ADDR16_HIGHESTA:
13830 case R_PPC64_ADDR16_LO:
13831 case R_PPC64_ADDR16_LO_DS:
13832 case R_PPC64_ADDR24:
13833 case R_PPC64_ADDR32:
13834 case R_PPC64_ADDR64:
13835 case R_PPC64_UADDR16:
13836 case R_PPC64_UADDR32:
13837 case R_PPC64_UADDR64:
13839 if ((input_section->flags & SEC_ALLOC) == 0)
13842 if (NO_OPD_RELOCS && is_opd)
13847 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
13848 || h->elf.root.type != bfd_link_hash_undefweak)
13849 && (must_be_dyn_reloc (info, r_type)
13850 || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
13851 || (ELIMINATE_COPY_RELOCS
13854 && h->elf.dynindx != -1
13855 && !h->elf.non_got_ref
13856 && !h->elf.def_regular)
13859 ? h->elf.type == STT_GNU_IFUNC
13860 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
13862 bfd_boolean skip, relocate;
13866 /* When generating a dynamic object, these relocations
13867 are copied into the output file to be resolved at run
13873 out_off = _bfd_elf_section_offset (output_bfd, info,
13874 input_section, rel->r_offset);
13875 if (out_off == (bfd_vma) -1)
13877 else if (out_off == (bfd_vma) -2)
13878 skip = TRUE, relocate = TRUE;
13879 out_off += (input_section->output_section->vma
13880 + input_section->output_offset);
13881 outrel.r_offset = out_off;
13882 outrel.r_addend = rel->r_addend;
13884 /* Optimize unaligned reloc use. */
13885 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
13886 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
13887 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
13888 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
13889 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
13890 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
13891 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
13892 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
13893 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
13896 memset (&outrel, 0, sizeof outrel);
13897 else if (!SYMBOL_CALLS_LOCAL (info, &h->elf)
13899 && r_type != R_PPC64_TOC)
13901 BFD_ASSERT (h->elf.dynindx != -1);
13902 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
13906 /* This symbol is local, or marked to become local,
13907 or this is an opd section reloc which must point
13908 at a local function. */
13909 outrel.r_addend += relocation;
13910 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
13912 if (is_opd && h != NULL)
13914 /* Lie about opd entries. This case occurs
13915 when building shared libraries and we
13916 reference a function in another shared
13917 lib. The same thing happens for a weak
13918 definition in an application that's
13919 overridden by a strong definition in a
13920 shared lib. (I believe this is a generic
13921 bug in binutils handling of weak syms.)
13922 In these cases we won't use the opd
13923 entry in this lib. */
13924 unresolved_reloc = FALSE;
13927 && r_type == R_PPC64_ADDR64
13929 ? h->elf.type == STT_GNU_IFUNC
13930 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
13931 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13934 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13936 /* We need to relocate .opd contents for ld.so.
13937 Prelink also wants simple and consistent rules
13938 for relocs. This make all RELATIVE relocs have
13939 *r_offset equal to r_addend. */
13948 ? h->elf.type == STT_GNU_IFUNC
13949 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13951 info->callbacks->einfo
13952 (_("%P: %H: %s for indirect "
13953 "function `%T' unsupported\n"),
13954 input_bfd, input_section, rel->r_offset,
13955 ppc64_elf_howto_table[r_type]->name,
13959 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
13961 else if (sec == NULL || sec->owner == NULL)
13963 bfd_set_error (bfd_error_bad_value);
13970 osec = sec->output_section;
13971 indx = elf_section_data (osec)->dynindx;
13975 if ((osec->flags & SEC_READONLY) == 0
13976 && htab->elf.data_index_section != NULL)
13977 osec = htab->elf.data_index_section;
13979 osec = htab->elf.text_index_section;
13980 indx = elf_section_data (osec)->dynindx;
13982 BFD_ASSERT (indx != 0);
13984 /* We are turning this relocation into one
13985 against a section symbol, so subtract out
13986 the output section's address but not the
13987 offset of the input section in the output
13989 outrel.r_addend -= osec->vma;
13992 outrel.r_info = ELF64_R_INFO (indx, r_type);
13996 sreloc = elf_section_data (input_section)->sreloc;
13998 ? h->elf.type == STT_GNU_IFUNC
13999 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14000 sreloc = htab->reliplt;
14001 if (sreloc == NULL)
14004 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
14007 loc = sreloc->contents;
14008 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
14009 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14011 /* If this reloc is against an external symbol, it will
14012 be computed at runtime, so there's no need to do
14013 anything now. However, for the sake of prelink ensure
14014 that the section contents are a known value. */
14017 unresolved_reloc = FALSE;
14018 /* The value chosen here is quite arbitrary as ld.so
14019 ignores section contents except for the special
14020 case of .opd where the contents might be accessed
14021 before relocation. Choose zero, as that won't
14022 cause reloc overflow. */
14025 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
14026 to improve backward compatibility with older
14028 if (r_type == R_PPC64_ADDR64)
14029 addend = outrel.r_addend;
14030 /* Adjust pc_relative relocs to have zero in *r_offset. */
14031 else if (ppc64_elf_howto_table[r_type]->pc_relative)
14032 addend = (input_section->output_section->vma
14033 + input_section->output_offset
14040 case R_PPC64_GLOB_DAT:
14041 case R_PPC64_JMP_SLOT:
14042 case R_PPC64_JMP_IREL:
14043 case R_PPC64_RELATIVE:
14044 /* We shouldn't ever see these dynamic relocs in relocatable
14046 /* Fall through. */
14048 case R_PPC64_PLTGOT16:
14049 case R_PPC64_PLTGOT16_DS:
14050 case R_PPC64_PLTGOT16_HA:
14051 case R_PPC64_PLTGOT16_HI:
14052 case R_PPC64_PLTGOT16_LO:
14053 case R_PPC64_PLTGOT16_LO_DS:
14054 case R_PPC64_PLTREL32:
14055 case R_PPC64_PLTREL64:
14056 /* These ones haven't been implemented yet. */
14058 info->callbacks->einfo
14059 (_("%P: %B: %s is not supported for `%T'\n"),
14061 ppc64_elf_howto_table[r_type]->name, sym_name);
14063 bfd_set_error (bfd_error_invalid_operation);
14068 /* Multi-instruction sequences that access the TOC can be
14069 optimized, eg. addis ra,r2,0; addi rb,ra,x;
14070 to nop; addi rb,r2,x; */
14076 case R_PPC64_GOT_TLSLD16_HI:
14077 case R_PPC64_GOT_TLSGD16_HI:
14078 case R_PPC64_GOT_TPREL16_HI:
14079 case R_PPC64_GOT_DTPREL16_HI:
14080 case R_PPC64_GOT16_HI:
14081 case R_PPC64_TOC16_HI:
14082 /* These relocs would only be useful if building up an
14083 offset to later add to r2, perhaps in an indexed
14084 addressing mode instruction. Don't try to optimize.
14085 Unfortunately, the possibility of someone building up an
14086 offset like this or even with the HA relocs, means that
14087 we need to check the high insn when optimizing the low
14091 case R_PPC64_GOT_TLSLD16_HA:
14092 case R_PPC64_GOT_TLSGD16_HA:
14093 case R_PPC64_GOT_TPREL16_HA:
14094 case R_PPC64_GOT_DTPREL16_HA:
14095 case R_PPC64_GOT16_HA:
14096 case R_PPC64_TOC16_HA:
14097 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
14098 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
14100 bfd_byte *p = contents + (rel->r_offset & ~3);
14101 bfd_put_32 (input_bfd, NOP, p);
14105 case R_PPC64_GOT_TLSLD16_LO:
14106 case R_PPC64_GOT_TLSGD16_LO:
14107 case R_PPC64_GOT_TPREL16_LO_DS:
14108 case R_PPC64_GOT_DTPREL16_LO_DS:
14109 case R_PPC64_GOT16_LO:
14110 case R_PPC64_GOT16_LO_DS:
14111 case R_PPC64_TOC16_LO:
14112 case R_PPC64_TOC16_LO_DS:
14113 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
14114 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
14116 bfd_byte *p = contents + (rel->r_offset & ~3);
14117 insn = bfd_get_32 (input_bfd, p);
14118 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
14120 /* Transform addic to addi when we change reg. */
14121 insn &= ~((0x3f << 26) | (0x1f << 16));
14122 insn |= (14u << 26) | (2 << 16);
14126 insn &= ~(0x1f << 16);
14129 bfd_put_32 (input_bfd, insn, p);
14134 /* Do any further special processing. */
14140 case R_PPC64_REL16_HA:
14141 case R_PPC64_ADDR16_HA:
14142 case R_PPC64_ADDR16_HIGHA:
14143 case R_PPC64_ADDR16_HIGHERA:
14144 case R_PPC64_ADDR16_HIGHESTA:
14145 case R_PPC64_TOC16_HA:
14146 case R_PPC64_SECTOFF_HA:
14147 case R_PPC64_TPREL16_HA:
14148 case R_PPC64_TPREL16_HIGHA:
14149 case R_PPC64_TPREL16_HIGHERA:
14150 case R_PPC64_TPREL16_HIGHESTA:
14151 case R_PPC64_DTPREL16_HA:
14152 case R_PPC64_DTPREL16_HIGHA:
14153 case R_PPC64_DTPREL16_HIGHERA:
14154 case R_PPC64_DTPREL16_HIGHESTA:
14155 /* It's just possible that this symbol is a weak symbol
14156 that's not actually defined anywhere. In that case,
14157 'sec' would be NULL, and we should leave the symbol
14158 alone (it will be set to zero elsewhere in the link). */
14163 case R_PPC64_GOT16_HA:
14164 case R_PPC64_PLTGOT16_HA:
14165 case R_PPC64_PLT16_HA:
14166 case R_PPC64_GOT_TLSGD16_HA:
14167 case R_PPC64_GOT_TLSLD16_HA:
14168 case R_PPC64_GOT_TPREL16_HA:
14169 case R_PPC64_GOT_DTPREL16_HA:
14170 /* Add 0x10000 if sign bit in 0:15 is set.
14171 Bits 0:15 are not used. */
14175 case R_PPC64_ADDR16_DS:
14176 case R_PPC64_ADDR16_LO_DS:
14177 case R_PPC64_GOT16_DS:
14178 case R_PPC64_GOT16_LO_DS:
14179 case R_PPC64_PLT16_LO_DS:
14180 case R_PPC64_SECTOFF_DS:
14181 case R_PPC64_SECTOFF_LO_DS:
14182 case R_PPC64_TOC16_DS:
14183 case R_PPC64_TOC16_LO_DS:
14184 case R_PPC64_PLTGOT16_DS:
14185 case R_PPC64_PLTGOT16_LO_DS:
14186 case R_PPC64_GOT_TPREL16_DS:
14187 case R_PPC64_GOT_TPREL16_LO_DS:
14188 case R_PPC64_GOT_DTPREL16_DS:
14189 case R_PPC64_GOT_DTPREL16_LO_DS:
14190 case R_PPC64_TPREL16_DS:
14191 case R_PPC64_TPREL16_LO_DS:
14192 case R_PPC64_DTPREL16_DS:
14193 case R_PPC64_DTPREL16_LO_DS:
14194 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
14196 /* If this reloc is against an lq insn, then the value must be
14197 a multiple of 16. This is somewhat of a hack, but the
14198 "correct" way to do this by defining _DQ forms of all the
14199 _DS relocs bloats all reloc switches in this file. It
14200 doesn't seem to make much sense to use any of these relocs
14201 in data, so testing the insn should be safe. */
14202 if ((insn & (0x3f << 26)) == (56u << 26))
14204 if (((relocation + addend) & mask) != 0)
14206 info->callbacks->einfo
14207 (_("%P: %H: error: %s not a multiple of %u\n"),
14208 input_bfd, input_section, rel->r_offset,
14209 ppc64_elf_howto_table[r_type]->name,
14211 bfd_set_error (bfd_error_bad_value);
14218 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
14219 because such sections are not SEC_ALLOC and thus ld.so will
14220 not process them. */
14221 if (unresolved_reloc
14222 && !((input_section->flags & SEC_DEBUGGING) != 0
14223 && h->elf.def_dynamic)
14224 && _bfd_elf_section_offset (output_bfd, info, input_section,
14225 rel->r_offset) != (bfd_vma) -1)
14227 info->callbacks->einfo
14228 (_("%P: %H: unresolvable %s against `%T'\n"),
14229 input_bfd, input_section, rel->r_offset,
14230 ppc64_elf_howto_table[(int) r_type]->name,
14231 h->elf.root.root.string);
14235 r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
14243 if (r != bfd_reloc_ok)
14245 char *more_info = NULL;
14246 const char *reloc_name = ppc64_elf_howto_table[r_type]->name;
14248 if (reloc_dest != DEST_NORMAL)
14250 more_info = bfd_malloc (strlen (reloc_name) + 8);
14251 if (more_info != NULL)
14253 strcpy (more_info, reloc_name);
14254 strcat (more_info, (reloc_dest == DEST_OPD
14255 ? " (OPD)" : " (stub)"));
14256 reloc_name = more_info;
14260 if (r == bfd_reloc_overflow)
14265 && h->elf.root.type == bfd_link_hash_undefweak
14266 && ppc64_elf_howto_table[r_type]->pc_relative)
14268 /* Assume this is a call protected by other code that
14269 detects the symbol is undefined. If this is the case,
14270 we can safely ignore the overflow. If not, the
14271 program is hosed anyway, and a little warning isn't
14277 if (!((*info->callbacks->reloc_overflow)
14278 (info, &h->elf.root, sym_name,
14279 reloc_name, orig_rel.r_addend,
14280 input_bfd, input_section, rel->r_offset)))
14285 info->callbacks->einfo
14286 (_("%P: %H: %s against `%T': error %d\n"),
14287 input_bfd, input_section, rel->r_offset,
14288 reloc_name, sym_name, (int) r);
14291 if (more_info != NULL)
14296 /* If we're emitting relocations, then shortly after this function
14297 returns, reloc offsets and addends for this section will be
14298 adjusted. Worse, reloc symbol indices will be for the output
14299 file rather than the input. Save a copy of the relocs for
14300 opd_entry_value. */
14301 if (is_opd && (info->emitrelocations || info->relocatable))
14304 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
14305 rel = bfd_alloc (input_bfd, amt);
14306 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
14307 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
14310 memcpy (rel, relocs, amt);
14315 /* Adjust the value of any local symbols in opd sections. */
14318 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
14319 const char *name ATTRIBUTE_UNUSED,
14320 Elf_Internal_Sym *elfsym,
14321 asection *input_sec,
14322 struct elf_link_hash_entry *h)
14324 struct _opd_sec_data *opd;
14331 opd = get_opd_info (input_sec);
14332 if (opd == NULL || opd->adjust == NULL)
14335 value = elfsym->st_value - input_sec->output_offset;
14336 if (!info->relocatable)
14337 value -= input_sec->output_section->vma;
14339 adjust = opd->adjust[value / 8];
14343 elfsym->st_value += adjust;
14347 /* Finish up dynamic symbol handling. We set the contents of various
14348 dynamic sections here. */
14351 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
14352 struct bfd_link_info *info,
14353 struct elf_link_hash_entry *h,
14354 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
14356 struct ppc_link_hash_table *htab;
14357 struct plt_entry *ent;
14358 Elf_Internal_Rela rela;
14361 htab = ppc_hash_table (info);
14365 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
14366 if (ent->plt.offset != (bfd_vma) -1)
14368 /* This symbol has an entry in the procedure linkage
14369 table. Set it up. */
14370 if (!htab->elf.dynamic_sections_created
14371 || h->dynindx == -1)
14373 BFD_ASSERT (h->type == STT_GNU_IFUNC
14375 && (h->root.type == bfd_link_hash_defined
14376 || h->root.type == bfd_link_hash_defweak));
14377 rela.r_offset = (htab->iplt->output_section->vma
14378 + htab->iplt->output_offset
14379 + ent->plt.offset);
14381 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
14383 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14384 rela.r_addend = (h->root.u.def.value
14385 + h->root.u.def.section->output_offset
14386 + h->root.u.def.section->output_section->vma
14388 loc = (htab->reliplt->contents
14389 + (htab->reliplt->reloc_count++
14390 * sizeof (Elf64_External_Rela)));
14394 rela.r_offset = (htab->plt->output_section->vma
14395 + htab->plt->output_offset
14396 + ent->plt.offset);
14397 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
14398 rela.r_addend = ent->addend;
14399 loc = (htab->relplt->contents
14400 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE)
14401 / (PLT_ENTRY_SIZE / sizeof (Elf64_External_Rela))));
14403 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
14408 /* This symbol needs a copy reloc. Set it up. */
14410 if (h->dynindx == -1
14411 || (h->root.type != bfd_link_hash_defined
14412 && h->root.type != bfd_link_hash_defweak)
14413 || htab->relbss == NULL)
14416 rela.r_offset = (h->root.u.def.value
14417 + h->root.u.def.section->output_section->vma
14418 + h->root.u.def.section->output_offset);
14419 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
14421 loc = htab->relbss->contents;
14422 loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
14423 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
14429 /* Used to decide how to sort relocs in an optimal manner for the
14430 dynamic linker, before writing them out. */
14432 static enum elf_reloc_type_class
14433 ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
14434 const asection *rel_sec,
14435 const Elf_Internal_Rela *rela)
14437 enum elf_ppc64_reloc_type r_type;
14438 struct ppc_link_hash_table *htab = ppc_hash_table (info);
14440 if (rel_sec == htab->reliplt)
14441 return reloc_class_ifunc;
14443 r_type = ELF64_R_TYPE (rela->r_info);
14446 case R_PPC64_RELATIVE:
14447 return reloc_class_relative;
14448 case R_PPC64_JMP_SLOT:
14449 return reloc_class_plt;
14451 return reloc_class_copy;
14453 return reloc_class_normal;
14457 /* Finish up the dynamic sections. */
14460 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
14461 struct bfd_link_info *info)
14463 struct ppc_link_hash_table *htab;
14467 htab = ppc_hash_table (info);
14471 dynobj = htab->elf.dynobj;
14472 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
14474 if (htab->elf.dynamic_sections_created)
14476 Elf64_External_Dyn *dyncon, *dynconend;
14478 if (sdyn == NULL || htab->got == NULL)
14481 dyncon = (Elf64_External_Dyn *) sdyn->contents;
14482 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
14483 for (; dyncon < dynconend; dyncon++)
14485 Elf_Internal_Dyn dyn;
14488 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
14495 case DT_PPC64_GLINK:
14497 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14498 /* We stupidly defined DT_PPC64_GLINK to be the start
14499 of glink rather than the first entry point, which is
14500 what ld.so needs, and now have a bigger stub to
14501 support automatic multiple TOCs. */
14502 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
14506 s = bfd_get_section_by_name (output_bfd, ".opd");
14509 dyn.d_un.d_ptr = s->vma;
14512 case DT_PPC64_OPDSZ:
14513 s = bfd_get_section_by_name (output_bfd, ".opd");
14516 dyn.d_un.d_val = s->size;
14521 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14526 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14530 dyn.d_un.d_val = htab->relplt->size;
14534 /* Don't count procedure linkage table relocs in the
14535 overall reloc count. */
14539 dyn.d_un.d_val -= s->size;
14543 /* We may not be using the standard ELF linker script.
14544 If .rela.plt is the first .rela section, we adjust
14545 DT_RELA to not include it. */
14549 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
14551 dyn.d_un.d_ptr += s->size;
14555 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
14559 if (htab->got != NULL && htab->got->size != 0)
14561 /* Fill in the first entry in the global offset table.
14562 We use it to hold the link-time TOCbase. */
14563 bfd_put_64 (output_bfd,
14564 elf_gp (output_bfd) + TOC_BASE_OFF,
14565 htab->got->contents);
14567 /* Set .got entry size. */
14568 elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
14571 if (htab->plt != NULL && htab->plt->size != 0)
14573 /* Set .plt entry size. */
14574 elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
14578 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
14579 brlt ourselves if emitrelocations. */
14580 if (htab->brlt != NULL
14581 && htab->brlt->reloc_count != 0
14582 && !_bfd_elf_link_output_relocs (output_bfd,
14584 elf_section_data (htab->brlt)->rela.hdr,
14585 elf_section_data (htab->brlt)->relocs,
14589 if (htab->glink != NULL
14590 && htab->glink->reloc_count != 0
14591 && !_bfd_elf_link_output_relocs (output_bfd,
14593 elf_section_data (htab->glink)->rela.hdr,
14594 elf_section_data (htab->glink)->relocs,
14599 if (htab->glink_eh_frame != NULL
14600 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
14601 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
14602 htab->glink_eh_frame,
14603 htab->glink_eh_frame->contents))
14606 /* We need to handle writing out multiple GOT sections ourselves,
14607 since we didn't add them to DYNOBJ. We know dynobj is the first
14609 while ((dynobj = dynobj->link_next) != NULL)
14613 if (!is_ppc64_elf (dynobj))
14616 s = ppc64_elf_tdata (dynobj)->got;
14619 && s->output_section != bfd_abs_section_ptr
14620 && !bfd_set_section_contents (output_bfd, s->output_section,
14621 s->contents, s->output_offset,
14624 s = ppc64_elf_tdata (dynobj)->relgot;
14627 && s->output_section != bfd_abs_section_ptr
14628 && !bfd_set_section_contents (output_bfd, s->output_section,
14629 s->contents, s->output_offset,
14637 #include "elf64-target.h"
14639 /* FreeBSD support */
14641 #undef TARGET_LITTLE_SYM
14642 #undef TARGET_LITTLE_NAME
14644 #undef TARGET_BIG_SYM
14645 #define TARGET_BIG_SYM bfd_elf64_powerpc_freebsd_vec
14646 #undef TARGET_BIG_NAME
14647 #define TARGET_BIG_NAME "elf64-powerpc-freebsd"
14650 #define ELF_OSABI ELFOSABI_FREEBSD
14653 #define elf64_bed elf64_powerpc_fbsd_bed
14655 #include "elf64-target.h"