1 /* PowerPC64-specific support for 64-bit ELF.
2 Copyright (C) 1999-2017 Free Software Foundation, Inc.
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
5 Largely rewritten by Alan Modra.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
24 /* The 64-bit PowerPC ELF ABI may be found at
25 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
34 #include "elf/ppc64.h"
35 #include "elf64-ppc.h"
38 static bfd_reloc_status_type ppc64_elf_ha_reloc
39 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type ppc64_elf_branch_reloc
41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_reloc_status_type ppc64_elf_brtaken_reloc
43 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
44 static bfd_reloc_status_type ppc64_elf_sectoff_reloc
45 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
46 static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
47 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
48 static bfd_reloc_status_type ppc64_elf_toc_reloc
49 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
50 static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
51 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
52 static bfd_reloc_status_type ppc64_elf_toc64_reloc
53 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
54 static bfd_reloc_status_type ppc64_elf_unhandled_reloc
55 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
56 static bfd_vma opd_entry_value
57 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
59 #define TARGET_LITTLE_SYM powerpc_elf64_le_vec
60 #define TARGET_LITTLE_NAME "elf64-powerpcle"
61 #define TARGET_BIG_SYM powerpc_elf64_vec
62 #define TARGET_BIG_NAME "elf64-powerpc"
63 #define ELF_ARCH bfd_arch_powerpc
64 #define ELF_TARGET_ID PPC64_ELF_DATA
65 #define ELF_MACHINE_CODE EM_PPC64
66 #define ELF_MAXPAGESIZE 0x10000
67 #define ELF_COMMONPAGESIZE 0x10000
68 #define elf_info_to_howto ppc64_elf_info_to_howto
70 #define elf_backend_want_got_sym 0
71 #define elf_backend_want_plt_sym 0
72 #define elf_backend_plt_alignment 3
73 #define elf_backend_plt_not_loaded 1
74 #define elf_backend_got_header_size 8
75 #define elf_backend_want_dynrelro 1
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_dtrel_excludes_plt 1
80 #define elf_backend_default_execstack 0
82 #define bfd_elf64_mkobject ppc64_elf_mkobject
83 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
84 #define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
85 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
86 #define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
87 #define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
88 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
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
91 #define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
93 #define elf_backend_object_p ppc64_elf_object_p
94 #define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
95 #define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
96 #define elf_backend_write_core_note ppc64_elf_write_core_note
97 #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
98 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
99 #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
100 #define elf_backend_check_directives ppc64_elf_before_check_relocs
101 #define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
102 #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
103 #define elf_backend_check_relocs ppc64_elf_check_relocs
104 #define elf_backend_gc_keep ppc64_elf_gc_keep
105 #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
106 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_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_hash_symbol ppc64_elf_hash_symbol
113 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
114 #define elf_backend_action_discarded ppc64_elf_action_discarded
115 #define elf_backend_relocate_section ppc64_elf_relocate_section
116 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
117 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
118 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
119 #define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
120 #define elf_backend_special_sections ppc64_elf_special_sections
121 #define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
122 #define elf_backend_merge_symbol ppc64_elf_merge_symbol
123 #define elf_backend_get_reloc_section bfd_get_section_by_name
125 /* The name of the dynamic interpreter. This is put in the .interp
127 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
129 /* The size in bytes of an entry in the procedure linkage table. */
130 #define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
132 /* The initial size of the plt reserved for the dynamic linker. */
133 #define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
135 /* Offsets to some stack save slots. */
137 #define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
138 /* This one is dodgy. ELFv2 does not have a linker word, so use the
139 CR save slot. Used only by optimised __tls_get_addr call stub,
140 relying on __tls_get_addr_opt not saving CR.. */
141 #define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
143 /* TOC base pointers offset from start of TOC. */
144 #define TOC_BASE_OFF 0x8000
145 /* TOC base alignment. */
146 #define TOC_BASE_ALIGN 256
148 /* Offset of tp and dtp pointers from start of TLS block. */
149 #define TP_OFFSET 0x7000
150 #define DTP_OFFSET 0x8000
152 /* .plt call stub instructions. The normal stub is like this, but
153 sometimes the .plt entry crosses a 64k boundary and we need to
154 insert an addi to adjust r11. */
155 #define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
156 #define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
157 #define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
158 #define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
159 #define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
160 #define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
161 #define BCTR 0x4e800420 /* bctr */
163 #define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
164 #define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
165 #define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
167 #define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
168 #define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
169 #define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
170 #define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
171 #define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
172 #define BNECTR 0x4ca20420 /* bnectr+ */
173 #define BNECTR_P4 0x4ce20420 /* bnectr+ */
175 #define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
176 #define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
177 #define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
179 #define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
180 #define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */
181 #define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */
183 #define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */
184 #define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */
185 #define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
186 #define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
187 #define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
189 /* glink call stub instructions. We enter with the index in R0. */
190 #define GLINK_CALL_STUB_SIZE (16*4)
194 #define MFLR_R12 0x7d8802a6 /* mflr %12 */
195 #define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
197 #define MFLR_R11 0x7d6802a6 /* mflr %11 */
198 /* ld %2,(0b-1b)(%11) */
199 #define MTLR_R12 0x7d8803a6 /* mtlr %12 */
200 #define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
206 #define MFLR_R0 0x7c0802a6 /* mflr %r0 */
207 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
208 #define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
209 #define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
210 #define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
213 #define NOP 0x60000000
215 /* Some other nops. */
216 #define CROR_151515 0x4def7b82
217 #define CROR_313131 0x4ffffb82
219 /* .glink entries for the first 32k functions are two instructions. */
220 #define LI_R0_0 0x38000000 /* li %r0,0 */
221 #define B_DOT 0x48000000 /* b . */
223 /* After that, we need two instructions to load the index, followed by
225 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */
226 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
228 /* Instructions used by the save and restore reg functions. */
229 #define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
230 #define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
231 #define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
232 #define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
233 #define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
234 #define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
235 #define LI_R12_0 0x39800000 /* li %r12,0 */
236 #define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
237 #define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
238 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
239 #define BLR 0x4e800020 /* blr */
241 /* Since .opd is an array of descriptors and each entry will end up
242 with identical R_PPC64_RELATIVE relocs, there is really no need to
243 propagate .opd relocs; The dynamic linker should be taught to
244 relocate .opd without reloc entries. */
245 #ifndef NO_OPD_RELOCS
246 #define NO_OPD_RELOCS 0
250 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
254 abiversion (bfd *abfd)
256 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
260 set_abiversion (bfd *abfd, int ver)
262 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
263 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
266 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
268 /* Relocation HOWTO's. */
269 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
271 static reloc_howto_type ppc64_elf_howto_raw[] = {
272 /* This reloc does nothing. */
273 HOWTO (R_PPC64_NONE, /* type */
275 3, /* size (0 = byte, 1 = short, 2 = long) */
277 FALSE, /* pc_relative */
279 complain_overflow_dont, /* complain_on_overflow */
280 bfd_elf_generic_reloc, /* special_function */
281 "R_PPC64_NONE", /* name */
282 FALSE, /* partial_inplace */
285 FALSE), /* pcrel_offset */
287 /* A standard 32 bit relocation. */
288 HOWTO (R_PPC64_ADDR32, /* type */
290 2, /* size (0 = byte, 1 = short, 2 = long) */
292 FALSE, /* pc_relative */
294 complain_overflow_bitfield, /* complain_on_overflow */
295 bfd_elf_generic_reloc, /* special_function */
296 "R_PPC64_ADDR32", /* name */
297 FALSE, /* partial_inplace */
299 0xffffffff, /* dst_mask */
300 FALSE), /* pcrel_offset */
302 /* An absolute 26 bit branch; the lower two bits must be zero.
303 FIXME: we don't check that, we just clear them. */
304 HOWTO (R_PPC64_ADDR24, /* type */
306 2, /* size (0 = byte, 1 = short, 2 = long) */
308 FALSE, /* pc_relative */
310 complain_overflow_bitfield, /* complain_on_overflow */
311 bfd_elf_generic_reloc, /* special_function */
312 "R_PPC64_ADDR24", /* name */
313 FALSE, /* partial_inplace */
315 0x03fffffc, /* dst_mask */
316 FALSE), /* pcrel_offset */
318 /* A standard 16 bit relocation. */
319 HOWTO (R_PPC64_ADDR16, /* type */
321 1, /* size (0 = byte, 1 = short, 2 = long) */
323 FALSE, /* pc_relative */
325 complain_overflow_bitfield, /* complain_on_overflow */
326 bfd_elf_generic_reloc, /* special_function */
327 "R_PPC64_ADDR16", /* name */
328 FALSE, /* partial_inplace */
330 0xffff, /* dst_mask */
331 FALSE), /* pcrel_offset */
333 /* A 16 bit relocation without overflow. */
334 HOWTO (R_PPC64_ADDR16_LO, /* type */
336 1, /* size (0 = byte, 1 = short, 2 = long) */
338 FALSE, /* pc_relative */
340 complain_overflow_dont,/* complain_on_overflow */
341 bfd_elf_generic_reloc, /* special_function */
342 "R_PPC64_ADDR16_LO", /* name */
343 FALSE, /* partial_inplace */
345 0xffff, /* dst_mask */
346 FALSE), /* pcrel_offset */
348 /* Bits 16-31 of an address. */
349 HOWTO (R_PPC64_ADDR16_HI, /* type */
351 1, /* size (0 = byte, 1 = short, 2 = long) */
353 FALSE, /* pc_relative */
355 complain_overflow_signed, /* complain_on_overflow */
356 bfd_elf_generic_reloc, /* special_function */
357 "R_PPC64_ADDR16_HI", /* name */
358 FALSE, /* partial_inplace */
360 0xffff, /* dst_mask */
361 FALSE), /* pcrel_offset */
363 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
364 bits, treated as a signed number, is negative. */
365 HOWTO (R_PPC64_ADDR16_HA, /* type */
367 1, /* size (0 = byte, 1 = short, 2 = long) */
369 FALSE, /* pc_relative */
371 complain_overflow_signed, /* complain_on_overflow */
372 ppc64_elf_ha_reloc, /* special_function */
373 "R_PPC64_ADDR16_HA", /* name */
374 FALSE, /* partial_inplace */
376 0xffff, /* dst_mask */
377 FALSE), /* pcrel_offset */
379 /* An absolute 16 bit branch; the lower two bits must be zero.
380 FIXME: we don't check that, we just clear them. */
381 HOWTO (R_PPC64_ADDR14, /* type */
383 2, /* size (0 = byte, 1 = short, 2 = long) */
385 FALSE, /* pc_relative */
387 complain_overflow_signed, /* complain_on_overflow */
388 ppc64_elf_branch_reloc, /* special_function */
389 "R_PPC64_ADDR14", /* name */
390 FALSE, /* partial_inplace */
392 0x0000fffc, /* dst_mask */
393 FALSE), /* pcrel_offset */
395 /* An absolute 16 bit branch, for which bit 10 should be set to
396 indicate that the branch is expected to be taken. The lower two
397 bits must be zero. */
398 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
400 2, /* size (0 = byte, 1 = short, 2 = long) */
402 FALSE, /* pc_relative */
404 complain_overflow_signed, /* complain_on_overflow */
405 ppc64_elf_brtaken_reloc, /* special_function */
406 "R_PPC64_ADDR14_BRTAKEN",/* name */
407 FALSE, /* partial_inplace */
409 0x0000fffc, /* dst_mask */
410 FALSE), /* pcrel_offset */
412 /* An absolute 16 bit branch, for which bit 10 should be set to
413 indicate that the branch is not expected to be taken. The lower
414 two bits must be zero. */
415 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
417 2, /* size (0 = byte, 1 = short, 2 = long) */
419 FALSE, /* pc_relative */
421 complain_overflow_signed, /* complain_on_overflow */
422 ppc64_elf_brtaken_reloc, /* special_function */
423 "R_PPC64_ADDR14_BRNTAKEN",/* name */
424 FALSE, /* partial_inplace */
426 0x0000fffc, /* dst_mask */
427 FALSE), /* pcrel_offset */
429 /* A relative 26 bit branch; the lower two bits must be zero. */
430 HOWTO (R_PPC64_REL24, /* type */
432 2, /* size (0 = byte, 1 = short, 2 = long) */
434 TRUE, /* pc_relative */
436 complain_overflow_signed, /* complain_on_overflow */
437 ppc64_elf_branch_reloc, /* special_function */
438 "R_PPC64_REL24", /* name */
439 FALSE, /* partial_inplace */
441 0x03fffffc, /* dst_mask */
442 TRUE), /* pcrel_offset */
444 /* A relative 16 bit branch; the lower two bits must be zero. */
445 HOWTO (R_PPC64_REL14, /* type */
447 2, /* size (0 = byte, 1 = short, 2 = long) */
449 TRUE, /* pc_relative */
451 complain_overflow_signed, /* complain_on_overflow */
452 ppc64_elf_branch_reloc, /* special_function */
453 "R_PPC64_REL14", /* name */
454 FALSE, /* partial_inplace */
456 0x0000fffc, /* dst_mask */
457 TRUE), /* pcrel_offset */
459 /* A relative 16 bit branch. Bit 10 should be set to indicate that
460 the branch is expected to be taken. The lower two bits must be
462 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
464 2, /* size (0 = byte, 1 = short, 2 = long) */
466 TRUE, /* pc_relative */
468 complain_overflow_signed, /* complain_on_overflow */
469 ppc64_elf_brtaken_reloc, /* special_function */
470 "R_PPC64_REL14_BRTAKEN", /* name */
471 FALSE, /* partial_inplace */
473 0x0000fffc, /* dst_mask */
474 TRUE), /* pcrel_offset */
476 /* A relative 16 bit branch. Bit 10 should be set to indicate that
477 the branch is not expected to be taken. The lower two bits must
479 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
481 2, /* size (0 = byte, 1 = short, 2 = long) */
483 TRUE, /* pc_relative */
485 complain_overflow_signed, /* complain_on_overflow */
486 ppc64_elf_brtaken_reloc, /* special_function */
487 "R_PPC64_REL14_BRNTAKEN",/* name */
488 FALSE, /* partial_inplace */
490 0x0000fffc, /* dst_mask */
491 TRUE), /* pcrel_offset */
493 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
495 HOWTO (R_PPC64_GOT16, /* type */
497 1, /* size (0 = byte, 1 = short, 2 = long) */
499 FALSE, /* pc_relative */
501 complain_overflow_signed, /* complain_on_overflow */
502 ppc64_elf_unhandled_reloc, /* special_function */
503 "R_PPC64_GOT16", /* name */
504 FALSE, /* partial_inplace */
506 0xffff, /* dst_mask */
507 FALSE), /* pcrel_offset */
509 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
511 HOWTO (R_PPC64_GOT16_LO, /* type */
513 1, /* size (0 = byte, 1 = short, 2 = long) */
515 FALSE, /* pc_relative */
517 complain_overflow_dont, /* complain_on_overflow */
518 ppc64_elf_unhandled_reloc, /* special_function */
519 "R_PPC64_GOT16_LO", /* name */
520 FALSE, /* partial_inplace */
522 0xffff, /* dst_mask */
523 FALSE), /* pcrel_offset */
525 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
527 HOWTO (R_PPC64_GOT16_HI, /* type */
529 1, /* size (0 = byte, 1 = short, 2 = long) */
531 FALSE, /* pc_relative */
533 complain_overflow_signed,/* complain_on_overflow */
534 ppc64_elf_unhandled_reloc, /* special_function */
535 "R_PPC64_GOT16_HI", /* name */
536 FALSE, /* partial_inplace */
538 0xffff, /* dst_mask */
539 FALSE), /* pcrel_offset */
541 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
543 HOWTO (R_PPC64_GOT16_HA, /* type */
545 1, /* size (0 = byte, 1 = short, 2 = long) */
547 FALSE, /* pc_relative */
549 complain_overflow_signed,/* complain_on_overflow */
550 ppc64_elf_unhandled_reloc, /* special_function */
551 "R_PPC64_GOT16_HA", /* name */
552 FALSE, /* partial_inplace */
554 0xffff, /* dst_mask */
555 FALSE), /* pcrel_offset */
557 /* This is used only by the dynamic linker. The symbol should exist
558 both in the object being run and in some shared library. The
559 dynamic linker copies the data addressed by the symbol from the
560 shared library into the object, because the object being
561 run has to have the data at some particular address. */
562 HOWTO (R_PPC64_COPY, /* type */
564 0, /* this one is variable size */
566 FALSE, /* pc_relative */
568 complain_overflow_dont, /* complain_on_overflow */
569 ppc64_elf_unhandled_reloc, /* special_function */
570 "R_PPC64_COPY", /* name */
571 FALSE, /* partial_inplace */
574 FALSE), /* pcrel_offset */
576 /* Like R_PPC64_ADDR64, but used when setting global offset table
578 HOWTO (R_PPC64_GLOB_DAT, /* type */
580 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
582 FALSE, /* pc_relative */
584 complain_overflow_dont, /* complain_on_overflow */
585 ppc64_elf_unhandled_reloc, /* special_function */
586 "R_PPC64_GLOB_DAT", /* name */
587 FALSE, /* partial_inplace */
589 ONES (64), /* dst_mask */
590 FALSE), /* pcrel_offset */
592 /* Created by the link editor. Marks a procedure linkage table
593 entry for a symbol. */
594 HOWTO (R_PPC64_JMP_SLOT, /* type */
596 0, /* size (0 = byte, 1 = short, 2 = long) */
598 FALSE, /* pc_relative */
600 complain_overflow_dont, /* complain_on_overflow */
601 ppc64_elf_unhandled_reloc, /* special_function */
602 "R_PPC64_JMP_SLOT", /* name */
603 FALSE, /* partial_inplace */
606 FALSE), /* pcrel_offset */
608 /* Used only by the dynamic linker. When the object is run, this
609 doubleword64 is set to the load address of the object, plus the
611 HOWTO (R_PPC64_RELATIVE, /* type */
613 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
615 FALSE, /* pc_relative */
617 complain_overflow_dont, /* complain_on_overflow */
618 bfd_elf_generic_reloc, /* special_function */
619 "R_PPC64_RELATIVE", /* name */
620 FALSE, /* partial_inplace */
622 ONES (64), /* dst_mask */
623 FALSE), /* pcrel_offset */
625 /* Like R_PPC64_ADDR32, but may be unaligned. */
626 HOWTO (R_PPC64_UADDR32, /* type */
628 2, /* size (0 = byte, 1 = short, 2 = long) */
630 FALSE, /* pc_relative */
632 complain_overflow_bitfield, /* complain_on_overflow */
633 bfd_elf_generic_reloc, /* special_function */
634 "R_PPC64_UADDR32", /* name */
635 FALSE, /* partial_inplace */
637 0xffffffff, /* dst_mask */
638 FALSE), /* pcrel_offset */
640 /* Like R_PPC64_ADDR16, but may be unaligned. */
641 HOWTO (R_PPC64_UADDR16, /* type */
643 1, /* size (0 = byte, 1 = short, 2 = long) */
645 FALSE, /* pc_relative */
647 complain_overflow_bitfield, /* complain_on_overflow */
648 bfd_elf_generic_reloc, /* special_function */
649 "R_PPC64_UADDR16", /* name */
650 FALSE, /* partial_inplace */
652 0xffff, /* dst_mask */
653 FALSE), /* pcrel_offset */
655 /* 32-bit PC relative. */
656 HOWTO (R_PPC64_REL32, /* type */
658 2, /* size (0 = byte, 1 = short, 2 = long) */
660 TRUE, /* pc_relative */
662 complain_overflow_signed, /* complain_on_overflow */
663 bfd_elf_generic_reloc, /* special_function */
664 "R_PPC64_REL32", /* name */
665 FALSE, /* partial_inplace */
667 0xffffffff, /* dst_mask */
668 TRUE), /* pcrel_offset */
670 /* 32-bit relocation to the symbol's procedure linkage table. */
671 HOWTO (R_PPC64_PLT32, /* type */
673 2, /* size (0 = byte, 1 = short, 2 = long) */
675 FALSE, /* pc_relative */
677 complain_overflow_bitfield, /* complain_on_overflow */
678 ppc64_elf_unhandled_reloc, /* special_function */
679 "R_PPC64_PLT32", /* name */
680 FALSE, /* partial_inplace */
682 0xffffffff, /* dst_mask */
683 FALSE), /* pcrel_offset */
685 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
686 FIXME: R_PPC64_PLTREL32 not supported. */
687 HOWTO (R_PPC64_PLTREL32, /* type */
689 2, /* size (0 = byte, 1 = short, 2 = long) */
691 TRUE, /* pc_relative */
693 complain_overflow_signed, /* complain_on_overflow */
694 ppc64_elf_unhandled_reloc, /* special_function */
695 "R_PPC64_PLTREL32", /* name */
696 FALSE, /* partial_inplace */
698 0xffffffff, /* dst_mask */
699 TRUE), /* pcrel_offset */
701 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
703 HOWTO (R_PPC64_PLT16_LO, /* type */
705 1, /* size (0 = byte, 1 = short, 2 = long) */
707 FALSE, /* pc_relative */
709 complain_overflow_dont, /* complain_on_overflow */
710 ppc64_elf_unhandled_reloc, /* special_function */
711 "R_PPC64_PLT16_LO", /* name */
712 FALSE, /* partial_inplace */
714 0xffff, /* dst_mask */
715 FALSE), /* pcrel_offset */
717 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
719 HOWTO (R_PPC64_PLT16_HI, /* type */
721 1, /* size (0 = byte, 1 = short, 2 = long) */
723 FALSE, /* pc_relative */
725 complain_overflow_signed, /* complain_on_overflow */
726 ppc64_elf_unhandled_reloc, /* special_function */
727 "R_PPC64_PLT16_HI", /* name */
728 FALSE, /* partial_inplace */
730 0xffff, /* dst_mask */
731 FALSE), /* pcrel_offset */
733 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
735 HOWTO (R_PPC64_PLT16_HA, /* type */
737 1, /* size (0 = byte, 1 = short, 2 = long) */
739 FALSE, /* pc_relative */
741 complain_overflow_signed, /* complain_on_overflow */
742 ppc64_elf_unhandled_reloc, /* special_function */
743 "R_PPC64_PLT16_HA", /* name */
744 FALSE, /* partial_inplace */
746 0xffff, /* dst_mask */
747 FALSE), /* pcrel_offset */
749 /* 16-bit section relative relocation. */
750 HOWTO (R_PPC64_SECTOFF, /* type */
752 1, /* size (0 = byte, 1 = short, 2 = long) */
754 FALSE, /* pc_relative */
756 complain_overflow_signed, /* complain_on_overflow */
757 ppc64_elf_sectoff_reloc, /* special_function */
758 "R_PPC64_SECTOFF", /* name */
759 FALSE, /* partial_inplace */
761 0xffff, /* dst_mask */
762 FALSE), /* pcrel_offset */
764 /* Like R_PPC64_SECTOFF, but no overflow warning. */
765 HOWTO (R_PPC64_SECTOFF_LO, /* type */
767 1, /* size (0 = byte, 1 = short, 2 = long) */
769 FALSE, /* pc_relative */
771 complain_overflow_dont, /* complain_on_overflow */
772 ppc64_elf_sectoff_reloc, /* special_function */
773 "R_PPC64_SECTOFF_LO", /* name */
774 FALSE, /* partial_inplace */
776 0xffff, /* dst_mask */
777 FALSE), /* pcrel_offset */
779 /* 16-bit upper half section relative relocation. */
780 HOWTO (R_PPC64_SECTOFF_HI, /* type */
782 1, /* size (0 = byte, 1 = short, 2 = long) */
784 FALSE, /* pc_relative */
786 complain_overflow_signed, /* complain_on_overflow */
787 ppc64_elf_sectoff_reloc, /* special_function */
788 "R_PPC64_SECTOFF_HI", /* name */
789 FALSE, /* partial_inplace */
791 0xffff, /* dst_mask */
792 FALSE), /* pcrel_offset */
794 /* 16-bit upper half adjusted section relative relocation. */
795 HOWTO (R_PPC64_SECTOFF_HA, /* type */
797 1, /* size (0 = byte, 1 = short, 2 = long) */
799 FALSE, /* pc_relative */
801 complain_overflow_signed, /* complain_on_overflow */
802 ppc64_elf_sectoff_ha_reloc, /* special_function */
803 "R_PPC64_SECTOFF_HA", /* name */
804 FALSE, /* partial_inplace */
806 0xffff, /* dst_mask */
807 FALSE), /* pcrel_offset */
809 /* Like R_PPC64_REL24 without touching the two least significant bits. */
810 HOWTO (R_PPC64_REL30, /* type */
812 2, /* size (0 = byte, 1 = short, 2 = long) */
814 TRUE, /* pc_relative */
816 complain_overflow_dont, /* complain_on_overflow */
817 bfd_elf_generic_reloc, /* special_function */
818 "R_PPC64_REL30", /* name */
819 FALSE, /* partial_inplace */
821 0xfffffffc, /* dst_mask */
822 TRUE), /* pcrel_offset */
824 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
826 /* A standard 64-bit relocation. */
827 HOWTO (R_PPC64_ADDR64, /* type */
829 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
831 FALSE, /* pc_relative */
833 complain_overflow_dont, /* complain_on_overflow */
834 bfd_elf_generic_reloc, /* special_function */
835 "R_PPC64_ADDR64", /* name */
836 FALSE, /* partial_inplace */
838 ONES (64), /* dst_mask */
839 FALSE), /* pcrel_offset */
841 /* The bits 32-47 of an address. */
842 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
844 1, /* size (0 = byte, 1 = short, 2 = long) */
846 FALSE, /* pc_relative */
848 complain_overflow_dont, /* complain_on_overflow */
849 bfd_elf_generic_reloc, /* special_function */
850 "R_PPC64_ADDR16_HIGHER", /* name */
851 FALSE, /* partial_inplace */
853 0xffff, /* dst_mask */
854 FALSE), /* pcrel_offset */
856 /* The bits 32-47 of an address, plus 1 if the contents of the low
857 16 bits, treated as a signed number, is negative. */
858 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
860 1, /* size (0 = byte, 1 = short, 2 = long) */
862 FALSE, /* pc_relative */
864 complain_overflow_dont, /* complain_on_overflow */
865 ppc64_elf_ha_reloc, /* special_function */
866 "R_PPC64_ADDR16_HIGHERA", /* name */
867 FALSE, /* partial_inplace */
869 0xffff, /* dst_mask */
870 FALSE), /* pcrel_offset */
872 /* The bits 48-63 of an address. */
873 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
875 1, /* size (0 = byte, 1 = short, 2 = long) */
877 FALSE, /* pc_relative */
879 complain_overflow_dont, /* complain_on_overflow */
880 bfd_elf_generic_reloc, /* special_function */
881 "R_PPC64_ADDR16_HIGHEST", /* name */
882 FALSE, /* partial_inplace */
884 0xffff, /* dst_mask */
885 FALSE), /* pcrel_offset */
887 /* The bits 48-63 of an address, plus 1 if the contents of the low
888 16 bits, treated as a signed number, is negative. */
889 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
891 1, /* size (0 = byte, 1 = short, 2 = long) */
893 FALSE, /* pc_relative */
895 complain_overflow_dont, /* complain_on_overflow */
896 ppc64_elf_ha_reloc, /* special_function */
897 "R_PPC64_ADDR16_HIGHESTA", /* name */
898 FALSE, /* partial_inplace */
900 0xffff, /* dst_mask */
901 FALSE), /* pcrel_offset */
903 /* Like ADDR64, but may be unaligned. */
904 HOWTO (R_PPC64_UADDR64, /* type */
906 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
908 FALSE, /* pc_relative */
910 complain_overflow_dont, /* complain_on_overflow */
911 bfd_elf_generic_reloc, /* special_function */
912 "R_PPC64_UADDR64", /* name */
913 FALSE, /* partial_inplace */
915 ONES (64), /* dst_mask */
916 FALSE), /* pcrel_offset */
918 /* 64-bit relative relocation. */
919 HOWTO (R_PPC64_REL64, /* type */
921 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
923 TRUE, /* pc_relative */
925 complain_overflow_dont, /* complain_on_overflow */
926 bfd_elf_generic_reloc, /* special_function */
927 "R_PPC64_REL64", /* name */
928 FALSE, /* partial_inplace */
930 ONES (64), /* dst_mask */
931 TRUE), /* pcrel_offset */
933 /* 64-bit relocation to the symbol's procedure linkage table. */
934 HOWTO (R_PPC64_PLT64, /* type */
936 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
938 FALSE, /* pc_relative */
940 complain_overflow_dont, /* complain_on_overflow */
941 ppc64_elf_unhandled_reloc, /* special_function */
942 "R_PPC64_PLT64", /* name */
943 FALSE, /* partial_inplace */
945 ONES (64), /* dst_mask */
946 FALSE), /* pcrel_offset */
948 /* 64-bit PC relative relocation to the symbol's procedure linkage
950 /* FIXME: R_PPC64_PLTREL64 not supported. */
951 HOWTO (R_PPC64_PLTREL64, /* type */
953 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
955 TRUE, /* pc_relative */
957 complain_overflow_dont, /* complain_on_overflow */
958 ppc64_elf_unhandled_reloc, /* special_function */
959 "R_PPC64_PLTREL64", /* name */
960 FALSE, /* partial_inplace */
962 ONES (64), /* dst_mask */
963 TRUE), /* pcrel_offset */
965 /* 16 bit TOC-relative relocation. */
967 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
968 HOWTO (R_PPC64_TOC16, /* type */
970 1, /* size (0 = byte, 1 = short, 2 = long) */
972 FALSE, /* pc_relative */
974 complain_overflow_signed, /* complain_on_overflow */
975 ppc64_elf_toc_reloc, /* special_function */
976 "R_PPC64_TOC16", /* name */
977 FALSE, /* partial_inplace */
979 0xffff, /* dst_mask */
980 FALSE), /* pcrel_offset */
982 /* 16 bit TOC-relative relocation without overflow. */
984 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
985 HOWTO (R_PPC64_TOC16_LO, /* type */
987 1, /* size (0 = byte, 1 = short, 2 = long) */
989 FALSE, /* pc_relative */
991 complain_overflow_dont, /* complain_on_overflow */
992 ppc64_elf_toc_reloc, /* special_function */
993 "R_PPC64_TOC16_LO", /* name */
994 FALSE, /* partial_inplace */
996 0xffff, /* dst_mask */
997 FALSE), /* pcrel_offset */
999 /* 16 bit TOC-relative relocation, high 16 bits. */
1001 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
1002 HOWTO (R_PPC64_TOC16_HI, /* type */
1003 16, /* rightshift */
1004 1, /* size (0 = byte, 1 = short, 2 = long) */
1006 FALSE, /* pc_relative */
1008 complain_overflow_signed, /* complain_on_overflow */
1009 ppc64_elf_toc_reloc, /* special_function */
1010 "R_PPC64_TOC16_HI", /* name */
1011 FALSE, /* partial_inplace */
1013 0xffff, /* dst_mask */
1014 FALSE), /* pcrel_offset */
1016 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
1017 contents of the low 16 bits, treated as a signed number, is
1020 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
1021 HOWTO (R_PPC64_TOC16_HA, /* type */
1022 16, /* rightshift */
1023 1, /* size (0 = byte, 1 = short, 2 = long) */
1025 FALSE, /* pc_relative */
1027 complain_overflow_signed, /* complain_on_overflow */
1028 ppc64_elf_toc_ha_reloc, /* special_function */
1029 "R_PPC64_TOC16_HA", /* name */
1030 FALSE, /* partial_inplace */
1032 0xffff, /* dst_mask */
1033 FALSE), /* pcrel_offset */
1035 /* 64-bit relocation; insert value of TOC base (.TOC.). */
1037 /* R_PPC64_TOC 51 doubleword64 .TOC. */
1038 HOWTO (R_PPC64_TOC, /* type */
1040 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1042 FALSE, /* pc_relative */
1044 complain_overflow_dont, /* complain_on_overflow */
1045 ppc64_elf_toc64_reloc, /* special_function */
1046 "R_PPC64_TOC", /* name */
1047 FALSE, /* partial_inplace */
1049 ONES (64), /* dst_mask */
1050 FALSE), /* pcrel_offset */
1052 /* Like R_PPC64_GOT16, but also informs the link editor that the
1053 value to relocate may (!) refer to a PLT entry which the link
1054 editor (a) may replace with the symbol value. If the link editor
1055 is unable to fully resolve the symbol, it may (b) create a PLT
1056 entry and store the address to the new PLT entry in the GOT.
1057 This permits lazy resolution of function symbols at run time.
1058 The link editor may also skip all of this and just (c) emit a
1059 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1060 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1061 HOWTO (R_PPC64_PLTGOT16, /* type */
1063 1, /* size (0 = byte, 1 = short, 2 = long) */
1065 FALSE, /* pc_relative */
1067 complain_overflow_signed, /* complain_on_overflow */
1068 ppc64_elf_unhandled_reloc, /* special_function */
1069 "R_PPC64_PLTGOT16", /* name */
1070 FALSE, /* partial_inplace */
1072 0xffff, /* dst_mask */
1073 FALSE), /* pcrel_offset */
1075 /* Like R_PPC64_PLTGOT16, but without overflow. */
1076 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1077 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1079 1, /* size (0 = byte, 1 = short, 2 = long) */
1081 FALSE, /* pc_relative */
1083 complain_overflow_dont, /* complain_on_overflow */
1084 ppc64_elf_unhandled_reloc, /* special_function */
1085 "R_PPC64_PLTGOT16_LO", /* name */
1086 FALSE, /* partial_inplace */
1088 0xffff, /* dst_mask */
1089 FALSE), /* pcrel_offset */
1091 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1092 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1093 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1094 16, /* rightshift */
1095 1, /* size (0 = byte, 1 = short, 2 = long) */
1097 FALSE, /* pc_relative */
1099 complain_overflow_signed, /* complain_on_overflow */
1100 ppc64_elf_unhandled_reloc, /* special_function */
1101 "R_PPC64_PLTGOT16_HI", /* name */
1102 FALSE, /* partial_inplace */
1104 0xffff, /* dst_mask */
1105 FALSE), /* pcrel_offset */
1107 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1108 1 if the contents of the low 16 bits, treated as a signed number,
1110 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1111 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1112 16, /* rightshift */
1113 1, /* size (0 = byte, 1 = short, 2 = long) */
1115 FALSE, /* pc_relative */
1117 complain_overflow_signed, /* complain_on_overflow */
1118 ppc64_elf_unhandled_reloc, /* special_function */
1119 "R_PPC64_PLTGOT16_HA", /* name */
1120 FALSE, /* partial_inplace */
1122 0xffff, /* dst_mask */
1123 FALSE), /* pcrel_offset */
1125 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1126 HOWTO (R_PPC64_ADDR16_DS, /* type */
1128 1, /* size (0 = byte, 1 = short, 2 = long) */
1130 FALSE, /* pc_relative */
1132 complain_overflow_signed, /* complain_on_overflow */
1133 bfd_elf_generic_reloc, /* special_function */
1134 "R_PPC64_ADDR16_DS", /* name */
1135 FALSE, /* partial_inplace */
1137 0xfffc, /* dst_mask */
1138 FALSE), /* pcrel_offset */
1140 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1141 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1143 1, /* size (0 = byte, 1 = short, 2 = long) */
1145 FALSE, /* pc_relative */
1147 complain_overflow_dont,/* complain_on_overflow */
1148 bfd_elf_generic_reloc, /* special_function */
1149 "R_PPC64_ADDR16_LO_DS",/* name */
1150 FALSE, /* partial_inplace */
1152 0xfffc, /* dst_mask */
1153 FALSE), /* pcrel_offset */
1155 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1156 HOWTO (R_PPC64_GOT16_DS, /* type */
1158 1, /* size (0 = byte, 1 = short, 2 = long) */
1160 FALSE, /* pc_relative */
1162 complain_overflow_signed, /* complain_on_overflow */
1163 ppc64_elf_unhandled_reloc, /* special_function */
1164 "R_PPC64_GOT16_DS", /* name */
1165 FALSE, /* partial_inplace */
1167 0xfffc, /* dst_mask */
1168 FALSE), /* pcrel_offset */
1170 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1171 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1173 1, /* size (0 = byte, 1 = short, 2 = long) */
1175 FALSE, /* pc_relative */
1177 complain_overflow_dont, /* complain_on_overflow */
1178 ppc64_elf_unhandled_reloc, /* special_function */
1179 "R_PPC64_GOT16_LO_DS", /* name */
1180 FALSE, /* partial_inplace */
1182 0xfffc, /* dst_mask */
1183 FALSE), /* pcrel_offset */
1185 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1186 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1188 1, /* size (0 = byte, 1 = short, 2 = long) */
1190 FALSE, /* pc_relative */
1192 complain_overflow_dont, /* complain_on_overflow */
1193 ppc64_elf_unhandled_reloc, /* special_function */
1194 "R_PPC64_PLT16_LO_DS", /* name */
1195 FALSE, /* partial_inplace */
1197 0xfffc, /* dst_mask */
1198 FALSE), /* pcrel_offset */
1200 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1201 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1203 1, /* size (0 = byte, 1 = short, 2 = long) */
1205 FALSE, /* pc_relative */
1207 complain_overflow_signed, /* complain_on_overflow */
1208 ppc64_elf_sectoff_reloc, /* special_function */
1209 "R_PPC64_SECTOFF_DS", /* name */
1210 FALSE, /* partial_inplace */
1212 0xfffc, /* dst_mask */
1213 FALSE), /* pcrel_offset */
1215 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1216 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1218 1, /* size (0 = byte, 1 = short, 2 = long) */
1220 FALSE, /* pc_relative */
1222 complain_overflow_dont, /* complain_on_overflow */
1223 ppc64_elf_sectoff_reloc, /* special_function */
1224 "R_PPC64_SECTOFF_LO_DS",/* name */
1225 FALSE, /* partial_inplace */
1227 0xfffc, /* dst_mask */
1228 FALSE), /* pcrel_offset */
1230 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1231 HOWTO (R_PPC64_TOC16_DS, /* type */
1233 1, /* size (0 = byte, 1 = short, 2 = long) */
1235 FALSE, /* pc_relative */
1237 complain_overflow_signed, /* complain_on_overflow */
1238 ppc64_elf_toc_reloc, /* special_function */
1239 "R_PPC64_TOC16_DS", /* name */
1240 FALSE, /* partial_inplace */
1242 0xfffc, /* dst_mask */
1243 FALSE), /* pcrel_offset */
1245 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1246 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1248 1, /* size (0 = byte, 1 = short, 2 = long) */
1250 FALSE, /* pc_relative */
1252 complain_overflow_dont, /* complain_on_overflow */
1253 ppc64_elf_toc_reloc, /* special_function */
1254 "R_PPC64_TOC16_LO_DS", /* name */
1255 FALSE, /* partial_inplace */
1257 0xfffc, /* dst_mask */
1258 FALSE), /* pcrel_offset */
1260 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1261 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1262 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1264 1, /* size (0 = byte, 1 = short, 2 = long) */
1266 FALSE, /* pc_relative */
1268 complain_overflow_signed, /* complain_on_overflow */
1269 ppc64_elf_unhandled_reloc, /* special_function */
1270 "R_PPC64_PLTGOT16_DS", /* name */
1271 FALSE, /* partial_inplace */
1273 0xfffc, /* dst_mask */
1274 FALSE), /* pcrel_offset */
1276 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1277 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1278 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1280 1, /* size (0 = byte, 1 = short, 2 = long) */
1282 FALSE, /* pc_relative */
1284 complain_overflow_dont, /* complain_on_overflow */
1285 ppc64_elf_unhandled_reloc, /* special_function */
1286 "R_PPC64_PLTGOT16_LO_DS",/* name */
1287 FALSE, /* partial_inplace */
1289 0xfffc, /* dst_mask */
1290 FALSE), /* pcrel_offset */
1292 /* Marker relocs for TLS. */
1295 2, /* size (0 = byte, 1 = short, 2 = long) */
1297 FALSE, /* pc_relative */
1299 complain_overflow_dont, /* complain_on_overflow */
1300 bfd_elf_generic_reloc, /* special_function */
1301 "R_PPC64_TLS", /* name */
1302 FALSE, /* partial_inplace */
1305 FALSE), /* pcrel_offset */
1307 HOWTO (R_PPC64_TLSGD,
1309 2, /* size (0 = byte, 1 = short, 2 = long) */
1311 FALSE, /* pc_relative */
1313 complain_overflow_dont, /* complain_on_overflow */
1314 bfd_elf_generic_reloc, /* special_function */
1315 "R_PPC64_TLSGD", /* name */
1316 FALSE, /* partial_inplace */
1319 FALSE), /* pcrel_offset */
1321 HOWTO (R_PPC64_TLSLD,
1323 2, /* size (0 = byte, 1 = short, 2 = long) */
1325 FALSE, /* pc_relative */
1327 complain_overflow_dont, /* complain_on_overflow */
1328 bfd_elf_generic_reloc, /* special_function */
1329 "R_PPC64_TLSLD", /* name */
1330 FALSE, /* partial_inplace */
1333 FALSE), /* pcrel_offset */
1335 HOWTO (R_PPC64_TOCSAVE,
1337 2, /* size (0 = byte, 1 = short, 2 = long) */
1339 FALSE, /* pc_relative */
1341 complain_overflow_dont, /* complain_on_overflow */
1342 bfd_elf_generic_reloc, /* special_function */
1343 "R_PPC64_TOCSAVE", /* name */
1344 FALSE, /* partial_inplace */
1347 FALSE), /* pcrel_offset */
1349 /* Computes the load module index of the load module that contains the
1350 definition of its TLS sym. */
1351 HOWTO (R_PPC64_DTPMOD64,
1353 4, /* size (0 = byte, 1 = short, 2 = long) */
1355 FALSE, /* pc_relative */
1357 complain_overflow_dont, /* complain_on_overflow */
1358 ppc64_elf_unhandled_reloc, /* special_function */
1359 "R_PPC64_DTPMOD64", /* name */
1360 FALSE, /* partial_inplace */
1362 ONES (64), /* dst_mask */
1363 FALSE), /* pcrel_offset */
1365 /* Computes a dtv-relative displacement, the difference between the value
1366 of sym+add and the base address of the thread-local storage block that
1367 contains the definition of sym, minus 0x8000. */
1368 HOWTO (R_PPC64_DTPREL64,
1370 4, /* size (0 = byte, 1 = short, 2 = long) */
1372 FALSE, /* pc_relative */
1374 complain_overflow_dont, /* complain_on_overflow */
1375 ppc64_elf_unhandled_reloc, /* special_function */
1376 "R_PPC64_DTPREL64", /* name */
1377 FALSE, /* partial_inplace */
1379 ONES (64), /* dst_mask */
1380 FALSE), /* pcrel_offset */
1382 /* A 16 bit dtprel reloc. */
1383 HOWTO (R_PPC64_DTPREL16,
1385 1, /* size (0 = byte, 1 = short, 2 = long) */
1387 FALSE, /* pc_relative */
1389 complain_overflow_signed, /* complain_on_overflow */
1390 ppc64_elf_unhandled_reloc, /* special_function */
1391 "R_PPC64_DTPREL16", /* name */
1392 FALSE, /* partial_inplace */
1394 0xffff, /* dst_mask */
1395 FALSE), /* pcrel_offset */
1397 /* Like DTPREL16, but no overflow. */
1398 HOWTO (R_PPC64_DTPREL16_LO,
1400 1, /* size (0 = byte, 1 = short, 2 = long) */
1402 FALSE, /* pc_relative */
1404 complain_overflow_dont, /* complain_on_overflow */
1405 ppc64_elf_unhandled_reloc, /* special_function */
1406 "R_PPC64_DTPREL16_LO", /* name */
1407 FALSE, /* partial_inplace */
1409 0xffff, /* dst_mask */
1410 FALSE), /* pcrel_offset */
1412 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1413 HOWTO (R_PPC64_DTPREL16_HI,
1414 16, /* rightshift */
1415 1, /* size (0 = byte, 1 = short, 2 = long) */
1417 FALSE, /* pc_relative */
1419 complain_overflow_signed, /* complain_on_overflow */
1420 ppc64_elf_unhandled_reloc, /* special_function */
1421 "R_PPC64_DTPREL16_HI", /* name */
1422 FALSE, /* partial_inplace */
1424 0xffff, /* dst_mask */
1425 FALSE), /* pcrel_offset */
1427 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1428 HOWTO (R_PPC64_DTPREL16_HA,
1429 16, /* rightshift */
1430 1, /* size (0 = byte, 1 = short, 2 = long) */
1432 FALSE, /* pc_relative */
1434 complain_overflow_signed, /* complain_on_overflow */
1435 ppc64_elf_unhandled_reloc, /* special_function */
1436 "R_PPC64_DTPREL16_HA", /* name */
1437 FALSE, /* partial_inplace */
1439 0xffff, /* dst_mask */
1440 FALSE), /* pcrel_offset */
1442 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1443 HOWTO (R_PPC64_DTPREL16_HIGHER,
1444 32, /* rightshift */
1445 1, /* size (0 = byte, 1 = short, 2 = long) */
1447 FALSE, /* pc_relative */
1449 complain_overflow_dont, /* complain_on_overflow */
1450 ppc64_elf_unhandled_reloc, /* special_function */
1451 "R_PPC64_DTPREL16_HIGHER", /* name */
1452 FALSE, /* partial_inplace */
1454 0xffff, /* dst_mask */
1455 FALSE), /* pcrel_offset */
1457 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1458 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1459 32, /* rightshift */
1460 1, /* size (0 = byte, 1 = short, 2 = long) */
1462 FALSE, /* pc_relative */
1464 complain_overflow_dont, /* complain_on_overflow */
1465 ppc64_elf_unhandled_reloc, /* special_function */
1466 "R_PPC64_DTPREL16_HIGHERA", /* name */
1467 FALSE, /* partial_inplace */
1469 0xffff, /* dst_mask */
1470 FALSE), /* pcrel_offset */
1472 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1473 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1474 48, /* rightshift */
1475 1, /* size (0 = byte, 1 = short, 2 = long) */
1477 FALSE, /* pc_relative */
1479 complain_overflow_dont, /* complain_on_overflow */
1480 ppc64_elf_unhandled_reloc, /* special_function */
1481 "R_PPC64_DTPREL16_HIGHEST", /* name */
1482 FALSE, /* partial_inplace */
1484 0xffff, /* dst_mask */
1485 FALSE), /* pcrel_offset */
1487 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1488 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1489 48, /* rightshift */
1490 1, /* size (0 = byte, 1 = short, 2 = long) */
1492 FALSE, /* pc_relative */
1494 complain_overflow_dont, /* complain_on_overflow */
1495 ppc64_elf_unhandled_reloc, /* special_function */
1496 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1497 FALSE, /* partial_inplace */
1499 0xffff, /* dst_mask */
1500 FALSE), /* pcrel_offset */
1502 /* Like DTPREL16, but for insns with a DS field. */
1503 HOWTO (R_PPC64_DTPREL16_DS,
1505 1, /* size (0 = byte, 1 = short, 2 = long) */
1507 FALSE, /* pc_relative */
1509 complain_overflow_signed, /* complain_on_overflow */
1510 ppc64_elf_unhandled_reloc, /* special_function */
1511 "R_PPC64_DTPREL16_DS", /* name */
1512 FALSE, /* partial_inplace */
1514 0xfffc, /* dst_mask */
1515 FALSE), /* pcrel_offset */
1517 /* Like DTPREL16_DS, but no overflow. */
1518 HOWTO (R_PPC64_DTPREL16_LO_DS,
1520 1, /* size (0 = byte, 1 = short, 2 = long) */
1522 FALSE, /* pc_relative */
1524 complain_overflow_dont, /* complain_on_overflow */
1525 ppc64_elf_unhandled_reloc, /* special_function */
1526 "R_PPC64_DTPREL16_LO_DS", /* name */
1527 FALSE, /* partial_inplace */
1529 0xfffc, /* dst_mask */
1530 FALSE), /* pcrel_offset */
1532 /* Computes a tp-relative displacement, the difference between the value of
1533 sym+add and the value of the thread pointer (r13). */
1534 HOWTO (R_PPC64_TPREL64,
1536 4, /* size (0 = byte, 1 = short, 2 = long) */
1538 FALSE, /* pc_relative */
1540 complain_overflow_dont, /* complain_on_overflow */
1541 ppc64_elf_unhandled_reloc, /* special_function */
1542 "R_PPC64_TPREL64", /* name */
1543 FALSE, /* partial_inplace */
1545 ONES (64), /* dst_mask */
1546 FALSE), /* pcrel_offset */
1548 /* A 16 bit tprel reloc. */
1549 HOWTO (R_PPC64_TPREL16,
1551 1, /* size (0 = byte, 1 = short, 2 = long) */
1553 FALSE, /* pc_relative */
1555 complain_overflow_signed, /* complain_on_overflow */
1556 ppc64_elf_unhandled_reloc, /* special_function */
1557 "R_PPC64_TPREL16", /* name */
1558 FALSE, /* partial_inplace */
1560 0xffff, /* dst_mask */
1561 FALSE), /* pcrel_offset */
1563 /* Like TPREL16, but no overflow. */
1564 HOWTO (R_PPC64_TPREL16_LO,
1566 1, /* size (0 = byte, 1 = short, 2 = long) */
1568 FALSE, /* pc_relative */
1570 complain_overflow_dont, /* complain_on_overflow */
1571 ppc64_elf_unhandled_reloc, /* special_function */
1572 "R_PPC64_TPREL16_LO", /* name */
1573 FALSE, /* partial_inplace */
1575 0xffff, /* dst_mask */
1576 FALSE), /* pcrel_offset */
1578 /* Like TPREL16_LO, but next higher group of 16 bits. */
1579 HOWTO (R_PPC64_TPREL16_HI,
1580 16, /* rightshift */
1581 1, /* size (0 = byte, 1 = short, 2 = long) */
1583 FALSE, /* pc_relative */
1585 complain_overflow_signed, /* complain_on_overflow */
1586 ppc64_elf_unhandled_reloc, /* special_function */
1587 "R_PPC64_TPREL16_HI", /* name */
1588 FALSE, /* partial_inplace */
1590 0xffff, /* dst_mask */
1591 FALSE), /* pcrel_offset */
1593 /* Like TPREL16_HI, but adjust for low 16 bits. */
1594 HOWTO (R_PPC64_TPREL16_HA,
1595 16, /* rightshift */
1596 1, /* size (0 = byte, 1 = short, 2 = long) */
1598 FALSE, /* pc_relative */
1600 complain_overflow_signed, /* complain_on_overflow */
1601 ppc64_elf_unhandled_reloc, /* special_function */
1602 "R_PPC64_TPREL16_HA", /* name */
1603 FALSE, /* partial_inplace */
1605 0xffff, /* dst_mask */
1606 FALSE), /* pcrel_offset */
1608 /* Like TPREL16_HI, but next higher group of 16 bits. */
1609 HOWTO (R_PPC64_TPREL16_HIGHER,
1610 32, /* rightshift */
1611 1, /* size (0 = byte, 1 = short, 2 = long) */
1613 FALSE, /* pc_relative */
1615 complain_overflow_dont, /* complain_on_overflow */
1616 ppc64_elf_unhandled_reloc, /* special_function */
1617 "R_PPC64_TPREL16_HIGHER", /* name */
1618 FALSE, /* partial_inplace */
1620 0xffff, /* dst_mask */
1621 FALSE), /* pcrel_offset */
1623 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1624 HOWTO (R_PPC64_TPREL16_HIGHERA,
1625 32, /* rightshift */
1626 1, /* size (0 = byte, 1 = short, 2 = long) */
1628 FALSE, /* pc_relative */
1630 complain_overflow_dont, /* complain_on_overflow */
1631 ppc64_elf_unhandled_reloc, /* special_function */
1632 "R_PPC64_TPREL16_HIGHERA", /* name */
1633 FALSE, /* partial_inplace */
1635 0xffff, /* dst_mask */
1636 FALSE), /* pcrel_offset */
1638 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1639 HOWTO (R_PPC64_TPREL16_HIGHEST,
1640 48, /* rightshift */
1641 1, /* size (0 = byte, 1 = short, 2 = long) */
1643 FALSE, /* pc_relative */
1645 complain_overflow_dont, /* complain_on_overflow */
1646 ppc64_elf_unhandled_reloc, /* special_function */
1647 "R_PPC64_TPREL16_HIGHEST", /* name */
1648 FALSE, /* partial_inplace */
1650 0xffff, /* dst_mask */
1651 FALSE), /* pcrel_offset */
1653 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1654 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1655 48, /* rightshift */
1656 1, /* size (0 = byte, 1 = short, 2 = long) */
1658 FALSE, /* pc_relative */
1660 complain_overflow_dont, /* complain_on_overflow */
1661 ppc64_elf_unhandled_reloc, /* special_function */
1662 "R_PPC64_TPREL16_HIGHESTA", /* name */
1663 FALSE, /* partial_inplace */
1665 0xffff, /* dst_mask */
1666 FALSE), /* pcrel_offset */
1668 /* Like TPREL16, but for insns with a DS field. */
1669 HOWTO (R_PPC64_TPREL16_DS,
1671 1, /* size (0 = byte, 1 = short, 2 = long) */
1673 FALSE, /* pc_relative */
1675 complain_overflow_signed, /* complain_on_overflow */
1676 ppc64_elf_unhandled_reloc, /* special_function */
1677 "R_PPC64_TPREL16_DS", /* name */
1678 FALSE, /* partial_inplace */
1680 0xfffc, /* dst_mask */
1681 FALSE), /* pcrel_offset */
1683 /* Like TPREL16_DS, but no overflow. */
1684 HOWTO (R_PPC64_TPREL16_LO_DS,
1686 1, /* size (0 = byte, 1 = short, 2 = long) */
1688 FALSE, /* pc_relative */
1690 complain_overflow_dont, /* complain_on_overflow */
1691 ppc64_elf_unhandled_reloc, /* special_function */
1692 "R_PPC64_TPREL16_LO_DS", /* name */
1693 FALSE, /* partial_inplace */
1695 0xfffc, /* dst_mask */
1696 FALSE), /* pcrel_offset */
1698 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1699 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1700 to the first entry relative to the TOC base (r2). */
1701 HOWTO (R_PPC64_GOT_TLSGD16,
1703 1, /* size (0 = byte, 1 = short, 2 = long) */
1705 FALSE, /* pc_relative */
1707 complain_overflow_signed, /* complain_on_overflow */
1708 ppc64_elf_unhandled_reloc, /* special_function */
1709 "R_PPC64_GOT_TLSGD16", /* name */
1710 FALSE, /* partial_inplace */
1712 0xffff, /* dst_mask */
1713 FALSE), /* pcrel_offset */
1715 /* Like GOT_TLSGD16, but no overflow. */
1716 HOWTO (R_PPC64_GOT_TLSGD16_LO,
1718 1, /* size (0 = byte, 1 = short, 2 = long) */
1720 FALSE, /* pc_relative */
1722 complain_overflow_dont, /* complain_on_overflow */
1723 ppc64_elf_unhandled_reloc, /* special_function */
1724 "R_PPC64_GOT_TLSGD16_LO", /* name */
1725 FALSE, /* partial_inplace */
1727 0xffff, /* dst_mask */
1728 FALSE), /* pcrel_offset */
1730 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1731 HOWTO (R_PPC64_GOT_TLSGD16_HI,
1732 16, /* rightshift */
1733 1, /* size (0 = byte, 1 = short, 2 = long) */
1735 FALSE, /* pc_relative */
1737 complain_overflow_signed, /* complain_on_overflow */
1738 ppc64_elf_unhandled_reloc, /* special_function */
1739 "R_PPC64_GOT_TLSGD16_HI", /* name */
1740 FALSE, /* partial_inplace */
1742 0xffff, /* dst_mask */
1743 FALSE), /* pcrel_offset */
1745 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1746 HOWTO (R_PPC64_GOT_TLSGD16_HA,
1747 16, /* rightshift */
1748 1, /* size (0 = byte, 1 = short, 2 = long) */
1750 FALSE, /* pc_relative */
1752 complain_overflow_signed, /* complain_on_overflow */
1753 ppc64_elf_unhandled_reloc, /* special_function */
1754 "R_PPC64_GOT_TLSGD16_HA", /* name */
1755 FALSE, /* partial_inplace */
1757 0xffff, /* dst_mask */
1758 FALSE), /* pcrel_offset */
1760 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1761 with values (sym+add)@dtpmod and zero, and computes the offset to the
1762 first entry relative to the TOC base (r2). */
1763 HOWTO (R_PPC64_GOT_TLSLD16,
1765 1, /* size (0 = byte, 1 = short, 2 = long) */
1767 FALSE, /* pc_relative */
1769 complain_overflow_signed, /* complain_on_overflow */
1770 ppc64_elf_unhandled_reloc, /* special_function */
1771 "R_PPC64_GOT_TLSLD16", /* name */
1772 FALSE, /* partial_inplace */
1774 0xffff, /* dst_mask */
1775 FALSE), /* pcrel_offset */
1777 /* Like GOT_TLSLD16, but no overflow. */
1778 HOWTO (R_PPC64_GOT_TLSLD16_LO,
1780 1, /* size (0 = byte, 1 = short, 2 = long) */
1782 FALSE, /* pc_relative */
1784 complain_overflow_dont, /* complain_on_overflow */
1785 ppc64_elf_unhandled_reloc, /* special_function */
1786 "R_PPC64_GOT_TLSLD16_LO", /* name */
1787 FALSE, /* partial_inplace */
1789 0xffff, /* dst_mask */
1790 FALSE), /* pcrel_offset */
1792 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1793 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1794 16, /* rightshift */
1795 1, /* size (0 = byte, 1 = short, 2 = long) */
1797 FALSE, /* pc_relative */
1799 complain_overflow_signed, /* complain_on_overflow */
1800 ppc64_elf_unhandled_reloc, /* special_function */
1801 "R_PPC64_GOT_TLSLD16_HI", /* name */
1802 FALSE, /* partial_inplace */
1804 0xffff, /* dst_mask */
1805 FALSE), /* pcrel_offset */
1807 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1808 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1809 16, /* rightshift */
1810 1, /* size (0 = byte, 1 = short, 2 = long) */
1812 FALSE, /* pc_relative */
1814 complain_overflow_signed, /* complain_on_overflow */
1815 ppc64_elf_unhandled_reloc, /* special_function */
1816 "R_PPC64_GOT_TLSLD16_HA", /* name */
1817 FALSE, /* partial_inplace */
1819 0xffff, /* dst_mask */
1820 FALSE), /* pcrel_offset */
1822 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1823 the offset to the entry relative to the TOC base (r2). */
1824 HOWTO (R_PPC64_GOT_DTPREL16_DS,
1826 1, /* size (0 = byte, 1 = short, 2 = long) */
1828 FALSE, /* pc_relative */
1830 complain_overflow_signed, /* complain_on_overflow */
1831 ppc64_elf_unhandled_reloc, /* special_function */
1832 "R_PPC64_GOT_DTPREL16_DS", /* name */
1833 FALSE, /* partial_inplace */
1835 0xfffc, /* dst_mask */
1836 FALSE), /* pcrel_offset */
1838 /* Like GOT_DTPREL16_DS, but no overflow. */
1839 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1841 1, /* size (0 = byte, 1 = short, 2 = long) */
1843 FALSE, /* pc_relative */
1845 complain_overflow_dont, /* complain_on_overflow */
1846 ppc64_elf_unhandled_reloc, /* special_function */
1847 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1848 FALSE, /* partial_inplace */
1850 0xfffc, /* dst_mask */
1851 FALSE), /* pcrel_offset */
1853 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1854 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1855 16, /* rightshift */
1856 1, /* size (0 = byte, 1 = short, 2 = long) */
1858 FALSE, /* pc_relative */
1860 complain_overflow_signed, /* complain_on_overflow */
1861 ppc64_elf_unhandled_reloc, /* special_function */
1862 "R_PPC64_GOT_DTPREL16_HI", /* name */
1863 FALSE, /* partial_inplace */
1865 0xffff, /* dst_mask */
1866 FALSE), /* pcrel_offset */
1868 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1869 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1870 16, /* rightshift */
1871 1, /* size (0 = byte, 1 = short, 2 = long) */
1873 FALSE, /* pc_relative */
1875 complain_overflow_signed, /* complain_on_overflow */
1876 ppc64_elf_unhandled_reloc, /* special_function */
1877 "R_PPC64_GOT_DTPREL16_HA", /* name */
1878 FALSE, /* partial_inplace */
1880 0xffff, /* dst_mask */
1881 FALSE), /* pcrel_offset */
1883 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1884 offset to the entry relative to the TOC base (r2). */
1885 HOWTO (R_PPC64_GOT_TPREL16_DS,
1887 1, /* size (0 = byte, 1 = short, 2 = long) */
1889 FALSE, /* pc_relative */
1891 complain_overflow_signed, /* complain_on_overflow */
1892 ppc64_elf_unhandled_reloc, /* special_function */
1893 "R_PPC64_GOT_TPREL16_DS", /* name */
1894 FALSE, /* partial_inplace */
1896 0xfffc, /* dst_mask */
1897 FALSE), /* pcrel_offset */
1899 /* Like GOT_TPREL16_DS, but no overflow. */
1900 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1902 1, /* size (0 = byte, 1 = short, 2 = long) */
1904 FALSE, /* pc_relative */
1906 complain_overflow_dont, /* complain_on_overflow */
1907 ppc64_elf_unhandled_reloc, /* special_function */
1908 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1909 FALSE, /* partial_inplace */
1911 0xfffc, /* dst_mask */
1912 FALSE), /* pcrel_offset */
1914 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1915 HOWTO (R_PPC64_GOT_TPREL16_HI,
1916 16, /* rightshift */
1917 1, /* size (0 = byte, 1 = short, 2 = long) */
1919 FALSE, /* pc_relative */
1921 complain_overflow_signed, /* complain_on_overflow */
1922 ppc64_elf_unhandled_reloc, /* special_function */
1923 "R_PPC64_GOT_TPREL16_HI", /* name */
1924 FALSE, /* partial_inplace */
1926 0xffff, /* dst_mask */
1927 FALSE), /* pcrel_offset */
1929 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1930 HOWTO (R_PPC64_GOT_TPREL16_HA,
1931 16, /* rightshift */
1932 1, /* size (0 = byte, 1 = short, 2 = long) */
1934 FALSE, /* pc_relative */
1936 complain_overflow_signed, /* complain_on_overflow */
1937 ppc64_elf_unhandled_reloc, /* special_function */
1938 "R_PPC64_GOT_TPREL16_HA", /* name */
1939 FALSE, /* partial_inplace */
1941 0xffff, /* dst_mask */
1942 FALSE), /* pcrel_offset */
1944 HOWTO (R_PPC64_JMP_IREL, /* type */
1946 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1948 FALSE, /* pc_relative */
1950 complain_overflow_dont, /* complain_on_overflow */
1951 ppc64_elf_unhandled_reloc, /* special_function */
1952 "R_PPC64_JMP_IREL", /* name */
1953 FALSE, /* partial_inplace */
1956 FALSE), /* pcrel_offset */
1958 HOWTO (R_PPC64_IRELATIVE, /* type */
1960 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1962 FALSE, /* pc_relative */
1964 complain_overflow_dont, /* complain_on_overflow */
1965 bfd_elf_generic_reloc, /* special_function */
1966 "R_PPC64_IRELATIVE", /* name */
1967 FALSE, /* partial_inplace */
1969 ONES (64), /* dst_mask */
1970 FALSE), /* pcrel_offset */
1972 /* A 16 bit relative relocation. */
1973 HOWTO (R_PPC64_REL16, /* type */
1975 1, /* size (0 = byte, 1 = short, 2 = long) */
1977 TRUE, /* pc_relative */
1979 complain_overflow_signed, /* complain_on_overflow */
1980 bfd_elf_generic_reloc, /* special_function */
1981 "R_PPC64_REL16", /* name */
1982 FALSE, /* partial_inplace */
1984 0xffff, /* dst_mask */
1985 TRUE), /* pcrel_offset */
1987 /* A 16 bit relative relocation without overflow. */
1988 HOWTO (R_PPC64_REL16_LO, /* type */
1990 1, /* size (0 = byte, 1 = short, 2 = long) */
1992 TRUE, /* pc_relative */
1994 complain_overflow_dont,/* complain_on_overflow */
1995 bfd_elf_generic_reloc, /* special_function */
1996 "R_PPC64_REL16_LO", /* name */
1997 FALSE, /* partial_inplace */
1999 0xffff, /* dst_mask */
2000 TRUE), /* pcrel_offset */
2002 /* The high order 16 bits of a relative address. */
2003 HOWTO (R_PPC64_REL16_HI, /* type */
2004 16, /* rightshift */
2005 1, /* size (0 = byte, 1 = short, 2 = long) */
2007 TRUE, /* pc_relative */
2009 complain_overflow_signed, /* complain_on_overflow */
2010 bfd_elf_generic_reloc, /* special_function */
2011 "R_PPC64_REL16_HI", /* name */
2012 FALSE, /* partial_inplace */
2014 0xffff, /* dst_mask */
2015 TRUE), /* pcrel_offset */
2017 /* The high order 16 bits of a relative address, plus 1 if the contents of
2018 the low 16 bits, treated as a signed number, is negative. */
2019 HOWTO (R_PPC64_REL16_HA, /* type */
2020 16, /* rightshift */
2021 1, /* size (0 = byte, 1 = short, 2 = long) */
2023 TRUE, /* pc_relative */
2025 complain_overflow_signed, /* complain_on_overflow */
2026 ppc64_elf_ha_reloc, /* special_function */
2027 "R_PPC64_REL16_HA", /* name */
2028 FALSE, /* partial_inplace */
2030 0xffff, /* dst_mask */
2031 TRUE), /* pcrel_offset */
2033 /* Like R_PPC64_REL16_HA but for split field in addpcis. */
2034 HOWTO (R_PPC64_REL16DX_HA, /* type */
2035 16, /* rightshift */
2036 2, /* size (0 = byte, 1 = short, 2 = long) */
2038 TRUE, /* pc_relative */
2040 complain_overflow_signed, /* complain_on_overflow */
2041 ppc64_elf_ha_reloc, /* special_function */
2042 "R_PPC64_REL16DX_HA", /* name */
2043 FALSE, /* partial_inplace */
2045 0x1fffc1, /* dst_mask */
2046 TRUE), /* pcrel_offset */
2048 /* A split-field reloc for addpcis, non-relative (gas internal use only). */
2049 HOWTO (R_PPC64_16DX_HA, /* type */
2050 16, /* rightshift */
2051 2, /* size (0 = byte, 1 = short, 2 = long) */
2053 FALSE, /* pc_relative */
2055 complain_overflow_signed, /* complain_on_overflow */
2056 ppc64_elf_ha_reloc, /* special_function */
2057 "R_PPC64_16DX_HA", /* name */
2058 FALSE, /* partial_inplace */
2060 0x1fffc1, /* dst_mask */
2061 FALSE), /* pcrel_offset */
2063 /* Like R_PPC64_ADDR16_HI, but no overflow. */
2064 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
2065 16, /* rightshift */
2066 1, /* size (0 = byte, 1 = short, 2 = long) */
2068 FALSE, /* pc_relative */
2070 complain_overflow_dont, /* complain_on_overflow */
2071 bfd_elf_generic_reloc, /* special_function */
2072 "R_PPC64_ADDR16_HIGH", /* name */
2073 FALSE, /* partial_inplace */
2075 0xffff, /* dst_mask */
2076 FALSE), /* pcrel_offset */
2078 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2079 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2080 16, /* rightshift */
2081 1, /* size (0 = byte, 1 = short, 2 = long) */
2083 FALSE, /* pc_relative */
2085 complain_overflow_dont, /* complain_on_overflow */
2086 ppc64_elf_ha_reloc, /* special_function */
2087 "R_PPC64_ADDR16_HIGHA", /* name */
2088 FALSE, /* partial_inplace */
2090 0xffff, /* dst_mask */
2091 FALSE), /* pcrel_offset */
2093 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2094 HOWTO (R_PPC64_DTPREL16_HIGH,
2095 16, /* rightshift */
2096 1, /* size (0 = byte, 1 = short, 2 = long) */
2098 FALSE, /* pc_relative */
2100 complain_overflow_dont, /* complain_on_overflow */
2101 ppc64_elf_unhandled_reloc, /* special_function */
2102 "R_PPC64_DTPREL16_HIGH", /* name */
2103 FALSE, /* partial_inplace */
2105 0xffff, /* dst_mask */
2106 FALSE), /* pcrel_offset */
2108 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2109 HOWTO (R_PPC64_DTPREL16_HIGHA,
2110 16, /* rightshift */
2111 1, /* size (0 = byte, 1 = short, 2 = long) */
2113 FALSE, /* pc_relative */
2115 complain_overflow_dont, /* complain_on_overflow */
2116 ppc64_elf_unhandled_reloc, /* special_function */
2117 "R_PPC64_DTPREL16_HIGHA", /* name */
2118 FALSE, /* partial_inplace */
2120 0xffff, /* dst_mask */
2121 FALSE), /* pcrel_offset */
2123 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2124 HOWTO (R_PPC64_TPREL16_HIGH,
2125 16, /* rightshift */
2126 1, /* size (0 = byte, 1 = short, 2 = long) */
2128 FALSE, /* pc_relative */
2130 complain_overflow_dont, /* complain_on_overflow */
2131 ppc64_elf_unhandled_reloc, /* special_function */
2132 "R_PPC64_TPREL16_HIGH", /* name */
2133 FALSE, /* partial_inplace */
2135 0xffff, /* dst_mask */
2136 FALSE), /* pcrel_offset */
2138 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2139 HOWTO (R_PPC64_TPREL16_HIGHA,
2140 16, /* rightshift */
2141 1, /* size (0 = byte, 1 = short, 2 = long) */
2143 FALSE, /* pc_relative */
2145 complain_overflow_dont, /* complain_on_overflow */
2146 ppc64_elf_unhandled_reloc, /* special_function */
2147 "R_PPC64_TPREL16_HIGHA", /* name */
2148 FALSE, /* partial_inplace */
2150 0xffff, /* dst_mask */
2151 FALSE), /* pcrel_offset */
2153 /* Marker reloc on ELFv2 large-model function entry. */
2154 HOWTO (R_PPC64_ENTRY,
2156 2, /* size (0 = byte, 1 = short, 2 = long) */
2158 FALSE, /* pc_relative */
2160 complain_overflow_dont, /* complain_on_overflow */
2161 bfd_elf_generic_reloc, /* special_function */
2162 "R_PPC64_ENTRY", /* name */
2163 FALSE, /* partial_inplace */
2166 FALSE), /* pcrel_offset */
2168 /* Like ADDR64, but use local entry point of function. */
2169 HOWTO (R_PPC64_ADDR64_LOCAL, /* type */
2171 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
2173 FALSE, /* pc_relative */
2175 complain_overflow_dont, /* complain_on_overflow */
2176 bfd_elf_generic_reloc, /* special_function */
2177 "R_PPC64_ADDR64_LOCAL", /* name */
2178 FALSE, /* partial_inplace */
2180 ONES (64), /* dst_mask */
2181 FALSE), /* pcrel_offset */
2183 /* GNU extension to record C++ vtable hierarchy. */
2184 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2186 0, /* size (0 = byte, 1 = short, 2 = long) */
2188 FALSE, /* pc_relative */
2190 complain_overflow_dont, /* complain_on_overflow */
2191 NULL, /* special_function */
2192 "R_PPC64_GNU_VTINHERIT", /* name */
2193 FALSE, /* partial_inplace */
2196 FALSE), /* pcrel_offset */
2198 /* GNU extension to record C++ vtable member usage. */
2199 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2201 0, /* size (0 = byte, 1 = short, 2 = long) */
2203 FALSE, /* pc_relative */
2205 complain_overflow_dont, /* complain_on_overflow */
2206 NULL, /* special_function */
2207 "R_PPC64_GNU_VTENTRY", /* name */
2208 FALSE, /* partial_inplace */
2211 FALSE), /* pcrel_offset */
2215 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
2219 ppc_howto_init (void)
2221 unsigned int i, type;
2223 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
2225 type = ppc64_elf_howto_raw[i].type;
2226 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table));
2227 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2231 static reloc_howto_type *
2232 ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2233 bfd_reloc_code_real_type code)
2235 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
2237 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2238 /* Initialize howto table if needed. */
2246 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2248 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2250 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2252 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2254 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2256 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2258 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2260 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
2262 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2264 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
2266 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
2268 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
2270 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
2272 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
2274 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
2276 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
2278 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
2280 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
2282 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
2284 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
2286 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
2288 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
2290 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
2292 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
2294 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
2296 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
2298 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
2300 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
2302 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
2304 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
2306 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
2308 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
2310 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
2312 case BFD_RELOC_64: r = R_PPC64_ADDR64;
2314 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
2316 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
2318 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
2320 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
2322 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
2324 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
2326 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
2328 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
2330 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
2332 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
2334 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
2336 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
2338 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
2340 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
2342 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
2344 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
2346 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
2348 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
2350 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
2352 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
2354 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
2356 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
2358 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
2360 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
2362 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
2364 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
2366 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
2368 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
2370 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2372 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2374 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
2376 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
2378 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
2380 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
2382 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2384 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
2386 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2388 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
2390 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2392 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2394 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2396 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2398 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2400 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2402 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2404 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2406 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2408 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2410 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2412 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2414 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2416 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2418 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2420 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2422 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2424 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2426 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2428 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2430 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2432 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2434 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2436 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2438 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2440 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2442 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2444 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2446 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2448 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2450 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2452 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2454 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2456 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2458 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2460 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2462 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2464 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2466 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2468 case BFD_RELOC_PPC_16DX_HA: r = R_PPC64_16DX_HA;
2470 case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA;
2472 case BFD_RELOC_PPC64_ENTRY: r = R_PPC64_ENTRY;
2474 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
2476 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2478 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
2482 return ppc64_elf_howto_table[r];
2485 static reloc_howto_type *
2486 ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2491 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
2492 if (ppc64_elf_howto_raw[i].name != NULL
2493 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2494 return &ppc64_elf_howto_raw[i];
2499 /* Set the howto pointer for a PowerPC ELF reloc. */
2502 ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
2503 Elf_Internal_Rela *dst)
2507 /* Initialize howto table if needed. */
2508 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2511 type = ELF64_R_TYPE (dst->r_info);
2512 if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
2514 /* xgettext:c-format */
2515 _bfd_error_handler (_("%B: invalid relocation type %d"),
2517 type = R_PPC64_NONE;
2519 cache_ptr->howto = ppc64_elf_howto_table[type];
2522 /* Handle the R_PPC64_ADDR16_HA and similar relocs. */
2524 static bfd_reloc_status_type
2525 ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2526 void *data, asection *input_section,
2527 bfd *output_bfd, char **error_message)
2529 enum elf_ppc64_reloc_type r_type;
2531 bfd_size_type octets;
2534 /* If this is a relocatable link (output_bfd test tells us), just
2535 call the generic function. Any adjustment will be done at final
2537 if (output_bfd != NULL)
2538 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2539 input_section, output_bfd, error_message);
2541 /* Adjust the addend for sign extension of the low 16 bits.
2542 We won't actually be using the low 16 bits, so trashing them
2544 reloc_entry->addend += 0x8000;
2545 r_type = reloc_entry->howto->type;
2546 if (r_type != R_PPC64_REL16DX_HA)
2547 return bfd_reloc_continue;
2550 if (!bfd_is_com_section (symbol->section))
2551 value = symbol->value;
2552 value += (reloc_entry->addend
2553 + symbol->section->output_offset
2554 + symbol->section->output_section->vma);
2555 value -= (reloc_entry->address
2556 + input_section->output_offset
2557 + input_section->output_section->vma);
2558 value = (bfd_signed_vma) value >> 16;
2560 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2561 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2563 insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
2564 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2565 if (value + 0x8000 > 0xffff)
2566 return bfd_reloc_overflow;
2567 return bfd_reloc_ok;
2570 static bfd_reloc_status_type
2571 ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2572 void *data, asection *input_section,
2573 bfd *output_bfd, char **error_message)
2575 if (output_bfd != NULL)
2576 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2577 input_section, output_bfd, error_message);
2579 if (strcmp (symbol->section->name, ".opd") == 0
2580 && (symbol->section->owner->flags & DYNAMIC) == 0)
2582 bfd_vma dest = opd_entry_value (symbol->section,
2583 symbol->value + reloc_entry->addend,
2585 if (dest != (bfd_vma) -1)
2586 reloc_entry->addend = dest - (symbol->value
2587 + symbol->section->output_section->vma
2588 + symbol->section->output_offset);
2592 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
2594 if (symbol->section->owner != abfd
2595 && symbol->section->owner != NULL
2596 && abiversion (symbol->section->owner) >= 2)
2600 for (i = 0; i < symbol->section->owner->symcount; ++i)
2602 asymbol *symdef = symbol->section->owner->outsymbols[i];
2604 if (strcmp (symdef->name, symbol->name) == 0)
2606 elfsym = (elf_symbol_type *) symdef;
2612 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
2614 return bfd_reloc_continue;
2617 static bfd_reloc_status_type
2618 ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2619 void *data, asection *input_section,
2620 bfd *output_bfd, char **error_message)
2623 enum elf_ppc64_reloc_type r_type;
2624 bfd_size_type octets;
2625 /* Assume 'at' branch hints. */
2626 bfd_boolean is_isa_v2 = TRUE;
2628 /* If this is a relocatable link (output_bfd test tells us), just
2629 call the generic function. Any adjustment will be done at final
2631 if (output_bfd != NULL)
2632 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2633 input_section, output_bfd, error_message);
2635 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2636 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2637 insn &= ~(0x01 << 21);
2638 r_type = reloc_entry->howto->type;
2639 if (r_type == R_PPC64_ADDR14_BRTAKEN
2640 || r_type == R_PPC64_REL14_BRTAKEN)
2641 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
2645 /* Set 'a' bit. This is 0b00010 in BO field for branch
2646 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2647 for branch on CTR insns (BO == 1a00t or 1a01t). */
2648 if ((insn & (0x14 << 21)) == (0x04 << 21))
2650 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2660 if (!bfd_is_com_section (symbol->section))
2661 target = symbol->value;
2662 target += symbol->section->output_section->vma;
2663 target += symbol->section->output_offset;
2664 target += reloc_entry->addend;
2666 from = (reloc_entry->address
2667 + input_section->output_offset
2668 + input_section->output_section->vma);
2670 /* Invert 'y' bit if not the default. */
2671 if ((bfd_signed_vma) (target - from) < 0)
2674 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2676 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2677 input_section, output_bfd, error_message);
2680 static bfd_reloc_status_type
2681 ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2682 void *data, asection *input_section,
2683 bfd *output_bfd, char **error_message)
2685 /* If this is a relocatable link (output_bfd test tells us), just
2686 call the generic function. Any adjustment will be done at final
2688 if (output_bfd != NULL)
2689 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2690 input_section, output_bfd, error_message);
2692 /* Subtract the symbol section base address. */
2693 reloc_entry->addend -= symbol->section->output_section->vma;
2694 return bfd_reloc_continue;
2697 static bfd_reloc_status_type
2698 ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2699 void *data, asection *input_section,
2700 bfd *output_bfd, char **error_message)
2702 /* If this is a relocatable link (output_bfd test tells us), just
2703 call the generic function. Any adjustment will be done at final
2705 if (output_bfd != NULL)
2706 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2707 input_section, output_bfd, error_message);
2709 /* Subtract the symbol section base address. */
2710 reloc_entry->addend -= symbol->section->output_section->vma;
2712 /* Adjust the addend for sign extension of the low 16 bits. */
2713 reloc_entry->addend += 0x8000;
2714 return bfd_reloc_continue;
2717 static bfd_reloc_status_type
2718 ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2719 void *data, asection *input_section,
2720 bfd *output_bfd, char **error_message)
2724 /* If this is a relocatable link (output_bfd test tells us), just
2725 call the generic function. Any adjustment will be done at final
2727 if (output_bfd != NULL)
2728 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2729 input_section, output_bfd, error_message);
2731 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2733 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2735 /* Subtract the TOC base address. */
2736 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2737 return bfd_reloc_continue;
2740 static bfd_reloc_status_type
2741 ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2742 void *data, asection *input_section,
2743 bfd *output_bfd, char **error_message)
2747 /* If this is a relocatable link (output_bfd test tells us), just
2748 call the generic function. Any adjustment will be done at final
2750 if (output_bfd != NULL)
2751 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2752 input_section, output_bfd, error_message);
2754 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2756 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2758 /* Subtract the TOC base address. */
2759 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2761 /* Adjust the addend for sign extension of the low 16 bits. */
2762 reloc_entry->addend += 0x8000;
2763 return bfd_reloc_continue;
2766 static bfd_reloc_status_type
2767 ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2768 void *data, asection *input_section,
2769 bfd *output_bfd, char **error_message)
2772 bfd_size_type octets;
2774 /* If this is a relocatable link (output_bfd test tells us), just
2775 call the generic function. Any adjustment will be done at final
2777 if (output_bfd != NULL)
2778 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2779 input_section, output_bfd, error_message);
2781 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2783 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2785 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2786 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2787 return bfd_reloc_ok;
2790 static bfd_reloc_status_type
2791 ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2792 void *data, asection *input_section,
2793 bfd *output_bfd, char **error_message)
2795 /* If this is a relocatable link (output_bfd test tells us), just
2796 call the generic function. Any adjustment will be done at final
2798 if (output_bfd != NULL)
2799 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2800 input_section, output_bfd, error_message);
2802 if (error_message != NULL)
2804 static char buf[60];
2805 sprintf (buf, "generic linker can't handle %s",
2806 reloc_entry->howto->name);
2807 *error_message = buf;
2809 return bfd_reloc_dangerous;
2812 /* Track GOT entries needed for a given symbol. We might need more
2813 than one got entry per symbol. */
2816 struct got_entry *next;
2818 /* The symbol addend that we'll be placing in the GOT. */
2821 /* Unlike other ELF targets, we use separate GOT entries for the same
2822 symbol referenced from different input files. This is to support
2823 automatic multiple TOC/GOT sections, where the TOC base can vary
2824 from one input file to another. After partitioning into TOC groups
2825 we merge entries within the group.
2827 Point to the BFD owning this GOT entry. */
2830 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2831 TLS_TPREL or TLS_DTPREL for tls entries. */
2832 unsigned char tls_type;
2834 /* Non-zero if got.ent points to real entry. */
2835 unsigned char is_indirect;
2837 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2840 bfd_signed_vma refcount;
2842 struct got_entry *ent;
2846 /* The same for PLT. */
2849 struct plt_entry *next;
2855 bfd_signed_vma refcount;
2860 struct ppc64_elf_obj_tdata
2862 struct elf_obj_tdata elf;
2864 /* Shortcuts to dynamic linker sections. */
2868 /* Used during garbage collection. We attach global symbols defined
2869 on removed .opd entries to this section so that the sym is removed. */
2870 asection *deleted_section;
2872 /* TLS local dynamic got entry handling. Support for multiple GOT
2873 sections means we potentially need one of these for each input bfd. */
2874 struct got_entry tlsld_got;
2877 /* A copy of relocs before they are modified for --emit-relocs. */
2878 Elf_Internal_Rela *relocs;
2880 /* Section contents. */
2884 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2885 the reloc to be in the range -32768 to 32767. */
2886 unsigned int has_small_toc_reloc : 1;
2888 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2889 instruction not one we handle. */
2890 unsigned int unexpected_toc_insn : 1;
2893 #define ppc64_elf_tdata(bfd) \
2894 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2896 #define ppc64_tlsld_got(bfd) \
2897 (&ppc64_elf_tdata (bfd)->tlsld_got)
2899 #define is_ppc64_elf(bfd) \
2900 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2901 && elf_object_id (bfd) == PPC64_ELF_DATA)
2903 /* Override the generic function because we store some extras. */
2906 ppc64_elf_mkobject (bfd *abfd)
2908 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2912 /* Fix bad default arch selected for a 64 bit input bfd when the
2913 default is 32 bit. Also select arch based on apuinfo. */
2916 ppc64_elf_object_p (bfd *abfd)
2918 if (!abfd->arch_info->the_default)
2921 if (abfd->arch_info->bits_per_word == 32)
2923 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2925 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2927 /* Relies on arch after 32 bit default being 64 bit default. */
2928 abfd->arch_info = abfd->arch_info->next;
2929 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2932 return _bfd_elf_ppc_set_arch (abfd);
2935 /* Support for core dump NOTE sections. */
2938 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2940 size_t offset, size;
2942 if (note->descsz != 504)
2946 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2949 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
2955 /* Make a ".reg/999" section. */
2956 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2957 size, note->descpos + offset);
2961 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2963 if (note->descsz != 136)
2966 elf_tdata (abfd)->core->pid
2967 = bfd_get_32 (abfd, note->descdata + 24);
2968 elf_tdata (abfd)->core->program
2969 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2970 elf_tdata (abfd)->core->command
2971 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2977 ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2990 va_start (ap, note_type);
2991 memset (data, 0, sizeof (data));
2992 strncpy (data + 40, va_arg (ap, const char *), 16);
2993 strncpy (data + 56, va_arg (ap, const char *), 80);
2995 return elfcore_write_note (abfd, buf, bufsiz,
2996 "CORE", note_type, data, sizeof (data));
3007 va_start (ap, note_type);
3008 memset (data, 0, 112);
3009 pid = va_arg (ap, long);
3010 bfd_put_32 (abfd, pid, data + 32);
3011 cursig = va_arg (ap, int);
3012 bfd_put_16 (abfd, cursig, data + 12);
3013 greg = va_arg (ap, const void *);
3014 memcpy (data + 112, greg, 384);
3015 memset (data + 496, 0, 8);
3017 return elfcore_write_note (abfd, buf, bufsiz,
3018 "CORE", note_type, data, sizeof (data));
3023 /* Add extra PPC sections. */
3025 static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
3027 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
3028 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
3029 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3030 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3031 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3032 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
3033 { NULL, 0, 0, 0, 0 }
3036 enum _ppc64_sec_type {
3042 struct _ppc64_elf_section_data
3044 struct bfd_elf_section_data elf;
3048 /* An array with one entry for each opd function descriptor,
3049 and some spares since opd entries may be either 16 or 24 bytes. */
3050 #define OPD_NDX(OFF) ((OFF) >> 4)
3051 struct _opd_sec_data
3053 /* Points to the function code section for local opd entries. */
3054 asection **func_sec;
3056 /* After editing .opd, adjust references to opd local syms. */
3060 /* An array for toc sections, indexed by offset/8. */
3061 struct _toc_sec_data
3063 /* Specifies the relocation symbol index used at a given toc offset. */
3066 /* And the relocation addend. */
3071 enum _ppc64_sec_type sec_type:2;
3073 /* Flag set when small branches are detected. Used to
3074 select suitable defaults for the stub group size. */
3075 unsigned int has_14bit_branch:1;
3078 #define ppc64_elf_section_data(sec) \
3079 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
3082 ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
3084 if (!sec->used_by_bfd)
3086 struct _ppc64_elf_section_data *sdata;
3087 bfd_size_type amt = sizeof (*sdata);
3089 sdata = bfd_zalloc (abfd, amt);
3092 sec->used_by_bfd = sdata;
3095 return _bfd_elf_new_section_hook (abfd, sec);
3098 static struct _opd_sec_data *
3099 get_opd_info (asection * sec)
3102 && ppc64_elf_section_data (sec) != NULL
3103 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
3104 return &ppc64_elf_section_data (sec)->u.opd;
3108 /* Parameters for the qsort hook. */
3109 static bfd_boolean synthetic_relocatable;
3110 static asection *synthetic_opd;
3112 /* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
3115 compare_symbols (const void *ap, const void *bp)
3117 const asymbol *a = * (const asymbol **) ap;
3118 const asymbol *b = * (const asymbol **) bp;
3120 /* Section symbols first. */
3121 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
3123 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
3126 /* then .opd symbols. */
3127 if (synthetic_opd != NULL)
3129 if (strcmp (a->section->name, ".opd") == 0
3130 && strcmp (b->section->name, ".opd") != 0)
3132 if (strcmp (a->section->name, ".opd") != 0
3133 && strcmp (b->section->name, ".opd") == 0)
3137 /* then other code symbols. */
3138 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3139 == (SEC_CODE | SEC_ALLOC)
3140 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3141 != (SEC_CODE | SEC_ALLOC))
3144 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3145 != (SEC_CODE | SEC_ALLOC)
3146 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3147 == (SEC_CODE | SEC_ALLOC))
3150 if (synthetic_relocatable)
3152 if (a->section->id < b->section->id)
3155 if (a->section->id > b->section->id)
3159 if (a->value + a->section->vma < b->value + b->section->vma)
3162 if (a->value + a->section->vma > b->value + b->section->vma)
3165 /* For syms with the same value, prefer strong dynamic global function
3166 syms over other syms. */
3167 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3170 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3173 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3176 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3179 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3182 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3185 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3188 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3194 /* Search SYMS for a symbol of the given VALUE. */
3197 sym_exists_at (asymbol **syms, long lo, long hi, unsigned int id, bfd_vma value)
3201 if (id == (unsigned) -1)
3205 mid = (lo + hi) >> 1;
3206 if (syms[mid]->value + syms[mid]->section->vma < value)
3208 else if (syms[mid]->value + syms[mid]->section->vma > value)
3218 mid = (lo + hi) >> 1;
3219 if (syms[mid]->section->id < id)
3221 else if (syms[mid]->section->id > id)
3223 else if (syms[mid]->value < value)
3225 else if (syms[mid]->value > value)
3235 section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3237 bfd_vma vma = *(bfd_vma *) ptr;
3238 return ((section->flags & SEC_ALLOC) != 0
3239 && section->vma <= vma
3240 && vma < section->vma + section->size);
3243 /* Create synthetic symbols, effectively restoring "dot-symbol" function
3244 entry syms. Also generate @plt symbols for the glink branch table.
3245 Returns count of synthetic symbols in RET or -1 on error. */
3248 ppc64_elf_get_synthetic_symtab (bfd *abfd,
3249 long static_count, asymbol **static_syms,
3250 long dyn_count, asymbol **dyn_syms,
3257 long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
3258 asection *opd = NULL;
3259 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
3261 int abi = abiversion (abfd);
3267 opd = bfd_get_section_by_name (abfd, ".opd");
3268 if (opd == NULL && abi == 1)
3280 symcount = static_count;
3282 symcount += dyn_count;
3286 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3290 if (!relocatable && static_count != 0 && dyn_count != 0)
3292 /* Use both symbol tables. */
3293 memcpy (syms, static_syms, static_count * sizeof (*syms));
3294 memcpy (syms + static_count, dyn_syms,
3295 (dyn_count + 1) * sizeof (*syms));
3297 else if (!relocatable && static_count == 0)
3298 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3300 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3302 synthetic_relocatable = relocatable;
3303 synthetic_opd = opd;
3304 qsort (syms, symcount, sizeof (*syms), compare_symbols);
3306 if (!relocatable && symcount > 1)
3309 /* Trim duplicate syms, since we may have merged the normal and
3310 dynamic symbols. Actually, we only care about syms that have
3311 different values, so trim any with the same value. */
3312 for (i = 1, j = 1; i < symcount; ++i)
3313 if (syms[i - 1]->value + syms[i - 1]->section->vma
3314 != syms[i]->value + syms[i]->section->vma)
3315 syms[j++] = syms[i];
3320 /* Note that here and in compare_symbols we can't compare opd and
3321 sym->section directly. With separate debug info files, the
3322 symbols will be extracted from the debug file while abfd passed
3323 to this function is the real binary. */
3324 if (opd != NULL && strcmp (syms[i]->section->name, ".opd") == 0)
3328 for (; i < symcount; ++i)
3329 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC
3330 | SEC_THREAD_LOCAL))
3331 != (SEC_CODE | SEC_ALLOC))
3332 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3336 for (; i < symcount; ++i)
3337 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3341 for (; i < symcount; ++i)
3342 if (strcmp (syms[i]->section->name, ".opd") != 0)
3346 for (; i < symcount; ++i)
3347 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3348 != (SEC_CODE | SEC_ALLOC))
3356 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3361 if (opdsymend == secsymend)
3364 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3365 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
3369 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3376 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3380 while (r < opd->relocation + relcount
3381 && r->address < syms[i]->value + opd->vma)
3384 if (r == opd->relocation + relcount)
3387 if (r->address != syms[i]->value + opd->vma)
3390 if (r->howto->type != R_PPC64_ADDR64)
3393 sym = *r->sym_ptr_ptr;
3394 if (!sym_exists_at (syms, opdsymend, symcount,
3395 sym->section->id, sym->value + r->addend))
3398 size += sizeof (asymbol);
3399 size += strlen (syms[i]->name) + 2;
3405 s = *ret = bfd_malloc (size);
3412 names = (char *) (s + count);
3414 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3418 while (r < opd->relocation + relcount
3419 && r->address < syms[i]->value + opd->vma)
3422 if (r == opd->relocation + relcount)
3425 if (r->address != syms[i]->value + opd->vma)
3428 if (r->howto->type != R_PPC64_ADDR64)
3431 sym = *r->sym_ptr_ptr;
3432 if (!sym_exists_at (syms, opdsymend, symcount,
3433 sym->section->id, sym->value + r->addend))
3438 s->flags |= BSF_SYNTHETIC;
3439 s->section = sym->section;
3440 s->value = sym->value + r->addend;
3443 len = strlen (syms[i]->name);
3444 memcpy (names, syms[i]->name, len + 1);
3446 /* Have udata.p point back to the original symbol this
3447 synthetic symbol was derived from. */
3448 s->udata.p = syms[i];
3455 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3456 bfd_byte *contents = NULL;
3459 bfd_vma glink_vma = 0, resolv_vma = 0;
3460 asection *dynamic, *glink = NULL, *relplt = NULL;
3463 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
3465 free_contents_and_exit_err:
3467 free_contents_and_exit:
3474 for (i = secsymend; i < opdsymend; ++i)
3478 /* Ignore bogus symbols. */
3479 if (syms[i]->value > opd->size - 8)
3482 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3483 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3486 size += sizeof (asymbol);
3487 size += strlen (syms[i]->name) + 2;
3491 /* Get start of .glink stubs from DT_PPC64_GLINK. */
3493 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
3495 bfd_byte *dynbuf, *extdyn, *extdynend;
3497 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3499 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3500 goto free_contents_and_exit_err;
3502 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3503 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3506 extdynend = extdyn + dynamic->size;
3507 for (; extdyn < extdynend; extdyn += extdynsize)
3509 Elf_Internal_Dyn dyn;
3510 (*swap_dyn_in) (abfd, extdyn, &dyn);
3512 if (dyn.d_tag == DT_NULL)
3515 if (dyn.d_tag == DT_PPC64_GLINK)
3517 /* The first glink stub starts at offset 32; see
3518 comment in ppc64_elf_finish_dynamic_sections. */
3519 glink_vma = dyn.d_un.d_val + GLINK_CALL_STUB_SIZE - 8 * 4;
3520 /* The .glink section usually does not survive the final
3521 link; search for the section (usually .text) where the
3522 glink stubs now reside. */
3523 glink = bfd_sections_find_if (abfd, section_covers_vma,
3534 /* Determine __glink trampoline by reading the relative branch
3535 from the first glink stub. */
3537 unsigned int off = 0;
3539 while (bfd_get_section_contents (abfd, glink, buf,
3540 glink_vma + off - glink->vma, 4))
3542 unsigned int insn = bfd_get_32 (abfd, buf);
3544 if ((insn & ~0x3fffffc) == 0)
3546 resolv_vma = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
3555 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3557 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3560 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3561 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3562 goto free_contents_and_exit_err;
3564 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3565 size += plt_count * sizeof (asymbol);
3567 p = relplt->relocation;
3568 for (i = 0; i < plt_count; i++, p++)
3570 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3572 size += sizeof ("+0x") - 1 + 16;
3578 goto free_contents_and_exit;
3579 s = *ret = bfd_malloc (size);
3581 goto free_contents_and_exit_err;
3583 names = (char *) (s + count + plt_count + (resolv_vma != 0));
3585 for (i = secsymend; i < opdsymend; ++i)
3589 if (syms[i]->value > opd->size - 8)
3592 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3593 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3597 asection *sec = abfd->sections;
3604 long mid = (lo + hi) >> 1;
3605 if (syms[mid]->section->vma < ent)
3607 else if (syms[mid]->section->vma > ent)
3611 sec = syms[mid]->section;
3616 if (lo >= hi && lo > codesecsym)
3617 sec = syms[lo - 1]->section;
3619 for (; sec != NULL; sec = sec->next)
3623 /* SEC_LOAD may not be set if SEC is from a separate debug
3625 if ((sec->flags & SEC_ALLOC) == 0)
3627 if ((sec->flags & SEC_CODE) != 0)
3630 s->flags |= BSF_SYNTHETIC;
3631 s->value = ent - s->section->vma;
3634 len = strlen (syms[i]->name);
3635 memcpy (names, syms[i]->name, len + 1);
3637 /* Have udata.p point back to the original symbol this
3638 synthetic symbol was derived from. */
3639 s->udata.p = syms[i];
3645 if (glink != NULL && relplt != NULL)
3649 /* Add a symbol for the main glink trampoline. */
3650 memset (s, 0, sizeof *s);
3652 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3654 s->value = resolv_vma - glink->vma;
3656 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3657 names += sizeof ("__glink_PLTresolve");
3662 /* FIXME: It would be very much nicer to put sym@plt on the
3663 stub rather than on the glink branch table entry. The
3664 objdump disassembler would then use a sensible symbol
3665 name on plt calls. The difficulty in doing so is
3666 a) finding the stubs, and,
3667 b) matching stubs against plt entries, and,
3668 c) there can be multiple stubs for a given plt entry.
3670 Solving (a) could be done by code scanning, but older
3671 ppc64 binaries used different stubs to current code.
3672 (b) is the tricky one since you need to known the toc
3673 pointer for at least one function that uses a pic stub to
3674 be able to calculate the plt address referenced.
3675 (c) means gdb would need to set multiple breakpoints (or
3676 find the glink branch itself) when setting breakpoints
3677 for pending shared library loads. */
3678 p = relplt->relocation;
3679 for (i = 0; i < plt_count; i++, p++)
3683 *s = **p->sym_ptr_ptr;
3684 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3685 we are defining a symbol, ensure one of them is set. */
3686 if ((s->flags & BSF_LOCAL) == 0)
3687 s->flags |= BSF_GLOBAL;
3688 s->flags |= BSF_SYNTHETIC;
3690 s->value = glink_vma - glink->vma;
3693 len = strlen ((*p->sym_ptr_ptr)->name);
3694 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3698 memcpy (names, "+0x", sizeof ("+0x") - 1);
3699 names += sizeof ("+0x") - 1;
3700 bfd_sprintf_vma (abfd, names, p->addend);
3701 names += strlen (names);
3703 memcpy (names, "@plt", sizeof ("@plt"));
3704 names += sizeof ("@plt");
3724 /* The following functions are specific to the ELF linker, while
3725 functions above are used generally. Those named ppc64_elf_* are
3726 called by the main ELF linker code. They appear in this file more
3727 or less in the order in which they are called. eg.
3728 ppc64_elf_check_relocs is called early in the link process,
3729 ppc64_elf_finish_dynamic_sections is one of the last functions
3732 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3733 functions have both a function code symbol and a function descriptor
3734 symbol. A call to foo in a relocatable object file looks like:
3741 The function definition in another object file might be:
3745 . .quad .TOC.@tocbase
3751 When the linker resolves the call during a static link, the branch
3752 unsurprisingly just goes to .foo and the .opd information is unused.
3753 If the function definition is in a shared library, things are a little
3754 different: The call goes via a plt call stub, the opd information gets
3755 copied to the plt, and the linker patches the nop.
3763 . std 2,40(1) # in practice, the call stub
3764 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3765 . addi 11,11,Lfoo@toc@l # this is the general idea
3773 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3775 The "reloc ()" notation is supposed to indicate that the linker emits
3776 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3779 What are the difficulties here? Well, firstly, the relocations
3780 examined by the linker in check_relocs are against the function code
3781 sym .foo, while the dynamic relocation in the plt is emitted against
3782 the function descriptor symbol, foo. Somewhere along the line, we need
3783 to carefully copy dynamic link information from one symbol to the other.
3784 Secondly, the generic part of the elf linker will make .foo a dynamic
3785 symbol as is normal for most other backends. We need foo dynamic
3786 instead, at least for an application final link. However, when
3787 creating a shared library containing foo, we need to have both symbols
3788 dynamic so that references to .foo are satisfied during the early
3789 stages of linking. Otherwise the linker might decide to pull in a
3790 definition from some other object, eg. a static library.
3792 Update: As of August 2004, we support a new convention. Function
3793 calls may use the function descriptor symbol, ie. "bl foo". This
3794 behaves exactly as "bl .foo". */
3796 /* Of those relocs that might be copied as dynamic relocs, this
3797 function selects those that must be copied when linking a shared
3798 library or PIE, even when the symbol is local. */
3801 must_be_dyn_reloc (struct bfd_link_info *info,
3802 enum elf_ppc64_reloc_type r_type)
3807 /* Only relative relocs can be resolved when the object load
3808 address isn't fixed. DTPREL64 is excluded because the
3809 dynamic linker needs to differentiate global dynamic from
3810 local dynamic __tls_index pairs when PPC64_OPT_TLS is set. */
3818 case R_PPC64_TPREL16:
3819 case R_PPC64_TPREL16_LO:
3820 case R_PPC64_TPREL16_HI:
3821 case R_PPC64_TPREL16_HA:
3822 case R_PPC64_TPREL16_DS:
3823 case R_PPC64_TPREL16_LO_DS:
3824 case R_PPC64_TPREL16_HIGH:
3825 case R_PPC64_TPREL16_HIGHA:
3826 case R_PPC64_TPREL16_HIGHER:
3827 case R_PPC64_TPREL16_HIGHERA:
3828 case R_PPC64_TPREL16_HIGHEST:
3829 case R_PPC64_TPREL16_HIGHESTA:
3830 case R_PPC64_TPREL64:
3831 /* These relocations are relative but in a shared library the
3832 linker doesn't know the thread pointer base. */
3833 return bfd_link_dll (info);
3837 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3838 copying dynamic variables from a shared lib into an app's dynbss
3839 section, and instead use a dynamic relocation to point into the
3840 shared lib. With code that gcc generates, it's vital that this be
3841 enabled; In the PowerPC64 ABI, the address of a function is actually
3842 the address of a function descriptor, which resides in the .opd
3843 section. gcc uses the descriptor directly rather than going via the
3844 GOT as some other ABI's do, which means that initialized function
3845 pointers must reference the descriptor. Thus, a function pointer
3846 initialized to the address of a function in a shared library will
3847 either require a copy reloc, or a dynamic reloc. Using a copy reloc
3848 redefines the function descriptor symbol to point to the copy. This
3849 presents a problem as a plt entry for that function is also
3850 initialized from the function descriptor symbol and the copy reloc
3851 may not be initialized first. */
3852 #define ELIMINATE_COPY_RELOCS 1
3854 /* Section name for stubs is the associated section name plus this
3856 #define STUB_SUFFIX ".stub"
3859 ppc_stub_long_branch:
3860 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3861 destination, but a 24 bit branch in a stub section will reach.
3864 ppc_stub_plt_branch:
3865 Similar to the above, but a 24 bit branch in the stub section won't
3866 reach its destination.
3867 . addis %r11,%r2,xxx@toc@ha
3868 . ld %r12,xxx@toc@l(%r11)
3873 Used to call a function in a shared library. If it so happens that
3874 the plt entry referenced crosses a 64k boundary, then an extra
3875 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
3877 . addis %r11,%r2,xxx@toc@ha
3878 . ld %r12,xxx+0@toc@l(%r11)
3880 . ld %r2,xxx+8@toc@l(%r11)
3881 . ld %r11,xxx+16@toc@l(%r11)
3884 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3885 code to adjust the value and save r2 to support multiple toc sections.
3886 A ppc_stub_long_branch with an r2 offset looks like:
3888 . addis %r2,%r2,off@ha
3889 . addi %r2,%r2,off@l
3892 A ppc_stub_plt_branch with an r2 offset looks like:
3894 . addis %r11,%r2,xxx@toc@ha
3895 . ld %r12,xxx@toc@l(%r11)
3896 . addis %r2,%r2,off@ha
3897 . addi %r2,%r2,off@l
3901 In cases where the "addis" instruction would add zero, the "addis" is
3902 omitted and following instructions modified slightly in some cases.
3905 enum ppc_stub_type {
3907 ppc_stub_long_branch,
3908 ppc_stub_long_branch_r2off,
3909 ppc_stub_plt_branch,
3910 ppc_stub_plt_branch_r2off,
3912 ppc_stub_plt_call_r2save,
3913 ppc_stub_global_entry,
3917 /* Information on stub grouping. */
3920 /* The stub section. */
3922 /* This is the section to which stubs in the group will be attached. */
3925 struct map_stub *next;
3926 /* Whether to emit a copy of register save/restore functions in this
3929 /* The offset of the __tls_get_addr_opt plt stub bctrl in this group,
3930 or -1u if no such stub with bctrl exists. */
3931 unsigned int tls_get_addr_opt_bctrl;
3934 struct ppc_stub_hash_entry {
3936 /* Base hash table entry structure. */
3937 struct bfd_hash_entry root;
3939 enum ppc_stub_type stub_type;
3941 /* Group information. */
3942 struct map_stub *group;
3944 /* Offset within stub_sec of the beginning of this stub. */
3945 bfd_vma stub_offset;
3947 /* Given the symbol's value and its section we can determine its final
3948 value when building the stubs (so the stub knows where to jump. */
3949 bfd_vma target_value;
3950 asection *target_section;
3952 /* The symbol table entry, if any, that this was derived from. */
3953 struct ppc_link_hash_entry *h;
3954 struct plt_entry *plt_ent;
3956 /* Symbol st_other. */
3957 unsigned char other;
3960 struct ppc_branch_hash_entry {
3962 /* Base hash table entry structure. */
3963 struct bfd_hash_entry root;
3965 /* Offset within branch lookup table. */
3966 unsigned int offset;
3968 /* Generation marker. */
3972 /* Used to track dynamic relocations for local symbols. */
3973 struct ppc_dyn_relocs
3975 struct ppc_dyn_relocs *next;
3977 /* The input section of the reloc. */
3980 /* Total number of relocs copied for the input section. */
3981 unsigned int count : 31;
3983 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3984 unsigned int ifunc : 1;
3987 struct ppc_link_hash_entry
3989 struct elf_link_hash_entry elf;
3992 /* A pointer to the most recently used stub hash entry against this
3994 struct ppc_stub_hash_entry *stub_cache;
3996 /* A pointer to the next symbol starting with a '.' */
3997 struct ppc_link_hash_entry *next_dot_sym;
4000 /* Track dynamic relocs copied for this symbol. */
4001 struct elf_dyn_relocs *dyn_relocs;
4003 /* Chain of aliases referring to a weakdef. */
4004 struct ppc_link_hash_entry *weakref;
4006 /* Link between function code and descriptor symbols. */
4007 struct ppc_link_hash_entry *oh;
4009 /* Flag function code and descriptor symbols. */
4010 unsigned int is_func:1;
4011 unsigned int is_func_descriptor:1;
4012 unsigned int fake:1;
4014 /* Whether global opd/toc sym has been adjusted or not.
4015 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
4016 should be set for all globals defined in any opd/toc section. */
4017 unsigned int adjust_done:1;
4019 /* Set if this is an out-of-line register save/restore function,
4020 with non-standard calling convention. */
4021 unsigned int save_res:1;
4023 /* Set if a duplicate symbol with non-zero localentry is detected,
4024 even when the duplicate symbol does not provide a definition. */
4025 unsigned int non_zero_localentry:1;
4027 /* Contexts in which symbol is used in the GOT (or TOC).
4028 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
4029 corresponding relocs are encountered during check_relocs.
4030 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
4031 indicate the corresponding GOT entry type is not needed.
4032 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
4033 a TPREL one. We use a separate flag rather than setting TPREL
4034 just for convenience in distinguishing the two cases. */
4035 #define TLS_GD 1 /* GD reloc. */
4036 #define TLS_LD 2 /* LD reloc. */
4037 #define TLS_TPREL 4 /* TPREL reloc, => IE. */
4038 #define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
4039 #define TLS_TLS 16 /* Any TLS reloc. */
4040 #define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
4041 #define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
4042 #define PLT_IFUNC 128 /* STT_GNU_IFUNC. */
4043 unsigned char tls_mask;
4046 /* ppc64 ELF linker hash table. */
4048 struct ppc_link_hash_table
4050 struct elf_link_hash_table elf;
4052 /* The stub hash table. */
4053 struct bfd_hash_table stub_hash_table;
4055 /* Another hash table for plt_branch stubs. */
4056 struct bfd_hash_table branch_hash_table;
4058 /* Hash table for function prologue tocsave. */
4059 htab_t tocsave_htab;
4061 /* Various options and other info passed from the linker. */
4062 struct ppc64_elf_params *params;
4064 /* The size of sec_info below. */
4065 unsigned int sec_info_arr_size;
4067 /* Per-section array of extra section info. Done this way rather
4068 than as part of ppc64_elf_section_data so we have the info for
4069 non-ppc64 sections. */
4072 /* Along with elf_gp, specifies the TOC pointer used by this section. */
4077 /* The section group that this section belongs to. */
4078 struct map_stub *group;
4079 /* A temp section list pointer. */
4084 /* Linked list of groups. */
4085 struct map_stub *group;
4087 /* Temp used when calculating TOC pointers. */
4090 asection *toc_first_sec;
4092 /* Used when adding symbols. */
4093 struct ppc_link_hash_entry *dot_syms;
4095 /* Shortcuts to get to dynamic linker sections. */
4100 asection *glink_eh_frame;
4102 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
4103 struct ppc_link_hash_entry *tls_get_addr;
4104 struct ppc_link_hash_entry *tls_get_addr_fd;
4106 /* The size of reliplt used by got entry relocs. */
4107 bfd_size_type got_reli_size;
4110 unsigned long stub_count[ppc_stub_global_entry];
4112 /* Number of stubs against global syms. */
4113 unsigned long stub_globals;
4115 /* Set if we're linking code with function descriptors. */
4116 unsigned int opd_abi:1;
4118 /* Support for multiple toc sections. */
4119 unsigned int do_multi_toc:1;
4120 unsigned int multi_toc_needed:1;
4121 unsigned int second_toc_pass:1;
4122 unsigned int do_toc_opt:1;
4124 /* Set if tls optimization is enabled. */
4125 unsigned int do_tls_opt:1;
4128 unsigned int stub_error:1;
4130 /* Whether func_desc_adjust needs to be run over symbols. */
4131 unsigned int need_func_desc_adj:1;
4133 /* Whether there exist local gnu indirect function resolvers,
4134 referenced by dynamic relocations. */
4135 unsigned int local_ifunc_resolver:1;
4136 unsigned int maybe_local_ifunc_resolver:1;
4138 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
4139 unsigned int has_plt_localentry0:1;
4141 /* Incremented every time we size stubs. */
4142 unsigned int stub_iteration;
4144 /* Small local sym cache. */
4145 struct sym_cache sym_cache;
4148 /* Rename some of the generic section flags to better document how they
4151 /* Nonzero if this section has TLS related relocations. */
4152 #define has_tls_reloc sec_flg0
4154 /* Nonzero if this section has a call to __tls_get_addr. */
4155 #define has_tls_get_addr_call sec_flg1
4157 /* Nonzero if this section has any toc or got relocs. */
4158 #define has_toc_reloc sec_flg2
4160 /* Nonzero if this section has a call to another section that uses
4162 #define makes_toc_func_call sec_flg3
4164 /* Recursion protection when determining above flag. */
4165 #define call_check_in_progress sec_flg4
4166 #define call_check_done sec_flg5
4168 /* Get the ppc64 ELF linker hash table from a link_info structure. */
4170 #define ppc_hash_table(p) \
4171 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
4172 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
4174 #define ppc_stub_hash_lookup(table, string, create, copy) \
4175 ((struct ppc_stub_hash_entry *) \
4176 bfd_hash_lookup ((table), (string), (create), (copy)))
4178 #define ppc_branch_hash_lookup(table, string, create, copy) \
4179 ((struct ppc_branch_hash_entry *) \
4180 bfd_hash_lookup ((table), (string), (create), (copy)))
4182 /* Create an entry in the stub hash table. */
4184 static struct bfd_hash_entry *
4185 stub_hash_newfunc (struct bfd_hash_entry *entry,
4186 struct bfd_hash_table *table,
4189 /* Allocate the structure if it has not already been allocated by a
4193 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
4198 /* Call the allocation method of the superclass. */
4199 entry = bfd_hash_newfunc (entry, table, string);
4202 struct ppc_stub_hash_entry *eh;
4204 /* Initialize the local fields. */
4205 eh = (struct ppc_stub_hash_entry *) entry;
4206 eh->stub_type = ppc_stub_none;
4208 eh->stub_offset = 0;
4209 eh->target_value = 0;
4210 eh->target_section = NULL;
4219 /* Create an entry in the branch hash table. */
4221 static struct bfd_hash_entry *
4222 branch_hash_newfunc (struct bfd_hash_entry *entry,
4223 struct bfd_hash_table *table,
4226 /* Allocate the structure if it has not already been allocated by a
4230 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4235 /* Call the allocation method of the superclass. */
4236 entry = bfd_hash_newfunc (entry, table, string);
4239 struct ppc_branch_hash_entry *eh;
4241 /* Initialize the local fields. */
4242 eh = (struct ppc_branch_hash_entry *) entry;
4250 /* Create an entry in a ppc64 ELF linker hash table. */
4252 static struct bfd_hash_entry *
4253 link_hash_newfunc (struct bfd_hash_entry *entry,
4254 struct bfd_hash_table *table,
4257 /* Allocate the structure if it has not already been allocated by a
4261 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4266 /* Call the allocation method of the superclass. */
4267 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4270 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4272 memset (&eh->u.stub_cache, 0,
4273 (sizeof (struct ppc_link_hash_entry)
4274 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4276 /* When making function calls, old ABI code references function entry
4277 points (dot symbols), while new ABI code references the function
4278 descriptor symbol. We need to make any combination of reference and
4279 definition work together, without breaking archive linking.
4281 For a defined function "foo" and an undefined call to "bar":
4282 An old object defines "foo" and ".foo", references ".bar" (possibly
4284 A new object defines "foo" and references "bar".
4286 A new object thus has no problem with its undefined symbols being
4287 satisfied by definitions in an old object. On the other hand, the
4288 old object won't have ".bar" satisfied by a new object.
4290 Keep a list of newly added dot-symbols. */
4292 if (string[0] == '.')
4294 struct ppc_link_hash_table *htab;
4296 htab = (struct ppc_link_hash_table *) table;
4297 eh->u.next_dot_sym = htab->dot_syms;
4298 htab->dot_syms = eh;
4305 struct tocsave_entry {
4311 tocsave_htab_hash (const void *p)
4313 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4314 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
4318 tocsave_htab_eq (const void *p1, const void *p2)
4320 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4321 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4322 return e1->sec == e2->sec && e1->offset == e2->offset;
4325 /* Destroy a ppc64 ELF linker hash table. */
4328 ppc64_elf_link_hash_table_free (bfd *obfd)
4330 struct ppc_link_hash_table *htab;
4332 htab = (struct ppc_link_hash_table *) obfd->link.hash;
4333 if (htab->tocsave_htab)
4334 htab_delete (htab->tocsave_htab);
4335 bfd_hash_table_free (&htab->branch_hash_table);
4336 bfd_hash_table_free (&htab->stub_hash_table);
4337 _bfd_elf_link_hash_table_free (obfd);
4340 /* Create a ppc64 ELF linker hash table. */
4342 static struct bfd_link_hash_table *
4343 ppc64_elf_link_hash_table_create (bfd *abfd)
4345 struct ppc_link_hash_table *htab;
4346 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4348 htab = bfd_zmalloc (amt);
4352 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4353 sizeof (struct ppc_link_hash_entry),
4360 /* Init the stub hash table too. */
4361 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4362 sizeof (struct ppc_stub_hash_entry)))
4364 _bfd_elf_link_hash_table_free (abfd);
4368 /* And the branch hash table. */
4369 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4370 sizeof (struct ppc_branch_hash_entry)))
4372 bfd_hash_table_free (&htab->stub_hash_table);
4373 _bfd_elf_link_hash_table_free (abfd);
4377 htab->tocsave_htab = htab_try_create (1024,
4381 if (htab->tocsave_htab == NULL)
4383 ppc64_elf_link_hash_table_free (abfd);
4386 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
4388 /* Initializing two fields of the union is just cosmetic. We really
4389 only care about glist, but when compiled on a 32-bit host the
4390 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4391 debugger inspection of these fields look nicer. */
4392 htab->elf.init_got_refcount.refcount = 0;
4393 htab->elf.init_got_refcount.glist = NULL;
4394 htab->elf.init_plt_refcount.refcount = 0;
4395 htab->elf.init_plt_refcount.glist = NULL;
4396 htab->elf.init_got_offset.offset = 0;
4397 htab->elf.init_got_offset.glist = NULL;
4398 htab->elf.init_plt_offset.offset = 0;
4399 htab->elf.init_plt_offset.glist = NULL;
4401 return &htab->elf.root;
4404 /* Create sections for linker generated code. */
4407 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4409 struct ppc_link_hash_table *htab;
4412 htab = ppc_hash_table (info);
4414 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4415 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4416 if (htab->params->save_restore_funcs)
4418 /* Create .sfpr for code to save and restore fp regs. */
4419 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4421 if (htab->sfpr == NULL
4422 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4426 if (bfd_link_relocatable (info))
4429 /* Create .glink for lazy dynamic linking support. */
4430 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4432 if (htab->glink == NULL
4433 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4436 if (!info->no_ld_generated_unwind_info)
4438 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4439 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4440 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4443 if (htab->glink_eh_frame == NULL
4444 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4448 flags = SEC_ALLOC | SEC_LINKER_CREATED;
4449 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4450 if (htab->elf.iplt == NULL
4451 || ! bfd_set_section_alignment (dynobj, htab->elf.iplt, 3))
4454 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4455 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4457 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
4458 if (htab->elf.irelplt == NULL
4459 || ! bfd_set_section_alignment (dynobj, htab->elf.irelplt, 3))
4462 /* Create branch lookup table for plt_branch stubs. */
4463 flags = (SEC_ALLOC | SEC_LOAD
4464 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4465 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4467 if (htab->brlt == NULL
4468 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4471 if (!bfd_link_pic (info))
4474 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4475 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4476 htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4479 if (htab->relbrlt == NULL
4480 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4486 /* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4489 ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
4490 struct ppc64_elf_params *params)
4492 struct ppc_link_hash_table *htab;
4494 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
4496 /* Always hook our dynamic sections into the first bfd, which is the
4497 linker created stub bfd. This ensures that the GOT header is at
4498 the start of the output TOC section. */
4499 htab = ppc_hash_table (info);
4500 htab->elf.dynobj = params->stub_bfd;
4501 htab->params = params;
4503 return create_linkage_sections (htab->elf.dynobj, info);
4506 /* Build a name for an entry in the stub hash table. */
4509 ppc_stub_name (const asection *input_section,
4510 const asection *sym_sec,
4511 const struct ppc_link_hash_entry *h,
4512 const Elf_Internal_Rela *rel)
4517 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4518 offsets from a sym as a branch target? In fact, we could
4519 probably assume the addend is always zero. */
4520 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4524 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4525 stub_name = bfd_malloc (len);
4526 if (stub_name == NULL)
4529 len = sprintf (stub_name, "%08x.%s+%x",
4530 input_section->id & 0xffffffff,
4531 h->elf.root.root.string,
4532 (int) rel->r_addend & 0xffffffff);
4536 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4537 stub_name = bfd_malloc (len);
4538 if (stub_name == NULL)
4541 len = sprintf (stub_name, "%08x.%x:%x+%x",
4542 input_section->id & 0xffffffff,
4543 sym_sec->id & 0xffffffff,
4544 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4545 (int) rel->r_addend & 0xffffffff);
4547 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4548 stub_name[len - 2] = 0;
4552 /* Look up an entry in the stub hash. Stub entries are cached because
4553 creating the stub name takes a bit of time. */
4555 static struct ppc_stub_hash_entry *
4556 ppc_get_stub_entry (const asection *input_section,
4557 const asection *sym_sec,
4558 struct ppc_link_hash_entry *h,
4559 const Elf_Internal_Rela *rel,
4560 struct ppc_link_hash_table *htab)
4562 struct ppc_stub_hash_entry *stub_entry;
4563 struct map_stub *group;
4565 /* If this input section is part of a group of sections sharing one
4566 stub section, then use the id of the first section in the group.
4567 Stub names need to include a section id, as there may well be
4568 more than one stub used to reach say, printf, and we need to
4569 distinguish between them. */
4570 group = htab->sec_info[input_section->id].u.group;
4574 if (h != NULL && h->u.stub_cache != NULL
4575 && h->u.stub_cache->h == h
4576 && h->u.stub_cache->group == group)
4578 stub_entry = h->u.stub_cache;
4584 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
4585 if (stub_name == NULL)
4588 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4589 stub_name, FALSE, FALSE);
4591 h->u.stub_cache = stub_entry;
4599 /* Add a new stub entry to the stub hash. Not all fields of the new
4600 stub entry are initialised. */
4602 static struct ppc_stub_hash_entry *
4603 ppc_add_stub (const char *stub_name,
4605 struct bfd_link_info *info)
4607 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4608 struct map_stub *group;
4611 struct ppc_stub_hash_entry *stub_entry;
4613 group = htab->sec_info[section->id].u.group;
4614 link_sec = group->link_sec;
4615 stub_sec = group->stub_sec;
4616 if (stub_sec == NULL)
4622 namelen = strlen (link_sec->name);
4623 len = namelen + sizeof (STUB_SUFFIX);
4624 s_name = bfd_alloc (htab->params->stub_bfd, len);
4628 memcpy (s_name, link_sec->name, namelen);
4629 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4630 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
4631 if (stub_sec == NULL)
4633 group->stub_sec = stub_sec;
4636 /* Enter this entry into the linker stub hash table. */
4637 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4639 if (stub_entry == NULL)
4641 /* xgettext:c-format */
4642 info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
4643 section->owner, stub_name);
4647 stub_entry->group = group;
4648 stub_entry->stub_offset = 0;
4652 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4653 not already done. */
4656 create_got_section (bfd *abfd, struct bfd_link_info *info)
4658 asection *got, *relgot;
4660 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4662 if (!is_ppc64_elf (abfd))
4668 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
4671 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4672 | SEC_LINKER_CREATED);
4674 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4676 || !bfd_set_section_alignment (abfd, got, 3))
4679 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4680 flags | SEC_READONLY);
4682 || ! bfd_set_section_alignment (abfd, relgot, 3))
4685 ppc64_elf_tdata (abfd)->got = got;
4686 ppc64_elf_tdata (abfd)->relgot = relgot;
4690 /* Follow indirect and warning symbol links. */
4692 static inline struct bfd_link_hash_entry *
4693 follow_link (struct bfd_link_hash_entry *h)
4695 while (h->type == bfd_link_hash_indirect
4696 || h->type == bfd_link_hash_warning)
4701 static inline struct elf_link_hash_entry *
4702 elf_follow_link (struct elf_link_hash_entry *h)
4704 return (struct elf_link_hash_entry *) follow_link (&h->root);
4707 static inline struct ppc_link_hash_entry *
4708 ppc_follow_link (struct ppc_link_hash_entry *h)
4710 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4713 /* Merge PLT info on FROM with that on TO. */
4716 move_plt_plist (struct ppc_link_hash_entry *from,
4717 struct ppc_link_hash_entry *to)
4719 if (from->elf.plt.plist != NULL)
4721 if (to->elf.plt.plist != NULL)
4723 struct plt_entry **entp;
4724 struct plt_entry *ent;
4726 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4728 struct plt_entry *dent;
4730 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4731 if (dent->addend == ent->addend)
4733 dent->plt.refcount += ent->plt.refcount;
4740 *entp = to->elf.plt.plist;
4743 to->elf.plt.plist = from->elf.plt.plist;
4744 from->elf.plt.plist = NULL;
4748 /* Copy the extra info we tack onto an elf_link_hash_entry. */
4751 ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4752 struct elf_link_hash_entry *dir,
4753 struct elf_link_hash_entry *ind)
4755 struct ppc_link_hash_entry *edir, *eind;
4757 edir = (struct ppc_link_hash_entry *) dir;
4758 eind = (struct ppc_link_hash_entry *) ind;
4760 edir->is_func |= eind->is_func;
4761 edir->is_func_descriptor |= eind->is_func_descriptor;
4762 edir->tls_mask |= eind->tls_mask;
4763 if (eind->oh != NULL)
4764 edir->oh = ppc_follow_link (eind->oh);
4766 /* If called to transfer flags for a weakdef during processing
4767 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4768 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
4769 if (!(ELIMINATE_COPY_RELOCS
4770 && eind->elf.root.type != bfd_link_hash_indirect
4771 && edir->elf.dynamic_adjusted))
4772 edir->elf.non_got_ref |= eind->elf.non_got_ref;
4774 if (edir->elf.versioned != versioned_hidden)
4775 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4776 edir->elf.ref_regular |= eind->elf.ref_regular;
4777 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4778 edir->elf.needs_plt |= eind->elf.needs_plt;
4779 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
4781 /* If we were called to copy over info for a weak sym, don't copy
4782 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
4783 in order to simplify readonly_dynrelocs and save a field in the
4784 symbol hash entry, but that means dyn_relocs can't be used in any
4785 tests about a specific symbol, or affect other symbol flags which
4787 Chain weakdefs so we can get from the weakdef back to an alias.
4788 The list is circular so that we don't need to use u.weakdef as
4789 well as this list to look at all aliases. */
4790 if (eind->elf.root.type != bfd_link_hash_indirect)
4792 struct ppc_link_hash_entry *cur, *add, *next;
4797 cur = edir->weakref;
4802 /* We can be called twice for the same symbols.
4803 Don't make multiple loops. */
4807 } while (cur != edir);
4809 next = add->weakref;
4812 add->weakref = edir->weakref != NULL ? edir->weakref : edir;
4813 edir->weakref = add;
4816 } while (add != NULL && add != eind);
4820 /* Copy over any dynamic relocs we may have on the indirect sym. */
4821 if (eind->dyn_relocs != NULL)
4823 if (edir->dyn_relocs != NULL)
4825 struct elf_dyn_relocs **pp;
4826 struct elf_dyn_relocs *p;
4828 /* Add reloc counts against the indirect sym to the direct sym
4829 list. Merge any entries against the same section. */
4830 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4832 struct elf_dyn_relocs *q;
4834 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4835 if (q->sec == p->sec)
4837 q->pc_count += p->pc_count;
4838 q->count += p->count;
4845 *pp = edir->dyn_relocs;
4848 edir->dyn_relocs = eind->dyn_relocs;
4849 eind->dyn_relocs = NULL;
4852 /* Copy over got entries that we may have already seen to the
4853 symbol which just became indirect. */
4854 if (eind->elf.got.glist != NULL)
4856 if (edir->elf.got.glist != NULL)
4858 struct got_entry **entp;
4859 struct got_entry *ent;
4861 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4863 struct got_entry *dent;
4865 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4866 if (dent->addend == ent->addend
4867 && dent->owner == ent->owner
4868 && dent->tls_type == ent->tls_type)
4870 dent->got.refcount += ent->got.refcount;
4877 *entp = edir->elf.got.glist;
4880 edir->elf.got.glist = eind->elf.got.glist;
4881 eind->elf.got.glist = NULL;
4884 /* And plt entries. */
4885 move_plt_plist (eind, edir);
4887 if (eind->elf.dynindx != -1)
4889 if (edir->elf.dynindx != -1)
4890 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4891 edir->elf.dynstr_index);
4892 edir->elf.dynindx = eind->elf.dynindx;
4893 edir->elf.dynstr_index = eind->elf.dynstr_index;
4894 eind->elf.dynindx = -1;
4895 eind->elf.dynstr_index = 0;
4899 /* Find the function descriptor hash entry from the given function code
4900 hash entry FH. Link the entries via their OH fields. */
4902 static struct ppc_link_hash_entry *
4903 lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4905 struct ppc_link_hash_entry *fdh = fh->oh;
4909 const char *fd_name = fh->elf.root.root.string + 1;
4911 fdh = (struct ppc_link_hash_entry *)
4912 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4916 fdh->is_func_descriptor = 1;
4922 fdh = ppc_follow_link (fdh);
4923 fdh->is_func_descriptor = 1;
4928 /* Make a fake function descriptor sym for the undefined code sym FH. */
4930 static struct ppc_link_hash_entry *
4931 make_fdh (struct bfd_link_info *info,
4932 struct ppc_link_hash_entry *fh)
4934 bfd *abfd = fh->elf.root.u.undef.abfd;
4935 struct bfd_link_hash_entry *bh = NULL;
4936 struct ppc_link_hash_entry *fdh;
4937 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4941 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4942 fh->elf.root.root.string + 1,
4943 flags, bfd_und_section_ptr, 0,
4944 NULL, FALSE, FALSE, &bh))
4947 fdh = (struct ppc_link_hash_entry *) bh;
4948 fdh->elf.non_elf = 0;
4950 fdh->is_func_descriptor = 1;
4957 /* Fix function descriptor symbols defined in .opd sections to be
4961 ppc64_elf_add_symbol_hook (bfd *ibfd,
4962 struct bfd_link_info *info,
4963 Elf_Internal_Sym *isym,
4965 flagword *flags ATTRIBUTE_UNUSED,
4969 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4970 && (ibfd->flags & DYNAMIC) == 0
4971 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
4972 elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
4975 && strcmp ((*sec)->name, ".opd") == 0)
4979 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4980 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4981 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4983 /* If the symbol is a function defined in .opd, and the function
4984 code is in a discarded group, let it appear to be undefined. */
4985 if (!bfd_link_relocatable (info)
4986 && (*sec)->reloc_count != 0
4987 && opd_entry_value (*sec, *value, &code_sec, NULL,
4988 FALSE) != (bfd_vma) -1
4989 && discarded_section (code_sec))
4991 *sec = bfd_und_section_ptr;
4992 isym->st_shndx = SHN_UNDEF;
4995 else if (*sec != NULL
4996 && strcmp ((*sec)->name, ".toc") == 0
4997 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4999 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5001 htab->params->object_in_toc = 1;
5004 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
5006 if (abiversion (ibfd) == 0)
5007 set_abiversion (ibfd, 2);
5008 else if (abiversion (ibfd) == 1)
5010 info->callbacks->einfo (_("%P: symbol '%s' has invalid st_other"
5011 " for ABI version 1\n"), name);
5012 bfd_set_error (bfd_error_bad_value);
5020 /* Merge non-visibility st_other attributes: local entry point. */
5023 ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
5024 const Elf_Internal_Sym *isym,
5025 bfd_boolean definition,
5026 bfd_boolean dynamic)
5028 if (definition && (!dynamic || !h->def_regular))
5029 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
5030 | ELF_ST_VISIBILITY (h->other));
5033 /* Hook called on merging a symbol. We use this to clear "fake" since
5034 we now have a real symbol. */
5037 ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
5038 const Elf_Internal_Sym *isym,
5039 asection **psec ATTRIBUTE_UNUSED,
5040 bfd_boolean newdef ATTRIBUTE_UNUSED,
5041 bfd_boolean olddef ATTRIBUTE_UNUSED,
5042 bfd *oldbfd ATTRIBUTE_UNUSED,
5043 const asection *oldsec ATTRIBUTE_UNUSED)
5045 ((struct ppc_link_hash_entry *) h)->fake = 0;
5046 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
5047 ((struct ppc_link_hash_entry *) h)->non_zero_localentry = 1;
5051 /* This function makes an old ABI object reference to ".bar" cause the
5052 inclusion of a new ABI object archive that defines "bar".
5053 NAME is a symbol defined in an archive. Return a symbol in the hash
5054 table that might be satisfied by the archive symbols. */
5056 static struct elf_link_hash_entry *
5057 ppc64_elf_archive_symbol_lookup (bfd *abfd,
5058 struct bfd_link_info *info,
5061 struct elf_link_hash_entry *h;
5065 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
5067 /* Don't return this sym if it is a fake function descriptor
5068 created by add_symbol_adjust. */
5069 && !((struct ppc_link_hash_entry *) h)->fake)
5075 len = strlen (name);
5076 dot_name = bfd_alloc (abfd, len + 2);
5077 if (dot_name == NULL)
5078 return (struct elf_link_hash_entry *) 0 - 1;
5080 memcpy (dot_name + 1, name, len + 1);
5081 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
5082 bfd_release (abfd, dot_name);
5086 /* This function satisfies all old ABI object references to ".bar" if a
5087 new ABI object defines "bar". Well, at least, undefined dot symbols
5088 are made weak. This stops later archive searches from including an
5089 object if we already have a function descriptor definition. It also
5090 prevents the linker complaining about undefined symbols.
5091 We also check and correct mismatched symbol visibility here. The
5092 most restrictive visibility of the function descriptor and the
5093 function entry symbol is used. */
5096 add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
5098 struct ppc_link_hash_table *htab;
5099 struct ppc_link_hash_entry *fdh;
5101 if (eh->elf.root.type == bfd_link_hash_warning)
5102 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
5104 if (eh->elf.root.type == bfd_link_hash_indirect)
5107 if (eh->elf.root.root.string[0] != '.')
5110 htab = ppc_hash_table (info);
5114 fdh = lookup_fdh (eh, htab);
5116 && !bfd_link_relocatable (info)
5117 && (eh->elf.root.type == bfd_link_hash_undefined
5118 || eh->elf.root.type == bfd_link_hash_undefweak)
5119 && eh->elf.ref_regular)
5121 /* Make an undefined function descriptor sym, in order to
5122 pull in an --as-needed shared lib. Archives are handled
5124 fdh = make_fdh (info, eh);
5131 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
5132 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
5134 /* Make both descriptor and entry symbol have the most
5135 constraining visibility of either symbol. */
5136 if (entry_vis < descr_vis)
5137 fdh->elf.other += entry_vis - descr_vis;
5138 else if (entry_vis > descr_vis)
5139 eh->elf.other += descr_vis - entry_vis;
5141 /* Propagate reference flags from entry symbol to function
5142 descriptor symbol. */
5143 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
5144 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
5145 fdh->elf.ref_regular |= eh->elf.ref_regular;
5146 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
5148 if (!fdh->elf.forced_local
5149 && fdh->elf.dynindx == -1
5150 && fdh->elf.versioned != versioned_hidden
5151 && (bfd_link_dll (info)
5152 || fdh->elf.def_dynamic
5153 || fdh->elf.ref_dynamic)
5154 && (eh->elf.ref_regular
5155 || eh->elf.def_regular))
5157 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
5165 /* Set up opd section info and abiversion for IBFD, and process list
5166 of dot-symbols we made in link_hash_newfunc. */
5169 ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
5171 struct ppc_link_hash_table *htab;
5172 struct ppc_link_hash_entry **p, *eh;
5173 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
5175 if (opd != NULL && opd->size != 0)
5177 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
5178 ppc64_elf_section_data (opd)->sec_type = sec_opd;
5180 if (abiversion (ibfd) == 0)
5181 set_abiversion (ibfd, 1);
5182 else if (abiversion (ibfd) >= 2)
5184 /* xgettext:c-format */
5185 info->callbacks->einfo (_("%P: %B .opd not allowed in ABI"
5187 ibfd, abiversion (ibfd));
5188 bfd_set_error (bfd_error_bad_value);
5193 if (is_ppc64_elf (info->output_bfd))
5195 /* For input files without an explicit abiversion in e_flags
5196 we should have flagged any with symbol st_other bits set
5197 as ELFv1 and above flagged those with .opd as ELFv2.
5198 Set the output abiversion if not yet set, and for any input
5199 still ambiguous, take its abiversion from the output.
5200 Differences in ABI are reported later. */
5201 if (abiversion (info->output_bfd) == 0)
5202 set_abiversion (info->output_bfd, abiversion (ibfd));
5203 else if (abiversion (ibfd) == 0)
5204 set_abiversion (ibfd, abiversion (info->output_bfd));
5207 htab = ppc_hash_table (info);
5211 if (opd != NULL && opd->size != 0
5212 && (ibfd->flags & DYNAMIC) == 0
5213 && (opd->flags & SEC_RELOC) != 0
5214 && opd->reloc_count != 0
5215 && !bfd_is_abs_section (opd->output_section)
5216 && info->gc_sections)
5218 /* Garbage collection needs some extra help with .opd sections.
5219 We don't want to necessarily keep everything referenced by
5220 relocs in .opd, as that would keep all functions. Instead,
5221 if we reference an .opd symbol (a function descriptor), we
5222 want to keep the function code symbol's section. This is
5223 easy for global symbols, but for local syms we need to keep
5224 information about the associated function section. */
5226 asection **opd_sym_map;
5227 Elf_Internal_Shdr *symtab_hdr;
5228 Elf_Internal_Rela *relocs, *rel_end, *rel;
5230 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
5231 opd_sym_map = bfd_zalloc (ibfd, amt);
5232 if (opd_sym_map == NULL)
5234 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
5235 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
5239 symtab_hdr = &elf_symtab_hdr (ibfd);
5240 rel_end = relocs + opd->reloc_count - 1;
5241 for (rel = relocs; rel < rel_end; rel++)
5243 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
5244 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
5246 if (r_type == R_PPC64_ADDR64
5247 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
5248 && r_symndx < symtab_hdr->sh_info)
5250 Elf_Internal_Sym *isym;
5253 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
5256 if (elf_section_data (opd)->relocs != relocs)
5261 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
5262 if (s != NULL && s != opd)
5263 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
5266 if (elf_section_data (opd)->relocs != relocs)
5270 p = &htab->dot_syms;
5271 while ((eh = *p) != NULL)
5274 if (&eh->elf == htab->elf.hgot)
5276 else if (htab->elf.hgot == NULL
5277 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
5278 htab->elf.hgot = &eh->elf;
5279 else if (abiversion (ibfd) <= 1)
5281 htab->need_func_desc_adj = 1;
5282 if (!add_symbol_adjust (eh, info))
5285 p = &eh->u.next_dot_sym;
5290 /* Undo hash table changes when an --as-needed input file is determined
5291 not to be needed. */
5294 ppc64_elf_notice_as_needed (bfd *ibfd,
5295 struct bfd_link_info *info,
5296 enum notice_asneeded_action act)
5298 if (act == notice_not_needed)
5300 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5305 htab->dot_syms = NULL;
5307 return _bfd_elf_notice_as_needed (ibfd, info, act);
5310 /* If --just-symbols against a final linked binary, then assume we need
5311 toc adjusting stubs when calling functions defined there. */
5314 ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
5316 if ((sec->flags & SEC_CODE) != 0
5317 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
5318 && is_ppc64_elf (sec->owner))
5320 if (abiversion (sec->owner) >= 2
5321 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
5322 sec->has_toc_reloc = 1;
5324 _bfd_elf_link_just_syms (sec, info);
5327 static struct plt_entry **
5328 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
5329 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
5331 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
5332 struct plt_entry **local_plt;
5333 unsigned char *local_got_tls_masks;
5335 if (local_got_ents == NULL)
5337 bfd_size_type size = symtab_hdr->sh_info;
5339 size *= (sizeof (*local_got_ents)
5340 + sizeof (*local_plt)
5341 + sizeof (*local_got_tls_masks));
5342 local_got_ents = bfd_zalloc (abfd, size);
5343 if (local_got_ents == NULL)
5345 elf_local_got_ents (abfd) = local_got_ents;
5348 if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
5350 struct got_entry *ent;
5352 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
5353 if (ent->addend == r_addend
5354 && ent->owner == abfd
5355 && ent->tls_type == tls_type)
5359 bfd_size_type amt = sizeof (*ent);
5360 ent = bfd_alloc (abfd, amt);
5363 ent->next = local_got_ents[r_symndx];
5364 ent->addend = r_addend;
5366 ent->tls_type = tls_type;
5367 ent->is_indirect = FALSE;
5368 ent->got.refcount = 0;
5369 local_got_ents[r_symndx] = ent;
5371 ent->got.refcount += 1;
5374 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
5375 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
5376 local_got_tls_masks[r_symndx] |= tls_type;
5378 return local_plt + r_symndx;
5382 update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
5384 struct plt_entry *ent;
5386 for (ent = *plist; ent != NULL; ent = ent->next)
5387 if (ent->addend == addend)
5391 bfd_size_type amt = sizeof (*ent);
5392 ent = bfd_alloc (abfd, amt);
5396 ent->addend = addend;
5397 ent->plt.refcount = 0;
5400 ent->plt.refcount += 1;
5405 is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5407 return (r_type == R_PPC64_REL24
5408 || r_type == R_PPC64_REL14
5409 || r_type == R_PPC64_REL14_BRTAKEN
5410 || r_type == R_PPC64_REL14_BRNTAKEN
5411 || r_type == R_PPC64_ADDR24
5412 || r_type == R_PPC64_ADDR14
5413 || r_type == R_PPC64_ADDR14_BRTAKEN
5414 || r_type == R_PPC64_ADDR14_BRNTAKEN);
5417 /* Look through the relocs for a section during the first phase, and
5418 calculate needed space in the global offset table, procedure
5419 linkage table, and dynamic reloc sections. */
5422 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5423 asection *sec, const Elf_Internal_Rela *relocs)
5425 struct ppc_link_hash_table *htab;
5426 Elf_Internal_Shdr *symtab_hdr;
5427 struct elf_link_hash_entry **sym_hashes;
5428 const Elf_Internal_Rela *rel;
5429 const Elf_Internal_Rela *rel_end;
5431 struct elf_link_hash_entry *tga, *dottga;
5434 if (bfd_link_relocatable (info))
5437 /* Don't do anything special with non-loaded, non-alloced sections.
5438 In particular, any relocs in such sections should not affect GOT
5439 and PLT reference counting (ie. we don't allow them to create GOT
5440 or PLT entries), there's no possibility or desire to optimize TLS
5441 relocs, and there's not much point in propagating relocs to shared
5442 libs that the dynamic linker won't relocate. */
5443 if ((sec->flags & SEC_ALLOC) == 0)
5446 BFD_ASSERT (is_ppc64_elf (abfd));
5448 htab = ppc_hash_table (info);
5452 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5453 FALSE, FALSE, TRUE);
5454 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5455 FALSE, FALSE, TRUE);
5456 symtab_hdr = &elf_symtab_hdr (abfd);
5457 sym_hashes = elf_sym_hashes (abfd);
5459 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5460 rel_end = relocs + sec->reloc_count;
5461 for (rel = relocs; rel < rel_end; rel++)
5463 unsigned long r_symndx;
5464 struct elf_link_hash_entry *h;
5465 enum elf_ppc64_reloc_type r_type;
5467 struct _ppc64_elf_section_data *ppc64_sec;
5468 struct plt_entry **ifunc, **plt_list;
5470 r_symndx = ELF64_R_SYM (rel->r_info);
5471 if (r_symndx < symtab_hdr->sh_info)
5475 struct ppc_link_hash_entry *eh;
5477 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5478 h = elf_follow_link (h);
5479 eh = (struct ppc_link_hash_entry *) h;
5481 /* PR15323, ref flags aren't set for references in the same
5483 h->root.non_ir_ref_regular = 1;
5484 if (eh->is_func && eh->oh != NULL)
5485 eh->oh->elf.root.non_ir_ref_regular = 1;
5487 if (h == htab->elf.hgot)
5488 sec->has_toc_reloc = 1;
5495 if (h->type == STT_GNU_IFUNC)
5498 ifunc = &h->plt.plist;
5503 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5508 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5510 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5511 rel->r_addend, PLT_IFUNC);
5517 r_type = ELF64_R_TYPE (rel->r_info);
5522 /* These special tls relocs tie a call to __tls_get_addr with
5523 its parameter symbol. */
5526 case R_PPC64_GOT_TLSLD16:
5527 case R_PPC64_GOT_TLSLD16_LO:
5528 case R_PPC64_GOT_TLSLD16_HI:
5529 case R_PPC64_GOT_TLSLD16_HA:
5530 tls_type = TLS_TLS | TLS_LD;
5533 case R_PPC64_GOT_TLSGD16:
5534 case R_PPC64_GOT_TLSGD16_LO:
5535 case R_PPC64_GOT_TLSGD16_HI:
5536 case R_PPC64_GOT_TLSGD16_HA:
5537 tls_type = TLS_TLS | TLS_GD;
5540 case R_PPC64_GOT_TPREL16_DS:
5541 case R_PPC64_GOT_TPREL16_LO_DS:
5542 case R_PPC64_GOT_TPREL16_HI:
5543 case R_PPC64_GOT_TPREL16_HA:
5544 if (bfd_link_dll (info))
5545 info->flags |= DF_STATIC_TLS;
5546 tls_type = TLS_TLS | TLS_TPREL;
5549 case R_PPC64_GOT_DTPREL16_DS:
5550 case R_PPC64_GOT_DTPREL16_LO_DS:
5551 case R_PPC64_GOT_DTPREL16_HI:
5552 case R_PPC64_GOT_DTPREL16_HA:
5553 tls_type = TLS_TLS | TLS_DTPREL;
5555 sec->has_tls_reloc = 1;
5559 case R_PPC64_GOT16_DS:
5560 case R_PPC64_GOT16_HA:
5561 case R_PPC64_GOT16_HI:
5562 case R_PPC64_GOT16_LO:
5563 case R_PPC64_GOT16_LO_DS:
5564 /* This symbol requires a global offset table entry. */
5565 sec->has_toc_reloc = 1;
5566 if (r_type == R_PPC64_GOT_TLSLD16
5567 || r_type == R_PPC64_GOT_TLSGD16
5568 || r_type == R_PPC64_GOT_TPREL16_DS
5569 || r_type == R_PPC64_GOT_DTPREL16_DS
5570 || r_type == R_PPC64_GOT16
5571 || r_type == R_PPC64_GOT16_DS)
5573 htab->do_multi_toc = 1;
5574 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5577 if (ppc64_elf_tdata (abfd)->got == NULL
5578 && !create_got_section (abfd, info))
5583 struct ppc_link_hash_entry *eh;
5584 struct got_entry *ent;
5586 eh = (struct ppc_link_hash_entry *) h;
5587 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5588 if (ent->addend == rel->r_addend
5589 && ent->owner == abfd
5590 && ent->tls_type == tls_type)
5594 bfd_size_type amt = sizeof (*ent);
5595 ent = bfd_alloc (abfd, amt);
5598 ent->next = eh->elf.got.glist;
5599 ent->addend = rel->r_addend;
5601 ent->tls_type = tls_type;
5602 ent->is_indirect = FALSE;
5603 ent->got.refcount = 0;
5604 eh->elf.got.glist = ent;
5606 ent->got.refcount += 1;
5607 eh->tls_mask |= tls_type;
5610 /* This is a global offset table entry for a local symbol. */
5611 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5612 rel->r_addend, tls_type))
5615 /* We may also need a plt entry if the symbol turns out to be
5617 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
5619 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5624 case R_PPC64_PLT16_HA:
5625 case R_PPC64_PLT16_HI:
5626 case R_PPC64_PLT16_LO:
5629 /* This symbol requires a procedure linkage table entry. */
5634 if (h->root.root.string[0] == '.'
5635 && h->root.root.string[1] != '\0')
5636 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5637 plt_list = &h->plt.plist;
5639 if (plt_list == NULL)
5641 /* It does not make sense to have a procedure linkage
5642 table entry for a non-ifunc local symbol. */
5643 info->callbacks->einfo
5644 /* xgettext:c-format */
5645 (_("%H: %s reloc against local symbol\n"),
5646 abfd, sec, rel->r_offset,
5647 ppc64_elf_howto_table[r_type]->name);
5648 bfd_set_error (bfd_error_bad_value);
5651 if (!update_plt_info (abfd, plt_list, rel->r_addend))
5655 /* The following relocations don't need to propagate the
5656 relocation if linking a shared object since they are
5657 section relative. */
5658 case R_PPC64_SECTOFF:
5659 case R_PPC64_SECTOFF_LO:
5660 case R_PPC64_SECTOFF_HI:
5661 case R_PPC64_SECTOFF_HA:
5662 case R_PPC64_SECTOFF_DS:
5663 case R_PPC64_SECTOFF_LO_DS:
5664 case R_PPC64_DTPREL16:
5665 case R_PPC64_DTPREL16_LO:
5666 case R_PPC64_DTPREL16_HI:
5667 case R_PPC64_DTPREL16_HA:
5668 case R_PPC64_DTPREL16_DS:
5669 case R_PPC64_DTPREL16_LO_DS:
5670 case R_PPC64_DTPREL16_HIGH:
5671 case R_PPC64_DTPREL16_HIGHA:
5672 case R_PPC64_DTPREL16_HIGHER:
5673 case R_PPC64_DTPREL16_HIGHERA:
5674 case R_PPC64_DTPREL16_HIGHEST:
5675 case R_PPC64_DTPREL16_HIGHESTA:
5680 case R_PPC64_REL16_LO:
5681 case R_PPC64_REL16_HI:
5682 case R_PPC64_REL16_HA:
5683 case R_PPC64_REL16DX_HA:
5686 /* Not supported as a dynamic relocation. */
5687 case R_PPC64_ADDR64_LOCAL:
5688 if (bfd_link_pic (info))
5690 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5692 /* xgettext:c-format */
5693 info->callbacks->einfo (_("%H: %s reloc unsupported "
5694 "in shared libraries and PIEs.\n"),
5695 abfd, sec, rel->r_offset,
5696 ppc64_elf_howto_table[r_type]->name);
5697 bfd_set_error (bfd_error_bad_value);
5703 case R_PPC64_TOC16_DS:
5704 htab->do_multi_toc = 1;
5705 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5707 case R_PPC64_TOC16_LO:
5708 case R_PPC64_TOC16_HI:
5709 case R_PPC64_TOC16_HA:
5710 case R_PPC64_TOC16_LO_DS:
5711 sec->has_toc_reloc = 1;
5718 /* This relocation describes the C++ object vtable hierarchy.
5719 Reconstruct it for later use during GC. */
5720 case R_PPC64_GNU_VTINHERIT:
5721 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5725 /* This relocation describes which C++ vtable entries are actually
5726 used. Record for later use during GC. */
5727 case R_PPC64_GNU_VTENTRY:
5728 BFD_ASSERT (h != NULL);
5730 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5735 case R_PPC64_REL14_BRTAKEN:
5736 case R_PPC64_REL14_BRNTAKEN:
5738 asection *dest = NULL;
5740 /* Heuristic: If jumping outside our section, chances are
5741 we are going to need a stub. */
5744 /* If the sym is weak it may be overridden later, so
5745 don't assume we know where a weak sym lives. */
5746 if (h->root.type == bfd_link_hash_defined)
5747 dest = h->root.u.def.section;
5751 Elf_Internal_Sym *isym;
5753 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5758 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5762 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5771 if (h->root.root.string[0] == '.'
5772 && h->root.root.string[1] != '\0')
5773 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5775 if (h == tga || h == dottga)
5777 sec->has_tls_reloc = 1;
5779 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5780 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5781 /* We have a new-style __tls_get_addr call with
5785 /* Mark this section as having an old-style call. */
5786 sec->has_tls_get_addr_call = 1;
5788 plt_list = &h->plt.plist;
5791 /* We may need a .plt entry if the function this reloc
5792 refers to is in a shared lib. */
5794 && !update_plt_info (abfd, plt_list, rel->r_addend))
5798 case R_PPC64_ADDR14:
5799 case R_PPC64_ADDR14_BRNTAKEN:
5800 case R_PPC64_ADDR14_BRTAKEN:
5801 case R_PPC64_ADDR24:
5804 case R_PPC64_TPREL64:
5805 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5806 if (bfd_link_dll (info))
5807 info->flags |= DF_STATIC_TLS;
5810 case R_PPC64_DTPMOD64:
5811 if (rel + 1 < rel_end
5812 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5813 && rel[1].r_offset == rel->r_offset + 8)
5814 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5816 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5819 case R_PPC64_DTPREL64:
5820 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5822 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5823 && rel[-1].r_offset == rel->r_offset - 8)
5824 /* This is the second reloc of a dtpmod, dtprel pair.
5825 Don't mark with TLS_DTPREL. */
5829 sec->has_tls_reloc = 1;
5832 struct ppc_link_hash_entry *eh;
5833 eh = (struct ppc_link_hash_entry *) h;
5834 eh->tls_mask |= tls_type;
5837 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5838 rel->r_addend, tls_type))
5841 ppc64_sec = ppc64_elf_section_data (sec);
5842 if (ppc64_sec->sec_type != sec_toc)
5846 /* One extra to simplify get_tls_mask. */
5847 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5848 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5849 if (ppc64_sec->u.toc.symndx == NULL)
5851 amt = sec->size * sizeof (bfd_vma) / 8;
5852 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5853 if (ppc64_sec->u.toc.add == NULL)
5855 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5856 ppc64_sec->sec_type = sec_toc;
5858 BFD_ASSERT (rel->r_offset % 8 == 0);
5859 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5860 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5862 /* Mark the second slot of a GD or LD entry.
5863 -1 to indicate GD and -2 to indicate LD. */
5864 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5865 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5866 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5867 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5870 case R_PPC64_TPREL16:
5871 case R_PPC64_TPREL16_LO:
5872 case R_PPC64_TPREL16_HI:
5873 case R_PPC64_TPREL16_HA:
5874 case R_PPC64_TPREL16_DS:
5875 case R_PPC64_TPREL16_LO_DS:
5876 case R_PPC64_TPREL16_HIGH:
5877 case R_PPC64_TPREL16_HIGHA:
5878 case R_PPC64_TPREL16_HIGHER:
5879 case R_PPC64_TPREL16_HIGHERA:
5880 case R_PPC64_TPREL16_HIGHEST:
5881 case R_PPC64_TPREL16_HIGHESTA:
5882 if (bfd_link_dll (info))
5883 info->flags |= DF_STATIC_TLS;
5886 case R_PPC64_ADDR64:
5888 && rel + 1 < rel_end
5889 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5892 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5896 case R_PPC64_ADDR16:
5897 case R_PPC64_ADDR16_DS:
5898 case R_PPC64_ADDR16_HA:
5899 case R_PPC64_ADDR16_HI:
5900 case R_PPC64_ADDR16_HIGH:
5901 case R_PPC64_ADDR16_HIGHA:
5902 case R_PPC64_ADDR16_HIGHER:
5903 case R_PPC64_ADDR16_HIGHERA:
5904 case R_PPC64_ADDR16_HIGHEST:
5905 case R_PPC64_ADDR16_HIGHESTA:
5906 case R_PPC64_ADDR16_LO:
5907 case R_PPC64_ADDR16_LO_DS:
5908 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
5909 && rel->r_addend == 0)
5911 /* We may need a .plt entry if this reloc refers to a
5912 function in a shared lib. */
5913 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5915 h->pointer_equality_needed = 1;
5922 case R_PPC64_ADDR32:
5923 case R_PPC64_UADDR16:
5924 case R_PPC64_UADDR32:
5925 case R_PPC64_UADDR64:
5927 if (h != NULL && !bfd_link_pic (info))
5928 /* We may need a copy reloc. */
5931 /* Don't propagate .opd relocs. */
5932 if (NO_OPD_RELOCS && is_opd)
5935 /* If we are creating a shared library, and this is a reloc
5936 against a global symbol, or a non PC relative reloc
5937 against a local symbol, then we need to copy the reloc
5938 into the shared library. However, if we are linking with
5939 -Bsymbolic, we do not need to copy a reloc against a
5940 global symbol which is defined in an object we are
5941 including in the link (i.e., DEF_REGULAR is set). At
5942 this point we have not seen all the input files, so it is
5943 possible that DEF_REGULAR is not set now but will be set
5944 later (it is never cleared). In case of a weak definition,
5945 DEF_REGULAR may be cleared later by a strong definition in
5946 a shared library. We account for that possibility below by
5947 storing information in the dyn_relocs field of the hash
5948 table entry. A similar situation occurs when creating
5949 shared libraries and symbol visibility changes render the
5952 If on the other hand, we are creating an executable, we
5953 may need to keep relocations for symbols satisfied by a
5954 dynamic library if we manage to avoid copy relocs for the
5957 if ((bfd_link_pic (info)
5958 && (must_be_dyn_reloc (info, r_type)
5960 && (!SYMBOLIC_BIND (info, h)
5961 || h->root.type == bfd_link_hash_defweak
5962 || !h->def_regular))))
5963 || (ELIMINATE_COPY_RELOCS
5964 && !bfd_link_pic (info)
5966 && (h->root.type == bfd_link_hash_defweak
5967 || !h->def_regular))
5968 || (!bfd_link_pic (info)
5971 /* We must copy these reloc types into the output file.
5972 Create a reloc section in dynobj and make room for
5976 sreloc = _bfd_elf_make_dynamic_reloc_section
5977 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
5983 /* If this is a global symbol, we count the number of
5984 relocations we need for this symbol. */
5987 struct elf_dyn_relocs *p;
5988 struct elf_dyn_relocs **head;
5990 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
5992 if (p == NULL || p->sec != sec)
5994 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
6004 if (!must_be_dyn_reloc (info, r_type))
6009 /* Track dynamic relocs needed for local syms too.
6010 We really need local syms available to do this
6012 struct ppc_dyn_relocs *p;
6013 struct ppc_dyn_relocs **head;
6014 bfd_boolean is_ifunc;
6017 Elf_Internal_Sym *isym;
6019 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
6024 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
6028 vpp = &elf_section_data (s)->local_dynrel;
6029 head = (struct ppc_dyn_relocs **) vpp;
6030 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
6032 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
6034 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
6036 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
6042 p->ifunc = is_ifunc;
6058 /* Merge backend specific data from an object file to the output
6059 object file when linking. */
6062 ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
6064 bfd *obfd = info->output_bfd;
6065 unsigned long iflags, oflags;
6067 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
6070 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
6073 if (!_bfd_generic_verify_endian_match (ibfd, info))
6076 iflags = elf_elfheader (ibfd)->e_flags;
6077 oflags = elf_elfheader (obfd)->e_flags;
6079 if (iflags & ~EF_PPC64_ABI)
6082 /* xgettext:c-format */
6083 (_("%B uses unknown e_flags 0x%lx"), ibfd, iflags);
6084 bfd_set_error (bfd_error_bad_value);
6087 else if (iflags != oflags && iflags != 0)
6090 /* xgettext:c-format */
6091 (_("%B: ABI version %ld is not compatible with ABI version %ld output"),
6092 ibfd, iflags, oflags);
6093 bfd_set_error (bfd_error_bad_value);
6097 _bfd_elf_ppc_merge_fp_attributes (ibfd, info);
6099 /* Merge Tag_compatibility attributes and any common GNU ones. */
6100 _bfd_elf_merge_object_attributes (ibfd, info);
6106 ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6108 /* Print normal ELF private data. */
6109 _bfd_elf_print_private_bfd_data (abfd, ptr);
6111 if (elf_elfheader (abfd)->e_flags != 0)
6115 fprintf (file, _("private flags = 0x%lx:"),
6116 elf_elfheader (abfd)->e_flags);
6118 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
6119 fprintf (file, _(" [abiv%ld]"),
6120 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
6127 /* OFFSET in OPD_SEC specifies a function descriptor. Return the address
6128 of the code entry point, and its section, which must be in the same
6129 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
6132 opd_entry_value (asection *opd_sec,
6134 asection **code_sec,
6136 bfd_boolean in_code_sec)
6138 bfd *opd_bfd = opd_sec->owner;
6139 Elf_Internal_Rela *relocs;
6140 Elf_Internal_Rela *lo, *hi, *look;
6143 /* No relocs implies we are linking a --just-symbols object, or looking
6144 at a final linked executable with addr2line or somesuch. */
6145 if (opd_sec->reloc_count == 0)
6147 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
6149 if (contents == NULL)
6151 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
6152 return (bfd_vma) -1;
6153 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
6156 /* PR 17512: file: 64b9dfbb. */
6157 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
6158 return (bfd_vma) -1;
6160 val = bfd_get_64 (opd_bfd, contents + offset);
6161 if (code_sec != NULL)
6163 asection *sec, *likely = NULL;
6169 && val < sec->vma + sec->size)
6175 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
6177 && (sec->flags & SEC_LOAD) != 0
6178 && (sec->flags & SEC_ALLOC) != 0)
6183 if (code_off != NULL)
6184 *code_off = val - likely->vma;
6190 BFD_ASSERT (is_ppc64_elf (opd_bfd));
6192 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
6194 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
6195 /* PR 17512: file: df8e1fd6. */
6197 return (bfd_vma) -1;
6199 /* Go find the opd reloc at the sym address. */
6201 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
6205 look = lo + (hi - lo) / 2;
6206 if (look->r_offset < offset)
6208 else if (look->r_offset > offset)
6212 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
6214 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
6215 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
6217 unsigned long symndx = ELF64_R_SYM (look->r_info);
6218 asection *sec = NULL;
6220 if (symndx >= symtab_hdr->sh_info
6221 && elf_sym_hashes (opd_bfd) != NULL)
6223 struct elf_link_hash_entry **sym_hashes;
6224 struct elf_link_hash_entry *rh;
6226 sym_hashes = elf_sym_hashes (opd_bfd);
6227 rh = sym_hashes[symndx - symtab_hdr->sh_info];
6230 rh = elf_follow_link (rh);
6231 if (rh->root.type != bfd_link_hash_defined
6232 && rh->root.type != bfd_link_hash_defweak)
6234 if (rh->root.u.def.section->owner == opd_bfd)
6236 val = rh->root.u.def.value;
6237 sec = rh->root.u.def.section;
6244 Elf_Internal_Sym *sym;
6246 if (symndx < symtab_hdr->sh_info)
6248 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
6251 size_t symcnt = symtab_hdr->sh_info;
6252 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6257 symtab_hdr->contents = (bfd_byte *) sym;
6263 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6269 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
6272 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
6273 val = sym->st_value;
6276 val += look->r_addend;
6277 if (code_off != NULL)
6279 if (code_sec != NULL)
6281 if (in_code_sec && *code_sec != sec)
6286 if (sec->output_section != NULL)
6287 val += sec->output_section->vma + sec->output_offset;
6296 /* If the ELF symbol SYM might be a function in SEC, return the
6297 function size and set *CODE_OFF to the function's entry point,
6298 otherwise return zero. */
6300 static bfd_size_type
6301 ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
6306 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
6307 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
6311 if (!(sym->flags & BSF_SYNTHETIC))
6312 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
6314 if (strcmp (sym->section->name, ".opd") == 0)
6316 struct _opd_sec_data *opd = get_opd_info (sym->section);
6317 bfd_vma symval = sym->value;
6320 && opd->adjust != NULL
6321 && elf_section_data (sym->section)->relocs != NULL)
6323 /* opd_entry_value will use cached relocs that have been
6324 adjusted, but with raw symbols. That means both local
6325 and global symbols need adjusting. */
6326 long adjust = opd->adjust[OPD_NDX (symval)];
6332 if (opd_entry_value (sym->section, symval,
6333 &sec, code_off, TRUE) == (bfd_vma) -1)
6335 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6336 symbol. This size has nothing to do with the code size of the
6337 function, which is what we're supposed to return, but the
6338 code size isn't available without looking up the dot-sym.
6339 However, doing that would be a waste of time particularly
6340 since elf_find_function will look at the dot-sym anyway.
6341 Now, elf_find_function will keep the largest size of any
6342 function sym found at the code address of interest, so return
6343 1 here to avoid it incorrectly caching a larger function size
6344 for a small function. This does mean we return the wrong
6345 size for a new-ABI function of size 24, but all that does is
6346 disable caching for such functions. */
6352 if (sym->section != sec)
6354 *code_off = sym->value;
6361 /* Return true if symbol is a strong function defined in an ELFv2
6362 object with st_other localentry bits of zero, ie. its local entry
6363 point coincides with its global entry point. */
6366 is_elfv2_localentry0 (struct elf_link_hash_entry *h)
6369 && h->type == STT_FUNC
6370 && h->root.type == bfd_link_hash_defined
6371 && (STO_PPC64_LOCAL_MASK & h->other) == 0
6372 && !((struct ppc_link_hash_entry *) h)->non_zero_localentry
6373 && is_ppc64_elf (h->root.u.def.section->owner)
6374 && abiversion (h->root.u.def.section->owner) >= 2);
6377 /* Return true if symbol is defined in a regular object file. */
6380 is_static_defined (struct elf_link_hash_entry *h)
6382 return ((h->root.type == bfd_link_hash_defined
6383 || h->root.type == bfd_link_hash_defweak)
6384 && h->root.u.def.section != NULL
6385 && h->root.u.def.section->output_section != NULL);
6388 /* If FDH is a function descriptor symbol, return the associated code
6389 entry symbol if it is defined. Return NULL otherwise. */
6391 static struct ppc_link_hash_entry *
6392 defined_code_entry (struct ppc_link_hash_entry *fdh)
6394 if (fdh->is_func_descriptor)
6396 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6397 if (fh->elf.root.type == bfd_link_hash_defined
6398 || fh->elf.root.type == bfd_link_hash_defweak)
6404 /* If FH is a function code entry symbol, return the associated
6405 function descriptor symbol if it is defined. Return NULL otherwise. */
6407 static struct ppc_link_hash_entry *
6408 defined_func_desc (struct ppc_link_hash_entry *fh)
6411 && fh->oh->is_func_descriptor)
6413 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6414 if (fdh->elf.root.type == bfd_link_hash_defined
6415 || fdh->elf.root.type == bfd_link_hash_defweak)
6421 static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
6423 /* Garbage collect sections, after first dealing with dot-symbols. */
6426 ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
6428 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6430 if (htab != NULL && htab->need_func_desc_adj)
6432 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6433 htab->need_func_desc_adj = 0;
6435 return bfd_elf_gc_sections (abfd, info);
6438 /* Mark all our entry sym sections, both opd and code section. */
6441 ppc64_elf_gc_keep (struct bfd_link_info *info)
6443 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6444 struct bfd_sym_chain *sym;
6449 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6451 struct ppc_link_hash_entry *eh, *fh;
6454 eh = (struct ppc_link_hash_entry *)
6455 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
6458 if (eh->elf.root.type != bfd_link_hash_defined
6459 && eh->elf.root.type != bfd_link_hash_defweak)
6462 fh = defined_code_entry (eh);
6465 sec = fh->elf.root.u.def.section;
6466 sec->flags |= SEC_KEEP;
6468 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6469 && opd_entry_value (eh->elf.root.u.def.section,
6470 eh->elf.root.u.def.value,
6471 &sec, NULL, FALSE) != (bfd_vma) -1)
6472 sec->flags |= SEC_KEEP;
6474 sec = eh->elf.root.u.def.section;
6475 sec->flags |= SEC_KEEP;
6479 /* Mark sections containing dynamically referenced symbols. When
6480 building shared libraries, we must assume that any visible symbol is
6484 ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6486 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6487 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
6488 struct ppc_link_hash_entry *fdh;
6489 struct bfd_elf_dynamic_list *d = info->dynamic_list;
6491 /* Dynamic linking info is on the func descriptor sym. */
6492 fdh = defined_func_desc (eh);
6496 if ((eh->elf.root.type == bfd_link_hash_defined
6497 || eh->elf.root.type == bfd_link_hash_defweak)
6498 && (eh->elf.ref_dynamic
6499 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
6500 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
6501 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
6502 && (!bfd_link_executable (info)
6503 || info->gc_keep_exported
6504 || info->export_dynamic
6507 && (*d->match) (&d->head, NULL, eh->elf.root.root.string)))
6508 && (eh->elf.versioned >= versioned
6509 || !bfd_hide_sym_by_version (info->version_info,
6510 eh->elf.root.root.string)))))
6513 struct ppc_link_hash_entry *fh;
6515 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6517 /* Function descriptor syms cause the associated
6518 function code sym section to be marked. */
6519 fh = defined_code_entry (eh);
6522 code_sec = fh->elf.root.u.def.section;
6523 code_sec->flags |= SEC_KEEP;
6525 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6526 && opd_entry_value (eh->elf.root.u.def.section,
6527 eh->elf.root.u.def.value,
6528 &code_sec, NULL, FALSE) != (bfd_vma) -1)
6529 code_sec->flags |= SEC_KEEP;
6535 /* Return the section that should be marked against GC for a given
6539 ppc64_elf_gc_mark_hook (asection *sec,
6540 struct bfd_link_info *info,
6541 Elf_Internal_Rela *rel,
6542 struct elf_link_hash_entry *h,
6543 Elf_Internal_Sym *sym)
6547 /* Syms return NULL if we're marking .opd, so we avoid marking all
6548 function sections, as all functions are referenced in .opd. */
6550 if (get_opd_info (sec) != NULL)
6555 enum elf_ppc64_reloc_type r_type;
6556 struct ppc_link_hash_entry *eh, *fh, *fdh;
6558 r_type = ELF64_R_TYPE (rel->r_info);
6561 case R_PPC64_GNU_VTINHERIT:
6562 case R_PPC64_GNU_VTENTRY:
6566 switch (h->root.type)
6568 case bfd_link_hash_defined:
6569 case bfd_link_hash_defweak:
6570 eh = (struct ppc_link_hash_entry *) h;
6571 fdh = defined_func_desc (eh);
6574 /* -mcall-aixdesc code references the dot-symbol on
6575 a call reloc. Mark the function descriptor too
6576 against garbage collection. */
6578 if (fdh->elf.u.weakdef != NULL)
6579 fdh->elf.u.weakdef->mark = 1;
6583 /* Function descriptor syms cause the associated
6584 function code sym section to be marked. */
6585 fh = defined_code_entry (eh);
6588 /* They also mark their opd section. */
6589 eh->elf.root.u.def.section->gc_mark = 1;
6591 rsec = fh->elf.root.u.def.section;
6593 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6594 && opd_entry_value (eh->elf.root.u.def.section,
6595 eh->elf.root.u.def.value,
6596 &rsec, NULL, FALSE) != (bfd_vma) -1)
6597 eh->elf.root.u.def.section->gc_mark = 1;
6599 rsec = h->root.u.def.section;
6602 case bfd_link_hash_common:
6603 rsec = h->root.u.c.p->section;
6607 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6613 struct _opd_sec_data *opd;
6615 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6616 opd = get_opd_info (rsec);
6617 if (opd != NULL && opd->func_sec != NULL)
6621 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
6628 /* The maximum size of .sfpr. */
6629 #define SFPR_MAX (218*4)
6631 struct sfpr_def_parms
6633 const char name[12];
6634 unsigned char lo, hi;
6635 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6636 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6639 /* Auto-generate _save*, _rest* functions in .sfpr.
6640 If STUB_SEC is non-null, define alias symbols in STUB_SEC
6644 sfpr_define (struct bfd_link_info *info,
6645 const struct sfpr_def_parms *parm,
6648 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6650 size_t len = strlen (parm->name);
6651 bfd_boolean writing = FALSE;
6657 memcpy (sym, parm->name, len);
6660 for (i = parm->lo; i <= parm->hi; i++)
6662 struct ppc_link_hash_entry *h;
6664 sym[len + 0] = i / 10 + '0';
6665 sym[len + 1] = i % 10 + '0';
6666 h = (struct ppc_link_hash_entry *)
6667 elf_link_hash_lookup (&htab->elf, sym, writing, TRUE, TRUE);
6668 if (stub_sec != NULL)
6671 && h->elf.root.type == bfd_link_hash_defined
6672 && h->elf.root.u.def.section == htab->sfpr)
6674 struct elf_link_hash_entry *s;
6676 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
6677 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
6680 if (s->root.type == bfd_link_hash_new
6681 || (s->root.type = bfd_link_hash_defined
6682 && s->root.u.def.section == stub_sec))
6684 s->root.type = bfd_link_hash_defined;
6685 s->root.u.def.section = stub_sec;
6686 s->root.u.def.value = (stub_sec->size
6687 + h->elf.root.u.def.value);
6690 s->ref_regular_nonweak = 1;
6691 s->forced_local = 1;
6693 s->root.linker_def = 1;
6701 if (!h->elf.def_regular)
6703 h->elf.root.type = bfd_link_hash_defined;
6704 h->elf.root.u.def.section = htab->sfpr;
6705 h->elf.root.u.def.value = htab->sfpr->size;
6706 h->elf.type = STT_FUNC;
6707 h->elf.def_regular = 1;
6709 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
6711 if (htab->sfpr->contents == NULL)
6713 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6714 if (htab->sfpr->contents == NULL)
6721 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6723 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6725 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6726 htab->sfpr->size = p - htab->sfpr->contents;
6734 savegpr0 (bfd *abfd, bfd_byte *p, int r)
6736 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6741 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6743 p = savegpr0 (abfd, p, r);
6744 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6746 bfd_put_32 (abfd, BLR, p);
6751 restgpr0 (bfd *abfd, bfd_byte *p, int r)
6753 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6758 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6760 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6762 p = restgpr0 (abfd, p, r);
6763 bfd_put_32 (abfd, MTLR_R0, p);
6767 p = restgpr0 (abfd, p, 30);
6768 p = restgpr0 (abfd, p, 31);
6770 bfd_put_32 (abfd, BLR, p);
6775 savegpr1 (bfd *abfd, bfd_byte *p, int r)
6777 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6782 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6784 p = savegpr1 (abfd, p, r);
6785 bfd_put_32 (abfd, BLR, p);
6790 restgpr1 (bfd *abfd, bfd_byte *p, int r)
6792 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6797 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6799 p = restgpr1 (abfd, p, r);
6800 bfd_put_32 (abfd, BLR, p);
6805 savefpr (bfd *abfd, bfd_byte *p, int r)
6807 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6812 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6814 p = savefpr (abfd, p, r);
6815 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6817 bfd_put_32 (abfd, BLR, p);
6822 restfpr (bfd *abfd, bfd_byte *p, int r)
6824 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6829 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6831 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6833 p = restfpr (abfd, p, r);
6834 bfd_put_32 (abfd, MTLR_R0, p);
6838 p = restfpr (abfd, p, 30);
6839 p = restfpr (abfd, p, 31);
6841 bfd_put_32 (abfd, BLR, p);
6846 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6848 p = savefpr (abfd, p, r);
6849 bfd_put_32 (abfd, BLR, p);
6854 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6856 p = restfpr (abfd, p, r);
6857 bfd_put_32 (abfd, BLR, p);
6862 savevr (bfd *abfd, bfd_byte *p, int r)
6864 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6866 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6871 savevr_tail (bfd *abfd, bfd_byte *p, int r)
6873 p = savevr (abfd, p, r);
6874 bfd_put_32 (abfd, BLR, p);
6879 restvr (bfd *abfd, bfd_byte *p, int r)
6881 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6883 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6888 restvr_tail (bfd *abfd, bfd_byte *p, int r)
6890 p = restvr (abfd, p, r);
6891 bfd_put_32 (abfd, BLR, p);
6895 /* Called via elf_link_hash_traverse to transfer dynamic linking
6896 information on function code symbol entries to their corresponding
6897 function descriptor symbol entries. */
6900 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6902 struct bfd_link_info *info;
6903 struct ppc_link_hash_table *htab;
6904 struct ppc_link_hash_entry *fh;
6905 struct ppc_link_hash_entry *fdh;
6906 bfd_boolean force_local;
6908 fh = (struct ppc_link_hash_entry *) h;
6909 if (fh->elf.root.type == bfd_link_hash_indirect)
6915 if (fh->elf.root.root.string[0] != '.'
6916 || fh->elf.root.root.string[1] == '\0')
6920 htab = ppc_hash_table (info);
6924 /* Find the corresponding function descriptor symbol. */
6925 fdh = lookup_fdh (fh, htab);
6927 /* Resolve undefined references to dot-symbols as the value
6928 in the function descriptor, if we have one in a regular object.
6929 This is to satisfy cases like ".quad .foo". Calls to functions
6930 in dynamic objects are handled elsewhere. */
6931 if ((fh->elf.root.type == bfd_link_hash_undefined
6932 || fh->elf.root.type == bfd_link_hash_undefweak)
6933 && (fdh->elf.root.type == bfd_link_hash_defined
6934 || fdh->elf.root.type == bfd_link_hash_defweak)
6935 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6936 && opd_entry_value (fdh->elf.root.u.def.section,
6937 fdh->elf.root.u.def.value,
6938 &fh->elf.root.u.def.section,
6939 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
6941 fh->elf.root.type = fdh->elf.root.type;
6942 fh->elf.forced_local = 1;
6943 fh->elf.def_regular = fdh->elf.def_regular;
6944 fh->elf.def_dynamic = fdh->elf.def_dynamic;
6947 if (!fh->elf.dynamic)
6949 struct plt_entry *ent;
6951 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6952 if (ent->plt.refcount > 0)
6958 /* Create a descriptor as undefined if necessary. */
6960 && !bfd_link_executable (info)
6961 && (fh->elf.root.type == bfd_link_hash_undefined
6962 || fh->elf.root.type == bfd_link_hash_undefweak))
6964 fdh = make_fdh (info, fh);
6969 /* We can't support overriding of symbols on a fake descriptor. */
6972 && (fh->elf.root.type == bfd_link_hash_defined
6973 || fh->elf.root.type == bfd_link_hash_defweak))
6974 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
6976 /* Transfer dynamic linking information to the function descriptor. */
6979 fdh->elf.ref_regular |= fh->elf.ref_regular;
6980 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6981 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6982 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
6983 fdh->elf.dynamic |= fh->elf.dynamic;
6984 fdh->elf.needs_plt |= (fh->elf.needs_plt
6985 || fh->elf.type == STT_FUNC
6986 || fh->elf.type == STT_GNU_IFUNC);
6987 move_plt_plist (fh, fdh);
6989 if (!fdh->elf.forced_local
6990 && fh->elf.dynindx != -1)
6991 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6995 /* Now that the info is on the function descriptor, clear the
6996 function code sym info. Any function code syms for which we
6997 don't have a definition in a regular file, we force local.
6998 This prevents a shared library from exporting syms that have
6999 been imported from another library. Function code syms that
7000 are really in the library we must leave global to prevent the
7001 linker dragging in a definition from a static library. */
7002 force_local = (!fh->elf.def_regular
7004 || !fdh->elf.def_regular
7005 || fdh->elf.forced_local);
7006 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7011 static const struct sfpr_def_parms save_res_funcs[] =
7013 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
7014 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
7015 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
7016 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
7017 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
7018 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
7019 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
7020 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
7021 { "._savef", 14, 31, savefpr, savefpr1_tail },
7022 { "._restf", 14, 31, restfpr, restfpr1_tail },
7023 { "_savevr_", 20, 31, savevr, savevr_tail },
7024 { "_restvr_", 20, 31, restvr, restvr_tail }
7027 /* Called near the start of bfd_elf_size_dynamic_sections. We use
7028 this hook to a) provide some gcc support functions, and b) transfer
7029 dynamic linking information gathered so far on function code symbol
7030 entries, to their corresponding function descriptor symbol entries. */
7033 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
7034 struct bfd_link_info *info)
7036 struct ppc_link_hash_table *htab;
7038 htab = ppc_hash_table (info);
7042 /* Provide any missing _save* and _rest* functions. */
7043 if (htab->sfpr != NULL)
7047 htab->sfpr->size = 0;
7048 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
7049 if (!sfpr_define (info, &save_res_funcs[i], NULL))
7051 if (htab->sfpr->size == 0)
7052 htab->sfpr->flags |= SEC_EXCLUDE;
7055 if (bfd_link_relocatable (info))
7058 if (htab->elf.hgot != NULL)
7060 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
7061 /* Make .TOC. defined so as to prevent it being made dynamic.
7062 The wrong value here is fixed later in ppc64_elf_set_toc. */
7063 if (!htab->elf.hgot->def_regular
7064 || htab->elf.hgot->root.type != bfd_link_hash_defined)
7066 htab->elf.hgot->root.type = bfd_link_hash_defined;
7067 htab->elf.hgot->root.u.def.value = 0;
7068 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
7069 htab->elf.hgot->def_regular = 1;
7070 htab->elf.hgot->root.linker_def = 1;
7072 htab->elf.hgot->type = STT_OBJECT;
7073 htab->elf.hgot->other = ((htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1))
7077 if (htab->need_func_desc_adj)
7079 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
7080 htab->need_func_desc_adj = 0;
7086 /* Return true if we have dynamic relocs against H that apply to
7087 read-only sections. */
7090 readonly_dynrelocs (struct elf_link_hash_entry *h)
7092 struct ppc_link_hash_entry *eh;
7093 struct elf_dyn_relocs *p;
7095 eh = (struct ppc_link_hash_entry *) h;
7096 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7098 asection *s = p->sec->output_section;
7100 if (s != NULL && (s->flags & SEC_READONLY) != 0)
7106 /* Return true if we have dynamic relocs against H or any of its weak
7107 aliases, that apply to read-only sections. */
7110 alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
7112 struct ppc_link_hash_entry *eh;
7114 eh = (struct ppc_link_hash_entry *) h;
7117 if (readonly_dynrelocs (&eh->elf))
7120 } while (eh != NULL && &eh->elf != h);
7125 /* Return whether EH has pc-relative dynamic relocs. */
7128 pc_dynrelocs (struct ppc_link_hash_entry *eh)
7130 struct elf_dyn_relocs *p;
7132 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7133 if (p->pc_count != 0)
7138 /* Return true if a global entry stub will be created for H. Valid
7139 for ELFv2 before plt entries have been allocated. */
7142 global_entry_stub (struct elf_link_hash_entry *h)
7144 struct plt_entry *pent;
7146 if (!h->pointer_equality_needed
7150 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
7151 if (pent->plt.refcount > 0
7152 && pent->addend == 0)
7158 /* Adjust a symbol defined by a dynamic object and referenced by a
7159 regular object. The current definition is in some section of the
7160 dynamic object, but we're not including those sections. We have to
7161 change the definition to something the rest of the link can
7165 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
7166 struct elf_link_hash_entry *h)
7168 struct ppc_link_hash_table *htab;
7171 htab = ppc_hash_table (info);
7175 /* Deal with function syms. */
7176 if (h->type == STT_FUNC
7177 || h->type == STT_GNU_IFUNC
7180 /* Clear procedure linkage table information for any symbol that
7181 won't need a .plt entry. */
7182 struct plt_entry *ent;
7183 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
7184 if (ent->plt.refcount > 0)
7187 || (h->type != STT_GNU_IFUNC
7188 && (SYMBOL_CALLS_LOCAL (info, h)
7189 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)))
7190 || ((struct ppc_link_hash_entry *) h)->save_res)
7192 h->plt.plist = NULL;
7194 h->pointer_equality_needed = 0;
7196 else if (abiversion (info->output_bfd) >= 2)
7198 /* Taking a function's address in a read/write section
7199 doesn't require us to define the function symbol in the
7200 executable on a global entry stub. A dynamic reloc can
7201 be used instead. The reason we prefer a few more dynamic
7202 relocs is that calling via a global entry stub costs a
7203 few more instructions, and pointer_equality_needed causes
7204 extra work in ld.so when resolving these symbols. */
7205 if (global_entry_stub (h)
7206 && !alias_readonly_dynrelocs (h))
7208 h->pointer_equality_needed = 0;
7209 /* After adjust_dynamic_symbol, non_got_ref set in
7210 the non-pic case means that dyn_relocs for this
7211 symbol should be discarded. */
7215 /* If making a plt entry, then we don't need copy relocs. */
7220 h->plt.plist = NULL;
7222 /* If this is a weak symbol, and there is a real definition, the
7223 processor independent code will have arranged for us to see the
7224 real definition first, and we can just use the same value. */
7225 if (h->u.weakdef != NULL)
7227 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7228 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7229 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7230 h->root.u.def.value = h->u.weakdef->root.u.def.value;
7231 if (ELIMINATE_COPY_RELOCS)
7232 h->non_got_ref = h->u.weakdef->non_got_ref;
7236 /* If we are creating a shared library, we must presume that the
7237 only references to the symbol are via the global offset table.
7238 For such cases we need not do anything here; the relocations will
7239 be handled correctly by relocate_section. */
7240 if (bfd_link_pic (info))
7243 /* If there are no references to this symbol that do not use the
7244 GOT, we don't need to generate a copy reloc. */
7245 if (!h->non_got_ref)
7248 /* Don't generate a copy reloc for symbols defined in the executable. */
7249 if (!h->def_dynamic || !h->ref_regular || h->def_regular
7251 /* If -z nocopyreloc was given, don't generate them either. */
7252 || info->nocopyreloc
7254 /* If we didn't find any dynamic relocs in read-only sections, then
7255 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
7256 || (ELIMINATE_COPY_RELOCS && !alias_readonly_dynrelocs (h))
7258 /* Protected variables do not work with .dynbss. The copy in
7259 .dynbss won't be used by the shared library with the protected
7260 definition for the variable. Text relocations are preferable
7261 to an incorrect program. */
7262 || h->protected_def)
7268 if (h->plt.plist != NULL)
7270 /* We should never get here, but unfortunately there are versions
7271 of gcc out there that improperly (for this ABI) put initialized
7272 function pointers, vtable refs and suchlike in read-only
7273 sections. Allow them to proceed, but warn that this might
7274 break at runtime. */
7275 info->callbacks->einfo
7276 (_("%P: copy reloc against `%T' requires lazy plt linking; "
7277 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
7278 h->root.root.string);
7281 /* This is a reference to a symbol defined by a dynamic object which
7282 is not a function. */
7284 /* We must allocate the symbol in our .dynbss section, which will
7285 become part of the .bss section of the executable. There will be
7286 an entry for this symbol in the .dynsym section. The dynamic
7287 object will contain position independent code, so all references
7288 from the dynamic object to this symbol will go through the global
7289 offset table. The dynamic linker will use the .dynsym entry to
7290 determine the address it must put in the global offset table, so
7291 both the dynamic object and the regular object will refer to the
7292 same memory location for the variable. */
7294 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
7295 to copy the initial value out of the dynamic object and into the
7296 runtime process image. We need to remember the offset into the
7297 .rela.bss section we are going to use. */
7298 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
7300 s = htab->elf.sdynrelro;
7301 srel = htab->elf.sreldynrelro;
7305 s = htab->elf.sdynbss;
7306 srel = htab->elf.srelbss;
7308 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
7310 srel->size += sizeof (Elf64_External_Rela);
7314 return _bfd_elf_adjust_dynamic_copy (info, h, s);
7317 /* If given a function descriptor symbol, hide both the function code
7318 sym and the descriptor. */
7320 ppc64_elf_hide_symbol (struct bfd_link_info *info,
7321 struct elf_link_hash_entry *h,
7322 bfd_boolean force_local)
7324 struct ppc_link_hash_entry *eh;
7325 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
7327 eh = (struct ppc_link_hash_entry *) h;
7328 if (eh->is_func_descriptor)
7330 struct ppc_link_hash_entry *fh = eh->oh;
7335 struct elf_link_hash_table *htab = elf_hash_table (info);
7338 /* We aren't supposed to use alloca in BFD because on
7339 systems which do not have alloca the version in libiberty
7340 calls xmalloc, which might cause the program to crash
7341 when it runs out of memory. This function doesn't have a
7342 return status, so there's no way to gracefully return an
7343 error. So cheat. We know that string[-1] can be safely
7344 accessed; It's either a string in an ELF string table,
7345 or allocated in an objalloc structure. */
7347 p = eh->elf.root.root.string - 1;
7350 fh = (struct ppc_link_hash_entry *)
7351 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
7354 /* Unfortunately, if it so happens that the string we were
7355 looking for was allocated immediately before this string,
7356 then we overwrote the string terminator. That's the only
7357 reason the lookup should fail. */
7360 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
7361 while (q >= eh->elf.root.root.string && *q == *p)
7363 if (q < eh->elf.root.root.string && *p == '.')
7364 fh = (struct ppc_link_hash_entry *)
7365 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
7374 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7379 get_sym_h (struct elf_link_hash_entry **hp,
7380 Elf_Internal_Sym **symp,
7382 unsigned char **tls_maskp,
7383 Elf_Internal_Sym **locsymsp,
7384 unsigned long r_symndx,
7387 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7389 if (r_symndx >= symtab_hdr->sh_info)
7391 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7392 struct elf_link_hash_entry *h;
7394 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7395 h = elf_follow_link (h);
7403 if (symsecp != NULL)
7405 asection *symsec = NULL;
7406 if (h->root.type == bfd_link_hash_defined
7407 || h->root.type == bfd_link_hash_defweak)
7408 symsec = h->root.u.def.section;
7412 if (tls_maskp != NULL)
7414 struct ppc_link_hash_entry *eh;
7416 eh = (struct ppc_link_hash_entry *) h;
7417 *tls_maskp = &eh->tls_mask;
7422 Elf_Internal_Sym *sym;
7423 Elf_Internal_Sym *locsyms = *locsymsp;
7425 if (locsyms == NULL)
7427 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7428 if (locsyms == NULL)
7429 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7430 symtab_hdr->sh_info,
7431 0, NULL, NULL, NULL);
7432 if (locsyms == NULL)
7434 *locsymsp = locsyms;
7436 sym = locsyms + r_symndx;
7444 if (symsecp != NULL)
7445 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
7447 if (tls_maskp != NULL)
7449 struct got_entry **lgot_ents;
7450 unsigned char *tls_mask;
7453 lgot_ents = elf_local_got_ents (ibfd);
7454 if (lgot_ents != NULL)
7456 struct plt_entry **local_plt = (struct plt_entry **)
7457 (lgot_ents + symtab_hdr->sh_info);
7458 unsigned char *lgot_masks = (unsigned char *)
7459 (local_plt + symtab_hdr->sh_info);
7460 tls_mask = &lgot_masks[r_symndx];
7462 *tls_maskp = tls_mask;
7468 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
7469 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
7470 type suitable for optimization, and 1 otherwise. */
7473 get_tls_mask (unsigned char **tls_maskp,
7474 unsigned long *toc_symndx,
7475 bfd_vma *toc_addend,
7476 Elf_Internal_Sym **locsymsp,
7477 const Elf_Internal_Rela *rel,
7480 unsigned long r_symndx;
7482 struct elf_link_hash_entry *h;
7483 Elf_Internal_Sym *sym;
7487 r_symndx = ELF64_R_SYM (rel->r_info);
7488 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7491 if ((*tls_maskp != NULL && **tls_maskp != 0)
7493 || ppc64_elf_section_data (sec) == NULL
7494 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
7497 /* Look inside a TOC section too. */
7500 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7501 off = h->root.u.def.value;
7504 off = sym->st_value;
7505 off += rel->r_addend;
7506 BFD_ASSERT (off % 8 == 0);
7507 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7508 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
7509 if (toc_symndx != NULL)
7510 *toc_symndx = r_symndx;
7511 if (toc_addend != NULL)
7512 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7513 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7515 if ((h == NULL || is_static_defined (h))
7516 && (next_r == -1 || next_r == -2))
7521 /* Find (or create) an entry in the tocsave hash table. */
7523 static struct tocsave_entry *
7524 tocsave_find (struct ppc_link_hash_table *htab,
7525 enum insert_option insert,
7526 Elf_Internal_Sym **local_syms,
7527 const Elf_Internal_Rela *irela,
7530 unsigned long r_indx;
7531 struct elf_link_hash_entry *h;
7532 Elf_Internal_Sym *sym;
7533 struct tocsave_entry ent, *p;
7535 struct tocsave_entry **slot;
7537 r_indx = ELF64_R_SYM (irela->r_info);
7538 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7540 if (ent.sec == NULL || ent.sec->output_section == NULL)
7543 (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
7548 ent.offset = h->root.u.def.value;
7550 ent.offset = sym->st_value;
7551 ent.offset += irela->r_addend;
7553 hash = tocsave_htab_hash (&ent);
7554 slot = ((struct tocsave_entry **)
7555 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7561 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7570 /* Adjust all global syms defined in opd sections. In gcc generated
7571 code for the old ABI, these will already have been done. */
7574 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7576 struct ppc_link_hash_entry *eh;
7578 struct _opd_sec_data *opd;
7580 if (h->root.type == bfd_link_hash_indirect)
7583 if (h->root.type != bfd_link_hash_defined
7584 && h->root.type != bfd_link_hash_defweak)
7587 eh = (struct ppc_link_hash_entry *) h;
7588 if (eh->adjust_done)
7591 sym_sec = eh->elf.root.u.def.section;
7592 opd = get_opd_info (sym_sec);
7593 if (opd != NULL && opd->adjust != NULL)
7595 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
7598 /* This entry has been deleted. */
7599 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
7602 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
7603 if (discarded_section (dsec))
7605 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
7609 eh->elf.root.u.def.value = 0;
7610 eh->elf.root.u.def.section = dsec;
7613 eh->elf.root.u.def.value += adjust;
7614 eh->adjust_done = 1;
7619 /* Handles decrementing dynamic reloc counts for the reloc specified by
7620 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
7621 have already been determined. */
7624 dec_dynrel_count (bfd_vma r_info,
7626 struct bfd_link_info *info,
7627 Elf_Internal_Sym **local_syms,
7628 struct elf_link_hash_entry *h,
7629 Elf_Internal_Sym *sym)
7631 enum elf_ppc64_reloc_type r_type;
7632 asection *sym_sec = NULL;
7634 /* Can this reloc be dynamic? This switch, and later tests here
7635 should be kept in sync with the code in check_relocs. */
7636 r_type = ELF64_R_TYPE (r_info);
7642 case R_PPC64_TPREL16:
7643 case R_PPC64_TPREL16_LO:
7644 case R_PPC64_TPREL16_HI:
7645 case R_PPC64_TPREL16_HA:
7646 case R_PPC64_TPREL16_DS:
7647 case R_PPC64_TPREL16_LO_DS:
7648 case R_PPC64_TPREL16_HIGH:
7649 case R_PPC64_TPREL16_HIGHA:
7650 case R_PPC64_TPREL16_HIGHER:
7651 case R_PPC64_TPREL16_HIGHERA:
7652 case R_PPC64_TPREL16_HIGHEST:
7653 case R_PPC64_TPREL16_HIGHESTA:
7654 case R_PPC64_TPREL64:
7655 case R_PPC64_DTPMOD64:
7656 case R_PPC64_DTPREL64:
7657 case R_PPC64_ADDR64:
7661 case R_PPC64_ADDR14:
7662 case R_PPC64_ADDR14_BRNTAKEN:
7663 case R_PPC64_ADDR14_BRTAKEN:
7664 case R_PPC64_ADDR16:
7665 case R_PPC64_ADDR16_DS:
7666 case R_PPC64_ADDR16_HA:
7667 case R_PPC64_ADDR16_HI:
7668 case R_PPC64_ADDR16_HIGH:
7669 case R_PPC64_ADDR16_HIGHA:
7670 case R_PPC64_ADDR16_HIGHER:
7671 case R_PPC64_ADDR16_HIGHERA:
7672 case R_PPC64_ADDR16_HIGHEST:
7673 case R_PPC64_ADDR16_HIGHESTA:
7674 case R_PPC64_ADDR16_LO:
7675 case R_PPC64_ADDR16_LO_DS:
7676 case R_PPC64_ADDR24:
7677 case R_PPC64_ADDR32:
7678 case R_PPC64_UADDR16:
7679 case R_PPC64_UADDR32:
7680 case R_PPC64_UADDR64:
7685 if (local_syms != NULL)
7687 unsigned long r_symndx;
7688 bfd *ibfd = sec->owner;
7690 r_symndx = ELF64_R_SYM (r_info);
7691 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7695 if ((bfd_link_pic (info)
7696 && (must_be_dyn_reloc (info, r_type)
7698 && (!SYMBOLIC_BIND (info, h)
7699 || h->root.type == bfd_link_hash_defweak
7700 || !h->def_regular))))
7701 || (ELIMINATE_COPY_RELOCS
7702 && !bfd_link_pic (info)
7704 && (h->root.type == bfd_link_hash_defweak
7705 || !h->def_regular)))
7712 struct elf_dyn_relocs *p;
7713 struct elf_dyn_relocs **pp;
7714 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7716 /* elf_gc_sweep may have already removed all dyn relocs associated
7717 with local syms for a given section. Also, symbol flags are
7718 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7719 report a dynreloc miscount. */
7720 if (*pp == NULL && info->gc_sections)
7723 while ((p = *pp) != NULL)
7727 if (!must_be_dyn_reloc (info, r_type))
7739 struct ppc_dyn_relocs *p;
7740 struct ppc_dyn_relocs **pp;
7742 bfd_boolean is_ifunc;
7744 if (local_syms == NULL)
7745 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7746 if (sym_sec == NULL)
7749 vpp = &elf_section_data (sym_sec)->local_dynrel;
7750 pp = (struct ppc_dyn_relocs **) vpp;
7752 if (*pp == NULL && info->gc_sections)
7755 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7756 while ((p = *pp) != NULL)
7758 if (p->sec == sec && p->ifunc == is_ifunc)
7769 /* xgettext:c-format */
7770 info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
7772 bfd_set_error (bfd_error_bad_value);
7776 /* Remove unused Official Procedure Descriptor entries. Currently we
7777 only remove those associated with functions in discarded link-once
7778 sections, or weakly defined functions that have been overridden. It
7779 would be possible to remove many more entries for statically linked
7783 ppc64_elf_edit_opd (struct bfd_link_info *info)
7786 bfd_boolean some_edited = FALSE;
7787 asection *need_pad = NULL;
7788 struct ppc_link_hash_table *htab;
7790 htab = ppc_hash_table (info);
7794 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7797 Elf_Internal_Rela *relstart, *rel, *relend;
7798 Elf_Internal_Shdr *symtab_hdr;
7799 Elf_Internal_Sym *local_syms;
7800 struct _opd_sec_data *opd;
7801 bfd_boolean need_edit, add_aux_fields, broken;
7802 bfd_size_type cnt_16b = 0;
7804 if (!is_ppc64_elf (ibfd))
7807 sec = bfd_get_section_by_name (ibfd, ".opd");
7808 if (sec == NULL || sec->size == 0)
7811 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
7814 if (sec->output_section == bfd_abs_section_ptr)
7817 /* Look through the section relocs. */
7818 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7822 symtab_hdr = &elf_symtab_hdr (ibfd);
7824 /* Read the relocations. */
7825 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7827 if (relstart == NULL)
7830 /* First run through the relocs to check they are sane, and to
7831 determine whether we need to edit this opd section. */
7835 relend = relstart + sec->reloc_count;
7836 for (rel = relstart; rel < relend; )
7838 enum elf_ppc64_reloc_type r_type;
7839 unsigned long r_symndx;
7841 struct elf_link_hash_entry *h;
7842 Elf_Internal_Sym *sym;
7845 /* .opd contains an array of 16 or 24 byte entries. We're
7846 only interested in the reloc pointing to a function entry
7848 offset = rel->r_offset;
7849 if (rel + 1 == relend
7850 || rel[1].r_offset != offset + 8)
7852 /* If someone messes with .opd alignment then after a
7853 "ld -r" we might have padding in the middle of .opd.
7854 Also, there's nothing to prevent someone putting
7855 something silly in .opd with the assembler. No .opd
7856 optimization for them! */
7859 (_("%B: .opd is not a regular array of opd entries"), ibfd);
7864 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7865 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7868 /* xgettext:c-format */
7869 (_("%B: unexpected reloc type %u in .opd section"),
7875 r_symndx = ELF64_R_SYM (rel->r_info);
7876 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7880 if (sym_sec == NULL || sym_sec->owner == NULL)
7882 const char *sym_name;
7884 sym_name = h->root.root.string;
7886 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7890 /* xgettext:c-format */
7891 (_("%B: undefined sym `%s' in .opd section"),
7897 /* opd entries are always for functions defined in the
7898 current input bfd. If the symbol isn't defined in the
7899 input bfd, then we won't be using the function in this
7900 bfd; It must be defined in a linkonce section in another
7901 bfd, or is weak. It's also possible that we are
7902 discarding the function due to a linker script /DISCARD/,
7903 which we test for via the output_section. */
7904 if (sym_sec->owner != ibfd
7905 || sym_sec->output_section == bfd_abs_section_ptr)
7909 if (rel + 1 == relend
7910 || (rel + 2 < relend
7911 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
7916 if (sec->size == offset + 24)
7921 if (sec->size == offset + 16)
7928 else if (rel + 1 < relend
7929 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7930 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7932 if (rel[0].r_offset == offset + 16)
7934 else if (rel[0].r_offset != offset + 24)
7941 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
7943 if (!broken && (need_edit || add_aux_fields))
7945 Elf_Internal_Rela *write_rel;
7946 Elf_Internal_Shdr *rel_hdr;
7947 bfd_byte *rptr, *wptr;
7948 bfd_byte *new_contents;
7951 new_contents = NULL;
7952 amt = OPD_NDX (sec->size) * sizeof (long);
7953 opd = &ppc64_elf_section_data (sec)->u.opd;
7954 opd->adjust = bfd_zalloc (sec->owner, amt);
7955 if (opd->adjust == NULL)
7958 /* This seems a waste of time as input .opd sections are all
7959 zeros as generated by gcc, but I suppose there's no reason
7960 this will always be so. We might start putting something in
7961 the third word of .opd entries. */
7962 if ((sec->flags & SEC_IN_MEMORY) == 0)
7965 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
7970 if (local_syms != NULL
7971 && symtab_hdr->contents != (unsigned char *) local_syms)
7973 if (elf_section_data (sec)->relocs != relstart)
7977 sec->contents = loc;
7978 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7981 elf_section_data (sec)->relocs = relstart;
7983 new_contents = sec->contents;
7986 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7987 if (new_contents == NULL)
7991 wptr = new_contents;
7992 rptr = sec->contents;
7993 write_rel = relstart;
7994 for (rel = relstart; rel < relend; )
7996 unsigned long r_symndx;
7998 struct elf_link_hash_entry *h;
7999 struct ppc_link_hash_entry *fdh = NULL;
8000 Elf_Internal_Sym *sym;
8002 Elf_Internal_Rela *next_rel;
8005 r_symndx = ELF64_R_SYM (rel->r_info);
8006 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8011 if (next_rel + 1 == relend
8012 || (next_rel + 2 < relend
8013 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
8016 /* See if the .opd entry is full 24 byte or
8017 16 byte (with fd_aux entry overlapped with next
8020 if (next_rel == relend)
8022 if (sec->size == rel->r_offset + 16)
8025 else if (next_rel->r_offset == rel->r_offset + 16)
8029 && h->root.root.string[0] == '.')
8031 fdh = ((struct ppc_link_hash_entry *) h)->oh;
8034 fdh = ppc_follow_link (fdh);
8035 if (fdh->elf.root.type != bfd_link_hash_defined
8036 && fdh->elf.root.type != bfd_link_hash_defweak)
8041 skip = (sym_sec->owner != ibfd
8042 || sym_sec->output_section == bfd_abs_section_ptr);
8045 if (fdh != NULL && sym_sec->owner == ibfd)
8047 /* Arrange for the function descriptor sym
8049 fdh->elf.root.u.def.value = 0;
8050 fdh->elf.root.u.def.section = sym_sec;
8052 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
8054 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
8059 if (!dec_dynrel_count (rel->r_info, sec, info,
8063 if (++rel == next_rel)
8066 r_symndx = ELF64_R_SYM (rel->r_info);
8067 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8074 /* We'll be keeping this opd entry. */
8079 /* Redefine the function descriptor symbol to
8080 this location in the opd section. It is
8081 necessary to update the value here rather
8082 than using an array of adjustments as we do
8083 for local symbols, because various places
8084 in the generic ELF code use the value
8085 stored in u.def.value. */
8086 fdh->elf.root.u.def.value = wptr - new_contents;
8087 fdh->adjust_done = 1;
8090 /* Local syms are a bit tricky. We could
8091 tweak them as they can be cached, but
8092 we'd need to look through the local syms
8093 for the function descriptor sym which we
8094 don't have at the moment. So keep an
8095 array of adjustments. */
8096 adjust = (wptr - new_contents) - (rptr - sec->contents);
8097 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
8100 memcpy (wptr, rptr, opd_ent_size);
8101 wptr += opd_ent_size;
8102 if (add_aux_fields && opd_ent_size == 16)
8104 memset (wptr, '\0', 8);
8108 /* We need to adjust any reloc offsets to point to the
8110 for ( ; rel != next_rel; ++rel)
8112 rel->r_offset += adjust;
8113 if (write_rel != rel)
8114 memcpy (write_rel, rel, sizeof (*rel));
8119 rptr += opd_ent_size;
8122 sec->size = wptr - new_contents;
8123 sec->reloc_count = write_rel - relstart;
8126 free (sec->contents);
8127 sec->contents = new_contents;
8130 /* Fudge the header size too, as this is used later in
8131 elf_bfd_final_link if we are emitting relocs. */
8132 rel_hdr = _bfd_elf_single_rel_hdr (sec);
8133 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
8136 else if (elf_section_data (sec)->relocs != relstart)
8139 if (local_syms != NULL
8140 && symtab_hdr->contents != (unsigned char *) local_syms)
8142 if (!info->keep_memory)
8145 symtab_hdr->contents = (unsigned char *) local_syms;
8150 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
8152 /* If we are doing a final link and the last .opd entry is just 16 byte
8153 long, add a 8 byte padding after it. */
8154 if (need_pad != NULL && !bfd_link_relocatable (info))
8158 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
8160 BFD_ASSERT (need_pad->size > 0);
8162 p = bfd_malloc (need_pad->size + 8);
8166 if (! bfd_get_section_contents (need_pad->owner, need_pad,
8167 p, 0, need_pad->size))
8170 need_pad->contents = p;
8171 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8175 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
8179 need_pad->contents = p;
8182 memset (need_pad->contents + need_pad->size, 0, 8);
8183 need_pad->size += 8;
8189 /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
8192 ppc64_elf_tls_setup (struct bfd_link_info *info)
8194 struct ppc_link_hash_table *htab;
8196 htab = ppc_hash_table (info);
8200 if (abiversion (info->output_bfd) == 1)
8203 if (htab->params->no_multi_toc)
8204 htab->do_multi_toc = 0;
8205 else if (!htab->do_multi_toc)
8206 htab->params->no_multi_toc = 1;
8208 /* Default to --no-plt-localentry, as this option can cause problems
8209 with symbol interposition. For example, glibc libpthread.so and
8210 libc.so duplicate many pthread symbols, with a fallback
8211 implementation in libc.so. In some cases the fallback does more
8212 work than the pthread implementation. __pthread_condattr_destroy
8213 is one such symbol: the libpthread.so implementation is
8214 localentry:0 while the libc.so implementation is localentry:8.
8215 An app that "cleverly" uses dlopen to only load necessary
8216 libraries at runtime may omit loading libpthread.so when not
8217 running multi-threaded, which then results in the libc.so
8218 fallback symbols being used and ld.so complaining. Now there
8219 are workarounds in ld (see non_zero_localentry) to detect the
8220 pthread situation, but that may not be the only case where
8221 --plt-localentry can cause trouble. */
8222 if (htab->params->plt_localentry0 < 0)
8223 htab->params->plt_localentry0 = 0;
8224 if (htab->params->plt_localentry0
8225 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
8226 FALSE, FALSE, FALSE) == NULL)
8227 info->callbacks->einfo
8228 (_("%P: warning: --plt-localentry is especially dangerous without "
8229 "ld.so support to detect ABI violations.\n"));
8231 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
8232 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
8233 FALSE, FALSE, TRUE));
8234 /* Move dynamic linking info to the function descriptor sym. */
8235 if (htab->tls_get_addr != NULL)
8236 func_desc_adjust (&htab->tls_get_addr->elf, info);
8237 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
8238 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
8239 FALSE, FALSE, TRUE));
8240 if (htab->params->tls_get_addr_opt)
8242 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
8244 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
8245 FALSE, FALSE, TRUE);
8247 func_desc_adjust (opt, info);
8248 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
8249 FALSE, FALSE, TRUE);
8251 && (opt_fd->root.type == bfd_link_hash_defined
8252 || opt_fd->root.type == bfd_link_hash_defweak))
8254 /* If glibc supports an optimized __tls_get_addr call stub,
8255 signalled by the presence of __tls_get_addr_opt, and we'll
8256 be calling __tls_get_addr via a plt call stub, then
8257 make __tls_get_addr point to __tls_get_addr_opt. */
8258 tga_fd = &htab->tls_get_addr_fd->elf;
8259 if (htab->elf.dynamic_sections_created
8261 && (tga_fd->type == STT_FUNC
8262 || tga_fd->needs_plt)
8263 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
8264 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd)))
8266 struct plt_entry *ent;
8268 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
8269 if (ent->plt.refcount > 0)
8273 tga_fd->root.type = bfd_link_hash_indirect;
8274 tga_fd->root.u.i.link = &opt_fd->root;
8275 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
8277 if (opt_fd->dynindx != -1)
8279 /* Use __tls_get_addr_opt in dynamic relocations. */
8280 opt_fd->dynindx = -1;
8281 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
8282 opt_fd->dynstr_index);
8283 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
8286 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
8287 tga = &htab->tls_get_addr->elf;
8288 if (opt != NULL && tga != NULL)
8290 tga->root.type = bfd_link_hash_indirect;
8291 tga->root.u.i.link = &opt->root;
8292 ppc64_elf_copy_indirect_symbol (info, opt, tga);
8294 _bfd_elf_link_hash_hide_symbol (info, opt,
8296 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
8298 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
8299 htab->tls_get_addr_fd->is_func_descriptor = 1;
8300 if (htab->tls_get_addr != NULL)
8302 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8303 htab->tls_get_addr->is_func = 1;
8308 else if (htab->params->tls_get_addr_opt < 0)
8309 htab->params->tls_get_addr_opt = 0;
8311 return _bfd_elf_tls_setup (info->output_bfd, info);
8314 /* Return TRUE iff REL is a branch reloc with a global symbol matching
8318 branch_reloc_hash_match (const bfd *ibfd,
8319 const Elf_Internal_Rela *rel,
8320 const struct ppc_link_hash_entry *hash1,
8321 const struct ppc_link_hash_entry *hash2)
8323 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8324 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8325 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8327 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8329 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8330 struct elf_link_hash_entry *h;
8332 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8333 h = elf_follow_link (h);
8334 if (h == &hash1->elf || h == &hash2->elf)
8340 /* Run through all the TLS relocs looking for optimization
8341 opportunities. The linker has been hacked (see ppc64elf.em) to do
8342 a preliminary section layout so that we know the TLS segment
8343 offsets. We can't optimize earlier because some optimizations need
8344 to know the tp offset, and we need to optimize before allocating
8345 dynamic relocations. */
8348 ppc64_elf_tls_optimize (struct bfd_link_info *info)
8352 struct ppc_link_hash_table *htab;
8353 unsigned char *toc_ref;
8356 if (!bfd_link_executable (info))
8359 htab = ppc_hash_table (info);
8363 /* Make two passes over the relocs. On the first pass, mark toc
8364 entries involved with tls relocs, and check that tls relocs
8365 involved in setting up a tls_get_addr call are indeed followed by
8366 such a call. If they are not, we can't do any tls optimization.
8367 On the second pass twiddle tls_mask flags to notify
8368 relocate_section that optimization can be done, and adjust got
8369 and plt refcounts. */
8371 for (pass = 0; pass < 2; ++pass)
8372 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8374 Elf_Internal_Sym *locsyms = NULL;
8375 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8377 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8378 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8380 Elf_Internal_Rela *relstart, *rel, *relend;
8381 bfd_boolean found_tls_get_addr_arg = 0;
8383 /* Read the relocations. */
8384 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8386 if (relstart == NULL)
8392 relend = relstart + sec->reloc_count;
8393 for (rel = relstart; rel < relend; rel++)
8395 enum elf_ppc64_reloc_type r_type;
8396 unsigned long r_symndx;
8397 struct elf_link_hash_entry *h;
8398 Elf_Internal_Sym *sym;
8400 unsigned char *tls_mask;
8401 unsigned char tls_set, tls_clear, tls_type = 0;
8403 bfd_boolean ok_tprel, is_local;
8404 long toc_ref_index = 0;
8405 int expecting_tls_get_addr = 0;
8406 bfd_boolean ret = FALSE;
8408 r_symndx = ELF64_R_SYM (rel->r_info);
8409 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8413 if (elf_section_data (sec)->relocs != relstart)
8415 if (toc_ref != NULL)
8418 && (elf_symtab_hdr (ibfd).contents
8419 != (unsigned char *) locsyms))
8426 if (h->root.type == bfd_link_hash_defined
8427 || h->root.type == bfd_link_hash_defweak)
8428 value = h->root.u.def.value;
8429 else if (h->root.type == bfd_link_hash_undefweak)
8433 found_tls_get_addr_arg = 0;
8438 /* Symbols referenced by TLS relocs must be of type
8439 STT_TLS. So no need for .opd local sym adjust. */
8440 value = sym->st_value;
8449 && h->root.type == bfd_link_hash_undefweak)
8451 else if (sym_sec != NULL
8452 && sym_sec->output_section != NULL)
8454 value += sym_sec->output_offset;
8455 value += sym_sec->output_section->vma;
8456 value -= htab->elf.tls_sec->vma;
8457 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8458 < (bfd_vma) 1 << 32);
8462 r_type = ELF64_R_TYPE (rel->r_info);
8463 /* If this section has old-style __tls_get_addr calls
8464 without marker relocs, then check that each
8465 __tls_get_addr call reloc is preceded by a reloc
8466 that conceivably belongs to the __tls_get_addr arg
8467 setup insn. If we don't find matching arg setup
8468 relocs, don't do any tls optimization. */
8470 && sec->has_tls_get_addr_call
8472 && (h == &htab->tls_get_addr->elf
8473 || h == &htab->tls_get_addr_fd->elf)
8474 && !found_tls_get_addr_arg
8475 && is_branch_reloc (r_type))
8477 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
8478 "TLS optimization disabled\n"),
8479 ibfd, sec, rel->r_offset);
8484 found_tls_get_addr_arg = 0;
8487 case R_PPC64_GOT_TLSLD16:
8488 case R_PPC64_GOT_TLSLD16_LO:
8489 expecting_tls_get_addr = 1;
8490 found_tls_get_addr_arg = 1;
8493 case R_PPC64_GOT_TLSLD16_HI:
8494 case R_PPC64_GOT_TLSLD16_HA:
8495 /* These relocs should never be against a symbol
8496 defined in a shared lib. Leave them alone if
8497 that turns out to be the case. */
8504 tls_type = TLS_TLS | TLS_LD;
8507 case R_PPC64_GOT_TLSGD16:
8508 case R_PPC64_GOT_TLSGD16_LO:
8509 expecting_tls_get_addr = 1;
8510 found_tls_get_addr_arg = 1;
8513 case R_PPC64_GOT_TLSGD16_HI:
8514 case R_PPC64_GOT_TLSGD16_HA:
8520 tls_set = TLS_TLS | TLS_TPRELGD;
8522 tls_type = TLS_TLS | TLS_GD;
8525 case R_PPC64_GOT_TPREL16_DS:
8526 case R_PPC64_GOT_TPREL16_LO_DS:
8527 case R_PPC64_GOT_TPREL16_HI:
8528 case R_PPC64_GOT_TPREL16_HA:
8533 tls_clear = TLS_TPREL;
8534 tls_type = TLS_TLS | TLS_TPREL;
8541 found_tls_get_addr_arg = 1;
8546 case R_PPC64_TOC16_LO:
8547 if (sym_sec == NULL || sym_sec != toc)
8550 /* Mark this toc entry as referenced by a TLS
8551 code sequence. We can do that now in the
8552 case of R_PPC64_TLS, and after checking for
8553 tls_get_addr for the TOC16 relocs. */
8554 if (toc_ref == NULL)
8555 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8556 if (toc_ref == NULL)
8560 value = h->root.u.def.value;
8562 value = sym->st_value;
8563 value += rel->r_addend;
8566 BFD_ASSERT (value < toc->size
8567 && toc->output_offset % 8 == 0);
8568 toc_ref_index = (value + toc->output_offset) / 8;
8569 if (r_type == R_PPC64_TLS
8570 || r_type == R_PPC64_TLSGD
8571 || r_type == R_PPC64_TLSLD)
8573 toc_ref[toc_ref_index] = 1;
8577 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8582 expecting_tls_get_addr = 2;
8585 case R_PPC64_TPREL64:
8589 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8594 tls_set = TLS_EXPLICIT;
8595 tls_clear = TLS_TPREL;
8600 case R_PPC64_DTPMOD64:
8604 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8606 if (rel + 1 < relend
8608 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8609 && rel[1].r_offset == rel->r_offset + 8)
8613 tls_set = TLS_EXPLICIT | TLS_GD;
8616 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8625 tls_set = TLS_EXPLICIT;
8636 if (!expecting_tls_get_addr
8637 || !sec->has_tls_get_addr_call)
8640 if (rel + 1 < relend
8641 && branch_reloc_hash_match (ibfd, rel + 1,
8643 htab->tls_get_addr_fd))
8645 if (expecting_tls_get_addr == 2)
8647 /* Check for toc tls entries. */
8648 unsigned char *toc_tls;
8651 retval = get_tls_mask (&toc_tls, NULL, NULL,
8656 if (toc_tls != NULL)
8658 if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
8659 found_tls_get_addr_arg = 1;
8661 toc_ref[toc_ref_index] = 1;
8667 if (expecting_tls_get_addr != 1)
8670 /* Uh oh, we didn't find the expected call. We
8671 could just mark this symbol to exclude it
8672 from tls optimization but it's safer to skip
8673 the entire optimization. */
8674 /* xgettext:c-format */
8675 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
8676 "TLS optimization disabled\n"),
8677 ibfd, sec, rel->r_offset);
8682 if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
8684 struct plt_entry *ent;
8685 for (ent = htab->tls_get_addr->elf.plt.plist;
8688 if (ent->addend == 0)
8690 if (ent->plt.refcount > 0)
8692 ent->plt.refcount -= 1;
8693 expecting_tls_get_addr = 0;
8699 if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
8701 struct plt_entry *ent;
8702 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8705 if (ent->addend == 0)
8707 if (ent->plt.refcount > 0)
8708 ent->plt.refcount -= 1;
8716 if ((tls_set & TLS_EXPLICIT) == 0)
8718 struct got_entry *ent;
8720 /* Adjust got entry for this reloc. */
8724 ent = elf_local_got_ents (ibfd)[r_symndx];
8726 for (; ent != NULL; ent = ent->next)
8727 if (ent->addend == rel->r_addend
8728 && ent->owner == ibfd
8729 && ent->tls_type == tls_type)
8736 /* We managed to get rid of a got entry. */
8737 if (ent->got.refcount > 0)
8738 ent->got.refcount -= 1;
8743 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8744 we'll lose one or two dyn relocs. */
8745 if (!dec_dynrel_count (rel->r_info, sec, info,
8749 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8751 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
8757 *tls_mask |= tls_set;
8758 *tls_mask &= ~tls_clear;
8761 if (elf_section_data (sec)->relocs != relstart)
8766 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8768 if (!info->keep_memory)
8771 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8775 if (toc_ref != NULL)
8777 htab->do_tls_opt = 1;
8781 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8782 the values of any global symbols in a toc section that has been
8783 edited. Globals in toc sections should be a rarity, so this function
8784 sets a flag if any are found in toc sections other than the one just
8785 edited, so that further hash table traversals can be avoided. */
8787 struct adjust_toc_info
8790 unsigned long *skip;
8791 bfd_boolean global_toc_syms;
8794 enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8797 adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8799 struct ppc_link_hash_entry *eh;
8800 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
8803 if (h->root.type != bfd_link_hash_defined
8804 && h->root.type != bfd_link_hash_defweak)
8807 eh = (struct ppc_link_hash_entry *) h;
8808 if (eh->adjust_done)
8811 if (eh->elf.root.u.def.section == toc_inf->toc)
8813 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8814 i = toc_inf->toc->rawsize >> 3;
8816 i = eh->elf.root.u.def.value >> 3;
8818 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
8821 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8824 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
8825 eh->elf.root.u.def.value = (bfd_vma) i << 3;
8828 eh->elf.root.u.def.value -= toc_inf->skip[i];
8829 eh->adjust_done = 1;
8831 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8832 toc_inf->global_toc_syms = TRUE;
8837 /* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8838 on a _LO variety toc/got reloc. */
8841 ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
8843 return ((insn & (0x3f << 26)) == 12u << 26 /* addic */
8844 || (insn & (0x3f << 26)) == 14u << 26 /* addi */
8845 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8846 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8847 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8848 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8849 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8850 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8851 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8852 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8853 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8854 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8855 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8856 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8857 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8858 || (insn & (0x3f << 26)) == 56u << 26 /* lq,lfq */
8859 || ((insn & (0x3f << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
8860 /* Exclude lfqu by testing reloc. If relocs are ever
8861 defined for the reduced D field in psq_lu then those
8862 will need testing too. */
8863 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
8864 || ((insn & (0x3f << 26)) == 58u << 26 /* ld,lwa */
8866 || (insn & (0x3f << 26)) == 60u << 26 /* stfq */
8867 || ((insn & (0x3f << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
8868 /* Exclude stfqu. psq_stu as above for psq_lu. */
8869 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
8870 || ((insn & (0x3f << 26)) == 62u << 26 /* std,stq */
8871 && (insn & 1) == 0));
8874 /* Examine all relocs referencing .toc sections in order to remove
8875 unused .toc entries. */
8878 ppc64_elf_edit_toc (struct bfd_link_info *info)
8881 struct adjust_toc_info toc_inf;
8882 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8884 htab->do_toc_opt = 1;
8885 toc_inf.global_toc_syms = TRUE;
8886 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8888 asection *toc, *sec;
8889 Elf_Internal_Shdr *symtab_hdr;
8890 Elf_Internal_Sym *local_syms;
8891 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
8892 unsigned long *skip, *drop;
8893 unsigned char *used;
8894 unsigned char *keep, last, some_unused;
8896 if (!is_ppc64_elf (ibfd))
8899 toc = bfd_get_section_by_name (ibfd, ".toc");
8902 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8903 || discarded_section (toc))
8908 symtab_hdr = &elf_symtab_hdr (ibfd);
8910 /* Look at sections dropped from the final link. */
8913 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8915 if (sec->reloc_count == 0
8916 || !discarded_section (sec)
8917 || get_opd_info (sec)
8918 || (sec->flags & SEC_ALLOC) == 0
8919 || (sec->flags & SEC_DEBUGGING) != 0)
8922 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8923 if (relstart == NULL)
8926 /* Run through the relocs to see which toc entries might be
8928 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8930 enum elf_ppc64_reloc_type r_type;
8931 unsigned long r_symndx;
8933 struct elf_link_hash_entry *h;
8934 Elf_Internal_Sym *sym;
8937 r_type = ELF64_R_TYPE (rel->r_info);
8944 case R_PPC64_TOC16_LO:
8945 case R_PPC64_TOC16_HI:
8946 case R_PPC64_TOC16_HA:
8947 case R_PPC64_TOC16_DS:
8948 case R_PPC64_TOC16_LO_DS:
8952 r_symndx = ELF64_R_SYM (rel->r_info);
8953 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8961 val = h->root.u.def.value;
8963 val = sym->st_value;
8964 val += rel->r_addend;
8966 if (val >= toc->size)
8969 /* Anything in the toc ought to be aligned to 8 bytes.
8970 If not, don't mark as unused. */
8976 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8981 skip[val >> 3] = ref_from_discarded;
8984 if (elf_section_data (sec)->relocs != relstart)
8988 /* For largetoc loads of address constants, we can convert
8989 . addis rx,2,addr@got@ha
8990 . ld ry,addr@got@l(rx)
8992 . addis rx,2,addr@toc@ha
8993 . addi ry,rx,addr@toc@l
8994 when addr is within 2G of the toc pointer. This then means
8995 that the word storing "addr" in the toc is no longer needed. */
8997 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8998 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8999 && toc->reloc_count != 0)
9001 /* Read toc relocs. */
9002 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9004 if (toc_relocs == NULL)
9007 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9009 enum elf_ppc64_reloc_type r_type;
9010 unsigned long r_symndx;
9012 struct elf_link_hash_entry *h;
9013 Elf_Internal_Sym *sym;
9016 r_type = ELF64_R_TYPE (rel->r_info);
9017 if (r_type != R_PPC64_ADDR64)
9020 r_symndx = ELF64_R_SYM (rel->r_info);
9021 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9026 || sym_sec->output_section == NULL
9027 || discarded_section (sym_sec))
9030 if (!SYMBOL_REFERENCES_LOCAL (info, h))
9035 if (h->type == STT_GNU_IFUNC)
9037 val = h->root.u.def.value;
9041 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
9043 val = sym->st_value;
9045 val += rel->r_addend;
9046 val += sym_sec->output_section->vma + sym_sec->output_offset;
9048 /* We don't yet know the exact toc pointer value, but we
9049 know it will be somewhere in the toc section. Don't
9050 optimize if the difference from any possible toc
9051 pointer is outside [ff..f80008000, 7fff7fff]. */
9052 addr = toc->output_section->vma + TOC_BASE_OFF;
9053 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9056 addr = toc->output_section->vma + toc->output_section->rawsize;
9057 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9062 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
9067 skip[rel->r_offset >> 3]
9068 |= can_optimize | ((rel - toc_relocs) << 2);
9075 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
9079 if (local_syms != NULL
9080 && symtab_hdr->contents != (unsigned char *) local_syms)
9084 && elf_section_data (sec)->relocs != relstart)
9086 if (toc_relocs != NULL
9087 && elf_section_data (toc)->relocs != toc_relocs)
9094 /* Now check all kept sections that might reference the toc.
9095 Check the toc itself last. */
9096 for (sec = (ibfd->sections == toc && toc->next ? toc->next
9099 sec = (sec == toc ? NULL
9100 : sec->next == NULL ? toc
9101 : sec->next == toc && toc->next ? toc->next
9106 if (sec->reloc_count == 0
9107 || discarded_section (sec)
9108 || get_opd_info (sec)
9109 || (sec->flags & SEC_ALLOC) == 0
9110 || (sec->flags & SEC_DEBUGGING) != 0)
9113 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9115 if (relstart == NULL)
9121 /* Mark toc entries referenced as used. */
9125 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9127 enum elf_ppc64_reloc_type r_type;
9128 unsigned long r_symndx;
9130 struct elf_link_hash_entry *h;
9131 Elf_Internal_Sym *sym;
9133 enum {no_check, check_lo, check_ha} insn_check;
9135 r_type = ELF64_R_TYPE (rel->r_info);
9139 insn_check = no_check;
9142 case R_PPC64_GOT_TLSLD16_HA:
9143 case R_PPC64_GOT_TLSGD16_HA:
9144 case R_PPC64_GOT_TPREL16_HA:
9145 case R_PPC64_GOT_DTPREL16_HA:
9146 case R_PPC64_GOT16_HA:
9147 case R_PPC64_TOC16_HA:
9148 insn_check = check_ha;
9151 case R_PPC64_GOT_TLSLD16_LO:
9152 case R_PPC64_GOT_TLSGD16_LO:
9153 case R_PPC64_GOT_TPREL16_LO_DS:
9154 case R_PPC64_GOT_DTPREL16_LO_DS:
9155 case R_PPC64_GOT16_LO:
9156 case R_PPC64_GOT16_LO_DS:
9157 case R_PPC64_TOC16_LO:
9158 case R_PPC64_TOC16_LO_DS:
9159 insn_check = check_lo;
9163 if (insn_check != no_check)
9165 bfd_vma off = rel->r_offset & ~3;
9166 unsigned char buf[4];
9169 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9174 insn = bfd_get_32 (ibfd, buf);
9175 if (insn_check == check_lo
9176 ? !ok_lo_toc_insn (insn, r_type)
9177 : ((insn & ((0x3f << 26) | 0x1f << 16))
9178 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9182 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9183 sprintf (str, "%#08x", insn);
9184 info->callbacks->einfo
9185 /* xgettext:c-format */
9186 (_("%H: toc optimization is not supported for"
9187 " %s instruction.\n"),
9188 ibfd, sec, rel->r_offset & ~3, str);
9195 case R_PPC64_TOC16_LO:
9196 case R_PPC64_TOC16_HI:
9197 case R_PPC64_TOC16_HA:
9198 case R_PPC64_TOC16_DS:
9199 case R_PPC64_TOC16_LO_DS:
9200 /* In case we're taking addresses of toc entries. */
9201 case R_PPC64_ADDR64:
9208 r_symndx = ELF64_R_SYM (rel->r_info);
9209 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9220 val = h->root.u.def.value;
9222 val = sym->st_value;
9223 val += rel->r_addend;
9225 if (val >= toc->size)
9228 if ((skip[val >> 3] & can_optimize) != 0)
9235 case R_PPC64_TOC16_HA:
9238 case R_PPC64_TOC16_LO_DS:
9239 off = rel->r_offset;
9240 off += (bfd_big_endian (ibfd) ? -2 : 3);
9241 if (!bfd_get_section_contents (ibfd, sec, &opc,
9247 if ((opc & (0x3f << 2)) == (58u << 2))
9252 /* Wrong sort of reloc, or not a ld. We may
9253 as well clear ref_from_discarded too. */
9260 /* For the toc section, we only mark as used if this
9261 entry itself isn't unused. */
9262 else if ((used[rel->r_offset >> 3]
9263 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
9266 /* Do all the relocs again, to catch reference
9275 if (elf_section_data (sec)->relocs != relstart)
9279 /* Merge the used and skip arrays. Assume that TOC
9280 doublewords not appearing as either used or unused belong
9281 to an entry more than one doubleword in size. */
9282 for (drop = skip, keep = used, last = 0, some_unused = 0;
9283 drop < skip + (toc->size + 7) / 8;
9288 *drop &= ~ref_from_discarded;
9289 if ((*drop & can_optimize) != 0)
9293 else if ((*drop & ref_from_discarded) != 0)
9296 last = ref_from_discarded;
9306 bfd_byte *contents, *src;
9308 Elf_Internal_Sym *sym;
9309 bfd_boolean local_toc_syms = FALSE;
9311 /* Shuffle the toc contents, and at the same time convert the
9312 skip array from booleans into offsets. */
9313 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
9316 elf_section_data (toc)->this_hdr.contents = contents;
9318 for (src = contents, off = 0, drop = skip;
9319 src < contents + toc->size;
9322 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9327 memcpy (src - off, src, 8);
9331 toc->rawsize = toc->size;
9332 toc->size = src - contents - off;
9334 /* Adjust addends for relocs against the toc section sym,
9335 and optimize any accesses we can. */
9336 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9338 if (sec->reloc_count == 0
9339 || discarded_section (sec))
9342 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9344 if (relstart == NULL)
9347 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9349 enum elf_ppc64_reloc_type r_type;
9350 unsigned long r_symndx;
9352 struct elf_link_hash_entry *h;
9355 r_type = ELF64_R_TYPE (rel->r_info);
9362 case R_PPC64_TOC16_LO:
9363 case R_PPC64_TOC16_HI:
9364 case R_PPC64_TOC16_HA:
9365 case R_PPC64_TOC16_DS:
9366 case R_PPC64_TOC16_LO_DS:
9367 case R_PPC64_ADDR64:
9371 r_symndx = ELF64_R_SYM (rel->r_info);
9372 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9380 val = h->root.u.def.value;
9383 val = sym->st_value;
9385 local_toc_syms = TRUE;
9388 val += rel->r_addend;
9390 if (val > toc->rawsize)
9392 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9394 else if ((skip[val >> 3] & can_optimize) != 0)
9396 Elf_Internal_Rela *tocrel
9397 = toc_relocs + (skip[val >> 3] >> 2);
9398 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9402 case R_PPC64_TOC16_HA:
9403 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9406 case R_PPC64_TOC16_LO_DS:
9407 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9411 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9413 info->callbacks->einfo
9414 /* xgettext:c-format */
9415 (_("%H: %s references "
9416 "optimized away TOC entry\n"),
9417 ibfd, sec, rel->r_offset,
9418 ppc64_elf_howto_table[r_type]->name);
9419 bfd_set_error (bfd_error_bad_value);
9422 rel->r_addend = tocrel->r_addend;
9423 elf_section_data (sec)->relocs = relstart;
9427 if (h != NULL || sym->st_value != 0)
9430 rel->r_addend -= skip[val >> 3];
9431 elf_section_data (sec)->relocs = relstart;
9434 if (elf_section_data (sec)->relocs != relstart)
9438 /* We shouldn't have local or global symbols defined in the TOC,
9439 but handle them anyway. */
9440 if (local_syms != NULL)
9441 for (sym = local_syms;
9442 sym < local_syms + symtab_hdr->sh_info;
9444 if (sym->st_value != 0
9445 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9449 if (sym->st_value > toc->rawsize)
9450 i = toc->rawsize >> 3;
9452 i = sym->st_value >> 3;
9454 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9458 (_("%s defined on removed toc entry"),
9459 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9462 while ((skip[i] & (ref_from_discarded | can_optimize)));
9463 sym->st_value = (bfd_vma) i << 3;
9466 sym->st_value -= skip[i];
9467 symtab_hdr->contents = (unsigned char *) local_syms;
9470 /* Adjust any global syms defined in this toc input section. */
9471 if (toc_inf.global_toc_syms)
9474 toc_inf.skip = skip;
9475 toc_inf.global_toc_syms = FALSE;
9476 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9480 if (toc->reloc_count != 0)
9482 Elf_Internal_Shdr *rel_hdr;
9483 Elf_Internal_Rela *wrel;
9486 /* Remove unused toc relocs, and adjust those we keep. */
9487 if (toc_relocs == NULL)
9488 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9490 if (toc_relocs == NULL)
9494 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9495 if ((skip[rel->r_offset >> 3]
9496 & (ref_from_discarded | can_optimize)) == 0)
9498 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9499 wrel->r_info = rel->r_info;
9500 wrel->r_addend = rel->r_addend;
9503 else if (!dec_dynrel_count (rel->r_info, toc, info,
9504 &local_syms, NULL, NULL))
9507 elf_section_data (toc)->relocs = toc_relocs;
9508 toc->reloc_count = wrel - toc_relocs;
9509 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9510 sz = rel_hdr->sh_entsize;
9511 rel_hdr->sh_size = toc->reloc_count * sz;
9514 else if (toc_relocs != NULL
9515 && elf_section_data (toc)->relocs != toc_relocs)
9518 if (local_syms != NULL
9519 && symtab_hdr->contents != (unsigned char *) local_syms)
9521 if (!info->keep_memory)
9524 symtab_hdr->contents = (unsigned char *) local_syms;
9532 /* Return true iff input section I references the TOC using
9533 instructions limited to +/-32k offsets. */
9536 ppc64_elf_has_small_toc_reloc (asection *i)
9538 return (is_ppc64_elf (i->owner)
9539 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9542 /* Allocate space for one GOT entry. */
9545 allocate_got (struct elf_link_hash_entry *h,
9546 struct bfd_link_info *info,
9547 struct got_entry *gent)
9549 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9550 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9551 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9553 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9554 ? 2 : 1) * sizeof (Elf64_External_Rela);
9555 asection *got = ppc64_elf_tdata (gent->owner)->got;
9557 gent->got.offset = got->size;
9558 got->size += entsize;
9560 if (h->type == STT_GNU_IFUNC)
9562 htab->elf.irelplt->size += rentsize;
9563 htab->got_reli_size += rentsize;
9565 else if ((bfd_link_pic (info)
9566 || (htab->elf.dynamic_sections_created
9568 && !SYMBOL_REFERENCES_LOCAL (info, h)))
9569 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9571 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
9572 relgot->size += rentsize;
9576 /* This function merges got entries in the same toc group. */
9579 merge_got_entries (struct got_entry **pent)
9581 struct got_entry *ent, *ent2;
9583 for (ent = *pent; ent != NULL; ent = ent->next)
9584 if (!ent->is_indirect)
9585 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9586 if (!ent2->is_indirect
9587 && ent2->addend == ent->addend
9588 && ent2->tls_type == ent->tls_type
9589 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9591 ent2->is_indirect = TRUE;
9592 ent2->got.ent = ent;
9596 /* If H is undefined, make it dynamic if that makes sense. */
9599 ensure_undef_dynamic (struct bfd_link_info *info,
9600 struct elf_link_hash_entry *h)
9602 struct elf_link_hash_table *htab = elf_hash_table (info);
9604 if (htab->dynamic_sections_created
9605 && ((info->dynamic_undefined_weak != 0
9606 && h->root.type == bfd_link_hash_undefweak)
9607 || h->root.type == bfd_link_hash_undefined)
9610 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9611 return bfd_elf_link_record_dynamic_symbol (info, h);
9615 /* Allocate space in .plt, .got and associated reloc sections for
9619 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9621 struct bfd_link_info *info;
9622 struct ppc_link_hash_table *htab;
9624 struct ppc_link_hash_entry *eh;
9625 struct got_entry **pgent, *gent;
9627 if (h->root.type == bfd_link_hash_indirect)
9630 info = (struct bfd_link_info *) inf;
9631 htab = ppc_hash_table (info);
9635 eh = (struct ppc_link_hash_entry *) h;
9636 /* Run through the TLS GD got entries first if we're changing them
9638 if ((eh->tls_mask & TLS_TPRELGD) != 0)
9639 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9640 if (gent->got.refcount > 0
9641 && (gent->tls_type & TLS_GD) != 0)
9643 /* This was a GD entry that has been converted to TPREL. If
9644 there happens to be a TPREL entry we can use that one. */
9645 struct got_entry *ent;
9646 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9647 if (ent->got.refcount > 0
9648 && (ent->tls_type & TLS_TPREL) != 0
9649 && ent->addend == gent->addend
9650 && ent->owner == gent->owner)
9652 gent->got.refcount = 0;
9656 /* If not, then we'll be using our own TPREL entry. */
9657 if (gent->got.refcount != 0)
9658 gent->tls_type = TLS_TLS | TLS_TPREL;
9661 /* Remove any list entry that won't generate a word in the GOT before
9662 we call merge_got_entries. Otherwise we risk merging to empty
9664 pgent = &h->got.glist;
9665 while ((gent = *pgent) != NULL)
9666 if (gent->got.refcount > 0)
9668 if ((gent->tls_type & TLS_LD) != 0
9671 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9672 *pgent = gent->next;
9675 pgent = &gent->next;
9678 *pgent = gent->next;
9680 if (!htab->do_multi_toc)
9681 merge_got_entries (&h->got.glist);
9683 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9684 if (!gent->is_indirect)
9686 /* Make sure this symbol is output as a dynamic symbol. */
9687 if (!ensure_undef_dynamic (info, h))
9690 if (!is_ppc64_elf (gent->owner))
9693 allocate_got (h, info, gent);
9696 /* If no dynamic sections we can't have dynamic relocs, except for
9697 IFUNCs which are handled even in static executables. */
9698 if (!htab->elf.dynamic_sections_created
9699 && h->type != STT_GNU_IFUNC)
9700 eh->dyn_relocs = NULL;
9702 /* Also discard relocs on undefined weak syms with non-default
9703 visibility, or when dynamic_undefined_weak says so. */
9704 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9705 eh->dyn_relocs = NULL;
9707 if (eh->dyn_relocs != NULL)
9709 struct elf_dyn_relocs *p, **pp;
9711 /* In the shared -Bsymbolic case, discard space allocated for
9712 dynamic pc-relative relocs against symbols which turn out to
9713 be defined in regular objects. For the normal shared case,
9714 discard space for relocs that have become local due to symbol
9715 visibility changes. */
9717 if (bfd_link_pic (info))
9719 /* Relocs that use pc_count are those that appear on a call
9720 insn, or certain REL relocs (see must_be_dyn_reloc) that
9721 can be generated via assembly. We want calls to
9722 protected symbols to resolve directly to the function
9723 rather than going via the plt. If people want function
9724 pointer comparisons to work as expected then they should
9725 avoid writing weird assembly. */
9726 if (SYMBOL_CALLS_LOCAL (info, h))
9728 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9730 p->count -= p->pc_count;
9739 if (eh->dyn_relocs != NULL)
9741 /* Make sure this symbol is output as a dynamic symbol. */
9742 if (!ensure_undef_dynamic (info, h))
9746 else if (h->type == STT_GNU_IFUNC)
9748 /* A plt entry is always created when making direct calls to
9749 an ifunc, even when building a static executable, but
9750 that doesn't cover all cases. We may have only an ifunc
9751 initialised function pointer for a given ifunc symbol.
9753 For ELFv2, dynamic relocations are not required when
9754 generating a global entry PLT stub. */
9755 if (abiversion (info->output_bfd) >= 2)
9757 if (global_entry_stub (h))
9758 eh->dyn_relocs = NULL;
9761 /* For ELFv1 we have function descriptors. Descriptors need
9762 to be treated like PLT entries and thus have dynamic
9763 relocations. One exception is when the function
9764 descriptor is copied into .dynbss (which should only
9765 happen with ancient versions of gcc). */
9766 else if (h->needs_copy)
9767 eh->dyn_relocs = NULL;
9769 else if (ELIMINATE_COPY_RELOCS)
9771 /* For the non-pic case, discard space for relocs against
9772 symbols which turn out to need copy relocs or are not
9777 /* Make sure this symbol is output as a dynamic symbol. */
9778 if (!ensure_undef_dynamic (info, h))
9781 if (h->dynindx == -1)
9782 eh->dyn_relocs = NULL;
9785 eh->dyn_relocs = NULL;
9788 /* Finally, allocate space. */
9789 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9791 asection *sreloc = elf_section_data (p->sec)->sreloc;
9792 if (eh->elf.type == STT_GNU_IFUNC)
9793 sreloc = htab->elf.irelplt;
9794 sreloc->size += p->count * sizeof (Elf64_External_Rela);
9798 if ((htab->elf.dynamic_sections_created
9799 && h->dynindx != -1)
9800 || h->type == STT_GNU_IFUNC)
9802 struct plt_entry *pent;
9803 bfd_boolean doneone = FALSE;
9804 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9805 if (pent->plt.refcount > 0)
9807 if (!htab->elf.dynamic_sections_created
9808 || h->dynindx == -1)
9811 pent->plt.offset = s->size;
9812 s->size += PLT_ENTRY_SIZE (htab);
9813 s = htab->elf.irelplt;
9817 /* If this is the first .plt entry, make room for the special
9821 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
9823 pent->plt.offset = s->size;
9825 /* Make room for this entry. */
9826 s->size += PLT_ENTRY_SIZE (htab);
9828 /* Make room for the .glink code. */
9831 s->size += GLINK_CALL_STUB_SIZE;
9834 /* We need bigger stubs past index 32767. */
9835 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
9842 /* We also need to make an entry in the .rela.plt section. */
9843 s = htab->elf.srelplt;
9845 s->size += sizeof (Elf64_External_Rela);
9849 pent->plt.offset = (bfd_vma) -1;
9852 h->plt.plist = NULL;
9858 h->plt.plist = NULL;
9865 /* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9866 to set up space for global entry stubs. These are put in glink,
9867 after the branch table. */
9870 size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
9872 struct bfd_link_info *info;
9873 struct ppc_link_hash_table *htab;
9874 struct plt_entry *pent;
9877 if (h->root.type == bfd_link_hash_indirect)
9880 if (!h->pointer_equality_needed)
9887 htab = ppc_hash_table (info);
9892 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9893 if (pent->plt.offset != (bfd_vma) -1
9894 && pent->addend == 0)
9896 /* For ELFv2, if this symbol is not defined in a regular file
9897 and we are not generating a shared library or pie, then we
9898 need to define the symbol in the executable on a call stub.
9899 This is to avoid text relocations. */
9900 s->size = (s->size + 15) & -16;
9901 h->root.type = bfd_link_hash_defined;
9902 h->root.u.def.section = s;
9903 h->root.u.def.value = s->size;
9910 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
9911 read-only sections. */
9914 maybe_set_textrel (struct elf_link_hash_entry *h, void *info)
9916 if (h->root.type == bfd_link_hash_indirect)
9919 if (readonly_dynrelocs (h))
9921 ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
9923 /* Not an error, just cut short the traversal. */
9929 /* Set the sizes of the dynamic sections. */
9932 ppc64_elf_size_dynamic_sections (bfd *output_bfd,
9933 struct bfd_link_info *info)
9935 struct ppc_link_hash_table *htab;
9940 struct got_entry *first_tlsld;
9942 htab = ppc_hash_table (info);
9946 dynobj = htab->elf.dynobj;
9950 if (htab->elf.dynamic_sections_created)
9952 /* Set the contents of the .interp section to the interpreter. */
9953 if (bfd_link_executable (info) && !info->nointerp)
9955 s = bfd_get_linker_section (dynobj, ".interp");
9958 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
9959 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9963 /* Set up .got offsets for local syms, and space for local dynamic
9965 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9967 struct got_entry **lgot_ents;
9968 struct got_entry **end_lgot_ents;
9969 struct plt_entry **local_plt;
9970 struct plt_entry **end_local_plt;
9971 unsigned char *lgot_masks;
9972 bfd_size_type locsymcount;
9973 Elf_Internal_Shdr *symtab_hdr;
9975 if (!is_ppc64_elf (ibfd))
9978 for (s = ibfd->sections; s != NULL; s = s->next)
9980 struct ppc_dyn_relocs *p;
9982 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
9984 if (!bfd_is_abs_section (p->sec)
9985 && bfd_is_abs_section (p->sec->output_section))
9987 /* Input section has been discarded, either because
9988 it is a copy of a linkonce section or due to
9989 linker script /DISCARD/, so we'll be discarding
9992 else if (p->count != 0)
9994 asection *srel = elf_section_data (p->sec)->sreloc;
9996 srel = htab->elf.irelplt;
9997 srel->size += p->count * sizeof (Elf64_External_Rela);
9998 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9999 info->flags |= DF_TEXTREL;
10004 lgot_ents = elf_local_got_ents (ibfd);
10008 symtab_hdr = &elf_symtab_hdr (ibfd);
10009 locsymcount = symtab_hdr->sh_info;
10010 end_lgot_ents = lgot_ents + locsymcount;
10011 local_plt = (struct plt_entry **) end_lgot_ents;
10012 end_local_plt = local_plt + locsymcount;
10013 lgot_masks = (unsigned char *) end_local_plt;
10014 s = ppc64_elf_tdata (ibfd)->got;
10015 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
10017 struct got_entry **pent, *ent;
10020 while ((ent = *pent) != NULL)
10021 if (ent->got.refcount > 0)
10023 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
10025 ppc64_tlsld_got (ibfd)->got.refcount += 1;
10030 unsigned int ent_size = 8;
10031 unsigned int rel_size = sizeof (Elf64_External_Rela);
10033 ent->got.offset = s->size;
10034 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
10039 s->size += ent_size;
10040 if ((*lgot_masks & PLT_IFUNC) != 0)
10042 htab->elf.irelplt->size += rel_size;
10043 htab->got_reli_size += rel_size;
10045 else if (bfd_link_pic (info))
10047 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10048 srel->size += rel_size;
10057 /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
10058 for (; local_plt < end_local_plt; ++local_plt)
10060 struct plt_entry *ent;
10062 for (ent = *local_plt; ent != NULL; ent = ent->next)
10063 if (ent->plt.refcount > 0)
10065 s = htab->elf.iplt;
10066 ent->plt.offset = s->size;
10067 s->size += PLT_ENTRY_SIZE (htab);
10069 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
10072 ent->plt.offset = (bfd_vma) -1;
10076 /* Allocate global sym .plt and .got entries, and space for global
10077 sym dynamic relocs. */
10078 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
10079 /* Stash the end of glink branch table. */
10080 if (htab->glink != NULL)
10081 htab->glink->rawsize = htab->glink->size;
10083 if (!htab->opd_abi && !bfd_link_pic (info))
10084 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
10086 first_tlsld = NULL;
10087 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10089 struct got_entry *ent;
10091 if (!is_ppc64_elf (ibfd))
10094 ent = ppc64_tlsld_got (ibfd);
10095 if (ent->got.refcount > 0)
10097 if (!htab->do_multi_toc && first_tlsld != NULL)
10099 ent->is_indirect = TRUE;
10100 ent->got.ent = first_tlsld;
10104 if (first_tlsld == NULL)
10106 s = ppc64_elf_tdata (ibfd)->got;
10107 ent->got.offset = s->size;
10110 if (bfd_link_pic (info))
10112 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10113 srel->size += sizeof (Elf64_External_Rela);
10118 ent->got.offset = (bfd_vma) -1;
10121 /* We now have determined the sizes of the various dynamic sections.
10122 Allocate memory for them. */
10124 for (s = dynobj->sections; s != NULL; s = s->next)
10126 if ((s->flags & SEC_LINKER_CREATED) == 0)
10129 if (s == htab->brlt || s == htab->relbrlt)
10130 /* These haven't been allocated yet; don't strip. */
10132 else if (s == htab->elf.sgot
10133 || s == htab->elf.splt
10134 || s == htab->elf.iplt
10135 || s == htab->glink
10136 || s == htab->elf.sdynbss
10137 || s == htab->elf.sdynrelro)
10139 /* Strip this section if we don't need it; see the
10142 else if (s == htab->glink_eh_frame)
10144 if (!bfd_is_abs_section (s->output_section))
10145 /* Not sized yet. */
10148 else if (CONST_STRNEQ (s->name, ".rela"))
10152 if (s != htab->elf.srelplt)
10155 /* We use the reloc_count field as a counter if we need
10156 to copy relocs into the output file. */
10157 s->reloc_count = 0;
10162 /* It's not one of our sections, so don't allocate space. */
10168 /* If we don't need this section, strip it from the
10169 output file. This is mostly to handle .rela.bss and
10170 .rela.plt. We must create both sections in
10171 create_dynamic_sections, because they must be created
10172 before the linker maps input sections to output
10173 sections. The linker does that before
10174 adjust_dynamic_symbol is called, and it is that
10175 function which decides whether anything needs to go
10176 into these sections. */
10177 s->flags |= SEC_EXCLUDE;
10181 if ((s->flags & SEC_HAS_CONTENTS) == 0)
10184 /* Allocate memory for the section contents. We use bfd_zalloc
10185 here in case unused entries are not reclaimed before the
10186 section's contents are written out. This should not happen,
10187 but this way if it does we get a R_PPC64_NONE reloc in .rela
10188 sections instead of garbage.
10189 We also rely on the section contents being zero when writing
10190 the GOT and .dynrelro. */
10191 s->contents = bfd_zalloc (dynobj, s->size);
10192 if (s->contents == NULL)
10196 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10198 if (!is_ppc64_elf (ibfd))
10201 s = ppc64_elf_tdata (ibfd)->got;
10202 if (s != NULL && s != htab->elf.sgot)
10205 s->flags |= SEC_EXCLUDE;
10208 s->contents = bfd_zalloc (ibfd, s->size);
10209 if (s->contents == NULL)
10213 s = ppc64_elf_tdata (ibfd)->relgot;
10217 s->flags |= SEC_EXCLUDE;
10220 s->contents = bfd_zalloc (ibfd, s->size);
10221 if (s->contents == NULL)
10224 s->reloc_count = 0;
10229 if (htab->elf.dynamic_sections_created)
10231 bfd_boolean tls_opt;
10233 /* Add some entries to the .dynamic section. We fill in the
10234 values later, in ppc64_elf_finish_dynamic_sections, but we
10235 must add the entries now so that we get the correct size for
10236 the .dynamic section. The DT_DEBUG entry is filled in by the
10237 dynamic linker and used by the debugger. */
10238 #define add_dynamic_entry(TAG, VAL) \
10239 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
10241 if (bfd_link_executable (info))
10243 if (!add_dynamic_entry (DT_DEBUG, 0))
10247 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
10249 if (!add_dynamic_entry (DT_PLTGOT, 0)
10250 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10251 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
10252 || !add_dynamic_entry (DT_JMPREL, 0)
10253 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
10257 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
10259 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10260 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
10264 tls_opt = (htab->params->tls_get_addr_opt
10265 && htab->tls_get_addr_fd != NULL
10266 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
10267 if (tls_opt || !htab->opd_abi)
10269 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10275 if (!add_dynamic_entry (DT_RELA, 0)
10276 || !add_dynamic_entry (DT_RELASZ, 0)
10277 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
10280 /* If any dynamic relocs apply to a read-only section,
10281 then we need a DT_TEXTREL entry. */
10282 if ((info->flags & DF_TEXTREL) == 0)
10283 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
10285 if ((info->flags & DF_TEXTREL) != 0)
10287 if (!add_dynamic_entry (DT_TEXTREL, 0))
10292 #undef add_dynamic_entry
10297 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10300 ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10302 if (h->plt.plist != NULL
10304 && !h->pointer_equality_needed)
10307 return _bfd_elf_hash_symbol (h);
10310 /* Determine the type of stub needed, if any, for a call. */
10312 static inline enum ppc_stub_type
10313 ppc_type_of_stub (asection *input_sec,
10314 const Elf_Internal_Rela *rel,
10315 struct ppc_link_hash_entry **hash,
10316 struct plt_entry **plt_ent,
10317 bfd_vma destination,
10318 unsigned long local_off)
10320 struct ppc_link_hash_entry *h = *hash;
10322 bfd_vma branch_offset;
10323 bfd_vma max_branch_offset;
10324 enum elf_ppc64_reloc_type r_type;
10328 struct plt_entry *ent;
10329 struct ppc_link_hash_entry *fdh = h;
10331 && h->oh->is_func_descriptor)
10333 fdh = ppc_follow_link (h->oh);
10337 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10338 if (ent->addend == rel->r_addend
10339 && ent->plt.offset != (bfd_vma) -1)
10342 return ppc_stub_plt_call;
10345 /* Here, we know we don't have a plt entry. If we don't have a
10346 either a defined function descriptor or a defined entry symbol
10347 in a regular object file, then it is pointless trying to make
10348 any other type of stub. */
10349 if (!is_static_defined (&fdh->elf)
10350 && !is_static_defined (&h->elf))
10351 return ppc_stub_none;
10353 else if (elf_local_got_ents (input_sec->owner) != NULL)
10355 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10356 struct plt_entry **local_plt = (struct plt_entry **)
10357 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10358 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10360 if (local_plt[r_symndx] != NULL)
10362 struct plt_entry *ent;
10364 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10365 if (ent->addend == rel->r_addend
10366 && ent->plt.offset != (bfd_vma) -1)
10369 return ppc_stub_plt_call;
10374 /* Determine where the call point is. */
10375 location = (input_sec->output_offset
10376 + input_sec->output_section->vma
10379 branch_offset = destination - location;
10380 r_type = ELF64_R_TYPE (rel->r_info);
10382 /* Determine if a long branch stub is needed. */
10383 max_branch_offset = 1 << 25;
10384 if (r_type != R_PPC64_REL24)
10385 max_branch_offset = 1 << 15;
10387 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
10388 /* We need a stub. Figure out whether a long_branch or plt_branch
10389 is needed later. */
10390 return ppc_stub_long_branch;
10392 return ppc_stub_none;
10395 /* With power7 weakly ordered memory model, it is possible for ld.so
10396 to update a plt entry in one thread and have another thread see a
10397 stale zero toc entry. To avoid this we need some sort of acquire
10398 barrier in the call stub. One solution is to make the load of the
10399 toc word seem to appear to depend on the load of the function entry
10400 word. Another solution is to test for r2 being zero, and branch to
10401 the appropriate glink entry if so.
10403 . fake dep barrier compare
10404 . ld 12,xxx(2) ld 12,xxx(2)
10405 . mtctr 12 mtctr 12
10406 . xor 11,12,12 ld 2,xxx+8(2)
10407 . add 2,2,11 cmpldi 2,0
10408 . ld 2,xxx+8(2) bnectr+
10409 . bctr b <glink_entry>
10411 The solution involving the compare turns out to be faster, so
10412 that's what we use unless the branch won't reach. */
10414 #define ALWAYS_USE_FAKE_DEP 0
10415 #define ALWAYS_EMIT_R2SAVE 0
10417 #define PPC_LO(v) ((v) & 0xffff)
10418 #define PPC_HI(v) (((v) >> 16) & 0xffff)
10419 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
10421 static inline unsigned int
10422 plt_stub_size (struct ppc_link_hash_table *htab,
10423 struct ppc_stub_hash_entry *stub_entry,
10426 unsigned size = 12;
10428 if (ALWAYS_EMIT_R2SAVE
10429 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10431 if (PPC_HA (off) != 0)
10436 if (htab->params->plt_static_chain)
10438 if (htab->params->plt_thread_safe
10439 && htab->elf.dynamic_sections_created
10440 && stub_entry->h != NULL
10441 && stub_entry->h->elf.dynindx != -1)
10443 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
10446 if (stub_entry->h != NULL
10447 && (stub_entry->h == htab->tls_get_addr_fd
10448 || stub_entry->h == htab->tls_get_addr)
10449 && htab->params->tls_get_addr_opt)
10452 if (ALWAYS_EMIT_R2SAVE
10453 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10459 /* Depending on the sign of plt_stub_align:
10460 If positive, return the padding to align to a 2**plt_stub_align
10462 If negative, if this stub would cross fewer 2**plt_stub_align
10463 boundaries if we align, then return the padding needed to do so. */
10465 static inline unsigned int
10466 plt_stub_pad (struct ppc_link_hash_table *htab,
10467 struct ppc_stub_hash_entry *stub_entry,
10471 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
10472 bfd_vma stub_off = stub_entry->group->stub_sec->size;
10474 if (htab->params->plt_stub_align >= 0)
10476 stub_align = 1 << htab->params->plt_stub_align;
10477 if ((stub_off & (stub_align - 1)) != 0)
10478 return stub_align - (stub_off & (stub_align - 1));
10482 stub_align = 1 << -htab->params->plt_stub_align;
10483 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
10484 > ((stub_size - 1) & -stub_align))
10485 return stub_align - (stub_off & (stub_align - 1));
10489 /* Build a .plt call stub. */
10491 static inline bfd_byte *
10492 build_plt_stub (struct ppc_link_hash_table *htab,
10493 struct ppc_stub_hash_entry *stub_entry,
10494 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10496 bfd *obfd = htab->params->stub_bfd;
10497 bfd_boolean plt_load_toc = htab->opd_abi;
10498 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
10499 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10500 && htab->elf.dynamic_sections_created
10501 && stub_entry->h != NULL
10502 && stub_entry->h->elf.dynindx != -1);
10503 bfd_boolean use_fake_dep = plt_thread_safe;
10504 bfd_vma cmp_branch_off = 0;
10506 if (!ALWAYS_USE_FAKE_DEP
10509 && !((stub_entry->h == htab->tls_get_addr_fd
10510 || stub_entry->h == htab->tls_get_addr)
10511 && htab->params->tls_get_addr_opt))
10513 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
10514 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10515 / PLT_ENTRY_SIZE (htab));
10516 bfd_vma glinkoff = GLINK_CALL_STUB_SIZE + pltindex * 8;
10519 if (pltindex > 32768)
10520 glinkoff += (pltindex - 32768) * 4;
10522 + htab->glink->output_offset
10523 + htab->glink->output_section->vma);
10524 from = (p - stub_entry->group->stub_sec->contents
10525 + 4 * (ALWAYS_EMIT_R2SAVE
10526 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10527 + 4 * (PPC_HA (offset) != 0)
10528 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10529 != PPC_HA (offset))
10530 + 4 * (plt_static_chain != 0)
10532 + stub_entry->group->stub_sec->output_offset
10533 + stub_entry->group->stub_sec->output_section->vma);
10534 cmp_branch_off = to - from;
10535 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10538 if (PPC_HA (offset) != 0)
10542 if (ALWAYS_EMIT_R2SAVE
10543 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10544 r[0].r_offset += 4;
10545 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10546 r[1].r_offset = r[0].r_offset + 4;
10547 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10548 r[1].r_addend = r[0].r_addend;
10551 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10553 r[2].r_offset = r[1].r_offset + 4;
10554 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10555 r[2].r_addend = r[0].r_addend;
10559 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10560 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10561 r[2].r_addend = r[0].r_addend + 8;
10562 if (plt_static_chain)
10564 r[3].r_offset = r[2].r_offset + 4;
10565 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10566 r[3].r_addend = r[0].r_addend + 16;
10571 if (ALWAYS_EMIT_R2SAVE
10572 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10573 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10576 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10577 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10581 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10582 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10585 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10587 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
10590 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10595 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10596 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10598 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10599 if (plt_static_chain)
10600 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
10607 if (ALWAYS_EMIT_R2SAVE
10608 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10609 r[0].r_offset += 4;
10610 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10613 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10615 r[1].r_offset = r[0].r_offset + 4;
10616 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10617 r[1].r_addend = r[0].r_addend;
10621 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10622 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10623 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10624 if (plt_static_chain)
10626 r[2].r_offset = r[1].r_offset + 4;
10627 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10628 r[2].r_addend = r[0].r_addend + 8;
10633 if (ALWAYS_EMIT_R2SAVE
10634 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10635 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10636 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
10638 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10640 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10643 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10648 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10649 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10651 if (plt_static_chain)
10652 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10653 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
10656 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
10658 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10659 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
10660 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
10663 bfd_put_32 (obfd, BCTR, p), p += 4;
10667 /* Build a special .plt call stub for __tls_get_addr. */
10669 #define LD_R11_0R3 0xe9630000
10670 #define LD_R12_0R3 0xe9830000
10671 #define MR_R0_R3 0x7c601b78
10672 #define CMPDI_R11_0 0x2c2b0000
10673 #define ADD_R3_R12_R13 0x7c6c6a14
10674 #define BEQLR 0x4d820020
10675 #define MR_R3_R0 0x7c030378
10676 #define STD_R11_0R1 0xf9610000
10677 #define BCTRL 0x4e800421
10678 #define LD_R11_0R1 0xe9610000
10679 #define MTLR_R11 0x7d6803a6
10681 static inline bfd_byte *
10682 build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10683 struct ppc_stub_hash_entry *stub_entry,
10684 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10686 bfd *obfd = htab->params->stub_bfd;
10688 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10689 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10690 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10691 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10692 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10693 bfd_put_32 (obfd, BEQLR, p), p += 4;
10694 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
10696 r[0].r_offset += 7 * 4;
10697 if (!ALWAYS_EMIT_R2SAVE
10698 && stub_entry->stub_type != ppc_stub_plt_call_r2save)
10699 return build_plt_stub (htab, stub_entry, p, offset, r);
10701 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
10702 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10705 r[0].r_offset += 2 * 4;
10706 p = build_plt_stub (htab, stub_entry, p, offset, r);
10707 bfd_put_32 (obfd, BCTRL, p - 4);
10709 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
10710 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10711 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10712 bfd_put_32 (obfd, BLR, p), p += 4;
10717 static Elf_Internal_Rela *
10718 get_relocs (asection *sec, int count)
10720 Elf_Internal_Rela *relocs;
10721 struct bfd_elf_section_data *elfsec_data;
10723 elfsec_data = elf_section_data (sec);
10724 relocs = elfsec_data->relocs;
10725 if (relocs == NULL)
10727 bfd_size_type relsize;
10728 relsize = sec->reloc_count * sizeof (*relocs);
10729 relocs = bfd_alloc (sec->owner, relsize);
10730 if (relocs == NULL)
10732 elfsec_data->relocs = relocs;
10733 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10734 sizeof (Elf_Internal_Shdr));
10735 if (elfsec_data->rela.hdr == NULL)
10737 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10738 * sizeof (Elf64_External_Rela));
10739 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
10740 sec->reloc_count = 0;
10742 relocs += sec->reloc_count;
10743 sec->reloc_count += count;
10748 get_r2off (struct bfd_link_info *info,
10749 struct ppc_stub_hash_entry *stub_entry)
10751 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10752 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
10756 /* Support linking -R objects. Get the toc pointer from the
10759 if (!htab->opd_abi)
10761 asection *opd = stub_entry->h->elf.root.u.def.section;
10762 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
10764 if (strcmp (opd->name, ".opd") != 0
10765 || opd->reloc_count != 0)
10767 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%T'\n"),
10768 stub_entry->h->elf.root.root.string);
10769 bfd_set_error (bfd_error_bad_value);
10770 return (bfd_vma) -1;
10772 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
10773 return (bfd_vma) -1;
10774 r2off = bfd_get_64 (opd->owner, buf);
10775 r2off -= elf_gp (info->output_bfd);
10777 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
10782 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10784 struct ppc_stub_hash_entry *stub_entry;
10785 struct ppc_branch_hash_entry *br_entry;
10786 struct bfd_link_info *info;
10787 struct ppc_link_hash_table *htab;
10792 Elf_Internal_Rela *r;
10795 /* Massage our args to the form they really have. */
10796 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10799 htab = ppc_hash_table (info);
10803 /* Make a note of the offset within the stubs for this entry. */
10804 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
10805 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
10807 htab->stub_count[stub_entry->stub_type - 1] += 1;
10808 switch (stub_entry->stub_type)
10810 case ppc_stub_long_branch:
10811 case ppc_stub_long_branch_r2off:
10812 /* Branches are relative. This is where we are going to. */
10813 dest = (stub_entry->target_value
10814 + stub_entry->target_section->output_offset
10815 + stub_entry->target_section->output_section->vma);
10816 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10819 /* And this is where we are coming from. */
10820 off -= (stub_entry->stub_offset
10821 + stub_entry->group->stub_sec->output_offset
10822 + stub_entry->group->stub_sec->output_section->vma);
10825 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10827 bfd_vma r2off = get_r2off (info, stub_entry);
10829 if (r2off == (bfd_vma) -1)
10831 htab->stub_error = TRUE;
10834 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
10837 if (PPC_HA (r2off) != 0)
10839 bfd_put_32 (htab->params->stub_bfd,
10840 ADDIS_R2_R2 | PPC_HA (r2off), loc);
10844 if (PPC_LO (r2off) != 0)
10846 bfd_put_32 (htab->params->stub_bfd,
10847 ADDI_R2_R2 | PPC_LO (r2off), loc);
10853 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
10855 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10857 info->callbacks->einfo
10858 (_("%P: long branch stub `%s' offset overflow\n"),
10859 stub_entry->root.string);
10860 htab->stub_error = TRUE;
10864 if (info->emitrelocations)
10866 r = get_relocs (stub_entry->group->stub_sec, 1);
10869 r->r_offset = loc - stub_entry->group->stub_sec->contents;
10870 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
10871 r->r_addend = dest;
10872 if (stub_entry->h != NULL)
10874 struct elf_link_hash_entry **hashes;
10875 unsigned long symndx;
10876 struct ppc_link_hash_entry *h;
10878 hashes = elf_sym_hashes (htab->params->stub_bfd);
10879 if (hashes == NULL)
10881 bfd_size_type hsize;
10883 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
10884 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
10885 if (hashes == NULL)
10887 elf_sym_hashes (htab->params->stub_bfd) = hashes;
10888 htab->stub_globals = 1;
10890 symndx = htab->stub_globals++;
10892 hashes[symndx] = &h->elf;
10893 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
10894 if (h->oh != NULL && h->oh->is_func)
10895 h = ppc_follow_link (h->oh);
10896 if (h->elf.root.u.def.section != stub_entry->target_section)
10897 /* H is an opd symbol. The addend must be zero. */
10901 off = (h->elf.root.u.def.value
10902 + h->elf.root.u.def.section->output_offset
10903 + h->elf.root.u.def.section->output_section->vma);
10904 r->r_addend -= off;
10910 case ppc_stub_plt_branch:
10911 case ppc_stub_plt_branch_r2off:
10912 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10913 stub_entry->root.string + 9,
10915 if (br_entry == NULL)
10917 info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
10918 stub_entry->root.string);
10919 htab->stub_error = TRUE;
10923 dest = (stub_entry->target_value
10924 + stub_entry->target_section->output_offset
10925 + stub_entry->target_section->output_section->vma);
10926 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10927 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10929 bfd_put_64 (htab->brlt->owner, dest,
10930 htab->brlt->contents + br_entry->offset);
10932 if (br_entry->iter == htab->stub_iteration)
10934 br_entry->iter = 0;
10936 if (htab->relbrlt != NULL)
10938 /* Create a reloc for the branch lookup table entry. */
10939 Elf_Internal_Rela rela;
10942 rela.r_offset = (br_entry->offset
10943 + htab->brlt->output_offset
10944 + htab->brlt->output_section->vma);
10945 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10946 rela.r_addend = dest;
10948 rl = htab->relbrlt->contents;
10949 rl += (htab->relbrlt->reloc_count++
10950 * sizeof (Elf64_External_Rela));
10951 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
10953 else if (info->emitrelocations)
10955 r = get_relocs (htab->brlt, 1);
10958 /* brlt, being SEC_LINKER_CREATED does not go through the
10959 normal reloc processing. Symbols and offsets are not
10960 translated from input file to output file form, so
10961 set up the offset per the output file. */
10962 r->r_offset = (br_entry->offset
10963 + htab->brlt->output_offset
10964 + htab->brlt->output_section->vma);
10965 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10966 r->r_addend = dest;
10970 dest = (br_entry->offset
10971 + htab->brlt->output_offset
10972 + htab->brlt->output_section->vma);
10975 - elf_gp (htab->brlt->output_section->owner)
10976 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
10978 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10980 info->callbacks->einfo
10981 (_("%P: linkage table error against `%T'\n"),
10982 stub_entry->root.string);
10983 bfd_set_error (bfd_error_bad_value);
10984 htab->stub_error = TRUE;
10988 if (info->emitrelocations)
10990 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
10993 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
10994 if (bfd_big_endian (info->output_bfd))
10995 r[0].r_offset += 2;
10996 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
10997 r[0].r_offset += 4;
10998 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10999 r[0].r_addend = dest;
11000 if (PPC_HA (off) != 0)
11002 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11003 r[1].r_offset = r[0].r_offset + 4;
11004 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11005 r[1].r_addend = r[0].r_addend;
11009 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11011 if (PPC_HA (off) != 0)
11014 bfd_put_32 (htab->params->stub_bfd,
11015 ADDIS_R12_R2 | PPC_HA (off), loc);
11017 bfd_put_32 (htab->params->stub_bfd,
11018 LD_R12_0R12 | PPC_LO (off), loc);
11023 bfd_put_32 (htab->params->stub_bfd,
11024 LD_R12_0R2 | PPC_LO (off), loc);
11029 bfd_vma r2off = get_r2off (info, stub_entry);
11031 if (r2off == (bfd_vma) -1)
11033 htab->stub_error = TRUE;
11037 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
11040 if (PPC_HA (off) != 0)
11043 bfd_put_32 (htab->params->stub_bfd,
11044 ADDIS_R12_R2 | PPC_HA (off), loc);
11046 bfd_put_32 (htab->params->stub_bfd,
11047 LD_R12_0R12 | PPC_LO (off), loc);
11050 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
11052 if (PPC_HA (r2off) != 0)
11056 bfd_put_32 (htab->params->stub_bfd,
11057 ADDIS_R2_R2 | PPC_HA (r2off), loc);
11059 if (PPC_LO (r2off) != 0)
11063 bfd_put_32 (htab->params->stub_bfd,
11064 ADDI_R2_R2 | PPC_LO (r2off), loc);
11068 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, loc);
11070 bfd_put_32 (htab->params->stub_bfd, BCTR, loc);
11073 case ppc_stub_plt_call:
11074 case ppc_stub_plt_call_r2save:
11075 if (stub_entry->h != NULL
11076 && stub_entry->h->is_func_descriptor
11077 && stub_entry->h->oh != NULL)
11079 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11081 /* If the old-ABI "dot-symbol" is undefined make it weak so
11082 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
11083 if (fh->elf.root.type == bfd_link_hash_undefined
11084 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11085 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
11086 fh->elf.root.type = bfd_link_hash_undefweak;
11089 /* Now build the stub. */
11090 dest = stub_entry->plt_ent->plt.offset & ~1;
11091 if (dest >= (bfd_vma) -2)
11094 plt = htab->elf.splt;
11095 if (!htab->elf.dynamic_sections_created
11096 || stub_entry->h == NULL
11097 || stub_entry->h->elf.dynindx == -1)
11098 plt = htab->elf.iplt;
11100 dest += plt->output_offset + plt->output_section->vma;
11102 if (stub_entry->h == NULL
11103 && (stub_entry->plt_ent->plt.offset & 1) == 0)
11105 Elf_Internal_Rela rela;
11108 rela.r_offset = dest;
11110 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
11112 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
11113 rela.r_addend = (stub_entry->target_value
11114 + stub_entry->target_section->output_offset
11115 + stub_entry->target_section->output_section->vma);
11117 rl = (htab->elf.irelplt->contents
11118 + (htab->elf.irelplt->reloc_count++
11119 * sizeof (Elf64_External_Rela)));
11120 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
11121 stub_entry->plt_ent->plt.offset |= 1;
11122 htab->local_ifunc_resolver = 1;
11126 - elf_gp (plt->output_section->owner)
11127 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11129 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
11131 info->callbacks->einfo
11132 /* xgettext:c-format */
11133 (_("%P: linkage table error against `%T'\n"),
11134 stub_entry->h != NULL
11135 ? stub_entry->h->elf.root.root.string
11137 bfd_set_error (bfd_error_bad_value);
11138 htab->stub_error = TRUE;
11142 if (htab->params->plt_stub_align != 0)
11144 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11146 stub_entry->group->stub_sec->size += pad;
11147 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11152 if (info->emitrelocations)
11154 r = get_relocs (stub_entry->group->stub_sec,
11155 ((PPC_HA (off) != 0)
11157 ? 2 + (htab->params->plt_static_chain
11158 && PPC_HA (off + 16) == PPC_HA (off))
11162 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
11163 if (bfd_big_endian (info->output_bfd))
11164 r[0].r_offset += 2;
11165 r[0].r_addend = dest;
11167 if (stub_entry->h != NULL
11168 && (stub_entry->h == htab->tls_get_addr_fd
11169 || stub_entry->h == htab->tls_get_addr)
11170 && htab->params->tls_get_addr_opt)
11171 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
11173 p = build_plt_stub (htab, stub_entry, loc, off, r);
11177 case ppc_stub_save_res:
11185 stub_entry->group->stub_sec->size += size;
11187 if (htab->params->emit_stub_syms)
11189 struct elf_link_hash_entry *h;
11192 const char *const stub_str[] = { "long_branch",
11193 "long_branch_r2off",
11195 "plt_branch_r2off",
11199 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11200 len2 = strlen (stub_entry->root.string);
11201 name = bfd_malloc (len1 + len2 + 2);
11204 memcpy (name, stub_entry->root.string, 9);
11205 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11206 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11207 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
11210 if (h->root.type == bfd_link_hash_new)
11212 h->root.type = bfd_link_hash_defined;
11213 h->root.u.def.section = stub_entry->group->stub_sec;
11214 h->root.u.def.value = stub_entry->stub_offset;
11215 h->ref_regular = 1;
11216 h->def_regular = 1;
11217 h->ref_regular_nonweak = 1;
11218 h->forced_local = 1;
11220 h->root.linker_def = 1;
11227 /* As above, but don't actually build the stub. Just bump offset so
11228 we know stub section sizes, and select plt_branch stubs where
11229 long_branch stubs won't do. */
11232 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
11234 struct ppc_stub_hash_entry *stub_entry;
11235 struct bfd_link_info *info;
11236 struct ppc_link_hash_table *htab;
11240 /* Massage our args to the form they really have. */
11241 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
11244 htab = ppc_hash_table (info);
11248 if (stub_entry->h != NULL
11249 && stub_entry->h->save_res
11250 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11251 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11253 /* Don't make stubs to out-of-line register save/restore
11254 functions. Instead, emit copies of the functions. */
11255 stub_entry->group->needs_save_res = 1;
11256 stub_entry->stub_type = ppc_stub_save_res;
11260 if (stub_entry->stub_type == ppc_stub_plt_call
11261 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
11264 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
11265 if (off >= (bfd_vma) -2)
11267 plt = htab->elf.splt;
11268 if (!htab->elf.dynamic_sections_created
11269 || stub_entry->h == NULL
11270 || stub_entry->h->elf.dynindx == -1)
11271 plt = htab->elf.iplt;
11272 off += (plt->output_offset
11273 + plt->output_section->vma
11274 - elf_gp (plt->output_section->owner)
11275 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11277 size = plt_stub_size (htab, stub_entry, off);
11278 if (stub_entry->h != NULL
11279 && (stub_entry->h == htab->tls_get_addr_fd
11280 || stub_entry->h == htab->tls_get_addr)
11281 && htab->params->tls_get_addr_opt
11282 && (ALWAYS_EMIT_R2SAVE
11283 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
11284 stub_entry->group->tls_get_addr_opt_bctrl
11285 = stub_entry->group->stub_sec->size + size - 5 * 4;
11287 if (htab->params->plt_stub_align)
11288 size += plt_stub_pad (htab, stub_entry, off);
11289 if (info->emitrelocations)
11291 stub_entry->group->stub_sec->reloc_count
11292 += ((PPC_HA (off) != 0)
11294 ? 2 + (htab->params->plt_static_chain
11295 && PPC_HA (off + 16) == PPC_HA (off))
11297 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11302 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
11305 bfd_vma local_off = 0;
11307 off = (stub_entry->target_value
11308 + stub_entry->target_section->output_offset
11309 + stub_entry->target_section->output_section->vma);
11310 off -= (stub_entry->group->stub_sec->size
11311 + stub_entry->group->stub_sec->output_offset
11312 + stub_entry->group->stub_sec->output_section->vma);
11314 /* Reset the stub type from the plt variant in case we now
11315 can reach with a shorter stub. */
11316 if (stub_entry->stub_type >= ppc_stub_plt_branch)
11317 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11320 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11322 r2off = get_r2off (info, stub_entry);
11323 if (r2off == (bfd_vma) -1)
11325 htab->stub_error = TRUE;
11329 if (PPC_HA (r2off) != 0)
11331 if (PPC_LO (r2off) != 0)
11336 local_off = PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11338 /* If the branch offset if too big, use a ppc_stub_plt_branch.
11339 Do the same for -R objects without function descriptors. */
11340 if (off + (1 << 25) >= (bfd_vma) (1 << 26) - local_off
11341 || (stub_entry->stub_type == ppc_stub_long_branch_r2off
11343 && htab->sec_info[stub_entry->target_section->id].toc_off == 0))
11345 struct ppc_branch_hash_entry *br_entry;
11347 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11348 stub_entry->root.string + 9,
11350 if (br_entry == NULL)
11352 info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
11353 stub_entry->root.string);
11354 htab->stub_error = TRUE;
11358 if (br_entry->iter != htab->stub_iteration)
11360 br_entry->iter = htab->stub_iteration;
11361 br_entry->offset = htab->brlt->size;
11362 htab->brlt->size += 8;
11364 if (htab->relbrlt != NULL)
11365 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11366 else if (info->emitrelocations)
11368 htab->brlt->reloc_count += 1;
11369 htab->brlt->flags |= SEC_RELOC;
11373 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11374 off = (br_entry->offset
11375 + htab->brlt->output_offset
11376 + htab->brlt->output_section->vma
11377 - elf_gp (htab->brlt->output_section->owner)
11378 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11380 if (info->emitrelocations)
11382 stub_entry->group->stub_sec->reloc_count
11383 += 1 + (PPC_HA (off) != 0);
11384 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11387 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11390 if (PPC_HA (off) != 0)
11396 if (PPC_HA (off) != 0)
11399 if (PPC_HA (r2off) != 0)
11401 if (PPC_LO (r2off) != 0)
11405 else if (info->emitrelocations)
11407 stub_entry->group->stub_sec->reloc_count += 1;
11408 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11412 stub_entry->group->stub_sec->size += size;
11416 /* Set up various things so that we can make a list of input sections
11417 for each output section included in the link. Returns -1 on error,
11418 0 when no stubs will be needed, and 1 on success. */
11421 ppc64_elf_setup_section_lists (struct bfd_link_info *info)
11425 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11430 htab->sec_info_arr_size = bfd_get_next_section_id ();
11431 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
11432 htab->sec_info = bfd_zmalloc (amt);
11433 if (htab->sec_info == NULL)
11436 /* Set toc_off for com, und, abs and ind sections. */
11437 for (id = 0; id < 3; id++)
11438 htab->sec_info[id].toc_off = TOC_BASE_OFF;
11443 /* Set up for first pass at multitoc partitioning. */
11446 ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11448 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11450 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
11451 htab->toc_bfd = NULL;
11452 htab->toc_first_sec = NULL;
11455 /* The linker repeatedly calls this function for each TOC input section
11456 and linker generated GOT section. Group input bfds such that the toc
11457 within a group is less than 64k in size. */
11460 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
11462 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11463 bfd_vma addr, off, limit;
11468 if (!htab->second_toc_pass)
11470 /* Keep track of the first .toc or .got section for this input bfd. */
11471 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11475 htab->toc_bfd = isec->owner;
11476 htab->toc_first_sec = isec;
11479 addr = isec->output_offset + isec->output_section->vma;
11480 off = addr - htab->toc_curr;
11481 limit = 0x80008000;
11482 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
11484 if (off + isec->size > limit)
11486 addr = (htab->toc_first_sec->output_offset
11487 + htab->toc_first_sec->output_section->vma);
11488 htab->toc_curr = addr;
11489 htab->toc_curr &= -TOC_BASE_ALIGN;
11492 /* toc_curr is the base address of this toc group. Set elf_gp
11493 for the input section to be the offset relative to the
11494 output toc base plus 0x8000. Making the input elf_gp an
11495 offset allows us to move the toc as a whole without
11496 recalculating input elf_gp. */
11497 off = htab->toc_curr - elf_gp (isec->output_section->owner);
11498 off += TOC_BASE_OFF;
11500 /* Die if someone uses a linker script that doesn't keep input
11501 file .toc and .got together. */
11503 && elf_gp (isec->owner) != 0
11504 && elf_gp (isec->owner) != off)
11507 elf_gp (isec->owner) = off;
11511 /* During the second pass toc_first_sec points to the start of
11512 a toc group, and toc_curr is used to track the old elf_gp.
11513 We use toc_bfd to ensure we only look at each bfd once. */
11514 if (htab->toc_bfd == isec->owner)
11516 htab->toc_bfd = isec->owner;
11518 if (htab->toc_first_sec == NULL
11519 || htab->toc_curr != elf_gp (isec->owner))
11521 htab->toc_curr = elf_gp (isec->owner);
11522 htab->toc_first_sec = isec;
11524 addr = (htab->toc_first_sec->output_offset
11525 + htab->toc_first_sec->output_section->vma);
11526 off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
11527 elf_gp (isec->owner) = off;
11532 /* Called via elf_link_hash_traverse to merge GOT entries for global
11536 merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11538 if (h->root.type == bfd_link_hash_indirect)
11541 merge_got_entries (&h->got.glist);
11546 /* Called via elf_link_hash_traverse to allocate GOT entries for global
11550 reallocate_got (struct elf_link_hash_entry *h, void *inf)
11552 struct got_entry *gent;
11554 if (h->root.type == bfd_link_hash_indirect)
11557 for (gent = h->got.glist; gent != NULL; gent = gent->next)
11558 if (!gent->is_indirect)
11559 allocate_got (h, (struct bfd_link_info *) inf, gent);
11563 /* Called on the first multitoc pass after the last call to
11564 ppc64_elf_next_toc_section. This function removes duplicate GOT
11568 ppc64_elf_layout_multitoc (struct bfd_link_info *info)
11570 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11571 struct bfd *ibfd, *ibfd2;
11572 bfd_boolean done_something;
11574 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
11576 if (!htab->do_multi_toc)
11579 /* Merge global sym got entries within a toc group. */
11580 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
11582 /* And tlsld_got. */
11583 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11585 struct got_entry *ent, *ent2;
11587 if (!is_ppc64_elf (ibfd))
11590 ent = ppc64_tlsld_got (ibfd);
11591 if (!ent->is_indirect
11592 && ent->got.offset != (bfd_vma) -1)
11594 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
11596 if (!is_ppc64_elf (ibfd2))
11599 ent2 = ppc64_tlsld_got (ibfd2);
11600 if (!ent2->is_indirect
11601 && ent2->got.offset != (bfd_vma) -1
11602 && elf_gp (ibfd2) == elf_gp (ibfd))
11604 ent2->is_indirect = TRUE;
11605 ent2->got.ent = ent;
11611 /* Zap sizes of got sections. */
11612 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
11613 htab->elf.irelplt->size -= htab->got_reli_size;
11614 htab->got_reli_size = 0;
11616 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11618 asection *got, *relgot;
11620 if (!is_ppc64_elf (ibfd))
11623 got = ppc64_elf_tdata (ibfd)->got;
11626 got->rawsize = got->size;
11628 relgot = ppc64_elf_tdata (ibfd)->relgot;
11629 relgot->rawsize = relgot->size;
11634 /* Now reallocate the got, local syms first. We don't need to
11635 allocate section contents again since we never increase size. */
11636 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11638 struct got_entry **lgot_ents;
11639 struct got_entry **end_lgot_ents;
11640 struct plt_entry **local_plt;
11641 struct plt_entry **end_local_plt;
11642 unsigned char *lgot_masks;
11643 bfd_size_type locsymcount;
11644 Elf_Internal_Shdr *symtab_hdr;
11647 if (!is_ppc64_elf (ibfd))
11650 lgot_ents = elf_local_got_ents (ibfd);
11654 symtab_hdr = &elf_symtab_hdr (ibfd);
11655 locsymcount = symtab_hdr->sh_info;
11656 end_lgot_ents = lgot_ents + locsymcount;
11657 local_plt = (struct plt_entry **) end_lgot_ents;
11658 end_local_plt = local_plt + locsymcount;
11659 lgot_masks = (unsigned char *) end_local_plt;
11660 s = ppc64_elf_tdata (ibfd)->got;
11661 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11663 struct got_entry *ent;
11665 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
11667 unsigned int ent_size = 8;
11668 unsigned int rel_size = sizeof (Elf64_External_Rela);
11670 ent->got.offset = s->size;
11671 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
11676 s->size += ent_size;
11677 if ((*lgot_masks & PLT_IFUNC) != 0)
11679 htab->elf.irelplt->size += rel_size;
11680 htab->got_reli_size += rel_size;
11682 else if (bfd_link_pic (info))
11684 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11685 srel->size += rel_size;
11691 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
11693 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11695 struct got_entry *ent;
11697 if (!is_ppc64_elf (ibfd))
11700 ent = ppc64_tlsld_got (ibfd);
11701 if (!ent->is_indirect
11702 && ent->got.offset != (bfd_vma) -1)
11704 asection *s = ppc64_elf_tdata (ibfd)->got;
11705 ent->got.offset = s->size;
11707 if (bfd_link_pic (info))
11709 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11710 srel->size += sizeof (Elf64_External_Rela);
11715 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
11716 if (!done_something)
11717 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11721 if (!is_ppc64_elf (ibfd))
11724 got = ppc64_elf_tdata (ibfd)->got;
11727 done_something = got->rawsize != got->size;
11728 if (done_something)
11733 if (done_something)
11734 (*htab->params->layout_sections_again) ();
11736 /* Set up for second pass over toc sections to recalculate elf_gp
11737 on input sections. */
11738 htab->toc_bfd = NULL;
11739 htab->toc_first_sec = NULL;
11740 htab->second_toc_pass = TRUE;
11741 return done_something;
11744 /* Called after second pass of multitoc partitioning. */
11747 ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
11749 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11751 /* After the second pass, toc_curr tracks the TOC offset used
11752 for code sections below in ppc64_elf_next_input_section. */
11753 htab->toc_curr = TOC_BASE_OFF;
11756 /* No toc references were found in ISEC. If the code in ISEC makes no
11757 calls, then there's no need to use toc adjusting stubs when branching
11758 into ISEC. Actually, indirect calls from ISEC are OK as they will
11759 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11760 needed, and 2 if a cyclical call-graph was found but no other reason
11761 for a stub was detected. If called from the top level, a return of
11762 2 means the same as a return of 0. */
11765 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
11769 /* Mark this section as checked. */
11770 isec->call_check_done = 1;
11772 /* We know none of our code bearing sections will need toc stubs. */
11773 if ((isec->flags & SEC_LINKER_CREATED) != 0)
11776 if (isec->size == 0)
11779 if (isec->output_section == NULL)
11783 if (isec->reloc_count != 0)
11785 Elf_Internal_Rela *relstart, *rel;
11786 Elf_Internal_Sym *local_syms;
11787 struct ppc_link_hash_table *htab;
11789 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
11790 info->keep_memory);
11791 if (relstart == NULL)
11794 /* Look for branches to outside of this section. */
11796 htab = ppc_hash_table (info);
11800 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
11802 enum elf_ppc64_reloc_type r_type;
11803 unsigned long r_symndx;
11804 struct elf_link_hash_entry *h;
11805 struct ppc_link_hash_entry *eh;
11806 Elf_Internal_Sym *sym;
11808 struct _opd_sec_data *opd;
11812 r_type = ELF64_R_TYPE (rel->r_info);
11813 if (r_type != R_PPC64_REL24
11814 && r_type != R_PPC64_REL14
11815 && r_type != R_PPC64_REL14_BRTAKEN
11816 && r_type != R_PPC64_REL14_BRNTAKEN)
11819 r_symndx = ELF64_R_SYM (rel->r_info);
11820 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
11827 /* Calls to dynamic lib functions go through a plt call stub
11829 eh = (struct ppc_link_hash_entry *) h;
11831 && (eh->elf.plt.plist != NULL
11833 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
11839 if (sym_sec == NULL)
11840 /* Ignore other undefined symbols. */
11843 /* Assume branches to other sections not included in the
11844 link need stubs too, to cover -R and absolute syms. */
11845 if (sym_sec->output_section == NULL)
11852 sym_value = sym->st_value;
11855 if (h->root.type != bfd_link_hash_defined
11856 && h->root.type != bfd_link_hash_defweak)
11858 sym_value = h->root.u.def.value;
11860 sym_value += rel->r_addend;
11862 /* If this branch reloc uses an opd sym, find the code section. */
11863 opd = get_opd_info (sym_sec);
11866 if (h == NULL && opd->adjust != NULL)
11870 adjust = opd->adjust[OPD_NDX (sym_value)];
11872 /* Assume deleted functions won't ever be called. */
11874 sym_value += adjust;
11877 dest = opd_entry_value (sym_sec, sym_value,
11878 &sym_sec, NULL, FALSE);
11879 if (dest == (bfd_vma) -1)
11884 + sym_sec->output_offset
11885 + sym_sec->output_section->vma);
11887 /* Ignore branch to self. */
11888 if (sym_sec == isec)
11891 /* If the called function uses the toc, we need a stub. */
11892 if (sym_sec->has_toc_reloc
11893 || sym_sec->makes_toc_func_call)
11899 /* Assume any branch that needs a long branch stub might in fact
11900 need a plt_branch stub. A plt_branch stub uses r2. */
11901 else if (dest - (isec->output_offset
11902 + isec->output_section->vma
11903 + rel->r_offset) + (1 << 25)
11904 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
11912 /* If calling back to a section in the process of being
11913 tested, we can't say for sure that no toc adjusting stubs
11914 are needed, so don't return zero. */
11915 else if (sym_sec->call_check_in_progress)
11918 /* Branches to another section that itself doesn't have any TOC
11919 references are OK. Recursively call ourselves to check. */
11920 else if (!sym_sec->call_check_done)
11924 /* Mark current section as indeterminate, so that other
11925 sections that call back to current won't be marked as
11927 isec->call_check_in_progress = 1;
11928 recur = toc_adjusting_stub_needed (info, sym_sec);
11929 isec->call_check_in_progress = 0;
11940 if (local_syms != NULL
11941 && (elf_symtab_hdr (isec->owner).contents
11942 != (unsigned char *) local_syms))
11944 if (elf_section_data (isec)->relocs != relstart)
11949 && isec->map_head.s != NULL
11950 && (strcmp (isec->output_section->name, ".init") == 0
11951 || strcmp (isec->output_section->name, ".fini") == 0))
11953 if (isec->map_head.s->has_toc_reloc
11954 || isec->map_head.s->makes_toc_func_call)
11956 else if (!isec->map_head.s->call_check_done)
11959 isec->call_check_in_progress = 1;
11960 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
11961 isec->call_check_in_progress = 0;
11968 isec->makes_toc_func_call = 1;
11973 /* The linker repeatedly calls this function for each input section,
11974 in the order that input sections are linked into output sections.
11975 Build lists of input sections to determine groupings between which
11976 we may insert linker stubs. */
11979 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
11981 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11986 if ((isec->output_section->flags & SEC_CODE) != 0
11987 && isec->output_section->id < htab->sec_info_arr_size)
11989 /* This happens to make the list in reverse order,
11990 which is what we want. */
11991 htab->sec_info[isec->id].u.list
11992 = htab->sec_info[isec->output_section->id].u.list;
11993 htab->sec_info[isec->output_section->id].u.list = isec;
11996 if (htab->multi_toc_needed)
11998 /* Analyse sections that aren't already flagged as needing a
11999 valid toc pointer. Exclude .fixup for the linux kernel.
12000 .fixup contains branches, but only back to the function that
12001 hit an exception. */
12002 if (!(isec->has_toc_reloc
12003 || (isec->flags & SEC_CODE) == 0
12004 || strcmp (isec->name, ".fixup") == 0
12005 || isec->call_check_done))
12007 if (toc_adjusting_stub_needed (info, isec) < 0)
12010 /* Make all sections use the TOC assigned for this object file.
12011 This will be wrong for pasted sections; We fix that in
12012 check_pasted_section(). */
12013 if (elf_gp (isec->owner) != 0)
12014 htab->toc_curr = elf_gp (isec->owner);
12017 htab->sec_info[isec->id].toc_off = htab->toc_curr;
12021 /* Check that all .init and .fini sections use the same toc, if they
12022 have toc relocs. */
12025 check_pasted_section (struct bfd_link_info *info, const char *name)
12027 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12031 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12032 bfd_vma toc_off = 0;
12035 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12036 if (i->has_toc_reloc)
12039 toc_off = htab->sec_info[i->id].toc_off;
12040 else if (toc_off != htab->sec_info[i->id].toc_off)
12045 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12046 if (i->makes_toc_func_call)
12048 toc_off = htab->sec_info[i->id].toc_off;
12052 /* Make sure the whole pasted function uses the same toc offset. */
12054 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12055 htab->sec_info[i->id].toc_off = toc_off;
12061 ppc64_elf_check_init_fini (struct bfd_link_info *info)
12063 return (check_pasted_section (info, ".init")
12064 & check_pasted_section (info, ".fini"));
12067 /* See whether we can group stub sections together. Grouping stub
12068 sections may result in fewer stubs. More importantly, we need to
12069 put all .init* and .fini* stubs at the beginning of the .init or
12070 .fini output sections respectively, because glibc splits the
12071 _init and _fini functions into multiple parts. Putting a stub in
12072 the middle of a function is not a good idea. */
12075 group_sections (struct bfd_link_info *info,
12076 bfd_size_type stub_group_size,
12077 bfd_boolean stubs_always_before_branch)
12079 struct ppc_link_hash_table *htab;
12081 bfd_boolean suppress_size_errors;
12083 htab = ppc_hash_table (info);
12087 suppress_size_errors = FALSE;
12088 if (stub_group_size == 1)
12090 /* Default values. */
12091 if (stubs_always_before_branch)
12092 stub_group_size = 0x1e00000;
12094 stub_group_size = 0x1c00000;
12095 suppress_size_errors = TRUE;
12098 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
12102 if (osec->id >= htab->sec_info_arr_size)
12105 tail = htab->sec_info[osec->id].u.list;
12106 while (tail != NULL)
12110 bfd_size_type total;
12111 bfd_boolean big_sec;
12113 struct map_stub *group;
12114 bfd_size_type group_size;
12117 total = tail->size;
12118 group_size = (ppc64_elf_section_data (tail) != NULL
12119 && ppc64_elf_section_data (tail)->has_14bit_branch
12120 ? stub_group_size >> 10 : stub_group_size);
12122 big_sec = total > group_size;
12123 if (big_sec && !suppress_size_errors)
12124 /* xgettext:c-format */
12125 _bfd_error_handler (_("%B section %A exceeds stub group size"),
12126 tail->owner, tail);
12127 curr_toc = htab->sec_info[tail->id].toc_off;
12129 while ((prev = htab->sec_info[curr->id].u.list) != NULL
12130 && ((total += curr->output_offset - prev->output_offset)
12131 < (ppc64_elf_section_data (prev) != NULL
12132 && ppc64_elf_section_data (prev)->has_14bit_branch
12133 ? (group_size = stub_group_size >> 10) : group_size))
12134 && htab->sec_info[prev->id].toc_off == curr_toc)
12137 /* OK, the size from the start of CURR to the end is less
12138 than group_size and thus can be handled by one stub
12139 section. (or the tail section is itself larger than
12140 group_size, in which case we may be toast.) We should
12141 really be keeping track of the total size of stubs added
12142 here, as stubs contribute to the final output section
12143 size. That's a little tricky, and this way will only
12144 break if stubs added make the total size more than 2^25,
12145 ie. for the default stub_group_size, if stubs total more
12146 than 2097152 bytes, or nearly 75000 plt call stubs. */
12147 group = bfd_alloc (curr->owner, sizeof (*group));
12150 group->link_sec = curr;
12151 group->stub_sec = NULL;
12152 group->needs_save_res = 0;
12153 group->tls_get_addr_opt_bctrl = -1u;
12154 group->next = htab->group;
12155 htab->group = group;
12158 prev = htab->sec_info[tail->id].u.list;
12159 /* Set up this stub group. */
12160 htab->sec_info[tail->id].u.group = group;
12162 while (tail != curr && (tail = prev) != NULL);
12164 /* But wait, there's more! Input sections up to group_size
12165 bytes before the stub section can be handled by it too.
12166 Don't do this if we have a really large section after the
12167 stubs, as adding more stubs increases the chance that
12168 branches may not reach into the stub section. */
12169 if (!stubs_always_before_branch && !big_sec)
12172 while (prev != NULL
12173 && ((total += tail->output_offset - prev->output_offset)
12174 < (ppc64_elf_section_data (prev) != NULL
12175 && ppc64_elf_section_data (prev)->has_14bit_branch
12176 ? (group_size = stub_group_size >> 10) : group_size))
12177 && htab->sec_info[prev->id].toc_off == curr_toc)
12180 prev = htab->sec_info[tail->id].u.list;
12181 htab->sec_info[tail->id].u.group = group;
12190 static const unsigned char glink_eh_frame_cie[] =
12192 0, 0, 0, 16, /* length. */
12193 0, 0, 0, 0, /* id. */
12194 1, /* CIE version. */
12195 'z', 'R', 0, /* Augmentation string. */
12196 4, /* Code alignment. */
12197 0x78, /* Data alignment. */
12199 1, /* Augmentation size. */
12200 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
12201 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
12205 stub_eh_frame_size (struct map_stub *group, size_t align)
12207 size_t this_size = 17;
12208 if (group->tls_get_addr_opt_bctrl != -1u)
12210 unsigned int to_bctrl = group->tls_get_addr_opt_bctrl / 4;
12213 else if (to_bctrl < 256)
12215 else if (to_bctrl < 65536)
12221 this_size = (this_size + align - 1) & -align;
12225 /* Stripping output sections is normally done before dynamic section
12226 symbols have been allocated. This function is called later, and
12227 handles cases like htab->brlt which is mapped to its own output
12231 maybe_strip_output (struct bfd_link_info *info, asection *isec)
12233 if (isec->size == 0
12234 && isec->output_section->size == 0
12235 && !(isec->output_section->flags & SEC_KEEP)
12236 && !bfd_section_removed_from_list (info->output_bfd,
12237 isec->output_section)
12238 && elf_section_data (isec->output_section)->dynindx == 0)
12240 isec->output_section->flags |= SEC_EXCLUDE;
12241 bfd_section_list_remove (info->output_bfd, isec->output_section);
12242 info->output_bfd->section_count--;
12246 /* Determine and set the size of the stub section for a final link.
12248 The basic idea here is to examine all the relocations looking for
12249 PC-relative calls to a target that is unreachable with a "bl"
12253 ppc64_elf_size_stubs (struct bfd_link_info *info)
12255 bfd_size_type stub_group_size;
12256 bfd_boolean stubs_always_before_branch;
12257 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12262 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
12263 htab->params->plt_thread_safe = 1;
12264 if (!htab->opd_abi)
12265 htab->params->plt_thread_safe = 0;
12266 else if (htab->params->plt_thread_safe == -1)
12268 static const char *const thread_starter[] =
12272 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12274 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12275 "mq_notify", "create_timer",
12280 "GOMP_parallel_start",
12281 "GOMP_parallel_loop_static",
12282 "GOMP_parallel_loop_static_start",
12283 "GOMP_parallel_loop_dynamic",
12284 "GOMP_parallel_loop_dynamic_start",
12285 "GOMP_parallel_loop_guided",
12286 "GOMP_parallel_loop_guided_start",
12287 "GOMP_parallel_loop_runtime",
12288 "GOMP_parallel_loop_runtime_start",
12289 "GOMP_parallel_sections",
12290 "GOMP_parallel_sections_start",
12296 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
12298 struct elf_link_hash_entry *h;
12299 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12300 FALSE, FALSE, TRUE);
12301 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12302 if (htab->params->plt_thread_safe)
12306 stubs_always_before_branch = htab->params->group_size < 0;
12307 if (htab->params->group_size < 0)
12308 stub_group_size = -htab->params->group_size;
12310 stub_group_size = htab->params->group_size;
12312 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12315 #define STUB_SHRINK_ITER 20
12316 /* Loop until no stubs added. After iteration 20 of this loop we may
12317 exit on a stub section shrinking. This is to break out of a
12318 pathological case where adding stubs on one iteration decreases
12319 section gaps (perhaps due to alignment), which then requires
12320 fewer or smaller stubs on the next iteration. */
12325 unsigned int bfd_indx;
12326 struct map_stub *group;
12328 htab->stub_iteration += 1;
12330 for (input_bfd = info->input_bfds, bfd_indx = 0;
12332 input_bfd = input_bfd->link.next, bfd_indx++)
12334 Elf_Internal_Shdr *symtab_hdr;
12336 Elf_Internal_Sym *local_syms = NULL;
12338 if (!is_ppc64_elf (input_bfd))
12341 /* We'll need the symbol table in a second. */
12342 symtab_hdr = &elf_symtab_hdr (input_bfd);
12343 if (symtab_hdr->sh_info == 0)
12346 /* Walk over each section attached to the input bfd. */
12347 for (section = input_bfd->sections;
12349 section = section->next)
12351 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
12353 /* If there aren't any relocs, then there's nothing more
12355 if ((section->flags & SEC_RELOC) == 0
12356 || (section->flags & SEC_ALLOC) == 0
12357 || (section->flags & SEC_LOAD) == 0
12358 || (section->flags & SEC_CODE) == 0
12359 || section->reloc_count == 0)
12362 /* If this section is a link-once section that will be
12363 discarded, then don't create any stubs. */
12364 if (section->output_section == NULL
12365 || section->output_section->owner != info->output_bfd)
12368 /* Get the relocs. */
12370 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
12371 info->keep_memory);
12372 if (internal_relocs == NULL)
12373 goto error_ret_free_local;
12375 /* Now examine each relocation. */
12376 irela = internal_relocs;
12377 irelaend = irela + section->reloc_count;
12378 for (; irela < irelaend; irela++)
12380 enum elf_ppc64_reloc_type r_type;
12381 unsigned int r_indx;
12382 enum ppc_stub_type stub_type;
12383 struct ppc_stub_hash_entry *stub_entry;
12384 asection *sym_sec, *code_sec;
12385 bfd_vma sym_value, code_value;
12386 bfd_vma destination;
12387 unsigned long local_off;
12388 bfd_boolean ok_dest;
12389 struct ppc_link_hash_entry *hash;
12390 struct ppc_link_hash_entry *fdh;
12391 struct elf_link_hash_entry *h;
12392 Elf_Internal_Sym *sym;
12394 const asection *id_sec;
12395 struct _opd_sec_data *opd;
12396 struct plt_entry *plt_ent;
12398 r_type = ELF64_R_TYPE (irela->r_info);
12399 r_indx = ELF64_R_SYM (irela->r_info);
12401 if (r_type >= R_PPC64_max)
12403 bfd_set_error (bfd_error_bad_value);
12404 goto error_ret_free_internal;
12407 /* Only look for stubs on branch instructions. */
12408 if (r_type != R_PPC64_REL24
12409 && r_type != R_PPC64_REL14
12410 && r_type != R_PPC64_REL14_BRTAKEN
12411 && r_type != R_PPC64_REL14_BRNTAKEN)
12414 /* Now determine the call target, its name, value,
12416 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12417 r_indx, input_bfd))
12418 goto error_ret_free_internal;
12419 hash = (struct ppc_link_hash_entry *) h;
12426 sym_value = sym->st_value;
12427 if (sym_sec != NULL
12428 && sym_sec->output_section != NULL)
12431 else if (hash->elf.root.type == bfd_link_hash_defined
12432 || hash->elf.root.type == bfd_link_hash_defweak)
12434 sym_value = hash->elf.root.u.def.value;
12435 if (sym_sec->output_section != NULL)
12438 else if (hash->elf.root.type == bfd_link_hash_undefweak
12439 || hash->elf.root.type == bfd_link_hash_undefined)
12441 /* Recognise an old ABI func code entry sym, and
12442 use the func descriptor sym instead if it is
12444 if (hash->elf.root.root.string[0] == '.'
12445 && hash->oh != NULL)
12447 fdh = ppc_follow_link (hash->oh);
12448 if (fdh->elf.root.type == bfd_link_hash_defined
12449 || fdh->elf.root.type == bfd_link_hash_defweak)
12451 sym_sec = fdh->elf.root.u.def.section;
12452 sym_value = fdh->elf.root.u.def.value;
12453 if (sym_sec->output_section != NULL)
12462 bfd_set_error (bfd_error_bad_value);
12463 goto error_ret_free_internal;
12470 sym_value += irela->r_addend;
12471 destination = (sym_value
12472 + sym_sec->output_offset
12473 + sym_sec->output_section->vma);
12474 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12479 code_sec = sym_sec;
12480 code_value = sym_value;
12481 opd = get_opd_info (sym_sec);
12486 if (hash == NULL && opd->adjust != NULL)
12488 long adjust = opd->adjust[OPD_NDX (sym_value)];
12491 code_value += adjust;
12492 sym_value += adjust;
12494 dest = opd_entry_value (sym_sec, sym_value,
12495 &code_sec, &code_value, FALSE);
12496 if (dest != (bfd_vma) -1)
12498 destination = dest;
12501 /* Fixup old ABI sym to point at code
12503 hash->elf.root.type = bfd_link_hash_defweak;
12504 hash->elf.root.u.def.section = code_sec;
12505 hash->elf.root.u.def.value = code_value;
12510 /* Determine what (if any) linker stub is needed. */
12512 stub_type = ppc_type_of_stub (section, irela, &hash,
12513 &plt_ent, destination,
12516 if (stub_type != ppc_stub_plt_call)
12518 /* Check whether we need a TOC adjusting stub.
12519 Since the linker pastes together pieces from
12520 different object files when creating the
12521 _init and _fini functions, it may be that a
12522 call to what looks like a local sym is in
12523 fact a call needing a TOC adjustment. */
12524 if (code_sec != NULL
12525 && code_sec->output_section != NULL
12526 && (htab->sec_info[code_sec->id].toc_off
12527 != htab->sec_info[section->id].toc_off)
12528 && (code_sec->has_toc_reloc
12529 || code_sec->makes_toc_func_call))
12530 stub_type = ppc_stub_long_branch_r2off;
12533 if (stub_type == ppc_stub_none)
12536 /* __tls_get_addr calls might be eliminated. */
12537 if (stub_type != ppc_stub_plt_call
12539 && (hash == htab->tls_get_addr
12540 || hash == htab->tls_get_addr_fd)
12541 && section->has_tls_reloc
12542 && irela != internal_relocs)
12544 /* Get tls info. */
12545 unsigned char *tls_mask;
12547 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
12548 irela - 1, input_bfd))
12549 goto error_ret_free_internal;
12550 if (*tls_mask != 0)
12554 if (stub_type == ppc_stub_plt_call)
12557 && htab->params->plt_localentry0 != 0
12558 && is_elfv2_localentry0 (&hash->elf))
12559 htab->has_plt_localentry0 = 1;
12560 else if (irela + 1 < irelaend
12561 && irela[1].r_offset == irela->r_offset + 4
12562 && (ELF64_R_TYPE (irela[1].r_info)
12563 == R_PPC64_TOCSAVE))
12565 if (!tocsave_find (htab, INSERT,
12566 &local_syms, irela + 1, input_bfd))
12567 goto error_ret_free_internal;
12570 stub_type = ppc_stub_plt_call_r2save;
12573 /* Support for grouping stub sections. */
12574 id_sec = htab->sec_info[section->id].u.group->link_sec;
12576 /* Get the name of this stub. */
12577 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
12579 goto error_ret_free_internal;
12581 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
12582 stub_name, FALSE, FALSE);
12583 if (stub_entry != NULL)
12585 /* The proper stub has already been created. */
12587 if (stub_type == ppc_stub_plt_call_r2save)
12588 stub_entry->stub_type = stub_type;
12592 stub_entry = ppc_add_stub (stub_name, section, info);
12593 if (stub_entry == NULL)
12596 error_ret_free_internal:
12597 if (elf_section_data (section)->relocs == NULL)
12598 free (internal_relocs);
12599 error_ret_free_local:
12600 if (local_syms != NULL
12601 && (symtab_hdr->contents
12602 != (unsigned char *) local_syms))
12607 stub_entry->stub_type = stub_type;
12608 if (stub_type != ppc_stub_plt_call
12609 && stub_type != ppc_stub_plt_call_r2save)
12611 stub_entry->target_value = code_value;
12612 stub_entry->target_section = code_sec;
12616 stub_entry->target_value = sym_value;
12617 stub_entry->target_section = sym_sec;
12619 stub_entry->h = hash;
12620 stub_entry->plt_ent = plt_ent;
12621 stub_entry->other = hash ? hash->elf.other : sym->st_other;
12623 if (stub_entry->h != NULL)
12624 htab->stub_globals += 1;
12627 /* We're done with the internal relocs, free them. */
12628 if (elf_section_data (section)->relocs != internal_relocs)
12629 free (internal_relocs);
12632 if (local_syms != NULL
12633 && symtab_hdr->contents != (unsigned char *) local_syms)
12635 if (!info->keep_memory)
12638 symtab_hdr->contents = (unsigned char *) local_syms;
12642 /* We may have added some stubs. Find out the new size of the
12644 for (group = htab->group; group != NULL; group = group->next)
12645 if (group->stub_sec != NULL)
12647 asection *stub_sec = group->stub_sec;
12649 if (htab->stub_iteration <= STUB_SHRINK_ITER
12650 || stub_sec->rawsize < stub_sec->size)
12651 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
12652 stub_sec->rawsize = stub_sec->size;
12653 stub_sec->size = 0;
12654 stub_sec->reloc_count = 0;
12655 stub_sec->flags &= ~SEC_RELOC;
12658 htab->brlt->size = 0;
12659 htab->brlt->reloc_count = 0;
12660 htab->brlt->flags &= ~SEC_RELOC;
12661 if (htab->relbrlt != NULL)
12662 htab->relbrlt->size = 0;
12664 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
12666 for (group = htab->group; group != NULL; group = group->next)
12667 if (group->needs_save_res)
12668 group->stub_sec->size += htab->sfpr->size;
12670 if (info->emitrelocations
12671 && htab->glink != NULL && htab->glink->size != 0)
12673 htab->glink->reloc_count = 1;
12674 htab->glink->flags |= SEC_RELOC;
12677 if (htab->glink_eh_frame != NULL
12678 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
12679 && htab->glink_eh_frame->output_section->size != 0)
12681 size_t size = 0, align = 4;
12683 for (group = htab->group; group != NULL; group = group->next)
12684 if (group->stub_sec != NULL)
12685 size += stub_eh_frame_size (group, align);
12686 if (htab->glink != NULL && htab->glink->size != 0)
12687 size += (24 + align - 1) & -align;
12689 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
12690 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
12691 size = (size + align - 1) & -align;
12692 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12693 htab->glink_eh_frame->size = size;
12696 if (htab->params->plt_stub_align != 0)
12697 for (group = htab->group; group != NULL; group = group->next)
12698 if (group->stub_sec != NULL)
12699 group->stub_sec->size = ((group->stub_sec->size
12700 + (1 << htab->params->plt_stub_align) - 1)
12701 & -(1 << htab->params->plt_stub_align));
12703 for (group = htab->group; group != NULL; group = group->next)
12704 if (group->stub_sec != NULL
12705 && group->stub_sec->rawsize != group->stub_sec->size
12706 && (htab->stub_iteration <= STUB_SHRINK_ITER
12707 || group->stub_sec->rawsize < group->stub_sec->size))
12711 && (htab->glink_eh_frame == NULL
12712 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
12715 /* Ask the linker to do its stuff. */
12716 (*htab->params->layout_sections_again) ();
12719 if (htab->glink_eh_frame != NULL
12720 && htab->glink_eh_frame->size != 0)
12723 bfd_byte *p, *last_fde;
12724 size_t last_fde_len, size, align, pad;
12725 struct map_stub *group;
12727 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
12730 htab->glink_eh_frame->contents = p;
12734 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
12735 /* CIE length (rewrite in case little-endian). */
12736 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
12737 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12738 p += last_fde_len + 4;
12740 for (group = htab->group; group != NULL; group = group->next)
12741 if (group->stub_sec != NULL)
12744 last_fde_len = stub_eh_frame_size (group, align) - 4;
12746 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12749 val = p - htab->glink_eh_frame->contents;
12750 bfd_put_32 (htab->elf.dynobj, val, p);
12752 /* Offset to stub section, written later. */
12754 /* stub section size. */
12755 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
12757 /* Augmentation. */
12759 if (group->tls_get_addr_opt_bctrl != -1u)
12761 unsigned int to_bctrl = group->tls_get_addr_opt_bctrl / 4;
12763 /* This FDE needs more than just the default.
12764 Describe __tls_get_addr_opt stub LR. */
12766 *p++ = DW_CFA_advance_loc + to_bctrl;
12767 else if (to_bctrl < 256)
12769 *p++ = DW_CFA_advance_loc1;
12772 else if (to_bctrl < 65536)
12774 *p++ = DW_CFA_advance_loc2;
12775 bfd_put_16 (htab->elf.dynobj, to_bctrl, p);
12780 *p++ = DW_CFA_advance_loc4;
12781 bfd_put_32 (htab->elf.dynobj, to_bctrl, p);
12784 *p++ = DW_CFA_offset_extended_sf;
12786 *p++ = -(STK_LINKER (htab) / 8) & 0x7f;
12787 *p++ = DW_CFA_advance_loc + 4;
12788 *p++ = DW_CFA_restore_extended;
12792 p = last_fde + last_fde_len + 4;
12794 if (htab->glink != NULL && htab->glink->size != 0)
12797 last_fde_len = ((24 + align - 1) & -align) - 4;
12799 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12802 val = p - htab->glink_eh_frame->contents;
12803 bfd_put_32 (htab->elf.dynobj, val, p);
12805 /* Offset to .glink, written later. */
12808 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
12810 /* Augmentation. */
12813 *p++ = DW_CFA_advance_loc + 1;
12814 *p++ = DW_CFA_register;
12816 *p++ = htab->opd_abi ? 12 : 0;
12817 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
12818 *p++ = DW_CFA_restore_extended;
12820 p += ((24 + align - 1) & -align) - 24;
12822 /* Subsume any padding into the last FDE if user .eh_frame
12823 sections are aligned more than glink_eh_frame. Otherwise any
12824 zero padding will be seen as a terminator. */
12825 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
12826 size = p - htab->glink_eh_frame->contents;
12827 pad = ((size + align - 1) & -align) - size;
12828 htab->glink_eh_frame->size = size + pad;
12829 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
12832 maybe_strip_output (info, htab->brlt);
12833 if (htab->glink_eh_frame != NULL)
12834 maybe_strip_output (info, htab->glink_eh_frame);
12839 /* Called after we have determined section placement. If sections
12840 move, we'll be called again. Provide a value for TOCstart. */
12843 ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
12846 bfd_vma TOCstart, adjust;
12850 struct elf_link_hash_entry *h;
12851 struct elf_link_hash_table *htab = elf_hash_table (info);
12853 if (is_elf_hash_table (htab)
12854 && htab->hgot != NULL)
12858 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
12859 if (is_elf_hash_table (htab))
12863 && h->root.type == bfd_link_hash_defined
12864 && !h->root.linker_def
12865 && (!is_elf_hash_table (htab)
12866 || h->def_regular))
12868 TOCstart = (h->root.u.def.value - TOC_BASE_OFF
12869 + h->root.u.def.section->output_offset
12870 + h->root.u.def.section->output_section->vma);
12871 _bfd_set_gp_value (obfd, TOCstart);
12876 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
12877 order. The TOC starts where the first of these sections starts. */
12878 s = bfd_get_section_by_name (obfd, ".got");
12879 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12880 s = bfd_get_section_by_name (obfd, ".toc");
12881 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12882 s = bfd_get_section_by_name (obfd, ".tocbss");
12883 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12884 s = bfd_get_section_by_name (obfd, ".plt");
12885 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12887 /* This may happen for
12888 o references to TOC base (SYM@toc / TOC[tc0]) without a
12890 o bad linker script
12891 o --gc-sections and empty TOC sections
12893 FIXME: Warn user? */
12895 /* Look for a likely section. We probably won't even be
12897 for (s = obfd->sections; s != NULL; s = s->next)
12898 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
12900 == (SEC_ALLOC | SEC_SMALL_DATA))
12903 for (s = obfd->sections; s != NULL; s = s->next)
12904 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
12905 == (SEC_ALLOC | SEC_SMALL_DATA))
12908 for (s = obfd->sections; s != NULL; s = s->next)
12909 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
12913 for (s = obfd->sections; s != NULL; s = s->next)
12914 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
12920 TOCstart = s->output_section->vma + s->output_offset;
12922 /* Force alignment. */
12923 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
12924 TOCstart -= adjust;
12925 _bfd_set_gp_value (obfd, TOCstart);
12927 if (info != NULL && s != NULL)
12929 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12933 if (htab->elf.hgot != NULL)
12935 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
12936 htab->elf.hgot->root.u.def.section = s;
12941 struct bfd_link_hash_entry *bh = NULL;
12942 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
12943 s, TOC_BASE_OFF - adjust,
12944 NULL, FALSE, FALSE, &bh);
12950 /* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
12951 write out any global entry stubs. */
12954 build_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
12956 struct bfd_link_info *info;
12957 struct ppc_link_hash_table *htab;
12958 struct plt_entry *pent;
12961 if (h->root.type == bfd_link_hash_indirect)
12964 if (!h->pointer_equality_needed)
12967 if (h->def_regular)
12971 htab = ppc_hash_table (info);
12976 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
12977 if (pent->plt.offset != (bfd_vma) -1
12978 && pent->addend == 0)
12984 p = s->contents + h->root.u.def.value;
12985 plt = htab->elf.splt;
12986 if (!htab->elf.dynamic_sections_created
12987 || h->dynindx == -1)
12988 plt = htab->elf.iplt;
12989 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
12990 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
12992 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
12994 info->callbacks->einfo
12995 (_("%P: linkage table error against `%T'\n"),
12996 h->root.root.string);
12997 bfd_set_error (bfd_error_bad_value);
12998 htab->stub_error = TRUE;
13001 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13002 if (htab->params->emit_stub_syms)
13004 size_t len = strlen (h->root.root.string);
13005 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13010 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13011 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13014 if (h->root.type == bfd_link_hash_new)
13016 h->root.type = bfd_link_hash_defined;
13017 h->root.u.def.section = s;
13018 h->root.u.def.value = p - s->contents;
13019 h->ref_regular = 1;
13020 h->def_regular = 1;
13021 h->ref_regular_nonweak = 1;
13022 h->forced_local = 1;
13024 h->root.linker_def = 1;
13028 if (PPC_HA (off) != 0)
13030 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
13033 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
13035 bfd_put_32 (s->owner, MTCTR_R12, p);
13037 bfd_put_32 (s->owner, BCTR, p);
13043 /* Build all the stubs associated with the current output file.
13044 The stubs are kept in a hash table attached to the main linker
13045 hash table. This function is called via gldelf64ppc_finish. */
13048 ppc64_elf_build_stubs (struct bfd_link_info *info,
13051 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13052 struct map_stub *group;
13053 asection *stub_sec;
13055 int stub_sec_count = 0;
13060 /* Allocate memory to hold the linker stubs. */
13061 for (group = htab->group; group != NULL; group = group->next)
13062 if ((stub_sec = group->stub_sec) != NULL
13063 && stub_sec->size != 0)
13065 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, stub_sec->size);
13066 if (stub_sec->contents == NULL)
13068 stub_sec->size = 0;
13071 if (htab->glink != NULL && htab->glink->size != 0)
13076 /* Build the .glink plt call stub. */
13077 if (htab->params->emit_stub_syms)
13079 struct elf_link_hash_entry *h;
13080 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
13081 TRUE, FALSE, FALSE);
13084 if (h->root.type == bfd_link_hash_new)
13086 h->root.type = bfd_link_hash_defined;
13087 h->root.u.def.section = htab->glink;
13088 h->root.u.def.value = 8;
13089 h->ref_regular = 1;
13090 h->def_regular = 1;
13091 h->ref_regular_nonweak = 1;
13092 h->forced_local = 1;
13094 h->root.linker_def = 1;
13097 plt0 = (htab->elf.splt->output_section->vma
13098 + htab->elf.splt->output_offset
13100 if (info->emitrelocations)
13102 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
13105 r->r_offset = (htab->glink->output_offset
13106 + htab->glink->output_section->vma);
13107 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
13108 r->r_addend = plt0;
13110 p = htab->glink->contents;
13111 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
13112 bfd_put_64 (htab->glink->owner, plt0, p);
13116 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
13118 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13120 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13122 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13124 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
13126 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13128 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13130 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
13132 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13134 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
13139 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
13141 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13143 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13145 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
13147 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13149 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
13151 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
13153 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13155 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
13157 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13159 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
13161 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13163 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
13166 bfd_put_32 (htab->glink->owner, BCTR, p);
13168 while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
13170 bfd_put_32 (htab->glink->owner, NOP, p);
13174 /* Build the .glink lazy link call stubs. */
13176 while (p < htab->glink->contents + htab->glink->rawsize)
13182 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
13187 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
13189 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
13194 bfd_put_32 (htab->glink->owner,
13195 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
13200 /* Build .glink global entry stubs. */
13201 if (htab->glink->size > htab->glink->rawsize)
13202 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
13205 if (htab->brlt != NULL && htab->brlt->size != 0)
13207 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
13209 if (htab->brlt->contents == NULL)
13212 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
13214 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
13215 htab->relbrlt->size);
13216 if (htab->relbrlt->contents == NULL)
13220 /* Build the stubs as directed by the stub hash table. */
13221 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
13223 for (group = htab->group; group != NULL; group = group->next)
13224 if (group->needs_save_res)
13226 stub_sec = group->stub_sec;
13227 memcpy (stub_sec->contents + stub_sec->size, htab->sfpr->contents,
13229 if (htab->params->emit_stub_syms)
13233 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
13234 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
13237 stub_sec->size += htab->sfpr->size;
13240 if (htab->relbrlt != NULL)
13241 htab->relbrlt->reloc_count = 0;
13243 if (htab->params->plt_stub_align != 0)
13244 for (group = htab->group; group != NULL; group = group->next)
13245 if ((stub_sec = group->stub_sec) != NULL)
13246 stub_sec->size = ((stub_sec->size
13247 + (1 << htab->params->plt_stub_align) - 1)
13248 & -(1 << htab->params->plt_stub_align));
13250 for (group = htab->group; group != NULL; group = group->next)
13251 if ((stub_sec = group->stub_sec) != NULL)
13253 stub_sec_count += 1;
13254 if (stub_sec->rawsize != stub_sec->size
13255 && (htab->stub_iteration <= STUB_SHRINK_ITER
13256 || stub_sec->rawsize < stub_sec->size))
13262 htab->stub_error = TRUE;
13263 info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
13266 if (htab->stub_error)
13271 *stats = bfd_malloc (500);
13272 if (*stats == NULL)
13275 sprintf (*stats, _("linker stubs in %u group%s\n"
13277 " toc adjust %lu\n"
13278 " long branch %lu\n"
13279 " long toc adj %lu\n"
13281 " plt call toc %lu\n"
13282 " global entry %lu"),
13284 stub_sec_count == 1 ? "" : "s",
13285 htab->stub_count[ppc_stub_long_branch - 1],
13286 htab->stub_count[ppc_stub_long_branch_r2off - 1],
13287 htab->stub_count[ppc_stub_plt_branch - 1],
13288 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
13289 htab->stub_count[ppc_stub_plt_call - 1],
13290 htab->stub_count[ppc_stub_plt_call_r2save - 1],
13291 htab->stub_count[ppc_stub_global_entry - 1]);
13296 /* What to do when ld finds relocations against symbols defined in
13297 discarded sections. */
13299 static unsigned int
13300 ppc64_elf_action_discarded (asection *sec)
13302 if (strcmp (".opd", sec->name) == 0)
13305 if (strcmp (".toc", sec->name) == 0)
13308 if (strcmp (".toc1", sec->name) == 0)
13311 return _bfd_elf_default_action_discarded (sec);
13314 /* The RELOCATE_SECTION function is called by the ELF backend linker
13315 to handle the relocations for a section.
13317 The relocs are always passed as Rela structures; if the section
13318 actually uses Rel structures, the r_addend field will always be
13321 This function is responsible for adjust the section contents as
13322 necessary, and (if using Rela relocs and generating a
13323 relocatable output file) adjusting the reloc addend as
13326 This function does not have to worry about setting the reloc
13327 address or the reloc symbol index.
13329 LOCAL_SYMS is a pointer to the swapped in local symbols.
13331 LOCAL_SECTIONS is an array giving the section in the input file
13332 corresponding to the st_shndx field of each local symbol.
13334 The global hash table entry for the global symbols can be found
13335 via elf_sym_hashes (input_bfd).
13337 When generating relocatable output, this function must handle
13338 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
13339 going to be the section symbol corresponding to the output
13340 section, which means that the addend must be adjusted
13344 ppc64_elf_relocate_section (bfd *output_bfd,
13345 struct bfd_link_info *info,
13347 asection *input_section,
13348 bfd_byte *contents,
13349 Elf_Internal_Rela *relocs,
13350 Elf_Internal_Sym *local_syms,
13351 asection **local_sections)
13353 struct ppc_link_hash_table *htab;
13354 Elf_Internal_Shdr *symtab_hdr;
13355 struct elf_link_hash_entry **sym_hashes;
13356 Elf_Internal_Rela *rel;
13357 Elf_Internal_Rela *wrel;
13358 Elf_Internal_Rela *relend;
13359 Elf_Internal_Rela outrel;
13361 struct got_entry **local_got_ents;
13363 bfd_boolean ret = TRUE;
13364 bfd_boolean is_opd;
13365 /* Assume 'at' branch hints. */
13366 bfd_boolean is_isa_v2 = TRUE;
13367 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
13369 /* Initialize howto table if needed. */
13370 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
13373 htab = ppc_hash_table (info);
13377 /* Don't relocate stub sections. */
13378 if (input_section->owner == htab->params->stub_bfd)
13381 BFD_ASSERT (is_ppc64_elf (input_bfd));
13383 local_got_ents = elf_local_got_ents (input_bfd);
13384 TOCstart = elf_gp (output_bfd);
13385 symtab_hdr = &elf_symtab_hdr (input_bfd);
13386 sym_hashes = elf_sym_hashes (input_bfd);
13387 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
13389 rel = wrel = relocs;
13390 relend = relocs + input_section->reloc_count;
13391 for (; rel < relend; wrel++, rel++)
13393 enum elf_ppc64_reloc_type r_type;
13395 bfd_reloc_status_type r;
13396 Elf_Internal_Sym *sym;
13398 struct elf_link_hash_entry *h_elf;
13399 struct ppc_link_hash_entry *h;
13400 struct ppc_link_hash_entry *fdh;
13401 const char *sym_name;
13402 unsigned long r_symndx, toc_symndx;
13403 bfd_vma toc_addend;
13404 unsigned char tls_mask, tls_gd, tls_type;
13405 unsigned char sym_type;
13406 bfd_vma relocation;
13407 bfd_boolean unresolved_reloc;
13408 bfd_boolean warned;
13409 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
13412 struct ppc_stub_hash_entry *stub_entry;
13413 bfd_vma max_br_offset;
13415 Elf_Internal_Rela orig_rel;
13416 reloc_howto_type *howto;
13417 struct reloc_howto_struct alt_howto;
13422 r_type = ELF64_R_TYPE (rel->r_info);
13423 r_symndx = ELF64_R_SYM (rel->r_info);
13425 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
13426 symbol of the previous ADDR64 reloc. The symbol gives us the
13427 proper TOC base to use. */
13428 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
13430 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
13432 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
13438 unresolved_reloc = FALSE;
13441 if (r_symndx < symtab_hdr->sh_info)
13443 /* It's a local symbol. */
13444 struct _opd_sec_data *opd;
13446 sym = local_syms + r_symndx;
13447 sec = local_sections[r_symndx];
13448 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
13449 sym_type = ELF64_ST_TYPE (sym->st_info);
13450 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
13451 opd = get_opd_info (sec);
13452 if (opd != NULL && opd->adjust != NULL)
13454 long adjust = opd->adjust[OPD_NDX (sym->st_value
13460 /* If this is a relocation against the opd section sym
13461 and we have edited .opd, adjust the reloc addend so
13462 that ld -r and ld --emit-relocs output is correct.
13463 If it is a reloc against some other .opd symbol,
13464 then the symbol value will be adjusted later. */
13465 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
13466 rel->r_addend += adjust;
13468 relocation += adjust;
13474 bfd_boolean ignored;
13476 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
13477 r_symndx, symtab_hdr, sym_hashes,
13478 h_elf, sec, relocation,
13479 unresolved_reloc, warned, ignored);
13480 sym_name = h_elf->root.root.string;
13481 sym_type = h_elf->type;
13483 && sec->owner == output_bfd
13484 && strcmp (sec->name, ".opd") == 0)
13486 /* This is a symbol defined in a linker script. All
13487 such are defined in output sections, even those
13488 defined by simple assignment from a symbol defined in
13489 an input section. Transfer the symbol to an
13490 appropriate input .opd section, so that a branch to
13491 this symbol will be mapped to the location specified
13492 by the opd entry. */
13493 struct bfd_link_order *lo;
13494 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
13495 if (lo->type == bfd_indirect_link_order)
13497 asection *isec = lo->u.indirect.section;
13498 if (h_elf->root.u.def.value >= isec->output_offset
13499 && h_elf->root.u.def.value < (isec->output_offset
13502 h_elf->root.u.def.value -= isec->output_offset;
13503 h_elf->root.u.def.section = isec;
13510 h = (struct ppc_link_hash_entry *) h_elf;
13512 if (sec != NULL && discarded_section (sec))
13514 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
13515 input_bfd, input_section,
13516 contents + rel->r_offset);
13517 wrel->r_offset = rel->r_offset;
13519 wrel->r_addend = 0;
13521 /* For ld -r, remove relocations in debug sections against
13522 symbols defined in discarded sections. Not done for
13523 non-debug to preserve relocs in .eh_frame which the
13524 eh_frame editing code expects to be present. */
13525 if (bfd_link_relocatable (info)
13526 && (input_section->flags & SEC_DEBUGGING))
13532 if (bfd_link_relocatable (info))
13535 if (h != NULL && &h->elf == htab->elf.hgot)
13537 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
13538 sec = bfd_abs_section_ptr;
13539 unresolved_reloc = FALSE;
13542 /* TLS optimizations. Replace instruction sequences and relocs
13543 based on information we collected in tls_optimize. We edit
13544 RELOCS so that --emit-relocs will output something sensible
13545 for the final instruction stream. */
13550 tls_mask = h->tls_mask;
13551 else if (local_got_ents != NULL)
13553 struct plt_entry **local_plt = (struct plt_entry **)
13554 (local_got_ents + symtab_hdr->sh_info);
13555 unsigned char *lgot_masks = (unsigned char *)
13556 (local_plt + symtab_hdr->sh_info);
13557 tls_mask = lgot_masks[r_symndx];
13560 && (r_type == R_PPC64_TLS
13561 || r_type == R_PPC64_TLSGD
13562 || r_type == R_PPC64_TLSLD))
13564 /* Check for toc tls entries. */
13565 unsigned char *toc_tls;
13567 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13568 &local_syms, rel, input_bfd))
13572 tls_mask = *toc_tls;
13575 /* Check that tls relocs are used with tls syms, and non-tls
13576 relocs are used with non-tls syms. */
13577 if (r_symndx != STN_UNDEF
13578 && r_type != R_PPC64_NONE
13580 || h->elf.root.type == bfd_link_hash_defined
13581 || h->elf.root.type == bfd_link_hash_defweak)
13582 && (IS_PPC64_TLS_RELOC (r_type)
13583 != (sym_type == STT_TLS
13584 || (sym_type == STT_SECTION
13585 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
13588 && (r_type == R_PPC64_TLS
13589 || r_type == R_PPC64_TLSGD
13590 || r_type == R_PPC64_TLSLD))
13591 /* R_PPC64_TLS is OK against a symbol in the TOC. */
13594 info->callbacks->einfo
13595 (!IS_PPC64_TLS_RELOC (r_type)
13596 /* xgettext:c-format */
13597 ? _("%H: %s used with TLS symbol `%T'\n")
13598 /* xgettext:c-format */
13599 : _("%H: %s used with non-TLS symbol `%T'\n"),
13600 input_bfd, input_section, rel->r_offset,
13601 ppc64_elf_howto_table[r_type]->name,
13605 /* Ensure reloc mapping code below stays sane. */
13606 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
13607 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
13608 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
13609 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
13610 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
13611 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
13612 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
13613 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
13614 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
13615 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
13623 case R_PPC64_LO_DS_OPT:
13624 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
13625 if ((insn & (0x3f << 26)) != 58u << 26)
13627 insn += (14u << 26) - (58u << 26);
13628 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
13629 r_type = R_PPC64_TOC16_LO;
13630 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13633 case R_PPC64_TOC16:
13634 case R_PPC64_TOC16_LO:
13635 case R_PPC64_TOC16_DS:
13636 case R_PPC64_TOC16_LO_DS:
13638 /* Check for toc tls entries. */
13639 unsigned char *toc_tls;
13642 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13643 &local_syms, rel, input_bfd);
13649 tls_mask = *toc_tls;
13650 if (r_type == R_PPC64_TOC16_DS
13651 || r_type == R_PPC64_TOC16_LO_DS)
13654 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
13659 /* If we found a GD reloc pair, then we might be
13660 doing a GD->IE transition. */
13663 tls_gd = TLS_TPRELGD;
13664 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13667 else if (retval == 3)
13669 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13677 case R_PPC64_GOT_TPREL16_HI:
13678 case R_PPC64_GOT_TPREL16_HA:
13680 && (tls_mask & TLS_TPREL) == 0)
13682 rel->r_offset -= d_offset;
13683 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
13684 r_type = R_PPC64_NONE;
13685 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13689 case R_PPC64_GOT_TPREL16_DS:
13690 case R_PPC64_GOT_TPREL16_LO_DS:
13692 && (tls_mask & TLS_TPREL) == 0)
13695 insn = bfd_get_32 (input_bfd,
13696 contents + rel->r_offset - d_offset);
13698 insn |= 0x3c0d0000; /* addis 0,13,0 */
13699 bfd_put_32 (input_bfd, insn,
13700 contents + rel->r_offset - d_offset);
13701 r_type = R_PPC64_TPREL16_HA;
13702 if (toc_symndx != 0)
13704 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13705 rel->r_addend = toc_addend;
13706 /* We changed the symbol. Start over in order to
13707 get h, sym, sec etc. right. */
13711 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13717 && (tls_mask & TLS_TPREL) == 0)
13719 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
13720 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
13723 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
13724 /* Was PPC64_TLS which sits on insn boundary, now
13725 PPC64_TPREL16_LO which is at low-order half-word. */
13726 rel->r_offset += d_offset;
13727 r_type = R_PPC64_TPREL16_LO;
13728 if (toc_symndx != 0)
13730 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13731 rel->r_addend = toc_addend;
13732 /* We changed the symbol. Start over in order to
13733 get h, sym, sec etc. right. */
13737 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13741 case R_PPC64_GOT_TLSGD16_HI:
13742 case R_PPC64_GOT_TLSGD16_HA:
13743 tls_gd = TLS_TPRELGD;
13744 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13748 case R_PPC64_GOT_TLSLD16_HI:
13749 case R_PPC64_GOT_TLSLD16_HA:
13750 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13753 if ((tls_mask & tls_gd) != 0)
13754 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13755 + R_PPC64_GOT_TPREL16_DS);
13758 rel->r_offset -= d_offset;
13759 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
13760 r_type = R_PPC64_NONE;
13762 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13766 case R_PPC64_GOT_TLSGD16:
13767 case R_PPC64_GOT_TLSGD16_LO:
13768 tls_gd = TLS_TPRELGD;
13769 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13773 case R_PPC64_GOT_TLSLD16:
13774 case R_PPC64_GOT_TLSLD16_LO:
13775 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13777 unsigned int insn1, insn2;
13781 offset = (bfd_vma) -1;
13782 /* If not using the newer R_PPC64_TLSGD/LD to mark
13783 __tls_get_addr calls, we must trust that the call
13784 stays with its arg setup insns, ie. that the next
13785 reloc is the __tls_get_addr call associated with
13786 the current reloc. Edit both insns. */
13787 if (input_section->has_tls_get_addr_call
13788 && rel + 1 < relend
13789 && branch_reloc_hash_match (input_bfd, rel + 1,
13790 htab->tls_get_addr,
13791 htab->tls_get_addr_fd))
13792 offset = rel[1].r_offset;
13793 /* We read the low GOT_TLS (or TOC16) insn because we
13794 need to keep the destination reg. It may be
13795 something other than the usual r3, and moved to r3
13796 before the call by intervening code. */
13797 insn1 = bfd_get_32 (input_bfd,
13798 contents + rel->r_offset - d_offset);
13799 if ((tls_mask & tls_gd) != 0)
13802 insn1 &= (0x1f << 21) | (0x1f << 16);
13803 insn1 |= 58 << 26; /* ld */
13804 insn2 = 0x7c636a14; /* add 3,3,13 */
13805 if (offset != (bfd_vma) -1)
13806 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13807 if ((tls_mask & TLS_EXPLICIT) == 0)
13808 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13809 + R_PPC64_GOT_TPREL16_DS);
13811 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
13812 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13817 insn1 &= 0x1f << 21;
13818 insn1 |= 0x3c0d0000; /* addis r,13,0 */
13819 insn2 = 0x38630000; /* addi 3,3,0 */
13822 /* Was an LD reloc. */
13824 sec = local_sections[toc_symndx];
13826 r_symndx < symtab_hdr->sh_info;
13828 if (local_sections[r_symndx] == sec)
13830 if (r_symndx >= symtab_hdr->sh_info)
13831 r_symndx = STN_UNDEF;
13832 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13833 if (r_symndx != STN_UNDEF)
13834 rel->r_addend -= (local_syms[r_symndx].st_value
13835 + sec->output_offset
13836 + sec->output_section->vma);
13838 else if (toc_symndx != 0)
13840 r_symndx = toc_symndx;
13841 rel->r_addend = toc_addend;
13843 r_type = R_PPC64_TPREL16_HA;
13844 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13845 if (offset != (bfd_vma) -1)
13847 rel[1].r_info = ELF64_R_INFO (r_symndx,
13848 R_PPC64_TPREL16_LO);
13849 rel[1].r_offset = offset + d_offset;
13850 rel[1].r_addend = rel->r_addend;
13853 bfd_put_32 (input_bfd, insn1,
13854 contents + rel->r_offset - d_offset);
13855 if (offset != (bfd_vma) -1)
13856 bfd_put_32 (input_bfd, insn2, contents + offset);
13857 if ((tls_mask & tls_gd) == 0
13858 && (tls_gd == 0 || toc_symndx != 0))
13860 /* We changed the symbol. Start over in order
13861 to get h, sym, sec etc. right. */
13867 case R_PPC64_TLSGD:
13868 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13870 unsigned int insn2;
13871 bfd_vma offset = rel->r_offset;
13873 if ((tls_mask & TLS_TPRELGD) != 0)
13876 r_type = R_PPC64_NONE;
13877 insn2 = 0x7c636a14; /* add 3,3,13 */
13882 if (toc_symndx != 0)
13884 r_symndx = toc_symndx;
13885 rel->r_addend = toc_addend;
13887 r_type = R_PPC64_TPREL16_LO;
13888 rel->r_offset = offset + d_offset;
13889 insn2 = 0x38630000; /* addi 3,3,0 */
13891 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13892 /* Zap the reloc on the _tls_get_addr call too. */
13893 BFD_ASSERT (offset == rel[1].r_offset);
13894 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13895 bfd_put_32 (input_bfd, insn2, contents + offset);
13896 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
13901 case R_PPC64_TLSLD:
13902 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13904 unsigned int insn2;
13905 bfd_vma offset = rel->r_offset;
13908 sec = local_sections[toc_symndx];
13910 r_symndx < symtab_hdr->sh_info;
13912 if (local_sections[r_symndx] == sec)
13914 if (r_symndx >= symtab_hdr->sh_info)
13915 r_symndx = STN_UNDEF;
13916 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13917 if (r_symndx != STN_UNDEF)
13918 rel->r_addend -= (local_syms[r_symndx].st_value
13919 + sec->output_offset
13920 + sec->output_section->vma);
13922 r_type = R_PPC64_TPREL16_LO;
13923 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13924 rel->r_offset = offset + d_offset;
13925 /* Zap the reloc on the _tls_get_addr call too. */
13926 BFD_ASSERT (offset == rel[1].r_offset);
13927 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13928 insn2 = 0x38630000; /* addi 3,3,0 */
13929 bfd_put_32 (input_bfd, insn2, contents + offset);
13934 case R_PPC64_DTPMOD64:
13935 if (rel + 1 < relend
13936 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
13937 && rel[1].r_offset == rel->r_offset + 8)
13939 if ((tls_mask & TLS_GD) == 0)
13941 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
13942 if ((tls_mask & TLS_TPRELGD) != 0)
13943 r_type = R_PPC64_TPREL64;
13946 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13947 r_type = R_PPC64_NONE;
13949 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13954 if ((tls_mask & TLS_LD) == 0)
13956 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13957 r_type = R_PPC64_NONE;
13958 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13963 case R_PPC64_TPREL64:
13964 if ((tls_mask & TLS_TPREL) == 0)
13966 r_type = R_PPC64_NONE;
13967 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13971 case R_PPC64_ENTRY:
13972 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
13973 if (!bfd_link_pic (info)
13974 && !info->traditional_format
13975 && relocation + 0x80008000 <= 0xffffffff)
13977 unsigned int insn1, insn2;
13979 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
13980 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
13981 if ((insn1 & ~0xfffc) == LD_R2_0R12
13982 && insn2 == ADD_R2_R2_R12)
13984 bfd_put_32 (input_bfd,
13985 LIS_R2 + PPC_HA (relocation),
13986 contents + rel->r_offset);
13987 bfd_put_32 (input_bfd,
13988 ADDI_R2_R2 + PPC_LO (relocation),
13989 contents + rel->r_offset + 4);
13994 relocation -= (rel->r_offset
13995 + input_section->output_offset
13996 + input_section->output_section->vma);
13997 if (relocation + 0x80008000 <= 0xffffffff)
13999 unsigned int insn1, insn2;
14001 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
14002 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14003 if ((insn1 & ~0xfffc) == LD_R2_0R12
14004 && insn2 == ADD_R2_R2_R12)
14006 bfd_put_32 (input_bfd,
14007 ADDIS_R2_R12 + PPC_HA (relocation),
14008 contents + rel->r_offset);
14009 bfd_put_32 (input_bfd,
14010 ADDI_R2_R2 + PPC_LO (relocation),
14011 contents + rel->r_offset + 4);
14017 case R_PPC64_REL16_HA:
14018 /* If we are generating a non-PIC executable, edit
14019 . 0: addis 2,12,.TOC.-0b@ha
14020 . addi 2,2,.TOC.-0b@l
14021 used by ELFv2 global entry points to set up r2, to
14024 if .TOC. is in range. */
14025 if (!bfd_link_pic (info)
14026 && !info->traditional_format
14028 && rel->r_addend == d_offset
14029 && h != NULL && &h->elf == htab->elf.hgot
14030 && rel + 1 < relend
14031 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
14032 && rel[1].r_offset == rel->r_offset + 4
14033 && rel[1].r_addend == rel->r_addend + 4
14034 && relocation + 0x80008000 <= 0xffffffff)
14036 unsigned int insn1, insn2;
14037 bfd_vma offset = rel->r_offset - d_offset;
14038 insn1 = bfd_get_32 (input_bfd, contents + offset);
14039 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
14040 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
14041 && (insn2 & 0xffff0000) == ADDI_R2_R2)
14043 r_type = R_PPC64_ADDR16_HA;
14044 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14045 rel->r_addend -= d_offset;
14046 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
14047 rel[1].r_addend -= d_offset + 4;
14048 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
14054 /* Handle other relocations that tweak non-addend part of insn. */
14056 max_br_offset = 1 << 25;
14057 addend = rel->r_addend;
14058 reloc_dest = DEST_NORMAL;
14064 case R_PPC64_TOCSAVE:
14065 if (relocation + addend == (rel->r_offset
14066 + input_section->output_offset
14067 + input_section->output_section->vma)
14068 && tocsave_find (htab, NO_INSERT,
14069 &local_syms, rel, input_bfd))
14071 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14073 || insn == CROR_151515 || insn == CROR_313131)
14074 bfd_put_32 (input_bfd,
14075 STD_R2_0R1 + STK_TOC (htab),
14076 contents + rel->r_offset);
14080 /* Branch taken prediction relocations. */
14081 case R_PPC64_ADDR14_BRTAKEN:
14082 case R_PPC64_REL14_BRTAKEN:
14083 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
14084 /* Fall through. */
14086 /* Branch not taken prediction relocations. */
14087 case R_PPC64_ADDR14_BRNTAKEN:
14088 case R_PPC64_REL14_BRNTAKEN:
14089 insn |= bfd_get_32 (input_bfd,
14090 contents + rel->r_offset) & ~(0x01 << 21);
14091 /* Fall through. */
14093 case R_PPC64_REL14:
14094 max_br_offset = 1 << 15;
14095 /* Fall through. */
14097 case R_PPC64_REL24:
14098 /* Calls to functions with a different TOC, such as calls to
14099 shared objects, need to alter the TOC pointer. This is
14100 done using a linkage stub. A REL24 branching to these
14101 linkage stubs needs to be followed by a nop, as the nop
14102 will be replaced with an instruction to restore the TOC
14107 && h->oh->is_func_descriptor)
14108 fdh = ppc_follow_link (h->oh);
14109 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
14111 if (stub_entry != NULL
14112 && (stub_entry->stub_type == ppc_stub_plt_call
14113 || stub_entry->stub_type == ppc_stub_plt_call_r2save
14114 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
14115 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
14117 bfd_boolean can_plt_call = FALSE;
14119 if (stub_entry->stub_type == ppc_stub_plt_call
14121 && htab->params->plt_localentry0 != 0
14122 && is_elfv2_localentry0 (&h->elf))
14124 /* The function doesn't use or change r2. */
14125 can_plt_call = TRUE;
14128 /* All of these stubs may modify r2, so there must be a
14129 branch and link followed by a nop. The nop is
14130 replaced by an insn to restore r2. */
14131 else if (rel->r_offset + 8 <= input_section->size)
14135 br = bfd_get_32 (input_bfd,
14136 contents + rel->r_offset);
14141 nop = bfd_get_32 (input_bfd,
14142 contents + rel->r_offset + 4);
14144 || nop == CROR_151515 || nop == CROR_313131)
14147 && (h == htab->tls_get_addr_fd
14148 || h == htab->tls_get_addr)
14149 && htab->params->tls_get_addr_opt)
14151 /* Special stub used, leave nop alone. */
14154 bfd_put_32 (input_bfd,
14155 LD_R2_0R1 + STK_TOC (htab),
14156 contents + rel->r_offset + 4);
14157 can_plt_call = TRUE;
14162 if (!can_plt_call && h != NULL)
14164 const char *name = h->elf.root.root.string;
14169 if (strncmp (name, "__libc_start_main", 17) == 0
14170 && (name[17] == 0 || name[17] == '@'))
14172 /* Allow crt1 branch to go via a toc adjusting
14173 stub. Other calls that never return could do
14174 the same, if we could detect such. */
14175 can_plt_call = TRUE;
14181 /* g++ as of 20130507 emits self-calls without a
14182 following nop. This is arguably wrong since we
14183 have conflicting information. On the one hand a
14184 global symbol and on the other a local call
14185 sequence, but don't error for this special case.
14186 It isn't possible to cheaply verify we have
14187 exactly such a call. Allow all calls to the same
14189 asection *code_sec = sec;
14191 if (get_opd_info (sec) != NULL)
14193 bfd_vma off = (relocation + addend
14194 - sec->output_section->vma
14195 - sec->output_offset);
14197 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
14199 if (code_sec == input_section)
14200 can_plt_call = TRUE;
14205 if (stub_entry->stub_type == ppc_stub_plt_call
14206 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14207 info->callbacks->einfo
14208 /* xgettext:c-format */
14209 (_("%H: call to `%T' lacks nop, can't restore toc; "
14210 "recompile with -fPIC\n"),
14211 input_bfd, input_section, rel->r_offset, sym_name);
14213 info->callbacks->einfo
14214 /* xgettext:c-format */
14215 (_("%H: call to `%T' lacks nop, can't restore toc; "
14216 "(-mcmodel=small toc adjust stub)\n"),
14217 input_bfd, input_section, rel->r_offset, sym_name);
14219 bfd_set_error (bfd_error_bad_value);
14224 && (stub_entry->stub_type == ppc_stub_plt_call
14225 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
14226 unresolved_reloc = FALSE;
14229 if ((stub_entry == NULL
14230 || stub_entry->stub_type == ppc_stub_long_branch
14231 || stub_entry->stub_type == ppc_stub_plt_branch)
14232 && get_opd_info (sec) != NULL)
14234 /* The branch destination is the value of the opd entry. */
14235 bfd_vma off = (relocation + addend
14236 - sec->output_section->vma
14237 - sec->output_offset);
14238 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
14239 if (dest != (bfd_vma) -1)
14243 reloc_dest = DEST_OPD;
14247 /* If the branch is out of reach we ought to have a long
14249 from = (rel->r_offset
14250 + input_section->output_offset
14251 + input_section->output_section->vma);
14253 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
14257 if (stub_entry != NULL
14258 && (stub_entry->stub_type == ppc_stub_long_branch
14259 || stub_entry->stub_type == ppc_stub_plt_branch)
14260 && (r_type == R_PPC64_ADDR14_BRTAKEN
14261 || r_type == R_PPC64_ADDR14_BRNTAKEN
14262 || (relocation + addend - from + max_br_offset
14263 < 2 * max_br_offset)))
14264 /* Don't use the stub if this branch is in range. */
14267 if (stub_entry != NULL)
14269 /* Munge up the value and addend so that we call the stub
14270 rather than the procedure directly. */
14271 asection *stub_sec = stub_entry->group->stub_sec;
14273 if (stub_entry->stub_type == ppc_stub_save_res)
14274 relocation += (stub_sec->output_offset
14275 + stub_sec->output_section->vma
14276 + stub_sec->size - htab->sfpr->size
14277 - htab->sfpr->output_offset
14278 - htab->sfpr->output_section->vma);
14280 relocation = (stub_entry->stub_offset
14281 + stub_sec->output_offset
14282 + stub_sec->output_section->vma);
14284 reloc_dest = DEST_STUB;
14286 if ((stub_entry->stub_type == ppc_stub_plt_call
14287 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14288 && (ALWAYS_EMIT_R2SAVE
14289 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14290 && rel + 1 < relend
14291 && rel[1].r_offset == rel->r_offset + 4
14292 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
14300 /* Set 'a' bit. This is 0b00010 in BO field for branch
14301 on CR(BI) insns (BO == 001at or 011at), and 0b01000
14302 for branch on CTR insns (BO == 1a00t or 1a01t). */
14303 if ((insn & (0x14 << 21)) == (0x04 << 21))
14304 insn |= 0x02 << 21;
14305 else if ((insn & (0x14 << 21)) == (0x10 << 21))
14306 insn |= 0x08 << 21;
14312 /* Invert 'y' bit if not the default. */
14313 if ((bfd_signed_vma) (relocation + addend - from) < 0)
14314 insn ^= 0x01 << 21;
14317 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
14320 /* NOP out calls to undefined weak functions.
14321 We can thus call a weak function without first
14322 checking whether the function is defined. */
14324 && h->elf.root.type == bfd_link_hash_undefweak
14325 && h->elf.dynindx == -1
14326 && r_type == R_PPC64_REL24
14330 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
14336 /* Set `addend'. */
14341 info->callbacks->einfo
14342 /* xgettext:c-format */
14343 (_("%P: %B: unknown relocation type %d for `%T'\n"),
14344 input_bfd, (int) r_type, sym_name);
14346 bfd_set_error (bfd_error_bad_value);
14352 case R_PPC64_TLSGD:
14353 case R_PPC64_TLSLD:
14354 case R_PPC64_TOCSAVE:
14355 case R_PPC64_GNU_VTINHERIT:
14356 case R_PPC64_GNU_VTENTRY:
14357 case R_PPC64_ENTRY:
14360 /* GOT16 relocations. Like an ADDR16 using the symbol's
14361 address in the GOT as relocation value instead of the
14362 symbol's value itself. Also, create a GOT entry for the
14363 symbol and put the symbol value there. */
14364 case R_PPC64_GOT_TLSGD16:
14365 case R_PPC64_GOT_TLSGD16_LO:
14366 case R_PPC64_GOT_TLSGD16_HI:
14367 case R_PPC64_GOT_TLSGD16_HA:
14368 tls_type = TLS_TLS | TLS_GD;
14371 case R_PPC64_GOT_TLSLD16:
14372 case R_PPC64_GOT_TLSLD16_LO:
14373 case R_PPC64_GOT_TLSLD16_HI:
14374 case R_PPC64_GOT_TLSLD16_HA:
14375 tls_type = TLS_TLS | TLS_LD;
14378 case R_PPC64_GOT_TPREL16_DS:
14379 case R_PPC64_GOT_TPREL16_LO_DS:
14380 case R_PPC64_GOT_TPREL16_HI:
14381 case R_PPC64_GOT_TPREL16_HA:
14382 tls_type = TLS_TLS | TLS_TPREL;
14385 case R_PPC64_GOT_DTPREL16_DS:
14386 case R_PPC64_GOT_DTPREL16_LO_DS:
14387 case R_PPC64_GOT_DTPREL16_HI:
14388 case R_PPC64_GOT_DTPREL16_HA:
14389 tls_type = TLS_TLS | TLS_DTPREL;
14392 case R_PPC64_GOT16:
14393 case R_PPC64_GOT16_LO:
14394 case R_PPC64_GOT16_HI:
14395 case R_PPC64_GOT16_HA:
14396 case R_PPC64_GOT16_DS:
14397 case R_PPC64_GOT16_LO_DS:
14400 /* Relocation is to the entry for this symbol in the global
14405 unsigned long indx = 0;
14406 struct got_entry *ent;
14408 if (tls_type == (TLS_TLS | TLS_LD)
14410 || !h->elf.def_dynamic))
14411 ent = ppc64_tlsld_got (input_bfd);
14416 if (!htab->elf.dynamic_sections_created
14417 || h->elf.dynindx == -1
14418 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
14419 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
14420 /* This is actually a static link, or it is a
14421 -Bsymbolic link and the symbol is defined
14422 locally, or the symbol was forced to be local
14423 because of a version file. */
14427 indx = h->elf.dynindx;
14428 unresolved_reloc = FALSE;
14430 ent = h->elf.got.glist;
14434 if (local_got_ents == NULL)
14436 ent = local_got_ents[r_symndx];
14439 for (; ent != NULL; ent = ent->next)
14440 if (ent->addend == orig_rel.r_addend
14441 && ent->owner == input_bfd
14442 && ent->tls_type == tls_type)
14448 if (ent->is_indirect)
14449 ent = ent->got.ent;
14450 offp = &ent->got.offset;
14451 got = ppc64_elf_tdata (ent->owner)->got;
14455 /* The offset must always be a multiple of 8. We use the
14456 least significant bit to record whether we have already
14457 processed this entry. */
14459 if ((off & 1) != 0)
14463 /* Generate relocs for the dynamic linker, except in
14464 the case of TLSLD where we'll use one entry per
14472 ? h->elf.type == STT_GNU_IFUNC
14473 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
14476 relgot = htab->elf.irelplt;
14478 htab->local_ifunc_resolver = 1;
14479 else if (is_static_defined (&h->elf))
14480 htab->maybe_local_ifunc_resolver = 1;
14483 || (bfd_link_pic (info)
14485 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf)
14486 || (tls_type == (TLS_TLS | TLS_LD)
14487 && !h->elf.def_dynamic))))
14488 relgot = ppc64_elf_tdata (ent->owner)->relgot;
14489 if (relgot != NULL)
14491 outrel.r_offset = (got->output_section->vma
14492 + got->output_offset
14494 outrel.r_addend = addend;
14495 if (tls_type & (TLS_LD | TLS_GD))
14497 outrel.r_addend = 0;
14498 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
14499 if (tls_type == (TLS_TLS | TLS_GD))
14501 loc = relgot->contents;
14502 loc += (relgot->reloc_count++
14503 * sizeof (Elf64_External_Rela));
14504 bfd_elf64_swap_reloca_out (output_bfd,
14506 outrel.r_offset += 8;
14507 outrel.r_addend = addend;
14509 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
14512 else if (tls_type == (TLS_TLS | TLS_DTPREL))
14513 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
14514 else if (tls_type == (TLS_TLS | TLS_TPREL))
14515 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
14516 else if (indx != 0)
14517 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
14521 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14523 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14525 /* Write the .got section contents for the sake
14527 loc = got->contents + off;
14528 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
14532 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
14534 outrel.r_addend += relocation;
14535 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
14537 if (htab->elf.tls_sec == NULL)
14538 outrel.r_addend = 0;
14540 outrel.r_addend -= htab->elf.tls_sec->vma;
14543 loc = relgot->contents;
14544 loc += (relgot->reloc_count++
14545 * sizeof (Elf64_External_Rela));
14546 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14549 /* Init the .got section contents here if we're not
14550 emitting a reloc. */
14553 relocation += addend;
14556 if (htab->elf.tls_sec == NULL)
14560 if (tls_type & TLS_LD)
14563 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
14564 if (tls_type & TLS_TPREL)
14565 relocation += DTP_OFFSET - TP_OFFSET;
14568 if (tls_type & (TLS_GD | TLS_LD))
14570 bfd_put_64 (output_bfd, relocation,
14571 got->contents + off + 8);
14575 bfd_put_64 (output_bfd, relocation,
14576 got->contents + off);
14580 if (off >= (bfd_vma) -2)
14583 relocation = got->output_section->vma + got->output_offset + off;
14584 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
14588 case R_PPC64_PLT16_HA:
14589 case R_PPC64_PLT16_HI:
14590 case R_PPC64_PLT16_LO:
14591 case R_PPC64_PLT32:
14592 case R_PPC64_PLT64:
14593 /* Relocation is to the entry for this symbol in the
14594 procedure linkage table. */
14596 struct plt_entry **plt_list = NULL;
14598 plt_list = &h->elf.plt.plist;
14599 else if (local_got_ents != NULL)
14601 struct plt_entry **local_plt = (struct plt_entry **)
14602 (local_got_ents + symtab_hdr->sh_info);
14603 unsigned char *local_got_tls_masks = (unsigned char *)
14604 (local_plt + symtab_hdr->sh_info);
14605 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
14606 plt_list = local_plt + r_symndx;
14610 struct plt_entry *ent;
14612 for (ent = *plt_list; ent != NULL; ent = ent->next)
14613 if (ent->plt.offset != (bfd_vma) -1
14614 && ent->addend == orig_rel.r_addend)
14618 plt = htab->elf.splt;
14619 if (!htab->elf.dynamic_sections_created
14621 || h->elf.dynindx == -1)
14622 plt = htab->elf.iplt;
14623 relocation = (plt->output_section->vma
14624 + plt->output_offset
14625 + ent->plt.offset);
14627 unresolved_reloc = FALSE;
14635 /* Relocation value is TOC base. */
14636 relocation = TOCstart;
14637 if (r_symndx == STN_UNDEF)
14638 relocation += htab->sec_info[input_section->id].toc_off;
14639 else if (unresolved_reloc)
14641 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
14642 relocation += htab->sec_info[sec->id].toc_off;
14644 unresolved_reloc = TRUE;
14647 /* TOC16 relocs. We want the offset relative to the TOC base,
14648 which is the address of the start of the TOC plus 0x8000.
14649 The TOC consists of sections .got, .toc, .tocbss, and .plt,
14651 case R_PPC64_TOC16:
14652 case R_PPC64_TOC16_LO:
14653 case R_PPC64_TOC16_HI:
14654 case R_PPC64_TOC16_DS:
14655 case R_PPC64_TOC16_LO_DS:
14656 case R_PPC64_TOC16_HA:
14657 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
14660 /* Relocate against the beginning of the section. */
14661 case R_PPC64_SECTOFF:
14662 case R_PPC64_SECTOFF_LO:
14663 case R_PPC64_SECTOFF_HI:
14664 case R_PPC64_SECTOFF_DS:
14665 case R_PPC64_SECTOFF_LO_DS:
14666 case R_PPC64_SECTOFF_HA:
14668 addend -= sec->output_section->vma;
14671 case R_PPC64_REL16:
14672 case R_PPC64_REL16_LO:
14673 case R_PPC64_REL16_HI:
14674 case R_PPC64_REL16_HA:
14675 case R_PPC64_REL16DX_HA:
14678 case R_PPC64_REL14:
14679 case R_PPC64_REL14_BRNTAKEN:
14680 case R_PPC64_REL14_BRTAKEN:
14681 case R_PPC64_REL24:
14684 case R_PPC64_TPREL16:
14685 case R_PPC64_TPREL16_LO:
14686 case R_PPC64_TPREL16_HI:
14687 case R_PPC64_TPREL16_HA:
14688 case R_PPC64_TPREL16_DS:
14689 case R_PPC64_TPREL16_LO_DS:
14690 case R_PPC64_TPREL16_HIGH:
14691 case R_PPC64_TPREL16_HIGHA:
14692 case R_PPC64_TPREL16_HIGHER:
14693 case R_PPC64_TPREL16_HIGHERA:
14694 case R_PPC64_TPREL16_HIGHEST:
14695 case R_PPC64_TPREL16_HIGHESTA:
14697 && h->elf.root.type == bfd_link_hash_undefweak
14698 && h->elf.dynindx == -1)
14700 /* Make this relocation against an undefined weak symbol
14701 resolve to zero. This is really just a tweak, since
14702 code using weak externs ought to check that they are
14703 defined before using them. */
14704 bfd_byte *p = contents + rel->r_offset - d_offset;
14706 insn = bfd_get_32 (input_bfd, p);
14707 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
14709 bfd_put_32 (input_bfd, insn, p);
14712 if (htab->elf.tls_sec != NULL)
14713 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14714 /* The TPREL16 relocs shouldn't really be used in shared
14715 libs or with non-local symbols as that will result in
14716 DT_TEXTREL being set, but support them anyway. */
14719 case R_PPC64_DTPREL16:
14720 case R_PPC64_DTPREL16_LO:
14721 case R_PPC64_DTPREL16_HI:
14722 case R_PPC64_DTPREL16_HA:
14723 case R_PPC64_DTPREL16_DS:
14724 case R_PPC64_DTPREL16_LO_DS:
14725 case R_PPC64_DTPREL16_HIGH:
14726 case R_PPC64_DTPREL16_HIGHA:
14727 case R_PPC64_DTPREL16_HIGHER:
14728 case R_PPC64_DTPREL16_HIGHERA:
14729 case R_PPC64_DTPREL16_HIGHEST:
14730 case R_PPC64_DTPREL16_HIGHESTA:
14731 if (htab->elf.tls_sec != NULL)
14732 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14735 case R_PPC64_ADDR64_LOCAL:
14736 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
14741 case R_PPC64_DTPMOD64:
14746 case R_PPC64_TPREL64:
14747 if (htab->elf.tls_sec != NULL)
14748 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14751 case R_PPC64_DTPREL64:
14752 if (htab->elf.tls_sec != NULL)
14753 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14754 /* Fall through. */
14756 /* Relocations that may need to be propagated if this is a
14758 case R_PPC64_REL30:
14759 case R_PPC64_REL32:
14760 case R_PPC64_REL64:
14761 case R_PPC64_ADDR14:
14762 case R_PPC64_ADDR14_BRNTAKEN:
14763 case R_PPC64_ADDR14_BRTAKEN:
14764 case R_PPC64_ADDR16:
14765 case R_PPC64_ADDR16_DS:
14766 case R_PPC64_ADDR16_HA:
14767 case R_PPC64_ADDR16_HI:
14768 case R_PPC64_ADDR16_HIGH:
14769 case R_PPC64_ADDR16_HIGHA:
14770 case R_PPC64_ADDR16_HIGHER:
14771 case R_PPC64_ADDR16_HIGHERA:
14772 case R_PPC64_ADDR16_HIGHEST:
14773 case R_PPC64_ADDR16_HIGHESTA:
14774 case R_PPC64_ADDR16_LO:
14775 case R_PPC64_ADDR16_LO_DS:
14776 case R_PPC64_ADDR24:
14777 case R_PPC64_ADDR32:
14778 case R_PPC64_ADDR64:
14779 case R_PPC64_UADDR16:
14780 case R_PPC64_UADDR32:
14781 case R_PPC64_UADDR64:
14783 if ((input_section->flags & SEC_ALLOC) == 0)
14786 if (NO_OPD_RELOCS && is_opd)
14789 if (bfd_link_pic (info)
14791 || h->dyn_relocs != NULL)
14792 && ((h != NULL && pc_dynrelocs (h))
14793 || must_be_dyn_reloc (info, r_type)))
14795 ? h->dyn_relocs != NULL
14796 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
14798 bfd_boolean skip, relocate;
14803 /* When generating a dynamic object, these relocations
14804 are copied into the output file to be resolved at run
14810 out_off = _bfd_elf_section_offset (output_bfd, info,
14811 input_section, rel->r_offset);
14812 if (out_off == (bfd_vma) -1)
14814 else if (out_off == (bfd_vma) -2)
14815 skip = TRUE, relocate = TRUE;
14816 out_off += (input_section->output_section->vma
14817 + input_section->output_offset);
14818 outrel.r_offset = out_off;
14819 outrel.r_addend = rel->r_addend;
14821 /* Optimize unaligned reloc use. */
14822 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
14823 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
14824 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
14825 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
14826 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
14827 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
14828 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
14829 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
14830 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
14833 memset (&outrel, 0, sizeof outrel);
14834 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
14836 && r_type != R_PPC64_TOC)
14838 indx = h->elf.dynindx;
14839 BFD_ASSERT (indx != -1);
14840 outrel.r_info = ELF64_R_INFO (indx, r_type);
14844 /* This symbol is local, or marked to become local,
14845 or this is an opd section reloc which must point
14846 at a local function. */
14847 outrel.r_addend += relocation;
14848 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
14850 if (is_opd && h != NULL)
14852 /* Lie about opd entries. This case occurs
14853 when building shared libraries and we
14854 reference a function in another shared
14855 lib. The same thing happens for a weak
14856 definition in an application that's
14857 overridden by a strong definition in a
14858 shared lib. (I believe this is a generic
14859 bug in binutils handling of weak syms.)
14860 In these cases we won't use the opd
14861 entry in this lib. */
14862 unresolved_reloc = FALSE;
14865 && r_type == R_PPC64_ADDR64
14867 ? h->elf.type == STT_GNU_IFUNC
14868 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
14869 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14872 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14874 /* We need to relocate .opd contents for ld.so.
14875 Prelink also wants simple and consistent rules
14876 for relocs. This make all RELATIVE relocs have
14877 *r_offset equal to r_addend. */
14884 ? h->elf.type == STT_GNU_IFUNC
14885 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14887 info->callbacks->einfo
14888 /* xgettext:c-format */
14889 (_("%H: %s for indirect "
14890 "function `%T' unsupported\n"),
14891 input_bfd, input_section, rel->r_offset,
14892 ppc64_elf_howto_table[r_type]->name,
14896 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
14898 else if (sec == NULL || sec->owner == NULL)
14900 bfd_set_error (bfd_error_bad_value);
14907 osec = sec->output_section;
14908 indx = elf_section_data (osec)->dynindx;
14912 if ((osec->flags & SEC_READONLY) == 0
14913 && htab->elf.data_index_section != NULL)
14914 osec = htab->elf.data_index_section;
14916 osec = htab->elf.text_index_section;
14917 indx = elf_section_data (osec)->dynindx;
14919 BFD_ASSERT (indx != 0);
14921 /* We are turning this relocation into one
14922 against a section symbol, so subtract out
14923 the output section's address but not the
14924 offset of the input section in the output
14926 outrel.r_addend -= osec->vma;
14929 outrel.r_info = ELF64_R_INFO (indx, r_type);
14933 sreloc = elf_section_data (input_section)->sreloc;
14935 ? h->elf.type == STT_GNU_IFUNC
14936 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14938 sreloc = htab->elf.irelplt;
14940 htab->local_ifunc_resolver = 1;
14941 else if (is_static_defined (&h->elf))
14942 htab->maybe_local_ifunc_resolver = 1;
14944 if (sreloc == NULL)
14947 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
14950 loc = sreloc->contents;
14951 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
14952 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14954 /* If this reloc is against an external symbol, it will
14955 be computed at runtime, so there's no need to do
14956 anything now. However, for the sake of prelink ensure
14957 that the section contents are a known value. */
14960 unresolved_reloc = FALSE;
14961 /* The value chosen here is quite arbitrary as ld.so
14962 ignores section contents except for the special
14963 case of .opd where the contents might be accessed
14964 before relocation. Choose zero, as that won't
14965 cause reloc overflow. */
14968 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
14969 to improve backward compatibility with older
14971 if (r_type == R_PPC64_ADDR64)
14972 addend = outrel.r_addend;
14973 /* Adjust pc_relative relocs to have zero in *r_offset. */
14974 else if (ppc64_elf_howto_table[r_type]->pc_relative)
14975 addend = outrel.r_offset;
14981 case R_PPC64_GLOB_DAT:
14982 case R_PPC64_JMP_SLOT:
14983 case R_PPC64_JMP_IREL:
14984 case R_PPC64_RELATIVE:
14985 /* We shouldn't ever see these dynamic relocs in relocatable
14987 /* Fall through. */
14989 case R_PPC64_PLTGOT16:
14990 case R_PPC64_PLTGOT16_DS:
14991 case R_PPC64_PLTGOT16_HA:
14992 case R_PPC64_PLTGOT16_HI:
14993 case R_PPC64_PLTGOT16_LO:
14994 case R_PPC64_PLTGOT16_LO_DS:
14995 case R_PPC64_PLTREL32:
14996 case R_PPC64_PLTREL64:
14997 /* These ones haven't been implemented yet. */
14999 info->callbacks->einfo
15000 /* xgettext:c-format */
15001 (_("%P: %B: %s is not supported for `%T'\n"),
15003 ppc64_elf_howto_table[r_type]->name, sym_name);
15005 bfd_set_error (bfd_error_invalid_operation);
15010 /* Multi-instruction sequences that access the TOC can be
15011 optimized, eg. addis ra,r2,0; addi rb,ra,x;
15012 to nop; addi rb,r2,x; */
15013 howto = ppc64_elf_howto_table[(int) r_type];
15019 case R_PPC64_GOT_TLSLD16_HI:
15020 case R_PPC64_GOT_TLSGD16_HI:
15021 case R_PPC64_GOT_TPREL16_HI:
15022 case R_PPC64_GOT_DTPREL16_HI:
15023 case R_PPC64_GOT16_HI:
15024 case R_PPC64_TOC16_HI:
15025 /* These relocs would only be useful if building up an
15026 offset to later add to r2, perhaps in an indexed
15027 addressing mode instruction. Don't try to optimize.
15028 Unfortunately, the possibility of someone building up an
15029 offset like this or even with the HA relocs, means that
15030 we need to check the high insn when optimizing the low
15034 case R_PPC64_GOT_TLSLD16_HA:
15035 case R_PPC64_GOT_TLSGD16_HA:
15036 case R_PPC64_GOT_TPREL16_HA:
15037 case R_PPC64_GOT_DTPREL16_HA:
15038 case R_PPC64_GOT16_HA:
15039 case R_PPC64_TOC16_HA:
15040 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
15041 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
15043 bfd_byte *p = contents + (rel->r_offset & ~3);
15044 bfd_put_32 (input_bfd, NOP, p);
15048 case R_PPC64_GOT_TLSLD16_LO:
15049 case R_PPC64_GOT_TLSGD16_LO:
15050 case R_PPC64_GOT_TPREL16_LO_DS:
15051 case R_PPC64_GOT_DTPREL16_LO_DS:
15052 case R_PPC64_GOT16_LO:
15053 case R_PPC64_GOT16_LO_DS:
15054 case R_PPC64_TOC16_LO:
15055 case R_PPC64_TOC16_LO_DS:
15056 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
15057 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
15059 bfd_byte *p = contents + (rel->r_offset & ~3);
15060 insn = bfd_get_32 (input_bfd, p);
15061 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
15063 /* Transform addic to addi when we change reg. */
15064 insn &= ~((0x3f << 26) | (0x1f << 16));
15065 insn |= (14u << 26) | (2 << 16);
15069 insn &= ~(0x1f << 16);
15072 bfd_put_32 (input_bfd, insn, p);
15076 case R_PPC64_TPREL16_HA:
15077 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
15079 bfd_byte *p = contents + (rel->r_offset & ~3);
15080 insn = bfd_get_32 (input_bfd, p);
15081 if ((insn & ((0x3f << 26) | 0x1f << 16))
15082 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */)
15083 /* xgettext:c-format */
15084 info->callbacks->minfo
15085 (_("%H: warning: %s unexpected insn %#x.\n"),
15086 input_bfd, input_section, rel->r_offset, howto->name, insn);
15088 bfd_put_32 (input_bfd, NOP, p);
15092 case R_PPC64_TPREL16_LO:
15093 case R_PPC64_TPREL16_LO_DS:
15094 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
15096 bfd_byte *p = contents + (rel->r_offset & ~3);
15097 insn = bfd_get_32 (input_bfd, p);
15098 insn &= ~(0x1f << 16);
15100 bfd_put_32 (input_bfd, insn, p);
15105 /* Do any further special processing. */
15111 case R_PPC64_REL16_HA:
15112 case R_PPC64_REL16DX_HA:
15113 case R_PPC64_ADDR16_HA:
15114 case R_PPC64_ADDR16_HIGHA:
15115 case R_PPC64_ADDR16_HIGHERA:
15116 case R_PPC64_ADDR16_HIGHESTA:
15117 case R_PPC64_TOC16_HA:
15118 case R_PPC64_SECTOFF_HA:
15119 case R_PPC64_TPREL16_HA:
15120 case R_PPC64_TPREL16_HIGHA:
15121 case R_PPC64_TPREL16_HIGHERA:
15122 case R_PPC64_TPREL16_HIGHESTA:
15123 case R_PPC64_DTPREL16_HA:
15124 case R_PPC64_DTPREL16_HIGHA:
15125 case R_PPC64_DTPREL16_HIGHERA:
15126 case R_PPC64_DTPREL16_HIGHESTA:
15127 /* It's just possible that this symbol is a weak symbol
15128 that's not actually defined anywhere. In that case,
15129 'sec' would be NULL, and we should leave the symbol
15130 alone (it will be set to zero elsewhere in the link). */
15133 /* Fall through. */
15135 case R_PPC64_GOT16_HA:
15136 case R_PPC64_PLTGOT16_HA:
15137 case R_PPC64_PLT16_HA:
15138 case R_PPC64_GOT_TLSGD16_HA:
15139 case R_PPC64_GOT_TLSLD16_HA:
15140 case R_PPC64_GOT_TPREL16_HA:
15141 case R_PPC64_GOT_DTPREL16_HA:
15142 /* Add 0x10000 if sign bit in 0:15 is set.
15143 Bits 0:15 are not used. */
15147 case R_PPC64_ADDR16_DS:
15148 case R_PPC64_ADDR16_LO_DS:
15149 case R_PPC64_GOT16_DS:
15150 case R_PPC64_GOT16_LO_DS:
15151 case R_PPC64_PLT16_LO_DS:
15152 case R_PPC64_SECTOFF_DS:
15153 case R_PPC64_SECTOFF_LO_DS:
15154 case R_PPC64_TOC16_DS:
15155 case R_PPC64_TOC16_LO_DS:
15156 case R_PPC64_PLTGOT16_DS:
15157 case R_PPC64_PLTGOT16_LO_DS:
15158 case R_PPC64_GOT_TPREL16_DS:
15159 case R_PPC64_GOT_TPREL16_LO_DS:
15160 case R_PPC64_GOT_DTPREL16_DS:
15161 case R_PPC64_GOT_DTPREL16_LO_DS:
15162 case R_PPC64_TPREL16_DS:
15163 case R_PPC64_TPREL16_LO_DS:
15164 case R_PPC64_DTPREL16_DS:
15165 case R_PPC64_DTPREL16_LO_DS:
15166 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
15168 /* If this reloc is against an lq, lxv, or stxv insn, then
15169 the value must be a multiple of 16. This is somewhat of
15170 a hack, but the "correct" way to do this by defining _DQ
15171 forms of all the _DS relocs bloats all reloc switches in
15172 this file. It doesn't make much sense to use these
15173 relocs in data, so testing the insn should be safe. */
15174 if ((insn & (0x3f << 26)) == (56u << 26)
15175 || ((insn & (0x3f << 26)) == (61u << 26) && (insn & 3) == 1))
15177 relocation += addend;
15178 addend = insn & (mask ^ 3);
15179 if ((relocation & mask) != 0)
15181 relocation ^= relocation & mask;
15182 info->callbacks->einfo
15183 /* xgettext:c-format */
15184 (_("%H: error: %s not a multiple of %u\n"),
15185 input_bfd, input_section, rel->r_offset,
15188 bfd_set_error (bfd_error_bad_value);
15195 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
15196 because such sections are not SEC_ALLOC and thus ld.so will
15197 not process them. */
15198 if (unresolved_reloc
15199 && !((input_section->flags & SEC_DEBUGGING) != 0
15200 && h->elf.def_dynamic)
15201 && _bfd_elf_section_offset (output_bfd, info, input_section,
15202 rel->r_offset) != (bfd_vma) -1)
15204 info->callbacks->einfo
15205 /* xgettext:c-format */
15206 (_("%H: unresolvable %s against `%T'\n"),
15207 input_bfd, input_section, rel->r_offset,
15209 h->elf.root.root.string);
15213 /* 16-bit fields in insns mostly have signed values, but a
15214 few insns have 16-bit unsigned values. Really, we should
15215 have different reloc types. */
15216 if (howto->complain_on_overflow != complain_overflow_dont
15217 && howto->dst_mask == 0xffff
15218 && (input_section->flags & SEC_CODE) != 0)
15220 enum complain_overflow complain = complain_overflow_signed;
15222 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
15223 if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
15224 complain = complain_overflow_bitfield;
15225 else if (howto->rightshift == 0
15226 ? ((insn & (0x3f << 26)) == 28u << 26 /* andi */
15227 || (insn & (0x3f << 26)) == 24u << 26 /* ori */
15228 || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
15229 : ((insn & (0x3f << 26)) == 29u << 26 /* andis */
15230 || (insn & (0x3f << 26)) == 25u << 26 /* oris */
15231 || (insn & (0x3f << 26)) == 27u << 26 /* xoris */))
15232 complain = complain_overflow_unsigned;
15233 if (howto->complain_on_overflow != complain)
15235 alt_howto = *howto;
15236 alt_howto.complain_on_overflow = complain;
15237 howto = &alt_howto;
15241 if (r_type == R_PPC64_REL16DX_HA)
15243 /* Split field reloc isn't handled by _bfd_final_link_relocate. */
15244 if (rel->r_offset + 4 > input_section->size)
15245 r = bfd_reloc_outofrange;
15248 relocation += addend;
15249 relocation -= (rel->r_offset
15250 + input_section->output_offset
15251 + input_section->output_section->vma);
15252 relocation = (bfd_signed_vma) relocation >> 16;
15253 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15255 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
15256 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
15258 if (relocation + 0x8000 > 0xffff)
15259 r = bfd_reloc_overflow;
15263 r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
15264 rel->r_offset, relocation, addend);
15266 if (r != bfd_reloc_ok)
15268 char *more_info = NULL;
15269 const char *reloc_name = howto->name;
15271 if (reloc_dest != DEST_NORMAL)
15273 more_info = bfd_malloc (strlen (reloc_name) + 8);
15274 if (more_info != NULL)
15276 strcpy (more_info, reloc_name);
15277 strcat (more_info, (reloc_dest == DEST_OPD
15278 ? " (OPD)" : " (stub)"));
15279 reloc_name = more_info;
15283 if (r == bfd_reloc_overflow)
15285 /* On code like "if (foo) foo();" don't report overflow
15286 on a branch to zero when foo is undefined. */
15288 && (reloc_dest == DEST_STUB
15290 && (h->elf.root.type == bfd_link_hash_undefweak
15291 || h->elf.root.type == bfd_link_hash_undefined)
15292 && is_branch_reloc (r_type))))
15293 info->callbacks->reloc_overflow (info, &h->elf.root,
15294 sym_name, reloc_name,
15296 input_bfd, input_section,
15301 info->callbacks->einfo
15302 /* xgettext:c-format */
15303 (_("%H: %s against `%T': error %d\n"),
15304 input_bfd, input_section, rel->r_offset,
15305 reloc_name, sym_name, (int) r);
15308 if (more_info != NULL)
15318 Elf_Internal_Shdr *rel_hdr;
15319 size_t deleted = rel - wrel;
15321 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
15322 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15323 if (rel_hdr->sh_size == 0)
15325 /* It is too late to remove an empty reloc section. Leave
15327 ??? What is wrong with an empty section??? */
15328 rel_hdr->sh_size = rel_hdr->sh_entsize;
15331 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
15332 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15333 input_section->reloc_count -= deleted;
15336 /* If we're emitting relocations, then shortly after this function
15337 returns, reloc offsets and addends for this section will be
15338 adjusted. Worse, reloc symbol indices will be for the output
15339 file rather than the input. Save a copy of the relocs for
15340 opd_entry_value. */
15341 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
15344 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
15345 rel = bfd_alloc (input_bfd, amt);
15346 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
15347 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
15350 memcpy (rel, relocs, amt);
15355 /* Adjust the value of any local symbols in opd sections. */
15358 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
15359 const char *name ATTRIBUTE_UNUSED,
15360 Elf_Internal_Sym *elfsym,
15361 asection *input_sec,
15362 struct elf_link_hash_entry *h)
15364 struct _opd_sec_data *opd;
15371 opd = get_opd_info (input_sec);
15372 if (opd == NULL || opd->adjust == NULL)
15375 value = elfsym->st_value - input_sec->output_offset;
15376 if (!bfd_link_relocatable (info))
15377 value -= input_sec->output_section->vma;
15379 adjust = opd->adjust[OPD_NDX (value)];
15383 elfsym->st_value += adjust;
15387 /* Finish up dynamic symbol handling. We set the contents of various
15388 dynamic sections here. */
15391 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
15392 struct bfd_link_info *info,
15393 struct elf_link_hash_entry *h,
15394 Elf_Internal_Sym *sym)
15396 struct ppc_link_hash_table *htab;
15397 struct plt_entry *ent;
15398 Elf_Internal_Rela rela;
15401 htab = ppc_hash_table (info);
15405 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
15406 if (ent->plt.offset != (bfd_vma) -1)
15408 /* This symbol has an entry in the procedure linkage
15409 table. Set it up. */
15410 if (!htab->elf.dynamic_sections_created
15411 || h->dynindx == -1)
15413 BFD_ASSERT (h->type == STT_GNU_IFUNC
15415 && (h->root.type == bfd_link_hash_defined
15416 || h->root.type == bfd_link_hash_defweak));
15417 rela.r_offset = (htab->elf.iplt->output_section->vma
15418 + htab->elf.iplt->output_offset
15419 + ent->plt.offset);
15421 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
15423 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15424 rela.r_addend = (h->root.u.def.value
15425 + h->root.u.def.section->output_offset
15426 + h->root.u.def.section->output_section->vma
15428 loc = (htab->elf.irelplt->contents
15429 + (htab->elf.irelplt->reloc_count++
15430 * sizeof (Elf64_External_Rela)));
15431 htab->local_ifunc_resolver = 1;
15435 rela.r_offset = (htab->elf.splt->output_section->vma
15436 + htab->elf.splt->output_offset
15437 + ent->plt.offset);
15438 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
15439 rela.r_addend = ent->addend;
15440 loc = (htab->elf.srelplt->contents
15441 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
15442 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
15443 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
15444 htab->maybe_local_ifunc_resolver = 1;
15446 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
15448 if (!htab->opd_abi)
15450 if (!h->def_regular)
15452 /* Mark the symbol as undefined, rather than as
15453 defined in glink. Leave the value if there were
15454 any relocations where pointer equality matters
15455 (this is a clue for the dynamic linker, to make
15456 function pointer comparisons work between an
15457 application and shared library), otherwise set it
15459 sym->st_shndx = SHN_UNDEF;
15460 if (!h->pointer_equality_needed)
15462 else if (!h->ref_regular_nonweak)
15464 /* This breaks function pointer comparisons, but
15465 that is better than breaking tests for a NULL
15466 function pointer. */
15475 /* This symbol needs a copy reloc. Set it up. */
15478 if (h->dynindx == -1
15479 || (h->root.type != bfd_link_hash_defined
15480 && h->root.type != bfd_link_hash_defweak)
15481 || htab->elf.srelbss == NULL
15482 || htab->elf.sreldynrelro == NULL)
15485 rela.r_offset = (h->root.u.def.value
15486 + h->root.u.def.section->output_section->vma
15487 + h->root.u.def.section->output_offset);
15488 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
15490 if (h->root.u.def.section == htab->elf.sdynrelro)
15491 srel = htab->elf.sreldynrelro;
15493 srel = htab->elf.srelbss;
15494 loc = srel->contents;
15495 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
15496 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
15502 /* Used to decide how to sort relocs in an optimal manner for the
15503 dynamic linker, before writing them out. */
15505 static enum elf_reloc_type_class
15506 ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
15507 const asection *rel_sec,
15508 const Elf_Internal_Rela *rela)
15510 enum elf_ppc64_reloc_type r_type;
15511 struct ppc_link_hash_table *htab = ppc_hash_table (info);
15513 if (rel_sec == htab->elf.irelplt)
15514 return reloc_class_ifunc;
15516 r_type = ELF64_R_TYPE (rela->r_info);
15519 case R_PPC64_RELATIVE:
15520 return reloc_class_relative;
15521 case R_PPC64_JMP_SLOT:
15522 return reloc_class_plt;
15524 return reloc_class_copy;
15526 return reloc_class_normal;
15530 /* Finish up the dynamic sections. */
15533 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
15534 struct bfd_link_info *info)
15536 struct ppc_link_hash_table *htab;
15540 htab = ppc_hash_table (info);
15544 dynobj = htab->elf.dynobj;
15545 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
15547 if (htab->elf.dynamic_sections_created)
15549 Elf64_External_Dyn *dyncon, *dynconend;
15551 if (sdyn == NULL || htab->elf.sgot == NULL)
15554 dyncon = (Elf64_External_Dyn *) sdyn->contents;
15555 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
15556 for (; dyncon < dynconend; dyncon++)
15558 Elf_Internal_Dyn dyn;
15561 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
15568 case DT_PPC64_GLINK:
15570 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15571 /* We stupidly defined DT_PPC64_GLINK to be the start
15572 of glink rather than the first entry point, which is
15573 what ld.so needs, and now have a bigger stub to
15574 support automatic multiple TOCs. */
15575 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 8 * 4;
15579 s = bfd_get_section_by_name (output_bfd, ".opd");
15582 dyn.d_un.d_ptr = s->vma;
15586 if (htab->do_multi_toc && htab->multi_toc_needed)
15587 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
15588 if (htab->has_plt_localentry0)
15589 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
15592 case DT_PPC64_OPDSZ:
15593 s = bfd_get_section_by_name (output_bfd, ".opd");
15596 dyn.d_un.d_val = s->size;
15600 s = htab->elf.splt;
15601 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15605 s = htab->elf.srelplt;
15606 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15610 dyn.d_un.d_val = htab->elf.srelplt->size;
15614 if (htab->local_ifunc_resolver)
15615 info->callbacks->einfo
15616 (_("%X%P: text relocations and GNU indirect "
15617 "functions will result in a segfault at runtime\n"));
15618 else if (htab->maybe_local_ifunc_resolver)
15619 info->callbacks->einfo
15620 (_("%P: warning: text relocations and GNU indirect "
15621 "functions may result in a segfault at runtime\n"));
15625 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
15629 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
15630 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
15632 /* Fill in the first entry in the global offset table.
15633 We use it to hold the link-time TOCbase. */
15634 bfd_put_64 (output_bfd,
15635 elf_gp (output_bfd) + TOC_BASE_OFF,
15636 htab->elf.sgot->contents);
15638 /* Set .got entry size. */
15639 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 8;
15642 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
15643 && htab->elf.splt->output_section != bfd_abs_section_ptr)
15645 /* Set .plt entry size. */
15646 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
15647 = PLT_ENTRY_SIZE (htab);
15650 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
15651 brlt ourselves if emitrelocations. */
15652 if (htab->brlt != NULL
15653 && htab->brlt->reloc_count != 0
15654 && !_bfd_elf_link_output_relocs (output_bfd,
15656 elf_section_data (htab->brlt)->rela.hdr,
15657 elf_section_data (htab->brlt)->relocs,
15661 if (htab->glink != NULL
15662 && htab->glink->reloc_count != 0
15663 && !_bfd_elf_link_output_relocs (output_bfd,
15665 elf_section_data (htab->glink)->rela.hdr,
15666 elf_section_data (htab->glink)->relocs,
15670 if (htab->glink_eh_frame != NULL
15671 && htab->glink_eh_frame->size != 0)
15675 struct map_stub *group;
15678 p = htab->glink_eh_frame->contents;
15679 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
15681 for (group = htab->group; group != NULL; group = group->next)
15682 if (group->stub_sec != NULL)
15684 /* Offset to stub section. */
15685 val = (group->stub_sec->output_section->vma
15686 + group->stub_sec->output_offset);
15687 val -= (htab->glink_eh_frame->output_section->vma
15688 + htab->glink_eh_frame->output_offset
15689 + (p + 8 - htab->glink_eh_frame->contents));
15690 if (val + 0x80000000 > 0xffffffff)
15692 info->callbacks->einfo
15693 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
15694 group->stub_sec->name);
15697 bfd_put_32 (dynobj, val, p + 8);
15698 p += stub_eh_frame_size (group, align);
15700 if (htab->glink != NULL && htab->glink->size != 0)
15702 /* Offset to .glink. */
15703 val = (htab->glink->output_section->vma
15704 + htab->glink->output_offset
15706 val -= (htab->glink_eh_frame->output_section->vma
15707 + htab->glink_eh_frame->output_offset
15708 + (p + 8 - htab->glink_eh_frame->contents));
15709 if (val + 0x80000000 > 0xffffffff)
15711 info->callbacks->einfo
15712 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
15713 htab->glink->name);
15716 bfd_put_32 (dynobj, val, p + 8);
15717 p += (24 + align - 1) & -align;
15720 if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
15721 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
15722 htab->glink_eh_frame,
15723 htab->glink_eh_frame->contents))
15727 /* We need to handle writing out multiple GOT sections ourselves,
15728 since we didn't add them to DYNOBJ. We know dynobj is the first
15730 while ((dynobj = dynobj->link.next) != NULL)
15734 if (!is_ppc64_elf (dynobj))
15737 s = ppc64_elf_tdata (dynobj)->got;
15740 && s->output_section != bfd_abs_section_ptr
15741 && !bfd_set_section_contents (output_bfd, s->output_section,
15742 s->contents, s->output_offset,
15745 s = ppc64_elf_tdata (dynobj)->relgot;
15748 && s->output_section != bfd_abs_section_ptr
15749 && !bfd_set_section_contents (output_bfd, s->output_section,
15750 s->contents, s->output_offset,
15758 #include "elf64-target.h"
15760 /* FreeBSD support */
15762 #undef TARGET_LITTLE_SYM
15763 #undef TARGET_LITTLE_NAME
15765 #undef TARGET_BIG_SYM
15766 #define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
15767 #undef TARGET_BIG_NAME
15768 #define TARGET_BIG_NAME "elf64-powerpc-freebsd"
15771 #define ELF_OSABI ELFOSABI_FREEBSD
15774 #define elf64_bed elf64_powerpc_fbsd_bed
15776 #include "elf64-target.h"