1 /* PowerPC64-specific support for 64-bit ELF.
2 Copyright (C) 1999-2014 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 bfd_elf64_powerpcle_vec
60 #define TARGET_LITTLE_NAME "elf64-powerpcle"
61 #define TARGET_BIG_SYM bfd_elf64_powerpc_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 0x1000
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_can_gc_sections 1
76 #define elf_backend_can_refcount 1
77 #define elf_backend_rela_normal 1
78 #define elf_backend_default_execstack 0
80 #define bfd_elf64_mkobject ppc64_elf_mkobject
81 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
82 #define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
83 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
84 #define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
85 #define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
86 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
87 #define bfd_elf64_bfd_link_hash_table_free ppc64_elf_link_hash_table_free
88 #define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
89 #define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
91 #define elf_backend_object_p ppc64_elf_object_p
92 #define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
93 #define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
94 #define elf_backend_write_core_note ppc64_elf_write_core_note
95 #define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
96 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
97 #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
98 #define elf_backend_check_directives ppc64_elf_process_dot_syms
99 #define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
100 #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
101 #define elf_backend_check_relocs ppc64_elf_check_relocs
102 #define elf_backend_gc_keep ppc64_elf_gc_keep
103 #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
104 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
105 #define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
106 #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
107 #define elf_backend_hide_symbol ppc64_elf_hide_symbol
108 #define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
109 #define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
110 #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
111 #define elf_backend_hash_symbol ppc64_elf_hash_symbol
112 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
113 #define elf_backend_action_discarded ppc64_elf_action_discarded
114 #define elf_backend_relocate_section ppc64_elf_relocate_section
115 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
116 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
117 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
118 #define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
119 #define elf_backend_special_sections ppc64_elf_special_sections
120 #define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
122 /* The name of the dynamic interpreter. This is put in the .interp
124 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
126 /* The size in bytes of an entry in the procedure linkage table. */
127 #define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
129 /* The initial size of the plt reserved for the dynamic linker. */
130 #define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
132 /* Offsets to some stack save slots. */
134 #define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
135 /* This one is dodgy. ELFv2 does not have a linker word, so use the
136 CR save slot. Used only by optimised __tls_get_addr call stub,
137 relying on __tls_get_addr_opt not saving CR.. */
138 #define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
140 /* TOC base pointers offset from start of TOC. */
141 #define TOC_BASE_OFF 0x8000
143 /* Offset of tp and dtp pointers from start of TLS block. */
144 #define TP_OFFSET 0x7000
145 #define DTP_OFFSET 0x8000
147 /* .plt call stub instructions. The normal stub is like this, but
148 sometimes the .plt entry crosses a 64k boundary and we need to
149 insert an addi to adjust r11. */
150 #define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
151 #define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
152 #define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
153 #define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
154 #define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
155 #define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
156 #define BCTR 0x4e800420 /* bctr */
158 #define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
159 #define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
160 #define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
162 #define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
163 #define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
164 #define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
165 #define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
166 #define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
167 #define BNECTR 0x4ca20420 /* bnectr+ */
168 #define BNECTR_P4 0x4ce20420 /* bnectr+ */
170 #define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
171 #define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
172 #define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
174 #define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
176 #define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
177 #define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
179 /* glink call stub instructions. We enter with the index in R0. */
180 #define GLINK_CALL_STUB_SIZE (16*4)
184 #define MFLR_R12 0x7d8802a6 /* mflr %12 */
185 #define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
187 #define MFLR_R11 0x7d6802a6 /* mflr %11 */
188 /* ld %2,(0b-1b)(%11) */
189 #define MTLR_R12 0x7d8803a6 /* mtlr %12 */
190 #define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
196 #define MFLR_R0 0x7c0802a6 /* mflr %r0 */
197 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
198 #define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
199 #define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
200 #define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
203 #define NOP 0x60000000
205 /* Some other nops. */
206 #define CROR_151515 0x4def7b82
207 #define CROR_313131 0x4ffffb82
209 /* .glink entries for the first 32k functions are two instructions. */
210 #define LI_R0_0 0x38000000 /* li %r0,0 */
211 #define B_DOT 0x48000000 /* b . */
213 /* After that, we need two instructions to load the index, followed by
215 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */
216 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
218 /* Instructions used by the save and restore reg functions. */
219 #define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
220 #define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
221 #define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
222 #define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
223 #define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
224 #define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
225 #define LI_R12_0 0x39800000 /* li %r12,0 */
226 #define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
227 #define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
228 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
229 #define BLR 0x4e800020 /* blr */
231 /* Since .opd is an array of descriptors and each entry will end up
232 with identical R_PPC64_RELATIVE relocs, there is really no need to
233 propagate .opd relocs; The dynamic linker should be taught to
234 relocate .opd without reloc entries. */
235 #ifndef NO_OPD_RELOCS
236 #define NO_OPD_RELOCS 0
239 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
241 /* Relocation HOWTO's. */
242 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
244 static reloc_howto_type ppc64_elf_howto_raw[] = {
245 /* This reloc does nothing. */
246 HOWTO (R_PPC64_NONE, /* type */
248 2, /* size (0 = byte, 1 = short, 2 = long) */
250 FALSE, /* pc_relative */
252 complain_overflow_dont, /* complain_on_overflow */
253 bfd_elf_generic_reloc, /* special_function */
254 "R_PPC64_NONE", /* name */
255 FALSE, /* partial_inplace */
258 FALSE), /* pcrel_offset */
260 /* A standard 32 bit relocation. */
261 HOWTO (R_PPC64_ADDR32, /* type */
263 2, /* size (0 = byte, 1 = short, 2 = long) */
265 FALSE, /* pc_relative */
267 complain_overflow_bitfield, /* complain_on_overflow */
268 bfd_elf_generic_reloc, /* special_function */
269 "R_PPC64_ADDR32", /* name */
270 FALSE, /* partial_inplace */
272 0xffffffff, /* dst_mask */
273 FALSE), /* pcrel_offset */
275 /* An absolute 26 bit branch; the lower two bits must be zero.
276 FIXME: we don't check that, we just clear them. */
277 HOWTO (R_PPC64_ADDR24, /* type */
279 2, /* size (0 = byte, 1 = short, 2 = long) */
281 FALSE, /* pc_relative */
283 complain_overflow_bitfield, /* complain_on_overflow */
284 bfd_elf_generic_reloc, /* special_function */
285 "R_PPC64_ADDR24", /* name */
286 FALSE, /* partial_inplace */
288 0x03fffffc, /* dst_mask */
289 FALSE), /* pcrel_offset */
291 /* A standard 16 bit relocation. */
292 HOWTO (R_PPC64_ADDR16, /* type */
294 1, /* size (0 = byte, 1 = short, 2 = long) */
296 FALSE, /* pc_relative */
298 complain_overflow_bitfield, /* complain_on_overflow */
299 bfd_elf_generic_reloc, /* special_function */
300 "R_PPC64_ADDR16", /* name */
301 FALSE, /* partial_inplace */
303 0xffff, /* dst_mask */
304 FALSE), /* pcrel_offset */
306 /* A 16 bit relocation without overflow. */
307 HOWTO (R_PPC64_ADDR16_LO, /* type */
309 1, /* size (0 = byte, 1 = short, 2 = long) */
311 FALSE, /* pc_relative */
313 complain_overflow_dont,/* complain_on_overflow */
314 bfd_elf_generic_reloc, /* special_function */
315 "R_PPC64_ADDR16_LO", /* name */
316 FALSE, /* partial_inplace */
318 0xffff, /* dst_mask */
319 FALSE), /* pcrel_offset */
321 /* Bits 16-31 of an address. */
322 HOWTO (R_PPC64_ADDR16_HI, /* type */
324 1, /* size (0 = byte, 1 = short, 2 = long) */
326 FALSE, /* pc_relative */
328 complain_overflow_signed, /* complain_on_overflow */
329 bfd_elf_generic_reloc, /* special_function */
330 "R_PPC64_ADDR16_HI", /* name */
331 FALSE, /* partial_inplace */
333 0xffff, /* dst_mask */
334 FALSE), /* pcrel_offset */
336 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
337 bits, treated as a signed number, is negative. */
338 HOWTO (R_PPC64_ADDR16_HA, /* type */
340 1, /* size (0 = byte, 1 = short, 2 = long) */
342 FALSE, /* pc_relative */
344 complain_overflow_signed, /* complain_on_overflow */
345 ppc64_elf_ha_reloc, /* special_function */
346 "R_PPC64_ADDR16_HA", /* name */
347 FALSE, /* partial_inplace */
349 0xffff, /* dst_mask */
350 FALSE), /* pcrel_offset */
352 /* An absolute 16 bit branch; the lower two bits must be zero.
353 FIXME: we don't check that, we just clear them. */
354 HOWTO (R_PPC64_ADDR14, /* type */
356 2, /* size (0 = byte, 1 = short, 2 = long) */
358 FALSE, /* pc_relative */
360 complain_overflow_bitfield, /* complain_on_overflow */
361 ppc64_elf_branch_reloc, /* special_function */
362 "R_PPC64_ADDR14", /* name */
363 FALSE, /* partial_inplace */
365 0x0000fffc, /* dst_mask */
366 FALSE), /* pcrel_offset */
368 /* An absolute 16 bit branch, for which bit 10 should be set to
369 indicate that the branch is expected to be taken. The lower two
370 bits must be zero. */
371 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
373 2, /* size (0 = byte, 1 = short, 2 = long) */
375 FALSE, /* pc_relative */
377 complain_overflow_bitfield, /* complain_on_overflow */
378 ppc64_elf_brtaken_reloc, /* special_function */
379 "R_PPC64_ADDR14_BRTAKEN",/* name */
380 FALSE, /* partial_inplace */
382 0x0000fffc, /* dst_mask */
383 FALSE), /* pcrel_offset */
385 /* An absolute 16 bit branch, for which bit 10 should be set to
386 indicate that the branch is not expected to be taken. The lower
387 two bits must be zero. */
388 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
390 2, /* size (0 = byte, 1 = short, 2 = long) */
392 FALSE, /* pc_relative */
394 complain_overflow_bitfield, /* complain_on_overflow */
395 ppc64_elf_brtaken_reloc, /* special_function */
396 "R_PPC64_ADDR14_BRNTAKEN",/* name */
397 FALSE, /* partial_inplace */
399 0x0000fffc, /* dst_mask */
400 FALSE), /* pcrel_offset */
402 /* A relative 26 bit branch; the lower two bits must be zero. */
403 HOWTO (R_PPC64_REL24, /* type */
405 2, /* size (0 = byte, 1 = short, 2 = long) */
407 TRUE, /* pc_relative */
409 complain_overflow_signed, /* complain_on_overflow */
410 ppc64_elf_branch_reloc, /* special_function */
411 "R_PPC64_REL24", /* name */
412 FALSE, /* partial_inplace */
414 0x03fffffc, /* dst_mask */
415 TRUE), /* pcrel_offset */
417 /* A relative 16 bit branch; the lower two bits must be zero. */
418 HOWTO (R_PPC64_REL14, /* type */
420 2, /* size (0 = byte, 1 = short, 2 = long) */
422 TRUE, /* pc_relative */
424 complain_overflow_signed, /* complain_on_overflow */
425 ppc64_elf_branch_reloc, /* special_function */
426 "R_PPC64_REL14", /* name */
427 FALSE, /* partial_inplace */
429 0x0000fffc, /* dst_mask */
430 TRUE), /* pcrel_offset */
432 /* A relative 16 bit branch. Bit 10 should be set to indicate that
433 the branch is expected to be taken. The lower two bits must be
435 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
437 2, /* size (0 = byte, 1 = short, 2 = long) */
439 TRUE, /* pc_relative */
441 complain_overflow_signed, /* complain_on_overflow */
442 ppc64_elf_brtaken_reloc, /* special_function */
443 "R_PPC64_REL14_BRTAKEN", /* name */
444 FALSE, /* partial_inplace */
446 0x0000fffc, /* dst_mask */
447 TRUE), /* pcrel_offset */
449 /* A relative 16 bit branch. Bit 10 should be set to indicate that
450 the branch is not expected to be taken. The lower two bits must
452 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
454 2, /* size (0 = byte, 1 = short, 2 = long) */
456 TRUE, /* pc_relative */
458 complain_overflow_signed, /* complain_on_overflow */
459 ppc64_elf_brtaken_reloc, /* special_function */
460 "R_PPC64_REL14_BRNTAKEN",/* name */
461 FALSE, /* partial_inplace */
463 0x0000fffc, /* dst_mask */
464 TRUE), /* pcrel_offset */
466 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
468 HOWTO (R_PPC64_GOT16, /* type */
470 1, /* size (0 = byte, 1 = short, 2 = long) */
472 FALSE, /* pc_relative */
474 complain_overflow_signed, /* complain_on_overflow */
475 ppc64_elf_unhandled_reloc, /* special_function */
476 "R_PPC64_GOT16", /* name */
477 FALSE, /* partial_inplace */
479 0xffff, /* dst_mask */
480 FALSE), /* pcrel_offset */
482 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
484 HOWTO (R_PPC64_GOT16_LO, /* type */
486 1, /* size (0 = byte, 1 = short, 2 = long) */
488 FALSE, /* pc_relative */
490 complain_overflow_dont, /* complain_on_overflow */
491 ppc64_elf_unhandled_reloc, /* special_function */
492 "R_PPC64_GOT16_LO", /* name */
493 FALSE, /* partial_inplace */
495 0xffff, /* dst_mask */
496 FALSE), /* pcrel_offset */
498 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
500 HOWTO (R_PPC64_GOT16_HI, /* type */
502 1, /* size (0 = byte, 1 = short, 2 = long) */
504 FALSE, /* pc_relative */
506 complain_overflow_signed,/* complain_on_overflow */
507 ppc64_elf_unhandled_reloc, /* special_function */
508 "R_PPC64_GOT16_HI", /* name */
509 FALSE, /* partial_inplace */
511 0xffff, /* dst_mask */
512 FALSE), /* pcrel_offset */
514 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
516 HOWTO (R_PPC64_GOT16_HA, /* type */
518 1, /* size (0 = byte, 1 = short, 2 = long) */
520 FALSE, /* pc_relative */
522 complain_overflow_signed,/* complain_on_overflow */
523 ppc64_elf_unhandled_reloc, /* special_function */
524 "R_PPC64_GOT16_HA", /* name */
525 FALSE, /* partial_inplace */
527 0xffff, /* dst_mask */
528 FALSE), /* pcrel_offset */
530 /* This is used only by the dynamic linker. The symbol should exist
531 both in the object being run and in some shared library. The
532 dynamic linker copies the data addressed by the symbol from the
533 shared library into the object, because the object being
534 run has to have the data at some particular address. */
535 HOWTO (R_PPC64_COPY, /* type */
537 0, /* this one is variable size */
539 FALSE, /* pc_relative */
541 complain_overflow_dont, /* complain_on_overflow */
542 ppc64_elf_unhandled_reloc, /* special_function */
543 "R_PPC64_COPY", /* name */
544 FALSE, /* partial_inplace */
547 FALSE), /* pcrel_offset */
549 /* Like R_PPC64_ADDR64, but used when setting global offset table
551 HOWTO (R_PPC64_GLOB_DAT, /* type */
553 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
555 FALSE, /* pc_relative */
557 complain_overflow_dont, /* complain_on_overflow */
558 ppc64_elf_unhandled_reloc, /* special_function */
559 "R_PPC64_GLOB_DAT", /* name */
560 FALSE, /* partial_inplace */
562 ONES (64), /* dst_mask */
563 FALSE), /* pcrel_offset */
565 /* Created by the link editor. Marks a procedure linkage table
566 entry for a symbol. */
567 HOWTO (R_PPC64_JMP_SLOT, /* type */
569 0, /* size (0 = byte, 1 = short, 2 = long) */
571 FALSE, /* pc_relative */
573 complain_overflow_dont, /* complain_on_overflow */
574 ppc64_elf_unhandled_reloc, /* special_function */
575 "R_PPC64_JMP_SLOT", /* name */
576 FALSE, /* partial_inplace */
579 FALSE), /* pcrel_offset */
581 /* Used only by the dynamic linker. When the object is run, this
582 doubleword64 is set to the load address of the object, plus the
584 HOWTO (R_PPC64_RELATIVE, /* type */
586 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
588 FALSE, /* pc_relative */
590 complain_overflow_dont, /* complain_on_overflow */
591 bfd_elf_generic_reloc, /* special_function */
592 "R_PPC64_RELATIVE", /* name */
593 FALSE, /* partial_inplace */
595 ONES (64), /* dst_mask */
596 FALSE), /* pcrel_offset */
598 /* Like R_PPC64_ADDR32, but may be unaligned. */
599 HOWTO (R_PPC64_UADDR32, /* type */
601 2, /* size (0 = byte, 1 = short, 2 = long) */
603 FALSE, /* pc_relative */
605 complain_overflow_bitfield, /* complain_on_overflow */
606 bfd_elf_generic_reloc, /* special_function */
607 "R_PPC64_UADDR32", /* name */
608 FALSE, /* partial_inplace */
610 0xffffffff, /* dst_mask */
611 FALSE), /* pcrel_offset */
613 /* Like R_PPC64_ADDR16, but may be unaligned. */
614 HOWTO (R_PPC64_UADDR16, /* type */
616 1, /* size (0 = byte, 1 = short, 2 = long) */
618 FALSE, /* pc_relative */
620 complain_overflow_bitfield, /* complain_on_overflow */
621 bfd_elf_generic_reloc, /* special_function */
622 "R_PPC64_UADDR16", /* name */
623 FALSE, /* partial_inplace */
625 0xffff, /* dst_mask */
626 FALSE), /* pcrel_offset */
628 /* 32-bit PC relative. */
629 HOWTO (R_PPC64_REL32, /* type */
631 2, /* size (0 = byte, 1 = short, 2 = long) */
633 TRUE, /* pc_relative */
635 /* FIXME: Verify. Was complain_overflow_bitfield. */
636 complain_overflow_signed, /* complain_on_overflow */
637 bfd_elf_generic_reloc, /* special_function */
638 "R_PPC64_REL32", /* name */
639 FALSE, /* partial_inplace */
641 0xffffffff, /* dst_mask */
642 TRUE), /* pcrel_offset */
644 /* 32-bit relocation to the symbol's procedure linkage table. */
645 HOWTO (R_PPC64_PLT32, /* type */
647 2, /* size (0 = byte, 1 = short, 2 = long) */
649 FALSE, /* pc_relative */
651 complain_overflow_bitfield, /* complain_on_overflow */
652 ppc64_elf_unhandled_reloc, /* special_function */
653 "R_PPC64_PLT32", /* name */
654 FALSE, /* partial_inplace */
656 0xffffffff, /* dst_mask */
657 FALSE), /* pcrel_offset */
659 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
660 FIXME: R_PPC64_PLTREL32 not supported. */
661 HOWTO (R_PPC64_PLTREL32, /* type */
663 2, /* size (0 = byte, 1 = short, 2 = long) */
665 TRUE, /* pc_relative */
667 complain_overflow_signed, /* complain_on_overflow */
668 bfd_elf_generic_reloc, /* special_function */
669 "R_PPC64_PLTREL32", /* name */
670 FALSE, /* partial_inplace */
672 0xffffffff, /* dst_mask */
673 TRUE), /* pcrel_offset */
675 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
677 HOWTO (R_PPC64_PLT16_LO, /* type */
679 1, /* size (0 = byte, 1 = short, 2 = long) */
681 FALSE, /* pc_relative */
683 complain_overflow_dont, /* complain_on_overflow */
684 ppc64_elf_unhandled_reloc, /* special_function */
685 "R_PPC64_PLT16_LO", /* name */
686 FALSE, /* partial_inplace */
688 0xffff, /* dst_mask */
689 FALSE), /* pcrel_offset */
691 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
693 HOWTO (R_PPC64_PLT16_HI, /* type */
695 1, /* size (0 = byte, 1 = short, 2 = long) */
697 FALSE, /* pc_relative */
699 complain_overflow_signed, /* complain_on_overflow */
700 ppc64_elf_unhandled_reloc, /* special_function */
701 "R_PPC64_PLT16_HI", /* name */
702 FALSE, /* partial_inplace */
704 0xffff, /* dst_mask */
705 FALSE), /* pcrel_offset */
707 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
709 HOWTO (R_PPC64_PLT16_HA, /* type */
711 1, /* size (0 = byte, 1 = short, 2 = long) */
713 FALSE, /* pc_relative */
715 complain_overflow_signed, /* complain_on_overflow */
716 ppc64_elf_unhandled_reloc, /* special_function */
717 "R_PPC64_PLT16_HA", /* name */
718 FALSE, /* partial_inplace */
720 0xffff, /* dst_mask */
721 FALSE), /* pcrel_offset */
723 /* 16-bit section relative relocation. */
724 HOWTO (R_PPC64_SECTOFF, /* type */
726 1, /* size (0 = byte, 1 = short, 2 = long) */
728 FALSE, /* pc_relative */
730 complain_overflow_bitfield, /* complain_on_overflow */
731 ppc64_elf_sectoff_reloc, /* special_function */
732 "R_PPC64_SECTOFF", /* name */
733 FALSE, /* partial_inplace */
735 0xffff, /* dst_mask */
736 FALSE), /* pcrel_offset */
738 /* Like R_PPC64_SECTOFF, but no overflow warning. */
739 HOWTO (R_PPC64_SECTOFF_LO, /* type */
741 1, /* size (0 = byte, 1 = short, 2 = long) */
743 FALSE, /* pc_relative */
745 complain_overflow_dont, /* complain_on_overflow */
746 ppc64_elf_sectoff_reloc, /* special_function */
747 "R_PPC64_SECTOFF_LO", /* name */
748 FALSE, /* partial_inplace */
750 0xffff, /* dst_mask */
751 FALSE), /* pcrel_offset */
753 /* 16-bit upper half section relative relocation. */
754 HOWTO (R_PPC64_SECTOFF_HI, /* type */
756 1, /* size (0 = byte, 1 = short, 2 = long) */
758 FALSE, /* pc_relative */
760 complain_overflow_signed, /* complain_on_overflow */
761 ppc64_elf_sectoff_reloc, /* special_function */
762 "R_PPC64_SECTOFF_HI", /* name */
763 FALSE, /* partial_inplace */
765 0xffff, /* dst_mask */
766 FALSE), /* pcrel_offset */
768 /* 16-bit upper half adjusted section relative relocation. */
769 HOWTO (R_PPC64_SECTOFF_HA, /* type */
771 1, /* size (0 = byte, 1 = short, 2 = long) */
773 FALSE, /* pc_relative */
775 complain_overflow_signed, /* complain_on_overflow */
776 ppc64_elf_sectoff_ha_reloc, /* special_function */
777 "R_PPC64_SECTOFF_HA", /* name */
778 FALSE, /* partial_inplace */
780 0xffff, /* dst_mask */
781 FALSE), /* pcrel_offset */
783 /* Like R_PPC64_REL24 without touching the two least significant bits. */
784 HOWTO (R_PPC64_REL30, /* type */
786 2, /* size (0 = byte, 1 = short, 2 = long) */
788 TRUE, /* pc_relative */
790 complain_overflow_dont, /* complain_on_overflow */
791 bfd_elf_generic_reloc, /* special_function */
792 "R_PPC64_REL30", /* name */
793 FALSE, /* partial_inplace */
795 0xfffffffc, /* dst_mask */
796 TRUE), /* pcrel_offset */
798 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
800 /* A standard 64-bit relocation. */
801 HOWTO (R_PPC64_ADDR64, /* type */
803 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
805 FALSE, /* pc_relative */
807 complain_overflow_dont, /* complain_on_overflow */
808 bfd_elf_generic_reloc, /* special_function */
809 "R_PPC64_ADDR64", /* name */
810 FALSE, /* partial_inplace */
812 ONES (64), /* dst_mask */
813 FALSE), /* pcrel_offset */
815 /* The bits 32-47 of an address. */
816 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
818 1, /* size (0 = byte, 1 = short, 2 = long) */
820 FALSE, /* pc_relative */
822 complain_overflow_dont, /* complain_on_overflow */
823 bfd_elf_generic_reloc, /* special_function */
824 "R_PPC64_ADDR16_HIGHER", /* name */
825 FALSE, /* partial_inplace */
827 0xffff, /* dst_mask */
828 FALSE), /* pcrel_offset */
830 /* The bits 32-47 of an address, plus 1 if the contents of the low
831 16 bits, treated as a signed number, is negative. */
832 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
834 1, /* size (0 = byte, 1 = short, 2 = long) */
836 FALSE, /* pc_relative */
838 complain_overflow_dont, /* complain_on_overflow */
839 ppc64_elf_ha_reloc, /* special_function */
840 "R_PPC64_ADDR16_HIGHERA", /* name */
841 FALSE, /* partial_inplace */
843 0xffff, /* dst_mask */
844 FALSE), /* pcrel_offset */
846 /* The bits 48-63 of an address. */
847 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
849 1, /* size (0 = byte, 1 = short, 2 = long) */
851 FALSE, /* pc_relative */
853 complain_overflow_dont, /* complain_on_overflow */
854 bfd_elf_generic_reloc, /* special_function */
855 "R_PPC64_ADDR16_HIGHEST", /* name */
856 FALSE, /* partial_inplace */
858 0xffff, /* dst_mask */
859 FALSE), /* pcrel_offset */
861 /* The bits 48-63 of an address, plus 1 if the contents of the low
862 16 bits, treated as a signed number, is negative. */
863 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
865 1, /* size (0 = byte, 1 = short, 2 = long) */
867 FALSE, /* pc_relative */
869 complain_overflow_dont, /* complain_on_overflow */
870 ppc64_elf_ha_reloc, /* special_function */
871 "R_PPC64_ADDR16_HIGHESTA", /* name */
872 FALSE, /* partial_inplace */
874 0xffff, /* dst_mask */
875 FALSE), /* pcrel_offset */
877 /* Like ADDR64, but may be unaligned. */
878 HOWTO (R_PPC64_UADDR64, /* type */
880 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
882 FALSE, /* pc_relative */
884 complain_overflow_dont, /* complain_on_overflow */
885 bfd_elf_generic_reloc, /* special_function */
886 "R_PPC64_UADDR64", /* name */
887 FALSE, /* partial_inplace */
889 ONES (64), /* dst_mask */
890 FALSE), /* pcrel_offset */
892 /* 64-bit relative relocation. */
893 HOWTO (R_PPC64_REL64, /* type */
895 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
897 TRUE, /* pc_relative */
899 complain_overflow_dont, /* complain_on_overflow */
900 bfd_elf_generic_reloc, /* special_function */
901 "R_PPC64_REL64", /* name */
902 FALSE, /* partial_inplace */
904 ONES (64), /* dst_mask */
905 TRUE), /* pcrel_offset */
907 /* 64-bit relocation to the symbol's procedure linkage table. */
908 HOWTO (R_PPC64_PLT64, /* type */
910 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
912 FALSE, /* pc_relative */
914 complain_overflow_dont, /* complain_on_overflow */
915 ppc64_elf_unhandled_reloc, /* special_function */
916 "R_PPC64_PLT64", /* name */
917 FALSE, /* partial_inplace */
919 ONES (64), /* dst_mask */
920 FALSE), /* pcrel_offset */
922 /* 64-bit PC relative relocation to the symbol's procedure linkage
924 /* FIXME: R_PPC64_PLTREL64 not supported. */
925 HOWTO (R_PPC64_PLTREL64, /* type */
927 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
929 TRUE, /* pc_relative */
931 complain_overflow_dont, /* complain_on_overflow */
932 ppc64_elf_unhandled_reloc, /* special_function */
933 "R_PPC64_PLTREL64", /* name */
934 FALSE, /* partial_inplace */
936 ONES (64), /* dst_mask */
937 TRUE), /* pcrel_offset */
939 /* 16 bit TOC-relative relocation. */
941 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
942 HOWTO (R_PPC64_TOC16, /* type */
944 1, /* size (0 = byte, 1 = short, 2 = long) */
946 FALSE, /* pc_relative */
948 complain_overflow_signed, /* complain_on_overflow */
949 ppc64_elf_toc_reloc, /* special_function */
950 "R_PPC64_TOC16", /* name */
951 FALSE, /* partial_inplace */
953 0xffff, /* dst_mask */
954 FALSE), /* pcrel_offset */
956 /* 16 bit TOC-relative relocation without overflow. */
958 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
959 HOWTO (R_PPC64_TOC16_LO, /* type */
961 1, /* size (0 = byte, 1 = short, 2 = long) */
963 FALSE, /* pc_relative */
965 complain_overflow_dont, /* complain_on_overflow */
966 ppc64_elf_toc_reloc, /* special_function */
967 "R_PPC64_TOC16_LO", /* name */
968 FALSE, /* partial_inplace */
970 0xffff, /* dst_mask */
971 FALSE), /* pcrel_offset */
973 /* 16 bit TOC-relative relocation, high 16 bits. */
975 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
976 HOWTO (R_PPC64_TOC16_HI, /* type */
978 1, /* size (0 = byte, 1 = short, 2 = long) */
980 FALSE, /* pc_relative */
982 complain_overflow_signed, /* complain_on_overflow */
983 ppc64_elf_toc_reloc, /* special_function */
984 "R_PPC64_TOC16_HI", /* name */
985 FALSE, /* partial_inplace */
987 0xffff, /* dst_mask */
988 FALSE), /* pcrel_offset */
990 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
991 contents of the low 16 bits, treated as a signed number, is
994 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
995 HOWTO (R_PPC64_TOC16_HA, /* type */
997 1, /* size (0 = byte, 1 = short, 2 = long) */
999 FALSE, /* pc_relative */
1001 complain_overflow_signed, /* complain_on_overflow */
1002 ppc64_elf_toc_ha_reloc, /* special_function */
1003 "R_PPC64_TOC16_HA", /* name */
1004 FALSE, /* partial_inplace */
1006 0xffff, /* dst_mask */
1007 FALSE), /* pcrel_offset */
1009 /* 64-bit relocation; insert value of TOC base (.TOC.). */
1011 /* R_PPC64_TOC 51 doubleword64 .TOC. */
1012 HOWTO (R_PPC64_TOC, /* type */
1014 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1016 FALSE, /* pc_relative */
1018 complain_overflow_bitfield, /* complain_on_overflow */
1019 ppc64_elf_toc64_reloc, /* special_function */
1020 "R_PPC64_TOC", /* name */
1021 FALSE, /* partial_inplace */
1023 ONES (64), /* dst_mask */
1024 FALSE), /* pcrel_offset */
1026 /* Like R_PPC64_GOT16, but also informs the link editor that the
1027 value to relocate may (!) refer to a PLT entry which the link
1028 editor (a) may replace with the symbol value. If the link editor
1029 is unable to fully resolve the symbol, it may (b) create a PLT
1030 entry and store the address to the new PLT entry in the GOT.
1031 This permits lazy resolution of function symbols at run time.
1032 The link editor may also skip all of this and just (c) emit a
1033 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1034 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1035 HOWTO (R_PPC64_PLTGOT16, /* type */
1037 1, /* size (0 = byte, 1 = short, 2 = long) */
1039 FALSE, /* pc_relative */
1041 complain_overflow_signed, /* complain_on_overflow */
1042 ppc64_elf_unhandled_reloc, /* special_function */
1043 "R_PPC64_PLTGOT16", /* name */
1044 FALSE, /* partial_inplace */
1046 0xffff, /* dst_mask */
1047 FALSE), /* pcrel_offset */
1049 /* Like R_PPC64_PLTGOT16, but without overflow. */
1050 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1051 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1053 1, /* size (0 = byte, 1 = short, 2 = long) */
1055 FALSE, /* pc_relative */
1057 complain_overflow_dont, /* complain_on_overflow */
1058 ppc64_elf_unhandled_reloc, /* special_function */
1059 "R_PPC64_PLTGOT16_LO", /* name */
1060 FALSE, /* partial_inplace */
1062 0xffff, /* dst_mask */
1063 FALSE), /* pcrel_offset */
1065 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1066 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1067 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1068 16, /* rightshift */
1069 1, /* size (0 = byte, 1 = short, 2 = long) */
1071 FALSE, /* pc_relative */
1073 complain_overflow_signed, /* complain_on_overflow */
1074 ppc64_elf_unhandled_reloc, /* special_function */
1075 "R_PPC64_PLTGOT16_HI", /* name */
1076 FALSE, /* partial_inplace */
1078 0xffff, /* dst_mask */
1079 FALSE), /* pcrel_offset */
1081 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1082 1 if the contents of the low 16 bits, treated as a signed number,
1084 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1085 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1086 16, /* rightshift */
1087 1, /* size (0 = byte, 1 = short, 2 = long) */
1089 FALSE, /* pc_relative */
1091 complain_overflow_signed, /* complain_on_overflow */
1092 ppc64_elf_unhandled_reloc, /* special_function */
1093 "R_PPC64_PLTGOT16_HA", /* name */
1094 FALSE, /* partial_inplace */
1096 0xffff, /* dst_mask */
1097 FALSE), /* pcrel_offset */
1099 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1100 HOWTO (R_PPC64_ADDR16_DS, /* type */
1102 1, /* size (0 = byte, 1 = short, 2 = long) */
1104 FALSE, /* pc_relative */
1106 complain_overflow_bitfield, /* complain_on_overflow */
1107 bfd_elf_generic_reloc, /* special_function */
1108 "R_PPC64_ADDR16_DS", /* name */
1109 FALSE, /* partial_inplace */
1111 0xfffc, /* dst_mask */
1112 FALSE), /* pcrel_offset */
1114 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1115 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1117 1, /* size (0 = byte, 1 = short, 2 = long) */
1119 FALSE, /* pc_relative */
1121 complain_overflow_dont,/* complain_on_overflow */
1122 bfd_elf_generic_reloc, /* special_function */
1123 "R_PPC64_ADDR16_LO_DS",/* name */
1124 FALSE, /* partial_inplace */
1126 0xfffc, /* dst_mask */
1127 FALSE), /* pcrel_offset */
1129 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1130 HOWTO (R_PPC64_GOT16_DS, /* type */
1132 1, /* size (0 = byte, 1 = short, 2 = long) */
1134 FALSE, /* pc_relative */
1136 complain_overflow_signed, /* complain_on_overflow */
1137 ppc64_elf_unhandled_reloc, /* special_function */
1138 "R_PPC64_GOT16_DS", /* name */
1139 FALSE, /* partial_inplace */
1141 0xfffc, /* dst_mask */
1142 FALSE), /* pcrel_offset */
1144 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1145 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1147 1, /* size (0 = byte, 1 = short, 2 = long) */
1149 FALSE, /* pc_relative */
1151 complain_overflow_dont, /* complain_on_overflow */
1152 ppc64_elf_unhandled_reloc, /* special_function */
1153 "R_PPC64_GOT16_LO_DS", /* name */
1154 FALSE, /* partial_inplace */
1156 0xfffc, /* dst_mask */
1157 FALSE), /* pcrel_offset */
1159 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1160 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1162 1, /* size (0 = byte, 1 = short, 2 = long) */
1164 FALSE, /* pc_relative */
1166 complain_overflow_dont, /* complain_on_overflow */
1167 ppc64_elf_unhandled_reloc, /* special_function */
1168 "R_PPC64_PLT16_LO_DS", /* name */
1169 FALSE, /* partial_inplace */
1171 0xfffc, /* dst_mask */
1172 FALSE), /* pcrel_offset */
1174 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1175 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1177 1, /* size (0 = byte, 1 = short, 2 = long) */
1179 FALSE, /* pc_relative */
1181 complain_overflow_bitfield, /* complain_on_overflow */
1182 ppc64_elf_sectoff_reloc, /* special_function */
1183 "R_PPC64_SECTOFF_DS", /* name */
1184 FALSE, /* partial_inplace */
1186 0xfffc, /* dst_mask */
1187 FALSE), /* pcrel_offset */
1189 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1190 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1192 1, /* size (0 = byte, 1 = short, 2 = long) */
1194 FALSE, /* pc_relative */
1196 complain_overflow_dont, /* complain_on_overflow */
1197 ppc64_elf_sectoff_reloc, /* special_function */
1198 "R_PPC64_SECTOFF_LO_DS",/* name */
1199 FALSE, /* partial_inplace */
1201 0xfffc, /* dst_mask */
1202 FALSE), /* pcrel_offset */
1204 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1205 HOWTO (R_PPC64_TOC16_DS, /* type */
1207 1, /* size (0 = byte, 1 = short, 2 = long) */
1209 FALSE, /* pc_relative */
1211 complain_overflow_signed, /* complain_on_overflow */
1212 ppc64_elf_toc_reloc, /* special_function */
1213 "R_PPC64_TOC16_DS", /* name */
1214 FALSE, /* partial_inplace */
1216 0xfffc, /* dst_mask */
1217 FALSE), /* pcrel_offset */
1219 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1220 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1222 1, /* size (0 = byte, 1 = short, 2 = long) */
1224 FALSE, /* pc_relative */
1226 complain_overflow_dont, /* complain_on_overflow */
1227 ppc64_elf_toc_reloc, /* special_function */
1228 "R_PPC64_TOC16_LO_DS", /* name */
1229 FALSE, /* partial_inplace */
1231 0xfffc, /* dst_mask */
1232 FALSE), /* pcrel_offset */
1234 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1235 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1236 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1238 1, /* size (0 = byte, 1 = short, 2 = long) */
1240 FALSE, /* pc_relative */
1242 complain_overflow_signed, /* complain_on_overflow */
1243 ppc64_elf_unhandled_reloc, /* special_function */
1244 "R_PPC64_PLTGOT16_DS", /* name */
1245 FALSE, /* partial_inplace */
1247 0xfffc, /* dst_mask */
1248 FALSE), /* pcrel_offset */
1250 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1251 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1252 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1254 1, /* size (0 = byte, 1 = short, 2 = long) */
1256 FALSE, /* pc_relative */
1258 complain_overflow_dont, /* complain_on_overflow */
1259 ppc64_elf_unhandled_reloc, /* special_function */
1260 "R_PPC64_PLTGOT16_LO_DS",/* name */
1261 FALSE, /* partial_inplace */
1263 0xfffc, /* dst_mask */
1264 FALSE), /* pcrel_offset */
1266 /* Marker relocs for TLS. */
1269 2, /* size (0 = byte, 1 = short, 2 = long) */
1271 FALSE, /* pc_relative */
1273 complain_overflow_dont, /* complain_on_overflow */
1274 bfd_elf_generic_reloc, /* special_function */
1275 "R_PPC64_TLS", /* name */
1276 FALSE, /* partial_inplace */
1279 FALSE), /* pcrel_offset */
1281 HOWTO (R_PPC64_TLSGD,
1283 2, /* size (0 = byte, 1 = short, 2 = long) */
1285 FALSE, /* pc_relative */
1287 complain_overflow_dont, /* complain_on_overflow */
1288 bfd_elf_generic_reloc, /* special_function */
1289 "R_PPC64_TLSGD", /* name */
1290 FALSE, /* partial_inplace */
1293 FALSE), /* pcrel_offset */
1295 HOWTO (R_PPC64_TLSLD,
1297 2, /* size (0 = byte, 1 = short, 2 = long) */
1299 FALSE, /* pc_relative */
1301 complain_overflow_dont, /* complain_on_overflow */
1302 bfd_elf_generic_reloc, /* special_function */
1303 "R_PPC64_TLSLD", /* name */
1304 FALSE, /* partial_inplace */
1307 FALSE), /* pcrel_offset */
1309 HOWTO (R_PPC64_TOCSAVE,
1311 2, /* size (0 = byte, 1 = short, 2 = long) */
1313 FALSE, /* pc_relative */
1315 complain_overflow_dont, /* complain_on_overflow */
1316 bfd_elf_generic_reloc, /* special_function */
1317 "R_PPC64_TOCSAVE", /* name */
1318 FALSE, /* partial_inplace */
1321 FALSE), /* pcrel_offset */
1323 /* Computes the load module index of the load module that contains the
1324 definition of its TLS sym. */
1325 HOWTO (R_PPC64_DTPMOD64,
1327 4, /* size (0 = byte, 1 = short, 2 = long) */
1329 FALSE, /* pc_relative */
1331 complain_overflow_dont, /* complain_on_overflow */
1332 ppc64_elf_unhandled_reloc, /* special_function */
1333 "R_PPC64_DTPMOD64", /* name */
1334 FALSE, /* partial_inplace */
1336 ONES (64), /* dst_mask */
1337 FALSE), /* pcrel_offset */
1339 /* Computes a dtv-relative displacement, the difference between the value
1340 of sym+add and the base address of the thread-local storage block that
1341 contains the definition of sym, minus 0x8000. */
1342 HOWTO (R_PPC64_DTPREL64,
1344 4, /* size (0 = byte, 1 = short, 2 = long) */
1346 FALSE, /* pc_relative */
1348 complain_overflow_dont, /* complain_on_overflow */
1349 ppc64_elf_unhandled_reloc, /* special_function */
1350 "R_PPC64_DTPREL64", /* name */
1351 FALSE, /* partial_inplace */
1353 ONES (64), /* dst_mask */
1354 FALSE), /* pcrel_offset */
1356 /* A 16 bit dtprel reloc. */
1357 HOWTO (R_PPC64_DTPREL16,
1359 1, /* size (0 = byte, 1 = short, 2 = long) */
1361 FALSE, /* pc_relative */
1363 complain_overflow_signed, /* complain_on_overflow */
1364 ppc64_elf_unhandled_reloc, /* special_function */
1365 "R_PPC64_DTPREL16", /* name */
1366 FALSE, /* partial_inplace */
1368 0xffff, /* dst_mask */
1369 FALSE), /* pcrel_offset */
1371 /* Like DTPREL16, but no overflow. */
1372 HOWTO (R_PPC64_DTPREL16_LO,
1374 1, /* size (0 = byte, 1 = short, 2 = long) */
1376 FALSE, /* pc_relative */
1378 complain_overflow_dont, /* complain_on_overflow */
1379 ppc64_elf_unhandled_reloc, /* special_function */
1380 "R_PPC64_DTPREL16_LO", /* name */
1381 FALSE, /* partial_inplace */
1383 0xffff, /* dst_mask */
1384 FALSE), /* pcrel_offset */
1386 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1387 HOWTO (R_PPC64_DTPREL16_HI,
1388 16, /* rightshift */
1389 1, /* size (0 = byte, 1 = short, 2 = long) */
1391 FALSE, /* pc_relative */
1393 complain_overflow_signed, /* complain_on_overflow */
1394 ppc64_elf_unhandled_reloc, /* special_function */
1395 "R_PPC64_DTPREL16_HI", /* name */
1396 FALSE, /* partial_inplace */
1398 0xffff, /* dst_mask */
1399 FALSE), /* pcrel_offset */
1401 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1402 HOWTO (R_PPC64_DTPREL16_HA,
1403 16, /* rightshift */
1404 1, /* size (0 = byte, 1 = short, 2 = long) */
1406 FALSE, /* pc_relative */
1408 complain_overflow_signed, /* complain_on_overflow */
1409 ppc64_elf_unhandled_reloc, /* special_function */
1410 "R_PPC64_DTPREL16_HA", /* name */
1411 FALSE, /* partial_inplace */
1413 0xffff, /* dst_mask */
1414 FALSE), /* pcrel_offset */
1416 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1417 HOWTO (R_PPC64_DTPREL16_HIGHER,
1418 32, /* rightshift */
1419 1, /* size (0 = byte, 1 = short, 2 = long) */
1421 FALSE, /* pc_relative */
1423 complain_overflow_dont, /* complain_on_overflow */
1424 ppc64_elf_unhandled_reloc, /* special_function */
1425 "R_PPC64_DTPREL16_HIGHER", /* name */
1426 FALSE, /* partial_inplace */
1428 0xffff, /* dst_mask */
1429 FALSE), /* pcrel_offset */
1431 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1432 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1433 32, /* rightshift */
1434 1, /* size (0 = byte, 1 = short, 2 = long) */
1436 FALSE, /* pc_relative */
1438 complain_overflow_dont, /* complain_on_overflow */
1439 ppc64_elf_unhandled_reloc, /* special_function */
1440 "R_PPC64_DTPREL16_HIGHERA", /* name */
1441 FALSE, /* partial_inplace */
1443 0xffff, /* dst_mask */
1444 FALSE), /* pcrel_offset */
1446 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1447 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1448 48, /* rightshift */
1449 1, /* size (0 = byte, 1 = short, 2 = long) */
1451 FALSE, /* pc_relative */
1453 complain_overflow_dont, /* complain_on_overflow */
1454 ppc64_elf_unhandled_reloc, /* special_function */
1455 "R_PPC64_DTPREL16_HIGHEST", /* name */
1456 FALSE, /* partial_inplace */
1458 0xffff, /* dst_mask */
1459 FALSE), /* pcrel_offset */
1461 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1462 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1463 48, /* rightshift */
1464 1, /* size (0 = byte, 1 = short, 2 = long) */
1466 FALSE, /* pc_relative */
1468 complain_overflow_dont, /* complain_on_overflow */
1469 ppc64_elf_unhandled_reloc, /* special_function */
1470 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1471 FALSE, /* partial_inplace */
1473 0xffff, /* dst_mask */
1474 FALSE), /* pcrel_offset */
1476 /* Like DTPREL16, but for insns with a DS field. */
1477 HOWTO (R_PPC64_DTPREL16_DS,
1479 1, /* size (0 = byte, 1 = short, 2 = long) */
1481 FALSE, /* pc_relative */
1483 complain_overflow_signed, /* complain_on_overflow */
1484 ppc64_elf_unhandled_reloc, /* special_function */
1485 "R_PPC64_DTPREL16_DS", /* name */
1486 FALSE, /* partial_inplace */
1488 0xfffc, /* dst_mask */
1489 FALSE), /* pcrel_offset */
1491 /* Like DTPREL16_DS, but no overflow. */
1492 HOWTO (R_PPC64_DTPREL16_LO_DS,
1494 1, /* size (0 = byte, 1 = short, 2 = long) */
1496 FALSE, /* pc_relative */
1498 complain_overflow_dont, /* complain_on_overflow */
1499 ppc64_elf_unhandled_reloc, /* special_function */
1500 "R_PPC64_DTPREL16_LO_DS", /* name */
1501 FALSE, /* partial_inplace */
1503 0xfffc, /* dst_mask */
1504 FALSE), /* pcrel_offset */
1506 /* Computes a tp-relative displacement, the difference between the value of
1507 sym+add and the value of the thread pointer (r13). */
1508 HOWTO (R_PPC64_TPREL64,
1510 4, /* size (0 = byte, 1 = short, 2 = long) */
1512 FALSE, /* pc_relative */
1514 complain_overflow_dont, /* complain_on_overflow */
1515 ppc64_elf_unhandled_reloc, /* special_function */
1516 "R_PPC64_TPREL64", /* name */
1517 FALSE, /* partial_inplace */
1519 ONES (64), /* dst_mask */
1520 FALSE), /* pcrel_offset */
1522 /* A 16 bit tprel reloc. */
1523 HOWTO (R_PPC64_TPREL16,
1525 1, /* size (0 = byte, 1 = short, 2 = long) */
1527 FALSE, /* pc_relative */
1529 complain_overflow_signed, /* complain_on_overflow */
1530 ppc64_elf_unhandled_reloc, /* special_function */
1531 "R_PPC64_TPREL16", /* name */
1532 FALSE, /* partial_inplace */
1534 0xffff, /* dst_mask */
1535 FALSE), /* pcrel_offset */
1537 /* Like TPREL16, but no overflow. */
1538 HOWTO (R_PPC64_TPREL16_LO,
1540 1, /* size (0 = byte, 1 = short, 2 = long) */
1542 FALSE, /* pc_relative */
1544 complain_overflow_dont, /* complain_on_overflow */
1545 ppc64_elf_unhandled_reloc, /* special_function */
1546 "R_PPC64_TPREL16_LO", /* name */
1547 FALSE, /* partial_inplace */
1549 0xffff, /* dst_mask */
1550 FALSE), /* pcrel_offset */
1552 /* Like TPREL16_LO, but next higher group of 16 bits. */
1553 HOWTO (R_PPC64_TPREL16_HI,
1554 16, /* rightshift */
1555 1, /* size (0 = byte, 1 = short, 2 = long) */
1557 FALSE, /* pc_relative */
1559 complain_overflow_signed, /* complain_on_overflow */
1560 ppc64_elf_unhandled_reloc, /* special_function */
1561 "R_PPC64_TPREL16_HI", /* name */
1562 FALSE, /* partial_inplace */
1564 0xffff, /* dst_mask */
1565 FALSE), /* pcrel_offset */
1567 /* Like TPREL16_HI, but adjust for low 16 bits. */
1568 HOWTO (R_PPC64_TPREL16_HA,
1569 16, /* rightshift */
1570 1, /* size (0 = byte, 1 = short, 2 = long) */
1572 FALSE, /* pc_relative */
1574 complain_overflow_signed, /* complain_on_overflow */
1575 ppc64_elf_unhandled_reloc, /* special_function */
1576 "R_PPC64_TPREL16_HA", /* name */
1577 FALSE, /* partial_inplace */
1579 0xffff, /* dst_mask */
1580 FALSE), /* pcrel_offset */
1582 /* Like TPREL16_HI, but next higher group of 16 bits. */
1583 HOWTO (R_PPC64_TPREL16_HIGHER,
1584 32, /* rightshift */
1585 1, /* size (0 = byte, 1 = short, 2 = long) */
1587 FALSE, /* pc_relative */
1589 complain_overflow_dont, /* complain_on_overflow */
1590 ppc64_elf_unhandled_reloc, /* special_function */
1591 "R_PPC64_TPREL16_HIGHER", /* name */
1592 FALSE, /* partial_inplace */
1594 0xffff, /* dst_mask */
1595 FALSE), /* pcrel_offset */
1597 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1598 HOWTO (R_PPC64_TPREL16_HIGHERA,
1599 32, /* rightshift */
1600 1, /* size (0 = byte, 1 = short, 2 = long) */
1602 FALSE, /* pc_relative */
1604 complain_overflow_dont, /* complain_on_overflow */
1605 ppc64_elf_unhandled_reloc, /* special_function */
1606 "R_PPC64_TPREL16_HIGHERA", /* name */
1607 FALSE, /* partial_inplace */
1609 0xffff, /* dst_mask */
1610 FALSE), /* pcrel_offset */
1612 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1613 HOWTO (R_PPC64_TPREL16_HIGHEST,
1614 48, /* rightshift */
1615 1, /* size (0 = byte, 1 = short, 2 = long) */
1617 FALSE, /* pc_relative */
1619 complain_overflow_dont, /* complain_on_overflow */
1620 ppc64_elf_unhandled_reloc, /* special_function */
1621 "R_PPC64_TPREL16_HIGHEST", /* name */
1622 FALSE, /* partial_inplace */
1624 0xffff, /* dst_mask */
1625 FALSE), /* pcrel_offset */
1627 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1628 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1629 48, /* rightshift */
1630 1, /* size (0 = byte, 1 = short, 2 = long) */
1632 FALSE, /* pc_relative */
1634 complain_overflow_dont, /* complain_on_overflow */
1635 ppc64_elf_unhandled_reloc, /* special_function */
1636 "R_PPC64_TPREL16_HIGHESTA", /* name */
1637 FALSE, /* partial_inplace */
1639 0xffff, /* dst_mask */
1640 FALSE), /* pcrel_offset */
1642 /* Like TPREL16, but for insns with a DS field. */
1643 HOWTO (R_PPC64_TPREL16_DS,
1645 1, /* size (0 = byte, 1 = short, 2 = long) */
1647 FALSE, /* pc_relative */
1649 complain_overflow_signed, /* complain_on_overflow */
1650 ppc64_elf_unhandled_reloc, /* special_function */
1651 "R_PPC64_TPREL16_DS", /* name */
1652 FALSE, /* partial_inplace */
1654 0xfffc, /* dst_mask */
1655 FALSE), /* pcrel_offset */
1657 /* Like TPREL16_DS, but no overflow. */
1658 HOWTO (R_PPC64_TPREL16_LO_DS,
1660 1, /* size (0 = byte, 1 = short, 2 = long) */
1662 FALSE, /* pc_relative */
1664 complain_overflow_dont, /* complain_on_overflow */
1665 ppc64_elf_unhandled_reloc, /* special_function */
1666 "R_PPC64_TPREL16_LO_DS", /* name */
1667 FALSE, /* partial_inplace */
1669 0xfffc, /* dst_mask */
1670 FALSE), /* pcrel_offset */
1672 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1673 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1674 to the first entry relative to the TOC base (r2). */
1675 HOWTO (R_PPC64_GOT_TLSGD16,
1677 1, /* size (0 = byte, 1 = short, 2 = long) */
1679 FALSE, /* pc_relative */
1681 complain_overflow_signed, /* complain_on_overflow */
1682 ppc64_elf_unhandled_reloc, /* special_function */
1683 "R_PPC64_GOT_TLSGD16", /* name */
1684 FALSE, /* partial_inplace */
1686 0xffff, /* dst_mask */
1687 FALSE), /* pcrel_offset */
1689 /* Like GOT_TLSGD16, but no overflow. */
1690 HOWTO (R_PPC64_GOT_TLSGD16_LO,
1692 1, /* size (0 = byte, 1 = short, 2 = long) */
1694 FALSE, /* pc_relative */
1696 complain_overflow_dont, /* complain_on_overflow */
1697 ppc64_elf_unhandled_reloc, /* special_function */
1698 "R_PPC64_GOT_TLSGD16_LO", /* name */
1699 FALSE, /* partial_inplace */
1701 0xffff, /* dst_mask */
1702 FALSE), /* pcrel_offset */
1704 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1705 HOWTO (R_PPC64_GOT_TLSGD16_HI,
1706 16, /* rightshift */
1707 1, /* size (0 = byte, 1 = short, 2 = long) */
1709 FALSE, /* pc_relative */
1711 complain_overflow_signed, /* complain_on_overflow */
1712 ppc64_elf_unhandled_reloc, /* special_function */
1713 "R_PPC64_GOT_TLSGD16_HI", /* name */
1714 FALSE, /* partial_inplace */
1716 0xffff, /* dst_mask */
1717 FALSE), /* pcrel_offset */
1719 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1720 HOWTO (R_PPC64_GOT_TLSGD16_HA,
1721 16, /* rightshift */
1722 1, /* size (0 = byte, 1 = short, 2 = long) */
1724 FALSE, /* pc_relative */
1726 complain_overflow_signed, /* complain_on_overflow */
1727 ppc64_elf_unhandled_reloc, /* special_function */
1728 "R_PPC64_GOT_TLSGD16_HA", /* name */
1729 FALSE, /* partial_inplace */
1731 0xffff, /* dst_mask */
1732 FALSE), /* pcrel_offset */
1734 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1735 with values (sym+add)@dtpmod and zero, and computes the offset to the
1736 first entry relative to the TOC base (r2). */
1737 HOWTO (R_PPC64_GOT_TLSLD16,
1739 1, /* size (0 = byte, 1 = short, 2 = long) */
1741 FALSE, /* pc_relative */
1743 complain_overflow_signed, /* complain_on_overflow */
1744 ppc64_elf_unhandled_reloc, /* special_function */
1745 "R_PPC64_GOT_TLSLD16", /* name */
1746 FALSE, /* partial_inplace */
1748 0xffff, /* dst_mask */
1749 FALSE), /* pcrel_offset */
1751 /* Like GOT_TLSLD16, but no overflow. */
1752 HOWTO (R_PPC64_GOT_TLSLD16_LO,
1754 1, /* size (0 = byte, 1 = short, 2 = long) */
1756 FALSE, /* pc_relative */
1758 complain_overflow_dont, /* complain_on_overflow */
1759 ppc64_elf_unhandled_reloc, /* special_function */
1760 "R_PPC64_GOT_TLSLD16_LO", /* name */
1761 FALSE, /* partial_inplace */
1763 0xffff, /* dst_mask */
1764 FALSE), /* pcrel_offset */
1766 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1767 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1768 16, /* rightshift */
1769 1, /* size (0 = byte, 1 = short, 2 = long) */
1771 FALSE, /* pc_relative */
1773 complain_overflow_signed, /* complain_on_overflow */
1774 ppc64_elf_unhandled_reloc, /* special_function */
1775 "R_PPC64_GOT_TLSLD16_HI", /* name */
1776 FALSE, /* partial_inplace */
1778 0xffff, /* dst_mask */
1779 FALSE), /* pcrel_offset */
1781 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1782 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1783 16, /* rightshift */
1784 1, /* size (0 = byte, 1 = short, 2 = long) */
1786 FALSE, /* pc_relative */
1788 complain_overflow_signed, /* complain_on_overflow */
1789 ppc64_elf_unhandled_reloc, /* special_function */
1790 "R_PPC64_GOT_TLSLD16_HA", /* name */
1791 FALSE, /* partial_inplace */
1793 0xffff, /* dst_mask */
1794 FALSE), /* pcrel_offset */
1796 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1797 the offset to the entry relative to the TOC base (r2). */
1798 HOWTO (R_PPC64_GOT_DTPREL16_DS,
1800 1, /* size (0 = byte, 1 = short, 2 = long) */
1802 FALSE, /* pc_relative */
1804 complain_overflow_signed, /* complain_on_overflow */
1805 ppc64_elf_unhandled_reloc, /* special_function */
1806 "R_PPC64_GOT_DTPREL16_DS", /* name */
1807 FALSE, /* partial_inplace */
1809 0xfffc, /* dst_mask */
1810 FALSE), /* pcrel_offset */
1812 /* Like GOT_DTPREL16_DS, but no overflow. */
1813 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1815 1, /* size (0 = byte, 1 = short, 2 = long) */
1817 FALSE, /* pc_relative */
1819 complain_overflow_dont, /* complain_on_overflow */
1820 ppc64_elf_unhandled_reloc, /* special_function */
1821 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1822 FALSE, /* partial_inplace */
1824 0xfffc, /* dst_mask */
1825 FALSE), /* pcrel_offset */
1827 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1828 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1829 16, /* rightshift */
1830 1, /* size (0 = byte, 1 = short, 2 = long) */
1832 FALSE, /* pc_relative */
1834 complain_overflow_signed, /* complain_on_overflow */
1835 ppc64_elf_unhandled_reloc, /* special_function */
1836 "R_PPC64_GOT_DTPREL16_HI", /* name */
1837 FALSE, /* partial_inplace */
1839 0xffff, /* dst_mask */
1840 FALSE), /* pcrel_offset */
1842 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1843 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1844 16, /* rightshift */
1845 1, /* size (0 = byte, 1 = short, 2 = long) */
1847 FALSE, /* pc_relative */
1849 complain_overflow_signed, /* complain_on_overflow */
1850 ppc64_elf_unhandled_reloc, /* special_function */
1851 "R_PPC64_GOT_DTPREL16_HA", /* name */
1852 FALSE, /* partial_inplace */
1854 0xffff, /* dst_mask */
1855 FALSE), /* pcrel_offset */
1857 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1858 offset to the entry relative to the TOC base (r2). */
1859 HOWTO (R_PPC64_GOT_TPREL16_DS,
1861 1, /* size (0 = byte, 1 = short, 2 = long) */
1863 FALSE, /* pc_relative */
1865 complain_overflow_signed, /* complain_on_overflow */
1866 ppc64_elf_unhandled_reloc, /* special_function */
1867 "R_PPC64_GOT_TPREL16_DS", /* name */
1868 FALSE, /* partial_inplace */
1870 0xfffc, /* dst_mask */
1871 FALSE), /* pcrel_offset */
1873 /* Like GOT_TPREL16_DS, but no overflow. */
1874 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1876 1, /* size (0 = byte, 1 = short, 2 = long) */
1878 FALSE, /* pc_relative */
1880 complain_overflow_dont, /* complain_on_overflow */
1881 ppc64_elf_unhandled_reloc, /* special_function */
1882 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1883 FALSE, /* partial_inplace */
1885 0xfffc, /* dst_mask */
1886 FALSE), /* pcrel_offset */
1888 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1889 HOWTO (R_PPC64_GOT_TPREL16_HI,
1890 16, /* rightshift */
1891 1, /* size (0 = byte, 1 = short, 2 = long) */
1893 FALSE, /* pc_relative */
1895 complain_overflow_signed, /* complain_on_overflow */
1896 ppc64_elf_unhandled_reloc, /* special_function */
1897 "R_PPC64_GOT_TPREL16_HI", /* name */
1898 FALSE, /* partial_inplace */
1900 0xffff, /* dst_mask */
1901 FALSE), /* pcrel_offset */
1903 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1904 HOWTO (R_PPC64_GOT_TPREL16_HA,
1905 16, /* rightshift */
1906 1, /* size (0 = byte, 1 = short, 2 = long) */
1908 FALSE, /* pc_relative */
1910 complain_overflow_signed, /* complain_on_overflow */
1911 ppc64_elf_unhandled_reloc, /* special_function */
1912 "R_PPC64_GOT_TPREL16_HA", /* name */
1913 FALSE, /* partial_inplace */
1915 0xffff, /* dst_mask */
1916 FALSE), /* pcrel_offset */
1918 HOWTO (R_PPC64_JMP_IREL, /* type */
1920 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1922 FALSE, /* pc_relative */
1924 complain_overflow_dont, /* complain_on_overflow */
1925 ppc64_elf_unhandled_reloc, /* special_function */
1926 "R_PPC64_JMP_IREL", /* name */
1927 FALSE, /* partial_inplace */
1930 FALSE), /* pcrel_offset */
1932 HOWTO (R_PPC64_IRELATIVE, /* type */
1934 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1936 FALSE, /* pc_relative */
1938 complain_overflow_dont, /* complain_on_overflow */
1939 bfd_elf_generic_reloc, /* special_function */
1940 "R_PPC64_IRELATIVE", /* name */
1941 FALSE, /* partial_inplace */
1943 ONES (64), /* dst_mask */
1944 FALSE), /* pcrel_offset */
1946 /* A 16 bit relative relocation. */
1947 HOWTO (R_PPC64_REL16, /* type */
1949 1, /* size (0 = byte, 1 = short, 2 = long) */
1951 TRUE, /* pc_relative */
1953 complain_overflow_bitfield, /* complain_on_overflow */
1954 bfd_elf_generic_reloc, /* special_function */
1955 "R_PPC64_REL16", /* name */
1956 FALSE, /* partial_inplace */
1958 0xffff, /* dst_mask */
1959 TRUE), /* pcrel_offset */
1961 /* A 16 bit relative relocation without overflow. */
1962 HOWTO (R_PPC64_REL16_LO, /* type */
1964 1, /* size (0 = byte, 1 = short, 2 = long) */
1966 TRUE, /* pc_relative */
1968 complain_overflow_dont,/* complain_on_overflow */
1969 bfd_elf_generic_reloc, /* special_function */
1970 "R_PPC64_REL16_LO", /* name */
1971 FALSE, /* partial_inplace */
1973 0xffff, /* dst_mask */
1974 TRUE), /* pcrel_offset */
1976 /* The high order 16 bits of a relative address. */
1977 HOWTO (R_PPC64_REL16_HI, /* type */
1978 16, /* rightshift */
1979 1, /* size (0 = byte, 1 = short, 2 = long) */
1981 TRUE, /* pc_relative */
1983 complain_overflow_signed, /* complain_on_overflow */
1984 bfd_elf_generic_reloc, /* special_function */
1985 "R_PPC64_REL16_HI", /* name */
1986 FALSE, /* partial_inplace */
1988 0xffff, /* dst_mask */
1989 TRUE), /* pcrel_offset */
1991 /* The high order 16 bits of a relative address, plus 1 if the contents of
1992 the low 16 bits, treated as a signed number, is negative. */
1993 HOWTO (R_PPC64_REL16_HA, /* type */
1994 16, /* rightshift */
1995 1, /* size (0 = byte, 1 = short, 2 = long) */
1997 TRUE, /* pc_relative */
1999 complain_overflow_signed, /* complain_on_overflow */
2000 ppc64_elf_ha_reloc, /* special_function */
2001 "R_PPC64_REL16_HA", /* name */
2002 FALSE, /* partial_inplace */
2004 0xffff, /* dst_mask */
2005 TRUE), /* pcrel_offset */
2007 /* Like R_PPC64_ADDR16_HI, but no overflow. */
2008 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
2009 16, /* rightshift */
2010 1, /* size (0 = byte, 1 = short, 2 = long) */
2012 FALSE, /* pc_relative */
2014 complain_overflow_dont, /* complain_on_overflow */
2015 bfd_elf_generic_reloc, /* special_function */
2016 "R_PPC64_ADDR16_HIGH", /* name */
2017 FALSE, /* partial_inplace */
2019 0xffff, /* dst_mask */
2020 FALSE), /* pcrel_offset */
2022 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2023 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2024 16, /* rightshift */
2025 1, /* size (0 = byte, 1 = short, 2 = long) */
2027 FALSE, /* pc_relative */
2029 complain_overflow_dont, /* complain_on_overflow */
2030 ppc64_elf_ha_reloc, /* special_function */
2031 "R_PPC64_ADDR16_HIGHA", /* name */
2032 FALSE, /* partial_inplace */
2034 0xffff, /* dst_mask */
2035 FALSE), /* pcrel_offset */
2037 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2038 HOWTO (R_PPC64_DTPREL16_HIGH,
2039 16, /* rightshift */
2040 1, /* size (0 = byte, 1 = short, 2 = long) */
2042 FALSE, /* pc_relative */
2044 complain_overflow_dont, /* complain_on_overflow */
2045 ppc64_elf_unhandled_reloc, /* special_function */
2046 "R_PPC64_DTPREL16_HIGH", /* name */
2047 FALSE, /* partial_inplace */
2049 0xffff, /* dst_mask */
2050 FALSE), /* pcrel_offset */
2052 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2053 HOWTO (R_PPC64_DTPREL16_HIGHA,
2054 16, /* rightshift */
2055 1, /* size (0 = byte, 1 = short, 2 = long) */
2057 FALSE, /* pc_relative */
2059 complain_overflow_dont, /* complain_on_overflow */
2060 ppc64_elf_unhandled_reloc, /* special_function */
2061 "R_PPC64_DTPREL16_HIGHA", /* name */
2062 FALSE, /* partial_inplace */
2064 0xffff, /* dst_mask */
2065 FALSE), /* pcrel_offset */
2067 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2068 HOWTO (R_PPC64_TPREL16_HIGH,
2069 16, /* rightshift */
2070 1, /* size (0 = byte, 1 = short, 2 = long) */
2072 FALSE, /* pc_relative */
2074 complain_overflow_dont, /* complain_on_overflow */
2075 ppc64_elf_unhandled_reloc, /* special_function */
2076 "R_PPC64_TPREL16_HIGH", /* name */
2077 FALSE, /* partial_inplace */
2079 0xffff, /* dst_mask */
2080 FALSE), /* pcrel_offset */
2082 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2083 HOWTO (R_PPC64_TPREL16_HIGHA,
2084 16, /* rightshift */
2085 1, /* size (0 = byte, 1 = short, 2 = long) */
2087 FALSE, /* pc_relative */
2089 complain_overflow_dont, /* complain_on_overflow */
2090 ppc64_elf_unhandled_reloc, /* special_function */
2091 "R_PPC64_TPREL16_HIGHA", /* name */
2092 FALSE, /* partial_inplace */
2094 0xffff, /* dst_mask */
2095 FALSE), /* pcrel_offset */
2097 /* Like ADDR64, but use local entry point of function. */
2098 HOWTO (R_PPC64_ADDR64_LOCAL, /* type */
2100 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
2102 FALSE, /* pc_relative */
2104 complain_overflow_dont, /* complain_on_overflow */
2105 bfd_elf_generic_reloc, /* special_function */
2106 "R_PPC64_ADDR64_LOCAL", /* name */
2107 FALSE, /* partial_inplace */
2109 ONES (64), /* dst_mask */
2110 FALSE), /* pcrel_offset */
2112 /* GNU extension to record C++ vtable hierarchy. */
2113 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2115 0, /* size (0 = byte, 1 = short, 2 = long) */
2117 FALSE, /* pc_relative */
2119 complain_overflow_dont, /* complain_on_overflow */
2120 NULL, /* special_function */
2121 "R_PPC64_GNU_VTINHERIT", /* name */
2122 FALSE, /* partial_inplace */
2125 FALSE), /* pcrel_offset */
2127 /* GNU extension to record C++ vtable member usage. */
2128 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2130 0, /* size (0 = byte, 1 = short, 2 = long) */
2132 FALSE, /* pc_relative */
2134 complain_overflow_dont, /* complain_on_overflow */
2135 NULL, /* special_function */
2136 "R_PPC64_GNU_VTENTRY", /* name */
2137 FALSE, /* partial_inplace */
2140 FALSE), /* pcrel_offset */
2144 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
2148 ppc_howto_init (void)
2150 unsigned int i, type;
2153 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2156 type = ppc64_elf_howto_raw[i].type;
2157 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2158 / sizeof (ppc64_elf_howto_table[0])));
2159 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2163 static reloc_howto_type *
2164 ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2165 bfd_reloc_code_real_type code)
2167 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
2169 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2170 /* Initialize howto table if needed. */
2178 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2180 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2182 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2184 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2186 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2188 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2190 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2192 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
2194 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2196 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
2198 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
2200 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
2202 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
2204 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
2206 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
2208 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
2210 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
2212 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
2214 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
2216 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
2218 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
2220 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
2222 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
2224 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
2226 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
2228 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
2230 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
2232 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
2234 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
2236 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
2238 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
2240 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
2242 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
2244 case BFD_RELOC_64: r = R_PPC64_ADDR64;
2246 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
2248 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
2250 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
2252 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
2254 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
2256 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
2258 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
2260 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
2262 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
2264 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
2266 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
2268 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
2270 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
2272 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
2274 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
2276 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
2278 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
2280 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
2282 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
2284 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
2286 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
2288 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
2290 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
2292 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
2294 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
2296 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
2298 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
2300 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
2302 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2304 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2306 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
2308 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
2310 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
2312 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
2314 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2316 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
2318 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2320 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
2322 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2324 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2326 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2328 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2330 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2332 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2334 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2336 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2338 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2340 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2342 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2344 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2346 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2348 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2350 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2352 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2354 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2356 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2358 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2360 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2362 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2364 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2366 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2368 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2370 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2372 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2374 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2376 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2378 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2380 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2382 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2384 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2386 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2388 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2390 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2392 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2394 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2396 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2398 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2400 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
2402 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2404 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
2408 return ppc64_elf_howto_table[r];
2411 static reloc_howto_type *
2412 ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2418 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2420 if (ppc64_elf_howto_raw[i].name != NULL
2421 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2422 return &ppc64_elf_howto_raw[i];
2427 /* Set the howto pointer for a PowerPC ELF reloc. */
2430 ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2431 Elf_Internal_Rela *dst)
2435 /* Initialize howto table if needed. */
2436 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2439 type = ELF64_R_TYPE (dst->r_info);
2440 if (type >= (sizeof (ppc64_elf_howto_table)
2441 / sizeof (ppc64_elf_howto_table[0])))
2443 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
2445 type = R_PPC64_NONE;
2447 cache_ptr->howto = ppc64_elf_howto_table[type];
2450 /* Handle the R_PPC64_ADDR16_HA and similar relocs. */
2452 static bfd_reloc_status_type
2453 ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2454 void *data, asection *input_section,
2455 bfd *output_bfd, char **error_message)
2457 /* If this is a relocatable link (output_bfd test tells us), just
2458 call the generic function. Any adjustment will be done at final
2460 if (output_bfd != NULL)
2461 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2462 input_section, output_bfd, error_message);
2464 /* Adjust the addend for sign extension of the low 16 bits.
2465 We won't actually be using the low 16 bits, so trashing them
2467 reloc_entry->addend += 0x8000;
2468 return bfd_reloc_continue;
2471 static bfd_reloc_status_type
2472 ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2473 void *data, asection *input_section,
2474 bfd *output_bfd, char **error_message)
2476 if (output_bfd != NULL)
2477 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2478 input_section, output_bfd, error_message);
2480 if (strcmp (symbol->section->name, ".opd") == 0
2481 && (symbol->section->owner->flags & DYNAMIC) == 0)
2483 bfd_vma dest = opd_entry_value (symbol->section,
2484 symbol->value + reloc_entry->addend,
2486 if (dest != (bfd_vma) -1)
2487 reloc_entry->addend = dest - (symbol->value
2488 + symbol->section->output_section->vma
2489 + symbol->section->output_offset);
2491 return bfd_reloc_continue;
2494 static bfd_reloc_status_type
2495 ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2496 void *data, asection *input_section,
2497 bfd *output_bfd, char **error_message)
2500 enum elf_ppc64_reloc_type r_type;
2501 bfd_size_type octets;
2502 /* Assume 'at' branch hints. */
2503 bfd_boolean is_isa_v2 = TRUE;
2505 /* If this is a relocatable link (output_bfd test tells us), just
2506 call the generic function. Any adjustment will be done at final
2508 if (output_bfd != NULL)
2509 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2510 input_section, output_bfd, error_message);
2512 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2513 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2514 insn &= ~(0x01 << 21);
2515 r_type = reloc_entry->howto->type;
2516 if (r_type == R_PPC64_ADDR14_BRTAKEN
2517 || r_type == R_PPC64_REL14_BRTAKEN)
2518 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
2522 /* Set 'a' bit. This is 0b00010 in BO field for branch
2523 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2524 for branch on CTR insns (BO == 1a00t or 1a01t). */
2525 if ((insn & (0x14 << 21)) == (0x04 << 21))
2527 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2537 if (!bfd_is_com_section (symbol->section))
2538 target = symbol->value;
2539 target += symbol->section->output_section->vma;
2540 target += symbol->section->output_offset;
2541 target += reloc_entry->addend;
2543 from = (reloc_entry->address
2544 + input_section->output_offset
2545 + input_section->output_section->vma);
2547 /* Invert 'y' bit if not the default. */
2548 if ((bfd_signed_vma) (target - from) < 0)
2551 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2553 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2554 input_section, output_bfd, error_message);
2557 static bfd_reloc_status_type
2558 ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2559 void *data, asection *input_section,
2560 bfd *output_bfd, char **error_message)
2562 /* If this is a relocatable link (output_bfd test tells us), just
2563 call the generic function. Any adjustment will be done at final
2565 if (output_bfd != NULL)
2566 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2567 input_section, output_bfd, error_message);
2569 /* Subtract the symbol section base address. */
2570 reloc_entry->addend -= symbol->section->output_section->vma;
2571 return bfd_reloc_continue;
2574 static bfd_reloc_status_type
2575 ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2576 void *data, asection *input_section,
2577 bfd *output_bfd, char **error_message)
2579 /* If this is a relocatable link (output_bfd test tells us), just
2580 call the generic function. Any adjustment will be done at final
2582 if (output_bfd != NULL)
2583 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2584 input_section, output_bfd, error_message);
2586 /* Subtract the symbol section base address. */
2587 reloc_entry->addend -= symbol->section->output_section->vma;
2589 /* Adjust the addend for sign extension of the low 16 bits. */
2590 reloc_entry->addend += 0x8000;
2591 return bfd_reloc_continue;
2594 static bfd_reloc_status_type
2595 ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2596 void *data, asection *input_section,
2597 bfd *output_bfd, char **error_message)
2601 /* If this is a relocatable link (output_bfd test tells us), just
2602 call the generic function. Any adjustment will be done at final
2604 if (output_bfd != NULL)
2605 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2606 input_section, output_bfd, error_message);
2608 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2610 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2612 /* Subtract the TOC base address. */
2613 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2614 return bfd_reloc_continue;
2617 static bfd_reloc_status_type
2618 ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2619 void *data, asection *input_section,
2620 bfd *output_bfd, char **error_message)
2624 /* If this is a relocatable link (output_bfd test tells us), just
2625 call the generic function. Any adjustment will be done at final
2627 if (output_bfd != NULL)
2628 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2629 input_section, output_bfd, error_message);
2631 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2633 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2635 /* Subtract the TOC base address. */
2636 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2638 /* Adjust the addend for sign extension of the low 16 bits. */
2639 reloc_entry->addend += 0x8000;
2640 return bfd_reloc_continue;
2643 static bfd_reloc_status_type
2644 ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2645 void *data, asection *input_section,
2646 bfd *output_bfd, char **error_message)
2649 bfd_size_type octets;
2651 /* If this is a relocatable link (output_bfd test tells us), just
2652 call the generic function. Any adjustment will be done at final
2654 if (output_bfd != NULL)
2655 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2656 input_section, output_bfd, error_message);
2658 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2660 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2662 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2663 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2664 return bfd_reloc_ok;
2667 static bfd_reloc_status_type
2668 ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2669 void *data, asection *input_section,
2670 bfd *output_bfd, char **error_message)
2672 /* If this is a relocatable link (output_bfd test tells us), just
2673 call the generic function. Any adjustment will be done at final
2675 if (output_bfd != NULL)
2676 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2677 input_section, output_bfd, error_message);
2679 if (error_message != NULL)
2681 static char buf[60];
2682 sprintf (buf, "generic linker can't handle %s",
2683 reloc_entry->howto->name);
2684 *error_message = buf;
2686 return bfd_reloc_dangerous;
2689 /* Track GOT entries needed for a given symbol. We might need more
2690 than one got entry per symbol. */
2693 struct got_entry *next;
2695 /* The symbol addend that we'll be placing in the GOT. */
2698 /* Unlike other ELF targets, we use separate GOT entries for the same
2699 symbol referenced from different input files. This is to support
2700 automatic multiple TOC/GOT sections, where the TOC base can vary
2701 from one input file to another. After partitioning into TOC groups
2702 we merge entries within the group.
2704 Point to the BFD owning this GOT entry. */
2707 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2708 TLS_TPREL or TLS_DTPREL for tls entries. */
2709 unsigned char tls_type;
2711 /* Non-zero if got.ent points to real entry. */
2712 unsigned char is_indirect;
2714 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2717 bfd_signed_vma refcount;
2719 struct got_entry *ent;
2723 /* The same for PLT. */
2726 struct plt_entry *next;
2732 bfd_signed_vma refcount;
2737 struct ppc64_elf_obj_tdata
2739 struct elf_obj_tdata elf;
2741 /* Shortcuts to dynamic linker sections. */
2745 /* Used during garbage collection. We attach global symbols defined
2746 on removed .opd entries to this section so that the sym is removed. */
2747 asection *deleted_section;
2749 /* TLS local dynamic got entry handling. Support for multiple GOT
2750 sections means we potentially need one of these for each input bfd. */
2751 struct got_entry tlsld_got;
2754 /* A copy of relocs before they are modified for --emit-relocs. */
2755 Elf_Internal_Rela *relocs;
2757 /* Section contents. */
2761 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2762 the reloc to be in the range -32768 to 32767. */
2763 unsigned int has_small_toc_reloc : 1;
2765 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2766 instruction not one we handle. */
2767 unsigned int unexpected_toc_insn : 1;
2770 #define ppc64_elf_tdata(bfd) \
2771 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2773 #define ppc64_tlsld_got(bfd) \
2774 (&ppc64_elf_tdata (bfd)->tlsld_got)
2776 #define is_ppc64_elf(bfd) \
2777 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2778 && elf_object_id (bfd) == PPC64_ELF_DATA)
2780 /* Override the generic function because we store some extras. */
2783 ppc64_elf_mkobject (bfd *abfd)
2785 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2789 /* Fix bad default arch selected for a 64 bit input bfd when the
2790 default is 32 bit. */
2793 ppc64_elf_object_p (bfd *abfd)
2795 if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2797 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2799 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2801 /* Relies on arch after 32 bit default being 64 bit default. */
2802 abfd->arch_info = abfd->arch_info->next;
2803 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2809 /* Support for core dump NOTE sections. */
2812 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2814 size_t offset, size;
2816 if (note->descsz != 504)
2820 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2823 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
2829 /* Make a ".reg/999" section. */
2830 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2831 size, note->descpos + offset);
2835 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2837 if (note->descsz != 136)
2840 elf_tdata (abfd)->core->pid
2841 = bfd_get_32 (abfd, note->descdata + 24);
2842 elf_tdata (abfd)->core->program
2843 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2844 elf_tdata (abfd)->core->command
2845 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2851 ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2864 va_start (ap, note_type);
2865 memset (data, 0, sizeof (data));
2866 strncpy (data + 40, va_arg (ap, const char *), 16);
2867 strncpy (data + 56, va_arg (ap, const char *), 80);
2869 return elfcore_write_note (abfd, buf, bufsiz,
2870 "CORE", note_type, data, sizeof (data));
2881 va_start (ap, note_type);
2882 memset (data, 0, 112);
2883 pid = va_arg (ap, long);
2884 bfd_put_32 (abfd, pid, data + 32);
2885 cursig = va_arg (ap, int);
2886 bfd_put_16 (abfd, cursig, data + 12);
2887 greg = va_arg (ap, const void *);
2888 memcpy (data + 112, greg, 384);
2889 memset (data + 496, 0, 8);
2891 return elfcore_write_note (abfd, buf, bufsiz,
2892 "CORE", note_type, data, sizeof (data));
2897 /* Add extra PPC sections. */
2899 static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
2901 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
2902 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2903 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2904 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2905 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2906 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2907 { NULL, 0, 0, 0, 0 }
2910 enum _ppc64_sec_type {
2916 struct _ppc64_elf_section_data
2918 struct bfd_elf_section_data elf;
2922 /* An array with one entry for each opd function descriptor. */
2923 struct _opd_sec_data
2925 /* Points to the function code section for local opd entries. */
2926 asection **func_sec;
2928 /* After editing .opd, adjust references to opd local syms. */
2932 /* An array for toc sections, indexed by offset/8. */
2933 struct _toc_sec_data
2935 /* Specifies the relocation symbol index used at a given toc offset. */
2938 /* And the relocation addend. */
2943 enum _ppc64_sec_type sec_type:2;
2945 /* Flag set when small branches are detected. Used to
2946 select suitable defaults for the stub group size. */
2947 unsigned int has_14bit_branch:1;
2950 #define ppc64_elf_section_data(sec) \
2951 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2954 ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2956 if (!sec->used_by_bfd)
2958 struct _ppc64_elf_section_data *sdata;
2959 bfd_size_type amt = sizeof (*sdata);
2961 sdata = bfd_zalloc (abfd, amt);
2964 sec->used_by_bfd = sdata;
2967 return _bfd_elf_new_section_hook (abfd, sec);
2970 static struct _opd_sec_data *
2971 get_opd_info (asection * sec)
2974 && ppc64_elf_section_data (sec) != NULL
2975 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
2976 return &ppc64_elf_section_data (sec)->u.opd;
2981 abiversion (bfd *abfd)
2983 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
2987 set_abiversion (bfd *abfd, int ver)
2989 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
2990 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
2993 /* Parameters for the qsort hook. */
2994 static bfd_boolean synthetic_relocatable;
2996 /* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
2999 compare_symbols (const void *ap, const void *bp)
3001 const asymbol *a = * (const asymbol **) ap;
3002 const asymbol *b = * (const asymbol **) bp;
3004 /* Section symbols first. */
3005 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
3007 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
3010 /* then .opd symbols. */
3011 if (strcmp (a->section->name, ".opd") == 0
3012 && strcmp (b->section->name, ".opd") != 0)
3014 if (strcmp (a->section->name, ".opd") != 0
3015 && strcmp (b->section->name, ".opd") == 0)
3018 /* then other code symbols. */
3019 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3020 == (SEC_CODE | SEC_ALLOC)
3021 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3022 != (SEC_CODE | SEC_ALLOC))
3025 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3026 != (SEC_CODE | SEC_ALLOC)
3027 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3028 == (SEC_CODE | SEC_ALLOC))
3031 if (synthetic_relocatable)
3033 if (a->section->id < b->section->id)
3036 if (a->section->id > b->section->id)
3040 if (a->value + a->section->vma < b->value + b->section->vma)
3043 if (a->value + a->section->vma > b->value + b->section->vma)
3046 /* For syms with the same value, prefer strong dynamic global function
3047 syms over other syms. */
3048 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3051 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3054 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3057 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3060 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3063 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3066 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3069 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3075 /* Search SYMS for a symbol of the given VALUE. */
3078 sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
3086 mid = (lo + hi) >> 1;
3087 if (syms[mid]->value + syms[mid]->section->vma < value)
3089 else if (syms[mid]->value + syms[mid]->section->vma > value)
3099 mid = (lo + hi) >> 1;
3100 if (syms[mid]->section->id < id)
3102 else if (syms[mid]->section->id > id)
3104 else if (syms[mid]->value < value)
3106 else if (syms[mid]->value > value)
3116 section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3118 bfd_vma vma = *(bfd_vma *) ptr;
3119 return ((section->flags & SEC_ALLOC) != 0
3120 && section->vma <= vma
3121 && vma < section->vma + section->size);
3124 /* Create synthetic symbols, effectively restoring "dot-symbol" function
3125 entry syms. Also generate @plt symbols for the glink branch table. */
3128 ppc64_elf_get_synthetic_symtab (bfd *abfd,
3129 long static_count, asymbol **static_syms,
3130 long dyn_count, asymbol **dyn_syms,
3137 long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
3138 asection *opd = NULL;
3139 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
3141 int abi = abiversion (abfd);
3147 opd = bfd_get_section_by_name (abfd, ".opd");
3148 if (opd == NULL && abi == 1)
3152 symcount = static_count;
3154 symcount += dyn_count;
3158 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3162 if (!relocatable && static_count != 0 && dyn_count != 0)
3164 /* Use both symbol tables. */
3165 memcpy (syms, static_syms, static_count * sizeof (*syms));
3166 memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
3168 else if (!relocatable && static_count == 0)
3169 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3171 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3173 synthetic_relocatable = relocatable;
3174 qsort (syms, symcount, sizeof (*syms), compare_symbols);
3176 if (!relocatable && symcount > 1)
3179 /* Trim duplicate syms, since we may have merged the normal and
3180 dynamic symbols. Actually, we only care about syms that have
3181 different values, so trim any with the same value. */
3182 for (i = 1, j = 1; i < symcount; ++i)
3183 if (syms[i - 1]->value + syms[i - 1]->section->vma
3184 != syms[i]->value + syms[i]->section->vma)
3185 syms[j++] = syms[i];
3190 if (strcmp (syms[i]->section->name, ".opd") == 0)
3194 for (; i < symcount; ++i)
3195 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3196 != (SEC_CODE | SEC_ALLOC))
3197 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3201 for (; i < symcount; ++i)
3202 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3206 for (; i < symcount; ++i)
3207 if (strcmp (syms[i]->section->name, ".opd") != 0)
3211 for (; i < symcount; ++i)
3212 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3213 != (SEC_CODE | SEC_ALLOC))
3221 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3226 if (opdsymend == secsymend)
3229 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3230 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
3234 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3241 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3245 while (r < opd->relocation + relcount
3246 && r->address < syms[i]->value + opd->vma)
3249 if (r == opd->relocation + relcount)
3252 if (r->address != syms[i]->value + opd->vma)
3255 if (r->howto->type != R_PPC64_ADDR64)
3258 sym = *r->sym_ptr_ptr;
3259 if (!sym_exists_at (syms, opdsymend, symcount,
3260 sym->section->id, sym->value + r->addend))
3263 size += sizeof (asymbol);
3264 size += strlen (syms[i]->name) + 2;
3268 s = *ret = bfd_malloc (size);
3275 names = (char *) (s + count);
3277 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3281 while (r < opd->relocation + relcount
3282 && r->address < syms[i]->value + opd->vma)
3285 if (r == opd->relocation + relcount)
3288 if (r->address != syms[i]->value + opd->vma)
3291 if (r->howto->type != R_PPC64_ADDR64)
3294 sym = *r->sym_ptr_ptr;
3295 if (!sym_exists_at (syms, opdsymend, symcount,
3296 sym->section->id, sym->value + r->addend))
3301 s->flags |= BSF_SYNTHETIC;
3302 s->section = sym->section;
3303 s->value = sym->value + r->addend;
3306 len = strlen (syms[i]->name);
3307 memcpy (names, syms[i]->name, len + 1);
3309 /* Have udata.p point back to the original symbol this
3310 synthetic symbol was derived from. */
3311 s->udata.p = syms[i];
3318 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3319 bfd_byte *contents = NULL;
3322 bfd_vma glink_vma = 0, resolv_vma = 0;
3323 asection *dynamic, *glink = NULL, *relplt = NULL;
3326 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
3328 free_contents_and_exit:
3336 for (i = secsymend; i < opdsymend; ++i)
3340 /* Ignore bogus symbols. */
3341 if (syms[i]->value > opd->size - 8)
3344 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3345 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3348 size += sizeof (asymbol);
3349 size += strlen (syms[i]->name) + 2;
3353 /* Get start of .glink stubs from DT_PPC64_GLINK. */
3355 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
3357 bfd_byte *dynbuf, *extdyn, *extdynend;
3359 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3361 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3362 goto free_contents_and_exit;
3364 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3365 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3368 extdynend = extdyn + dynamic->size;
3369 for (; extdyn < extdynend; extdyn += extdynsize)
3371 Elf_Internal_Dyn dyn;
3372 (*swap_dyn_in) (abfd, extdyn, &dyn);
3374 if (dyn.d_tag == DT_NULL)
3377 if (dyn.d_tag == DT_PPC64_GLINK)
3379 /* The first glink stub starts at offset 32; see
3380 comment in ppc64_elf_finish_dynamic_sections. */
3381 glink_vma = dyn.d_un.d_val + GLINK_CALL_STUB_SIZE - 8 * 4;
3382 /* The .glink section usually does not survive the final
3383 link; search for the section (usually .text) where the
3384 glink stubs now reside. */
3385 glink = bfd_sections_find_if (abfd, section_covers_vma,
3396 /* Determine __glink trampoline by reading the relative branch
3397 from the first glink stub. */
3399 unsigned int off = 0;
3401 while (bfd_get_section_contents (abfd, glink, buf,
3402 glink_vma + off - glink->vma, 4))
3404 unsigned int insn = bfd_get_32 (abfd, buf);
3406 if ((insn & ~0x3fffffc) == 0)
3408 resolv_vma = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
3417 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3419 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3422 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3423 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3424 goto free_contents_and_exit;
3426 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3427 size += plt_count * sizeof (asymbol);
3429 p = relplt->relocation;
3430 for (i = 0; i < plt_count; i++, p++)
3432 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3434 size += sizeof ("+0x") - 1 + 16;
3439 s = *ret = bfd_malloc (size);
3441 goto free_contents_and_exit;
3443 names = (char *) (s + count + plt_count + (resolv_vma != 0));
3445 for (i = secsymend; i < opdsymend; ++i)
3449 if (syms[i]->value > opd->size - 8)
3452 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3453 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3457 asection *sec = abfd->sections;
3464 long mid = (lo + hi) >> 1;
3465 if (syms[mid]->section->vma < ent)
3467 else if (syms[mid]->section->vma > ent)
3471 sec = syms[mid]->section;
3476 if (lo >= hi && lo > codesecsym)
3477 sec = syms[lo - 1]->section;
3479 for (; sec != NULL; sec = sec->next)
3483 /* SEC_LOAD may not be set if SEC is from a separate debug
3485 if ((sec->flags & SEC_ALLOC) == 0)
3487 if ((sec->flags & SEC_CODE) != 0)
3490 s->flags |= BSF_SYNTHETIC;
3491 s->value = ent - s->section->vma;
3494 len = strlen (syms[i]->name);
3495 memcpy (names, syms[i]->name, len + 1);
3497 /* Have udata.p point back to the original symbol this
3498 synthetic symbol was derived from. */
3499 s->udata.p = syms[i];
3505 if (glink != NULL && relplt != NULL)
3509 /* Add a symbol for the main glink trampoline. */
3510 memset (s, 0, sizeof *s);
3512 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3514 s->value = resolv_vma - glink->vma;
3516 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3517 names += sizeof ("__glink_PLTresolve");
3522 /* FIXME: It would be very much nicer to put sym@plt on the
3523 stub rather than on the glink branch table entry. The
3524 objdump disassembler would then use a sensible symbol
3525 name on plt calls. The difficulty in doing so is
3526 a) finding the stubs, and,
3527 b) matching stubs against plt entries, and,
3528 c) there can be multiple stubs for a given plt entry.
3530 Solving (a) could be done by code scanning, but older
3531 ppc64 binaries used different stubs to current code.
3532 (b) is the tricky one since you need to known the toc
3533 pointer for at least one function that uses a pic stub to
3534 be able to calculate the plt address referenced.
3535 (c) means gdb would need to set multiple breakpoints (or
3536 find the glink branch itself) when setting breakpoints
3537 for pending shared library loads. */
3538 p = relplt->relocation;
3539 for (i = 0; i < plt_count; i++, p++)
3543 *s = **p->sym_ptr_ptr;
3544 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3545 we are defining a symbol, ensure one of them is set. */
3546 if ((s->flags & BSF_LOCAL) == 0)
3547 s->flags |= BSF_GLOBAL;
3548 s->flags |= BSF_SYNTHETIC;
3550 s->value = glink_vma - glink->vma;
3553 len = strlen ((*p->sym_ptr_ptr)->name);
3554 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3558 memcpy (names, "+0x", sizeof ("+0x") - 1);
3559 names += sizeof ("+0x") - 1;
3560 bfd_sprintf_vma (abfd, names, p->addend);
3561 names += strlen (names);
3563 memcpy (names, "@plt", sizeof ("@plt"));
3564 names += sizeof ("@plt");
3584 /* The following functions are specific to the ELF linker, while
3585 functions above are used generally. Those named ppc64_elf_* are
3586 called by the main ELF linker code. They appear in this file more
3587 or less in the order in which they are called. eg.
3588 ppc64_elf_check_relocs is called early in the link process,
3589 ppc64_elf_finish_dynamic_sections is one of the last functions
3592 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3593 functions have both a function code symbol and a function descriptor
3594 symbol. A call to foo in a relocatable object file looks like:
3601 The function definition in another object file might be:
3605 . .quad .TOC.@tocbase
3611 When the linker resolves the call during a static link, the branch
3612 unsurprisingly just goes to .foo and the .opd information is unused.
3613 If the function definition is in a shared library, things are a little
3614 different: The call goes via a plt call stub, the opd information gets
3615 copied to the plt, and the linker patches the nop.
3623 . std 2,40(1) # in practice, the call stub
3624 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3625 . addi 11,11,Lfoo@toc@l # this is the general idea
3633 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3635 The "reloc ()" notation is supposed to indicate that the linker emits
3636 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3639 What are the difficulties here? Well, firstly, the relocations
3640 examined by the linker in check_relocs are against the function code
3641 sym .foo, while the dynamic relocation in the plt is emitted against
3642 the function descriptor symbol, foo. Somewhere along the line, we need
3643 to carefully copy dynamic link information from one symbol to the other.
3644 Secondly, the generic part of the elf linker will make .foo a dynamic
3645 symbol as is normal for most other backends. We need foo dynamic
3646 instead, at least for an application final link. However, when
3647 creating a shared library containing foo, we need to have both symbols
3648 dynamic so that references to .foo are satisfied during the early
3649 stages of linking. Otherwise the linker might decide to pull in a
3650 definition from some other object, eg. a static library.
3652 Update: As of August 2004, we support a new convention. Function
3653 calls may use the function descriptor symbol, ie. "bl foo". This
3654 behaves exactly as "bl .foo". */
3656 /* Of those relocs that might be copied as dynamic relocs, this function
3657 selects those that must be copied when linking a shared library,
3658 even when the symbol is local. */
3661 must_be_dyn_reloc (struct bfd_link_info *info,
3662 enum elf_ppc64_reloc_type r_type)
3674 case R_PPC64_TPREL16:
3675 case R_PPC64_TPREL16_LO:
3676 case R_PPC64_TPREL16_HI:
3677 case R_PPC64_TPREL16_HA:
3678 case R_PPC64_TPREL16_DS:
3679 case R_PPC64_TPREL16_LO_DS:
3680 case R_PPC64_TPREL16_HIGH:
3681 case R_PPC64_TPREL16_HIGHA:
3682 case R_PPC64_TPREL16_HIGHER:
3683 case R_PPC64_TPREL16_HIGHERA:
3684 case R_PPC64_TPREL16_HIGHEST:
3685 case R_PPC64_TPREL16_HIGHESTA:
3686 case R_PPC64_TPREL64:
3687 return !info->executable;
3691 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3692 copying dynamic variables from a shared lib into an app's dynbss
3693 section, and instead use a dynamic relocation to point into the
3694 shared lib. With code that gcc generates, it's vital that this be
3695 enabled; In the PowerPC64 ABI, the address of a function is actually
3696 the address of a function descriptor, which resides in the .opd
3697 section. gcc uses the descriptor directly rather than going via the
3698 GOT as some other ABI's do, which means that initialized function
3699 pointers must reference the descriptor. Thus, a function pointer
3700 initialized to the address of a function in a shared library will
3701 either require a copy reloc, or a dynamic reloc. Using a copy reloc
3702 redefines the function descriptor symbol to point to the copy. This
3703 presents a problem as a plt entry for that function is also
3704 initialized from the function descriptor symbol and the copy reloc
3705 may not be initialized first. */
3706 #define ELIMINATE_COPY_RELOCS 1
3708 /* Section name for stubs is the associated section name plus this
3710 #define STUB_SUFFIX ".stub"
3713 ppc_stub_long_branch:
3714 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3715 destination, but a 24 bit branch in a stub section will reach.
3718 ppc_stub_plt_branch:
3719 Similar to the above, but a 24 bit branch in the stub section won't
3720 reach its destination.
3721 . addis %r11,%r2,xxx@toc@ha
3722 . ld %r12,xxx@toc@l(%r11)
3727 Used to call a function in a shared library. If it so happens that
3728 the plt entry referenced crosses a 64k boundary, then an extra
3729 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
3731 . addis %r11,%r2,xxx@toc@ha
3732 . ld %r12,xxx+0@toc@l(%r11)
3734 . ld %r2,xxx+8@toc@l(%r11)
3735 . ld %r11,xxx+16@toc@l(%r11)
3738 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3739 code to adjust the value and save r2 to support multiple toc sections.
3740 A ppc_stub_long_branch with an r2 offset looks like:
3742 . addis %r2,%r2,off@ha
3743 . addi %r2,%r2,off@l
3746 A ppc_stub_plt_branch with an r2 offset looks like:
3748 . addis %r11,%r2,xxx@toc@ha
3749 . ld %r12,xxx@toc@l(%r11)
3750 . addis %r2,%r2,off@ha
3751 . addi %r2,%r2,off@l
3755 In cases where the "addis" instruction would add zero, the "addis" is
3756 omitted and following instructions modified slightly in some cases.
3759 enum ppc_stub_type {
3761 ppc_stub_long_branch,
3762 ppc_stub_long_branch_r2off,
3763 ppc_stub_plt_branch,
3764 ppc_stub_plt_branch_r2off,
3766 ppc_stub_plt_call_r2save
3769 struct ppc_stub_hash_entry {
3771 /* Base hash table entry structure. */
3772 struct bfd_hash_entry root;
3774 enum ppc_stub_type stub_type;
3776 /* The stub section. */
3779 /* Offset within stub_sec of the beginning of this stub. */
3780 bfd_vma stub_offset;
3782 /* Given the symbol's value and its section we can determine its final
3783 value when building the stubs (so the stub knows where to jump. */
3784 bfd_vma target_value;
3785 asection *target_section;
3787 /* The symbol table entry, if any, that this was derived from. */
3788 struct ppc_link_hash_entry *h;
3789 struct plt_entry *plt_ent;
3791 /* Where this stub is being called from, or, in the case of combined
3792 stub sections, the first input section in the group. */
3795 /* Symbol st_other. */
3796 unsigned char other;
3799 struct ppc_branch_hash_entry {
3801 /* Base hash table entry structure. */
3802 struct bfd_hash_entry root;
3804 /* Offset within branch lookup table. */
3805 unsigned int offset;
3807 /* Generation marker. */
3811 /* Used to track dynamic relocations for local symbols. */
3812 struct ppc_dyn_relocs
3814 struct ppc_dyn_relocs *next;
3816 /* The input section of the reloc. */
3819 /* Total number of relocs copied for the input section. */
3820 unsigned int count : 31;
3822 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3823 unsigned int ifunc : 1;
3826 struct ppc_link_hash_entry
3828 struct elf_link_hash_entry elf;
3831 /* A pointer to the most recently used stub hash entry against this
3833 struct ppc_stub_hash_entry *stub_cache;
3835 /* A pointer to the next symbol starting with a '.' */
3836 struct ppc_link_hash_entry *next_dot_sym;
3839 /* Track dynamic relocs copied for this symbol. */
3840 struct elf_dyn_relocs *dyn_relocs;
3842 /* Link between function code and descriptor symbols. */
3843 struct ppc_link_hash_entry *oh;
3845 /* Flag function code and descriptor symbols. */
3846 unsigned int is_func:1;
3847 unsigned int is_func_descriptor:1;
3848 unsigned int fake:1;
3850 /* Whether global opd/toc sym has been adjusted or not.
3851 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3852 should be set for all globals defined in any opd/toc section. */
3853 unsigned int adjust_done:1;
3855 /* Set if we twiddled this symbol to weak at some stage. */
3856 unsigned int was_undefined:1;
3858 /* Contexts in which symbol is used in the GOT (or TOC).
3859 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3860 corresponding relocs are encountered during check_relocs.
3861 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3862 indicate the corresponding GOT entry type is not needed.
3863 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3864 a TPREL one. We use a separate flag rather than setting TPREL
3865 just for convenience in distinguishing the two cases. */
3866 #define TLS_GD 1 /* GD reloc. */
3867 #define TLS_LD 2 /* LD reloc. */
3868 #define TLS_TPREL 4 /* TPREL reloc, => IE. */
3869 #define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
3870 #define TLS_TLS 16 /* Any TLS reloc. */
3871 #define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
3872 #define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
3873 #define PLT_IFUNC 128 /* STT_GNU_IFUNC. */
3874 unsigned char tls_mask;
3877 /* ppc64 ELF linker hash table. */
3879 struct ppc_link_hash_table
3881 struct elf_link_hash_table elf;
3883 /* The stub hash table. */
3884 struct bfd_hash_table stub_hash_table;
3886 /* Another hash table for plt_branch stubs. */
3887 struct bfd_hash_table branch_hash_table;
3889 /* Hash table for function prologue tocsave. */
3890 htab_t tocsave_htab;
3892 /* Various options and other info passed from the linker. */
3893 struct ppc64_elf_params *params;
3895 /* Array to keep track of which stub sections have been created, and
3896 information on stub grouping. */
3898 /* This is the section to which stubs in the group will be attached. */
3900 /* The stub section. */
3902 /* Along with elf_gp, specifies the TOC pointer used in this group. */
3906 /* Temp used when calculating TOC pointers. */
3909 asection *toc_first_sec;
3911 /* Highest input section id. */
3914 /* Highest output section index. */
3917 /* Used when adding symbols. */
3918 struct ppc_link_hash_entry *dot_syms;
3920 /* List of input sections for each output section. */
3921 asection **input_list;
3923 /* Shortcuts to get to dynamic linker sections. */
3930 asection *glink_eh_frame;
3932 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3933 struct ppc_link_hash_entry *tls_get_addr;
3934 struct ppc_link_hash_entry *tls_get_addr_fd;
3936 /* The size of reliplt used by got entry relocs. */
3937 bfd_size_type got_reli_size;
3940 unsigned long stub_count[ppc_stub_plt_call_r2save];
3942 /* Number of stubs against global syms. */
3943 unsigned long stub_globals;
3945 /* Set if we're linking code with function descriptors. */
3946 unsigned int opd_abi:1;
3948 /* Support for multiple toc sections. */
3949 unsigned int do_multi_toc:1;
3950 unsigned int multi_toc_needed:1;
3951 unsigned int second_toc_pass:1;
3952 unsigned int do_toc_opt:1;
3955 unsigned int stub_error:1;
3957 /* Temp used by ppc64_elf_process_dot_syms. */
3958 unsigned int twiddled_syms:1;
3960 /* Incremented every time we size stubs. */
3961 unsigned int stub_iteration;
3963 /* Small local sym cache. */
3964 struct sym_cache sym_cache;
3967 /* Rename some of the generic section flags to better document how they
3970 /* Nonzero if this section has TLS related relocations. */
3971 #define has_tls_reloc sec_flg0
3973 /* Nonzero if this section has a call to __tls_get_addr. */
3974 #define has_tls_get_addr_call sec_flg1
3976 /* Nonzero if this section has any toc or got relocs. */
3977 #define has_toc_reloc sec_flg2
3979 /* Nonzero if this section has a call to another section that uses
3981 #define makes_toc_func_call sec_flg3
3983 /* Recursion protection when determining above flag. */
3984 #define call_check_in_progress sec_flg4
3985 #define call_check_done sec_flg5
3987 /* Get the ppc64 ELF linker hash table from a link_info structure. */
3989 #define ppc_hash_table(p) \
3990 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3991 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
3993 #define ppc_stub_hash_lookup(table, string, create, copy) \
3994 ((struct ppc_stub_hash_entry *) \
3995 bfd_hash_lookup ((table), (string), (create), (copy)))
3997 #define ppc_branch_hash_lookup(table, string, create, copy) \
3998 ((struct ppc_branch_hash_entry *) \
3999 bfd_hash_lookup ((table), (string), (create), (copy)))
4001 /* Create an entry in the stub hash table. */
4003 static struct bfd_hash_entry *
4004 stub_hash_newfunc (struct bfd_hash_entry *entry,
4005 struct bfd_hash_table *table,
4008 /* Allocate the structure if it has not already been allocated by a
4012 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
4017 /* Call the allocation method of the superclass. */
4018 entry = bfd_hash_newfunc (entry, table, string);
4021 struct ppc_stub_hash_entry *eh;
4023 /* Initialize the local fields. */
4024 eh = (struct ppc_stub_hash_entry *) entry;
4025 eh->stub_type = ppc_stub_none;
4026 eh->stub_sec = NULL;
4027 eh->stub_offset = 0;
4028 eh->target_value = 0;
4029 eh->target_section = NULL;
4039 /* Create an entry in the branch hash table. */
4041 static struct bfd_hash_entry *
4042 branch_hash_newfunc (struct bfd_hash_entry *entry,
4043 struct bfd_hash_table *table,
4046 /* Allocate the structure if it has not already been allocated by a
4050 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4055 /* Call the allocation method of the superclass. */
4056 entry = bfd_hash_newfunc (entry, table, string);
4059 struct ppc_branch_hash_entry *eh;
4061 /* Initialize the local fields. */
4062 eh = (struct ppc_branch_hash_entry *) entry;
4070 /* Create an entry in a ppc64 ELF linker hash table. */
4072 static struct bfd_hash_entry *
4073 link_hash_newfunc (struct bfd_hash_entry *entry,
4074 struct bfd_hash_table *table,
4077 /* Allocate the structure if it has not already been allocated by a
4081 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4086 /* Call the allocation method of the superclass. */
4087 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4090 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4092 memset (&eh->u.stub_cache, 0,
4093 (sizeof (struct ppc_link_hash_entry)
4094 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4096 /* When making function calls, old ABI code references function entry
4097 points (dot symbols), while new ABI code references the function
4098 descriptor symbol. We need to make any combination of reference and
4099 definition work together, without breaking archive linking.
4101 For a defined function "foo" and an undefined call to "bar":
4102 An old object defines "foo" and ".foo", references ".bar" (possibly
4104 A new object defines "foo" and references "bar".
4106 A new object thus has no problem with its undefined symbols being
4107 satisfied by definitions in an old object. On the other hand, the
4108 old object won't have ".bar" satisfied by a new object.
4110 Keep a list of newly added dot-symbols. */
4112 if (string[0] == '.')
4114 struct ppc_link_hash_table *htab;
4116 htab = (struct ppc_link_hash_table *) table;
4117 eh->u.next_dot_sym = htab->dot_syms;
4118 htab->dot_syms = eh;
4125 struct tocsave_entry {
4131 tocsave_htab_hash (const void *p)
4133 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4134 return ((bfd_vma)(intptr_t) e->sec ^ e->offset) >> 3;
4138 tocsave_htab_eq (const void *p1, const void *p2)
4140 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4141 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4142 return e1->sec == e2->sec && e1->offset == e2->offset;
4145 /* Create a ppc64 ELF linker hash table. */
4147 static struct bfd_link_hash_table *
4148 ppc64_elf_link_hash_table_create (bfd *abfd)
4150 struct ppc_link_hash_table *htab;
4151 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4153 htab = bfd_zmalloc (amt);
4157 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4158 sizeof (struct ppc_link_hash_entry),
4165 /* Init the stub hash table too. */
4166 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4167 sizeof (struct ppc_stub_hash_entry)))
4169 _bfd_elf_link_hash_table_free ((struct bfd_link_hash_table *) htab);
4173 /* And the branch hash table. */
4174 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4175 sizeof (struct ppc_branch_hash_entry)))
4177 bfd_hash_table_free (&htab->stub_hash_table);
4178 _bfd_elf_link_hash_table_free ((struct bfd_link_hash_table *) htab);
4182 htab->tocsave_htab = htab_try_create (1024,
4186 if (htab->tocsave_htab == NULL)
4188 bfd_hash_table_free (&htab->branch_hash_table);
4189 bfd_hash_table_free (&htab->stub_hash_table);
4190 _bfd_elf_link_hash_table_free ((struct bfd_link_hash_table *) htab);
4194 /* Initializing two fields of the union is just cosmetic. We really
4195 only care about glist, but when compiled on a 32-bit host the
4196 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4197 debugger inspection of these fields look nicer. */
4198 htab->elf.init_got_refcount.refcount = 0;
4199 htab->elf.init_got_refcount.glist = NULL;
4200 htab->elf.init_plt_refcount.refcount = 0;
4201 htab->elf.init_plt_refcount.glist = NULL;
4202 htab->elf.init_got_offset.offset = 0;
4203 htab->elf.init_got_offset.glist = NULL;
4204 htab->elf.init_plt_offset.offset = 0;
4205 htab->elf.init_plt_offset.glist = NULL;
4207 return &htab->elf.root;
4210 /* Free the derived linker hash table. */
4213 ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
4215 struct ppc_link_hash_table *htab = (struct ppc_link_hash_table *) hash;
4217 bfd_hash_table_free (&htab->stub_hash_table);
4218 bfd_hash_table_free (&htab->branch_hash_table);
4219 if (htab->tocsave_htab)
4220 htab_delete (htab->tocsave_htab);
4221 _bfd_elf_link_hash_table_free (hash);
4224 /* Create sections for linker generated code. */
4227 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4229 struct ppc_link_hash_table *htab;
4232 htab = ppc_hash_table (info);
4234 /* Create .sfpr for code to save and restore fp regs. */
4235 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4236 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4237 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4239 if (htab->sfpr == NULL
4240 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4243 /* Create .glink for lazy dynamic linking support. */
4244 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4246 if (htab->glink == NULL
4247 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4250 if (!info->no_ld_generated_unwind_info)
4252 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4253 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4254 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4257 if (htab->glink_eh_frame == NULL
4258 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4262 flags = SEC_ALLOC | SEC_LINKER_CREATED;
4263 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4264 if (htab->elf.iplt == NULL
4265 || ! bfd_set_section_alignment (dynobj, htab->elf.iplt, 3))
4268 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4269 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4271 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
4272 if (htab->elf.irelplt == NULL
4273 || ! bfd_set_section_alignment (dynobj, htab->elf.irelplt, 3))
4276 /* Create branch lookup table for plt_branch stubs. */
4277 flags = (SEC_ALLOC | SEC_LOAD
4278 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4279 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4281 if (htab->brlt == NULL
4282 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4288 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4289 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4290 htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4293 if (htab->relbrlt == NULL
4294 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4300 /* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4303 ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
4304 struct ppc64_elf_params *params)
4306 struct ppc_link_hash_table *htab;
4308 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
4310 /* Always hook our dynamic sections into the first bfd, which is the
4311 linker created stub bfd. This ensures that the GOT header is at
4312 the start of the output TOC section. */
4313 htab = ppc_hash_table (info);
4316 htab->elf.dynobj = params->stub_bfd;
4317 htab->params = params;
4319 if (info->relocatable)
4322 return create_linkage_sections (htab->elf.dynobj, info);
4325 /* Build a name for an entry in the stub hash table. */
4328 ppc_stub_name (const asection *input_section,
4329 const asection *sym_sec,
4330 const struct ppc_link_hash_entry *h,
4331 const Elf_Internal_Rela *rel)
4336 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4337 offsets from a sym as a branch target? In fact, we could
4338 probably assume the addend is always zero. */
4339 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4343 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4344 stub_name = bfd_malloc (len);
4345 if (stub_name == NULL)
4348 len = sprintf (stub_name, "%08x.%s+%x",
4349 input_section->id & 0xffffffff,
4350 h->elf.root.root.string,
4351 (int) rel->r_addend & 0xffffffff);
4355 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4356 stub_name = bfd_malloc (len);
4357 if (stub_name == NULL)
4360 len = sprintf (stub_name, "%08x.%x:%x+%x",
4361 input_section->id & 0xffffffff,
4362 sym_sec->id & 0xffffffff,
4363 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4364 (int) rel->r_addend & 0xffffffff);
4366 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4367 stub_name[len - 2] = 0;
4371 /* Look up an entry in the stub hash. Stub entries are cached because
4372 creating the stub name takes a bit of time. */
4374 static struct ppc_stub_hash_entry *
4375 ppc_get_stub_entry (const asection *input_section,
4376 const asection *sym_sec,
4377 struct ppc_link_hash_entry *h,
4378 const Elf_Internal_Rela *rel,
4379 struct ppc_link_hash_table *htab)
4381 struct ppc_stub_hash_entry *stub_entry;
4382 const asection *id_sec;
4384 /* If this input section is part of a group of sections sharing one
4385 stub section, then use the id of the first section in the group.
4386 Stub names need to include a section id, as there may well be
4387 more than one stub used to reach say, printf, and we need to
4388 distinguish between them. */
4389 id_sec = htab->stub_group[input_section->id].link_sec;
4391 if (h != NULL && h->u.stub_cache != NULL
4392 && h->u.stub_cache->h == h
4393 && h->u.stub_cache->id_sec == id_sec)
4395 stub_entry = h->u.stub_cache;
4401 stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
4402 if (stub_name == NULL)
4405 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4406 stub_name, FALSE, FALSE);
4408 h->u.stub_cache = stub_entry;
4416 /* Add a new stub entry to the stub hash. Not all fields of the new
4417 stub entry are initialised. */
4419 static struct ppc_stub_hash_entry *
4420 ppc_add_stub (const char *stub_name,
4422 struct bfd_link_info *info)
4424 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4427 struct ppc_stub_hash_entry *stub_entry;
4429 link_sec = htab->stub_group[section->id].link_sec;
4430 stub_sec = htab->stub_group[section->id].stub_sec;
4431 if (stub_sec == NULL)
4433 stub_sec = htab->stub_group[link_sec->id].stub_sec;
4434 if (stub_sec == NULL)
4440 namelen = strlen (link_sec->name);
4441 len = namelen + sizeof (STUB_SUFFIX);
4442 s_name = bfd_alloc (htab->params->stub_bfd, len);
4446 memcpy (s_name, link_sec->name, namelen);
4447 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4448 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
4449 if (stub_sec == NULL)
4451 htab->stub_group[link_sec->id].stub_sec = stub_sec;
4453 htab->stub_group[section->id].stub_sec = stub_sec;
4456 /* Enter this entry into the linker stub hash table. */
4457 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4459 if (stub_entry == NULL)
4461 info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
4462 section->owner, stub_name);
4466 stub_entry->stub_sec = stub_sec;
4467 stub_entry->stub_offset = 0;
4468 stub_entry->id_sec = link_sec;
4472 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4473 not already done. */
4476 create_got_section (bfd *abfd, struct bfd_link_info *info)
4478 asection *got, *relgot;
4480 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4482 if (!is_ppc64_elf (abfd))
4488 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
4491 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4492 | SEC_LINKER_CREATED);
4494 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4496 || !bfd_set_section_alignment (abfd, got, 3))
4499 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4500 flags | SEC_READONLY);
4502 || ! bfd_set_section_alignment (abfd, relgot, 3))
4505 ppc64_elf_tdata (abfd)->got = got;
4506 ppc64_elf_tdata (abfd)->relgot = relgot;
4510 /* Create the dynamic sections, and set up shortcuts. */
4513 ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4515 struct ppc_link_hash_table *htab;
4517 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
4520 htab = ppc_hash_table (info);
4524 htab->dynbss = bfd_get_linker_section (dynobj, ".dynbss");
4526 htab->relbss = bfd_get_linker_section (dynobj, ".rela.bss");
4528 if (!htab->elf.sgot || !htab->elf.splt || !htab->elf.srelplt || !htab->dynbss
4529 || (!info->shared && !htab->relbss))
4535 /* Follow indirect and warning symbol links. */
4537 static inline struct bfd_link_hash_entry *
4538 follow_link (struct bfd_link_hash_entry *h)
4540 while (h->type == bfd_link_hash_indirect
4541 || h->type == bfd_link_hash_warning)
4546 static inline struct elf_link_hash_entry *
4547 elf_follow_link (struct elf_link_hash_entry *h)
4549 return (struct elf_link_hash_entry *) follow_link (&h->root);
4552 static inline struct ppc_link_hash_entry *
4553 ppc_follow_link (struct ppc_link_hash_entry *h)
4555 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4558 /* Merge PLT info on FROM with that on TO. */
4561 move_plt_plist (struct ppc_link_hash_entry *from,
4562 struct ppc_link_hash_entry *to)
4564 if (from->elf.plt.plist != NULL)
4566 if (to->elf.plt.plist != NULL)
4568 struct plt_entry **entp;
4569 struct plt_entry *ent;
4571 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4573 struct plt_entry *dent;
4575 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4576 if (dent->addend == ent->addend)
4578 dent->plt.refcount += ent->plt.refcount;
4585 *entp = to->elf.plt.plist;
4588 to->elf.plt.plist = from->elf.plt.plist;
4589 from->elf.plt.plist = NULL;
4593 /* Copy the extra info we tack onto an elf_link_hash_entry. */
4596 ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4597 struct elf_link_hash_entry *dir,
4598 struct elf_link_hash_entry *ind)
4600 struct ppc_link_hash_entry *edir, *eind;
4602 edir = (struct ppc_link_hash_entry *) dir;
4603 eind = (struct ppc_link_hash_entry *) ind;
4605 edir->is_func |= eind->is_func;
4606 edir->is_func_descriptor |= eind->is_func_descriptor;
4607 edir->tls_mask |= eind->tls_mask;
4608 if (eind->oh != NULL)
4609 edir->oh = ppc_follow_link (eind->oh);
4611 /* If called to transfer flags for a weakdef during processing
4612 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4613 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
4614 if (!(ELIMINATE_COPY_RELOCS
4615 && eind->elf.root.type != bfd_link_hash_indirect
4616 && edir->elf.dynamic_adjusted))
4617 edir->elf.non_got_ref |= eind->elf.non_got_ref;
4619 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4620 edir->elf.ref_regular |= eind->elf.ref_regular;
4621 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4622 edir->elf.needs_plt |= eind->elf.needs_plt;
4623 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
4625 /* Copy over any dynamic relocs we may have on the indirect sym. */
4626 if (eind->dyn_relocs != NULL)
4628 if (edir->dyn_relocs != NULL)
4630 struct elf_dyn_relocs **pp;
4631 struct elf_dyn_relocs *p;
4633 /* Add reloc counts against the indirect sym to the direct sym
4634 list. Merge any entries against the same section. */
4635 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4637 struct elf_dyn_relocs *q;
4639 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4640 if (q->sec == p->sec)
4642 q->pc_count += p->pc_count;
4643 q->count += p->count;
4650 *pp = edir->dyn_relocs;
4653 edir->dyn_relocs = eind->dyn_relocs;
4654 eind->dyn_relocs = NULL;
4657 /* If we were called to copy over info for a weak sym, that's all.
4658 You might think dyn_relocs need not be copied over; After all,
4659 both syms will be dynamic or both non-dynamic so we're just
4660 moving reloc accounting around. However, ELIMINATE_COPY_RELOCS
4661 code in ppc64_elf_adjust_dynamic_symbol needs to check for
4662 dyn_relocs in read-only sections, and it does so on what is the
4664 if (eind->elf.root.type != bfd_link_hash_indirect)
4667 /* Copy over got entries that we may have already seen to the
4668 symbol which just became indirect. */
4669 if (eind->elf.got.glist != NULL)
4671 if (edir->elf.got.glist != NULL)
4673 struct got_entry **entp;
4674 struct got_entry *ent;
4676 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4678 struct got_entry *dent;
4680 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4681 if (dent->addend == ent->addend
4682 && dent->owner == ent->owner
4683 && dent->tls_type == ent->tls_type)
4685 dent->got.refcount += ent->got.refcount;
4692 *entp = edir->elf.got.glist;
4695 edir->elf.got.glist = eind->elf.got.glist;
4696 eind->elf.got.glist = NULL;
4699 /* And plt entries. */
4700 move_plt_plist (eind, edir);
4702 if (eind->elf.dynindx != -1)
4704 if (edir->elf.dynindx != -1)
4705 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4706 edir->elf.dynstr_index);
4707 edir->elf.dynindx = eind->elf.dynindx;
4708 edir->elf.dynstr_index = eind->elf.dynstr_index;
4709 eind->elf.dynindx = -1;
4710 eind->elf.dynstr_index = 0;
4714 /* Find the function descriptor hash entry from the given function code
4715 hash entry FH. Link the entries via their OH fields. */
4717 static struct ppc_link_hash_entry *
4718 lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4720 struct ppc_link_hash_entry *fdh = fh->oh;
4724 const char *fd_name = fh->elf.root.root.string + 1;
4726 fdh = (struct ppc_link_hash_entry *)
4727 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4731 fdh->is_func_descriptor = 1;
4737 return ppc_follow_link (fdh);
4740 /* Make a fake function descriptor sym for the code sym FH. */
4742 static struct ppc_link_hash_entry *
4743 make_fdh (struct bfd_link_info *info,
4744 struct ppc_link_hash_entry *fh)
4748 struct bfd_link_hash_entry *bh;
4749 struct ppc_link_hash_entry *fdh;
4751 abfd = fh->elf.root.u.undef.abfd;
4752 newsym = bfd_make_empty_symbol (abfd);
4753 newsym->name = fh->elf.root.root.string + 1;
4754 newsym->section = bfd_und_section_ptr;
4756 newsym->flags = BSF_WEAK;
4759 if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
4760 newsym->flags, newsym->section,
4761 newsym->value, NULL, FALSE, FALSE,
4765 fdh = (struct ppc_link_hash_entry *) bh;
4766 fdh->elf.non_elf = 0;
4768 fdh->is_func_descriptor = 1;
4775 /* Fix function descriptor symbols defined in .opd sections to be
4779 ppc64_elf_add_symbol_hook (bfd *ibfd,
4780 struct bfd_link_info *info,
4781 Elf_Internal_Sym *isym,
4783 flagword *flags ATTRIBUTE_UNUSED,
4785 bfd_vma *value ATTRIBUTE_UNUSED)
4787 if ((ibfd->flags & DYNAMIC) == 0
4788 && ELF_ST_BIND (isym->st_info) == STB_GNU_UNIQUE)
4789 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4791 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4793 if ((ibfd->flags & DYNAMIC) == 0)
4794 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4796 else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC)
4798 else if (*sec != NULL
4799 && strcmp ((*sec)->name, ".opd") == 0)
4800 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4802 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4804 if (abiversion (ibfd) == 0)
4805 set_abiversion (ibfd, 2);
4806 else if (abiversion (ibfd) == 1)
4808 info->callbacks->einfo (_("%P: symbol '%s' has invalid st_other"
4809 " for ABI version 1\n"), name);
4810 bfd_set_error (bfd_error_bad_value);
4818 /* Merge non-visibility st_other attributes: local entry point. */
4821 ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4822 const Elf_Internal_Sym *isym,
4823 bfd_boolean definition,
4824 bfd_boolean dynamic)
4826 if (definition && !dynamic)
4827 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4828 | ELF_ST_VISIBILITY (h->other));
4831 /* This function makes an old ABI object reference to ".bar" cause the
4832 inclusion of a new ABI object archive that defines "bar".
4833 NAME is a symbol defined in an archive. Return a symbol in the hash
4834 table that might be satisfied by the archive symbols. */
4836 static struct elf_link_hash_entry *
4837 ppc64_elf_archive_symbol_lookup (bfd *abfd,
4838 struct bfd_link_info *info,
4841 struct elf_link_hash_entry *h;
4845 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
4847 /* Don't return this sym if it is a fake function descriptor
4848 created by add_symbol_adjust. */
4849 && !(h->root.type == bfd_link_hash_undefweak
4850 && ((struct ppc_link_hash_entry *) h)->fake))
4856 len = strlen (name);
4857 dot_name = bfd_alloc (abfd, len + 2);
4858 if (dot_name == NULL)
4859 return (struct elf_link_hash_entry *) 0 - 1;
4861 memcpy (dot_name + 1, name, len + 1);
4862 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4863 bfd_release (abfd, dot_name);
4867 /* This function satisfies all old ABI object references to ".bar" if a
4868 new ABI object defines "bar". Well, at least, undefined dot symbols
4869 are made weak. This stops later archive searches from including an
4870 object if we already have a function descriptor definition. It also
4871 prevents the linker complaining about undefined symbols.
4872 We also check and correct mismatched symbol visibility here. The
4873 most restrictive visibility of the function descriptor and the
4874 function entry symbol is used. */
4877 add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
4879 struct ppc_link_hash_table *htab;
4880 struct ppc_link_hash_entry *fdh;
4882 if (eh->elf.root.type == bfd_link_hash_indirect)
4885 if (eh->elf.root.type == bfd_link_hash_warning)
4886 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
4888 if (eh->elf.root.root.string[0] != '.')
4891 htab = ppc_hash_table (info);
4895 fdh = lookup_fdh (eh, htab);
4898 if (!info->relocatable
4899 && (eh->elf.root.type == bfd_link_hash_undefined
4900 || eh->elf.root.type == bfd_link_hash_undefweak)
4901 && eh->elf.ref_regular)
4903 /* Make an undefweak function descriptor sym, which is enough to
4904 pull in an --as-needed shared lib, but won't cause link
4905 errors. Archives are handled elsewhere. */
4906 fdh = make_fdh (info, eh);
4909 fdh->elf.ref_regular = 1;
4914 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4915 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4916 if (entry_vis < descr_vis)
4917 fdh->elf.other += entry_vis - descr_vis;
4918 else if (entry_vis > descr_vis)
4919 eh->elf.other += descr_vis - entry_vis;
4921 if ((fdh->elf.root.type == bfd_link_hash_defined
4922 || fdh->elf.root.type == bfd_link_hash_defweak)
4923 && eh->elf.root.type == bfd_link_hash_undefined)
4925 eh->elf.root.type = bfd_link_hash_undefweak;
4926 eh->was_undefined = 1;
4927 htab->twiddled_syms = 1;
4934 /* Process list of dot-symbols we made in link_hash_newfunc. */
4937 ppc64_elf_process_dot_syms (bfd *ibfd, struct bfd_link_info *info)
4939 struct ppc_link_hash_table *htab;
4940 struct ppc_link_hash_entry **p, *eh;
4942 if (!is_ppc64_elf (info->output_bfd))
4944 htab = ppc_hash_table (info);
4948 if (is_ppc64_elf (ibfd))
4950 p = &htab->dot_syms;
4951 while ((eh = *p) != NULL)
4954 if (&eh->elf == htab->elf.hgot)
4956 else if (htab->elf.hgot == NULL
4957 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4958 htab->elf.hgot = &eh->elf;
4959 else if (!add_symbol_adjust (eh, info))
4961 p = &eh->u.next_dot_sym;
4965 /* Clear the list for non-ppc64 input files. */
4966 p = &htab->dot_syms;
4967 while ((eh = *p) != NULL)
4970 p = &eh->u.next_dot_sym;
4973 /* We need to fix the undefs list for any syms we have twiddled to
4975 if (htab->twiddled_syms)
4977 bfd_link_repair_undef_list (&htab->elf.root);
4978 htab->twiddled_syms = 0;
4983 /* Undo hash table changes when an --as-needed input file is determined
4984 not to be needed. */
4987 ppc64_elf_notice_as_needed (bfd *ibfd,
4988 struct bfd_link_info *info,
4989 enum notice_asneeded_action act)
4991 if (act == notice_not_needed)
4993 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4998 htab->dot_syms = NULL;
5000 return _bfd_elf_notice_as_needed (ibfd, info, act);
5003 /* If --just-symbols against a final linked binary, then assume we need
5004 toc adjusting stubs when calling functions defined there. */
5007 ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
5009 if ((sec->flags & SEC_CODE) != 0
5010 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
5011 && is_ppc64_elf (sec->owner))
5013 if (abiversion (sec->owner) >= 2
5014 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
5015 sec->has_toc_reloc = 1;
5017 _bfd_elf_link_just_syms (sec, info);
5020 static struct plt_entry **
5021 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
5022 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
5024 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
5025 struct plt_entry **local_plt;
5026 unsigned char *local_got_tls_masks;
5028 if (local_got_ents == NULL)
5030 bfd_size_type size = symtab_hdr->sh_info;
5032 size *= (sizeof (*local_got_ents)
5033 + sizeof (*local_plt)
5034 + sizeof (*local_got_tls_masks));
5035 local_got_ents = bfd_zalloc (abfd, size);
5036 if (local_got_ents == NULL)
5038 elf_local_got_ents (abfd) = local_got_ents;
5041 if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
5043 struct got_entry *ent;
5045 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
5046 if (ent->addend == r_addend
5047 && ent->owner == abfd
5048 && ent->tls_type == tls_type)
5052 bfd_size_type amt = sizeof (*ent);
5053 ent = bfd_alloc (abfd, amt);
5056 ent->next = local_got_ents[r_symndx];
5057 ent->addend = r_addend;
5059 ent->tls_type = tls_type;
5060 ent->is_indirect = FALSE;
5061 ent->got.refcount = 0;
5062 local_got_ents[r_symndx] = ent;
5064 ent->got.refcount += 1;
5067 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
5068 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
5069 local_got_tls_masks[r_symndx] |= tls_type;
5071 return local_plt + r_symndx;
5075 update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
5077 struct plt_entry *ent;
5079 for (ent = *plist; ent != NULL; ent = ent->next)
5080 if (ent->addend == addend)
5084 bfd_size_type amt = sizeof (*ent);
5085 ent = bfd_alloc (abfd, amt);
5089 ent->addend = addend;
5090 ent->plt.refcount = 0;
5093 ent->plt.refcount += 1;
5098 is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5100 return (r_type == R_PPC64_REL24
5101 || r_type == R_PPC64_REL14
5102 || r_type == R_PPC64_REL14_BRTAKEN
5103 || r_type == R_PPC64_REL14_BRNTAKEN
5104 || r_type == R_PPC64_ADDR24
5105 || r_type == R_PPC64_ADDR14
5106 || r_type == R_PPC64_ADDR14_BRTAKEN
5107 || r_type == R_PPC64_ADDR14_BRNTAKEN);
5110 /* Look through the relocs for a section during the first phase, and
5111 calculate needed space in the global offset table, procedure
5112 linkage table, and dynamic reloc sections. */
5115 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5116 asection *sec, const Elf_Internal_Rela *relocs)
5118 struct ppc_link_hash_table *htab;
5119 Elf_Internal_Shdr *symtab_hdr;
5120 struct elf_link_hash_entry **sym_hashes;
5121 const Elf_Internal_Rela *rel;
5122 const Elf_Internal_Rela *rel_end;
5124 asection **opd_sym_map;
5125 struct elf_link_hash_entry *tga, *dottga;
5127 if (info->relocatable)
5130 /* Don't do anything special with non-loaded, non-alloced sections.
5131 In particular, any relocs in such sections should not affect GOT
5132 and PLT reference counting (ie. we don't allow them to create GOT
5133 or PLT entries), there's no possibility or desire to optimize TLS
5134 relocs, and there's not much point in propagating relocs to shared
5135 libs that the dynamic linker won't relocate. */
5136 if ((sec->flags & SEC_ALLOC) == 0)
5139 BFD_ASSERT (is_ppc64_elf (abfd));
5141 htab = ppc_hash_table (info);
5145 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5146 FALSE, FALSE, TRUE);
5147 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5148 FALSE, FALSE, TRUE);
5149 symtab_hdr = &elf_symtab_hdr (abfd);
5150 sym_hashes = elf_sym_hashes (abfd);
5153 if (strcmp (sec->name, ".opd") == 0)
5155 /* Garbage collection needs some extra help with .opd sections.
5156 We don't want to necessarily keep everything referenced by
5157 relocs in .opd, as that would keep all functions. Instead,
5158 if we reference an .opd symbol (a function descriptor), we
5159 want to keep the function code symbol's section. This is
5160 easy for global symbols, but for local syms we need to keep
5161 information about the associated function section. */
5164 if (abiversion (abfd) == 0)
5165 set_abiversion (abfd, 1);
5166 else if (abiversion (abfd) == 2)
5168 info->callbacks->einfo (_("%P: .opd not allowed in ABI version %d\n"),
5170 bfd_set_error (bfd_error_bad_value);
5173 amt = sec->size * sizeof (*opd_sym_map) / 8;
5174 opd_sym_map = bfd_zalloc (abfd, amt);
5175 if (opd_sym_map == NULL)
5177 ppc64_elf_section_data (sec)->u.opd.func_sec = opd_sym_map;
5178 BFD_ASSERT (ppc64_elf_section_data (sec)->sec_type == sec_normal);
5179 ppc64_elf_section_data (sec)->sec_type = sec_opd;
5182 rel_end = relocs + sec->reloc_count;
5183 for (rel = relocs; rel < rel_end; rel++)
5185 unsigned long r_symndx;
5186 struct elf_link_hash_entry *h;
5187 enum elf_ppc64_reloc_type r_type;
5189 struct _ppc64_elf_section_data *ppc64_sec;
5190 struct plt_entry **ifunc;
5192 r_symndx = ELF64_R_SYM (rel->r_info);
5193 if (r_symndx < symtab_hdr->sh_info)
5197 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5198 h = elf_follow_link (h);
5200 /* PR15323, ref flags aren't set for references in the same
5202 h->root.non_ir_ref = 1;
5204 if (h == htab->elf.hgot)
5205 sec->has_toc_reloc = 1;
5212 if (h->type == STT_GNU_IFUNC)
5215 ifunc = &h->plt.plist;
5220 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5225 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5227 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5228 rel->r_addend, PLT_IFUNC);
5233 r_type = ELF64_R_TYPE (rel->r_info);
5234 if (is_branch_reloc (r_type))
5236 if (h != NULL && (h == tga || h == dottga))
5239 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5240 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5241 /* We have a new-style __tls_get_addr call with a marker
5245 /* Mark this section as having an old-style call. */
5246 sec->has_tls_get_addr_call = 1;
5249 /* STT_GNU_IFUNC symbols must have a PLT entry. */
5251 && !update_plt_info (abfd, ifunc, rel->r_addend))
5259 /* These special tls relocs tie a call to __tls_get_addr with
5260 its parameter symbol. */
5263 case R_PPC64_GOT_TLSLD16:
5264 case R_PPC64_GOT_TLSLD16_LO:
5265 case R_PPC64_GOT_TLSLD16_HI:
5266 case R_PPC64_GOT_TLSLD16_HA:
5267 tls_type = TLS_TLS | TLS_LD;
5270 case R_PPC64_GOT_TLSGD16:
5271 case R_PPC64_GOT_TLSGD16_LO:
5272 case R_PPC64_GOT_TLSGD16_HI:
5273 case R_PPC64_GOT_TLSGD16_HA:
5274 tls_type = TLS_TLS | TLS_GD;
5277 case R_PPC64_GOT_TPREL16_DS:
5278 case R_PPC64_GOT_TPREL16_LO_DS:
5279 case R_PPC64_GOT_TPREL16_HI:
5280 case R_PPC64_GOT_TPREL16_HA:
5281 if (!info->executable)
5282 info->flags |= DF_STATIC_TLS;
5283 tls_type = TLS_TLS | TLS_TPREL;
5286 case R_PPC64_GOT_DTPREL16_DS:
5287 case R_PPC64_GOT_DTPREL16_LO_DS:
5288 case R_PPC64_GOT_DTPREL16_HI:
5289 case R_PPC64_GOT_DTPREL16_HA:
5290 tls_type = TLS_TLS | TLS_DTPREL;
5292 sec->has_tls_reloc = 1;
5296 case R_PPC64_GOT16_DS:
5297 case R_PPC64_GOT16_HA:
5298 case R_PPC64_GOT16_HI:
5299 case R_PPC64_GOT16_LO:
5300 case R_PPC64_GOT16_LO_DS:
5301 /* This symbol requires a global offset table entry. */
5302 sec->has_toc_reloc = 1;
5303 if (r_type == R_PPC64_GOT_TLSLD16
5304 || r_type == R_PPC64_GOT_TLSGD16
5305 || r_type == R_PPC64_GOT_TPREL16_DS
5306 || r_type == R_PPC64_GOT_DTPREL16_DS
5307 || r_type == R_PPC64_GOT16
5308 || r_type == R_PPC64_GOT16_DS)
5310 htab->do_multi_toc = 1;
5311 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5314 if (ppc64_elf_tdata (abfd)->got == NULL
5315 && !create_got_section (abfd, info))
5320 struct ppc_link_hash_entry *eh;
5321 struct got_entry *ent;
5323 eh = (struct ppc_link_hash_entry *) h;
5324 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5325 if (ent->addend == rel->r_addend
5326 && ent->owner == abfd
5327 && ent->tls_type == tls_type)
5331 bfd_size_type amt = sizeof (*ent);
5332 ent = bfd_alloc (abfd, amt);
5335 ent->next = eh->elf.got.glist;
5336 ent->addend = rel->r_addend;
5338 ent->tls_type = tls_type;
5339 ent->is_indirect = FALSE;
5340 ent->got.refcount = 0;
5341 eh->elf.got.glist = ent;
5343 ent->got.refcount += 1;
5344 eh->tls_mask |= tls_type;
5347 /* This is a global offset table entry for a local symbol. */
5348 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5349 rel->r_addend, tls_type))
5352 /* We may also need a plt entry if the symbol turns out to be
5354 if (h != NULL && !info->shared && abiversion (abfd) == 2)
5356 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5361 case R_PPC64_PLT16_HA:
5362 case R_PPC64_PLT16_HI:
5363 case R_PPC64_PLT16_LO:
5366 /* This symbol requires a procedure linkage table entry. We
5367 actually build the entry in adjust_dynamic_symbol,
5368 because this might be a case of linking PIC code without
5369 linking in any dynamic objects, in which case we don't
5370 need to generate a procedure linkage table after all. */
5373 /* It does not make sense to have a procedure linkage
5374 table entry for a local symbol. */
5375 bfd_set_error (bfd_error_bad_value);
5380 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5383 if (h->root.root.string[0] == '.'
5384 && h->root.root.string[1] != '\0')
5385 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5389 /* The following relocations don't need to propagate the
5390 relocation if linking a shared object since they are
5391 section relative. */
5392 case R_PPC64_SECTOFF:
5393 case R_PPC64_SECTOFF_LO:
5394 case R_PPC64_SECTOFF_HI:
5395 case R_PPC64_SECTOFF_HA:
5396 case R_PPC64_SECTOFF_DS:
5397 case R_PPC64_SECTOFF_LO_DS:
5398 case R_PPC64_DTPREL16:
5399 case R_PPC64_DTPREL16_LO:
5400 case R_PPC64_DTPREL16_HI:
5401 case R_PPC64_DTPREL16_HA:
5402 case R_PPC64_DTPREL16_DS:
5403 case R_PPC64_DTPREL16_LO_DS:
5404 case R_PPC64_DTPREL16_HIGH:
5405 case R_PPC64_DTPREL16_HIGHA:
5406 case R_PPC64_DTPREL16_HIGHER:
5407 case R_PPC64_DTPREL16_HIGHERA:
5408 case R_PPC64_DTPREL16_HIGHEST:
5409 case R_PPC64_DTPREL16_HIGHESTA:
5414 case R_PPC64_REL16_LO:
5415 case R_PPC64_REL16_HI:
5416 case R_PPC64_REL16_HA:
5419 /* Not supported as a dynamic relocation. */
5420 case R_PPC64_ADDR64_LOCAL:
5423 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5425 info->callbacks->einfo (_("%P: %H: %s reloc unsupported "
5426 "in shared libraries and PIEs.\n"),
5427 abfd, sec, rel->r_offset,
5428 ppc64_elf_howto_table[r_type]->name);
5429 bfd_set_error (bfd_error_bad_value);
5435 case R_PPC64_TOC16_DS:
5436 htab->do_multi_toc = 1;
5437 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5438 case R_PPC64_TOC16_LO:
5439 case R_PPC64_TOC16_HI:
5440 case R_PPC64_TOC16_HA:
5441 case R_PPC64_TOC16_LO_DS:
5442 sec->has_toc_reloc = 1;
5445 /* This relocation describes the C++ object vtable hierarchy.
5446 Reconstruct it for later use during GC. */
5447 case R_PPC64_GNU_VTINHERIT:
5448 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5452 /* This relocation describes which C++ vtable entries are actually
5453 used. Record for later use during GC. */
5454 case R_PPC64_GNU_VTENTRY:
5455 BFD_ASSERT (h != NULL);
5457 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5462 case R_PPC64_REL14_BRTAKEN:
5463 case R_PPC64_REL14_BRNTAKEN:
5465 asection *dest = NULL;
5467 /* Heuristic: If jumping outside our section, chances are
5468 we are going to need a stub. */
5471 /* If the sym is weak it may be overridden later, so
5472 don't assume we know where a weak sym lives. */
5473 if (h->root.type == bfd_link_hash_defined)
5474 dest = h->root.u.def.section;
5478 Elf_Internal_Sym *isym;
5480 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5485 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5489 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5494 if (h != NULL && ifunc == NULL)
5496 /* We may need a .plt entry if the function this reloc
5497 refers to is in a shared lib. */
5498 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5501 if (h->root.root.string[0] == '.'
5502 && h->root.root.string[1] != '\0')
5503 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5504 if (h == tga || h == dottga)
5505 sec->has_tls_reloc = 1;
5509 case R_PPC64_TPREL64:
5510 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5511 if (!info->executable)
5512 info->flags |= DF_STATIC_TLS;
5515 case R_PPC64_DTPMOD64:
5516 if (rel + 1 < rel_end
5517 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5518 && rel[1].r_offset == rel->r_offset + 8)
5519 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5521 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5524 case R_PPC64_DTPREL64:
5525 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5527 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5528 && rel[-1].r_offset == rel->r_offset - 8)
5529 /* This is the second reloc of a dtpmod, dtprel pair.
5530 Don't mark with TLS_DTPREL. */
5534 sec->has_tls_reloc = 1;
5537 struct ppc_link_hash_entry *eh;
5538 eh = (struct ppc_link_hash_entry *) h;
5539 eh->tls_mask |= tls_type;
5542 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5543 rel->r_addend, tls_type))
5546 ppc64_sec = ppc64_elf_section_data (sec);
5547 if (ppc64_sec->sec_type != sec_toc)
5551 /* One extra to simplify get_tls_mask. */
5552 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5553 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5554 if (ppc64_sec->u.toc.symndx == NULL)
5556 amt = sec->size * sizeof (bfd_vma) / 8;
5557 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5558 if (ppc64_sec->u.toc.add == NULL)
5560 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5561 ppc64_sec->sec_type = sec_toc;
5563 BFD_ASSERT (rel->r_offset % 8 == 0);
5564 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5565 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5567 /* Mark the second slot of a GD or LD entry.
5568 -1 to indicate GD and -2 to indicate LD. */
5569 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5570 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5571 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5572 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5575 case R_PPC64_TPREL16:
5576 case R_PPC64_TPREL16_LO:
5577 case R_PPC64_TPREL16_HI:
5578 case R_PPC64_TPREL16_HA:
5579 case R_PPC64_TPREL16_DS:
5580 case R_PPC64_TPREL16_LO_DS:
5581 case R_PPC64_TPREL16_HIGH:
5582 case R_PPC64_TPREL16_HIGHA:
5583 case R_PPC64_TPREL16_HIGHER:
5584 case R_PPC64_TPREL16_HIGHERA:
5585 case R_PPC64_TPREL16_HIGHEST:
5586 case R_PPC64_TPREL16_HIGHESTA:
5589 if (!info->executable)
5590 info->flags |= DF_STATIC_TLS;
5595 case R_PPC64_ADDR64:
5596 if (opd_sym_map != NULL
5597 && rel + 1 < rel_end
5598 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5602 if (h->root.root.string[0] == '.'
5603 && h->root.root.string[1] != 0
5604 && lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
5607 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5612 Elf_Internal_Sym *isym;
5614 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5619 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5620 if (s != NULL && s != sec)
5621 opd_sym_map[rel->r_offset / 8] = s;
5626 case R_PPC64_ADDR16:
5627 case R_PPC64_ADDR16_DS:
5628 case R_PPC64_ADDR16_HA:
5629 case R_PPC64_ADDR16_HI:
5630 case R_PPC64_ADDR16_HIGH:
5631 case R_PPC64_ADDR16_HIGHA:
5632 case R_PPC64_ADDR16_HIGHER:
5633 case R_PPC64_ADDR16_HIGHERA:
5634 case R_PPC64_ADDR16_HIGHEST:
5635 case R_PPC64_ADDR16_HIGHESTA:
5636 case R_PPC64_ADDR16_LO:
5637 case R_PPC64_ADDR16_LO_DS:
5638 if (h != NULL && !info->shared && abiversion (abfd) == 2
5639 && rel->r_addend == 0)
5641 /* We may need a .plt entry if this reloc refers to a
5642 function in a shared lib. */
5643 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5645 h->pointer_equality_needed = 1;
5652 case R_PPC64_ADDR14:
5653 case R_PPC64_ADDR14_BRNTAKEN:
5654 case R_PPC64_ADDR14_BRTAKEN:
5655 case R_PPC64_ADDR24:
5656 case R_PPC64_ADDR32:
5657 case R_PPC64_UADDR16:
5658 case R_PPC64_UADDR32:
5659 case R_PPC64_UADDR64:
5661 if (h != NULL && !info->shared)
5662 /* We may need a copy reloc. */
5665 /* Don't propagate .opd relocs. */
5666 if (NO_OPD_RELOCS && opd_sym_map != NULL)
5669 /* If we are creating a shared library, and this is a reloc
5670 against a global symbol, or a non PC relative reloc
5671 against a local symbol, then we need to copy the reloc
5672 into the shared library. However, if we are linking with
5673 -Bsymbolic, we do not need to copy a reloc against a
5674 global symbol which is defined in an object we are
5675 including in the link (i.e., DEF_REGULAR is set). At
5676 this point we have not seen all the input files, so it is
5677 possible that DEF_REGULAR is not set now but will be set
5678 later (it is never cleared). In case of a weak definition,
5679 DEF_REGULAR may be cleared later by a strong definition in
5680 a shared library. We account for that possibility below by
5681 storing information in the dyn_relocs field of the hash
5682 table entry. A similar situation occurs when creating
5683 shared libraries and symbol visibility changes render the
5686 If on the other hand, we are creating an executable, we
5687 may need to keep relocations for symbols satisfied by a
5688 dynamic library if we manage to avoid copy relocs for the
5692 && (must_be_dyn_reloc (info, r_type)
5694 && (!SYMBOLIC_BIND (info, h)
5695 || h->root.type == bfd_link_hash_defweak
5696 || !h->def_regular))))
5697 || (ELIMINATE_COPY_RELOCS
5700 && (h->root.type == bfd_link_hash_defweak
5701 || !h->def_regular))
5705 /* We must copy these reloc types into the output file.
5706 Create a reloc section in dynobj and make room for
5710 sreloc = _bfd_elf_make_dynamic_reloc_section
5711 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
5717 /* If this is a global symbol, we count the number of
5718 relocations we need for this symbol. */
5721 struct elf_dyn_relocs *p;
5722 struct elf_dyn_relocs **head;
5724 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
5726 if (p == NULL || p->sec != sec)
5728 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5738 if (!must_be_dyn_reloc (info, r_type))
5743 /* Track dynamic relocs needed for local syms too.
5744 We really need local syms available to do this
5746 struct ppc_dyn_relocs *p;
5747 struct ppc_dyn_relocs **head;
5748 bfd_boolean is_ifunc;
5751 Elf_Internal_Sym *isym;
5753 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5758 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5762 vpp = &elf_section_data (s)->local_dynrel;
5763 head = (struct ppc_dyn_relocs **) vpp;
5764 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5766 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5768 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5770 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5776 p->ifunc = is_ifunc;
5792 /* Merge backend specific data from an object file to the output
5793 object file when linking. */
5796 ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
5798 unsigned long iflags, oflags;
5800 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5803 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5806 if (!_bfd_generic_verify_endian_match (ibfd, obfd))
5809 iflags = elf_elfheader (ibfd)->e_flags;
5810 oflags = elf_elfheader (obfd)->e_flags;
5812 if (!elf_flags_init (obfd) || oflags == 0)
5814 elf_flags_init (obfd) = TRUE;
5815 elf_elfheader (obfd)->e_flags = iflags;
5817 else if (iflags == oflags || iflags == 0)
5819 else if (iflags & ~EF_PPC64_ABI)
5821 (*_bfd_error_handler)
5822 (_("%B uses unknown e_flags 0x%lx"), ibfd, iflags);
5823 bfd_set_error (bfd_error_bad_value);
5828 (*_bfd_error_handler)
5829 (_("%B: ABI version %ld is not compatible with ABI version %ld output"),
5830 ibfd, iflags, oflags);
5831 bfd_set_error (bfd_error_bad_value);
5835 /* Merge Tag_compatibility attributes and any common GNU ones. */
5836 _bfd_elf_merge_object_attributes (ibfd, obfd);
5842 ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5844 /* Print normal ELF private data. */
5845 _bfd_elf_print_private_bfd_data (abfd, ptr);
5847 if (elf_elfheader (abfd)->e_flags != 0)
5851 /* xgettext:c-format */
5852 fprintf (file, _("private flags = 0x%lx:"),
5853 elf_elfheader (abfd)->e_flags);
5855 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5856 fprintf (file, _(" [abiv%ld]"),
5857 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5864 /* OFFSET in OPD_SEC specifies a function descriptor. Return the address
5865 of the code entry point, and its section. */
5868 opd_entry_value (asection *opd_sec,
5870 asection **code_sec,
5872 bfd_boolean in_code_sec)
5874 bfd *opd_bfd = opd_sec->owner;
5875 Elf_Internal_Rela *relocs;
5876 Elf_Internal_Rela *lo, *hi, *look;
5879 /* No relocs implies we are linking a --just-symbols object, or looking
5880 at a final linked executable with addr2line or somesuch. */
5881 if (opd_sec->reloc_count == 0)
5883 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
5885 if (contents == NULL)
5887 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5888 return (bfd_vma) -1;
5889 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5892 val = bfd_get_64 (opd_bfd, contents + offset);
5893 if (code_sec != NULL)
5895 asection *sec, *likely = NULL;
5901 && val < sec->vma + sec->size)
5907 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5909 && (sec->flags & SEC_LOAD) != 0
5910 && (sec->flags & SEC_ALLOC) != 0)
5915 if (code_off != NULL)
5916 *code_off = val - likely->vma;
5922 BFD_ASSERT (is_ppc64_elf (opd_bfd));
5924 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
5926 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
5928 /* Go find the opd reloc at the sym address. */
5930 BFD_ASSERT (lo != NULL);
5931 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
5935 look = lo + (hi - lo) / 2;
5936 if (look->r_offset < offset)
5938 else if (look->r_offset > offset)
5942 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5944 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5945 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5947 unsigned long symndx = ELF64_R_SYM (look->r_info);
5950 if (symndx < symtab_hdr->sh_info
5951 || elf_sym_hashes (opd_bfd) == NULL)
5953 Elf_Internal_Sym *sym;
5955 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5958 size_t symcnt = symtab_hdr->sh_info;
5959 if (elf_sym_hashes (opd_bfd) == NULL)
5960 symcnt = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
5961 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, symcnt,
5962 0, NULL, NULL, NULL);
5965 symtab_hdr->contents = (bfd_byte *) sym;
5969 val = sym->st_value;
5970 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5971 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5975 struct elf_link_hash_entry **sym_hashes;
5976 struct elf_link_hash_entry *rh;
5978 sym_hashes = elf_sym_hashes (opd_bfd);
5979 rh = sym_hashes[symndx - symtab_hdr->sh_info];
5982 rh = elf_follow_link (rh);
5983 BFD_ASSERT (rh->root.type == bfd_link_hash_defined
5984 || rh->root.type == bfd_link_hash_defweak);
5985 val = rh->root.u.def.value;
5986 sec = rh->root.u.def.section;
5990 /* Handle the odd case where we can be called
5991 during bfd_elf_link_add_symbols before the
5992 symbol hashes have been fully populated. */
5993 Elf_Internal_Sym *sym;
5995 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, 1,
5996 symndx, NULL, NULL, NULL);
6000 val = sym->st_value;
6001 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
6005 val += look->r_addend;
6006 if (code_off != NULL)
6008 if (code_sec != NULL)
6010 if (in_code_sec && *code_sec != sec)
6015 if (sec != NULL && sec->output_section != NULL)
6016 val += sec->output_section->vma + sec->output_offset;
6025 /* If the ELF symbol SYM might be a function in SEC, return the
6026 function size and set *CODE_OFF to the function's entry point,
6027 otherwise return zero. */
6029 static bfd_size_type
6030 ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
6035 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
6036 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
6040 if (!(sym->flags & BSF_SYNTHETIC))
6041 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
6043 if (strcmp (sym->section->name, ".opd") == 0)
6045 if (opd_entry_value (sym->section, sym->value,
6046 &sec, code_off, TRUE) == (bfd_vma) -1)
6048 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6049 symbol. This size has nothing to do with the code size of the
6050 function, which is what we're supposed to return, but the
6051 code size isn't available without looking up the dot-sym.
6052 However, doing that would be a waste of time particularly
6053 since elf_find_function will look at the dot-sym anyway.
6054 Now, elf_find_function will keep the largest size of any
6055 function sym found at the code address of interest, so return
6056 1 here to avoid it incorrectly caching a larger function size
6057 for a small function. This does mean we return the wrong
6058 size for a new-ABI function of size 24, but all that does is
6059 disable caching for such functions. */
6065 if (sym->section != sec)
6067 *code_off = sym->value;
6074 /* Return true if symbol is defined in a regular object file. */
6077 is_static_defined (struct elf_link_hash_entry *h)
6079 return ((h->root.type == bfd_link_hash_defined
6080 || h->root.type == bfd_link_hash_defweak)
6081 && h->root.u.def.section != NULL
6082 && h->root.u.def.section->output_section != NULL);
6085 /* If FDH is a function descriptor symbol, return the associated code
6086 entry symbol if it is defined. Return NULL otherwise. */
6088 static struct ppc_link_hash_entry *
6089 defined_code_entry (struct ppc_link_hash_entry *fdh)
6091 if (fdh->is_func_descriptor)
6093 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6094 if (fh->elf.root.type == bfd_link_hash_defined
6095 || fh->elf.root.type == bfd_link_hash_defweak)
6101 /* If FH is a function code entry symbol, return the associated
6102 function descriptor symbol if it is defined. Return NULL otherwise. */
6104 static struct ppc_link_hash_entry *
6105 defined_func_desc (struct ppc_link_hash_entry *fh)
6108 && fh->oh->is_func_descriptor)
6110 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6111 if (fdh->elf.root.type == bfd_link_hash_defined
6112 || fdh->elf.root.type == bfd_link_hash_defweak)
6118 /* Mark all our entry sym sections, both opd and code section. */
6121 ppc64_elf_gc_keep (struct bfd_link_info *info)
6123 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6124 struct bfd_sym_chain *sym;
6129 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6131 struct ppc_link_hash_entry *eh, *fh;
6134 eh = (struct ppc_link_hash_entry *)
6135 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
6138 if (eh->elf.root.type != bfd_link_hash_defined
6139 && eh->elf.root.type != bfd_link_hash_defweak)
6142 fh = defined_code_entry (eh);
6145 sec = fh->elf.root.u.def.section;
6146 sec->flags |= SEC_KEEP;
6148 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6149 && opd_entry_value (eh->elf.root.u.def.section,
6150 eh->elf.root.u.def.value,
6151 &sec, NULL, FALSE) != (bfd_vma) -1)
6152 sec->flags |= SEC_KEEP;
6154 sec = eh->elf.root.u.def.section;
6155 sec->flags |= SEC_KEEP;
6159 /* Mark sections containing dynamically referenced symbols. When
6160 building shared libraries, we must assume that any visible symbol is
6164 ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6166 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6167 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
6168 struct ppc_link_hash_entry *fdh;
6169 struct bfd_elf_dynamic_list *d = info->dynamic_list;
6171 /* Dynamic linking info is on the func descriptor sym. */
6172 fdh = defined_func_desc (eh);
6176 if ((eh->elf.root.type == bfd_link_hash_defined
6177 || eh->elf.root.type == bfd_link_hash_defweak)
6178 && (eh->elf.ref_dynamic
6179 || (eh->elf.def_regular
6180 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
6181 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
6182 && (!info->executable
6183 || info->export_dynamic
6186 && (*d->match) (&d->head, NULL, eh->elf.root.root.string)))
6187 && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
6188 || !bfd_hide_sym_by_version (info->version_info,
6189 eh->elf.root.root.string)))))
6192 struct ppc_link_hash_entry *fh;
6194 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6196 /* Function descriptor syms cause the associated
6197 function code sym section to be marked. */
6198 fh = defined_code_entry (eh);
6201 code_sec = fh->elf.root.u.def.section;
6202 code_sec->flags |= SEC_KEEP;
6204 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6205 && opd_entry_value (eh->elf.root.u.def.section,
6206 eh->elf.root.u.def.value,
6207 &code_sec, NULL, FALSE) != (bfd_vma) -1)
6208 code_sec->flags |= SEC_KEEP;
6214 /* Return the section that should be marked against GC for a given
6218 ppc64_elf_gc_mark_hook (asection *sec,
6219 struct bfd_link_info *info,
6220 Elf_Internal_Rela *rel,
6221 struct elf_link_hash_entry *h,
6222 Elf_Internal_Sym *sym)
6226 /* Syms return NULL if we're marking .opd, so we avoid marking all
6227 function sections, as all functions are referenced in .opd. */
6229 if (get_opd_info (sec) != NULL)
6234 enum elf_ppc64_reloc_type r_type;
6235 struct ppc_link_hash_entry *eh, *fh, *fdh;
6237 r_type = ELF64_R_TYPE (rel->r_info);
6240 case R_PPC64_GNU_VTINHERIT:
6241 case R_PPC64_GNU_VTENTRY:
6245 switch (h->root.type)
6247 case bfd_link_hash_defined:
6248 case bfd_link_hash_defweak:
6249 eh = (struct ppc_link_hash_entry *) h;
6250 fdh = defined_func_desc (eh);
6254 /* Function descriptor syms cause the associated
6255 function code sym section to be marked. */
6256 fh = defined_code_entry (eh);
6259 /* They also mark their opd section. */
6260 eh->elf.root.u.def.section->gc_mark = 1;
6262 rsec = fh->elf.root.u.def.section;
6264 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6265 && opd_entry_value (eh->elf.root.u.def.section,
6266 eh->elf.root.u.def.value,
6267 &rsec, NULL, FALSE) != (bfd_vma) -1)
6268 eh->elf.root.u.def.section->gc_mark = 1;
6270 rsec = h->root.u.def.section;
6273 case bfd_link_hash_common:
6274 rsec = h->root.u.c.p->section;
6278 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6284 struct _opd_sec_data *opd;
6286 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6287 opd = get_opd_info (rsec);
6288 if (opd != NULL && opd->func_sec != NULL)
6292 rsec = opd->func_sec[(sym->st_value + rel->r_addend) / 8];
6299 /* Update the .got, .plt. and dynamic reloc reference counts for the
6300 section being removed. */
6303 ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
6304 asection *sec, const Elf_Internal_Rela *relocs)
6306 struct ppc_link_hash_table *htab;
6307 Elf_Internal_Shdr *symtab_hdr;
6308 struct elf_link_hash_entry **sym_hashes;
6309 struct got_entry **local_got_ents;
6310 const Elf_Internal_Rela *rel, *relend;
6312 if (info->relocatable)
6315 if ((sec->flags & SEC_ALLOC) == 0)
6318 elf_section_data (sec)->local_dynrel = NULL;
6320 htab = ppc_hash_table (info);
6324 symtab_hdr = &elf_symtab_hdr (abfd);
6325 sym_hashes = elf_sym_hashes (abfd);
6326 local_got_ents = elf_local_got_ents (abfd);
6328 relend = relocs + sec->reloc_count;
6329 for (rel = relocs; rel < relend; rel++)
6331 unsigned long r_symndx;
6332 enum elf_ppc64_reloc_type r_type;
6333 struct elf_link_hash_entry *h = NULL;
6334 unsigned char tls_type = 0;
6336 r_symndx = ELF64_R_SYM (rel->r_info);
6337 r_type = ELF64_R_TYPE (rel->r_info);
6338 if (r_symndx >= symtab_hdr->sh_info)
6340 struct ppc_link_hash_entry *eh;
6341 struct elf_dyn_relocs **pp;
6342 struct elf_dyn_relocs *p;
6344 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6345 h = elf_follow_link (h);
6346 eh = (struct ppc_link_hash_entry *) h;
6348 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6351 /* Everything must go for SEC. */
6357 if (is_branch_reloc (r_type))
6359 struct plt_entry **ifunc = NULL;
6362 if (h->type == STT_GNU_IFUNC)
6363 ifunc = &h->plt.plist;
6365 else if (local_got_ents != NULL)
6367 struct plt_entry **local_plt = (struct plt_entry **)
6368 (local_got_ents + symtab_hdr->sh_info);
6369 unsigned char *local_got_tls_masks = (unsigned char *)
6370 (local_plt + symtab_hdr->sh_info);
6371 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
6372 ifunc = local_plt + r_symndx;
6376 struct plt_entry *ent;
6378 for (ent = *ifunc; ent != NULL; ent = ent->next)
6379 if (ent->addend == rel->r_addend)
6383 if (ent->plt.refcount > 0)
6384 ent->plt.refcount -= 1;
6391 case R_PPC64_GOT_TLSLD16:
6392 case R_PPC64_GOT_TLSLD16_LO:
6393 case R_PPC64_GOT_TLSLD16_HI:
6394 case R_PPC64_GOT_TLSLD16_HA:
6395 tls_type = TLS_TLS | TLS_LD;
6398 case R_PPC64_GOT_TLSGD16:
6399 case R_PPC64_GOT_TLSGD16_LO:
6400 case R_PPC64_GOT_TLSGD16_HI:
6401 case R_PPC64_GOT_TLSGD16_HA:
6402 tls_type = TLS_TLS | TLS_GD;
6405 case R_PPC64_GOT_TPREL16_DS:
6406 case R_PPC64_GOT_TPREL16_LO_DS:
6407 case R_PPC64_GOT_TPREL16_HI:
6408 case R_PPC64_GOT_TPREL16_HA:
6409 tls_type = TLS_TLS | TLS_TPREL;
6412 case R_PPC64_GOT_DTPREL16_DS:
6413 case R_PPC64_GOT_DTPREL16_LO_DS:
6414 case R_PPC64_GOT_DTPREL16_HI:
6415 case R_PPC64_GOT_DTPREL16_HA:
6416 tls_type = TLS_TLS | TLS_DTPREL;
6420 case R_PPC64_GOT16_DS:
6421 case R_PPC64_GOT16_HA:
6422 case R_PPC64_GOT16_HI:
6423 case R_PPC64_GOT16_LO:
6424 case R_PPC64_GOT16_LO_DS:
6427 struct got_entry *ent;
6432 ent = local_got_ents[r_symndx];
6434 for (; ent != NULL; ent = ent->next)
6435 if (ent->addend == rel->r_addend
6436 && ent->owner == abfd
6437 && ent->tls_type == tls_type)
6441 if (ent->got.refcount > 0)
6442 ent->got.refcount -= 1;
6446 case R_PPC64_PLT16_HA:
6447 case R_PPC64_PLT16_HI:
6448 case R_PPC64_PLT16_LO:
6452 case R_PPC64_REL14_BRNTAKEN:
6453 case R_PPC64_REL14_BRTAKEN:
6457 struct plt_entry *ent;
6459 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6460 if (ent->addend == rel->r_addend)
6462 if (ent != NULL && ent->plt.refcount > 0)
6463 ent->plt.refcount -= 1;
6474 /* The maximum size of .sfpr. */
6475 #define SFPR_MAX (218*4)
6477 struct sfpr_def_parms
6479 const char name[12];
6480 unsigned char lo, hi;
6481 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6482 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6485 /* Auto-generate _save*, _rest* functions in .sfpr. */
6488 sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
6490 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6492 size_t len = strlen (parm->name);
6493 bfd_boolean writing = FALSE;
6499 memcpy (sym, parm->name, len);
6502 for (i = parm->lo; i <= parm->hi; i++)
6504 struct elf_link_hash_entry *h;
6506 sym[len + 0] = i / 10 + '0';
6507 sym[len + 1] = i % 10 + '0';
6508 h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
6512 h->root.type = bfd_link_hash_defined;
6513 h->root.u.def.section = htab->sfpr;
6514 h->root.u.def.value = htab->sfpr->size;
6517 _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
6519 if (htab->sfpr->contents == NULL)
6521 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6522 if (htab->sfpr->contents == NULL)
6528 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6530 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6532 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6533 htab->sfpr->size = p - htab->sfpr->contents;
6541 savegpr0 (bfd *abfd, bfd_byte *p, int r)
6543 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6548 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6550 p = savegpr0 (abfd, p, r);
6551 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6553 bfd_put_32 (abfd, BLR, p);
6558 restgpr0 (bfd *abfd, bfd_byte *p, int r)
6560 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6565 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6567 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6569 p = restgpr0 (abfd, p, r);
6570 bfd_put_32 (abfd, MTLR_R0, p);
6574 p = restgpr0 (abfd, p, 30);
6575 p = restgpr0 (abfd, p, 31);
6577 bfd_put_32 (abfd, BLR, p);
6582 savegpr1 (bfd *abfd, bfd_byte *p, int r)
6584 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6589 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6591 p = savegpr1 (abfd, p, r);
6592 bfd_put_32 (abfd, BLR, p);
6597 restgpr1 (bfd *abfd, bfd_byte *p, int r)
6599 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6604 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6606 p = restgpr1 (abfd, p, r);
6607 bfd_put_32 (abfd, BLR, p);
6612 savefpr (bfd *abfd, bfd_byte *p, int r)
6614 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6619 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6621 p = savefpr (abfd, p, r);
6622 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6624 bfd_put_32 (abfd, BLR, p);
6629 restfpr (bfd *abfd, bfd_byte *p, int r)
6631 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6636 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6638 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6640 p = restfpr (abfd, p, r);
6641 bfd_put_32 (abfd, MTLR_R0, p);
6645 p = restfpr (abfd, p, 30);
6646 p = restfpr (abfd, p, 31);
6648 bfd_put_32 (abfd, BLR, p);
6653 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6655 p = savefpr (abfd, p, r);
6656 bfd_put_32 (abfd, BLR, p);
6661 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6663 p = restfpr (abfd, p, r);
6664 bfd_put_32 (abfd, BLR, p);
6669 savevr (bfd *abfd, bfd_byte *p, int r)
6671 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6673 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6678 savevr_tail (bfd *abfd, bfd_byte *p, int r)
6680 p = savevr (abfd, p, r);
6681 bfd_put_32 (abfd, BLR, p);
6686 restvr (bfd *abfd, bfd_byte *p, int r)
6688 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6690 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6695 restvr_tail (bfd *abfd, bfd_byte *p, int r)
6697 p = restvr (abfd, p, r);
6698 bfd_put_32 (abfd, BLR, p);
6702 /* Called via elf_link_hash_traverse to transfer dynamic linking
6703 information on function code symbol entries to their corresponding
6704 function descriptor symbol entries. */
6707 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6709 struct bfd_link_info *info;
6710 struct ppc_link_hash_table *htab;
6711 struct plt_entry *ent;
6712 struct ppc_link_hash_entry *fh;
6713 struct ppc_link_hash_entry *fdh;
6714 bfd_boolean force_local;
6716 fh = (struct ppc_link_hash_entry *) h;
6717 if (fh->elf.root.type == bfd_link_hash_indirect)
6721 htab = ppc_hash_table (info);
6725 /* Resolve undefined references to dot-symbols as the value
6726 in the function descriptor, if we have one in a regular object.
6727 This is to satisfy cases like ".quad .foo". Calls to functions
6728 in dynamic objects are handled elsewhere. */
6729 if (fh->elf.root.type == bfd_link_hash_undefweak
6730 && fh->was_undefined
6731 && (fdh = defined_func_desc (fh)) != NULL
6732 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6733 && opd_entry_value (fdh->elf.root.u.def.section,
6734 fdh->elf.root.u.def.value,
6735 &fh->elf.root.u.def.section,
6736 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
6738 fh->elf.root.type = fdh->elf.root.type;
6739 fh->elf.forced_local = 1;
6740 fh->elf.def_regular = fdh->elf.def_regular;
6741 fh->elf.def_dynamic = fdh->elf.def_dynamic;
6744 /* If this is a function code symbol, transfer dynamic linking
6745 information to the function descriptor symbol. */
6749 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6750 if (ent->plt.refcount > 0)
6753 || fh->elf.root.root.string[0] != '.'
6754 || fh->elf.root.root.string[1] == '\0')
6757 /* Find the corresponding function descriptor symbol. Create it
6758 as undefined if necessary. */
6760 fdh = lookup_fdh (fh, htab);
6762 && !info->executable
6763 && (fh->elf.root.type == bfd_link_hash_undefined
6764 || fh->elf.root.type == bfd_link_hash_undefweak))
6766 fdh = make_fdh (info, fh);
6771 /* Fake function descriptors are made undefweak. If the function
6772 code symbol is strong undefined, make the fake sym the same.
6773 If the function code symbol is defined, then force the fake
6774 descriptor local; We can't support overriding of symbols in a
6775 shared library on a fake descriptor. */
6779 && fdh->elf.root.type == bfd_link_hash_undefweak)
6781 if (fh->elf.root.type == bfd_link_hash_undefined)
6783 fdh->elf.root.type = bfd_link_hash_undefined;
6784 bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
6786 else if (fh->elf.root.type == bfd_link_hash_defined
6787 || fh->elf.root.type == bfd_link_hash_defweak)
6789 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
6794 && !fdh->elf.forced_local
6795 && (!info->executable
6796 || fdh->elf.def_dynamic
6797 || fdh->elf.ref_dynamic
6798 || (fdh->elf.root.type == bfd_link_hash_undefweak
6799 && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
6801 if (fdh->elf.dynindx == -1)
6802 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6804 fdh->elf.ref_regular |= fh->elf.ref_regular;
6805 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6806 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6807 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
6808 if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
6810 move_plt_plist (fh, fdh);
6811 fdh->elf.needs_plt = 1;
6813 fdh->is_func_descriptor = 1;
6818 /* Now that the info is on the function descriptor, clear the
6819 function code sym info. Any function code syms for which we
6820 don't have a definition in a regular file, we force local.
6821 This prevents a shared library from exporting syms that have
6822 been imported from another library. Function code syms that
6823 are really in the library we must leave global to prevent the
6824 linker dragging in a definition from a static library. */
6825 force_local = (!fh->elf.def_regular
6827 || !fdh->elf.def_regular
6828 || fdh->elf.forced_local);
6829 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6834 /* Called near the start of bfd_elf_size_dynamic_sections. We use
6835 this hook to a) provide some gcc support functions, and b) transfer
6836 dynamic linking information gathered so far on function code symbol
6837 entries, to their corresponding function descriptor symbol entries. */
6840 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6841 struct bfd_link_info *info)
6843 struct ppc_link_hash_table *htab;
6845 static const struct sfpr_def_parms funcs[] =
6847 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6848 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6849 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6850 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6851 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6852 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6853 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6854 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6855 { "._savef", 14, 31, savefpr, savefpr1_tail },
6856 { "._restf", 14, 31, restfpr, restfpr1_tail },
6857 { "_savevr_", 20, 31, savevr, savevr_tail },
6858 { "_restvr_", 20, 31, restvr, restvr_tail }
6861 htab = ppc_hash_table (info);
6865 if (!info->relocatable
6866 && htab->elf.hgot != NULL)
6868 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
6869 /* Make .TOC. defined so as to prevent it being made dynamic.
6870 The wrong value here is fixed later in ppc64_elf_set_toc. */
6871 htab->elf.hgot->type = STT_OBJECT;
6872 htab->elf.hgot->root.type = bfd_link_hash_defined;
6873 htab->elf.hgot->root.u.def.value = 0;
6874 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
6875 htab->elf.hgot->def_regular = 1;
6876 htab->elf.hgot->other = ((htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1))
6880 if (htab->sfpr == NULL)
6881 /* We don't have any relocs. */
6884 /* Provide any missing _save* and _rest* functions. */
6885 htab->sfpr->size = 0;
6886 if (htab->params->save_restore_funcs)
6887 for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
6888 if (!sfpr_define (info, &funcs[i]))
6891 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6893 if (htab->sfpr->size == 0)
6894 htab->sfpr->flags |= SEC_EXCLUDE;
6899 /* Return true if we have dynamic relocs that apply to read-only sections. */
6902 readonly_dynrelocs (struct elf_link_hash_entry *h)
6904 struct ppc_link_hash_entry *eh;
6905 struct elf_dyn_relocs *p;
6907 eh = (struct ppc_link_hash_entry *) h;
6908 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6910 asection *s = p->sec->output_section;
6912 if (s != NULL && (s->flags & SEC_READONLY) != 0)
6918 /* Adjust a symbol defined by a dynamic object and referenced by a
6919 regular object. The current definition is in some section of the
6920 dynamic object, but we're not including those sections. We have to
6921 change the definition to something the rest of the link can
6925 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6926 struct elf_link_hash_entry *h)
6928 struct ppc_link_hash_table *htab;
6931 htab = ppc_hash_table (info);
6935 /* Deal with function syms. */
6936 if (h->type == STT_FUNC
6937 || h->type == STT_GNU_IFUNC
6940 /* Clear procedure linkage table information for any symbol that
6941 won't need a .plt entry. */
6942 struct plt_entry *ent;
6943 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6944 if (ent->plt.refcount > 0)
6947 || (h->type != STT_GNU_IFUNC
6948 && (SYMBOL_CALLS_LOCAL (info, h)
6949 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6950 && h->root.type == bfd_link_hash_undefweak))))
6952 h->plt.plist = NULL;
6955 else if (abiversion (info->output_bfd) == 2)
6957 /* After adjust_dynamic_symbol, non_got_ref set in the
6958 non-shared case means that we have allocated space in
6959 .dynbss for the symbol and thus dyn_relocs for this
6960 symbol should be discarded.
6961 If we get here we know we are making a PLT entry for this
6962 symbol, and in an executable we'd normally resolve
6963 relocations against this symbol to the PLT entry. Allow
6964 dynamic relocs if the reference is weak, and the dynamic
6965 relocs will not cause text relocation. */
6966 if (!h->ref_regular_nonweak
6968 && h->type != STT_GNU_IFUNC
6969 && !readonly_dynrelocs (h))
6972 /* If making a plt entry, then we don't need copy relocs. */
6977 h->plt.plist = NULL;
6979 /* If this is a weak symbol, and there is a real definition, the
6980 processor independent code will have arranged for us to see the
6981 real definition first, and we can just use the same value. */
6982 if (h->u.weakdef != NULL)
6984 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
6985 || h->u.weakdef->root.type == bfd_link_hash_defweak);
6986 h->root.u.def.section = h->u.weakdef->root.u.def.section;
6987 h->root.u.def.value = h->u.weakdef->root.u.def.value;
6988 if (ELIMINATE_COPY_RELOCS)
6989 h->non_got_ref = h->u.weakdef->non_got_ref;
6993 /* If we are creating a shared library, we must presume that the
6994 only references to the symbol are via the global offset table.
6995 For such cases we need not do anything here; the relocations will
6996 be handled correctly by relocate_section. */
7000 /* If there are no references to this symbol that do not use the
7001 GOT, we don't need to generate a copy reloc. */
7002 if (!h->non_got_ref)
7005 /* Don't generate a copy reloc for symbols defined in the executable. */
7006 if (!h->def_dynamic || !h->ref_regular || h->def_regular)
7009 /* If we didn't find any dynamic relocs in read-only sections, then
7010 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
7011 if (ELIMINATE_COPY_RELOCS && !readonly_dynrelocs (h))
7017 if (h->plt.plist != NULL)
7019 /* We should never get here, but unfortunately there are versions
7020 of gcc out there that improperly (for this ABI) put initialized
7021 function pointers, vtable refs and suchlike in read-only
7022 sections. Allow them to proceed, but warn that this might
7023 break at runtime. */
7024 info->callbacks->einfo
7025 (_("%P: copy reloc against `%T' requires lazy plt linking; "
7026 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
7027 h->root.root.string);
7030 /* This is a reference to a symbol defined by a dynamic object which
7031 is not a function. */
7033 /* We must allocate the symbol in our .dynbss section, which will
7034 become part of the .bss section of the executable. There will be
7035 an entry for this symbol in the .dynsym section. The dynamic
7036 object will contain position independent code, so all references
7037 from the dynamic object to this symbol will go through the global
7038 offset table. The dynamic linker will use the .dynsym entry to
7039 determine the address it must put in the global offset table, so
7040 both the dynamic object and the regular object will refer to the
7041 same memory location for the variable. */
7043 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
7044 to copy the initial value out of the dynamic object and into the
7045 runtime process image. We need to remember the offset into the
7046 .rela.bss section we are going to use. */
7047 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
7049 htab->relbss->size += sizeof (Elf64_External_Rela);
7055 return _bfd_elf_adjust_dynamic_copy (h, s);
7058 /* If given a function descriptor symbol, hide both the function code
7059 sym and the descriptor. */
7061 ppc64_elf_hide_symbol (struct bfd_link_info *info,
7062 struct elf_link_hash_entry *h,
7063 bfd_boolean force_local)
7065 struct ppc_link_hash_entry *eh;
7066 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
7068 eh = (struct ppc_link_hash_entry *) h;
7069 if (eh->is_func_descriptor)
7071 struct ppc_link_hash_entry *fh = eh->oh;
7076 struct ppc_link_hash_table *htab;
7079 /* We aren't supposed to use alloca in BFD because on
7080 systems which do not have alloca the version in libiberty
7081 calls xmalloc, which might cause the program to crash
7082 when it runs out of memory. This function doesn't have a
7083 return status, so there's no way to gracefully return an
7084 error. So cheat. We know that string[-1] can be safely
7085 accessed; It's either a string in an ELF string table,
7086 or allocated in an objalloc structure. */
7088 p = eh->elf.root.root.string - 1;
7091 htab = ppc_hash_table (info);
7095 fh = (struct ppc_link_hash_entry *)
7096 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
7099 /* Unfortunately, if it so happens that the string we were
7100 looking for was allocated immediately before this string,
7101 then we overwrote the string terminator. That's the only
7102 reason the lookup should fail. */
7105 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
7106 while (q >= eh->elf.root.root.string && *q == *p)
7108 if (q < eh->elf.root.root.string && *p == '.')
7109 fh = (struct ppc_link_hash_entry *)
7110 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
7119 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7124 get_sym_h (struct elf_link_hash_entry **hp,
7125 Elf_Internal_Sym **symp,
7127 unsigned char **tls_maskp,
7128 Elf_Internal_Sym **locsymsp,
7129 unsigned long r_symndx,
7132 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7134 if (r_symndx >= symtab_hdr->sh_info)
7136 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7137 struct elf_link_hash_entry *h;
7139 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7140 h = elf_follow_link (h);
7148 if (symsecp != NULL)
7150 asection *symsec = NULL;
7151 if (h->root.type == bfd_link_hash_defined
7152 || h->root.type == bfd_link_hash_defweak)
7153 symsec = h->root.u.def.section;
7157 if (tls_maskp != NULL)
7159 struct ppc_link_hash_entry *eh;
7161 eh = (struct ppc_link_hash_entry *) h;
7162 *tls_maskp = &eh->tls_mask;
7167 Elf_Internal_Sym *sym;
7168 Elf_Internal_Sym *locsyms = *locsymsp;
7170 if (locsyms == NULL)
7172 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7173 if (locsyms == NULL)
7174 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7175 symtab_hdr->sh_info,
7176 0, NULL, NULL, NULL);
7177 if (locsyms == NULL)
7179 *locsymsp = locsyms;
7181 sym = locsyms + r_symndx;
7189 if (symsecp != NULL)
7190 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
7192 if (tls_maskp != NULL)
7194 struct got_entry **lgot_ents;
7195 unsigned char *tls_mask;
7198 lgot_ents = elf_local_got_ents (ibfd);
7199 if (lgot_ents != NULL)
7201 struct plt_entry **local_plt = (struct plt_entry **)
7202 (lgot_ents + symtab_hdr->sh_info);
7203 unsigned char *lgot_masks = (unsigned char *)
7204 (local_plt + symtab_hdr->sh_info);
7205 tls_mask = &lgot_masks[r_symndx];
7207 *tls_maskp = tls_mask;
7213 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
7214 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
7215 type suitable for optimization, and 1 otherwise. */
7218 get_tls_mask (unsigned char **tls_maskp,
7219 unsigned long *toc_symndx,
7220 bfd_vma *toc_addend,
7221 Elf_Internal_Sym **locsymsp,
7222 const Elf_Internal_Rela *rel,
7225 unsigned long r_symndx;
7227 struct elf_link_hash_entry *h;
7228 Elf_Internal_Sym *sym;
7232 r_symndx = ELF64_R_SYM (rel->r_info);
7233 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7236 if ((*tls_maskp != NULL && **tls_maskp != 0)
7238 || ppc64_elf_section_data (sec) == NULL
7239 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
7242 /* Look inside a TOC section too. */
7245 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7246 off = h->root.u.def.value;
7249 off = sym->st_value;
7250 off += rel->r_addend;
7251 BFD_ASSERT (off % 8 == 0);
7252 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7253 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
7254 if (toc_symndx != NULL)
7255 *toc_symndx = r_symndx;
7256 if (toc_addend != NULL)
7257 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7258 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7260 if ((h == NULL || is_static_defined (h))
7261 && (next_r == -1 || next_r == -2))
7266 /* Find (or create) an entry in the tocsave hash table. */
7268 static struct tocsave_entry *
7269 tocsave_find (struct ppc_link_hash_table *htab,
7270 enum insert_option insert,
7271 Elf_Internal_Sym **local_syms,
7272 const Elf_Internal_Rela *irela,
7275 unsigned long r_indx;
7276 struct elf_link_hash_entry *h;
7277 Elf_Internal_Sym *sym;
7278 struct tocsave_entry ent, *p;
7280 struct tocsave_entry **slot;
7282 r_indx = ELF64_R_SYM (irela->r_info);
7283 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7285 if (ent.sec == NULL || ent.sec->output_section == NULL)
7287 (*_bfd_error_handler)
7288 (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
7293 ent.offset = h->root.u.def.value;
7295 ent.offset = sym->st_value;
7296 ent.offset += irela->r_addend;
7298 hash = tocsave_htab_hash (&ent);
7299 slot = ((struct tocsave_entry **)
7300 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7306 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7315 /* Adjust all global syms defined in opd sections. In gcc generated
7316 code for the old ABI, these will already have been done. */
7319 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7321 struct ppc_link_hash_entry *eh;
7323 struct _opd_sec_data *opd;
7325 if (h->root.type == bfd_link_hash_indirect)
7328 if (h->root.type != bfd_link_hash_defined
7329 && h->root.type != bfd_link_hash_defweak)
7332 eh = (struct ppc_link_hash_entry *) h;
7333 if (eh->adjust_done)
7336 sym_sec = eh->elf.root.u.def.section;
7337 opd = get_opd_info (sym_sec);
7338 if (opd != NULL && opd->adjust != NULL)
7340 long adjust = opd->adjust[eh->elf.root.u.def.value / 8];
7343 /* This entry has been deleted. */
7344 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
7347 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
7348 if (discarded_section (dsec))
7350 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
7354 eh->elf.root.u.def.value = 0;
7355 eh->elf.root.u.def.section = dsec;
7358 eh->elf.root.u.def.value += adjust;
7359 eh->adjust_done = 1;
7364 /* Handles decrementing dynamic reloc counts for the reloc specified by
7365 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
7366 have already been determined. */
7369 dec_dynrel_count (bfd_vma r_info,
7371 struct bfd_link_info *info,
7372 Elf_Internal_Sym **local_syms,
7373 struct elf_link_hash_entry *h,
7374 Elf_Internal_Sym *sym)
7376 enum elf_ppc64_reloc_type r_type;
7377 asection *sym_sec = NULL;
7379 /* Can this reloc be dynamic? This switch, and later tests here
7380 should be kept in sync with the code in check_relocs. */
7381 r_type = ELF64_R_TYPE (r_info);
7387 case R_PPC64_TPREL16:
7388 case R_PPC64_TPREL16_LO:
7389 case R_PPC64_TPREL16_HI:
7390 case R_PPC64_TPREL16_HA:
7391 case R_PPC64_TPREL16_DS:
7392 case R_PPC64_TPREL16_LO_DS:
7393 case R_PPC64_TPREL16_HIGH:
7394 case R_PPC64_TPREL16_HIGHA:
7395 case R_PPC64_TPREL16_HIGHER:
7396 case R_PPC64_TPREL16_HIGHERA:
7397 case R_PPC64_TPREL16_HIGHEST:
7398 case R_PPC64_TPREL16_HIGHESTA:
7402 case R_PPC64_TPREL64:
7403 case R_PPC64_DTPMOD64:
7404 case R_PPC64_DTPREL64:
7405 case R_PPC64_ADDR64:
7409 case R_PPC64_ADDR14:
7410 case R_PPC64_ADDR14_BRNTAKEN:
7411 case R_PPC64_ADDR14_BRTAKEN:
7412 case R_PPC64_ADDR16:
7413 case R_PPC64_ADDR16_DS:
7414 case R_PPC64_ADDR16_HA:
7415 case R_PPC64_ADDR16_HI:
7416 case R_PPC64_ADDR16_HIGH:
7417 case R_PPC64_ADDR16_HIGHA:
7418 case R_PPC64_ADDR16_HIGHER:
7419 case R_PPC64_ADDR16_HIGHERA:
7420 case R_PPC64_ADDR16_HIGHEST:
7421 case R_PPC64_ADDR16_HIGHESTA:
7422 case R_PPC64_ADDR16_LO:
7423 case R_PPC64_ADDR16_LO_DS:
7424 case R_PPC64_ADDR24:
7425 case R_PPC64_ADDR32:
7426 case R_PPC64_UADDR16:
7427 case R_PPC64_UADDR32:
7428 case R_PPC64_UADDR64:
7433 if (local_syms != NULL)
7435 unsigned long r_symndx;
7436 bfd *ibfd = sec->owner;
7438 r_symndx = ELF64_R_SYM (r_info);
7439 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7444 && (must_be_dyn_reloc (info, r_type)
7446 && (!SYMBOLIC_BIND (info, h)
7447 || h->root.type == bfd_link_hash_defweak
7448 || !h->def_regular))))
7449 || (ELIMINATE_COPY_RELOCS
7452 && (h->root.type == bfd_link_hash_defweak
7453 || !h->def_regular)))
7460 struct elf_dyn_relocs *p;
7461 struct elf_dyn_relocs **pp;
7462 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7464 /* elf_gc_sweep may have already removed all dyn relocs associated
7465 with local syms for a given section. Also, symbol flags are
7466 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7467 report a dynreloc miscount. */
7468 if (*pp == NULL && info->gc_sections)
7471 while ((p = *pp) != NULL)
7475 if (!must_be_dyn_reloc (info, r_type))
7487 struct ppc_dyn_relocs *p;
7488 struct ppc_dyn_relocs **pp;
7490 bfd_boolean is_ifunc;
7492 if (local_syms == NULL)
7493 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7494 if (sym_sec == NULL)
7497 vpp = &elf_section_data (sym_sec)->local_dynrel;
7498 pp = (struct ppc_dyn_relocs **) vpp;
7500 if (*pp == NULL && info->gc_sections)
7503 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7504 while ((p = *pp) != NULL)
7506 if (p->sec == sec && p->ifunc == is_ifunc)
7517 info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
7519 bfd_set_error (bfd_error_bad_value);
7523 /* Remove unused Official Procedure Descriptor entries. Currently we
7524 only remove those associated with functions in discarded link-once
7525 sections, or weakly defined functions that have been overridden. It
7526 would be possible to remove many more entries for statically linked
7530 ppc64_elf_edit_opd (struct bfd_link_info *info)
7533 bfd_boolean some_edited = FALSE;
7534 asection *need_pad = NULL;
7535 struct ppc_link_hash_table *htab;
7537 htab = ppc_hash_table (info);
7541 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7544 Elf_Internal_Rela *relstart, *rel, *relend;
7545 Elf_Internal_Shdr *symtab_hdr;
7546 Elf_Internal_Sym *local_syms;
7548 struct _opd_sec_data *opd;
7549 bfd_boolean need_edit, add_aux_fields;
7550 bfd_size_type cnt_16b = 0;
7552 if (!is_ppc64_elf (ibfd))
7555 sec = bfd_get_section_by_name (ibfd, ".opd");
7556 if (sec == NULL || sec->size == 0)
7559 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
7562 if (sec->output_section == bfd_abs_section_ptr)
7565 /* Look through the section relocs. */
7566 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7570 symtab_hdr = &elf_symtab_hdr (ibfd);
7572 /* Read the relocations. */
7573 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7575 if (relstart == NULL)
7578 /* First run through the relocs to check they are sane, and to
7579 determine whether we need to edit this opd section. */
7583 relend = relstart + sec->reloc_count;
7584 for (rel = relstart; rel < relend; )
7586 enum elf_ppc64_reloc_type r_type;
7587 unsigned long r_symndx;
7589 struct elf_link_hash_entry *h;
7590 Elf_Internal_Sym *sym;
7592 /* .opd contains a regular array of 16 or 24 byte entries. We're
7593 only interested in the reloc pointing to a function entry
7595 if (rel->r_offset != offset
7596 || rel + 1 >= relend
7597 || (rel + 1)->r_offset != offset + 8)
7599 /* If someone messes with .opd alignment then after a
7600 "ld -r" we might have padding in the middle of .opd.
7601 Also, there's nothing to prevent someone putting
7602 something silly in .opd with the assembler. No .opd
7603 optimization for them! */
7605 (*_bfd_error_handler)
7606 (_("%B: .opd is not a regular array of opd entries"), ibfd);
7611 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7612 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7614 (*_bfd_error_handler)
7615 (_("%B: unexpected reloc type %u in .opd section"),
7621 r_symndx = ELF64_R_SYM (rel->r_info);
7622 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7626 if (sym_sec == NULL || sym_sec->owner == NULL)
7628 const char *sym_name;
7630 sym_name = h->root.root.string;
7632 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7635 (*_bfd_error_handler)
7636 (_("%B: undefined sym `%s' in .opd section"),
7642 /* opd entries are always for functions defined in the
7643 current input bfd. If the symbol isn't defined in the
7644 input bfd, then we won't be using the function in this
7645 bfd; It must be defined in a linkonce section in another
7646 bfd, or is weak. It's also possible that we are
7647 discarding the function due to a linker script /DISCARD/,
7648 which we test for via the output_section. */
7649 if (sym_sec->owner != ibfd
7650 || sym_sec->output_section == bfd_abs_section_ptr)
7655 || (rel + 1 == relend && rel->r_offset == offset + 16))
7657 if (sec->size == offset + 24)
7662 if (rel == relend && sec->size == offset + 16)
7670 if (rel->r_offset == offset + 24)
7672 else if (rel->r_offset != offset + 16)
7674 else if (rel + 1 < relend
7675 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7676 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7681 else if (rel + 2 < relend
7682 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
7683 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
7692 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
7694 if (need_edit || add_aux_fields)
7696 Elf_Internal_Rela *write_rel;
7697 Elf_Internal_Shdr *rel_hdr;
7698 bfd_byte *rptr, *wptr;
7699 bfd_byte *new_contents;
7704 new_contents = NULL;
7705 amt = sec->size * sizeof (long) / 8;
7706 opd = &ppc64_elf_section_data (sec)->u.opd;
7707 opd->adjust = bfd_zalloc (sec->owner, amt);
7708 if (opd->adjust == NULL)
7710 ppc64_elf_section_data (sec)->sec_type = sec_opd;
7712 /* This seems a waste of time as input .opd sections are all
7713 zeros as generated by gcc, but I suppose there's no reason
7714 this will always be so. We might start putting something in
7715 the third word of .opd entries. */
7716 if ((sec->flags & SEC_IN_MEMORY) == 0)
7719 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
7724 if (local_syms != NULL
7725 && symtab_hdr->contents != (unsigned char *) local_syms)
7727 if (elf_section_data (sec)->relocs != relstart)
7731 sec->contents = loc;
7732 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7735 elf_section_data (sec)->relocs = relstart;
7737 new_contents = sec->contents;
7740 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7741 if (new_contents == NULL)
7745 wptr = new_contents;
7746 rptr = sec->contents;
7748 write_rel = relstart;
7752 for (rel = relstart; rel < relend; rel++)
7754 unsigned long r_symndx;
7756 struct elf_link_hash_entry *h;
7757 Elf_Internal_Sym *sym;
7759 r_symndx = ELF64_R_SYM (rel->r_info);
7760 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7764 if (rel->r_offset == offset)
7766 struct ppc_link_hash_entry *fdh = NULL;
7768 /* See if the .opd entry is full 24 byte or
7769 16 byte (with fd_aux entry overlapped with next
7772 if ((rel + 2 == relend && sec->size == offset + 16)
7773 || (rel + 3 < relend
7774 && rel[2].r_offset == offset + 16
7775 && rel[3].r_offset == offset + 24
7776 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
7777 && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
7781 && h->root.root.string[0] == '.')
7783 fdh = lookup_fdh ((struct ppc_link_hash_entry *) h, htab);
7785 && fdh->elf.root.type != bfd_link_hash_defined
7786 && fdh->elf.root.type != bfd_link_hash_defweak)
7790 skip = (sym_sec->owner != ibfd
7791 || sym_sec->output_section == bfd_abs_section_ptr);
7794 if (fdh != NULL && sym_sec->owner == ibfd)
7796 /* Arrange for the function descriptor sym
7798 fdh->elf.root.u.def.value = 0;
7799 fdh->elf.root.u.def.section = sym_sec;
7801 opd->adjust[rel->r_offset / 8] = -1;
7805 /* We'll be keeping this opd entry. */
7809 /* Redefine the function descriptor symbol to
7810 this location in the opd section. It is
7811 necessary to update the value here rather
7812 than using an array of adjustments as we do
7813 for local symbols, because various places
7814 in the generic ELF code use the value
7815 stored in u.def.value. */
7816 fdh->elf.root.u.def.value = wptr - new_contents;
7817 fdh->adjust_done = 1;
7820 /* Local syms are a bit tricky. We could
7821 tweak them as they can be cached, but
7822 we'd need to look through the local syms
7823 for the function descriptor sym which we
7824 don't have at the moment. So keep an
7825 array of adjustments. */
7826 opd->adjust[rel->r_offset / 8]
7827 = (wptr - new_contents) - (rptr - sec->contents);
7830 memcpy (wptr, rptr, opd_ent_size);
7831 wptr += opd_ent_size;
7832 if (add_aux_fields && opd_ent_size == 16)
7834 memset (wptr, '\0', 8);
7838 rptr += opd_ent_size;
7839 offset += opd_ent_size;
7845 && !info->relocatable
7846 && !dec_dynrel_count (rel->r_info, sec, info,
7852 /* We need to adjust any reloc offsets to point to the
7853 new opd entries. While we're at it, we may as well
7854 remove redundant relocs. */
7855 rel->r_offset += opd->adjust[(offset - opd_ent_size) / 8];
7856 if (write_rel != rel)
7857 memcpy (write_rel, rel, sizeof (*rel));
7862 sec->size = wptr - new_contents;
7863 sec->reloc_count = write_rel - relstart;
7866 free (sec->contents);
7867 sec->contents = new_contents;
7870 /* Fudge the header size too, as this is used later in
7871 elf_bfd_final_link if we are emitting relocs. */
7872 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7873 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
7876 else if (elf_section_data (sec)->relocs != relstart)
7879 if (local_syms != NULL
7880 && symtab_hdr->contents != (unsigned char *) local_syms)
7882 if (!info->keep_memory)
7885 symtab_hdr->contents = (unsigned char *) local_syms;
7890 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7892 /* If we are doing a final link and the last .opd entry is just 16 byte
7893 long, add a 8 byte padding after it. */
7894 if (need_pad != NULL && !info->relocatable)
7898 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7900 BFD_ASSERT (need_pad->size > 0);
7902 p = bfd_malloc (need_pad->size + 8);
7906 if (! bfd_get_section_contents (need_pad->owner, need_pad,
7907 p, 0, need_pad->size))
7910 need_pad->contents = p;
7911 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7915 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7919 need_pad->contents = p;
7922 memset (need_pad->contents + need_pad->size, 0, 8);
7923 need_pad->size += 8;
7929 /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
7932 ppc64_elf_tls_setup (struct bfd_link_info *info)
7934 struct ppc_link_hash_table *htab;
7936 htab = ppc_hash_table (info);
7940 if (abiversion (info->output_bfd) == 1)
7943 if (htab->params->no_multi_toc)
7944 htab->do_multi_toc = 0;
7945 else if (!htab->do_multi_toc)
7946 htab->params->no_multi_toc = 1;
7948 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7949 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7950 FALSE, FALSE, TRUE));
7951 /* Move dynamic linking info to the function descriptor sym. */
7952 if (htab->tls_get_addr != NULL)
7953 func_desc_adjust (&htab->tls_get_addr->elf, info);
7954 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7955 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7956 FALSE, FALSE, TRUE));
7957 if (!htab->params->no_tls_get_addr_opt)
7959 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
7961 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7962 FALSE, FALSE, TRUE);
7964 func_desc_adjust (opt, info);
7965 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7966 FALSE, FALSE, TRUE);
7968 && (opt_fd->root.type == bfd_link_hash_defined
7969 || opt_fd->root.type == bfd_link_hash_defweak))
7971 /* If glibc supports an optimized __tls_get_addr call stub,
7972 signalled by the presence of __tls_get_addr_opt, and we'll
7973 be calling __tls_get_addr via a plt call stub, then
7974 make __tls_get_addr point to __tls_get_addr_opt. */
7975 tga_fd = &htab->tls_get_addr_fd->elf;
7976 if (htab->elf.dynamic_sections_created
7978 && (tga_fd->type == STT_FUNC
7979 || tga_fd->needs_plt)
7980 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
7981 || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
7982 && tga_fd->root.type == bfd_link_hash_undefweak)))
7984 struct plt_entry *ent;
7986 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7987 if (ent->plt.refcount > 0)
7991 tga_fd->root.type = bfd_link_hash_indirect;
7992 tga_fd->root.u.i.link = &opt_fd->root;
7993 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
7994 if (opt_fd->dynindx != -1)
7996 /* Use __tls_get_addr_opt in dynamic relocations. */
7997 opt_fd->dynindx = -1;
7998 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7999 opt_fd->dynstr_index);
8000 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
8003 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
8004 tga = &htab->tls_get_addr->elf;
8005 if (opt != NULL && tga != NULL)
8007 tga->root.type = bfd_link_hash_indirect;
8008 tga->root.u.i.link = &opt->root;
8009 ppc64_elf_copy_indirect_symbol (info, opt, tga);
8010 _bfd_elf_link_hash_hide_symbol (info, opt,
8012 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
8014 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
8015 htab->tls_get_addr_fd->is_func_descriptor = 1;
8016 if (htab->tls_get_addr != NULL)
8018 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8019 htab->tls_get_addr->is_func = 1;
8025 htab->params->no_tls_get_addr_opt = TRUE;
8027 return _bfd_elf_tls_setup (info->output_bfd, info);
8030 /* Return TRUE iff REL is a branch reloc with a global symbol matching
8034 branch_reloc_hash_match (const bfd *ibfd,
8035 const Elf_Internal_Rela *rel,
8036 const struct ppc_link_hash_entry *hash1,
8037 const struct ppc_link_hash_entry *hash2)
8039 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8040 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8041 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8043 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8045 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8046 struct elf_link_hash_entry *h;
8048 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8049 h = elf_follow_link (h);
8050 if (h == &hash1->elf || h == &hash2->elf)
8056 /* Run through all the TLS relocs looking for optimization
8057 opportunities. The linker has been hacked (see ppc64elf.em) to do
8058 a preliminary section layout so that we know the TLS segment
8059 offsets. We can't optimize earlier because some optimizations need
8060 to know the tp offset, and we need to optimize before allocating
8061 dynamic relocations. */
8064 ppc64_elf_tls_optimize (struct bfd_link_info *info)
8068 struct ppc_link_hash_table *htab;
8069 unsigned char *toc_ref;
8072 if (info->relocatable || !info->executable)
8075 htab = ppc_hash_table (info);
8079 /* Make two passes over the relocs. On the first pass, mark toc
8080 entries involved with tls relocs, and check that tls relocs
8081 involved in setting up a tls_get_addr call are indeed followed by
8082 such a call. If they are not, we can't do any tls optimization.
8083 On the second pass twiddle tls_mask flags to notify
8084 relocate_section that optimization can be done, and adjust got
8085 and plt refcounts. */
8087 for (pass = 0; pass < 2; ++pass)
8088 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8090 Elf_Internal_Sym *locsyms = NULL;
8091 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8093 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8094 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8096 Elf_Internal_Rela *relstart, *rel, *relend;
8097 bfd_boolean found_tls_get_addr_arg = 0;
8099 /* Read the relocations. */
8100 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8102 if (relstart == NULL)
8108 relend = relstart + sec->reloc_count;
8109 for (rel = relstart; rel < relend; rel++)
8111 enum elf_ppc64_reloc_type r_type;
8112 unsigned long r_symndx;
8113 struct elf_link_hash_entry *h;
8114 Elf_Internal_Sym *sym;
8116 unsigned char *tls_mask;
8117 unsigned char tls_set, tls_clear, tls_type = 0;
8119 bfd_boolean ok_tprel, is_local;
8120 long toc_ref_index = 0;
8121 int expecting_tls_get_addr = 0;
8122 bfd_boolean ret = FALSE;
8124 r_symndx = ELF64_R_SYM (rel->r_info);
8125 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8129 if (elf_section_data (sec)->relocs != relstart)
8131 if (toc_ref != NULL)
8134 && (elf_symtab_hdr (ibfd).contents
8135 != (unsigned char *) locsyms))
8142 if (h->root.type == bfd_link_hash_defined
8143 || h->root.type == bfd_link_hash_defweak)
8144 value = h->root.u.def.value;
8145 else if (h->root.type == bfd_link_hash_undefweak)
8149 found_tls_get_addr_arg = 0;
8154 /* Symbols referenced by TLS relocs must be of type
8155 STT_TLS. So no need for .opd local sym adjust. */
8156 value = sym->st_value;
8165 && h->root.type == bfd_link_hash_undefweak)
8169 value += sym_sec->output_offset;
8170 value += sym_sec->output_section->vma;
8171 value -= htab->elf.tls_sec->vma;
8172 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8173 < (bfd_vma) 1 << 32);
8177 r_type = ELF64_R_TYPE (rel->r_info);
8178 /* If this section has old-style __tls_get_addr calls
8179 without marker relocs, then check that each
8180 __tls_get_addr call reloc is preceded by a reloc
8181 that conceivably belongs to the __tls_get_addr arg
8182 setup insn. If we don't find matching arg setup
8183 relocs, don't do any tls optimization. */
8185 && sec->has_tls_get_addr_call
8187 && (h == &htab->tls_get_addr->elf
8188 || h == &htab->tls_get_addr_fd->elf)
8189 && !found_tls_get_addr_arg
8190 && is_branch_reloc (r_type))
8192 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
8193 "TLS optimization disabled\n"),
8194 ibfd, sec, rel->r_offset);
8199 found_tls_get_addr_arg = 0;
8202 case R_PPC64_GOT_TLSLD16:
8203 case R_PPC64_GOT_TLSLD16_LO:
8204 expecting_tls_get_addr = 1;
8205 found_tls_get_addr_arg = 1;
8208 case R_PPC64_GOT_TLSLD16_HI:
8209 case R_PPC64_GOT_TLSLD16_HA:
8210 /* These relocs should never be against a symbol
8211 defined in a shared lib. Leave them alone if
8212 that turns out to be the case. */
8219 tls_type = TLS_TLS | TLS_LD;
8222 case R_PPC64_GOT_TLSGD16:
8223 case R_PPC64_GOT_TLSGD16_LO:
8224 expecting_tls_get_addr = 1;
8225 found_tls_get_addr_arg = 1;
8228 case R_PPC64_GOT_TLSGD16_HI:
8229 case R_PPC64_GOT_TLSGD16_HA:
8235 tls_set = TLS_TLS | TLS_TPRELGD;
8237 tls_type = TLS_TLS | TLS_GD;
8240 case R_PPC64_GOT_TPREL16_DS:
8241 case R_PPC64_GOT_TPREL16_LO_DS:
8242 case R_PPC64_GOT_TPREL16_HI:
8243 case R_PPC64_GOT_TPREL16_HA:
8248 tls_clear = TLS_TPREL;
8249 tls_type = TLS_TLS | TLS_TPREL;
8256 found_tls_get_addr_arg = 1;
8261 case R_PPC64_TOC16_LO:
8262 if (sym_sec == NULL || sym_sec != toc)
8265 /* Mark this toc entry as referenced by a TLS
8266 code sequence. We can do that now in the
8267 case of R_PPC64_TLS, and after checking for
8268 tls_get_addr for the TOC16 relocs. */
8269 if (toc_ref == NULL)
8270 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8271 if (toc_ref == NULL)
8275 value = h->root.u.def.value;
8277 value = sym->st_value;
8278 value += rel->r_addend;
8279 BFD_ASSERT (value < toc->size && value % 8 == 0);
8280 toc_ref_index = (value + toc->output_offset) / 8;
8281 if (r_type == R_PPC64_TLS
8282 || r_type == R_PPC64_TLSGD
8283 || r_type == R_PPC64_TLSLD)
8285 toc_ref[toc_ref_index] = 1;
8289 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8294 expecting_tls_get_addr = 2;
8297 case R_PPC64_TPREL64:
8301 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8306 tls_set = TLS_EXPLICIT;
8307 tls_clear = TLS_TPREL;
8312 case R_PPC64_DTPMOD64:
8316 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8318 if (rel + 1 < relend
8320 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8321 && rel[1].r_offset == rel->r_offset + 8)
8325 tls_set = TLS_EXPLICIT | TLS_GD;
8328 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8337 tls_set = TLS_EXPLICIT;
8348 if (!expecting_tls_get_addr
8349 || !sec->has_tls_get_addr_call)
8352 if (rel + 1 < relend
8353 && branch_reloc_hash_match (ibfd, rel + 1,
8355 htab->tls_get_addr_fd))
8357 if (expecting_tls_get_addr == 2)
8359 /* Check for toc tls entries. */
8360 unsigned char *toc_tls;
8363 retval = get_tls_mask (&toc_tls, NULL, NULL,
8368 if (toc_tls != NULL)
8370 if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
8371 found_tls_get_addr_arg = 1;
8373 toc_ref[toc_ref_index] = 1;
8379 if (expecting_tls_get_addr != 1)
8382 /* Uh oh, we didn't find the expected call. We
8383 could just mark this symbol to exclude it
8384 from tls optimization but it's safer to skip
8385 the entire optimization. */
8386 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
8387 "TLS optimization disabled\n"),
8388 ibfd, sec, rel->r_offset);
8393 if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
8395 struct plt_entry *ent;
8396 for (ent = htab->tls_get_addr->elf.plt.plist;
8399 if (ent->addend == 0)
8401 if (ent->plt.refcount > 0)
8403 ent->plt.refcount -= 1;
8404 expecting_tls_get_addr = 0;
8410 if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
8412 struct plt_entry *ent;
8413 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8416 if (ent->addend == 0)
8418 if (ent->plt.refcount > 0)
8419 ent->plt.refcount -= 1;
8427 if ((tls_set & TLS_EXPLICIT) == 0)
8429 struct got_entry *ent;
8431 /* Adjust got entry for this reloc. */
8435 ent = elf_local_got_ents (ibfd)[r_symndx];
8437 for (; ent != NULL; ent = ent->next)
8438 if (ent->addend == rel->r_addend
8439 && ent->owner == ibfd
8440 && ent->tls_type == tls_type)
8447 /* We managed to get rid of a got entry. */
8448 if (ent->got.refcount > 0)
8449 ent->got.refcount -= 1;
8454 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8455 we'll lose one or two dyn relocs. */
8456 if (!dec_dynrel_count (rel->r_info, sec, info,
8460 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8462 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
8468 *tls_mask |= tls_set;
8469 *tls_mask &= ~tls_clear;
8472 if (elf_section_data (sec)->relocs != relstart)
8477 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8479 if (!info->keep_memory)
8482 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8486 if (toc_ref != NULL)
8491 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8492 the values of any global symbols in a toc section that has been
8493 edited. Globals in toc sections should be a rarity, so this function
8494 sets a flag if any are found in toc sections other than the one just
8495 edited, so that futher hash table traversals can be avoided. */
8497 struct adjust_toc_info
8500 unsigned long *skip;
8501 bfd_boolean global_toc_syms;
8504 enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8507 adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8509 struct ppc_link_hash_entry *eh;
8510 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
8513 if (h->root.type != bfd_link_hash_defined
8514 && h->root.type != bfd_link_hash_defweak)
8517 eh = (struct ppc_link_hash_entry *) h;
8518 if (eh->adjust_done)
8521 if (eh->elf.root.u.def.section == toc_inf->toc)
8523 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8524 i = toc_inf->toc->rawsize >> 3;
8526 i = eh->elf.root.u.def.value >> 3;
8528 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
8530 (*_bfd_error_handler)
8531 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8534 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
8535 eh->elf.root.u.def.value = (bfd_vma) i << 3;
8538 eh->elf.root.u.def.value -= toc_inf->skip[i];
8539 eh->adjust_done = 1;
8541 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8542 toc_inf->global_toc_syms = TRUE;
8547 /* Return TRUE iff INSN is one we expect on a _LO variety toc/got reloc. */
8550 ok_lo_toc_insn (unsigned int insn)
8552 return ((insn & (0x3f << 26)) == 14u << 26 /* addi */
8553 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8554 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8555 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8556 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8557 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8558 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8559 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8560 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8561 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8562 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8563 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8564 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8565 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8566 || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8568 || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8569 && ((insn & 3) == 0 || (insn & 3) == 3))
8570 || (insn & (0x3f << 26)) == 12u << 26 /* addic */);
8573 /* Examine all relocs referencing .toc sections in order to remove
8574 unused .toc entries. */
8577 ppc64_elf_edit_toc (struct bfd_link_info *info)
8580 struct adjust_toc_info toc_inf;
8581 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8583 htab->do_toc_opt = 1;
8584 toc_inf.global_toc_syms = TRUE;
8585 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8587 asection *toc, *sec;
8588 Elf_Internal_Shdr *symtab_hdr;
8589 Elf_Internal_Sym *local_syms;
8590 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
8591 unsigned long *skip, *drop;
8592 unsigned char *used;
8593 unsigned char *keep, last, some_unused;
8595 if (!is_ppc64_elf (ibfd))
8598 toc = bfd_get_section_by_name (ibfd, ".toc");
8601 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8602 || discarded_section (toc))
8607 symtab_hdr = &elf_symtab_hdr (ibfd);
8609 /* Look at sections dropped from the final link. */
8612 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8614 if (sec->reloc_count == 0
8615 || !discarded_section (sec)
8616 || get_opd_info (sec)
8617 || (sec->flags & SEC_ALLOC) == 0
8618 || (sec->flags & SEC_DEBUGGING) != 0)
8621 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8622 if (relstart == NULL)
8625 /* Run through the relocs to see which toc entries might be
8627 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8629 enum elf_ppc64_reloc_type r_type;
8630 unsigned long r_symndx;
8632 struct elf_link_hash_entry *h;
8633 Elf_Internal_Sym *sym;
8636 r_type = ELF64_R_TYPE (rel->r_info);
8643 case R_PPC64_TOC16_LO:
8644 case R_PPC64_TOC16_HI:
8645 case R_PPC64_TOC16_HA:
8646 case R_PPC64_TOC16_DS:
8647 case R_PPC64_TOC16_LO_DS:
8651 r_symndx = ELF64_R_SYM (rel->r_info);
8652 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8660 val = h->root.u.def.value;
8662 val = sym->st_value;
8663 val += rel->r_addend;
8665 if (val >= toc->size)
8668 /* Anything in the toc ought to be aligned to 8 bytes.
8669 If not, don't mark as unused. */
8675 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8680 skip[val >> 3] = ref_from_discarded;
8683 if (elf_section_data (sec)->relocs != relstart)
8687 /* For largetoc loads of address constants, we can convert
8688 . addis rx,2,addr@got@ha
8689 . ld ry,addr@got@l(rx)
8691 . addis rx,2,addr@toc@ha
8692 . addi ry,rx,addr@toc@l
8693 when addr is within 2G of the toc pointer. This then means
8694 that the word storing "addr" in the toc is no longer needed. */
8696 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8697 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8698 && toc->reloc_count != 0)
8700 /* Read toc relocs. */
8701 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8703 if (toc_relocs == NULL)
8706 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
8708 enum elf_ppc64_reloc_type r_type;
8709 unsigned long r_symndx;
8711 struct elf_link_hash_entry *h;
8712 Elf_Internal_Sym *sym;
8715 r_type = ELF64_R_TYPE (rel->r_info);
8716 if (r_type != R_PPC64_ADDR64)
8719 r_symndx = ELF64_R_SYM (rel->r_info);
8720 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8725 || discarded_section (sym_sec))
8728 if (!SYMBOL_REFERENCES_LOCAL (info, h))
8733 if (h->type == STT_GNU_IFUNC)
8735 val = h->root.u.def.value;
8739 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8741 val = sym->st_value;
8743 val += rel->r_addend;
8744 val += sym_sec->output_section->vma + sym_sec->output_offset;
8746 /* We don't yet know the exact toc pointer value, but we
8747 know it will be somewhere in the toc section. Don't
8748 optimize if the difference from any possible toc
8749 pointer is outside [ff..f80008000, 7fff7fff]. */
8750 addr = toc->output_section->vma + TOC_BASE_OFF;
8751 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8754 addr = toc->output_section->vma + toc->output_section->rawsize;
8755 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8760 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8765 skip[rel->r_offset >> 3]
8766 |= can_optimize | ((rel - toc_relocs) << 2);
8773 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8777 if (local_syms != NULL
8778 && symtab_hdr->contents != (unsigned char *) local_syms)
8782 && elf_section_data (sec)->relocs != relstart)
8784 if (toc_relocs != NULL
8785 && elf_section_data (toc)->relocs != toc_relocs)
8792 /* Now check all kept sections that might reference the toc.
8793 Check the toc itself last. */
8794 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8797 sec = (sec == toc ? NULL
8798 : sec->next == NULL ? toc
8799 : sec->next == toc && toc->next ? toc->next
8804 if (sec->reloc_count == 0
8805 || discarded_section (sec)
8806 || get_opd_info (sec)
8807 || (sec->flags & SEC_ALLOC) == 0
8808 || (sec->flags & SEC_DEBUGGING) != 0)
8811 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8813 if (relstart == NULL)
8819 /* Mark toc entries referenced as used. */
8823 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8825 enum elf_ppc64_reloc_type r_type;
8826 unsigned long r_symndx;
8828 struct elf_link_hash_entry *h;
8829 Elf_Internal_Sym *sym;
8831 enum {no_check, check_lo, check_ha} insn_check;
8833 r_type = ELF64_R_TYPE (rel->r_info);
8837 insn_check = no_check;
8840 case R_PPC64_GOT_TLSLD16_HA:
8841 case R_PPC64_GOT_TLSGD16_HA:
8842 case R_PPC64_GOT_TPREL16_HA:
8843 case R_PPC64_GOT_DTPREL16_HA:
8844 case R_PPC64_GOT16_HA:
8845 case R_PPC64_TOC16_HA:
8846 insn_check = check_ha;
8849 case R_PPC64_GOT_TLSLD16_LO:
8850 case R_PPC64_GOT_TLSGD16_LO:
8851 case R_PPC64_GOT_TPREL16_LO_DS:
8852 case R_PPC64_GOT_DTPREL16_LO_DS:
8853 case R_PPC64_GOT16_LO:
8854 case R_PPC64_GOT16_LO_DS:
8855 case R_PPC64_TOC16_LO:
8856 case R_PPC64_TOC16_LO_DS:
8857 insn_check = check_lo;
8861 if (insn_check != no_check)
8863 bfd_vma off = rel->r_offset & ~3;
8864 unsigned char buf[4];
8867 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
8872 insn = bfd_get_32 (ibfd, buf);
8873 if (insn_check == check_lo
8874 ? !ok_lo_toc_insn (insn)
8875 : ((insn & ((0x3f << 26) | 0x1f << 16))
8876 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
8880 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
8881 sprintf (str, "%#08x", insn);
8882 info->callbacks->einfo
8883 (_("%P: %H: toc optimization is not supported for"
8884 " %s instruction.\n"),
8885 ibfd, sec, rel->r_offset & ~3, str);
8892 case R_PPC64_TOC16_LO:
8893 case R_PPC64_TOC16_HI:
8894 case R_PPC64_TOC16_HA:
8895 case R_PPC64_TOC16_DS:
8896 case R_PPC64_TOC16_LO_DS:
8897 /* In case we're taking addresses of toc entries. */
8898 case R_PPC64_ADDR64:
8905 r_symndx = ELF64_R_SYM (rel->r_info);
8906 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8917 val = h->root.u.def.value;
8919 val = sym->st_value;
8920 val += rel->r_addend;
8922 if (val >= toc->size)
8925 if ((skip[val >> 3] & can_optimize) != 0)
8932 case R_PPC64_TOC16_HA:
8935 case R_PPC64_TOC16_LO_DS:
8936 off = rel->r_offset;
8937 off += (bfd_big_endian (ibfd) ? -2 : 3);
8938 if (!bfd_get_section_contents (ibfd, sec, &opc,
8944 if ((opc & (0x3f << 2)) == (58u << 2))
8949 /* Wrong sort of reloc, or not a ld. We may
8950 as well clear ref_from_discarded too. */
8957 /* For the toc section, we only mark as used if this
8958 entry itself isn't unused. */
8959 else if ((used[rel->r_offset >> 3]
8960 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
8963 /* Do all the relocs again, to catch reference
8972 if (elf_section_data (sec)->relocs != relstart)
8976 /* Merge the used and skip arrays. Assume that TOC
8977 doublewords not appearing as either used or unused belong
8978 to to an entry more than one doubleword in size. */
8979 for (drop = skip, keep = used, last = 0, some_unused = 0;
8980 drop < skip + (toc->size + 7) / 8;
8985 *drop &= ~ref_from_discarded;
8986 if ((*drop & can_optimize) != 0)
8990 else if ((*drop & ref_from_discarded) != 0)
8993 last = ref_from_discarded;
9003 bfd_byte *contents, *src;
9005 Elf_Internal_Sym *sym;
9006 bfd_boolean local_toc_syms = FALSE;
9008 /* Shuffle the toc contents, and at the same time convert the
9009 skip array from booleans into offsets. */
9010 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
9013 elf_section_data (toc)->this_hdr.contents = contents;
9015 for (src = contents, off = 0, drop = skip;
9016 src < contents + toc->size;
9019 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9024 memcpy (src - off, src, 8);
9028 toc->rawsize = toc->size;
9029 toc->size = src - contents - off;
9031 /* Adjust addends for relocs against the toc section sym,
9032 and optimize any accesses we can. */
9033 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9035 if (sec->reloc_count == 0
9036 || discarded_section (sec))
9039 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9041 if (relstart == NULL)
9044 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9046 enum elf_ppc64_reloc_type r_type;
9047 unsigned long r_symndx;
9049 struct elf_link_hash_entry *h;
9052 r_type = ELF64_R_TYPE (rel->r_info);
9059 case R_PPC64_TOC16_LO:
9060 case R_PPC64_TOC16_HI:
9061 case R_PPC64_TOC16_HA:
9062 case R_PPC64_TOC16_DS:
9063 case R_PPC64_TOC16_LO_DS:
9064 case R_PPC64_ADDR64:
9068 r_symndx = ELF64_R_SYM (rel->r_info);
9069 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9077 val = h->root.u.def.value;
9080 val = sym->st_value;
9082 local_toc_syms = TRUE;
9085 val += rel->r_addend;
9087 if (val > toc->rawsize)
9089 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9091 else if ((skip[val >> 3] & can_optimize) != 0)
9093 Elf_Internal_Rela *tocrel
9094 = toc_relocs + (skip[val >> 3] >> 2);
9095 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9099 case R_PPC64_TOC16_HA:
9100 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9103 case R_PPC64_TOC16_LO_DS:
9104 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9108 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9110 info->callbacks->einfo
9111 (_("%P: %H: %s references "
9112 "optimized away TOC entry\n"),
9113 ibfd, sec, rel->r_offset,
9114 ppc64_elf_howto_table[r_type]->name);
9115 bfd_set_error (bfd_error_bad_value);
9118 rel->r_addend = tocrel->r_addend;
9119 elf_section_data (sec)->relocs = relstart;
9123 if (h != NULL || sym->st_value != 0)
9126 rel->r_addend -= skip[val >> 3];
9127 elf_section_data (sec)->relocs = relstart;
9130 if (elf_section_data (sec)->relocs != relstart)
9134 /* We shouldn't have local or global symbols defined in the TOC,
9135 but handle them anyway. */
9136 if (local_syms != NULL)
9137 for (sym = local_syms;
9138 sym < local_syms + symtab_hdr->sh_info;
9140 if (sym->st_value != 0
9141 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9145 if (sym->st_value > toc->rawsize)
9146 i = toc->rawsize >> 3;
9148 i = sym->st_value >> 3;
9150 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9153 (*_bfd_error_handler)
9154 (_("%s defined on removed toc entry"),
9155 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9158 while ((skip[i] & (ref_from_discarded | can_optimize)));
9159 sym->st_value = (bfd_vma) i << 3;
9162 sym->st_value -= skip[i];
9163 symtab_hdr->contents = (unsigned char *) local_syms;
9166 /* Adjust any global syms defined in this toc input section. */
9167 if (toc_inf.global_toc_syms)
9170 toc_inf.skip = skip;
9171 toc_inf.global_toc_syms = FALSE;
9172 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9176 if (toc->reloc_count != 0)
9178 Elf_Internal_Shdr *rel_hdr;
9179 Elf_Internal_Rela *wrel;
9182 /* Remove unused toc relocs, and adjust those we keep. */
9183 if (toc_relocs == NULL)
9184 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9186 if (toc_relocs == NULL)
9190 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9191 if ((skip[rel->r_offset >> 3]
9192 & (ref_from_discarded | can_optimize)) == 0)
9194 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9195 wrel->r_info = rel->r_info;
9196 wrel->r_addend = rel->r_addend;
9199 else if (!dec_dynrel_count (rel->r_info, toc, info,
9200 &local_syms, NULL, NULL))
9203 elf_section_data (toc)->relocs = toc_relocs;
9204 toc->reloc_count = wrel - toc_relocs;
9205 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9206 sz = rel_hdr->sh_entsize;
9207 rel_hdr->sh_size = toc->reloc_count * sz;
9210 else if (toc_relocs != NULL
9211 && elf_section_data (toc)->relocs != toc_relocs)
9214 if (local_syms != NULL
9215 && symtab_hdr->contents != (unsigned char *) local_syms)
9217 if (!info->keep_memory)
9220 symtab_hdr->contents = (unsigned char *) local_syms;
9228 /* Return true iff input section I references the TOC using
9229 instructions limited to +/-32k offsets. */
9232 ppc64_elf_has_small_toc_reloc (asection *i)
9234 return (is_ppc64_elf (i->owner)
9235 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9238 /* Allocate space for one GOT entry. */
9241 allocate_got (struct elf_link_hash_entry *h,
9242 struct bfd_link_info *info,
9243 struct got_entry *gent)
9245 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9247 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9248 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9250 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9251 ? 2 : 1) * sizeof (Elf64_External_Rela);
9252 asection *got = ppc64_elf_tdata (gent->owner)->got;
9254 gent->got.offset = got->size;
9255 got->size += entsize;
9257 dyn = htab->elf.dynamic_sections_created;
9258 if (h->type == STT_GNU_IFUNC)
9260 htab->elf.irelplt->size += rentsize;
9261 htab->got_reli_size += rentsize;
9263 else if ((info->shared
9264 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
9265 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9266 || h->root.type != bfd_link_hash_undefweak))
9268 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
9269 relgot->size += rentsize;
9273 /* This function merges got entries in the same toc group. */
9276 merge_got_entries (struct got_entry **pent)
9278 struct got_entry *ent, *ent2;
9280 for (ent = *pent; ent != NULL; ent = ent->next)
9281 if (!ent->is_indirect)
9282 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9283 if (!ent2->is_indirect
9284 && ent2->addend == ent->addend
9285 && ent2->tls_type == ent->tls_type
9286 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9288 ent2->is_indirect = TRUE;
9289 ent2->got.ent = ent;
9293 /* Allocate space in .plt, .got and associated reloc sections for
9297 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9299 struct bfd_link_info *info;
9300 struct ppc_link_hash_table *htab;
9302 struct ppc_link_hash_entry *eh;
9303 struct elf_dyn_relocs *p;
9304 struct got_entry **pgent, *gent;
9306 if (h->root.type == bfd_link_hash_indirect)
9309 info = (struct bfd_link_info *) inf;
9310 htab = ppc_hash_table (info);
9314 if ((htab->elf.dynamic_sections_created
9316 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
9317 || h->type == STT_GNU_IFUNC)
9319 struct plt_entry *pent;
9320 bfd_boolean doneone = FALSE;
9321 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9322 if (pent->plt.refcount > 0)
9324 if (!htab->elf.dynamic_sections_created
9325 || h->dynindx == -1)
9328 pent->plt.offset = s->size;
9329 s->size += PLT_ENTRY_SIZE (htab);
9330 s = htab->elf.irelplt;
9334 /* If this is the first .plt entry, make room for the special
9338 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
9340 pent->plt.offset = s->size;
9342 /* Make room for this entry. */
9343 s->size += PLT_ENTRY_SIZE (htab);
9345 /* Make room for the .glink code. */
9348 s->size += GLINK_CALL_STUB_SIZE;
9351 /* We need bigger stubs past index 32767. */
9352 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
9359 /* We also need to make an entry in the .rela.plt section. */
9360 s = htab->elf.srelplt;
9362 s->size += sizeof (Elf64_External_Rela);
9366 pent->plt.offset = (bfd_vma) -1;
9369 h->plt.plist = NULL;
9375 h->plt.plist = NULL;
9379 eh = (struct ppc_link_hash_entry *) h;
9380 /* Run through the TLS GD got entries first if we're changing them
9382 if ((eh->tls_mask & TLS_TPRELGD) != 0)
9383 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9384 if (gent->got.refcount > 0
9385 && (gent->tls_type & TLS_GD) != 0)
9387 /* This was a GD entry that has been converted to TPREL. If
9388 there happens to be a TPREL entry we can use that one. */
9389 struct got_entry *ent;
9390 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9391 if (ent->got.refcount > 0
9392 && (ent->tls_type & TLS_TPREL) != 0
9393 && ent->addend == gent->addend
9394 && ent->owner == gent->owner)
9396 gent->got.refcount = 0;
9400 /* If not, then we'll be using our own TPREL entry. */
9401 if (gent->got.refcount != 0)
9402 gent->tls_type = TLS_TLS | TLS_TPREL;
9405 /* Remove any list entry that won't generate a word in the GOT before
9406 we call merge_got_entries. Otherwise we risk merging to empty
9408 pgent = &h->got.glist;
9409 while ((gent = *pgent) != NULL)
9410 if (gent->got.refcount > 0)
9412 if ((gent->tls_type & TLS_LD) != 0
9415 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9416 *pgent = gent->next;
9419 pgent = &gent->next;
9422 *pgent = gent->next;
9424 if (!htab->do_multi_toc)
9425 merge_got_entries (&h->got.glist);
9427 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9428 if (!gent->is_indirect)
9430 /* Make sure this symbol is output as a dynamic symbol.
9431 Undefined weak syms won't yet be marked as dynamic,
9432 nor will all TLS symbols. */
9433 if (h->dynindx == -1
9435 && h->type != STT_GNU_IFUNC
9436 && htab->elf.dynamic_sections_created)
9438 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9442 if (!is_ppc64_elf (gent->owner))
9445 allocate_got (h, info, gent);
9448 if (eh->dyn_relocs == NULL
9449 || (!htab->elf.dynamic_sections_created
9450 && h->type != STT_GNU_IFUNC))
9453 /* In the shared -Bsymbolic case, discard space allocated for
9454 dynamic pc-relative relocs against symbols which turn out to be
9455 defined in regular objects. For the normal shared case, discard
9456 space for relocs that have become local due to symbol visibility
9461 /* Relocs that use pc_count are those that appear on a call insn,
9462 or certain REL relocs (see must_be_dyn_reloc) that can be
9463 generated via assembly. We want calls to protected symbols to
9464 resolve directly to the function rather than going via the plt.
9465 If people want function pointer comparisons to work as expected
9466 then they should avoid writing weird assembly. */
9467 if (SYMBOL_CALLS_LOCAL (info, h))
9469 struct elf_dyn_relocs **pp;
9471 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9473 p->count -= p->pc_count;
9482 /* Also discard relocs on undefined weak syms with non-default
9484 if (eh->dyn_relocs != NULL
9485 && h->root.type == bfd_link_hash_undefweak)
9487 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9488 eh->dyn_relocs = NULL;
9490 /* Make sure this symbol is output as a dynamic symbol.
9491 Undefined weak syms won't yet be marked as dynamic. */
9492 else if (h->dynindx == -1
9493 && !h->forced_local)
9495 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9500 else if (h->type == STT_GNU_IFUNC)
9502 if (!h->non_got_ref)
9503 eh->dyn_relocs = NULL;
9505 else if (ELIMINATE_COPY_RELOCS)
9507 /* For the non-shared case, discard space for relocs against
9508 symbols which turn out to need copy relocs or are not
9514 /* Make sure this symbol is output as a dynamic symbol.
9515 Undefined weak syms won't yet be marked as dynamic. */
9516 if (h->dynindx == -1
9517 && !h->forced_local)
9519 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9523 /* If that succeeded, we know we'll be keeping all the
9525 if (h->dynindx != -1)
9529 eh->dyn_relocs = NULL;
9534 /* Finally, allocate space. */
9535 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9537 asection *sreloc = elf_section_data (p->sec)->sreloc;
9538 if (eh->elf.type == STT_GNU_IFUNC)
9539 sreloc = htab->elf.irelplt;
9540 sreloc->size += p->count * sizeof (Elf64_External_Rela);
9546 /* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9547 to set up space for global entry stubs. These are put in glink,
9548 after the branch table. */
9551 size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
9553 struct bfd_link_info *info;
9554 struct ppc_link_hash_table *htab;
9555 struct plt_entry *pent;
9558 if (h->root.type == bfd_link_hash_indirect)
9561 if (!h->pointer_equality_needed)
9568 htab = ppc_hash_table (info);
9573 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9574 if (pent->plt.offset != (bfd_vma) -1
9575 && pent->addend == 0)
9577 /* For ELFv2, if this symbol is not defined in a regular file
9578 and we are not generating a shared library or pie, then we
9579 need to define the symbol in the executable on a call stub.
9580 This is to avoid text relocations. */
9581 s->size = (s->size + 15) & -16;
9582 h->root.u.def.section = s;
9583 h->root.u.def.value = s->size;
9590 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
9591 read-only sections. */
9594 maybe_set_textrel (struct elf_link_hash_entry *h, void *info)
9596 if (h->root.type == bfd_link_hash_indirect)
9599 if (readonly_dynrelocs (h))
9601 ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
9603 /* Not an error, just cut short the traversal. */
9609 /* Set the sizes of the dynamic sections. */
9612 ppc64_elf_size_dynamic_sections (bfd *output_bfd,
9613 struct bfd_link_info *info)
9615 struct ppc_link_hash_table *htab;
9620 struct got_entry *first_tlsld;
9622 htab = ppc_hash_table (info);
9626 dynobj = htab->elf.dynobj;
9630 if (htab->elf.dynamic_sections_created)
9632 /* Set the contents of the .interp section to the interpreter. */
9633 if (info->executable)
9635 s = bfd_get_linker_section (dynobj, ".interp");
9638 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
9639 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9643 /* Set up .got offsets for local syms, and space for local dynamic
9645 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9647 struct got_entry **lgot_ents;
9648 struct got_entry **end_lgot_ents;
9649 struct plt_entry **local_plt;
9650 struct plt_entry **end_local_plt;
9651 unsigned char *lgot_masks;
9652 bfd_size_type locsymcount;
9653 Elf_Internal_Shdr *symtab_hdr;
9655 if (!is_ppc64_elf (ibfd))
9658 for (s = ibfd->sections; s != NULL; s = s->next)
9660 struct ppc_dyn_relocs *p;
9662 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
9664 if (!bfd_is_abs_section (p->sec)
9665 && bfd_is_abs_section (p->sec->output_section))
9667 /* Input section has been discarded, either because
9668 it is a copy of a linkonce section or due to
9669 linker script /DISCARD/, so we'll be discarding
9672 else if (p->count != 0)
9674 asection *srel = elf_section_data (p->sec)->sreloc;
9676 srel = htab->elf.irelplt;
9677 srel->size += p->count * sizeof (Elf64_External_Rela);
9678 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9679 info->flags |= DF_TEXTREL;
9684 lgot_ents = elf_local_got_ents (ibfd);
9688 symtab_hdr = &elf_symtab_hdr (ibfd);
9689 locsymcount = symtab_hdr->sh_info;
9690 end_lgot_ents = lgot_ents + locsymcount;
9691 local_plt = (struct plt_entry **) end_lgot_ents;
9692 end_local_plt = local_plt + locsymcount;
9693 lgot_masks = (unsigned char *) end_local_plt;
9694 s = ppc64_elf_tdata (ibfd)->got;
9695 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
9697 struct got_entry **pent, *ent;
9700 while ((ent = *pent) != NULL)
9701 if (ent->got.refcount > 0)
9703 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
9705 ppc64_tlsld_got (ibfd)->got.refcount += 1;
9710 unsigned int ent_size = 8;
9711 unsigned int rel_size = sizeof (Elf64_External_Rela);
9713 ent->got.offset = s->size;
9714 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
9719 s->size += ent_size;
9720 if ((*lgot_masks & PLT_IFUNC) != 0)
9722 htab->elf.irelplt->size += rel_size;
9723 htab->got_reli_size += rel_size;
9725 else if (info->shared)
9727 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9728 srel->size += rel_size;
9737 /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
9738 for (; local_plt < end_local_plt; ++local_plt)
9740 struct plt_entry *ent;
9742 for (ent = *local_plt; ent != NULL; ent = ent->next)
9743 if (ent->plt.refcount > 0)
9746 ent->plt.offset = s->size;
9747 s->size += PLT_ENTRY_SIZE (htab);
9749 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
9752 ent->plt.offset = (bfd_vma) -1;
9756 /* Allocate global sym .plt and .got entries, and space for global
9757 sym dynamic relocs. */
9758 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
9759 /* Stash the end of glink branch table. */
9760 if (htab->glink != NULL)
9761 htab->glink->rawsize = htab->glink->size;
9763 if (!htab->opd_abi && !info->shared)
9764 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
9767 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9769 struct got_entry *ent;
9771 if (!is_ppc64_elf (ibfd))
9774 ent = ppc64_tlsld_got (ibfd);
9775 if (ent->got.refcount > 0)
9777 if (!htab->do_multi_toc && first_tlsld != NULL)
9779 ent->is_indirect = TRUE;
9780 ent->got.ent = first_tlsld;
9784 if (first_tlsld == NULL)
9786 s = ppc64_elf_tdata (ibfd)->got;
9787 ent->got.offset = s->size;
9792 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9793 srel->size += sizeof (Elf64_External_Rela);
9798 ent->got.offset = (bfd_vma) -1;
9801 /* We now have determined the sizes of the various dynamic sections.
9802 Allocate memory for them. */
9804 for (s = dynobj->sections; s != NULL; s = s->next)
9806 if ((s->flags & SEC_LINKER_CREATED) == 0)
9809 if (s == htab->brlt || s == htab->relbrlt)
9810 /* These haven't been allocated yet; don't strip. */
9812 else if (s == htab->elf.sgot
9813 || s == htab->elf.splt
9814 || s == htab->elf.iplt
9816 || s == htab->dynbss)
9818 /* Strip this section if we don't need it; see the
9821 else if (s == htab->glink_eh_frame)
9823 if (!bfd_is_abs_section (s->output_section))
9824 /* Not sized yet. */
9827 else if (CONST_STRNEQ (s->name, ".rela"))
9831 if (s != htab->elf.srelplt)
9834 /* We use the reloc_count field as a counter if we need
9835 to copy relocs into the output file. */
9841 /* It's not one of our sections, so don't allocate space. */
9847 /* If we don't need this section, strip it from the
9848 output file. This is mostly to handle .rela.bss and
9849 .rela.plt. We must create both sections in
9850 create_dynamic_sections, because they must be created
9851 before the linker maps input sections to output
9852 sections. The linker does that before
9853 adjust_dynamic_symbol is called, and it is that
9854 function which decides whether anything needs to go
9855 into these sections. */
9856 s->flags |= SEC_EXCLUDE;
9860 if ((s->flags & SEC_HAS_CONTENTS) == 0)
9863 /* Allocate memory for the section contents. We use bfd_zalloc
9864 here in case unused entries are not reclaimed before the
9865 section's contents are written out. This should not happen,
9866 but this way if it does we get a R_PPC64_NONE reloc in .rela
9867 sections instead of garbage.
9868 We also rely on the section contents being zero when writing
9870 s->contents = bfd_zalloc (dynobj, s->size);
9871 if (s->contents == NULL)
9875 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9877 if (!is_ppc64_elf (ibfd))
9880 s = ppc64_elf_tdata (ibfd)->got;
9881 if (s != NULL && s != htab->elf.sgot)
9884 s->flags |= SEC_EXCLUDE;
9887 s->contents = bfd_zalloc (ibfd, s->size);
9888 if (s->contents == NULL)
9892 s = ppc64_elf_tdata (ibfd)->relgot;
9896 s->flags |= SEC_EXCLUDE;
9899 s->contents = bfd_zalloc (ibfd, s->size);
9900 if (s->contents == NULL)
9908 if (htab->elf.dynamic_sections_created)
9910 bfd_boolean tls_opt;
9912 /* Add some entries to the .dynamic section. We fill in the
9913 values later, in ppc64_elf_finish_dynamic_sections, but we
9914 must add the entries now so that we get the correct size for
9915 the .dynamic section. The DT_DEBUG entry is filled in by the
9916 dynamic linker and used by the debugger. */
9917 #define add_dynamic_entry(TAG, VAL) \
9918 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
9920 if (info->executable)
9922 if (!add_dynamic_entry (DT_DEBUG, 0))
9926 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
9928 if (!add_dynamic_entry (DT_PLTGOT, 0)
9929 || !add_dynamic_entry (DT_PLTRELSZ, 0)
9930 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
9931 || !add_dynamic_entry (DT_JMPREL, 0)
9932 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
9936 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
9938 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
9939 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
9943 tls_opt = (!htab->params->no_tls_get_addr_opt
9944 && htab->tls_get_addr_fd != NULL
9945 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
9946 if (tls_opt || !htab->opd_abi)
9948 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
9954 if (!add_dynamic_entry (DT_RELA, 0)
9955 || !add_dynamic_entry (DT_RELASZ, 0)
9956 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
9959 /* If any dynamic relocs apply to a read-only section,
9960 then we need a DT_TEXTREL entry. */
9961 if ((info->flags & DF_TEXTREL) == 0)
9962 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
9964 if ((info->flags & DF_TEXTREL) != 0)
9966 if (!add_dynamic_entry (DT_TEXTREL, 0))
9971 #undef add_dynamic_entry
9976 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
9979 ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
9981 if (h->plt.plist != NULL
9983 && !h->pointer_equality_needed)
9986 return _bfd_elf_hash_symbol (h);
9989 /* Determine the type of stub needed, if any, for a call. */
9991 static inline enum ppc_stub_type
9992 ppc_type_of_stub (asection *input_sec,
9993 const Elf_Internal_Rela *rel,
9994 struct ppc_link_hash_entry **hash,
9995 struct plt_entry **plt_ent,
9996 bfd_vma destination,
9997 unsigned long local_off)
9999 struct ppc_link_hash_entry *h = *hash;
10001 bfd_vma branch_offset;
10002 bfd_vma max_branch_offset;
10003 enum elf_ppc64_reloc_type r_type;
10007 struct plt_entry *ent;
10008 struct ppc_link_hash_entry *fdh = h;
10010 && h->oh->is_func_descriptor)
10012 fdh = ppc_follow_link (h->oh);
10016 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10017 if (ent->addend == rel->r_addend
10018 && ent->plt.offset != (bfd_vma) -1)
10021 return ppc_stub_plt_call;
10024 /* Here, we know we don't have a plt entry. If we don't have a
10025 either a defined function descriptor or a defined entry symbol
10026 in a regular object file, then it is pointless trying to make
10027 any other type of stub. */
10028 if (!is_static_defined (&fdh->elf)
10029 && !is_static_defined (&h->elf))
10030 return ppc_stub_none;
10032 else if (elf_local_got_ents (input_sec->owner) != NULL)
10034 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10035 struct plt_entry **local_plt = (struct plt_entry **)
10036 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10037 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10039 if (local_plt[r_symndx] != NULL)
10041 struct plt_entry *ent;
10043 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10044 if (ent->addend == rel->r_addend
10045 && ent->plt.offset != (bfd_vma) -1)
10048 return ppc_stub_plt_call;
10053 /* Determine where the call point is. */
10054 location = (input_sec->output_offset
10055 + input_sec->output_section->vma
10058 branch_offset = destination - location;
10059 r_type = ELF64_R_TYPE (rel->r_info);
10061 /* Determine if a long branch stub is needed. */
10062 max_branch_offset = 1 << 25;
10063 if (r_type != R_PPC64_REL24)
10064 max_branch_offset = 1 << 15;
10066 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
10067 /* We need a stub. Figure out whether a long_branch or plt_branch
10068 is needed later. */
10069 return ppc_stub_long_branch;
10071 return ppc_stub_none;
10074 /* With power7 weakly ordered memory model, it is possible for ld.so
10075 to update a plt entry in one thread and have another thread see a
10076 stale zero toc entry. To avoid this we need some sort of acquire
10077 barrier in the call stub. One solution is to make the load of the
10078 toc word seem to appear to depend on the load of the function entry
10079 word. Another solution is to test for r2 being zero, and branch to
10080 the appropriate glink entry if so.
10082 . fake dep barrier compare
10083 . ld 12,xxx(2) ld 12,xxx(2)
10084 . mtctr 12 mtctr 12
10085 . xor 11,12,12 ld 2,xxx+8(2)
10086 . add 2,2,11 cmpldi 2,0
10087 . ld 2,xxx+8(2) bnectr+
10088 . bctr b <glink_entry>
10090 The solution involving the compare turns out to be faster, so
10091 that's what we use unless the branch won't reach. */
10093 #define ALWAYS_USE_FAKE_DEP 0
10094 #define ALWAYS_EMIT_R2SAVE 0
10096 #define PPC_LO(v) ((v) & 0xffff)
10097 #define PPC_HI(v) (((v) >> 16) & 0xffff)
10098 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
10100 static inline unsigned int
10101 plt_stub_size (struct ppc_link_hash_table *htab,
10102 struct ppc_stub_hash_entry *stub_entry,
10105 unsigned size = 12;
10107 if (ALWAYS_EMIT_R2SAVE
10108 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10110 if (PPC_HA (off) != 0)
10115 if (htab->params->plt_static_chain)
10117 if (htab->params->plt_thread_safe)
10119 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
10122 if (stub_entry->h != NULL
10123 && (stub_entry->h == htab->tls_get_addr_fd
10124 || stub_entry->h == htab->tls_get_addr)
10125 && !htab->params->no_tls_get_addr_opt)
10130 /* If this stub would cross fewer 2**plt_stub_align boundaries if we align,
10131 then return the padding needed to do so. */
10132 static inline unsigned int
10133 plt_stub_pad (struct ppc_link_hash_table *htab,
10134 struct ppc_stub_hash_entry *stub_entry,
10137 int stub_align = 1 << htab->params->plt_stub_align;
10138 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
10139 bfd_vma stub_off = stub_entry->stub_sec->size;
10141 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
10142 > (stub_size & -stub_align))
10143 return stub_align - (stub_off & (stub_align - 1));
10147 /* Build a .plt call stub. */
10149 static inline bfd_byte *
10150 build_plt_stub (struct ppc_link_hash_table *htab,
10151 struct ppc_stub_hash_entry *stub_entry,
10152 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10154 bfd *obfd = htab->params->stub_bfd;
10155 bfd_boolean plt_load_toc = htab->opd_abi;
10156 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
10157 bfd_boolean plt_thread_safe = htab->params->plt_thread_safe;
10158 bfd_boolean use_fake_dep = plt_thread_safe;
10159 bfd_vma cmp_branch_off = 0;
10161 if (!ALWAYS_USE_FAKE_DEP
10164 && !(stub_entry->h != NULL
10165 && (stub_entry->h == htab->tls_get_addr_fd
10166 || stub_entry->h == htab->tls_get_addr)
10167 && !htab->params->no_tls_get_addr_opt))
10169 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
10170 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10171 / PLT_ENTRY_SIZE (htab));
10172 bfd_vma glinkoff = GLINK_CALL_STUB_SIZE + pltindex * 8;
10175 if (pltindex > 32768)
10176 glinkoff += (pltindex - 32768) * 4;
10178 + htab->glink->output_offset
10179 + htab->glink->output_section->vma);
10180 from = (p - stub_entry->stub_sec->contents
10181 + 4 * (ALWAYS_EMIT_R2SAVE
10182 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10183 + 4 * (PPC_HA (offset) != 0)
10184 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10185 != PPC_HA (offset))
10186 + 4 * (plt_static_chain != 0)
10188 + stub_entry->stub_sec->output_offset
10189 + stub_entry->stub_sec->output_section->vma);
10190 cmp_branch_off = to - from;
10191 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10194 if (PPC_HA (offset) != 0)
10198 if (ALWAYS_EMIT_R2SAVE
10199 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10200 r[0].r_offset += 4;
10201 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10202 r[1].r_offset = r[0].r_offset + 4;
10203 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10204 r[1].r_addend = r[0].r_addend;
10207 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10209 r[2].r_offset = r[1].r_offset + 4;
10210 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10211 r[2].r_addend = r[0].r_addend;
10215 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10216 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10217 r[2].r_addend = r[0].r_addend + 8;
10218 if (plt_static_chain)
10220 r[3].r_offset = r[2].r_offset + 4;
10221 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10222 r[3].r_addend = r[0].r_addend + 16;
10227 if (ALWAYS_EMIT_R2SAVE
10228 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10229 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10230 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10231 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10233 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10235 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
10238 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10243 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10244 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10246 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10247 if (plt_static_chain)
10248 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
10255 if (ALWAYS_EMIT_R2SAVE
10256 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10257 r[0].r_offset += 4;
10258 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10261 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10263 r[1].r_offset = r[0].r_offset + 4;
10264 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10265 r[1].r_addend = r[0].r_addend;
10269 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10270 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10271 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10272 if (plt_static_chain)
10274 r[2].r_offset = r[1].r_offset + 4;
10275 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10276 r[2].r_addend = r[0].r_addend + 8;
10281 if (ALWAYS_EMIT_R2SAVE
10282 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10283 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10284 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
10286 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10288 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10291 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10296 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10297 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10299 if (plt_static_chain)
10300 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10301 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
10304 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
10306 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10307 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
10308 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
10311 bfd_put_32 (obfd, BCTR, p), p += 4;
10315 /* Build a special .plt call stub for __tls_get_addr. */
10317 #define LD_R11_0R3 0xe9630000
10318 #define LD_R12_0R3 0xe9830000
10319 #define MR_R0_R3 0x7c601b78
10320 #define CMPDI_R11_0 0x2c2b0000
10321 #define ADD_R3_R12_R13 0x7c6c6a14
10322 #define BEQLR 0x4d820020
10323 #define MR_R3_R0 0x7c030378
10324 #define STD_R11_0R1 0xf9610000
10325 #define BCTRL 0x4e800421
10326 #define LD_R11_0R1 0xe9610000
10327 #define MTLR_R11 0x7d6803a6
10329 static inline bfd_byte *
10330 build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10331 struct ppc_stub_hash_entry *stub_entry,
10332 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10334 bfd *obfd = htab->params->stub_bfd;
10336 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10337 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10338 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10339 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10340 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10341 bfd_put_32 (obfd, BEQLR, p), p += 4;
10342 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
10343 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
10344 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10347 r[0].r_offset += 9 * 4;
10348 p = build_plt_stub (htab, stub_entry, p, offset, r);
10349 bfd_put_32 (obfd, BCTRL, p - 4);
10351 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10352 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
10353 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10354 bfd_put_32 (obfd, BLR, p), p += 4;
10359 static Elf_Internal_Rela *
10360 get_relocs (asection *sec, int count)
10362 Elf_Internal_Rela *relocs;
10363 struct bfd_elf_section_data *elfsec_data;
10365 elfsec_data = elf_section_data (sec);
10366 relocs = elfsec_data->relocs;
10367 if (relocs == NULL)
10369 bfd_size_type relsize;
10370 relsize = sec->reloc_count * sizeof (*relocs);
10371 relocs = bfd_alloc (sec->owner, relsize);
10372 if (relocs == NULL)
10374 elfsec_data->relocs = relocs;
10375 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10376 sizeof (Elf_Internal_Shdr));
10377 if (elfsec_data->rela.hdr == NULL)
10379 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10380 * sizeof (Elf64_External_Rela));
10381 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
10382 sec->reloc_count = 0;
10384 relocs += sec->reloc_count;
10385 sec->reloc_count += count;
10390 get_r2off (struct bfd_link_info *info,
10391 struct ppc_stub_hash_entry *stub_entry)
10393 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10394 bfd_vma r2off = htab->stub_group[stub_entry->target_section->id].toc_off;
10398 /* Support linking -R objects. Get the toc pointer from the
10401 if (!htab->opd_abi)
10403 asection *opd = stub_entry->h->elf.root.u.def.section;
10404 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
10406 if (strcmp (opd->name, ".opd") != 0
10407 || opd->reloc_count != 0)
10409 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%T'\n"),
10410 stub_entry->h->elf.root.root.string);
10411 bfd_set_error (bfd_error_bad_value);
10414 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
10416 r2off = bfd_get_64 (opd->owner, buf);
10417 r2off -= elf_gp (info->output_bfd);
10419 r2off -= htab->stub_group[stub_entry->id_sec->id].toc_off;
10424 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10426 struct ppc_stub_hash_entry *stub_entry;
10427 struct ppc_branch_hash_entry *br_entry;
10428 struct bfd_link_info *info;
10429 struct ppc_link_hash_table *htab;
10434 Elf_Internal_Rela *r;
10437 /* Massage our args to the form they really have. */
10438 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10441 htab = ppc_hash_table (info);
10445 /* Make a note of the offset within the stubs for this entry. */
10446 stub_entry->stub_offset = stub_entry->stub_sec->size;
10447 loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
10449 htab->stub_count[stub_entry->stub_type - 1] += 1;
10450 switch (stub_entry->stub_type)
10452 case ppc_stub_long_branch:
10453 case ppc_stub_long_branch_r2off:
10454 /* Branches are relative. This is where we are going to. */
10455 dest = (stub_entry->target_value
10456 + stub_entry->target_section->output_offset
10457 + stub_entry->target_section->output_section->vma);
10458 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10461 /* And this is where we are coming from. */
10462 off -= (stub_entry->stub_offset
10463 + stub_entry->stub_sec->output_offset
10464 + stub_entry->stub_sec->output_section->vma);
10467 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10469 bfd_vma r2off = get_r2off (info, stub_entry);
10473 htab->stub_error = TRUE;
10476 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
10479 if (PPC_HA (r2off) != 0)
10482 bfd_put_32 (htab->params->stub_bfd,
10483 ADDIS_R2_R2 | PPC_HA (r2off), loc);
10486 bfd_put_32 (htab->params->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
10490 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
10492 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10494 info->callbacks->einfo
10495 (_("%P: long branch stub `%s' offset overflow\n"),
10496 stub_entry->root.string);
10497 htab->stub_error = TRUE;
10501 if (info->emitrelocations)
10503 r = get_relocs (stub_entry->stub_sec, 1);
10506 r->r_offset = loc - stub_entry->stub_sec->contents;
10507 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
10508 r->r_addend = dest;
10509 if (stub_entry->h != NULL)
10511 struct elf_link_hash_entry **hashes;
10512 unsigned long symndx;
10513 struct ppc_link_hash_entry *h;
10515 hashes = elf_sym_hashes (htab->params->stub_bfd);
10516 if (hashes == NULL)
10518 bfd_size_type hsize;
10520 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
10521 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
10522 if (hashes == NULL)
10524 elf_sym_hashes (htab->params->stub_bfd) = hashes;
10525 htab->stub_globals = 1;
10527 symndx = htab->stub_globals++;
10529 hashes[symndx] = &h->elf;
10530 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
10531 if (h->oh != NULL && h->oh->is_func)
10532 h = ppc_follow_link (h->oh);
10533 if (h->elf.root.u.def.section != stub_entry->target_section)
10534 /* H is an opd symbol. The addend must be zero. */
10538 off = (h->elf.root.u.def.value
10539 + h->elf.root.u.def.section->output_offset
10540 + h->elf.root.u.def.section->output_section->vma);
10541 r->r_addend -= off;
10547 case ppc_stub_plt_branch:
10548 case ppc_stub_plt_branch_r2off:
10549 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10550 stub_entry->root.string + 9,
10552 if (br_entry == NULL)
10554 info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
10555 stub_entry->root.string);
10556 htab->stub_error = TRUE;
10560 dest = (stub_entry->target_value
10561 + stub_entry->target_section->output_offset
10562 + stub_entry->target_section->output_section->vma);
10563 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10564 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10566 bfd_put_64 (htab->brlt->owner, dest,
10567 htab->brlt->contents + br_entry->offset);
10569 if (br_entry->iter == htab->stub_iteration)
10571 br_entry->iter = 0;
10573 if (htab->relbrlt != NULL)
10575 /* Create a reloc for the branch lookup table entry. */
10576 Elf_Internal_Rela rela;
10579 rela.r_offset = (br_entry->offset
10580 + htab->brlt->output_offset
10581 + htab->brlt->output_section->vma);
10582 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10583 rela.r_addend = dest;
10585 rl = htab->relbrlt->contents;
10586 rl += (htab->relbrlt->reloc_count++
10587 * sizeof (Elf64_External_Rela));
10588 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
10590 else if (info->emitrelocations)
10592 r = get_relocs (htab->brlt, 1);
10595 /* brlt, being SEC_LINKER_CREATED does not go through the
10596 normal reloc processing. Symbols and offsets are not
10597 translated from input file to output file form, so
10598 set up the offset per the output file. */
10599 r->r_offset = (br_entry->offset
10600 + htab->brlt->output_offset
10601 + htab->brlt->output_section->vma);
10602 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10603 r->r_addend = dest;
10607 dest = (br_entry->offset
10608 + htab->brlt->output_offset
10609 + htab->brlt->output_section->vma);
10612 - elf_gp (htab->brlt->output_section->owner)
10613 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10615 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10617 info->callbacks->einfo
10618 (_("%P: linkage table error against `%T'\n"),
10619 stub_entry->root.string);
10620 bfd_set_error (bfd_error_bad_value);
10621 htab->stub_error = TRUE;
10625 if (info->emitrelocations)
10627 r = get_relocs (stub_entry->stub_sec, 1 + (PPC_HA (off) != 0));
10630 r[0].r_offset = loc - stub_entry->stub_sec->contents;
10631 if (bfd_big_endian (info->output_bfd))
10632 r[0].r_offset += 2;
10633 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
10634 r[0].r_offset += 4;
10635 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10636 r[0].r_addend = dest;
10637 if (PPC_HA (off) != 0)
10639 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10640 r[1].r_offset = r[0].r_offset + 4;
10641 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10642 r[1].r_addend = r[0].r_addend;
10646 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10648 if (PPC_HA (off) != 0)
10651 bfd_put_32 (htab->params->stub_bfd,
10652 ADDIS_R11_R2 | PPC_HA (off), loc);
10654 bfd_put_32 (htab->params->stub_bfd,
10655 LD_R12_0R11 | PPC_LO (off), loc);
10660 bfd_put_32 (htab->params->stub_bfd,
10661 LD_R12_0R2 | PPC_LO (off), loc);
10666 bfd_vma r2off = get_r2off (info, stub_entry);
10668 if (r2off == 0 && htab->opd_abi)
10670 htab->stub_error = TRUE;
10674 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
10677 if (PPC_HA (off) != 0)
10680 bfd_put_32 (htab->params->stub_bfd,
10681 ADDIS_R11_R2 | PPC_HA (off), loc);
10683 bfd_put_32 (htab->params->stub_bfd,
10684 LD_R12_0R11 | PPC_LO (off), loc);
10687 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
10689 if (PPC_HA (r2off) != 0)
10693 bfd_put_32 (htab->params->stub_bfd,
10694 ADDIS_R2_R2 | PPC_HA (r2off), loc);
10696 if (PPC_LO (r2off) != 0)
10700 bfd_put_32 (htab->params->stub_bfd,
10701 ADDI_R2_R2 | PPC_LO (r2off), loc);
10705 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, loc);
10707 bfd_put_32 (htab->params->stub_bfd, BCTR, loc);
10710 case ppc_stub_plt_call:
10711 case ppc_stub_plt_call_r2save:
10712 if (stub_entry->h != NULL
10713 && stub_entry->h->is_func_descriptor
10714 && stub_entry->h->oh != NULL)
10716 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
10718 /* If the old-ABI "dot-symbol" is undefined make it weak so
10719 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL.
10720 FIXME: We used to define the symbol on one of the call
10721 stubs instead, which is why we test symbol section id
10722 against htab->top_id in various places. Likely all
10723 these checks could now disappear. */
10724 if (fh->elf.root.type == bfd_link_hash_undefined)
10725 fh->elf.root.type = bfd_link_hash_undefweak;
10726 /* Stop undo_symbol_twiddle changing it back to undefined. */
10727 fh->was_undefined = 0;
10730 /* Now build the stub. */
10731 dest = stub_entry->plt_ent->plt.offset & ~1;
10732 if (dest >= (bfd_vma) -2)
10735 plt = htab->elf.splt;
10736 if (!htab->elf.dynamic_sections_created
10737 || stub_entry->h == NULL
10738 || stub_entry->h->elf.dynindx == -1)
10739 plt = htab->elf.iplt;
10741 dest += plt->output_offset + plt->output_section->vma;
10743 if (stub_entry->h == NULL
10744 && (stub_entry->plt_ent->plt.offset & 1) == 0)
10746 Elf_Internal_Rela rela;
10749 rela.r_offset = dest;
10751 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
10753 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
10754 rela.r_addend = (stub_entry->target_value
10755 + stub_entry->target_section->output_offset
10756 + stub_entry->target_section->output_section->vma);
10758 rl = (htab->elf.irelplt->contents
10759 + (htab->elf.irelplt->reloc_count++
10760 * sizeof (Elf64_External_Rela)));
10761 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
10762 stub_entry->plt_ent->plt.offset |= 1;
10766 - elf_gp (plt->output_section->owner)
10767 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10769 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10771 info->callbacks->einfo
10772 (_("%P: linkage table error against `%T'\n"),
10773 stub_entry->h != NULL
10774 ? stub_entry->h->elf.root.root.string
10776 bfd_set_error (bfd_error_bad_value);
10777 htab->stub_error = TRUE;
10781 if (htab->params->plt_stub_align != 0)
10783 unsigned pad = plt_stub_pad (htab, stub_entry, off);
10785 stub_entry->stub_sec->size += pad;
10786 stub_entry->stub_offset = stub_entry->stub_sec->size;
10791 if (info->emitrelocations)
10793 r = get_relocs (stub_entry->stub_sec,
10794 ((PPC_HA (off) != 0)
10796 ? 2 + (htab->params->plt_static_chain
10797 && PPC_HA (off + 16) == PPC_HA (off))
10801 r[0].r_offset = loc - stub_entry->stub_sec->contents;
10802 if (bfd_big_endian (info->output_bfd))
10803 r[0].r_offset += 2;
10804 r[0].r_addend = dest;
10806 if (stub_entry->h != NULL
10807 && (stub_entry->h == htab->tls_get_addr_fd
10808 || stub_entry->h == htab->tls_get_addr)
10809 && !htab->params->no_tls_get_addr_opt)
10810 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
10812 p = build_plt_stub (htab, stub_entry, loc, off, r);
10821 stub_entry->stub_sec->size += size;
10823 if (htab->params->emit_stub_syms)
10825 struct elf_link_hash_entry *h;
10828 const char *const stub_str[] = { "long_branch",
10829 "long_branch_r2off",
10831 "plt_branch_r2off",
10835 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
10836 len2 = strlen (stub_entry->root.string);
10837 name = bfd_malloc (len1 + len2 + 2);
10840 memcpy (name, stub_entry->root.string, 9);
10841 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
10842 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
10843 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
10846 if (h->root.type == bfd_link_hash_new)
10848 h->root.type = bfd_link_hash_defined;
10849 h->root.u.def.section = stub_entry->stub_sec;
10850 h->root.u.def.value = stub_entry->stub_offset;
10851 h->ref_regular = 1;
10852 h->def_regular = 1;
10853 h->ref_regular_nonweak = 1;
10854 h->forced_local = 1;
10862 /* As above, but don't actually build the stub. Just bump offset so
10863 we know stub section sizes, and select plt_branch stubs where
10864 long_branch stubs won't do. */
10867 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10869 struct ppc_stub_hash_entry *stub_entry;
10870 struct bfd_link_info *info;
10871 struct ppc_link_hash_table *htab;
10875 /* Massage our args to the form they really have. */
10876 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10879 htab = ppc_hash_table (info);
10883 if (stub_entry->stub_type == ppc_stub_plt_call
10884 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10887 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
10888 if (off >= (bfd_vma) -2)
10890 plt = htab->elf.splt;
10891 if (!htab->elf.dynamic_sections_created
10892 || stub_entry->h == NULL
10893 || stub_entry->h->elf.dynindx == -1)
10894 plt = htab->elf.iplt;
10895 off += (plt->output_offset
10896 + plt->output_section->vma
10897 - elf_gp (plt->output_section->owner)
10898 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10900 size = plt_stub_size (htab, stub_entry, off);
10901 if (htab->params->plt_stub_align)
10902 size += plt_stub_pad (htab, stub_entry, off);
10903 if (info->emitrelocations)
10905 stub_entry->stub_sec->reloc_count
10906 += ((PPC_HA (off) != 0)
10908 ? 2 + (htab->params->plt_static_chain
10909 && PPC_HA (off + 16) == PPC_HA (off))
10911 stub_entry->stub_sec->flags |= SEC_RELOC;
10916 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
10919 bfd_vma local_off = 0;
10921 off = (stub_entry->target_value
10922 + stub_entry->target_section->output_offset
10923 + stub_entry->target_section->output_section->vma);
10924 off -= (stub_entry->stub_sec->size
10925 + stub_entry->stub_sec->output_offset
10926 + stub_entry->stub_sec->output_section->vma);
10928 /* Reset the stub type from the plt variant in case we now
10929 can reach with a shorter stub. */
10930 if (stub_entry->stub_type >= ppc_stub_plt_branch)
10931 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
10934 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10936 r2off = get_r2off (info, stub_entry);
10937 if (r2off == 0 && htab->opd_abi)
10939 htab->stub_error = TRUE;
10943 if (PPC_HA (r2off) != 0)
10948 local_off = PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10950 /* If the branch offset if too big, use a ppc_stub_plt_branch.
10951 Do the same for -R objects without function descriptors. */
10952 if (off + (1 << 25) >= (bfd_vma) (1 << 26) - local_off
10953 || (stub_entry->stub_type == ppc_stub_long_branch_r2off
10956 struct ppc_branch_hash_entry *br_entry;
10958 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10959 stub_entry->root.string + 9,
10961 if (br_entry == NULL)
10963 info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
10964 stub_entry->root.string);
10965 htab->stub_error = TRUE;
10969 if (br_entry->iter != htab->stub_iteration)
10971 br_entry->iter = htab->stub_iteration;
10972 br_entry->offset = htab->brlt->size;
10973 htab->brlt->size += 8;
10975 if (htab->relbrlt != NULL)
10976 htab->relbrlt->size += sizeof (Elf64_External_Rela);
10977 else if (info->emitrelocations)
10979 htab->brlt->reloc_count += 1;
10980 htab->brlt->flags |= SEC_RELOC;
10984 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
10985 off = (br_entry->offset
10986 + htab->brlt->output_offset
10987 + htab->brlt->output_section->vma
10988 - elf_gp (htab->brlt->output_section->owner)
10989 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10991 if (info->emitrelocations)
10993 stub_entry->stub_sec->reloc_count += 1 + (PPC_HA (off) != 0);
10994 stub_entry->stub_sec->flags |= SEC_RELOC;
10997 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11000 if (PPC_HA (off) != 0)
11006 if (PPC_HA (off) != 0)
11009 if (PPC_HA (r2off) != 0)
11011 if (PPC_LO (r2off) != 0)
11015 else if (info->emitrelocations)
11017 stub_entry->stub_sec->reloc_count += 1;
11018 stub_entry->stub_sec->flags |= SEC_RELOC;
11022 stub_entry->stub_sec->size += size;
11026 /* Set up various things so that we can make a list of input sections
11027 for each output section included in the link. Returns -1 on error,
11028 0 when no stubs will be needed, and 1 on success. */
11031 ppc64_elf_setup_section_lists (struct bfd_link_info *info)
11034 int top_id, top_index, id;
11036 asection **input_list;
11038 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11043 /* Find the top input section id. */
11044 for (input_bfd = info->input_bfds, top_id = 3;
11046 input_bfd = input_bfd->link_next)
11048 for (section = input_bfd->sections;
11050 section = section->next)
11052 if (top_id < section->id)
11053 top_id = section->id;
11057 htab->top_id = top_id;
11058 amt = sizeof (struct map_stub) * (top_id + 1);
11059 htab->stub_group = bfd_zmalloc (amt);
11060 if (htab->stub_group == NULL)
11063 /* Set toc_off for com, und, abs and ind sections. */
11064 for (id = 0; id < 3; id++)
11065 htab->stub_group[id].toc_off = TOC_BASE_OFF;
11067 /* We can't use output_bfd->section_count here to find the top output
11068 section index as some sections may have been removed, and
11069 strip_excluded_output_sections doesn't renumber the indices. */
11070 for (section = info->output_bfd->sections, top_index = 0;
11072 section = section->next)
11074 if (top_index < section->index)
11075 top_index = section->index;
11078 htab->top_index = top_index;
11079 amt = sizeof (asection *) * (top_index + 1);
11080 input_list = bfd_zmalloc (amt);
11081 htab->input_list = input_list;
11082 if (input_list == NULL)
11088 /* Set up for first pass at multitoc partitioning. */
11091 ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11093 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11095 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
11096 htab->toc_bfd = NULL;
11097 htab->toc_first_sec = NULL;
11100 /* The linker repeatedly calls this function for each TOC input section
11101 and linker generated GOT section. Group input bfds such that the toc
11102 within a group is less than 64k in size. */
11105 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
11107 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11108 bfd_vma addr, off, limit;
11113 if (!htab->second_toc_pass)
11115 /* Keep track of the first .toc or .got section for this input bfd. */
11116 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11120 htab->toc_bfd = isec->owner;
11121 htab->toc_first_sec = isec;
11124 addr = isec->output_offset + isec->output_section->vma;
11125 off = addr - htab->toc_curr;
11126 limit = 0x80008000;
11127 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
11129 if (off + isec->size > limit)
11131 addr = (htab->toc_first_sec->output_offset
11132 + htab->toc_first_sec->output_section->vma);
11133 htab->toc_curr = addr;
11136 /* toc_curr is the base address of this toc group. Set elf_gp
11137 for the input section to be the offset relative to the
11138 output toc base plus 0x8000. Making the input elf_gp an
11139 offset allows us to move the toc as a whole without
11140 recalculating input elf_gp. */
11141 off = htab->toc_curr - elf_gp (isec->output_section->owner);
11142 off += TOC_BASE_OFF;
11144 /* Die if someone uses a linker script that doesn't keep input
11145 file .toc and .got together. */
11147 && elf_gp (isec->owner) != 0
11148 && elf_gp (isec->owner) != off)
11151 elf_gp (isec->owner) = off;
11155 /* During the second pass toc_first_sec points to the start of
11156 a toc group, and toc_curr is used to track the old elf_gp.
11157 We use toc_bfd to ensure we only look at each bfd once. */
11158 if (htab->toc_bfd == isec->owner)
11160 htab->toc_bfd = isec->owner;
11162 if (htab->toc_first_sec == NULL
11163 || htab->toc_curr != elf_gp (isec->owner))
11165 htab->toc_curr = elf_gp (isec->owner);
11166 htab->toc_first_sec = isec;
11168 addr = (htab->toc_first_sec->output_offset
11169 + htab->toc_first_sec->output_section->vma);
11170 off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
11171 elf_gp (isec->owner) = off;
11176 /* Called via elf_link_hash_traverse to merge GOT entries for global
11180 merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11182 if (h->root.type == bfd_link_hash_indirect)
11185 merge_got_entries (&h->got.glist);
11190 /* Called via elf_link_hash_traverse to allocate GOT entries for global
11194 reallocate_got (struct elf_link_hash_entry *h, void *inf)
11196 struct got_entry *gent;
11198 if (h->root.type == bfd_link_hash_indirect)
11201 for (gent = h->got.glist; gent != NULL; gent = gent->next)
11202 if (!gent->is_indirect)
11203 allocate_got (h, (struct bfd_link_info *) inf, gent);
11207 /* Called on the first multitoc pass after the last call to
11208 ppc64_elf_next_toc_section. This function removes duplicate GOT
11212 ppc64_elf_layout_multitoc (struct bfd_link_info *info)
11214 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11215 struct bfd *ibfd, *ibfd2;
11216 bfd_boolean done_something;
11218 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
11220 if (!htab->do_multi_toc)
11223 /* Merge global sym got entries within a toc group. */
11224 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
11226 /* And tlsld_got. */
11227 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11229 struct got_entry *ent, *ent2;
11231 if (!is_ppc64_elf (ibfd))
11234 ent = ppc64_tlsld_got (ibfd);
11235 if (!ent->is_indirect
11236 && ent->got.offset != (bfd_vma) -1)
11238 for (ibfd2 = ibfd->link_next; ibfd2 != NULL; ibfd2 = ibfd2->link_next)
11240 if (!is_ppc64_elf (ibfd2))
11243 ent2 = ppc64_tlsld_got (ibfd2);
11244 if (!ent2->is_indirect
11245 && ent2->got.offset != (bfd_vma) -1
11246 && elf_gp (ibfd2) == elf_gp (ibfd))
11248 ent2->is_indirect = TRUE;
11249 ent2->got.ent = ent;
11255 /* Zap sizes of got sections. */
11256 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
11257 htab->elf.irelplt->size -= htab->got_reli_size;
11258 htab->got_reli_size = 0;
11260 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11262 asection *got, *relgot;
11264 if (!is_ppc64_elf (ibfd))
11267 got = ppc64_elf_tdata (ibfd)->got;
11270 got->rawsize = got->size;
11272 relgot = ppc64_elf_tdata (ibfd)->relgot;
11273 relgot->rawsize = relgot->size;
11278 /* Now reallocate the got, local syms first. We don't need to
11279 allocate section contents again since we never increase size. */
11280 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11282 struct got_entry **lgot_ents;
11283 struct got_entry **end_lgot_ents;
11284 struct plt_entry **local_plt;
11285 struct plt_entry **end_local_plt;
11286 unsigned char *lgot_masks;
11287 bfd_size_type locsymcount;
11288 Elf_Internal_Shdr *symtab_hdr;
11291 if (!is_ppc64_elf (ibfd))
11294 lgot_ents = elf_local_got_ents (ibfd);
11298 symtab_hdr = &elf_symtab_hdr (ibfd);
11299 locsymcount = symtab_hdr->sh_info;
11300 end_lgot_ents = lgot_ents + locsymcount;
11301 local_plt = (struct plt_entry **) end_lgot_ents;
11302 end_local_plt = local_plt + locsymcount;
11303 lgot_masks = (unsigned char *) end_local_plt;
11304 s = ppc64_elf_tdata (ibfd)->got;
11305 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11307 struct got_entry *ent;
11309 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
11311 unsigned int ent_size = 8;
11312 unsigned int rel_size = sizeof (Elf64_External_Rela);
11314 ent->got.offset = s->size;
11315 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
11320 s->size += ent_size;
11321 if ((*lgot_masks & PLT_IFUNC) != 0)
11323 htab->elf.irelplt->size += rel_size;
11324 htab->got_reli_size += rel_size;
11326 else if (info->shared)
11328 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11329 srel->size += rel_size;
11335 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
11337 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11339 struct got_entry *ent;
11341 if (!is_ppc64_elf (ibfd))
11344 ent = ppc64_tlsld_got (ibfd);
11345 if (!ent->is_indirect
11346 && ent->got.offset != (bfd_vma) -1)
11348 asection *s = ppc64_elf_tdata (ibfd)->got;
11349 ent->got.offset = s->size;
11353 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11354 srel->size += sizeof (Elf64_External_Rela);
11359 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
11360 if (!done_something)
11361 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11365 if (!is_ppc64_elf (ibfd))
11368 got = ppc64_elf_tdata (ibfd)->got;
11371 done_something = got->rawsize != got->size;
11372 if (done_something)
11377 if (done_something)
11378 (*htab->params->layout_sections_again) ();
11380 /* Set up for second pass over toc sections to recalculate elf_gp
11381 on input sections. */
11382 htab->toc_bfd = NULL;
11383 htab->toc_first_sec = NULL;
11384 htab->second_toc_pass = TRUE;
11385 return done_something;
11388 /* Called after second pass of multitoc partitioning. */
11391 ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
11393 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11395 /* After the second pass, toc_curr tracks the TOC offset used
11396 for code sections below in ppc64_elf_next_input_section. */
11397 htab->toc_curr = TOC_BASE_OFF;
11400 /* No toc references were found in ISEC. If the code in ISEC makes no
11401 calls, then there's no need to use toc adjusting stubs when branching
11402 into ISEC. Actually, indirect calls from ISEC are OK as they will
11403 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11404 needed, and 2 if a cyclical call-graph was found but no other reason
11405 for a stub was detected. If called from the top level, a return of
11406 2 means the same as a return of 0. */
11409 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
11413 /* Mark this section as checked. */
11414 isec->call_check_done = 1;
11416 /* We know none of our code bearing sections will need toc stubs. */
11417 if ((isec->flags & SEC_LINKER_CREATED) != 0)
11420 if (isec->size == 0)
11423 if (isec->output_section == NULL)
11427 if (isec->reloc_count != 0)
11429 Elf_Internal_Rela *relstart, *rel;
11430 Elf_Internal_Sym *local_syms;
11431 struct ppc_link_hash_table *htab;
11433 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
11434 info->keep_memory);
11435 if (relstart == NULL)
11438 /* Look for branches to outside of this section. */
11440 htab = ppc_hash_table (info);
11444 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
11446 enum elf_ppc64_reloc_type r_type;
11447 unsigned long r_symndx;
11448 struct elf_link_hash_entry *h;
11449 struct ppc_link_hash_entry *eh;
11450 Elf_Internal_Sym *sym;
11452 struct _opd_sec_data *opd;
11456 r_type = ELF64_R_TYPE (rel->r_info);
11457 if (r_type != R_PPC64_REL24
11458 && r_type != R_PPC64_REL14
11459 && r_type != R_PPC64_REL14_BRTAKEN
11460 && r_type != R_PPC64_REL14_BRNTAKEN)
11463 r_symndx = ELF64_R_SYM (rel->r_info);
11464 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
11471 /* Calls to dynamic lib functions go through a plt call stub
11473 eh = (struct ppc_link_hash_entry *) h;
11475 && (eh->elf.plt.plist != NULL
11477 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
11483 if (sym_sec == NULL)
11484 /* Ignore other undefined symbols. */
11487 /* Assume branches to other sections not included in the
11488 link need stubs too, to cover -R and absolute syms. */
11489 if (sym_sec->output_section == NULL)
11496 sym_value = sym->st_value;
11499 if (h->root.type != bfd_link_hash_defined
11500 && h->root.type != bfd_link_hash_defweak)
11502 sym_value = h->root.u.def.value;
11504 sym_value += rel->r_addend;
11506 /* If this branch reloc uses an opd sym, find the code section. */
11507 opd = get_opd_info (sym_sec);
11510 if (h == NULL && opd->adjust != NULL)
11514 adjust = opd->adjust[sym->st_value / 8];
11516 /* Assume deleted functions won't ever be called. */
11518 sym_value += adjust;
11521 dest = opd_entry_value (sym_sec, sym_value,
11522 &sym_sec, NULL, FALSE);
11523 if (dest == (bfd_vma) -1)
11528 + sym_sec->output_offset
11529 + sym_sec->output_section->vma);
11531 /* Ignore branch to self. */
11532 if (sym_sec == isec)
11535 /* If the called function uses the toc, we need a stub. */
11536 if (sym_sec->has_toc_reloc
11537 || sym_sec->makes_toc_func_call)
11543 /* Assume any branch that needs a long branch stub might in fact
11544 need a plt_branch stub. A plt_branch stub uses r2. */
11545 else if (dest - (isec->output_offset
11546 + isec->output_section->vma
11547 + rel->r_offset) + (1 << 25)
11548 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
11556 /* If calling back to a section in the process of being
11557 tested, we can't say for sure that no toc adjusting stubs
11558 are needed, so don't return zero. */
11559 else if (sym_sec->call_check_in_progress)
11562 /* Branches to another section that itself doesn't have any TOC
11563 references are OK. Recursively call ourselves to check. */
11564 else if (!sym_sec->call_check_done)
11568 /* Mark current section as indeterminate, so that other
11569 sections that call back to current won't be marked as
11571 isec->call_check_in_progress = 1;
11572 recur = toc_adjusting_stub_needed (info, sym_sec);
11573 isec->call_check_in_progress = 0;
11584 if (local_syms != NULL
11585 && (elf_symtab_hdr (isec->owner).contents
11586 != (unsigned char *) local_syms))
11588 if (elf_section_data (isec)->relocs != relstart)
11593 && isec->map_head.s != NULL
11594 && (strcmp (isec->output_section->name, ".init") == 0
11595 || strcmp (isec->output_section->name, ".fini") == 0))
11597 if (isec->map_head.s->has_toc_reloc
11598 || isec->map_head.s->makes_toc_func_call)
11600 else if (!isec->map_head.s->call_check_done)
11603 isec->call_check_in_progress = 1;
11604 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
11605 isec->call_check_in_progress = 0;
11612 isec->makes_toc_func_call = 1;
11617 /* The linker repeatedly calls this function for each input section,
11618 in the order that input sections are linked into output sections.
11619 Build lists of input sections to determine groupings between which
11620 we may insert linker stubs. */
11623 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
11625 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11630 if ((isec->output_section->flags & SEC_CODE) != 0
11631 && isec->output_section->index <= htab->top_index)
11633 asection **list = htab->input_list + isec->output_section->index;
11634 /* Steal the link_sec pointer for our list. */
11635 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
11636 /* This happens to make the list in reverse order,
11637 which is what we want. */
11638 PREV_SEC (isec) = *list;
11642 if (htab->multi_toc_needed)
11644 /* Analyse sections that aren't already flagged as needing a
11645 valid toc pointer. Exclude .fixup for the linux kernel.
11646 .fixup contains branches, but only back to the function that
11647 hit an exception. */
11648 if (!(isec->has_toc_reloc
11649 || (isec->flags & SEC_CODE) == 0
11650 || strcmp (isec->name, ".fixup") == 0
11651 || isec->call_check_done))
11653 if (toc_adjusting_stub_needed (info, isec) < 0)
11656 /* Make all sections use the TOC assigned for this object file.
11657 This will be wrong for pasted sections; We fix that in
11658 check_pasted_section(). */
11659 if (elf_gp (isec->owner) != 0)
11660 htab->toc_curr = elf_gp (isec->owner);
11663 htab->stub_group[isec->id].toc_off = htab->toc_curr;
11667 /* Check that all .init and .fini sections use the same toc, if they
11668 have toc relocs. */
11671 check_pasted_section (struct bfd_link_info *info, const char *name)
11673 asection *o = bfd_get_section_by_name (info->output_bfd, name);
11677 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11678 bfd_vma toc_off = 0;
11681 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11682 if (i->has_toc_reloc)
11685 toc_off = htab->stub_group[i->id].toc_off;
11686 else if (toc_off != htab->stub_group[i->id].toc_off)
11691 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11692 if (i->makes_toc_func_call)
11694 toc_off = htab->stub_group[i->id].toc_off;
11698 /* Make sure the whole pasted function uses the same toc offset. */
11700 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11701 htab->stub_group[i->id].toc_off = toc_off;
11707 ppc64_elf_check_init_fini (struct bfd_link_info *info)
11709 return (check_pasted_section (info, ".init")
11710 & check_pasted_section (info, ".fini"));
11713 /* See whether we can group stub sections together. Grouping stub
11714 sections may result in fewer stubs. More importantly, we need to
11715 put all .init* and .fini* stubs at the beginning of the .init or
11716 .fini output sections respectively, because glibc splits the
11717 _init and _fini functions into multiple parts. Putting a stub in
11718 the middle of a function is not a good idea. */
11721 group_sections (struct ppc_link_hash_table *htab,
11722 bfd_size_type stub_group_size,
11723 bfd_boolean stubs_always_before_branch)
11726 bfd_size_type stub14_group_size;
11727 bfd_boolean suppress_size_errors;
11729 suppress_size_errors = FALSE;
11730 stub14_group_size = stub_group_size;
11731 if (stub_group_size == 1)
11733 /* Default values. */
11734 if (stubs_always_before_branch)
11736 stub_group_size = 0x1e00000;
11737 stub14_group_size = 0x7800;
11741 stub_group_size = 0x1c00000;
11742 stub14_group_size = 0x7000;
11744 suppress_size_errors = TRUE;
11747 list = htab->input_list + htab->top_index;
11750 asection *tail = *list;
11751 while (tail != NULL)
11755 bfd_size_type total;
11756 bfd_boolean big_sec;
11760 total = tail->size;
11761 big_sec = total > (ppc64_elf_section_data (tail) != NULL
11762 && ppc64_elf_section_data (tail)->has_14bit_branch
11763 ? stub14_group_size : stub_group_size);
11764 if (big_sec && !suppress_size_errors)
11765 (*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
11766 tail->owner, tail);
11767 curr_toc = htab->stub_group[tail->id].toc_off;
11769 while ((prev = PREV_SEC (curr)) != NULL
11770 && ((total += curr->output_offset - prev->output_offset)
11771 < (ppc64_elf_section_data (prev) != NULL
11772 && ppc64_elf_section_data (prev)->has_14bit_branch
11773 ? stub14_group_size : stub_group_size))
11774 && htab->stub_group[prev->id].toc_off == curr_toc)
11777 /* OK, the size from the start of CURR to the end is less
11778 than stub_group_size and thus can be handled by one stub
11779 section. (or the tail section is itself larger than
11780 stub_group_size, in which case we may be toast.) We
11781 should really be keeping track of the total size of stubs
11782 added here, as stubs contribute to the final output
11783 section size. That's a little tricky, and this way will
11784 only break if stubs added make the total size more than
11785 2^25, ie. for the default stub_group_size, if stubs total
11786 more than 2097152 bytes, or nearly 75000 plt call stubs. */
11789 prev = PREV_SEC (tail);
11790 /* Set up this stub group. */
11791 htab->stub_group[tail->id].link_sec = curr;
11793 while (tail != curr && (tail = prev) != NULL);
11795 /* But wait, there's more! Input sections up to stub_group_size
11796 bytes before the stub section can be handled by it too.
11797 Don't do this if we have a really large section after the
11798 stubs, as adding more stubs increases the chance that
11799 branches may not reach into the stub section. */
11800 if (!stubs_always_before_branch && !big_sec)
11803 while (prev != NULL
11804 && ((total += tail->output_offset - prev->output_offset)
11805 < (ppc64_elf_section_data (prev) != NULL
11806 && ppc64_elf_section_data (prev)->has_14bit_branch
11807 ? stub14_group_size : stub_group_size))
11808 && htab->stub_group[prev->id].toc_off == curr_toc)
11811 prev = PREV_SEC (tail);
11812 htab->stub_group[tail->id].link_sec = curr;
11818 while (list-- != htab->input_list);
11819 free (htab->input_list);
11823 static const unsigned char glink_eh_frame_cie[] =
11825 0, 0, 0, 16, /* length. */
11826 0, 0, 0, 0, /* id. */
11827 1, /* CIE version. */
11828 'z', 'R', 0, /* Augmentation string. */
11829 4, /* Code alignment. */
11830 0x78, /* Data alignment. */
11832 1, /* Augmentation size. */
11833 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
11834 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
11837 /* Stripping output sections is normally done before dynamic section
11838 symbols have been allocated. This function is called later, and
11839 handles cases like htab->brlt which is mapped to its own output
11843 maybe_strip_output (struct bfd_link_info *info, asection *isec)
11845 if (isec->size == 0
11846 && isec->output_section->size == 0
11847 && !(isec->output_section->flags & SEC_KEEP)
11848 && !bfd_section_removed_from_list (info->output_bfd,
11849 isec->output_section)
11850 && elf_section_data (isec->output_section)->dynindx == 0)
11852 isec->output_section->flags |= SEC_EXCLUDE;
11853 bfd_section_list_remove (info->output_bfd, isec->output_section);
11854 info->output_bfd->section_count--;
11858 /* Determine and set the size of the stub section for a final link.
11860 The basic idea here is to examine all the relocations looking for
11861 PC-relative calls to a target that is unreachable with a "bl"
11865 ppc64_elf_size_stubs (struct bfd_link_info *info)
11867 bfd_size_type stub_group_size;
11868 bfd_boolean stubs_always_before_branch;
11869 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11874 if (htab->params->plt_thread_safe == -1 && !info->executable)
11875 htab->params->plt_thread_safe = 1;
11876 if (!htab->opd_abi)
11877 htab->params->plt_thread_safe = 0;
11878 else if (htab->params->plt_thread_safe == -1)
11880 static const char *const thread_starter[] =
11884 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
11886 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
11887 "mq_notify", "create_timer",
11891 "GOMP_parallel_start",
11892 "GOMP_parallel_loop_static_start",
11893 "GOMP_parallel_loop_dynamic_start",
11894 "GOMP_parallel_loop_guided_start",
11895 "GOMP_parallel_loop_runtime_start",
11896 "GOMP_parallel_sections_start",
11900 for (i = 0; i < sizeof (thread_starter)/ sizeof (thread_starter[0]); i++)
11902 struct elf_link_hash_entry *h;
11903 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
11904 FALSE, FALSE, TRUE);
11905 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
11906 if (htab->params->plt_thread_safe)
11910 stubs_always_before_branch = htab->params->group_size < 0;
11911 if (htab->params->group_size < 0)
11912 stub_group_size = -htab->params->group_size;
11914 stub_group_size = htab->params->group_size;
11916 group_sections (htab, stub_group_size, stubs_always_before_branch);
11921 unsigned int bfd_indx;
11922 asection *stub_sec;
11924 htab->stub_iteration += 1;
11926 for (input_bfd = info->input_bfds, bfd_indx = 0;
11928 input_bfd = input_bfd->link_next, bfd_indx++)
11930 Elf_Internal_Shdr *symtab_hdr;
11932 Elf_Internal_Sym *local_syms = NULL;
11934 if (!is_ppc64_elf (input_bfd))
11937 /* We'll need the symbol table in a second. */
11938 symtab_hdr = &elf_symtab_hdr (input_bfd);
11939 if (symtab_hdr->sh_info == 0)
11942 /* Walk over each section attached to the input bfd. */
11943 for (section = input_bfd->sections;
11945 section = section->next)
11947 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
11949 /* If there aren't any relocs, then there's nothing more
11951 if ((section->flags & SEC_RELOC) == 0
11952 || (section->flags & SEC_ALLOC) == 0
11953 || (section->flags & SEC_LOAD) == 0
11954 || (section->flags & SEC_CODE) == 0
11955 || section->reloc_count == 0)
11958 /* If this section is a link-once section that will be
11959 discarded, then don't create any stubs. */
11960 if (section->output_section == NULL
11961 || section->output_section->owner != info->output_bfd)
11964 /* Get the relocs. */
11966 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
11967 info->keep_memory);
11968 if (internal_relocs == NULL)
11969 goto error_ret_free_local;
11971 /* Now examine each relocation. */
11972 irela = internal_relocs;
11973 irelaend = irela + section->reloc_count;
11974 for (; irela < irelaend; irela++)
11976 enum elf_ppc64_reloc_type r_type;
11977 unsigned int r_indx;
11978 enum ppc_stub_type stub_type;
11979 struct ppc_stub_hash_entry *stub_entry;
11980 asection *sym_sec, *code_sec;
11981 bfd_vma sym_value, code_value;
11982 bfd_vma destination;
11983 unsigned long local_off;
11984 bfd_boolean ok_dest;
11985 struct ppc_link_hash_entry *hash;
11986 struct ppc_link_hash_entry *fdh;
11987 struct elf_link_hash_entry *h;
11988 Elf_Internal_Sym *sym;
11990 const asection *id_sec;
11991 struct _opd_sec_data *opd;
11992 struct plt_entry *plt_ent;
11994 r_type = ELF64_R_TYPE (irela->r_info);
11995 r_indx = ELF64_R_SYM (irela->r_info);
11997 if (r_type >= R_PPC64_max)
11999 bfd_set_error (bfd_error_bad_value);
12000 goto error_ret_free_internal;
12003 /* Only look for stubs on branch instructions. */
12004 if (r_type != R_PPC64_REL24
12005 && r_type != R_PPC64_REL14
12006 && r_type != R_PPC64_REL14_BRTAKEN
12007 && r_type != R_PPC64_REL14_BRNTAKEN)
12010 /* Now determine the call target, its name, value,
12012 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12013 r_indx, input_bfd))
12014 goto error_ret_free_internal;
12015 hash = (struct ppc_link_hash_entry *) h;
12022 sym_value = sym->st_value;
12025 else if (hash->elf.root.type == bfd_link_hash_defined
12026 || hash->elf.root.type == bfd_link_hash_defweak)
12028 sym_value = hash->elf.root.u.def.value;
12029 if (sym_sec->output_section != NULL)
12032 else if (hash->elf.root.type == bfd_link_hash_undefweak
12033 || hash->elf.root.type == bfd_link_hash_undefined)
12035 /* Recognise an old ABI func code entry sym, and
12036 use the func descriptor sym instead if it is
12038 if (hash->elf.root.root.string[0] == '.'
12039 && (fdh = lookup_fdh (hash, htab)) != NULL)
12041 if (fdh->elf.root.type == bfd_link_hash_defined
12042 || fdh->elf.root.type == bfd_link_hash_defweak)
12044 sym_sec = fdh->elf.root.u.def.section;
12045 sym_value = fdh->elf.root.u.def.value;
12046 if (sym_sec->output_section != NULL)
12055 bfd_set_error (bfd_error_bad_value);
12056 goto error_ret_free_internal;
12063 sym_value += irela->r_addend;
12064 destination = (sym_value
12065 + sym_sec->output_offset
12066 + sym_sec->output_section->vma);
12067 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12072 code_sec = sym_sec;
12073 code_value = sym_value;
12074 opd = get_opd_info (sym_sec);
12079 if (hash == NULL && opd->adjust != NULL)
12081 long adjust = opd->adjust[sym_value / 8];
12084 code_value += adjust;
12085 sym_value += adjust;
12087 dest = opd_entry_value (sym_sec, sym_value,
12088 &code_sec, &code_value, FALSE);
12089 if (dest != (bfd_vma) -1)
12091 destination = dest;
12094 /* Fixup old ABI sym to point at code
12096 hash->elf.root.type = bfd_link_hash_defweak;
12097 hash->elf.root.u.def.section = code_sec;
12098 hash->elf.root.u.def.value = code_value;
12103 /* Determine what (if any) linker stub is needed. */
12105 stub_type = ppc_type_of_stub (section, irela, &hash,
12106 &plt_ent, destination,
12109 if (stub_type != ppc_stub_plt_call)
12111 /* Check whether we need a TOC adjusting stub.
12112 Since the linker pastes together pieces from
12113 different object files when creating the
12114 _init and _fini functions, it may be that a
12115 call to what looks like a local sym is in
12116 fact a call needing a TOC adjustment. */
12117 if (code_sec != NULL
12118 && code_sec->output_section != NULL
12119 && (htab->stub_group[code_sec->id].toc_off
12120 != htab->stub_group[section->id].toc_off)
12121 && (code_sec->has_toc_reloc
12122 || code_sec->makes_toc_func_call))
12123 stub_type = ppc_stub_long_branch_r2off;
12126 if (stub_type == ppc_stub_none)
12129 /* __tls_get_addr calls might be eliminated. */
12130 if (stub_type != ppc_stub_plt_call
12132 && (hash == htab->tls_get_addr
12133 || hash == htab->tls_get_addr_fd)
12134 && section->has_tls_reloc
12135 && irela != internal_relocs)
12137 /* Get tls info. */
12138 unsigned char *tls_mask;
12140 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
12141 irela - 1, input_bfd))
12142 goto error_ret_free_internal;
12143 if (*tls_mask != 0)
12147 if (stub_type == ppc_stub_plt_call
12148 && irela + 1 < irelaend
12149 && irela[1].r_offset == irela->r_offset + 4
12150 && ELF64_R_TYPE (irela[1].r_info) == R_PPC64_TOCSAVE)
12152 if (!tocsave_find (htab, INSERT,
12153 &local_syms, irela + 1, input_bfd))
12154 goto error_ret_free_internal;
12156 else if (stub_type == ppc_stub_plt_call)
12157 stub_type = ppc_stub_plt_call_r2save;
12159 /* Support for grouping stub sections. */
12160 id_sec = htab->stub_group[section->id].link_sec;
12162 /* Get the name of this stub. */
12163 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
12165 goto error_ret_free_internal;
12167 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
12168 stub_name, FALSE, FALSE);
12169 if (stub_entry != NULL)
12171 /* The proper stub has already been created. */
12173 if (stub_type == ppc_stub_plt_call_r2save)
12174 stub_entry->stub_type = stub_type;
12178 stub_entry = ppc_add_stub (stub_name, section, info);
12179 if (stub_entry == NULL)
12182 error_ret_free_internal:
12183 if (elf_section_data (section)->relocs == NULL)
12184 free (internal_relocs);
12185 error_ret_free_local:
12186 if (local_syms != NULL
12187 && (symtab_hdr->contents
12188 != (unsigned char *) local_syms))
12193 stub_entry->stub_type = stub_type;
12194 if (stub_type != ppc_stub_plt_call
12195 && stub_type != ppc_stub_plt_call_r2save)
12197 stub_entry->target_value = code_value;
12198 stub_entry->target_section = code_sec;
12202 stub_entry->target_value = sym_value;
12203 stub_entry->target_section = sym_sec;
12205 stub_entry->h = hash;
12206 stub_entry->plt_ent = plt_ent;
12207 stub_entry->other = hash ? hash->elf.other : sym->st_other;
12209 if (stub_entry->h != NULL)
12210 htab->stub_globals += 1;
12213 /* We're done with the internal relocs, free them. */
12214 if (elf_section_data (section)->relocs != internal_relocs)
12215 free (internal_relocs);
12218 if (local_syms != NULL
12219 && symtab_hdr->contents != (unsigned char *) local_syms)
12221 if (!info->keep_memory)
12224 symtab_hdr->contents = (unsigned char *) local_syms;
12228 /* We may have added some stubs. Find out the new size of the
12230 for (stub_sec = htab->params->stub_bfd->sections;
12232 stub_sec = stub_sec->next)
12233 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12235 stub_sec->rawsize = stub_sec->size;
12236 stub_sec->size = 0;
12237 stub_sec->reloc_count = 0;
12238 stub_sec->flags &= ~SEC_RELOC;
12241 htab->brlt->size = 0;
12242 htab->brlt->reloc_count = 0;
12243 htab->brlt->flags &= ~SEC_RELOC;
12244 if (htab->relbrlt != NULL)
12245 htab->relbrlt->size = 0;
12247 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
12249 if (info->emitrelocations
12250 && htab->glink != NULL && htab->glink->size != 0)
12252 htab->glink->reloc_count = 1;
12253 htab->glink->flags |= SEC_RELOC;
12256 if (htab->glink_eh_frame != NULL
12257 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
12258 && htab->glink_eh_frame->output_section->size != 0)
12260 size_t size = 0, align;
12262 for (stub_sec = htab->params->stub_bfd->sections;
12264 stub_sec = stub_sec->next)
12265 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12267 if (htab->glink != NULL && htab->glink->size != 0)
12270 size += sizeof (glink_eh_frame_cie);
12272 align <<= htab->glink_eh_frame->output_section->alignment_power;
12274 size = (size + align) & ~align;
12275 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12276 htab->glink_eh_frame->size = size;
12279 if (htab->params->plt_stub_align != 0)
12280 for (stub_sec = htab->params->stub_bfd->sections;
12282 stub_sec = stub_sec->next)
12283 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12284 stub_sec->size = ((stub_sec->size
12285 + (1 << htab->params->plt_stub_align) - 1)
12286 & (-1 << htab->params->plt_stub_align));
12288 for (stub_sec = htab->params->stub_bfd->sections;
12290 stub_sec = stub_sec->next)
12291 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12292 && stub_sec->rawsize != stub_sec->size)
12295 /* Exit from this loop when no stubs have been added, and no stubs
12296 have changed size. */
12297 if (stub_sec == NULL
12298 && (htab->glink_eh_frame == NULL
12299 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
12302 /* Ask the linker to do its stuff. */
12303 (*htab->params->layout_sections_again) ();
12306 maybe_strip_output (info, htab->brlt);
12307 if (htab->glink_eh_frame != NULL)
12308 maybe_strip_output (info, htab->glink_eh_frame);
12313 /* Called after we have determined section placement. If sections
12314 move, we'll be called again. Provide a value for TOCstart. */
12317 ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
12322 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
12323 order. The TOC starts where the first of these sections starts. */
12324 s = bfd_get_section_by_name (obfd, ".got");
12325 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12326 s = bfd_get_section_by_name (obfd, ".toc");
12327 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12328 s = bfd_get_section_by_name (obfd, ".tocbss");
12329 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12330 s = bfd_get_section_by_name (obfd, ".plt");
12331 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12333 /* This may happen for
12334 o references to TOC base (SYM@toc / TOC[tc0]) without a
12336 o bad linker script
12337 o --gc-sections and empty TOC sections
12339 FIXME: Warn user? */
12341 /* Look for a likely section. We probably won't even be
12343 for (s = obfd->sections; s != NULL; s = s->next)
12344 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
12346 == (SEC_ALLOC | SEC_SMALL_DATA))
12349 for (s = obfd->sections; s != NULL; s = s->next)
12350 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
12351 == (SEC_ALLOC | SEC_SMALL_DATA))
12354 for (s = obfd->sections; s != NULL; s = s->next)
12355 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
12359 for (s = obfd->sections; s != NULL; s = s->next)
12360 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
12366 TOCstart = s->output_section->vma + s->output_offset;
12368 _bfd_set_gp_value (obfd, TOCstart);
12370 if (info != NULL && s != NULL && is_ppc64_elf (obfd))
12372 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12375 && htab->elf.hgot != NULL)
12377 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF;
12378 htab->elf.hgot->root.u.def.section = s;
12384 /* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
12385 write out any global entry stubs. */
12388 build_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
12390 struct bfd_link_info *info;
12391 struct ppc_link_hash_table *htab;
12392 struct plt_entry *pent;
12395 if (h->root.type == bfd_link_hash_indirect)
12398 if (!h->pointer_equality_needed)
12401 if (h->def_regular)
12405 htab = ppc_hash_table (info);
12410 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
12411 if (pent->plt.offset != (bfd_vma) -1
12412 && pent->addend == 0)
12418 p = s->contents + h->root.u.def.value;
12419 plt = htab->elf.splt;
12420 if (!htab->elf.dynamic_sections_created
12421 || h->dynindx == -1)
12422 plt = htab->elf.iplt;
12423 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
12424 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
12426 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
12428 info->callbacks->einfo
12429 (_("%P: linkage table error against `%T'\n"),
12430 h->root.root.string);
12431 bfd_set_error (bfd_error_bad_value);
12432 htab->stub_error = TRUE;
12435 if (PPC_HA (off) != 0)
12437 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
12440 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
12442 bfd_put_32 (s->owner, MTCTR_R12, p);
12444 bfd_put_32 (s->owner, BCTR, p);
12450 /* Build all the stubs associated with the current output file.
12451 The stubs are kept in a hash table attached to the main linker
12452 hash table. This function is called via gldelf64ppc_finish. */
12455 ppc64_elf_build_stubs (struct bfd_link_info *info,
12458 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12459 asection *stub_sec;
12461 int stub_sec_count = 0;
12466 /* Allocate memory to hold the linker stubs. */
12467 for (stub_sec = htab->params->stub_bfd->sections;
12469 stub_sec = stub_sec->next)
12470 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12471 && stub_sec->size != 0)
12473 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, stub_sec->size);
12474 if (stub_sec->contents == NULL)
12476 /* We want to check that built size is the same as calculated
12477 size. rawsize is a convenient location to use. */
12478 stub_sec->rawsize = stub_sec->size;
12479 stub_sec->size = 0;
12482 if (htab->glink != NULL && htab->glink->size != 0)
12487 /* Build the .glink plt call stub. */
12488 if (htab->params->emit_stub_syms)
12490 struct elf_link_hash_entry *h;
12491 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
12492 TRUE, FALSE, FALSE);
12495 if (h->root.type == bfd_link_hash_new)
12497 h->root.type = bfd_link_hash_defined;
12498 h->root.u.def.section = htab->glink;
12499 h->root.u.def.value = 8;
12500 h->ref_regular = 1;
12501 h->def_regular = 1;
12502 h->ref_regular_nonweak = 1;
12503 h->forced_local = 1;
12507 plt0 = (htab->elf.splt->output_section->vma
12508 + htab->elf.splt->output_offset
12510 if (info->emitrelocations)
12512 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
12515 r->r_offset = (htab->glink->output_offset
12516 + htab->glink->output_section->vma);
12517 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
12518 r->r_addend = plt0;
12520 p = htab->glink->contents;
12521 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
12522 bfd_put_64 (htab->glink->owner, plt0, p);
12526 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
12528 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
12530 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
12532 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
12534 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
12536 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
12538 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
12540 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
12542 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
12544 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
12549 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
12551 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
12553 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
12555 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
12557 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
12559 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
12561 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
12563 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
12565 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
12567 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
12569 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
12571 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
12574 bfd_put_32 (htab->glink->owner, BCTR, p);
12576 while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
12578 bfd_put_32 (htab->glink->owner, NOP, p);
12582 /* Build the .glink lazy link call stubs. */
12584 while (p < htab->glink->contents + htab->glink->rawsize)
12590 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
12595 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
12597 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
12602 bfd_put_32 (htab->glink->owner,
12603 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
12608 /* Build .glink global entry stubs. */
12609 if (htab->glink->size > htab->glink->rawsize)
12610 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
12613 if (htab->brlt->size != 0)
12615 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
12617 if (htab->brlt->contents == NULL)
12620 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
12622 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
12623 htab->relbrlt->size);
12624 if (htab->relbrlt->contents == NULL)
12628 if (htab->glink_eh_frame != NULL
12629 && htab->glink_eh_frame->size != 0)
12632 bfd_byte *last_fde;
12633 size_t last_fde_len, size, align, pad;
12635 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
12638 htab->glink_eh_frame->contents = p;
12641 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12643 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
12644 /* CIE length (rewrite in case little-endian). */
12645 last_fde_len = sizeof (glink_eh_frame_cie) - 4;
12646 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12647 p += sizeof (glink_eh_frame_cie);
12649 for (stub_sec = htab->params->stub_bfd->sections;
12651 stub_sec = stub_sec->next)
12652 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12657 bfd_put_32 (htab->elf.dynobj, 16, p);
12660 val = p - htab->glink_eh_frame->contents;
12661 bfd_put_32 (htab->elf.dynobj, val, p);
12663 /* Offset to stub section. */
12664 val = (stub_sec->output_section->vma
12665 + stub_sec->output_offset);
12666 val -= (htab->glink_eh_frame->output_section->vma
12667 + htab->glink_eh_frame->output_offset);
12668 val -= p - htab->glink_eh_frame->contents;
12669 if (val + 0x80000000 > 0xffffffff)
12671 info->callbacks->einfo
12672 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
12676 bfd_put_32 (htab->elf.dynobj, val, p);
12678 /* stub section size. */
12679 bfd_put_32 (htab->elf.dynobj, stub_sec->rawsize, p);
12681 /* Augmentation. */
12686 if (htab->glink != NULL && htab->glink->size != 0)
12691 bfd_put_32 (htab->elf.dynobj, 20, p);
12694 val = p - htab->glink_eh_frame->contents;
12695 bfd_put_32 (htab->elf.dynobj, val, p);
12697 /* Offset to .glink. */
12698 val = (htab->glink->output_section->vma
12699 + htab->glink->output_offset
12701 val -= (htab->glink_eh_frame->output_section->vma
12702 + htab->glink_eh_frame->output_offset);
12703 val -= p - htab->glink_eh_frame->contents;
12704 if (val + 0x80000000 > 0xffffffff)
12706 info->callbacks->einfo
12707 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
12708 htab->glink->name);
12711 bfd_put_32 (htab->elf.dynobj, val, p);
12714 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
12716 /* Augmentation. */
12719 *p++ = DW_CFA_advance_loc + 1;
12720 *p++ = DW_CFA_register;
12723 *p++ = DW_CFA_advance_loc + 4;
12724 *p++ = DW_CFA_restore_extended;
12727 /* Subsume any padding into the last FDE if user .eh_frame
12728 sections are aligned more than glink_eh_frame. Otherwise any
12729 zero padding will be seen as a terminator. */
12730 size = p - htab->glink_eh_frame->contents;
12732 align <<= htab->glink_eh_frame->output_section->alignment_power;
12734 pad = ((size + align) & ~align) - size;
12735 htab->glink_eh_frame->size = size + pad;
12736 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
12739 /* Build the stubs as directed by the stub hash table. */
12740 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
12742 if (htab->relbrlt != NULL)
12743 htab->relbrlt->reloc_count = 0;
12745 if (htab->params->plt_stub_align != 0)
12746 for (stub_sec = htab->params->stub_bfd->sections;
12748 stub_sec = stub_sec->next)
12749 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12750 stub_sec->size = ((stub_sec->size
12751 + (1 << htab->params->plt_stub_align) - 1)
12752 & (-1 << htab->params->plt_stub_align));
12754 for (stub_sec = htab->params->stub_bfd->sections;
12756 stub_sec = stub_sec->next)
12757 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12759 stub_sec_count += 1;
12760 if (stub_sec->rawsize != stub_sec->size)
12764 if (stub_sec != NULL
12765 || (htab->glink_eh_frame != NULL
12766 && htab->glink_eh_frame->rawsize != htab->glink_eh_frame->size))
12768 htab->stub_error = TRUE;
12769 info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
12772 if (htab->stub_error)
12777 *stats = bfd_malloc (500);
12778 if (*stats == NULL)
12781 sprintf (*stats, _("linker stubs in %u group%s\n"
12783 " toc adjust %lu\n"
12784 " long branch %lu\n"
12785 " long toc adj %lu\n"
12787 " plt call toc %lu"),
12789 stub_sec_count == 1 ? "" : "s",
12790 htab->stub_count[ppc_stub_long_branch - 1],
12791 htab->stub_count[ppc_stub_long_branch_r2off - 1],
12792 htab->stub_count[ppc_stub_plt_branch - 1],
12793 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
12794 htab->stub_count[ppc_stub_plt_call - 1],
12795 htab->stub_count[ppc_stub_plt_call_r2save - 1]);
12800 /* This function undoes the changes made by add_symbol_adjust. */
12803 undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12805 struct ppc_link_hash_entry *eh;
12807 if (h->root.type == bfd_link_hash_indirect)
12810 eh = (struct ppc_link_hash_entry *) h;
12811 if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
12814 eh->elf.root.type = bfd_link_hash_undefined;
12819 ppc64_elf_restore_symbols (struct bfd_link_info *info)
12821 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12824 elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
12827 /* What to do when ld finds relocations against symbols defined in
12828 discarded sections. */
12830 static unsigned int
12831 ppc64_elf_action_discarded (asection *sec)
12833 if (strcmp (".opd", sec->name) == 0)
12836 if (strcmp (".toc", sec->name) == 0)
12839 if (strcmp (".toc1", sec->name) == 0)
12842 return _bfd_elf_default_action_discarded (sec);
12845 /* The RELOCATE_SECTION function is called by the ELF backend linker
12846 to handle the relocations for a section.
12848 The relocs are always passed as Rela structures; if the section
12849 actually uses Rel structures, the r_addend field will always be
12852 This function is responsible for adjust the section contents as
12853 necessary, and (if using Rela relocs and generating a
12854 relocatable output file) adjusting the reloc addend as
12857 This function does not have to worry about setting the reloc
12858 address or the reloc symbol index.
12860 LOCAL_SYMS is a pointer to the swapped in local symbols.
12862 LOCAL_SECTIONS is an array giving the section in the input file
12863 corresponding to the st_shndx field of each local symbol.
12865 The global hash table entry for the global symbols can be found
12866 via elf_sym_hashes (input_bfd).
12868 When generating relocatable output, this function must handle
12869 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
12870 going to be the section symbol corresponding to the output
12871 section, which means that the addend must be adjusted
12875 ppc64_elf_relocate_section (bfd *output_bfd,
12876 struct bfd_link_info *info,
12878 asection *input_section,
12879 bfd_byte *contents,
12880 Elf_Internal_Rela *relocs,
12881 Elf_Internal_Sym *local_syms,
12882 asection **local_sections)
12884 struct ppc_link_hash_table *htab;
12885 Elf_Internal_Shdr *symtab_hdr;
12886 struct elf_link_hash_entry **sym_hashes;
12887 Elf_Internal_Rela *rel;
12888 Elf_Internal_Rela *relend;
12889 Elf_Internal_Rela outrel;
12891 struct got_entry **local_got_ents;
12893 bfd_boolean ret = TRUE;
12894 bfd_boolean is_opd;
12895 /* Assume 'at' branch hints. */
12896 bfd_boolean is_isa_v2 = TRUE;
12897 bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
12899 /* Initialize howto table if needed. */
12900 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
12903 htab = ppc_hash_table (info);
12907 /* Don't relocate stub sections. */
12908 if (input_section->owner == htab->params->stub_bfd)
12911 BFD_ASSERT (is_ppc64_elf (input_bfd));
12913 local_got_ents = elf_local_got_ents (input_bfd);
12914 TOCstart = elf_gp (output_bfd);
12915 symtab_hdr = &elf_symtab_hdr (input_bfd);
12916 sym_hashes = elf_sym_hashes (input_bfd);
12917 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
12920 relend = relocs + input_section->reloc_count;
12921 for (; rel < relend; rel++)
12923 enum elf_ppc64_reloc_type r_type;
12925 bfd_reloc_status_type r;
12926 Elf_Internal_Sym *sym;
12928 struct elf_link_hash_entry *h_elf;
12929 struct ppc_link_hash_entry *h;
12930 struct ppc_link_hash_entry *fdh;
12931 const char *sym_name;
12932 unsigned long r_symndx, toc_symndx;
12933 bfd_vma toc_addend;
12934 unsigned char tls_mask, tls_gd, tls_type;
12935 unsigned char sym_type;
12936 bfd_vma relocation;
12937 bfd_boolean unresolved_reloc;
12938 bfd_boolean warned;
12939 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
12942 struct ppc_stub_hash_entry *stub_entry;
12943 bfd_vma max_br_offset;
12945 const Elf_Internal_Rela orig_rel = *rel;
12947 r_type = ELF64_R_TYPE (rel->r_info);
12948 r_symndx = ELF64_R_SYM (rel->r_info);
12950 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
12951 symbol of the previous ADDR64 reloc. The symbol gives us the
12952 proper TOC base to use. */
12953 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
12955 && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
12957 r_symndx = ELF64_R_SYM (rel[-1].r_info);
12963 unresolved_reloc = FALSE;
12966 if (r_symndx < symtab_hdr->sh_info)
12968 /* It's a local symbol. */
12969 struct _opd_sec_data *opd;
12971 sym = local_syms + r_symndx;
12972 sec = local_sections[r_symndx];
12973 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
12974 sym_type = ELF64_ST_TYPE (sym->st_info);
12975 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
12976 opd = get_opd_info (sec);
12977 if (opd != NULL && opd->adjust != NULL)
12979 long adjust = opd->adjust[(sym->st_value + rel->r_addend) / 8];
12984 /* If this is a relocation against the opd section sym
12985 and we have edited .opd, adjust the reloc addend so
12986 that ld -r and ld --emit-relocs output is correct.
12987 If it is a reloc against some other .opd symbol,
12988 then the symbol value will be adjusted later. */
12989 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
12990 rel->r_addend += adjust;
12992 relocation += adjust;
12998 bfd_boolean ignored;
13000 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
13001 r_symndx, symtab_hdr, sym_hashes,
13002 h_elf, sec, relocation,
13003 unresolved_reloc, warned, ignored);
13004 sym_name = h_elf->root.root.string;
13005 sym_type = h_elf->type;
13007 && sec->owner == output_bfd
13008 && strcmp (sec->name, ".opd") == 0)
13010 /* This is a symbol defined in a linker script. All
13011 such are defined in output sections, even those
13012 defined by simple assignment from a symbol defined in
13013 an input section. Transfer the symbol to an
13014 appropriate input .opd section, so that a branch to
13015 this symbol will be mapped to the location specified
13016 by the opd entry. */
13017 struct bfd_link_order *lo;
13018 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
13019 if (lo->type == bfd_indirect_link_order)
13021 asection *isec = lo->u.indirect.section;
13022 if (h_elf->root.u.def.value >= isec->output_offset
13023 && h_elf->root.u.def.value < (isec->output_offset
13026 h_elf->root.u.def.value -= isec->output_offset;
13027 h_elf->root.u.def.section = isec;
13034 h = (struct ppc_link_hash_entry *) h_elf;
13036 if (sec != NULL && discarded_section (sec))
13037 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
13039 ppc64_elf_howto_table[r_type], 0,
13042 if (info->relocatable)
13045 if (h != NULL && &h->elf == htab->elf.hgot)
13047 relocation = (TOCstart
13048 + htab->stub_group[input_section->id].toc_off);
13049 sec = bfd_abs_section_ptr;
13050 unresolved_reloc = FALSE;
13053 /* TLS optimizations. Replace instruction sequences and relocs
13054 based on information we collected in tls_optimize. We edit
13055 RELOCS so that --emit-relocs will output something sensible
13056 for the final instruction stream. */
13061 tls_mask = h->tls_mask;
13062 else if (local_got_ents != NULL)
13064 struct plt_entry **local_plt = (struct plt_entry **)
13065 (local_got_ents + symtab_hdr->sh_info);
13066 unsigned char *lgot_masks = (unsigned char *)
13067 (local_plt + symtab_hdr->sh_info);
13068 tls_mask = lgot_masks[r_symndx];
13071 && (r_type == R_PPC64_TLS
13072 || r_type == R_PPC64_TLSGD
13073 || r_type == R_PPC64_TLSLD))
13075 /* Check for toc tls entries. */
13076 unsigned char *toc_tls;
13078 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13079 &local_syms, rel, input_bfd))
13083 tls_mask = *toc_tls;
13086 /* Check that tls relocs are used with tls syms, and non-tls
13087 relocs are used with non-tls syms. */
13088 if (r_symndx != STN_UNDEF
13089 && r_type != R_PPC64_NONE
13091 || h->elf.root.type == bfd_link_hash_defined
13092 || h->elf.root.type == bfd_link_hash_defweak)
13093 && (IS_PPC64_TLS_RELOC (r_type)
13094 != (sym_type == STT_TLS
13095 || (sym_type == STT_SECTION
13096 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
13099 && (r_type == R_PPC64_TLS
13100 || r_type == R_PPC64_TLSGD
13101 || r_type == R_PPC64_TLSLD))
13102 /* R_PPC64_TLS is OK against a symbol in the TOC. */
13105 info->callbacks->einfo
13106 (!IS_PPC64_TLS_RELOC (r_type)
13107 ? _("%P: %H: %s used with TLS symbol `%T'\n")
13108 : _("%P: %H: %s used with non-TLS symbol `%T'\n"),
13109 input_bfd, input_section, rel->r_offset,
13110 ppc64_elf_howto_table[r_type]->name,
13114 /* Ensure reloc mapping code below stays sane. */
13115 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
13116 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
13117 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
13118 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
13119 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
13120 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
13121 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
13122 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
13123 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
13124 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
13132 case R_PPC64_LO_DS_OPT:
13133 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
13134 if ((insn & (0x3f << 26)) != 58u << 26)
13136 insn += (14u << 26) - (58u << 26);
13137 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
13138 r_type = R_PPC64_TOC16_LO;
13139 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13142 case R_PPC64_TOC16:
13143 case R_PPC64_TOC16_LO:
13144 case R_PPC64_TOC16_DS:
13145 case R_PPC64_TOC16_LO_DS:
13147 /* Check for toc tls entries. */
13148 unsigned char *toc_tls;
13151 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13152 &local_syms, rel, input_bfd);
13158 tls_mask = *toc_tls;
13159 if (r_type == R_PPC64_TOC16_DS
13160 || r_type == R_PPC64_TOC16_LO_DS)
13163 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
13168 /* If we found a GD reloc pair, then we might be
13169 doing a GD->IE transition. */
13172 tls_gd = TLS_TPRELGD;
13173 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13176 else if (retval == 3)
13178 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13186 case R_PPC64_GOT_TPREL16_HI:
13187 case R_PPC64_GOT_TPREL16_HA:
13189 && (tls_mask & TLS_TPREL) == 0)
13191 rel->r_offset -= d_offset;
13192 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13193 r_type = R_PPC64_NONE;
13194 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13198 case R_PPC64_GOT_TPREL16_DS:
13199 case R_PPC64_GOT_TPREL16_LO_DS:
13201 && (tls_mask & TLS_TPREL) == 0)
13204 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
13206 insn |= 0x3c0d0000; /* addis 0,13,0 */
13207 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
13208 r_type = R_PPC64_TPREL16_HA;
13209 if (toc_symndx != 0)
13211 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13212 rel->r_addend = toc_addend;
13213 /* We changed the symbol. Start over in order to
13214 get h, sym, sec etc. right. */
13219 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13225 && (tls_mask & TLS_TPREL) == 0)
13227 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
13228 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
13231 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
13232 /* Was PPC64_TLS which sits on insn boundary, now
13233 PPC64_TPREL16_LO which is at low-order half-word. */
13234 rel->r_offset += d_offset;
13235 r_type = R_PPC64_TPREL16_LO;
13236 if (toc_symndx != 0)
13238 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13239 rel->r_addend = toc_addend;
13240 /* We changed the symbol. Start over in order to
13241 get h, sym, sec etc. right. */
13246 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13250 case R_PPC64_GOT_TLSGD16_HI:
13251 case R_PPC64_GOT_TLSGD16_HA:
13252 tls_gd = TLS_TPRELGD;
13253 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13257 case R_PPC64_GOT_TLSLD16_HI:
13258 case R_PPC64_GOT_TLSLD16_HA:
13259 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13262 if ((tls_mask & tls_gd) != 0)
13263 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13264 + R_PPC64_GOT_TPREL16_DS);
13267 rel->r_offset -= d_offset;
13268 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13269 r_type = R_PPC64_NONE;
13271 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13275 case R_PPC64_GOT_TLSGD16:
13276 case R_PPC64_GOT_TLSGD16_LO:
13277 tls_gd = TLS_TPRELGD;
13278 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13282 case R_PPC64_GOT_TLSLD16:
13283 case R_PPC64_GOT_TLSLD16_LO:
13284 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13286 unsigned int insn1, insn2, insn3;
13290 offset = (bfd_vma) -1;
13291 /* If not using the newer R_PPC64_TLSGD/LD to mark
13292 __tls_get_addr calls, we must trust that the call
13293 stays with its arg setup insns, ie. that the next
13294 reloc is the __tls_get_addr call associated with
13295 the current reloc. Edit both insns. */
13296 if (input_section->has_tls_get_addr_call
13297 && rel + 1 < relend
13298 && branch_reloc_hash_match (input_bfd, rel + 1,
13299 htab->tls_get_addr,
13300 htab->tls_get_addr_fd))
13301 offset = rel[1].r_offset;
13302 if ((tls_mask & tls_gd) != 0)
13305 insn1 = bfd_get_32 (output_bfd,
13306 contents + rel->r_offset - d_offset);
13307 insn1 &= (1 << 26) - (1 << 2);
13308 insn1 |= 58 << 26; /* ld */
13309 insn2 = 0x7c636a14; /* add 3,3,13 */
13310 if (offset != (bfd_vma) -1)
13311 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13312 if ((tls_mask & TLS_EXPLICIT) == 0)
13313 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13314 + R_PPC64_GOT_TPREL16_DS);
13316 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
13317 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13322 insn1 = 0x3c6d0000; /* addis 3,13,0 */
13323 insn2 = 0x38630000; /* addi 3,3,0 */
13326 /* Was an LD reloc. */
13328 sec = local_sections[toc_symndx];
13330 r_symndx < symtab_hdr->sh_info;
13332 if (local_sections[r_symndx] == sec)
13334 if (r_symndx >= symtab_hdr->sh_info)
13335 r_symndx = STN_UNDEF;
13336 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13337 if (r_symndx != STN_UNDEF)
13338 rel->r_addend -= (local_syms[r_symndx].st_value
13339 + sec->output_offset
13340 + sec->output_section->vma);
13342 else if (toc_symndx != 0)
13344 r_symndx = toc_symndx;
13345 rel->r_addend = toc_addend;
13347 r_type = R_PPC64_TPREL16_HA;
13348 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13349 if (offset != (bfd_vma) -1)
13351 rel[1].r_info = ELF64_R_INFO (r_symndx,
13352 R_PPC64_TPREL16_LO);
13353 rel[1].r_offset = offset + d_offset;
13354 rel[1].r_addend = rel->r_addend;
13357 bfd_put_32 (output_bfd, insn1,
13358 contents + rel->r_offset - d_offset);
13359 if (offset != (bfd_vma) -1)
13361 insn3 = bfd_get_32 (output_bfd,
13362 contents + offset + 4);
13364 || insn3 == CROR_151515 || insn3 == CROR_313131)
13366 rel[1].r_offset += 4;
13367 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13370 bfd_put_32 (output_bfd, insn2, contents + offset);
13372 if ((tls_mask & tls_gd) == 0
13373 && (tls_gd == 0 || toc_symndx != 0))
13375 /* We changed the symbol. Start over in order
13376 to get h, sym, sec etc. right. */
13383 case R_PPC64_TLSGD:
13384 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13386 unsigned int insn2, insn3;
13387 bfd_vma offset = rel->r_offset;
13389 if ((tls_mask & TLS_TPRELGD) != 0)
13392 r_type = R_PPC64_NONE;
13393 insn2 = 0x7c636a14; /* add 3,3,13 */
13398 if (toc_symndx != 0)
13400 r_symndx = toc_symndx;
13401 rel->r_addend = toc_addend;
13403 r_type = R_PPC64_TPREL16_LO;
13404 rel->r_offset = offset + d_offset;
13405 insn2 = 0x38630000; /* addi 3,3,0 */
13407 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13408 /* Zap the reloc on the _tls_get_addr call too. */
13409 BFD_ASSERT (offset == rel[1].r_offset);
13410 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13411 insn3 = bfd_get_32 (output_bfd,
13412 contents + offset + 4);
13414 || insn3 == CROR_151515 || insn3 == CROR_313131)
13416 rel->r_offset += 4;
13417 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13420 bfd_put_32 (output_bfd, insn2, contents + offset);
13421 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
13429 case R_PPC64_TLSLD:
13430 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13432 unsigned int insn2, insn3;
13433 bfd_vma offset = rel->r_offset;
13436 sec = local_sections[toc_symndx];
13438 r_symndx < symtab_hdr->sh_info;
13440 if (local_sections[r_symndx] == sec)
13442 if (r_symndx >= symtab_hdr->sh_info)
13443 r_symndx = STN_UNDEF;
13444 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13445 if (r_symndx != STN_UNDEF)
13446 rel->r_addend -= (local_syms[r_symndx].st_value
13447 + sec->output_offset
13448 + sec->output_section->vma);
13450 r_type = R_PPC64_TPREL16_LO;
13451 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13452 rel->r_offset = offset + d_offset;
13453 /* Zap the reloc on the _tls_get_addr call too. */
13454 BFD_ASSERT (offset == rel[1].r_offset);
13455 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13456 insn2 = 0x38630000; /* addi 3,3,0 */
13457 insn3 = bfd_get_32 (output_bfd,
13458 contents + offset + 4);
13460 || insn3 == CROR_151515 || insn3 == CROR_313131)
13462 rel->r_offset += 4;
13463 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13466 bfd_put_32 (output_bfd, insn2, contents + offset);
13472 case R_PPC64_DTPMOD64:
13473 if (rel + 1 < relend
13474 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
13475 && rel[1].r_offset == rel->r_offset + 8)
13477 if ((tls_mask & TLS_GD) == 0)
13479 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
13480 if ((tls_mask & TLS_TPRELGD) != 0)
13481 r_type = R_PPC64_TPREL64;
13484 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13485 r_type = R_PPC64_NONE;
13487 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13492 if ((tls_mask & TLS_LD) == 0)
13494 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13495 r_type = R_PPC64_NONE;
13496 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13501 case R_PPC64_TPREL64:
13502 if ((tls_mask & TLS_TPREL) == 0)
13504 r_type = R_PPC64_NONE;
13505 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13509 case R_PPC64_REL16_HA:
13510 /* If we are generating a non-PIC executable, edit
13511 . 0: addis 2,12,.TOC.-0b@ha
13512 . addi 2,2,.TOC.-0b@l
13513 used by ELFv2 global entry points to set up r2, to
13516 if .TOC. is in range. */
13518 && h != NULL && &h->elf == htab->elf.hgot
13519 && rel + 1 < relend
13520 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
13521 && rel[1].r_offset == rel->r_offset + 4
13522 && rel[1].r_addend == rel->r_addend + 4
13523 && relocation + 0x80008000 <= 0xffffffff)
13525 unsigned int insn1, insn2;
13526 bfd_vma offset = rel->r_offset - d_offset;
13527 insn1 = bfd_get_32 (output_bfd, contents + offset);
13528 insn2 = bfd_get_32 (output_bfd, contents + offset + 4);
13529 if ((insn1 & 0xffff0000) == 0x3c4c0000 /* addis 2,12 */
13530 && (insn2 & 0xffff0000) == 0x38420000 /* addi 2,2 */)
13532 r_type = R_PPC64_ADDR16_HA;
13533 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13534 rel->r_addend -= d_offset;
13535 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
13536 rel[1].r_addend -= d_offset + 4;
13537 bfd_put_32 (output_bfd, 0x3c400000, contents + offset);
13543 /* Handle other relocations that tweak non-addend part of insn. */
13545 max_br_offset = 1 << 25;
13546 addend = rel->r_addend;
13547 reloc_dest = DEST_NORMAL;
13553 case R_PPC64_TOCSAVE:
13554 if (relocation + addend == (rel->r_offset
13555 + input_section->output_offset
13556 + input_section->output_section->vma)
13557 && tocsave_find (htab, NO_INSERT,
13558 &local_syms, rel, input_bfd))
13560 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
13562 || insn == CROR_151515 || insn == CROR_313131)
13563 bfd_put_32 (input_bfd,
13564 STD_R2_0R1 + STK_TOC (htab),
13565 contents + rel->r_offset);
13569 /* Branch taken prediction relocations. */
13570 case R_PPC64_ADDR14_BRTAKEN:
13571 case R_PPC64_REL14_BRTAKEN:
13572 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
13575 /* Branch not taken prediction relocations. */
13576 case R_PPC64_ADDR14_BRNTAKEN:
13577 case R_PPC64_REL14_BRNTAKEN:
13578 insn |= bfd_get_32 (output_bfd,
13579 contents + rel->r_offset) & ~(0x01 << 21);
13582 case R_PPC64_REL14:
13583 max_br_offset = 1 << 15;
13586 case R_PPC64_REL24:
13587 /* Calls to functions with a different TOC, such as calls to
13588 shared objects, need to alter the TOC pointer. This is
13589 done using a linkage stub. A REL24 branching to these
13590 linkage stubs needs to be followed by a nop, as the nop
13591 will be replaced with an instruction to restore the TOC
13596 && h->oh->is_func_descriptor)
13597 fdh = ppc_follow_link (h->oh);
13598 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
13600 if (stub_entry != NULL
13601 && (stub_entry->stub_type == ppc_stub_plt_call
13602 || stub_entry->stub_type == ppc_stub_plt_call_r2save
13603 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
13604 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
13606 bfd_boolean can_plt_call = FALSE;
13608 /* All of these stubs will modify r2, so there must be a
13609 branch and link followed by a nop. The nop is
13610 replaced by an insn to restore r2. */
13611 if (rel->r_offset + 8 <= input_section->size)
13615 br = bfd_get_32 (input_bfd,
13616 contents + rel->r_offset);
13621 nop = bfd_get_32 (input_bfd,
13622 contents + rel->r_offset + 4);
13624 || nop == CROR_151515 || nop == CROR_313131)
13627 && (h == htab->tls_get_addr_fd
13628 || h == htab->tls_get_addr)
13629 && !htab->params->no_tls_get_addr_opt)
13631 /* Special stub used, leave nop alone. */
13634 bfd_put_32 (input_bfd,
13635 LD_R2_0R1 + STK_TOC (htab),
13636 contents + rel->r_offset + 4);
13637 can_plt_call = TRUE;
13642 if (!can_plt_call && h != NULL)
13644 const char *name = h->elf.root.root.string;
13649 if (strncmp (name, "__libc_start_main", 17) == 0
13650 && (name[17] == 0 || name[17] == '@'))
13652 /* Allow crt1 branch to go via a toc adjusting
13653 stub. Other calls that never return could do
13654 the same, if we could detect such. */
13655 can_plt_call = TRUE;
13661 /* g++ as of 20130507 emits self-calls without a
13662 following nop. This is arguably wrong since we
13663 have conflicting information. On the one hand a
13664 global symbol and on the other a local call
13665 sequence, but don't error for this special case.
13666 It isn't possible to cheaply verify we have
13667 exactly such a call. Allow all calls to the same
13669 asection *code_sec = sec;
13671 if (get_opd_info (sec) != NULL)
13673 bfd_vma off = (relocation + addend
13674 - sec->output_section->vma
13675 - sec->output_offset);
13677 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
13679 if (code_sec == input_section)
13680 can_plt_call = TRUE;
13685 info->callbacks->einfo
13686 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
13687 "recompile with -fPIC\n"),
13688 input_bfd, input_section, rel->r_offset, sym_name);
13690 bfd_set_error (bfd_error_bad_value);
13695 && (stub_entry->stub_type == ppc_stub_plt_call
13696 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
13697 unresolved_reloc = FALSE;
13700 if ((stub_entry == NULL
13701 || stub_entry->stub_type == ppc_stub_long_branch
13702 || stub_entry->stub_type == ppc_stub_plt_branch)
13703 && get_opd_info (sec) != NULL)
13705 /* The branch destination is the value of the opd entry. */
13706 bfd_vma off = (relocation + addend
13707 - sec->output_section->vma
13708 - sec->output_offset);
13709 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
13710 if (dest != (bfd_vma) -1)
13714 reloc_dest = DEST_OPD;
13718 /* If the branch is out of reach we ought to have a long
13720 from = (rel->r_offset
13721 + input_section->output_offset
13722 + input_section->output_section->vma);
13724 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
13728 if (stub_entry != NULL
13729 && (stub_entry->stub_type == ppc_stub_long_branch
13730 || stub_entry->stub_type == ppc_stub_plt_branch)
13731 && (r_type == R_PPC64_ADDR14_BRTAKEN
13732 || r_type == R_PPC64_ADDR14_BRNTAKEN
13733 || (relocation + addend - from + max_br_offset
13734 < 2 * max_br_offset)))
13735 /* Don't use the stub if this branch is in range. */
13738 if (stub_entry != NULL)
13740 /* Munge up the value and addend so that we call the stub
13741 rather than the procedure directly. */
13742 relocation = (stub_entry->stub_offset
13743 + stub_entry->stub_sec->output_offset
13744 + stub_entry->stub_sec->output_section->vma);
13746 reloc_dest = DEST_STUB;
13748 if ((stub_entry->stub_type == ppc_stub_plt_call
13749 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
13750 && (ALWAYS_EMIT_R2SAVE
13751 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
13752 && rel + 1 < relend
13753 && rel[1].r_offset == rel->r_offset + 4
13754 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
13762 /* Set 'a' bit. This is 0b00010 in BO field for branch
13763 on CR(BI) insns (BO == 001at or 011at), and 0b01000
13764 for branch on CTR insns (BO == 1a00t or 1a01t). */
13765 if ((insn & (0x14 << 21)) == (0x04 << 21))
13766 insn |= 0x02 << 21;
13767 else if ((insn & (0x14 << 21)) == (0x10 << 21))
13768 insn |= 0x08 << 21;
13774 /* Invert 'y' bit if not the default. */
13775 if ((bfd_signed_vma) (relocation + addend - from) < 0)
13776 insn ^= 0x01 << 21;
13779 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
13782 /* NOP out calls to undefined weak functions.
13783 We can thus call a weak function without first
13784 checking whether the function is defined. */
13786 && h->elf.root.type == bfd_link_hash_undefweak
13787 && h->elf.dynindx == -1
13788 && r_type == R_PPC64_REL24
13792 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13798 /* Set `addend'. */
13803 info->callbacks->einfo
13804 (_("%P: %B: unknown relocation type %d for `%T'\n"),
13805 input_bfd, (int) r_type, sym_name);
13807 bfd_set_error (bfd_error_bad_value);
13813 case R_PPC64_TLSGD:
13814 case R_PPC64_TLSLD:
13815 case R_PPC64_TOCSAVE:
13816 case R_PPC64_GNU_VTINHERIT:
13817 case R_PPC64_GNU_VTENTRY:
13820 /* GOT16 relocations. Like an ADDR16 using the symbol's
13821 address in the GOT as relocation value instead of the
13822 symbol's value itself. Also, create a GOT entry for the
13823 symbol and put the symbol value there. */
13824 case R_PPC64_GOT_TLSGD16:
13825 case R_PPC64_GOT_TLSGD16_LO:
13826 case R_PPC64_GOT_TLSGD16_HI:
13827 case R_PPC64_GOT_TLSGD16_HA:
13828 tls_type = TLS_TLS | TLS_GD;
13831 case R_PPC64_GOT_TLSLD16:
13832 case R_PPC64_GOT_TLSLD16_LO:
13833 case R_PPC64_GOT_TLSLD16_HI:
13834 case R_PPC64_GOT_TLSLD16_HA:
13835 tls_type = TLS_TLS | TLS_LD;
13838 case R_PPC64_GOT_TPREL16_DS:
13839 case R_PPC64_GOT_TPREL16_LO_DS:
13840 case R_PPC64_GOT_TPREL16_HI:
13841 case R_PPC64_GOT_TPREL16_HA:
13842 tls_type = TLS_TLS | TLS_TPREL;
13845 case R_PPC64_GOT_DTPREL16_DS:
13846 case R_PPC64_GOT_DTPREL16_LO_DS:
13847 case R_PPC64_GOT_DTPREL16_HI:
13848 case R_PPC64_GOT_DTPREL16_HA:
13849 tls_type = TLS_TLS | TLS_DTPREL;
13852 case R_PPC64_GOT16:
13853 case R_PPC64_GOT16_LO:
13854 case R_PPC64_GOT16_HI:
13855 case R_PPC64_GOT16_HA:
13856 case R_PPC64_GOT16_DS:
13857 case R_PPC64_GOT16_LO_DS:
13860 /* Relocation is to the entry for this symbol in the global
13865 unsigned long indx = 0;
13866 struct got_entry *ent;
13868 if (tls_type == (TLS_TLS | TLS_LD)
13870 || !h->elf.def_dynamic))
13871 ent = ppc64_tlsld_got (input_bfd);
13877 bfd_boolean dyn = htab->elf.dynamic_sections_created;
13878 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
13881 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
13882 /* This is actually a static link, or it is a
13883 -Bsymbolic link and the symbol is defined
13884 locally, or the symbol was forced to be local
13885 because of a version file. */
13889 BFD_ASSERT (h->elf.dynindx != -1);
13890 indx = h->elf.dynindx;
13891 unresolved_reloc = FALSE;
13893 ent = h->elf.got.glist;
13897 if (local_got_ents == NULL)
13899 ent = local_got_ents[r_symndx];
13902 for (; ent != NULL; ent = ent->next)
13903 if (ent->addend == orig_rel.r_addend
13904 && ent->owner == input_bfd
13905 && ent->tls_type == tls_type)
13911 if (ent->is_indirect)
13912 ent = ent->got.ent;
13913 offp = &ent->got.offset;
13914 got = ppc64_elf_tdata (ent->owner)->got;
13918 /* The offset must always be a multiple of 8. We use the
13919 least significant bit to record whether we have already
13920 processed this entry. */
13922 if ((off & 1) != 0)
13926 /* Generate relocs for the dynamic linker, except in
13927 the case of TLSLD where we'll use one entry per
13935 ? h->elf.type == STT_GNU_IFUNC
13936 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
13938 relgot = htab->elf.irelplt;
13939 else if ((info->shared || indx != 0)
13941 || (tls_type == (TLS_TLS | TLS_LD)
13942 && !h->elf.def_dynamic)
13943 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
13944 || h->elf.root.type != bfd_link_hash_undefweak))
13945 relgot = ppc64_elf_tdata (ent->owner)->relgot;
13946 if (relgot != NULL)
13948 outrel.r_offset = (got->output_section->vma
13949 + got->output_offset
13951 outrel.r_addend = addend;
13952 if (tls_type & (TLS_LD | TLS_GD))
13954 outrel.r_addend = 0;
13955 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
13956 if (tls_type == (TLS_TLS | TLS_GD))
13958 loc = relgot->contents;
13959 loc += (relgot->reloc_count++
13960 * sizeof (Elf64_External_Rela));
13961 bfd_elf64_swap_reloca_out (output_bfd,
13963 outrel.r_offset += 8;
13964 outrel.r_addend = addend;
13966 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
13969 else if (tls_type == (TLS_TLS | TLS_DTPREL))
13970 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
13971 else if (tls_type == (TLS_TLS | TLS_TPREL))
13972 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
13973 else if (indx != 0)
13974 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
13978 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13980 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13982 /* Write the .got section contents for the sake
13984 loc = got->contents + off;
13985 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
13989 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
13991 outrel.r_addend += relocation;
13992 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
13993 outrel.r_addend -= htab->elf.tls_sec->vma;
13995 loc = relgot->contents;
13996 loc += (relgot->reloc_count++
13997 * sizeof (Elf64_External_Rela));
13998 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14001 /* Init the .got section contents here if we're not
14002 emitting a reloc. */
14005 relocation += addend;
14006 if (tls_type == (TLS_TLS | TLS_LD))
14008 else if (tls_type != 0)
14010 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
14011 if (tls_type == (TLS_TLS | TLS_TPREL))
14012 relocation += DTP_OFFSET - TP_OFFSET;
14014 if (tls_type == (TLS_TLS | TLS_GD))
14016 bfd_put_64 (output_bfd, relocation,
14017 got->contents + off + 8);
14022 bfd_put_64 (output_bfd, relocation,
14023 got->contents + off);
14027 if (off >= (bfd_vma) -2)
14030 relocation = got->output_section->vma + got->output_offset + off;
14031 addend = -(TOCstart + htab->stub_group[input_section->id].toc_off);
14035 case R_PPC64_PLT16_HA:
14036 case R_PPC64_PLT16_HI:
14037 case R_PPC64_PLT16_LO:
14038 case R_PPC64_PLT32:
14039 case R_PPC64_PLT64:
14040 /* Relocation is to the entry for this symbol in the
14041 procedure linkage table. */
14043 /* Resolve a PLT reloc against a local symbol directly,
14044 without using the procedure linkage table. */
14048 /* It's possible that we didn't make a PLT entry for this
14049 symbol. This happens when statically linking PIC code,
14050 or when using -Bsymbolic. Go find a match if there is a
14052 if (htab->elf.splt != NULL)
14054 struct plt_entry *ent;
14055 for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
14056 if (ent->plt.offset != (bfd_vma) -1
14057 && ent->addend == orig_rel.r_addend)
14059 relocation = (htab->elf.splt->output_section->vma
14060 + htab->elf.splt->output_offset
14061 + ent->plt.offset);
14062 unresolved_reloc = FALSE;
14069 /* Relocation value is TOC base. */
14070 relocation = TOCstart;
14071 if (r_symndx == STN_UNDEF)
14072 relocation += htab->stub_group[input_section->id].toc_off;
14073 else if (unresolved_reloc)
14075 else if (sec != NULL && sec->id <= htab->top_id)
14076 relocation += htab->stub_group[sec->id].toc_off;
14078 unresolved_reloc = TRUE;
14081 /* TOC16 relocs. We want the offset relative to the TOC base,
14082 which is the address of the start of the TOC plus 0x8000.
14083 The TOC consists of sections .got, .toc, .tocbss, and .plt,
14085 case R_PPC64_TOC16:
14086 case R_PPC64_TOC16_LO:
14087 case R_PPC64_TOC16_HI:
14088 case R_PPC64_TOC16_DS:
14089 case R_PPC64_TOC16_LO_DS:
14090 case R_PPC64_TOC16_HA:
14091 addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
14094 /* Relocate against the beginning of the section. */
14095 case R_PPC64_SECTOFF:
14096 case R_PPC64_SECTOFF_LO:
14097 case R_PPC64_SECTOFF_HI:
14098 case R_PPC64_SECTOFF_DS:
14099 case R_PPC64_SECTOFF_LO_DS:
14100 case R_PPC64_SECTOFF_HA:
14102 addend -= sec->output_section->vma;
14105 case R_PPC64_REL16:
14106 case R_PPC64_REL16_LO:
14107 case R_PPC64_REL16_HI:
14108 case R_PPC64_REL16_HA:
14111 case R_PPC64_REL14:
14112 case R_PPC64_REL14_BRNTAKEN:
14113 case R_PPC64_REL14_BRTAKEN:
14114 case R_PPC64_REL24:
14117 case R_PPC64_TPREL16:
14118 case R_PPC64_TPREL16_LO:
14119 case R_PPC64_TPREL16_HI:
14120 case R_PPC64_TPREL16_HA:
14121 case R_PPC64_TPREL16_DS:
14122 case R_PPC64_TPREL16_LO_DS:
14123 case R_PPC64_TPREL16_HIGH:
14124 case R_PPC64_TPREL16_HIGHA:
14125 case R_PPC64_TPREL16_HIGHER:
14126 case R_PPC64_TPREL16_HIGHERA:
14127 case R_PPC64_TPREL16_HIGHEST:
14128 case R_PPC64_TPREL16_HIGHESTA:
14130 && h->elf.root.type == bfd_link_hash_undefweak
14131 && h->elf.dynindx == -1)
14133 /* Make this relocation against an undefined weak symbol
14134 resolve to zero. This is really just a tweak, since
14135 code using weak externs ought to check that they are
14136 defined before using them. */
14137 bfd_byte *p = contents + rel->r_offset - d_offset;
14139 insn = bfd_get_32 (output_bfd, p);
14140 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
14142 bfd_put_32 (output_bfd, insn, p);
14145 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14147 /* The TPREL16 relocs shouldn't really be used in shared
14148 libs as they will result in DT_TEXTREL being set, but
14149 support them anyway. */
14153 case R_PPC64_DTPREL16:
14154 case R_PPC64_DTPREL16_LO:
14155 case R_PPC64_DTPREL16_HI:
14156 case R_PPC64_DTPREL16_HA:
14157 case R_PPC64_DTPREL16_DS:
14158 case R_PPC64_DTPREL16_LO_DS:
14159 case R_PPC64_DTPREL16_HIGH:
14160 case R_PPC64_DTPREL16_HIGHA:
14161 case R_PPC64_DTPREL16_HIGHER:
14162 case R_PPC64_DTPREL16_HIGHERA:
14163 case R_PPC64_DTPREL16_HIGHEST:
14164 case R_PPC64_DTPREL16_HIGHESTA:
14165 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14168 case R_PPC64_ADDR64_LOCAL:
14169 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
14174 case R_PPC64_DTPMOD64:
14179 case R_PPC64_TPREL64:
14180 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14183 case R_PPC64_DTPREL64:
14184 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14187 /* Relocations that may need to be propagated if this is a
14189 case R_PPC64_REL30:
14190 case R_PPC64_REL32:
14191 case R_PPC64_REL64:
14192 case R_PPC64_ADDR14:
14193 case R_PPC64_ADDR14_BRNTAKEN:
14194 case R_PPC64_ADDR14_BRTAKEN:
14195 case R_PPC64_ADDR16:
14196 case R_PPC64_ADDR16_DS:
14197 case R_PPC64_ADDR16_HA:
14198 case R_PPC64_ADDR16_HI:
14199 case R_PPC64_ADDR16_HIGH:
14200 case R_PPC64_ADDR16_HIGHA:
14201 case R_PPC64_ADDR16_HIGHER:
14202 case R_PPC64_ADDR16_HIGHERA:
14203 case R_PPC64_ADDR16_HIGHEST:
14204 case R_PPC64_ADDR16_HIGHESTA:
14205 case R_PPC64_ADDR16_LO:
14206 case R_PPC64_ADDR16_LO_DS:
14207 case R_PPC64_ADDR24:
14208 case R_PPC64_ADDR32:
14209 case R_PPC64_ADDR64:
14210 case R_PPC64_UADDR16:
14211 case R_PPC64_UADDR32:
14212 case R_PPC64_UADDR64:
14214 if ((input_section->flags & SEC_ALLOC) == 0)
14217 if (NO_OPD_RELOCS && is_opd)
14222 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
14223 || h->elf.root.type != bfd_link_hash_undefweak)
14224 && (must_be_dyn_reloc (info, r_type)
14225 || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
14226 || (ELIMINATE_COPY_RELOCS
14229 && h->elf.dynindx != -1
14230 && !h->elf.non_got_ref
14231 && !h->elf.def_regular)
14234 ? h->elf.type == STT_GNU_IFUNC
14235 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
14237 bfd_boolean skip, relocate;
14241 /* When generating a dynamic object, these relocations
14242 are copied into the output file to be resolved at run
14248 out_off = _bfd_elf_section_offset (output_bfd, info,
14249 input_section, rel->r_offset);
14250 if (out_off == (bfd_vma) -1)
14252 else if (out_off == (bfd_vma) -2)
14253 skip = TRUE, relocate = TRUE;
14254 out_off += (input_section->output_section->vma
14255 + input_section->output_offset);
14256 outrel.r_offset = out_off;
14257 outrel.r_addend = rel->r_addend;
14259 /* Optimize unaligned reloc use. */
14260 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
14261 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
14262 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
14263 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
14264 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
14265 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
14266 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
14267 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
14268 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
14271 memset (&outrel, 0, sizeof outrel);
14272 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
14274 && r_type != R_PPC64_TOC)
14276 BFD_ASSERT (h->elf.dynindx != -1);
14277 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
14281 /* This symbol is local, or marked to become local,
14282 or this is an opd section reloc which must point
14283 at a local function. */
14284 outrel.r_addend += relocation;
14285 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
14287 if (is_opd && h != NULL)
14289 /* Lie about opd entries. This case occurs
14290 when building shared libraries and we
14291 reference a function in another shared
14292 lib. The same thing happens for a weak
14293 definition in an application that's
14294 overridden by a strong definition in a
14295 shared lib. (I believe this is a generic
14296 bug in binutils handling of weak syms.)
14297 In these cases we won't use the opd
14298 entry in this lib. */
14299 unresolved_reloc = FALSE;
14302 && r_type == R_PPC64_ADDR64
14304 ? h->elf.type == STT_GNU_IFUNC
14305 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
14306 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14309 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14311 /* We need to relocate .opd contents for ld.so.
14312 Prelink also wants simple and consistent rules
14313 for relocs. This make all RELATIVE relocs have
14314 *r_offset equal to r_addend. */
14323 ? h->elf.type == STT_GNU_IFUNC
14324 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14326 info->callbacks->einfo
14327 (_("%P: %H: %s for indirect "
14328 "function `%T' unsupported\n"),
14329 input_bfd, input_section, rel->r_offset,
14330 ppc64_elf_howto_table[r_type]->name,
14334 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
14336 else if (sec == NULL || sec->owner == NULL)
14338 bfd_set_error (bfd_error_bad_value);
14345 osec = sec->output_section;
14346 indx = elf_section_data (osec)->dynindx;
14350 if ((osec->flags & SEC_READONLY) == 0
14351 && htab->elf.data_index_section != NULL)
14352 osec = htab->elf.data_index_section;
14354 osec = htab->elf.text_index_section;
14355 indx = elf_section_data (osec)->dynindx;
14357 BFD_ASSERT (indx != 0);
14359 /* We are turning this relocation into one
14360 against a section symbol, so subtract out
14361 the output section's address but not the
14362 offset of the input section in the output
14364 outrel.r_addend -= osec->vma;
14367 outrel.r_info = ELF64_R_INFO (indx, r_type);
14371 sreloc = elf_section_data (input_section)->sreloc;
14373 ? h->elf.type == STT_GNU_IFUNC
14374 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14375 sreloc = htab->elf.irelplt;
14376 if (sreloc == NULL)
14379 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
14382 loc = sreloc->contents;
14383 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
14384 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14386 /* If this reloc is against an external symbol, it will
14387 be computed at runtime, so there's no need to do
14388 anything now. However, for the sake of prelink ensure
14389 that the section contents are a known value. */
14392 unresolved_reloc = FALSE;
14393 /* The value chosen here is quite arbitrary as ld.so
14394 ignores section contents except for the special
14395 case of .opd where the contents might be accessed
14396 before relocation. Choose zero, as that won't
14397 cause reloc overflow. */
14400 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
14401 to improve backward compatibility with older
14403 if (r_type == R_PPC64_ADDR64)
14404 addend = outrel.r_addend;
14405 /* Adjust pc_relative relocs to have zero in *r_offset. */
14406 else if (ppc64_elf_howto_table[r_type]->pc_relative)
14407 addend = (input_section->output_section->vma
14408 + input_section->output_offset
14415 case R_PPC64_GLOB_DAT:
14416 case R_PPC64_JMP_SLOT:
14417 case R_PPC64_JMP_IREL:
14418 case R_PPC64_RELATIVE:
14419 /* We shouldn't ever see these dynamic relocs in relocatable
14421 /* Fall through. */
14423 case R_PPC64_PLTGOT16:
14424 case R_PPC64_PLTGOT16_DS:
14425 case R_PPC64_PLTGOT16_HA:
14426 case R_PPC64_PLTGOT16_HI:
14427 case R_PPC64_PLTGOT16_LO:
14428 case R_PPC64_PLTGOT16_LO_DS:
14429 case R_PPC64_PLTREL32:
14430 case R_PPC64_PLTREL64:
14431 /* These ones haven't been implemented yet. */
14433 info->callbacks->einfo
14434 (_("%P: %B: %s is not supported for `%T'\n"),
14436 ppc64_elf_howto_table[r_type]->name, sym_name);
14438 bfd_set_error (bfd_error_invalid_operation);
14443 /* Multi-instruction sequences that access the TOC can be
14444 optimized, eg. addis ra,r2,0; addi rb,ra,x;
14445 to nop; addi rb,r2,x; */
14451 case R_PPC64_GOT_TLSLD16_HI:
14452 case R_PPC64_GOT_TLSGD16_HI:
14453 case R_PPC64_GOT_TPREL16_HI:
14454 case R_PPC64_GOT_DTPREL16_HI:
14455 case R_PPC64_GOT16_HI:
14456 case R_PPC64_TOC16_HI:
14457 /* These relocs would only be useful if building up an
14458 offset to later add to r2, perhaps in an indexed
14459 addressing mode instruction. Don't try to optimize.
14460 Unfortunately, the possibility of someone building up an
14461 offset like this or even with the HA relocs, means that
14462 we need to check the high insn when optimizing the low
14466 case R_PPC64_GOT_TLSLD16_HA:
14467 case R_PPC64_GOT_TLSGD16_HA:
14468 case R_PPC64_GOT_TPREL16_HA:
14469 case R_PPC64_GOT_DTPREL16_HA:
14470 case R_PPC64_GOT16_HA:
14471 case R_PPC64_TOC16_HA:
14472 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
14473 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
14475 bfd_byte *p = contents + (rel->r_offset & ~3);
14476 bfd_put_32 (input_bfd, NOP, p);
14480 case R_PPC64_GOT_TLSLD16_LO:
14481 case R_PPC64_GOT_TLSGD16_LO:
14482 case R_PPC64_GOT_TPREL16_LO_DS:
14483 case R_PPC64_GOT_DTPREL16_LO_DS:
14484 case R_PPC64_GOT16_LO:
14485 case R_PPC64_GOT16_LO_DS:
14486 case R_PPC64_TOC16_LO:
14487 case R_PPC64_TOC16_LO_DS:
14488 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
14489 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
14491 bfd_byte *p = contents + (rel->r_offset & ~3);
14492 insn = bfd_get_32 (input_bfd, p);
14493 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
14495 /* Transform addic to addi when we change reg. */
14496 insn &= ~((0x3f << 26) | (0x1f << 16));
14497 insn |= (14u << 26) | (2 << 16);
14501 insn &= ~(0x1f << 16);
14504 bfd_put_32 (input_bfd, insn, p);
14509 /* Do any further special processing. */
14515 case R_PPC64_REL16_HA:
14516 case R_PPC64_ADDR16_HA:
14517 case R_PPC64_ADDR16_HIGHA:
14518 case R_PPC64_ADDR16_HIGHERA:
14519 case R_PPC64_ADDR16_HIGHESTA:
14520 case R_PPC64_TOC16_HA:
14521 case R_PPC64_SECTOFF_HA:
14522 case R_PPC64_TPREL16_HA:
14523 case R_PPC64_TPREL16_HIGHA:
14524 case R_PPC64_TPREL16_HIGHERA:
14525 case R_PPC64_TPREL16_HIGHESTA:
14526 case R_PPC64_DTPREL16_HA:
14527 case R_PPC64_DTPREL16_HIGHA:
14528 case R_PPC64_DTPREL16_HIGHERA:
14529 case R_PPC64_DTPREL16_HIGHESTA:
14530 /* It's just possible that this symbol is a weak symbol
14531 that's not actually defined anywhere. In that case,
14532 'sec' would be NULL, and we should leave the symbol
14533 alone (it will be set to zero elsewhere in the link). */
14538 case R_PPC64_GOT16_HA:
14539 case R_PPC64_PLTGOT16_HA:
14540 case R_PPC64_PLT16_HA:
14541 case R_PPC64_GOT_TLSGD16_HA:
14542 case R_PPC64_GOT_TLSLD16_HA:
14543 case R_PPC64_GOT_TPREL16_HA:
14544 case R_PPC64_GOT_DTPREL16_HA:
14545 /* Add 0x10000 if sign bit in 0:15 is set.
14546 Bits 0:15 are not used. */
14550 case R_PPC64_ADDR16_DS:
14551 case R_PPC64_ADDR16_LO_DS:
14552 case R_PPC64_GOT16_DS:
14553 case R_PPC64_GOT16_LO_DS:
14554 case R_PPC64_PLT16_LO_DS:
14555 case R_PPC64_SECTOFF_DS:
14556 case R_PPC64_SECTOFF_LO_DS:
14557 case R_PPC64_TOC16_DS:
14558 case R_PPC64_TOC16_LO_DS:
14559 case R_PPC64_PLTGOT16_DS:
14560 case R_PPC64_PLTGOT16_LO_DS:
14561 case R_PPC64_GOT_TPREL16_DS:
14562 case R_PPC64_GOT_TPREL16_LO_DS:
14563 case R_PPC64_GOT_DTPREL16_DS:
14564 case R_PPC64_GOT_DTPREL16_LO_DS:
14565 case R_PPC64_TPREL16_DS:
14566 case R_PPC64_TPREL16_LO_DS:
14567 case R_PPC64_DTPREL16_DS:
14568 case R_PPC64_DTPREL16_LO_DS:
14569 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
14571 /* If this reloc is against an lq insn, then the value must be
14572 a multiple of 16. This is somewhat of a hack, but the
14573 "correct" way to do this by defining _DQ forms of all the
14574 _DS relocs bloats all reloc switches in this file. It
14575 doesn't seem to make much sense to use any of these relocs
14576 in data, so testing the insn should be safe. */
14577 if ((insn & (0x3f << 26)) == (56u << 26))
14579 if (((relocation + addend) & mask) != 0)
14581 info->callbacks->einfo
14582 (_("%P: %H: error: %s not a multiple of %u\n"),
14583 input_bfd, input_section, rel->r_offset,
14584 ppc64_elf_howto_table[r_type]->name,
14586 bfd_set_error (bfd_error_bad_value);
14593 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
14594 because such sections are not SEC_ALLOC and thus ld.so will
14595 not process them. */
14596 if (unresolved_reloc
14597 && !((input_section->flags & SEC_DEBUGGING) != 0
14598 && h->elf.def_dynamic)
14599 && _bfd_elf_section_offset (output_bfd, info, input_section,
14600 rel->r_offset) != (bfd_vma) -1)
14602 info->callbacks->einfo
14603 (_("%P: %H: unresolvable %s against `%T'\n"),
14604 input_bfd, input_section, rel->r_offset,
14605 ppc64_elf_howto_table[(int) r_type]->name,
14606 h->elf.root.root.string);
14610 r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
14618 if (r != bfd_reloc_ok)
14620 char *more_info = NULL;
14621 const char *reloc_name = ppc64_elf_howto_table[r_type]->name;
14623 if (reloc_dest != DEST_NORMAL)
14625 more_info = bfd_malloc (strlen (reloc_name) + 8);
14626 if (more_info != NULL)
14628 strcpy (more_info, reloc_name);
14629 strcat (more_info, (reloc_dest == DEST_OPD
14630 ? " (OPD)" : " (stub)"));
14631 reloc_name = more_info;
14635 if (r == bfd_reloc_overflow)
14640 && h->elf.root.type == bfd_link_hash_undefweak
14641 && ppc64_elf_howto_table[r_type]->pc_relative)
14643 /* Assume this is a call protected by other code that
14644 detects the symbol is undefined. If this is the case,
14645 we can safely ignore the overflow. If not, the
14646 program is hosed anyway, and a little warning isn't
14652 if (!((*info->callbacks->reloc_overflow)
14653 (info, &h->elf.root, sym_name,
14654 reloc_name, orig_rel.r_addend,
14655 input_bfd, input_section, rel->r_offset)))
14660 info->callbacks->einfo
14661 (_("%P: %H: %s against `%T': error %d\n"),
14662 input_bfd, input_section, rel->r_offset,
14663 reloc_name, sym_name, (int) r);
14666 if (more_info != NULL)
14671 /* If we're emitting relocations, then shortly after this function
14672 returns, reloc offsets and addends for this section will be
14673 adjusted. Worse, reloc symbol indices will be for the output
14674 file rather than the input. Save a copy of the relocs for
14675 opd_entry_value. */
14676 if (is_opd && (info->emitrelocations || info->relocatable))
14679 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
14680 rel = bfd_alloc (input_bfd, amt);
14681 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
14682 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
14685 memcpy (rel, relocs, amt);
14690 /* Adjust the value of any local symbols in opd sections. */
14693 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
14694 const char *name ATTRIBUTE_UNUSED,
14695 Elf_Internal_Sym *elfsym,
14696 asection *input_sec,
14697 struct elf_link_hash_entry *h)
14699 struct _opd_sec_data *opd;
14706 opd = get_opd_info (input_sec);
14707 if (opd == NULL || opd->adjust == NULL)
14710 value = elfsym->st_value - input_sec->output_offset;
14711 if (!info->relocatable)
14712 value -= input_sec->output_section->vma;
14714 adjust = opd->adjust[value / 8];
14718 elfsym->st_value += adjust;
14722 /* Finish up dynamic symbol handling. We set the contents of various
14723 dynamic sections here. */
14726 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
14727 struct bfd_link_info *info,
14728 struct elf_link_hash_entry *h,
14729 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
14731 struct ppc_link_hash_table *htab;
14732 struct plt_entry *ent;
14733 Elf_Internal_Rela rela;
14736 htab = ppc_hash_table (info);
14740 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
14741 if (ent->plt.offset != (bfd_vma) -1)
14743 /* This symbol has an entry in the procedure linkage
14744 table. Set it up. */
14745 if (!htab->elf.dynamic_sections_created
14746 || h->dynindx == -1)
14748 BFD_ASSERT (h->type == STT_GNU_IFUNC
14750 && (h->root.type == bfd_link_hash_defined
14751 || h->root.type == bfd_link_hash_defweak));
14752 rela.r_offset = (htab->elf.iplt->output_section->vma
14753 + htab->elf.iplt->output_offset
14754 + ent->plt.offset);
14756 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
14758 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14759 rela.r_addend = (h->root.u.def.value
14760 + h->root.u.def.section->output_offset
14761 + h->root.u.def.section->output_section->vma
14763 loc = (htab->elf.irelplt->contents
14764 + (htab->elf.irelplt->reloc_count++
14765 * sizeof (Elf64_External_Rela)));
14769 rela.r_offset = (htab->elf.splt->output_section->vma
14770 + htab->elf.splt->output_offset
14771 + ent->plt.offset);
14772 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
14773 rela.r_addend = ent->addend;
14774 loc = (htab->elf.srelplt->contents
14775 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
14776 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
14778 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
14780 if (!htab->opd_abi)
14782 if (!h->def_regular)
14784 /* Mark the symbol as undefined, rather than as
14785 defined in glink. Leave the value if there were
14786 any relocations where pointer equality matters
14787 (this is a clue for the dynamic linker, to make
14788 function pointer comparisons work between an
14789 application and shared library), otherwise set it
14791 sym->st_shndx = SHN_UNDEF;
14792 if (!h->pointer_equality_needed)
14794 else if (!h->ref_regular_nonweak)
14796 /* This breaks function pointer comparisons, but
14797 that is better than breaking tests for a NULL
14798 function pointer. */
14807 /* This symbol needs a copy reloc. Set it up. */
14809 if (h->dynindx == -1
14810 || (h->root.type != bfd_link_hash_defined
14811 && h->root.type != bfd_link_hash_defweak)
14812 || htab->relbss == NULL)
14815 rela.r_offset = (h->root.u.def.value
14816 + h->root.u.def.section->output_section->vma
14817 + h->root.u.def.section->output_offset);
14818 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
14820 loc = htab->relbss->contents;
14821 loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
14822 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
14828 /* Used to decide how to sort relocs in an optimal manner for the
14829 dynamic linker, before writing them out. */
14831 static enum elf_reloc_type_class
14832 ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
14833 const asection *rel_sec,
14834 const Elf_Internal_Rela *rela)
14836 enum elf_ppc64_reloc_type r_type;
14837 struct ppc_link_hash_table *htab = ppc_hash_table (info);
14839 if (rel_sec == htab->elf.irelplt)
14840 return reloc_class_ifunc;
14842 r_type = ELF64_R_TYPE (rela->r_info);
14845 case R_PPC64_RELATIVE:
14846 return reloc_class_relative;
14847 case R_PPC64_JMP_SLOT:
14848 return reloc_class_plt;
14850 return reloc_class_copy;
14852 return reloc_class_normal;
14856 /* Finish up the dynamic sections. */
14859 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
14860 struct bfd_link_info *info)
14862 struct ppc_link_hash_table *htab;
14866 htab = ppc_hash_table (info);
14870 dynobj = htab->elf.dynobj;
14871 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
14873 if (htab->elf.dynamic_sections_created)
14875 Elf64_External_Dyn *dyncon, *dynconend;
14877 if (sdyn == NULL || htab->elf.sgot == NULL)
14880 dyncon = (Elf64_External_Dyn *) sdyn->contents;
14881 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
14882 for (; dyncon < dynconend; dyncon++)
14884 Elf_Internal_Dyn dyn;
14887 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
14894 case DT_PPC64_GLINK:
14896 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14897 /* We stupidly defined DT_PPC64_GLINK to be the start
14898 of glink rather than the first entry point, which is
14899 what ld.so needs, and now have a bigger stub to
14900 support automatic multiple TOCs. */
14901 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 8 * 4;
14905 s = bfd_get_section_by_name (output_bfd, ".opd");
14908 dyn.d_un.d_ptr = s->vma;
14912 if (htab->do_multi_toc && htab->multi_toc_needed)
14913 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
14916 case DT_PPC64_OPDSZ:
14917 s = bfd_get_section_by_name (output_bfd, ".opd");
14920 dyn.d_un.d_val = s->size;
14924 s = htab->elf.splt;
14925 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14929 s = htab->elf.srelplt;
14930 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14934 dyn.d_un.d_val = htab->elf.srelplt->size;
14938 /* Don't count procedure linkage table relocs in the
14939 overall reloc count. */
14940 s = htab->elf.srelplt;
14943 dyn.d_un.d_val -= s->size;
14947 /* We may not be using the standard ELF linker script.
14948 If .rela.plt is the first .rela section, we adjust
14949 DT_RELA to not include it. */
14950 s = htab->elf.srelplt;
14953 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
14955 dyn.d_un.d_ptr += s->size;
14959 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
14963 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0)
14965 /* Fill in the first entry in the global offset table.
14966 We use it to hold the link-time TOCbase. */
14967 bfd_put_64 (output_bfd,
14968 elf_gp (output_bfd) + TOC_BASE_OFF,
14969 htab->elf.sgot->contents);
14971 /* Set .got entry size. */
14972 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 8;
14975 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
14977 /* Set .plt entry size. */
14978 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
14979 = PLT_ENTRY_SIZE (htab);
14982 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
14983 brlt ourselves if emitrelocations. */
14984 if (htab->brlt != NULL
14985 && htab->brlt->reloc_count != 0
14986 && !_bfd_elf_link_output_relocs (output_bfd,
14988 elf_section_data (htab->brlt)->rela.hdr,
14989 elf_section_data (htab->brlt)->relocs,
14993 if (htab->glink != NULL
14994 && htab->glink->reloc_count != 0
14995 && !_bfd_elf_link_output_relocs (output_bfd,
14997 elf_section_data (htab->glink)->rela.hdr,
14998 elf_section_data (htab->glink)->relocs,
15003 if (htab->glink_eh_frame != NULL
15004 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
15005 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
15006 htab->glink_eh_frame,
15007 htab->glink_eh_frame->contents))
15010 /* We need to handle writing out multiple GOT sections ourselves,
15011 since we didn't add them to DYNOBJ. We know dynobj is the first
15013 while ((dynobj = dynobj->link_next) != NULL)
15017 if (!is_ppc64_elf (dynobj))
15020 s = ppc64_elf_tdata (dynobj)->got;
15023 && s->output_section != bfd_abs_section_ptr
15024 && !bfd_set_section_contents (output_bfd, s->output_section,
15025 s->contents, s->output_offset,
15028 s = ppc64_elf_tdata (dynobj)->relgot;
15031 && s->output_section != bfd_abs_section_ptr
15032 && !bfd_set_section_contents (output_bfd, s->output_section,
15033 s->contents, s->output_offset,
15041 #include "elf64-target.h"
15043 /* FreeBSD support */
15045 #undef TARGET_LITTLE_SYM
15046 #undef TARGET_LITTLE_NAME
15048 #undef TARGET_BIG_SYM
15049 #define TARGET_BIG_SYM bfd_elf64_powerpc_freebsd_vec
15050 #undef TARGET_BIG_NAME
15051 #define TARGET_BIG_NAME "elf64-powerpc-freebsd"
15054 #define ELF_OSABI ELFOSABI_FREEBSD
15057 #define elf64_bed elf64_powerpc_fbsd_bed
15059 #include "elf64-target.h"